]> git.karo-electronics.de Git - linux-beck.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2016 00:26:27 +0000 (17:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 May 2016 00:26:27 +0000 (17:26 -0700)
Pull more security subsystem updates from James Morris:
 "Minor updates for the keys code"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
  MAINTAINERS: Update keyrings record and add asymmetric keys record
  lib: asn1_decoder - add MODULE_LICENSE("GPL")
  KEYS: The PKCS#7 test key type should use the secondary keyring

891 files changed:
Documentation/DocBook/gpu.tmpl
Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
Documentation/devicetree/bindings/display/bridge/analogix_dp.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/exynos/exynos5433-decon.txt
Documentation/devicetree/bindings/display/exynos/exynos_dp.txt
Documentation/devicetree/bindings/display/exynos/exynos_hdmi.txt
Documentation/devicetree/bindings/display/fsl,dcu.txt
Documentation/devicetree/bindings/display/fsl,tcon.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/hisilicon/dw-dsi.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/hisilicon/hisi-ade.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/innolux,at070tn92.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino-43-ts.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/tpk,f07a-0102.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/panel/tpk,f10a-0102.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/rockchip/analogix_dp-rockchip.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/snps,arcpgu.txt [new file with mode: 0644]
Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt [new file with mode: 0644]
Documentation/devicetree/bindings/vendor-prefixes.txt
Documentation/devicetree/bindings/video/bridge/anx7814.txt [new file with mode: 0644]
MAINTAINERS
arch/arc/boot/dts/axc001.dtsi
arch/arc/boot/dts/axc003.dtsi
arch/arc/boot/dts/axc003_idu.dtsi
arch/arc/boot/dts/axs10x_mb.dtsi
arch/arm/boot/dts/exynos5250-arndale.dts
arch/arm/boot/dts/exynos5250-smdk5250.dts
arch/arm/boot/dts/exynos5250-snow-common.dtsi
arch/arm/boot/dts/exynos5250-spring.dts
arch/arm/boot/dts/exynos5420-peach-pit.dts
arch/arm/boot/dts/exynos5420-smdk5420.dts
arch/arm/boot/dts/exynos5800-peach-pi.dts
block/ioctl.c
drivers/Kconfig
drivers/Makefile
drivers/acpi/nfit.c
drivers/acpi/nfit.h
drivers/acpi/utils.c
drivers/clk/mediatek/clk-mt8173.c
drivers/clk/mediatek/clk-mtk.h
drivers/dax/Kconfig [new file with mode: 0644]
drivers/dax/Makefile [new file with mode: 0644]
drivers/dax/dax.c [new file with mode: 0644]
drivers/dax/dax.h [new file with mode: 0644]
drivers/dax/pmem.c [new file with mode: 0644]
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/acp/acp_hw.c
drivers/gpu/drm/amd/acp/include/acp_gfx_if.h
drivers/gpu/drm/amd/amdgpu/Kconfig
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gds.h
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/atom.h
drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
drivers/gpu/drm/amd/amdgpu/atombios_crtc.h
drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
drivers/gpu/drm/amd/amdgpu/cik.c
drivers/gpu/drm/amd/amdgpu/cik_ih.c
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
drivers/gpu/drm/amd/amdgpu/cikd.h
drivers/gpu/drm/amd/amdgpu/cz_dpm.c
drivers/gpu/drm/amd/amdgpu/cz_ih.c
drivers/gpu/drm/amd/amdgpu/cz_smumgr.h
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
drivers/gpu/drm/amd/amdgpu/fiji_dpm.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.h
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
drivers/gpu/drm/amd/amdgpu/iceland_dpm.c
drivers/gpu/drm/amd/amdgpu/iceland_ih.c
drivers/gpu/drm/amd/amdgpu/kv_dpm.c
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
drivers/gpu/drm/amd/amdgpu/smu_ucode_xfer_vi.h
drivers/gpu/drm/amd/amdgpu/tonga_dpm.c
drivers/gpu/drm/amd/amdgpu/tonga_ih.c
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
drivers/gpu/drm/amd/amdgpu/vi.c
drivers/gpu/drm/amd/amdgpu/vid.h
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_events.c
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
drivers/gpu/drm/amd/include/amd_shared.h
drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_d.h [new file with mode: 0755]
drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_enum.h [new file with mode: 0644]
drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_sh_mask.h [new file with mode: 0755]
drivers/gpu/drm/amd/include/asic_reg/gca/gfx_8_0_d.h
drivers/gpu/drm/amd/include/asic_reg/uvd/uvd_6_0_d.h
drivers/gpu/drm/amd/include/atombios.h
drivers/gpu/drm/amd/include/cgs_common.h
drivers/gpu/drm/amd/include/cgs_linux.h
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
drivers/gpu/drm/amd/powerplay/eventmgr/eventactionchains.c
drivers/gpu/drm/amd/powerplay/eventmgr/eventmanagement.c
drivers/gpu/drm/amd/powerplay/hwmgr/Makefile
drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.c
drivers/gpu/drm/amd/powerplay/hwmgr/cz_clockpowergating.h
drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/fiji_clockpowergating.c
drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/fiji_hwmgr.h
drivers/gpu/drm/amd/powerplay/hwmgr/fiji_powertune.c
drivers/gpu/drm/amd/powerplay/hwmgr/fiji_thermal.c
drivers/gpu/drm/amd/powerplay/hwmgr/functiontables.c
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr_ppt.h
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.c [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_dyn_defaults.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.c [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.c
drivers/gpu/drm/amd/powerplay/hwmgr/ppatomctrl.h
drivers/gpu/drm/amd/powerplay/hwmgr/ppevvmath.h
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.c
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_hwmgr.h
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_pptable.h
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_processpptables.c
drivers/gpu/drm/amd/powerplay/hwmgr/tonga_thermal.c
drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h
drivers/gpu/drm/amd/powerplay/inc/eventmgr.h
drivers/gpu/drm/amd/powerplay/inc/fiji_pwrvirus.h
drivers/gpu/drm/amd/powerplay/inc/hardwaremanager.h
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/inc/polaris10_pwrvirus.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/inc/smu74.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/inc/smu_ucode_xfer_cz.h
drivers/gpu/drm/amd/powerplay/inc/smu_ucode_xfer_vi.h
drivers/gpu/drm/amd/powerplay/smumgr/Makefile
drivers/gpu/drm/amd/powerplay/smumgr/cz_smumgr.c
drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.h [new file with mode: 0644]
drivers/gpu/drm/amd/powerplay/smumgr/smumgr.c
drivers/gpu/drm/amd/powerplay/smumgr/tonga_smumgr.c
drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
drivers/gpu/drm/amd/scheduler/sched_fence.c
drivers/gpu/drm/arc/Kconfig [new file with mode: 0644]
drivers/gpu/drm/arc/Makefile [new file with mode: 0644]
drivers/gpu/drm/arc/arcpgu.h [new file with mode: 0644]
drivers/gpu/drm/arc/arcpgu_crtc.c [new file with mode: 0644]
drivers/gpu/drm/arc/arcpgu_drv.c [new file with mode: 0644]
drivers/gpu/drm/arc/arcpgu_hdmi.c [new file with mode: 0644]
drivers/gpu/drm/arc/arcpgu_regs.h [new file with mode: 0644]
drivers/gpu/drm/arm/hdlcd_drv.c
drivers/gpu/drm/armada/armada_crtc.c
drivers/gpu/drm/armada/armada_drv.c
drivers/gpu/drm/armada/armada_fb.c
drivers/gpu/drm/armada/armada_gem.c
drivers/gpu/drm/armada/armada_gem.h
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/ast/ast_drv.h
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/ast/ast_mode.c
drivers/gpu/drm/ast/ast_ttm.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.h
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
drivers/gpu/drm/bochs/bochs_fbdev.c
drivers/gpu/drm/bochs/bochs_kms.c
drivers/gpu/drm/bochs/bochs_mm.c
drivers/gpu/drm/bridge/Kconfig
drivers/gpu/drm/bridge/Makefile
drivers/gpu/drm/bridge/analogix-anx78xx.c [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix-anx78xx.h [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/Kconfig [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/Makefile [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/analogix_dp_core.h [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c [new file with mode: 0644]
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h [moved from drivers/gpu/drm/exynos/exynos_dp_reg.h with 62% similarity]
drivers/gpu/drm/bridge/dw-hdmi.c
drivers/gpu/drm/cirrus/cirrus_drv.c
drivers/gpu/drm/cirrus/cirrus_drv.h
drivers/gpu/drm/cirrus/cirrus_main.c
drivers/gpu/drm/cirrus/cirrus_ttm.c
drivers/gpu/drm/drm_agpsupport.c
drivers/gpu/drm/drm_atomic.c
drivers/gpu/drm/drm_atomic_helper.c
drivers/gpu/drm/drm_bufs.c
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_crtc_helper.c
drivers/gpu/drm/drm_crtc_internal.h
drivers/gpu/drm/drm_dp_aux_dev.c
drivers/gpu/drm/drm_dp_helper.c
drivers/gpu/drm/drm_dp_mst_topology.c
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_edid.c
drivers/gpu/drm/drm_fb_cma_helper.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_fops.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_gem_cma_helper.c
drivers/gpu/drm/drm_info.c
drivers/gpu/drm/drm_internal.h
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_irq.c
drivers/gpu/drm/drm_legacy.h
drivers/gpu/drm/drm_modes.c
drivers/gpu/drm/drm_panel.c
drivers/gpu/drm/drm_pci.c
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/drm_probe_helper.c
drivers/gpu/drm/drm_sysfs.c
drivers/gpu/drm/drm_vm.c
drivers/gpu/drm/etnaviv/etnaviv_drv.c
drivers/gpu/drm/etnaviv/etnaviv_gem.c
drivers/gpu/drm/etnaviv/etnaviv_gem.h
drivers/gpu/drm/etnaviv/etnaviv_gem_prime.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.c
drivers/gpu/drm/exynos/Kconfig
drivers/gpu/drm/exynos/Makefile
drivers/gpu/drm/exynos/exynos5433_drm_decon.c
drivers/gpu/drm/exynos/exynos7_drm_decon.c
drivers/gpu/drm/exynos/exynos_dp.c [new file with mode: 0644]
drivers/gpu/drm/exynos/exynos_dp_core.c [deleted file]
drivers/gpu/drm/exynos/exynos_dp_core.h [deleted file]
drivers/gpu/drm/exynos/exynos_dp_reg.c [deleted file]
drivers/gpu/drm/exynos/exynos_drm_crtc.c
drivers/gpu/drm/exynos/exynos_drm_dpi.c
drivers/gpu/drm/exynos/exynos_drm_drv.c
drivers/gpu/drm/exynos/exynos_drm_drv.h
drivers/gpu/drm/exynos/exynos_drm_dsi.c
drivers/gpu/drm/exynos/exynos_drm_fb.c
drivers/gpu/drm/exynos/exynos_drm_fbdev.c
drivers/gpu/drm/exynos/exynos_drm_fimd.c
drivers/gpu/drm/exynos/exynos_drm_g2d.c
drivers/gpu/drm/exynos/exynos_drm_gem.c
drivers/gpu/drm/exynos/exynos_drm_gem.h
drivers/gpu/drm/exynos/exynos_drm_plane.c
drivers/gpu/drm/exynos/exynos_drm_rotator.c
drivers/gpu/drm/exynos/exynos_hdmi.c
drivers/gpu/drm/exynos/exynos_mixer.c
drivers/gpu/drm/exynos/regs-hdmi.h
drivers/gpu/drm/fsl-dcu/Kconfig
drivers/gpu/drm/fsl-dcu/Makefile
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c
drivers/gpu/drm/fsl-dcu/fsl_tcon.c [new file with mode: 0644]
drivers/gpu/drm/fsl-dcu/fsl_tcon.h [new file with mode: 0644]
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/gma500/gem.c
drivers/gpu/drm/gma500/gma_display.c
drivers/gpu/drm/gma500/mdfld_dsi_dpi.c
drivers/gpu/drm/gma500/mdfld_dsi_pkg_sender.c
drivers/gpu/drm/gma500/psb_drv.c
drivers/gpu/drm/hisilicon/Kconfig [new file with mode: 0644]
drivers/gpu/drm/hisilicon/Makefile [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/Kconfig [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/Makefile [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c [new file with mode: 0644]
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h [new file with mode: 0644]
drivers/gpu/drm/i915/Kconfig
drivers/gpu/drm/i915/Kconfig.debug [new file with mode: 0644]
drivers/gpu/drm/i915/Makefile
drivers/gpu/drm/i915/i915_cmd_parser.c
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem.h [new file with mode: 0644]
drivers/gpu/drm/i915/i915_gem_context.c
drivers/gpu/drm/i915/i915_gem_debug.c
drivers/gpu/drm/i915/i915_gem_dmabuf.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h
drivers/gpu/drm/i915/i915_gem_render_state.c
drivers/gpu/drm/i915/i915_gem_render_state.h
drivers/gpu/drm/i915/i915_gem_shrinker.c
drivers/gpu/drm/i915/i915_gem_stolen.c
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_gem_userptr.c
drivers/gpu/drm/i915/i915_gpu_error.c
drivers/gpu/drm/i915/i915_guc_reg.h
drivers/gpu/drm/i915/i915_guc_submission.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/i915_params.c
drivers/gpu/drm/i915/i915_params.h
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/i915_sysfs.c
drivers/gpu/drm/i915/i915_trace.h
drivers/gpu/drm/i915/i915_vgpu.c
drivers/gpu/drm/i915/intel_atomic.c
drivers/gpu/drm/i915/intel_atomic_plane.c
drivers/gpu/drm/i915/intel_audio.c
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_bios.h
drivers/gpu/drm/i915/intel_color.c [new file with mode: 0644]
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_csr.c
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_dp_mst.c
drivers/gpu/drm/i915/intel_dpll_mgr.c [new file with mode: 0644]
drivers/gpu/drm/i915/intel_dpll_mgr.h [new file with mode: 0644]
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_dsi.c
drivers/gpu/drm/i915/intel_dsi.h
drivers/gpu/drm/i915/intel_dsi_panel_vbt.c
drivers/gpu/drm/i915/intel_dsi_pll.c
drivers/gpu/drm/i915/intel_fbc.c
drivers/gpu/drm/i915/intel_fbdev.c
drivers/gpu/drm/i915/intel_fifo_underrun.c
drivers/gpu/drm/i915/intel_guc.h
drivers/gpu/drm/i915/intel_guc_loader.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_i2c.c
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_lrc.h
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_mocs.c
drivers/gpu/drm/i915/intel_mocs.h
drivers/gpu/drm/i915/intel_opregion.c
drivers/gpu/drm/i915/intel_overlay.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_psr.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.h
drivers/gpu/drm/i915/intel_runtime_pm.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/i915/intel_sprite.c
drivers/gpu/drm/i915/intel_tv.c
drivers/gpu/drm/i915/intel_uncore.c
drivers/gpu/drm/i915/intel_vbt_defs.h [new file with mode: 0644]
drivers/gpu/drm/imx/imx-drm-core.c
drivers/gpu/drm/mediatek/Kconfig [new file with mode: 0644]
drivers/gpu/drm/mediatek/Makefile [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_disp_ovl.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_disp_rdma.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_dpi.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_dpi_regs.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_crtc.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_crtc.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_ddp.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_ddp.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_drv.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_drv.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_fb.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_fb.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_gem.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_gem.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_plane.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_drm_plane.h [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_dsi.c [new file with mode: 0644]
drivers/gpu/drm/mediatek/mtk_mipi_tx.c [new file with mode: 0644]
drivers/gpu/drm/mgag200/mgag200_cursor.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_main.c
drivers/gpu/drm/mgag200/mgag200_ttm.c
drivers/gpu/drm/msm/Kconfig
drivers/gpu/drm/msm/Makefile
drivers/gpu/drm/msm/adreno/adreno_gpu.c
drivers/gpu/drm/msm/adreno/adreno_gpu.h
drivers/gpu/drm/msm/dsi/dsi.h
drivers/gpu/drm/msm/dsi/dsi_cfg.c
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/dsi/dsi_manager.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy_20nm.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm.c
drivers/gpu/drm/msm/dsi/phy/dsi_phy_28nm_8960.c
drivers/gpu/drm/msm/edp/edp_connector.c
drivers/gpu/drm/msm/edp/edp_ctrl.c
drivers/gpu/drm/msm/hdmi/hdmi.h
drivers/gpu/drm/msm/hdmi/hdmi_connector.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h
drivers/gpu/drm/msm/mdp/mdp4/mdp4_lvds_connector.c
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
drivers/gpu/drm/msm/mdp/mdp_format.c
drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/msm_debugfs.c [new file with mode: 0644]
drivers/gpu/drm/msm/msm_debugfs.h [new file with mode: 0644]
drivers/gpu/drm/msm/msm_drv.c
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_fb.c
drivers/gpu/drm/msm/msm_fence.c [new file with mode: 0644]
drivers/gpu/drm/msm/msm_fence.h [new file with mode: 0644]
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem_prime.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_gpu.c
drivers/gpu/drm/msm/msm_gpu.h
drivers/gpu/drm/msm/msm_rd.c
drivers/gpu/drm/nouveau/dispnv04/arb.c
drivers/gpu/drm/nouveau/dispnv04/crtc.c
drivers/gpu/drm/nouveau/dispnv04/cursor.c
drivers/gpu/drm/nouveau/dispnv04/dac.c
drivers/gpu/drm/nouveau/dispnv04/dfp.c
drivers/gpu/drm/nouveau/dispnv04/disp.c
drivers/gpu/drm/nouveau/dispnv04/disp.h
drivers/gpu/drm/nouveau/dispnv04/hw.c
drivers/gpu/drm/nouveau/dispnv04/overlay.c
drivers/gpu/drm/nouveau/dispnv04/tvmodesnv17.c
drivers/gpu/drm/nouveau/dispnv04/tvnv04.c
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
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/subdev.h
drivers/gpu/drm/nouveau/include/nvkm/engine/falcon.h
drivers/gpu/drm/nouveau/include/nvkm/engine/xtensa.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/devinit.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/iccsense.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/mc.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_acpi.c
drivers/gpu/drm/nouveau/nouveau_backlight.c
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_debugfs.c
drivers/gpu/drm/nouveau/nouveau_debugfs.h
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_dma.c
drivers/gpu/drm/nouveau/nouveau_dp.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drv.h [moved from drivers/gpu/drm/nouveau/nouveau_drm.h with 98% similarity]
drivers/gpu/drm/nouveau/nouveau_fbcon.c
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_gem.h
drivers/gpu/drm/nouveau/nouveau_hwmon.c
drivers/gpu/drm/nouveau/nouveau_nvif.c
drivers/gpu/drm/nouveau/nouveau_platform.h
drivers/gpu/drm/nouveau/nouveau_prime.c
drivers/gpu/drm/nouveau/nouveau_sgdma.c
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/nouveau/nouveau_usif.c
drivers/gpu/drm/nouveau/nouveau_vga.c
drivers/gpu/drm/nouveau/nv04_fbcon.c
drivers/gpu/drm/nouveau/nv04_fence.c
drivers/gpu/drm/nouveau/nv10_fence.c
drivers/gpu/drm/nouveau/nv17_fence.c
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/nouveau/nv50_fbcon.c
drivers/gpu/drm/nouveau/nv50_fence.c
drivers/gpu/drm/nouveau/nv84_fence.c
drivers/gpu/drm/nouveau/nvc0_fbcon.c
drivers/gpu/drm/nouveau/nvc0_fence.c
drivers/gpu/drm/nouveau/nvkm/core/engine.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/gt215.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/disp/base.c
drivers/gpu/drm/nouveau/nvkm/engine/dma/base.c
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.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/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/base.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf100.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgf117.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk104.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgk20a.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm107.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm200.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/ctxgm20b.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpc.fuc
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf100.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgf117.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk104.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk110.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgk208.fuc5.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/gpcgm107.fuc5.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hub.fuc
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf100.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgf117.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk104.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk110.fuc3.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgk208.fuc5.h
drivers/gpu/drm/nouveau/nvkm/engine/gr/fuc/hubgm107.fuc5.h
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/nv04.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv10.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv20.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/gr/priv.h
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/nv44.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.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/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/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/pm/base.c
drivers/gpu/drm/nouveau/nvkm/engine/sec/g98.c
drivers/gpu/drm/nouveau/nvkm/engine/sw/base.c
drivers/gpu/drm/nouveau/nvkm/engine/vp/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/xtensa.c
drivers/gpu/drm/nouveau/nvkm/subdev/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/bar/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bios/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/bios/pll.c
drivers/gpu/drm/nouveau/nvkm/subdev/bus/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/clk/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/devinit/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gk104.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 [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/fb/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/fuse/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/gpio/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gf117.c
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk104.c
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/ibus/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/iccsense/base.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/ltc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mc/g98.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.c [new file with mode: 0644]
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/mmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mxm/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pci/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gk20a.c
drivers/gpu/drm/nouveau/nvkm/subdev/secboot/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/therm/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/timer/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/top/Kbuild [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/top/priv.h [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/volt/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/volt/gk104.c
drivers/gpu/drm/omapdrm/omap_drv.c
drivers/gpu/drm/omapdrm/omap_drv.h
drivers/gpu/drm/omapdrm/omap_fb.c
drivers/gpu/drm/omapdrm/omap_fbdev.c
drivers/gpu/drm/omapdrm/omap_gem.c
drivers/gpu/drm/omapdrm/omap_plane.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/qxl/qxl_cmd.c
drivers/gpu/drm/qxl/qxl_display.c
drivers/gpu/drm/qxl/qxl_drv.c
drivers/gpu/drm/qxl/qxl_drv.h
drivers/gpu/drm/qxl/qxl_dumb.c
drivers/gpu/drm/qxl/qxl_fb.c
drivers/gpu/drm/qxl/qxl_ioctl.c
drivers/gpu/drm/qxl/qxl_kms.c
drivers/gpu/drm/qxl/qxl_object.h
drivers/gpu/drm/qxl/qxl_ttm.c
drivers/gpu/drm/radeon/atombios_crtc.c
drivers/gpu/drm/radeon/cik.c
drivers/gpu/drm/radeon/cikd.h
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreen_cs.c
drivers/gpu/drm/radeon/evergreend.h
drivers/gpu/drm/radeon/ni.c
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_asic.h
drivers/gpu/drm/radeon/radeon_cs.c
drivers/gpu/drm/radeon/radeon_cursor.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_gem.c
drivers/gpu/drm/radeon/radeon_irq_kms.c
drivers/gpu/drm/radeon/radeon_object.c
drivers/gpu/drm/radeon/radeon_object.h
drivers/gpu/drm/radeon/radeon_ttm.c
drivers/gpu/drm/radeon/radeon_uvd.c
drivers/gpu/drm/radeon/rs600.c
drivers/gpu/drm/radeon/rv770.c
drivers/gpu/drm/radeon/si.c
drivers/gpu/drm/radeon/uvd_v1_0.c
drivers/gpu/drm/radeon/uvd_v2_2.c
drivers/gpu/drm/radeon/uvd_v4_2.c
drivers/gpu/drm/rcar-du/Kconfig
drivers/gpu/drm/rcar-du/rcar_du_crtc.c
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rcar-du/rcar_du_kms.c
drivers/gpu/drm/rcar-du/rcar_du_plane.c
drivers/gpu/drm/rcar-du/rcar_du_vsp.c
drivers/gpu/drm/rockchip/Kconfig
drivers/gpu/drm/rockchip/Makefile
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c [new file with mode: 0644]
drivers/gpu/drm/rockchip/dw-mipi-dsi.c
drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c
drivers/gpu/drm/rockchip/inno_hdmi.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.h
drivers/gpu/drm/rockchip/rockchip_drm_fb.c
drivers/gpu/drm/rockchip/rockchip_drm_gem.c
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
drivers/gpu/drm/sti/sti_cursor.c
drivers/gpu/drm/sti/sti_drv.c
drivers/gpu/drm/sti/sti_gdp.c
drivers/gpu/drm/sti/sti_hda.c
drivers/gpu/drm/sti/sti_hqvdp.c
drivers/gpu/drm/sti/sti_mixer.c
drivers/gpu/drm/sti/sti_tvout.c
drivers/gpu/drm/sti/sti_vid.c
drivers/gpu/drm/sun4i/Kconfig [new file with mode: 0644]
drivers/gpu/drm/sun4i/Makefile [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_backend.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_backend.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_crtc.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_crtc.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_dotclock.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_dotclock.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_drv.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_drv.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_framebuffer.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_framebuffer.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_layer.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_layer.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_rgb.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_rgb.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_tcon.c [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_tcon.h [new file with mode: 0644]
drivers/gpu/drm/sun4i/sun4i_tv.c [new file with mode: 0644]
drivers/gpu/drm/tegra/dc.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/tegra/dsi.c
drivers/gpu/drm/tegra/fb.c
drivers/gpu/drm/tegra/gem.c
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/ttm/Makefile
drivers/gpu/drm/ttm/ttm_agp_backend.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/ttm/ttm_bo_vm.c
drivers/gpu/drm/ttm/ttm_execbuf_util.c
drivers/gpu/drm/ttm/ttm_page_alloc.c
drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_drv.h
drivers/gpu/drm/udl/udl_fb.c
drivers/gpu/drm/udl/udl_gem.c
drivers/gpu/drm/vc4/Kconfig
drivers/gpu/drm/vc4/Makefile
drivers/gpu/drm/vc4/vc4_bo.c
drivers/gpu/drm/vc4/vc4_crtc.c
drivers/gpu/drm/vc4/vc4_debugfs.c
drivers/gpu/drm/vc4/vc4_dpi.c [new file with mode: 0644]
drivers/gpu/drm/vc4/vc4_drv.c
drivers/gpu/drm/vc4/vc4_drv.h
drivers/gpu/drm/vc4/vc4_gem.c
drivers/gpu/drm/vc4/vc4_hdmi.c
drivers/gpu/drm/vc4/vc4_kms.c
drivers/gpu/drm/vc4/vc4_plane.c
drivers/gpu/drm/vc4/vc4_regs.h
drivers/gpu/drm/vgem/vgem_drv.c
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/virtio/virtgpu_drv.c
drivers/gpu/drm/virtio/virtgpu_drv.h
drivers/gpu/drm/virtio/virtgpu_gem.c
drivers/gpu/drm/virtio/virtgpu_ioctl.c
drivers/gpu/drm/virtio/virtgpu_object.c
drivers/gpu/drm/virtio/virtgpu_ttm.c
drivers/gpu/drm/vmwgfx/Makefile
drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
drivers/gpu/drm/vmwgfx/vmwgfx_cotable.c
drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
drivers/gpu/drm/vmwgfx/vmwgfx_mob.c
drivers/gpu/drm/vmwgfx/vmwgfx_msg.c [new file with mode: 0644]
drivers/gpu/drm/vmwgfx/vmwgfx_msg.h [new file with mode: 0644]
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
drivers/gpu/drm/vmwgfx/vmwgfx_shader.c
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c
drivers/memory/mtk-smi.c
drivers/nvdimm/Kconfig
drivers/nvdimm/Makefile
drivers/nvdimm/blk.c
drivers/nvdimm/btt.c
drivers/nvdimm/btt_devs.c
drivers/nvdimm/bus.c
drivers/nvdimm/claim.c
drivers/nvdimm/core.c
drivers/nvdimm/dax_devs.c [new file with mode: 0644]
drivers/nvdimm/dimm_devs.c
drivers/nvdimm/namespace_devs.c
drivers/nvdimm/nd-core.h
drivers/nvdimm/nd.h
drivers/nvdimm/pfn.h
drivers/nvdimm/pfn_devs.c
drivers/nvdimm/pmem.c
drivers/nvdimm/region.c
drivers/nvdimm/region_devs.c
drivers/video/fbdev/core/fb_defio.c
fs/block_dev.c
include/acpi/acpi_bus.h
include/drm/bridge/analogix_dp.h [new file with mode: 0644]
include/drm/drmP.h
include/drm/drm_agpsupport.h
include/drm/drm_atomic.h
include/drm/drm_atomic_helper.h
include/drm/drm_crtc.h
include/drm/drm_displayid.h
include/drm/drm_dp_helper.h
include/drm/drm_edid.h
include/drm/drm_fb_cma_helper.h
include/drm/drm_fb_helper.h
include/drm/drm_gem.h
include/drm/drm_legacy.h
include/drm/drm_mem_util.h
include/drm/drm_modeset_helper_vtables.h
include/drm/drm_panel.h
include/drm/drm_vma_manager.h
include/drm/ttm/ttm_bo_api.h
include/drm/ttm/ttm_bo_driver.h
include/dt-bindings/clock/mt8173-clk.h
include/linux/console.h
include/linux/fb.h
include/linux/fs.h
include/linux/libnvdimm.h
include/linux/nd.h
include/linux/reservation.h
include/linux/timer.h
include/linux/vmalloc.h
include/uapi/drm/amdgpu_drm.h
include/uapi/drm/armada_drm.h
include/uapi/drm/drm.h
include/uapi/drm/drm_fourcc.h
include/uapi/drm/drm_mode.h
include/uapi/drm/drm_sarea.h
include/uapi/drm/etnaviv_drm.h
include/uapi/drm/exynos_drm.h
include/uapi/drm/i810_drm.h
include/uapi/drm/i915_drm.h
include/uapi/drm/mga_drm.h
include/uapi/drm/msm_drm.h
include/uapi/drm/nouveau_drm.h
include/uapi/drm/omap_drm.h
include/uapi/drm/qxl_drm.h
include/uapi/drm/r128_drm.h
include/uapi/drm/radeon_drm.h
include/uapi/drm/savage_drm.h
include/uapi/drm/sis_drm.h
include/uapi/drm/tegra_drm.h
include/uapi/drm/vc4_drm.h
include/uapi/drm/via_drm.h
include/uapi/drm/virtgpu_drm.h
include/uapi/drm/vmwgfx_drm.h
include/uapi/linux/fs.h
include/uapi/linux/ndctl.h
include/video/exynos5433_decon.h
include/video/mipi_display.h
mm/huge_memory.c
mm/hugetlb.c
mm/vmalloc.c
tools/testing/nvdimm/Kbuild
tools/testing/nvdimm/config_check.c
tools/testing/nvdimm/test/iomap.c
tools/testing/nvdimm/test/nfit.c

index 1692c4dd548727867d1c6fa4de3878cf8a30d6a8..4a0c599b6a6d934389d59ab3d44d3aff971e24ec 100644 (file)
@@ -1615,6 +1615,11 @@ void intel_crt_init(struct drm_device *dev)
 !Pdrivers/gpu/drm/drm_fb_helper.c fbdev helpers
 !Edrivers/gpu/drm/drm_fb_helper.c
 !Iinclude/drm/drm_fb_helper.h
+    </sect2>
+    <sect2>
+      <title>Framebuffer CMA Helper Functions Reference</title>
+!Pdrivers/gpu/drm/drm_fb_cma_helper.c framebuffer cma helper functions
+!Edrivers/gpu/drm/drm_fb_cma_helper.c
     </sect2>
     <sect2>
       <title>Display Port Helper Functions Reference</title>
@@ -1671,17 +1676,23 @@ void intel_crt_init(struct drm_device *dev)
 !Pdrivers/gpu/drm/drm_crtc.c Tile group
     </sect2>
     <sect2>
-       <title>Bridges</title>
+      <title>Bridges</title>
       <sect3>
-        <title>Overview</title>
+        <title>Overview</title>
 !Pdrivers/gpu/drm/drm_bridge.c overview
       </sect3>
       <sect3>
-        <title>Default bridge callback sequence</title>
+        <title>Default bridge callback sequence</title>
 !Pdrivers/gpu/drm/drm_bridge.c bridge callbacks
       </sect3>
 !Edrivers/gpu/drm/drm_bridge.c
     </sect2>
+    <sect2>
+      <title>Panel Helper Reference</title>
+!Iinclude/drm/drm_panel.h
+!Edrivers/gpu/drm/drm_panel.c
+!Pdrivers/gpu/drm/drm_panel.c drm panel
+    </sect2>
   </sect1>
 
   <!-- Internals: kms properties -->
@@ -1817,7 +1828,7 @@ void intel_crt_init(struct drm_device *dev)
        </tr>
        <tr>
        <td rowspan="42" valign="top" >DRM</td>
-       <td valign="top" >Generic</td>
+       <td rowspan="2" valign="top" >Generic</td>
        <td valign="top" >“rotation”</td>
        <td valign="top" >BITMASK</td>
        <td valign="top" >{ 0, "rotate-0" },
@@ -1832,6 +1843,13 @@ void intel_crt_init(struct drm_device *dev)
        image along the specified axis prior to rotation</td>
        </tr>
        <tr>
+       <td valign="top" >“scaling mode”</td>
+       <td valign="top" >ENUM</td>
+       <td valign="top" >{ "None", "Full", "Center", "Full aspect" }</td>
+       <td valign="top" >Connector</td>
+       <td valign="top" >Supported by: amdgpu, gma500, i915, nouveau and radeon.</td>
+       </tr>
+       <tr>
        <td rowspan="5" valign="top" >Connector</td>
        <td valign="top" >“EDID”</td>
        <td valign="top" >BLOB | IMMUTABLE</td>
@@ -2068,21 +2086,12 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >property to suggest an Y offset for a connector</td>
        </tr>
        <tr>
-       <td rowspan="8" valign="top" >Optional</td>
-       <td valign="top" >“scaling mode”</td>
-       <td valign="top" >ENUM</td>
-       <td valign="top" >{ "None", "Full", "Center", "Full aspect" }</td>
-       <td valign="top" >Connector</td>
-       <td valign="top" >TBD</td>
-       </tr>
-       <tr>
+       <td rowspan="7" valign="top" >Optional</td>
        <td valign="top" >"aspect ratio"</td>
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "None", "4:3", "16:9" }</td>
        <td valign="top" >Connector</td>
-       <td valign="top" >DRM property to set aspect ratio from user space app.
-               This enum is made generic to allow addition of custom aspect
-               ratios.</td>
+       <td valign="top" >TDB</td>
        </tr>
        <tr>
        <td valign="top" >“dirty”</td>
@@ -2153,7 +2162,11 @@ void intel_crt_init(struct drm_device *dev)
        <td valign="top" >ENUM</td>
        <td valign="top" >{ "Automatic", "Full", "Limited 16:235" }</td>
        <td valign="top" >Connector</td>
-       <td valign="top" >TBD</td>
+       <td valign="top" >When this property is set to Limited 16:235
+               and CTM is set, the hardware will be programmed with the
+               result of the multiplication of CTM by the limited range
+               matrix to ensure the pixels normaly in the range 0..1.0 are
+               remapped to the range 16/255..235/255.</td>
        </tr>
        <tr>
        <td valign="top" >“audio”</td>
@@ -3334,7 +3347,7 @@ int num_ioctls;</synopsis>
        <title>Video BIOS Table (VBT)</title>
 !Pdrivers/gpu/drm/i915/intel_bios.c Video BIOS Table (VBT)
 !Idrivers/gpu/drm/i915/intel_bios.c
-!Idrivers/gpu/drm/i915/intel_bios.h
+!Idrivers/gpu/drm/i915/intel_vbt_defs.h
       </sect2>
     </sect1>
 
index 9f97df4d51524bf55beff1f3e3eaace0b8e61637..a5ea451e67fcfe8cf08b94aab409fe05d5095c24 100644 (file)
@@ -35,12 +35,22 @@ Optional properties for HDMI:
                  as an interrupt/status bit in the HDMI controller
                  itself).  See bindings/pinctrl/brcm,bcm2835-gpio.txt
 
+Required properties for DPI:
+- compatible:  Should be "brcm,bcm2835-dpi"
+- reg:         Physical base address and length of the registers
+- clocks:      a) core: The core clock the unit runs on
+               b) pixel: The pixel clock that feeds the pixelvalve
+- port:                Port node with a single endpoint connecting to the panel
+                 device, as defined in [1]
+
 Required properties for V3D:
 - compatible:  Should be "brcm,bcm2835-v3d"
 - reg:         Physical base address and length of the V3D's registers
 - interrupts:  The interrupt number
                  See bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
 
+[1] Documentation/devicetree/bindings/media/video-interfaces.txt
+
 Example:
 pixelvalve@7e807000 {
        compatible = "brcm,bcm2835-pixelvalve2";
@@ -66,6 +76,22 @@ hdmi: hdmi@7e902000 {
        clock-names = "pixel", "hdmi";
 };
 
+dpi: dpi@7e208000 {
+       compatible = "brcm,bcm2835-dpi";
+       reg = <0x7e208000 0x8c>;
+       clocks = <&clocks BCM2835_CLOCK_VPU>,
+                <&clocks BCM2835_CLOCK_DPI>;
+       clock-names = "core", "pixel";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       port {
+               dpi_out: endpoint@0 {
+                       remote-endpoint = <&panel_in>;
+               };
+       };
+};
+
 v3d: v3d@7ec00000 {
        compatible = "brcm,bcm2835-v3d";
        reg = <0x7ec00000 0x1000>;
@@ -75,3 +101,13 @@ v3d: v3d@7ec00000 {
 vc4: gpu {
        compatible = "brcm,bcm2835-vc4";
 };
+
+panel: panel {
+       compatible = "ontat,yx700wv03", "simple-panel";
+
+       port {
+               panel_in: endpoint {
+                       remote-endpoint = <&dpi_out>;
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt b/Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
new file mode 100644 (file)
index 0000000..4f2ba8c
--- /dev/null
@@ -0,0 +1,52 @@
+Analogix Display Port bridge bindings
+
+Required properties for dp-controller:
+       -compatible:
+               platform specific such as:
+                * "samsung,exynos5-dp"
+                * "rockchip,rk3288-dp"
+       -reg:
+               physical base address of the controller and length
+               of memory mapped region.
+       -interrupts:
+               interrupt combiner values.
+       -clocks:
+               from common clock binding: handle to dp clock.
+       -clock-names:
+               from common clock binding: Shall be "dp".
+       -interrupt-parent:
+               phandle to Interrupt combiner node.
+       -phys:
+               from general PHY binding: the phandle for the PHY device.
+       -phy-names:
+               from general PHY binding: Should be "dp".
+
+Optional properties for dp-controller:
+       -force-hpd:
+               Indicate driver need force hpd when hpd detect failed, this
+               is used for some eDP screen which don't have hpd signal.
+       -hpd-gpios:
+               Hotplug detect GPIO.
+               Indicates which GPIO should be used for hotplug detection
+       -port@[X]: SoC specific port nodes with endpoint definitions as defined
+               in Documentation/devicetree/bindings/media/video-interfaces.txt,
+               please refer to the SoC specific binding document:
+               * Documentation/devicetree/bindings/display/exynos/exynos_dp.txt
+               * Documentation/devicetree/bindings/video/analogix_dp-rockchip.txt
+
+[1]: Documentation/devicetree/bindings/media/video-interfaces.txt
+-------------------------------------------------------------------------------
+
+Example:
+
+       dp-controller {
+               compatible = "samsung,exynos5-dp";
+               reg = <0x145b0000 0x10000>;
+               interrupts = <10 3>;
+               interrupt-parent = <&combiner>;
+               clocks = <&clock 342>;
+               clock-names = "dp";
+
+               phys = <&dp_phy>;
+               phy-names = "dp";
+       };
index 377afbf5122a7ee6b5f27e46ffcc882de67d05f5..c9fd7b3807e76ed677379dd807dd3743c9ab7538 100644 (file)
@@ -5,7 +5,8 @@ Exynos series of SoCs which transfers the image data from a video memory
 buffer to an external LCD interface.
 
 Required properties:
-- compatible: value should be "samsung,exynos5433-decon";
+- compatible: value should be one of:
+       "samsung,exynos5433-decon", "samsung,exynos5433-decon-tv";
 - reg: physical base address and length of the DECON registers set.
 - interrupts: should contain a list of all DECON IP block interrupts in the
              order: VSYNC, LCD_SYSTEM. The interrupt specifier format
@@ -16,7 +17,7 @@ Required properties:
 - clocks: must include clock specifiers corresponding to entries in the
          clock-names property.
 - clock-names: list of clock names sorted in the same order as the clocks
-              property. Must contain "aclk_decon", "aclk_smmu_decon0x",
+              property. Must contain "pclk", "aclk_decon", "aclk_smmu_decon0x",
               "aclk_xiu_decon0x", "pclk_smmu_decon0x", clk_decon_vclk",
               "sclk_decon_eclk"
 - ports: contains a port which is connected to mic node. address-cells and
index fe4a7a2dea9c2c3935c29ff38bf773092442f2f1..ade5d8eebf85e509132dad456dc2be838903a12c 100644 (file)
@@ -1,20 +1,3 @@
-Device-Tree bindings for Samsung Exynos Embedded DisplayPort Transmitter(eDP)
-
-DisplayPort is industry standard to accommodate the growing board adoption
-of digital display technology within the PC and CE industries.
-It consolidates the internal and external connection methods to reduce device
-complexity and cost. It also supports necessary features for important cross
-industry applications and provides performance scalability to enable the next
-generation of displays that feature higher color depths, refresh rates, and
-display resolutions.
-
-eDP (embedded display port) device is compliant with Embedded DisplayPort
-standard as follows,
-- DisplayPort standard 1.1a for Exynos5250 and Exynos5260.
-- DisplayPort standard 1.3 for Exynos5422s and Exynos5800.
-
-eDP resides between FIMD and panel or FIMD and bridge such as LVDS.
-
 The Exynos display port interface should be configured based on
 the type of panel connected to it.
 
@@ -48,26 +31,6 @@ Required properties for dp-controller:
                from general PHY binding: the phandle for the PHY device.
        -phy-names:
                from general PHY binding: Should be "dp".
-       -samsung,color-space:
-               input video data format.
-                       COLOR_RGB = 0, COLOR_YCBCR422 = 1, COLOR_YCBCR444 = 2
-       -samsung,dynamic-range:
-               dynamic range for input video data.
-                       VESA = 0, CEA = 1
-       -samsung,ycbcr-coeff:
-               YCbCr co-efficients for input video.
-                       COLOR_YCBCR601 = 0, COLOR_YCBCR709 = 1
-       -samsung,color-depth:
-               number of bits per colour component.
-                       COLOR_6 = 0, COLOR_8 = 1, COLOR_10 = 2, COLOR_12 = 3
-       -samsung,link-rate:
-               link rate supported by the panel.
-                       LINK_RATE_1_62GBPS = 0x6, LINK_RATE_2_70GBPS = 0x0A
-       -samsung,lane-count:
-               number of lanes supported by the panel.
-                       LANE_COUNT1 = 1, LANE_COUNT2 = 2, LANE_COUNT4 = 4
-       - display-timings: timings for the connected panel as described by
-               Documentation/devicetree/bindings/display/display-timing.txt
 
 Optional properties for dp-controller:
        -interlaced:
@@ -83,17 +46,31 @@ Optional properties for dp-controller:
                Hotplug detect GPIO.
                        Indicates which GPIO should be used for hotplug
                        detection
-Video interfaces:
-  Device node can contain video interface port nodes according to [1].
-  The following are properties specific to those nodes:
-
-  endpoint node connected to bridge or panel node:
-   - remote-endpoint: specifies the endpoint in panel or bridge node.
-                     This node is required in all kinds of exynos dp
-                     to represent the connection between dp and bridge
-                     or dp and panel.
-
-[1]: Documentation/devicetree/bindings/media/video-interfaces.txt
+       -video interfaces: Device node can contain video interface port
+                       nodes according to [1].
+       - display-timings: timings for the connected panel as described by
+               Documentation/devicetree/bindings/display/panel/display-timing.txt
+
+For the below properties, please refer to Analogix DP binding document:
+ * Documentation/devicetree/bindings/display/bridge/analogix_dp.txt
+       -phys (required)
+       -phy-names (required)
+       -hpd-gpios (optional)
+        force-hpd (optional)
+
+Deprecated properties for DisplayPort:
+-interlaced:            deprecated prop that can parsed from drm_display_mode.
+-vsync-active-high:     deprecated prop that can parsed from drm_display_mode.
+-hsync-active-high:     deprecated prop that can parsed from drm_display_mode.
+-samsung,ycbcr-coeff:   deprecated prop that can parsed from drm_display_mode.
+-samsung,dynamic-range: deprecated prop that can parsed from drm_display_mode.
+-samsung,color-space:   deprecated prop that can parsed from drm_display_info.
+-samsung,color-depth:   deprecated prop that can parsed from drm_display_info.
+-samsung,link-rate:     deprecated prop that can reading from monitor by dpcd method.
+-samsung,lane-count:    deprecated prop that can reading from monitor by dpcd method.
+-samsung,hpd-gpio:      deprecated name for hpd-gpios.
+
+-------------------------------------------------------------------------------
 
 Example:
 
@@ -112,13 +89,6 @@ SOC specific portion:
 
 Board Specific portion:
        dp-controller {
-               samsung,color-space = <0>;
-               samsung,dynamic-range = <0>;
-               samsung,ycbcr-coeff = <0>;
-               samsung,color-depth = <1>;
-               samsung,link-rate = <0x0a>;
-               samsung,lane-count = <4>;
-
                display-timings {
                        native-mode = <&lcd_timing>;
                        lcd_timing: 1366x768 {
@@ -135,18 +105,9 @@ Board Specific portion:
                };
 
                ports {
-                       port {
+                       port@0 {
                                dp_out: endpoint {
-                                       remote-endpoint = <&dp_in>;
-                               };
-                       };
-               };
-
-               panel {
-                       ...
-                       port {
-                               dp_in: endpoint {
-                                       remote-endpoint = <&dp_out>;
+                                       remote-endpoint = <&bridge_in>;
                                };
                        };
                };
index d474f59be6d637deb2be81a00954fd725fdaafbc..a2ec4c1c938258af80b6bb92e5b7b238e3a988f7 100644 (file)
@@ -5,6 +5,7 @@ Required properties:
        1) "samsung,exynos4210-hdmi"
        2) "samsung,exynos4212-hdmi"
        3) "samsung,exynos5420-hdmi"
+       4) "samsung,exynos5433-hdmi"
 - reg: physical base address of the hdmi and length of memory mapped
        region.
 - interrupts: interrupt number to the cpu.
@@ -12,6 +13,11 @@ Required properties:
        a) phandle of the gpio controller node.
        b) pin number within the gpio controller.
        c) optional flags and pull up/down.
+- ddc: phandle to the hdmi ddc node
+- phy: phandle to the hdmi phy node
+- samsung,syscon-phandle: phandle for system controller node for PMU.
+
+Required properties for Exynos 4210, 4212, 5420 and 5433:
 - clocks: list of clock IDs from SoC clock driver.
        a) hdmi: Gate of HDMI IP bus clock.
        b) sclk_hdmi: Gate of HDMI special clock.
@@ -25,9 +31,24 @@ Required properties:
                sclk_pixel.
 - clock-names: aliases as per driver requirements for above clock IDs:
        "hdmi", "sclk_hdmi", "sclk_pixel", "sclk_hdmiphy" and "mout_hdmi".
-- ddc: phandle to the hdmi ddc node
-- phy: phandle to the hdmi phy node
-- samsung,syscon-phandle: phandle for system controller node for PMU.
+
+Required properties for Exynos 5433:
+- clocks: list of clock specifiers according to common clock bindings.
+       a) hdmi_pclk: Gate of HDMI IP APB bus.
+       b) hdmi_i_pclk: Gate of HDMI-PHY IP APB bus.
+       d) i_tmds_clk: Gate of HDMI TMDS clock.
+       e) i_pixel_clk: Gate of HDMI pixel clock.
+       f) i_spdif_clk: Gate of HDMI SPDIF clock.
+       g) oscclk: Oscillator clock, used as parent of following *_user clocks
+               in case HDMI-PHY is not operational.
+       h) tmds_clko: TMDS clock generated by HDMI-PHY.
+       i) tmds_clko_user: MUX used to switch between oscclk and tmds_clko,
+               respectively if HDMI-PHY is off and operational.
+       j) pixel_clko: Pixel clock generated by HDMI-PHY.
+       k) pixel_clko_user: MUX used to switch between oscclk and pixel_clko,
+               respectively if HDMI-PHY is off and operational.
+- clock-names: aliases for above clock specfiers.
+- samsung,sysreg: handle to syscon used to control the system registers.
 
 Example:
 
index ebf1be9ae3936e2bd05437398ed816d00dd6f343..ae55cde1b69e44f1ecb186b956cae75e743cb47c 100644 (file)
@@ -6,17 +6,24 @@ Required properties:
        * "fsl,vf610-dcu".
 
 - reg:                 Address and length of the register set for dcu.
-- clocks:              From common clock binding: handle to dcu clock.
-- clock-names:         From common clock binding: Shall be "dcu".
+- clocks:              Handle to "dcu" and "pix" clock (in the order below)
+                       This can be the same clock (e.g. LS1021a)
+                       See ../clocks/clock-bindings.txt for details.
+- clock-names:         Should be "dcu" and "pix"
+                       See ../clocks/clock-bindings.txt for details.
 - big-endian           Boolean property, LS1021A DCU registers are big-endian.
 - fsl,panel:           The phandle to panel node.
 
+Optional properties:
+- fsl,tcon:            The phandle to the timing controller node.
+
 Examples:
 dcu: dcu@2ce0000 {
        compatible = "fsl,ls1021a-dcu";
        reg = <0x0 0x2ce0000 0x0 0x10000>;
-       clocks = <&platform_clk 0>;
-       clock-names = "dcu";
+       clocks = <&platform_clk 0>, <&platform_clk 0>;
+       clock-names = "dcu", "pix";
        big-endian;
        fsl,panel = <&panel>;
+       fsl,tcon = <&tcon>;
 };
diff --git a/Documentation/devicetree/bindings/display/fsl,tcon.txt b/Documentation/devicetree/bindings/display/fsl,tcon.txt
new file mode 100644 (file)
index 0000000..6fa4ab6
--- /dev/null
@@ -0,0 +1,18 @@
+Device Tree bindings for Freescale TCON Driver
+
+Required properties:
+- compatible:          Should be one of
+       * "fsl,vf610-tcon".
+
+- reg:                 Address and length of the register set for tcon.
+- clocks:              From common clock binding: handle to tcon ipg clock.
+- clock-names:         From common clock binding: Shall be "ipg".
+
+Examples:
+timing-controller@4003d000 {
+       compatible = "fsl,vf610-tcon";
+       reg = <0x4003d000 0x1000>;
+       clocks = <&clks VF610_CLK_TCON0>;
+       clock-names = "ipg";
+       status = "okay";
+};
diff --git a/Documentation/devicetree/bindings/display/hisilicon/dw-dsi.txt b/Documentation/devicetree/bindings/display/hisilicon/dw-dsi.txt
new file mode 100644 (file)
index 0000000..d270bfe
--- /dev/null
@@ -0,0 +1,72 @@
+Device-Tree bindings for DesignWare DSI Host Controller v1.20a driver
+
+A DSI Host Controller resides in the middle of display controller and external
+HDMI converter or panel.
+
+Required properties:
+- compatible: value should be "hisilicon,hi6220-dsi".
+- reg: physical base address and length of dsi controller's registers.
+- clocks: contains APB clock phandle + clock-specifier pair.
+- clock-names: should be "pclk".
+- ports: contains DSI controller input and output sub port.
+  The input port connects to ADE output port with the reg value "0".
+  The output port with the reg value "1", it could connect to panel or
+  any other bridge endpoints.
+  See Documentation/devicetree/bindings/graph.txt for more device graph info.
+
+A example of HiKey board hi6220 SoC and board specific DT entry:
+Example:
+
+SoC specific:
+       dsi: dsi@f4107800 {
+               compatible = "hisilicon,hi6220-dsi";
+               reg = <0x0 0xf4107800 0x0 0x100>;
+               clocks = <&media_ctrl  HI6220_DSI_PCLK>;
+               clock-names = "pclk";
+               status = "disabled";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       /* 0 for input port */
+                       port@0 {
+                               reg = <0>;
+                               dsi_in: endpoint {
+                                       remote-endpoint = <&ade_out>;
+                               };
+                       };
+               };
+       };
+
+
+Board specific:
+       &dsi {
+               status = "ok";
+
+               ports {
+                       /* 1 for output port */
+                       port@1 {
+                               reg = <1>;
+
+                               dsi_out0: endpoint@0 {
+                                       remote-endpoint = <&adv7533_in>;
+                               };
+                       };
+               };
+       };
+
+       &i2c2 {
+               ...
+
+               adv7533: adv7533@39 {
+                       ...
+
+                       port {
+                               adv7533_in: endpoint {
+                                       remote-endpoint = <&dsi_out0>;
+                               };
+                       };
+               };
+       };
+
diff --git a/Documentation/devicetree/bindings/display/hisilicon/hisi-ade.txt b/Documentation/devicetree/bindings/display/hisilicon/hisi-ade.txt
new file mode 100644 (file)
index 0000000..38dc9d6
--- /dev/null
@@ -0,0 +1,64 @@
+Device-Tree bindings for hisilicon ADE display controller driver
+
+ADE (Advanced Display Engine) is the display controller which grab image
+data from memory, do composition, do post image processing, generate RGB
+timing stream and transfer to DSI.
+
+Required properties:
+- compatible: value should be "hisilicon,hi6220-ade".
+- reg: physical base address and length of the ADE controller's registers.
+- hisilicon,noc-syscon: ADE NOC QoS syscon.
+- resets: The ADE reset controller node.
+- interrupt: the ldi vblank interrupt number used.
+- clocks: a list of phandle + clock-specifier pairs, one for each entry
+  in clock-names.
+- clock-names: should contain:
+  "clk_ade_core" for the ADE core clock.
+  "clk_codec_jpeg" for the media NOC QoS clock, which use the same clock with
+  jpeg codec.
+  "clk_ade_pix" for the ADE pixel clok.
+- assigned-clocks: Should contain "clk_ade_core" and "clk_codec_jpeg" clocks'
+  phandle + clock-specifier pairs.
+- assigned-clock-rates: clock rates, one for each entry in assigned-clocks.
+  The rate of "clk_ade_core" could be "360000000" or "180000000";
+  The rate of "clk_codec_jpeg" could be or less than "1440000000".
+  These rate values could be configured according to performance and power
+  consumption.
+- port: the output port. This contains one endpoint subnode, with its
+  remote-endpoint set to the phandle of the connected DSI input endpoint.
+  See Documentation/devicetree/bindings/graph.txt for more device graph info.
+
+Optional properties:
+- dma-coherent: Present if dma operations are coherent.
+
+
+A example of HiKey board hi6220 SoC specific DT entry:
+Example:
+
+       ade: ade@f4100000 {
+               compatible = "hisilicon,hi6220-ade";
+               reg = <0x0 0xf4100000 0x0 0x7800>;
+               reg-names = "ade_base";
+               hisilicon,noc-syscon = <&medianoc_ade>;
+               resets = <&media_ctrl MEDIA_ADE>;
+               interrupts = <0 115 4>; /* ldi interrupt */
+
+               clocks = <&media_ctrl HI6220_ADE_CORE>,
+                        <&media_ctrl HI6220_CODEC_JPEG>,
+                        <&media_ctrl HI6220_ADE_PIX_SRC>;
+               /*clock name*/
+               clock-names  = "clk_ade_core",
+                              "clk_codec_jpeg",
+                              "clk_ade_pix";
+
+               assigned-clocks = <&media_ctrl HI6220_ADE_CORE>,
+                       <&media_ctrl HI6220_CODEC_JPEG>;
+               assigned-clock-rates = <360000000>, <288000000>;
+               dma-coherent;
+
+               port {
+                       ade_out: endpoint {
+                               remote-endpoint = <&dsi_in>;
+                       };
+               };
+       };
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt b/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt
new file mode 100644 (file)
index 0000000..db6e77e
--- /dev/null
@@ -0,0 +1,203 @@
+Mediatek display subsystem
+==========================
+
+The Mediatek display subsystem consists of various DISP function blocks in the
+MMSYS register space. The connections between them can be configured by output
+and input selectors in the MMSYS_CONFIG register space. Pixel clock and start
+of frame signal are distributed to the other function blocks by a DISP_MUTEX
+function block.
+
+All DISP device tree nodes must be siblings to the central MMSYS_CONFIG node.
+For a description of the MMSYS_CONFIG binding, see
+Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.txt.
+
+DISP function blocks
+====================
+
+A display stream starts at a source function block that reads pixel data from
+memory and ends with a sink function block that drives pixels on a display
+interface, or writes pixels back to memory. All DISP function blocks have
+their own register space, interrupt, and clock gate. The blocks that can
+access memory additionally have to list the IOMMU and local arbiter they are
+connected to.
+
+For a description of the display interface sink function blocks, see
+Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt and
+Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt.
+
+Required properties (all function blocks):
+- compatible: "mediatek,<chip>-disp-<function>", one of
+       "mediatek,<chip>-disp-ovl"   - overlay (4 layers, blending, csc)
+       "mediatek,<chip>-disp-rdma"  - read DMA / line buffer
+       "mediatek,<chip>-disp-wdma"  - write DMA
+       "mediatek,<chip>-disp-color" - color processor
+       "mediatek,<chip>-disp-aal"   - adaptive ambient light controller
+       "mediatek,<chip>-disp-gamma" - gamma correction
+       "mediatek,<chip>-disp-merge" - merge streams from two RDMA sources
+       "mediatek,<chip>-disp-split" - split stream to two encoders
+       "mediatek,<chip>-disp-ufoe"  - data compression engine
+       "mediatek,<chip>-dsi"        - DSI controller, see mediatek,dsi.txt
+       "mediatek,<chip>-dpi"        - DPI controller, see mediatek,dpi.txt
+       "mediatek,<chip>-disp-mutex" - display mutex
+       "mediatek,<chip>-disp-od"    - overdrive
+- reg: Physical base address and length of the function block register space
+- interrupts: The interrupt signal from the function block (required, except for
+  merge and split function blocks).
+- clocks: device clocks
+  See Documentation/devicetree/bindings/clock/clock-bindings.txt for details.
+  For most function blocks this is just a single clock input. Only the DSI and
+  DPI controller nodes have multiple clock inputs. These are documented in
+  mediatek,dsi.txt and mediatek,dpi.txt, respectively.
+
+Required properties (DMA function blocks):
+- compatible: Should be one of
+       "mediatek,<chip>-disp-ovl"
+       "mediatek,<chip>-disp-rdma"
+       "mediatek,<chip>-disp-wdma"
+- larb: Should contain a phandle pointing to the local arbiter device as defined
+  in Documentation/devicetree/bindings/soc/mediatek/mediatek,smi-larb.txt
+- iommus: Should point to the respective IOMMU block with master port as
+  argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.txt
+  for details.
+
+Examples:
+
+mmsys: clock-controller@14000000 {
+       compatible = "mediatek,mt8173-mmsys", "syscon";
+       reg = <0 0x14000000 0 0x1000>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       #clock-cells = <1>;
+};
+
+ovl0: ovl@1400c000 {
+       compatible = "mediatek,mt8173-disp-ovl";
+       reg = <0 0x1400c000 0 0x1000>;
+       interrupts = <GIC_SPI 180 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_OVL0>;
+       iommus = <&iommu M4U_PORT_DISP_OVL0>;
+       mediatek,larb = <&larb0>;
+};
+
+ovl1: ovl@1400d000 {
+       compatible = "mediatek,mt8173-disp-ovl";
+       reg = <0 0x1400d000 0 0x1000>;
+       interrupts = <GIC_SPI 181 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_OVL1>;
+       iommus = <&iommu M4U_PORT_DISP_OVL1>;
+       mediatek,larb = <&larb4>;
+};
+
+rdma0: rdma@1400e000 {
+       compatible = "mediatek,mt8173-disp-rdma";
+       reg = <0 0x1400e000 0 0x1000>;
+       interrupts = <GIC_SPI 182 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_RDMA0>;
+       iommus = <&iommu M4U_PORT_DISP_RDMA0>;
+       mediatek,larb = <&larb0>;
+};
+
+rdma1: rdma@1400f000 {
+       compatible = "mediatek,mt8173-disp-rdma";
+       reg = <0 0x1400f000 0 0x1000>;
+       interrupts = <GIC_SPI 183 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_RDMA1>;
+       iommus = <&iommu M4U_PORT_DISP_RDMA1>;
+       mediatek,larb = <&larb4>;
+};
+
+rdma2: rdma@14010000 {
+       compatible = "mediatek,mt8173-disp-rdma";
+       reg = <0 0x14010000 0 0x1000>;
+       interrupts = <GIC_SPI 184 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_RDMA2>;
+       iommus = <&iommu M4U_PORT_DISP_RDMA2>;
+       mediatek,larb = <&larb4>;
+};
+
+wdma0: wdma@14011000 {
+       compatible = "mediatek,mt8173-disp-wdma";
+       reg = <0 0x14011000 0 0x1000>;
+       interrupts = <GIC_SPI 185 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_WDMA0>;
+       iommus = <&iommu M4U_PORT_DISP_WDMA0>;
+       mediatek,larb = <&larb0>;
+};
+
+wdma1: wdma@14012000 {
+       compatible = "mediatek,mt8173-disp-wdma";
+       reg = <0 0x14012000 0 0x1000>;
+       interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_WDMA1>;
+       iommus = <&iommu M4U_PORT_DISP_WDMA1>;
+       mediatek,larb = <&larb4>;
+};
+
+color0: color@14013000 {
+       compatible = "mediatek,mt8173-disp-color";
+       reg = <0 0x14013000 0 0x1000>;
+       interrupts = <GIC_SPI 187 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_COLOR0>;
+};
+
+color1: color@14014000 {
+       compatible = "mediatek,mt8173-disp-color";
+       reg = <0 0x14014000 0 0x1000>;
+       interrupts = <GIC_SPI 188 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_COLOR1>;
+};
+
+aal@14015000 {
+       compatible = "mediatek,mt8173-disp-aal";
+       reg = <0 0x14015000 0 0x1000>;
+       interrupts = <GIC_SPI 189 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_AAL>;
+};
+
+gamma@14016000 {
+       compatible = "mediatek,mt8173-disp-gamma";
+       reg = <0 0x14016000 0 0x1000>;
+       interrupts = <GIC_SPI 190 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_GAMMA>;
+};
+
+ufoe@1401a000 {
+       compatible = "mediatek,mt8173-disp-ufoe";
+       reg = <0 0x1401a000 0 0x1000>;
+       interrupts = <GIC_SPI 191 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_UFOE>;
+};
+
+dsi0: dsi@1401b000 {
+       /* See mediatek,dsi.txt for details */
+};
+
+dpi0: dpi@1401d000 {
+       /* See mediatek,dpi.txt for details */
+};
+
+mutex: mutex@14020000 {
+       compatible = "mediatek,mt8173-disp-mutex";
+       reg = <0 0x14020000 0 0x1000>;
+       interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_LOW>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_MUTEX_32K>;
+};
+
+od@14023000 {
+       compatible = "mediatek,mt8173-disp-od";
+       reg = <0 0x14023000 0 0x1000>;
+       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
+       clocks = <&mmsys CLK_MM_DISP_OD>;
+};
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt b/Documentation/devicetree/bindings/display/mediatek/mediatek,dpi.txt
new file mode 100644 (file)
index 0000000..b6a7e73
--- /dev/null
@@ -0,0 +1,35 @@
+Mediatek DPI Device
+===================
+
+The Mediatek DPI function block is a sink of the display subsystem and
+provides 8-bit RGB/YUV444 or 8/10/10-bit YUV422 pixel data on a parallel
+output bus.
+
+Required properties:
+- compatible: "mediatek,<chip>-dpi"
+- reg: Physical base address and length of the controller's registers
+- interrupts: The interrupt signal from the function block.
+- clocks: device clocks
+  See Documentation/devicetree/bindings/clock/clock-bindings.txt for details.
+- clock-names: must contain "pixel", "engine", and "pll"
+- port: Output port node with endpoint definitions as described in
+  Documentation/devicetree/bindings/graph.txt. This port should be connected
+  to the input port of an attached HDMI or LVDS encoder chip.
+
+Example:
+
+dpi0: dpi@1401d000 {
+       compatible = "mediatek,mt8173-dpi";
+       reg = <0 0x1401d000 0 0x1000>;
+       interrupts = <GIC_SPI 194 IRQ_TYPE_LEVEL_LOW>;
+       clocks = <&mmsys CLK_MM_DPI_PIXEL>,
+                <&mmsys CLK_MM_DPI_ENGINE>,
+                <&apmixedsys CLK_APMIXED_TVDPLL>;
+       clock-names = "pixel", "engine", "pll";
+
+       port {
+               dpi0_out: endpoint {
+                       remote-endpoint = <&hdmi0_in>;
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt b/Documentation/devicetree/bindings/display/mediatek/mediatek,dsi.txt
new file mode 100644 (file)
index 0000000..2b1585a
--- /dev/null
@@ -0,0 +1,60 @@
+Mediatek DSI Device
+===================
+
+The Mediatek DSI function block is a sink of the display subsystem and can
+drive up to 4-lane MIPI DSI output. Two DSIs can be synchronized for dual-
+channel output.
+
+Required properties:
+- compatible: "mediatek,<chip>-dsi"
+- reg: Physical base address and length of the controller's registers
+- interrupts: The interrupt signal from the function block.
+- clocks: device clocks
+  See Documentation/devicetree/bindings/clock/clock-bindings.txt for details.
+- clock-names: must contain "engine", "digital", and "hs"
+- phys: phandle link to the MIPI D-PHY controller.
+- phy-names: must contain "dphy"
+- port: Output port node with endpoint definitions as described in
+  Documentation/devicetree/bindings/graph.txt. This port should be connected
+  to the input port of an attached DSI panel or DSI-to-eDP encoder chip.
+
+MIPI TX Configuration Module
+============================
+
+The MIPI TX configuration module controls the MIPI D-PHY.
+
+Required properties:
+- compatible: "mediatek,<chip>-mipi-tx"
+- reg: Physical base address and length of the controller's registers
+- clocks: PLL reference clock
+- clock-output-names: name of the output clock line to the DSI encoder
+- #clock-cells: must be <0>;
+- #phy-cells: must be <0>.
+
+Example:
+
+mipi_tx0: mipi-dphy@10215000 {
+       compatible = "mediatek,mt8173-mipi-tx";
+       reg = <0 0x10215000 0 0x1000>;
+       clocks = <&clk26m>;
+       clock-output-names = "mipi_tx0_pll";
+       #clock-cells = <0>;
+       #phy-cells = <0>;
+};
+
+dsi0: dsi@1401b000 {
+       compatible = "mediatek,mt8173-dsi";
+       reg = <0 0x1401b000 0 0x1000>;
+       interrupts = <GIC_SPI 192 IRQ_TYPE_LEVEL_LOW>;
+       clocks = <&mmsys MM_DSI0_ENGINE>, <&mmsys MM_DSI0_DIGITAL>,
+                <&mipi_tx0>;
+       clock-names = "engine", "digital", "hs";
+       phys = <&mipi_tx0>;
+       phy-names = "dphy";
+
+       port {
+               dsi0_out: endpoint {
+                       remote-endpoint = <&panel_in>;
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/display/panel/innolux,at070tn92.txt b/Documentation/devicetree/bindings/display/panel/innolux,at070tn92.txt
new file mode 100644 (file)
index 0000000..3e10cd7
--- /dev/null
@@ -0,0 +1,7 @@
+Innolux AT070TN92 7.0" WQVGA TFT LCD panel
+
+Required properties:
+- compatible: should be "innolux,at070tn92"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino-43-ts.txt b/Documentation/devicetree/bindings/display/panel/olimex,lcd-olinuxino-43-ts.txt
new file mode 100644 (file)
index 0000000..74540a0
--- /dev/null
@@ -0,0 +1,7 @@
+Olimex 4.3" TFT LCD panel
+
+Required properties:
+- compatible: should be "olimex,lcd-olinuxino-43-ts"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt b/Documentation/devicetree/bindings/display/panel/ontat,yx700wv03.txt
new file mode 100644 (file)
index 0000000..3d8a5e0
--- /dev/null
@@ -0,0 +1,7 @@
+On Tat Industrial Company 7" DPI TFT panel.
+
+Required properties:
+- compatible: should be "ontat,yx700wv03"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/tpk,f07a-0102.txt b/Documentation/devicetree/bindings/display/panel/tpk,f07a-0102.txt
new file mode 100644 (file)
index 0000000..a2613b9
--- /dev/null
@@ -0,0 +1,8 @@
+TPK U.S.A. LLC Fusion 7" integrated projected capacitive touch display with,
+800 x 480 (WVGA) LCD panel.
+
+Required properties:
+- compatible: should be "tpk,f07a-0102"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/panel/tpk,f10a-0102.txt b/Documentation/devicetree/bindings/display/panel/tpk,f10a-0102.txt
new file mode 100644 (file)
index 0000000..b9d0511
--- /dev/null
@@ -0,0 +1,8 @@
+TPK U.S.A. LLC Fusion 10.1" integrated projected capacitive touch display with,
+1024 x 600 (WSVGA) LCD panel.
+
+Required properties:
+- compatible: should be "tpk,f10a-0102"
+
+This binding is compatible with the simple-panel binding, which is specified
+in simple-panel.txt in this directory.
diff --git a/Documentation/devicetree/bindings/display/rockchip/analogix_dp-rockchip.txt b/Documentation/devicetree/bindings/display/rockchip/analogix_dp-rockchip.txt
new file mode 100644 (file)
index 0000000..e832ff9
--- /dev/null
@@ -0,0 +1,92 @@
+Rockchip RK3288 specific extensions to the Analogix Display Port
+================================
+
+Required properties:
+- compatible: "rockchip,rk3288-edp";
+
+- reg: physical base address of the controller and length
+
+- clocks: from common clock binding: handle to dp clock.
+         of memory mapped region.
+
+- clock-names: from common clock binding:
+              Required elements: "dp" "pclk"
+
+- resets: Must contain an entry for each entry in reset-names.
+         See ../reset/reset.txt for details.
+
+- pinctrl-names: Names corresponding to the chip hotplug pinctrl states.
+- pinctrl-0: pin-control mode. should be <&edp_hpd>
+
+- reset-names: Must include the name "dp"
+
+- rockchip,grf: this soc should set GRF regs, so need get grf here.
+
+- ports: there are 2 port nodes with endpoint definitions as defined in
+  Documentation/devicetree/bindings/media/video-interfaces.txt.
+    Port 0: contained 2 endpoints, connecting to the output of vop.
+    Port 1: contained 1 endpoint, connecting to the input of panel.
+
+For the below properties, please refer to Analogix DP binding document:
+ * Documentation/devicetree/bindings/drm/bridge/analogix_dp.txt
+- phys (required)
+- phy-names (required)
+- hpd-gpios (optional)
+- force-hpd (optional)
+-------------------------------------------------------------------------------
+
+Example:
+       dp-controller: dp@ff970000 {
+               compatible = "rockchip,rk3288-dp";
+               reg = <0xff970000 0x4000>;
+               interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&cru SCLK_EDP>, <&cru PCLK_EDP_CTRL>;
+               clock-names = "dp", "pclk";
+               phys = <&dp_phy>;
+               phy-names = "dp";
+
+               rockchip,grf = <&grf>;
+               resets = <&cru 111>;
+               reset-names = "dp";
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&edp_hpd>;
+
+               status = "disabled";
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       edp_in: port@0 {
+                               reg = <0>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               edp_in_vopb: endpoint@0 {
+                                       reg = <0>;
+                                       remote-endpoint = <&vopb_out_edp>;
+                               };
+                               edp_in_vopl: endpoint@1 {
+                                       reg = <1>;
+                                       remote-endpoint = <&vopl_out_edp>;
+                               };
+                       };
+
+                       edp_out: port@1 {
+                               reg = <1>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               edp_out_panel: endpoint {
+                                       reg = <0>;
+                                       remote-endpoint = <&panel_in_edp>
+                               };
+                       };
+               };
+       };
+
+       pinctrl {
+               edp {
+                       edp_hpd: edp-hpd {
+                               rockchip,pins = <7 11 RK_FUNC_2 &pcfg_pull_none>;
+                       };
+               };
+       };
diff --git a/Documentation/devicetree/bindings/display/snps,arcpgu.txt b/Documentation/devicetree/bindings/display/snps,arcpgu.txt
new file mode 100644 (file)
index 0000000..c5c7dfd
--- /dev/null
@@ -0,0 +1,35 @@
+ARC PGU
+
+This is a display controller found on several development boards produced
+by Synopsys. The ARC PGU is an RGB streamer that reads the data from a
+framebuffer and sends it to a single digital encoder (usually HDMI).
+
+Required properties:
+  - compatible: "snps,arcpgu"
+  - reg: Physical base address and length of the controller's registers.
+  - clocks: A list of phandle + clock-specifier pairs, one for each
+    entry in 'clock-names'.
+  - clock-names: A list of clock names. For ARC PGU it should contain:
+      - "pxlclk" for the clock feeding the output PLL of the controller.
+
+Required sub-nodes:
+  - port: The PGU connection to an encoder chip.
+
+Example:
+
+/ {
+       ...
+
+       pgu@XXXXXXXX {
+               compatible = "snps,arcpgu";
+               reg = <0xXXXXXXXX 0x400>;
+               clocks = <&clock_node>;
+               clock-names = "pxlclk";
+
+               port {
+                       pgu_output: endpoint {
+                               remote-endpoint = <&hdmi_enc_input>;
+                       };
+               };
+       };
+};
diff --git a/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt b/Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
new file mode 100644 (file)
index 0000000..df8f4ae
--- /dev/null
@@ -0,0 +1,258 @@
+Allwinner A10 Display Pipeline
+==============================
+
+The Allwinner A10 Display pipeline is composed of several components
+that are going to be documented below:
+
+TV Encoder
+----------
+
+The TV Encoder supports the composite and VGA output. It is one end of
+the pipeline.
+
+Required properties:
+ - compatible: value should be "allwinner,sun4i-a10-tv-encoder".
+ - reg: base address and size of memory-mapped region
+ - clocks: the clocks driving the TV encoder
+ - resets: phandle to the reset controller driving the encoder
+
+- ports: A ports node with endpoint definitions as defined in
+  Documentation/devicetree/bindings/media/video-interfaces.txt. The
+  first port should be the input endpoint.
+
+TCON
+----
+
+The TCON acts as a timing controller for RGB, LVDS and TV interfaces.
+
+Required properties:
+ - compatible: value should be "allwinner,sun5i-a13-tcon".
+ - reg: base address and size of memory-mapped region
+ - interrupts: interrupt associated to this IP
+ - clocks: phandles to the clocks feeding the TCON. Three are needed:
+   - 'ahb': the interface clocks
+   - 'tcon-ch0': The clock driving the TCON channel 0
+   - 'tcon-ch1': The clock driving the TCON channel 1
+ - resets: phandles to the reset controllers driving the encoder
+   - "lcd": the reset line for the TCON channel 0
+
+ - clock-names: the clock names mentioned above
+ - reset-names: the reset names mentioned above
+ - clock-output-names: Name of the pixel clock created
+
+- ports: A ports node with endpoint definitions as defined in
+  Documentation/devicetree/bindings/media/video-interfaces.txt. The
+  first port should be the input endpoint, the second one the output
+
+  The output should have two endpoints. The first is the block
+  connected to the TCON channel 0 (usually a panel or a bridge), the
+  second the block connected to the TCON channel 1 (usually the TV
+  encoder)
+
+
+Display Engine Backend
+----------------------
+
+The display engine backend exposes layers and sprites to the
+system.
+
+Required properties:
+  - compatible: value must be one of:
+    * allwinner,sun5i-a13-display-backend
+  - reg: base address and size of the memory-mapped region.
+  - clocks: phandles to the clocks feeding the frontend and backend
+    * ahb: the backend interface clock
+    * mod: the backend module clock
+    * ram: the backend DRAM clock
+  - clock-names: the clock names mentioned above
+  - resets: phandles to the reset controllers driving the backend
+
+- ports: A ports node with endpoint definitions as defined in
+  Documentation/devicetree/bindings/media/video-interfaces.txt. The
+  first port should be the input endpoints, the second one the output
+
+Display Engine Frontend
+-----------------------
+
+The display engine frontend does formats conversion, scaling,
+deinterlacing and color space conversion.
+
+Required properties:
+  - compatible: value must be one of:
+    * allwinner,sun5i-a13-display-frontend
+  - reg: base address and size of the memory-mapped region.
+  - interrupts: interrupt associated to this IP
+  - clocks: phandles to the clocks feeding the frontend and backend
+    * ahb: the backend interface clock
+    * mod: the backend module clock
+    * ram: the backend DRAM clock
+  - clock-names: the clock names mentioned above
+  - resets: phandles to the reset controllers driving the backend
+
+- ports: A ports node with endpoint definitions as defined in
+  Documentation/devicetree/bindings/media/video-interfaces.txt. The
+  first port should be the input endpoints, the second one the outputs
+
+
+Display Engine Pipeline
+-----------------------
+
+The display engine pipeline (and its entry point, since it can be
+either directly the backend or the frontend) is represented as an
+extra node.
+
+Required properties:
+  - compatible: value must be one of:
+    * allwinner,sun5i-a13-display-engine
+
+  - allwinner,pipelines: list of phandle to the display engine
+    frontends available.
+
+Example:
+
+panel: panel {
+       compatible = "olimex,lcd-olinuxino-43-ts";
+       #address-cells = <1>;
+       #size-cells = <0>;
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               panel_input: endpoint {
+                       remote-endpoint = <&tcon0_out_panel>;
+               };
+       };
+};
+
+tve0: tv-encoder@01c0a000 {
+       compatible = "allwinner,sun4i-a10-tv-encoder";
+       reg = <0x01c0a000 0x1000>;
+       clocks = <&ahb_gates 34>;
+       resets = <&tcon_ch0_clk 0>;
+
+       port {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               tve0_in_tcon0: endpoint@0 {
+                       reg = <0>;
+                       remote-endpoint = <&tcon0_out_tve0>;
+               };
+       };
+};
+
+tcon0: lcd-controller@1c0c000 {
+       compatible = "allwinner,sun5i-a13-tcon";
+       reg = <0x01c0c000 0x1000>;
+       interrupts = <44>;
+       resets = <&tcon_ch0_clk 1>;
+       reset-names = "lcd";
+       clocks = <&ahb_gates 36>,
+                <&tcon_ch0_clk>,
+                <&tcon_ch1_clk>;
+       clock-names = "ahb",
+                     "tcon-ch0",
+                     "tcon-ch1";
+       clock-output-names = "tcon-pixel-clock";
+
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               tcon0_in: port@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+
+                       tcon0_in_be0: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&be0_out_tcon0>;
+                       };
+               };
+
+               tcon0_out: port@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+
+                       tcon0_out_panel: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&panel_input>;
+                       };
+
+                       tcon0_out_tve0: endpoint@1 {
+                               reg = <1>;
+                               remote-endpoint = <&tve0_in_tcon0>;
+                       };
+               };
+       };
+};
+
+fe0: display-frontend@1e00000 {
+       compatible = "allwinner,sun5i-a13-display-frontend";
+       reg = <0x01e00000 0x20000>;
+       interrupts = <47>;
+       clocks = <&ahb_gates 46>, <&de_fe_clk>,
+                <&dram_gates 25>;
+       clock-names = "ahb", "mod",
+                     "ram";
+       resets = <&de_fe_clk>;
+
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               fe0_out: port@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+
+                       fe0_out_be0: endpoint {
+                               remote-endpoint = <&be0_in_fe0>;
+                       };
+               };
+       };
+};
+
+be0: display-backend@1e60000 {
+       compatible = "allwinner,sun5i-a13-display-backend";
+       reg = <0x01e60000 0x10000>;
+       clocks = <&ahb_gates 44>, <&de_be_clk>,
+                <&dram_gates 26>;
+       clock-names = "ahb", "mod",
+                     "ram";
+       resets = <&de_be_clk>;
+
+       ports {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               be0_in: port@0 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <0>;
+
+                       be0_in_fe0: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&fe0_out_be0>;
+                       };
+               };
+
+               be0_out: port@1 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <1>;
+
+                       be0_out_tcon0: endpoint@0 {
+                               reg = <0>;
+                               remote-endpoint = <&tcon0_in_be0>;
+                       };
+               };
+       };
+};
+
+display-engine {
+       compatible = "allwinner,sun5i-a13-display-engine";
+       allwinner,pipelines = <&fe0>;
+};
index 4454483cc53ffdfe89a1216c2a422ed01f446c32..a7440bcd67ffc9ac43afe39564cb434ce8e58bc6 100644 (file)
@@ -23,6 +23,7 @@ amlogic       Amlogic, Inc.
 ampire Ampire Co., Ltd.
 ams    AMS AG
 amstaos        AMS-Taos Inc.
+analogix       Analogix Semiconductor, Inc.
 apm    Applied Micro Circuits Corporation (APM)
 aptina Aptina Imaging
 arasan Arasan Chip Systems
@@ -185,6 +186,7 @@ okaya       Okaya Electric America, Inc.
 olimex OLIMEX Ltd.
 onion  Onion Corporation
 onnn   ON Semiconductor Corp.
+ontat  On Tat Industrial Company
 opencores      OpenCores.org
 option Option NV
 ortustech      Ortus Technology Co., Ltd.
@@ -261,6 +263,7 @@ toradex     Toradex AG
 toshiba        Toshiba Corporation
 toumaz Toumaz
 tplink TP-LINK Technologies Co., Ltd.
+tpk    TPK U.S.A. LLC
 tronfy Tronfy
 tronsmart      Tronsmart
 truly  Truly Semiconductors Limited
diff --git a/Documentation/devicetree/bindings/video/bridge/anx7814.txt b/Documentation/devicetree/bindings/video/bridge/anx7814.txt
new file mode 100644 (file)
index 0000000..b2a22c2
--- /dev/null
@@ -0,0 +1,40 @@
+Analogix ANX7814 SlimPort (Full-HD Transmitter)
+-----------------------------------------------
+
+The ANX7814 is an ultra-low power Full-HD (1080p60) SlimPort transmitter
+designed for portable devices.
+
+Required properties:
+
+ - compatible          : "analogix,anx7814"
+ - reg                 : I2C address of the device
+ - interrupt-parent    : Should be the phandle of the interrupt controller
+                         that services interrupts for this device
+ - interrupts          : Should contain the INTP interrupt
+ - hpd-gpios           : Which GPIO to use for hpd
+ - pd-gpios            : Which GPIO to use for power down
+ - reset-gpios         : Which GPIO to use for reset
+
+Optional properties:
+
+ - dvdd10-supply       : Regulator for 1.0V digital core power.
+ - Video port for HDMI input, using the DT bindings defined in [1].
+
+[1]: Documentation/devicetree/bindings/media/video-interfaces.txt
+
+Example:
+
+       anx7814: anx7814@38 {
+               compatible = "analogix,anx7814";
+               reg = <0x38>;
+               interrupt-parent = <&gpio0>;
+               interrupts = <99 IRQ_TYPE_LEVEL_LOW>;   /* INTP */
+               hpd-gpios = <&pio 36 GPIO_ACTIVE_HIGH>;
+               pd-gpios = <&pio 33 GPIO_ACTIVE_HIGH>;
+               reset-gpios = <&pio 98 GPIO_ACTIVE_HIGH>;
+               port {
+                       anx7814_in: endpoint {
+                               remote-endpoint = <&hdmi0_out>;
+                       };
+               };
+       };
index 3084c75828632399b328dc142f3f4da8d8c9bcb3..f27ff1b3275721bad423257857661486bb4c6b2c 100644 (file)
@@ -856,6 +856,12 @@ S: Maintained
 F:     drivers/net/arcnet/
 F:     include/uapi/linux/if_arcnet.h
 
+ARC PGU DRM DRIVER
+M:     Alexey Brodkin <abrodkin@synopsys.com>
+S:     Supported
+F:     drivers/gpu/drm/arc/
+F:     Documentation/devicetree/bindings/display/snps,arcpgu.txt
+
 ARM HDLCD DRM DRIVER
 M:     Liviu Dudau <liviu.dudau@arm.com>
 S:     Supported
@@ -3847,9 +3853,25 @@ T:       git git://people.freedesktop.org/~airlied/linux
 S:     Maintained
 F:     drivers/gpu/drm/
 F:     drivers/gpu/vga/
+F:     Documentation/DocBook/gpu.*
 F:     include/drm/
 F:     include/uapi/drm/
 
+DRM DRIVER FOR AST SERVER GRAPHICS CHIPS
+M:     Dave Airlie <airlied@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/ast/
+
+DRM DRIVER FOR BOCHS VIRTUAL GPU
+M:     Gerd Hoffmann <kraxel@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/bochs/
+
+DRM DRIVER FOR QEMU'S CIRRUS DEVICE
+M:     Dave Airlie <airlied@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/cirrus/
+
 RADEON and AMDGPU DRM DRIVERS
 M:     Alex Deucher <alexander.deucher@amd.com>
 M:     Christian König <christian.koenig@amd.com>
@@ -3857,9 +3879,9 @@ L:        dri-devel@lists.freedesktop.org
 T:     git git://people.freedesktop.org/~agd5f/linux
 S:     Supported
 F:     drivers/gpu/drm/radeon/
-F:     include/uapi/drm/radeon*
+F:     include/uapi/drm/radeon_drm.h
 F:     drivers/gpu/drm/amd/
-F:     include/uapi/drm/amdgpu*
+F:     include/uapi/drm/amdgpu_drm.h
 
 DRM PANEL DRIVERS
 M:     Thierry Reding <thierry.reding@gmail.com>
@@ -3882,7 +3904,7 @@ T:        git git://anongit.freedesktop.org/drm-intel
 S:     Supported
 F:     drivers/gpu/drm/i915/
 F:     include/drm/i915*
-F:     include/uapi/drm/i915*
+F:     include/uapi/drm/i915_drm.h
 
 DRM DRIVERS FOR ATMEL HLCDC
 M:     Boris Brezillon <boris.brezillon@free-electrons.com>
@@ -3891,6 +3913,13 @@ S:       Supported
 F:     drivers/gpu/drm/atmel-hlcdc/
 F:     Documentation/devicetree/bindings/drm/atmel/
 
+DRM DRIVERS FOR ALLWINNER A10
+M:     Maxime Ripard  <maxime.ripard@free-electrons.com>
+L:     dri-devel@lists.freedesktop.org
+S:     Supported
+F:     drivers/gpu/drm/sun4i/
+F:     Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
+
 DRM DRIVERS FOR EXYNOS
 M:     Inki Dae <inki.dae@samsung.com>
 M:     Joonyoung Shim <jy0922.shim@samsung.com>
@@ -3900,8 +3929,8 @@ L:        dri-devel@lists.freedesktop.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git
 S:     Supported
 F:     drivers/gpu/drm/exynos/
-F:     include/drm/exynos*
-F:     include/uapi/drm/exynos*
+F:     include/uapi/drm/exynos_drm.h
+F:     Documentation/devicetree/bindings/display/exynos/
 
 DRM DRIVERS FOR FREESCALE DCU
 M:     Stefan Agner <stefan@agner.ch>
@@ -3910,6 +3939,7 @@ L:        dri-devel@lists.freedesktop.org
 S:     Supported
 F:     drivers/gpu/drm/fsl-dcu/
 F:     Documentation/devicetree/bindings/display/fsl,dcu.txt
+F:     Documentation/devicetree/bindings/display/fsl,tcon.txt
 F:     Documentation/devicetree/bindings/display/panel/nec,nl4827hc19_05b.txt
 
 DRM DRIVERS FOR FREESCALE IMX
@@ -3925,12 +3955,45 @@ M:      Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
 L:     dri-devel@lists.freedesktop.org
 T:     git git://github.com/patjak/drm-gma500
 S:     Maintained
-F:     drivers/gpu/drm/gma500
-F:     include/drm/gma500*
+F:     drivers/gpu/drm/gma500/
+
+DRM DRIVERS FOR HISILICON
+M:     Xinliang Liu <z.liuxinliang@hisilicon.com>
+R:     Xinwei Kong <kong.kongxinwei@hisilicon.com>
+R:     Chen Feng <puck.chen@hisilicon.com>
+L:     dri-devel@lists.freedesktop.org
+T:     git git://github.com/xin3liang/linux.git
+S:     Maintained
+F:     drivers/gpu/drm/hisilicon/
+F:     Documentation/devicetree/bindings/display/hisilicon/
+
+DRM DRIVER FOR INTEL I810 VIDEO CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/i810/
+F:     include/uapi/drm/i810_drm.h
+
+DRM DRIVER FOR MSM ADRENO GPU
+M:     Rob Clark <robdclark@gmail.com>
+L:     linux-arm-msm@vger.kernel.org
+L:     dri-devel@lists.freedesktop.org
+L:     freedreno@lists.freedesktop.org
+T:     git git://people.freedesktop.org/~robclark/linux
+S:     Maintained
+F:     drivers/gpu/drm/msm/
+F:     include/uapi/drm/msm_drm.h
+F:     Documentation/devicetree/bindings/display/msm/
+
+DRM DRIVER FOR NVIDIA GEFORCE/QUADRO GPUS
+M:     Ben Skeggs <bskeggs@redhat.com>
+L:     dri-devel@lists.freedesktop.org
+L:     nouveau@lists.freedesktop.org
+T:     git git://github.com/skeggsb/linux
+S:     Supported
+F:     drivers/gpu/drm/nouveau/
+F:     include/uapi/drm/nouveau_drm.h
 
 DRM DRIVERS FOR NVIDIA TEGRA
 M:     Thierry Reding <thierry.reding@gmail.com>
-M:     Terje Bergström <tbergstrom@nvidia.com>
 L:     dri-devel@lists.freedesktop.org
 L:     linux-tegra@vger.kernel.org
 T:     git git://anongit.freedesktop.org/tegra/linux.git
@@ -3941,22 +4004,54 @@ F:      include/linux/host1x.h
 F:     include/uapi/drm/tegra_drm.h
 F:     Documentation/devicetree/bindings/display/tegra/nvidia,tegra20-host1x.txt
 
+DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/mga/
+F:     include/uapi/drm/mga_drm.h
+
+DRM DRIVER FOR MGA G200 SERVER GRAPHICS CHIPS
+M:     Dave Airlie <airlied@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/mgag200/
+
+DRM DRIVER FOR RAGE 128 VIDEO CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/r128/
+F:     include/uapi/drm/r128_drm.h
+
 DRM DRIVERS FOR RENESAS
 M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 L:     dri-devel@lists.freedesktop.org
 L:     linux-renesas-soc@vger.kernel.org
-T:     git git://people.freedesktop.org/~airlied/linux
+T:     git git://linuxtv.org/pinchartl/fbdev
 S:     Supported
 F:     drivers/gpu/drm/rcar-du/
 F:     drivers/gpu/drm/shmobile/
 F:     include/linux/platform_data/shmob_drm.h
+F:     Documentation/devicetree/bindings/display/renesas,du.txt
+
+DRM DRIVER FOR QXL VIRTUAL GPU
+M:     Dave Airlie <airlied@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/qxl/
+F:     include/uapi/drm/qxl_drm.h
 
 DRM DRIVERS FOR ROCKCHIP
 M:     Mark Yao <mark.yao@rock-chips.com>
 L:     dri-devel@lists.freedesktop.org
 S:     Maintained
 F:     drivers/gpu/drm/rockchip/
-F:     Documentation/devicetree/bindings/display/rockchip*
+F:     Documentation/devicetree/bindings/display/rockchip/
+
+DRM DRIVER FOR SAVAGE VIDEO CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/savage/
+F:     include/uapi/drm/savage_drm.h
+
+DRM DRIVER FOR SIS VIDEO CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/sis/
+F:     include/uapi/drm/sis_drm.h
 
 DRM DRIVERS FOR STI
 M:     Benjamin Gaignard <benjamin.gaignard@linaro.org>
@@ -3967,14 +4062,43 @@ S:      Maintained
 F:     drivers/gpu/drm/sti
 F:     Documentation/devicetree/bindings/display/st,stih4xx.txt
 
+DRM DRIVER FOR TDFX VIDEO CARDS
+S:     Orphan / Obsolete
+F:     drivers/gpu/drm/tdfx/
+
+DRM DRIVER FOR USB DISPLAYLINK VIDEO ADAPTERS
+M:     Dave Airlie <airlied@redhat.com>
+S:     Odd Fixes
+F:     drivers/gpu/drm/udl/
+
 DRM DRIVERS FOR VIVANTE GPU IP
 M:     Lucas Stach <l.stach@pengutronix.de>
 R:     Russell King <linux+etnaviv@armlinux.org.uk>
 R:     Christian Gmeiner <christian.gmeiner@gmail.com>
 L:     dri-devel@lists.freedesktop.org
 S:     Maintained
-F:     drivers/gpu/drm/etnaviv
-F:     Documentation/devicetree/bindings/display/etnaviv
+F:     drivers/gpu/drm/etnaviv/
+F:     include/uapi/drm/etnaviv_drm.h
+F:     Documentation/devicetree/bindings/display/etnaviv/
+
+DRM DRIVER FOR VMWARE VIRTUAL GPU
+M:     "VMware Graphics" <linux-graphics-maintainer@vmware.com>
+M:     Sinclair Yeh <syeh@vmware.com>
+M:     Thomas Hellstrom <thellstrom@vmware.com>
+L:     dri-devel@lists.freedesktop.org
+T:     git git://people.freedesktop.org/~syeh/repos_linux
+T:     git git://people.freedesktop.org/~thomash/linux
+S:     Supported
+F:     drivers/gpu/drm/vmwgfx/
+F:     include/uapi/drm/vmwgfx_drm.h
+
+DRM DRIVERS FOR VC4
+M:     Eric Anholt <eric@anholt.net>
+T:     git git://github.com/anholt/linux
+S:     Supported
+F:     drivers/gpu/drm/vc4/
+F:     include/uapi/drm/vc4_drm.h
+F:     Documentation/devicetree/bindings/display/brcm,bcm-vc4.txt
 
 DSBR100 USB FM RADIO DRIVER
 M:     Alexey Klimov <klimov.linux@gmail.com>
@@ -7017,6 +7141,8 @@ MARVELL ARMADA DRM SUPPORT
 M:     Russell King <rmk+kernel@armlinux.org.uk>
 S:     Maintained
 F:     drivers/gpu/drm/armada/
+F:     include/uapi/drm/armada_drm.h
+F:     Documentation/devicetree/bindings/display/armada/
 
 MARVELL 88E6352 DSA support
 M:     Guenter Roeck <linux@roeck-us.net>
index 40bcecfc368706dfb600f7f82636ed4d0fd43d92..3e02f152edcb5eac50870720be8ffe626cb1b1b6 100644 (file)
        memory {
                #address-cells = <1>;
                #size-cells = <1>;
-               ranges = <0x00000000 0x80000000 0x40000000>;
+               ranges = <0x00000000 0x80000000 0x20000000>;
                device_type = "memory";
-               reg = <0x80000000 0x20000000>;  /* 512MiB */
+               reg = <0x80000000 0x1b000000>;  /* (512 - 32) MiB */
+       };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               /*
+                * We just move frame buffer area to the very end of
+                * available DDR. And even though in case of ARC770 there's
+                * no strict requirement for a frame-buffer to be in any
+                * particular location it allows us to use the same
+                * base board's DT node for ARC PGU as for ARc HS38.
+                */
+               frame_buffer: frame_buffer@9e000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0x9e000000 0x2000000>;
+                       no-map;
+               };
        };
 };
index cabe0deeb2d880d3fab56d419d95f9592b3536a2..378e455a94c4a86aa2af9a44a4d83c2cbbf771c2 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x20000000>;  /* 512MiB */
        };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               /*
+                * Move frame buffer out of IOC aperture (0x8z-0xAz).
+                */
+               frame_buffer: frame_buffer@be000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0xbe000000 0x2000000>;
+                       no-map;
+               };
+       };
 };
index ed1674b16e827285e2b0849a8531fafeb959197b..64c94b2860ab569d03d4672db417ad1e3307f86a 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x20000000>;  /* 512MiB */
        };
+
+       reserved-memory {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+               /*
+                * Move frame buffer out of IOC aperture (0x8z-0xAz).
+                */
+               frame_buffer: frame_buffer@be000000 {
+                       compatible = "shared-dma-pool";
+                       reg = <0xbe000000 0x2000000>;
+                       no-map;
+               };
+       };
 };
index 68c84a2fc1e4ffcda9501e2749bbd1f59ea91e46..d6c1bbc98ac3b40caa94e60420996081bdafe44c 100644 (file)
                                clock-frequency = <50000000>;
                                #clock-cells = <0>;
                        };
+
+                       pguclk: pguclk {
+                               #clock-cells = <0>;
+                               compatible = "fixed-clock";
+                               clock-frequency = <74440000>;
+                       };
                };
 
                ethernet@0x18000 {
                        clocks = <&i2cclk>;
                        interrupts = <16>;
 
+                       adv7511:adv7511@39{
+                               compatible="adi,adv7511";
+                               reg = <0x39>;
+                               interrupts = <23>;
+                               adi,input-depth = <8>;
+                               adi,input-colorspace = "rgb";
+                               adi,input-clock = "1x";
+                               adi,clock-delay = <0x03>;
+
+                               ports {
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       /* RGB/YUV input */
+                                       port@0 {
+                                               reg = <0>;
+                                               adv7511_input:endpoint {
+                                               remote-endpoint = <&pgu_output>;
+                                               };
+                                       };
+
+                                       /* HDMI output */
+                                       port@1 {
+                                               reg = <1>;
+                                               adv7511_output: endpoint {
+                                                       remote-endpoint = <&hdmi_connector_in>;
+                                               };
+                                       };
+                               };
+                       };
+
                        eeprom@0x54{
                                compatible = "24c01";
                                reg = <0x54>;
                        };
                };
 
+               hdmi0: connector {
+                       compatible = "hdmi-connector";
+                       type = "a";
+                       port {
+                               hdmi_connector_in: endpoint {
+                                       remote-endpoint = <&adv7511_output>;
+                               };
+                       };
+               };
+
                gpio0:gpio@13000 {
                        compatible = "snps,dw-apb-gpio";
                        reg = <0x13000 0x1000>;
                                reg = <2>;
                        };
                };
+
+               pgu@17000 {
+                       compatible = "snps,arcpgu";
+                       reg = <0x17000 0x400>;
+                       encoder-slave = <&adv7511>;
+                       clocks = <&pguclk>;
+                       clock-names = "pxlclk";
+                       memory-region = <&frame_buffer>;
+                       port {
+                               pgu_output: endpoint {
+                                       remote-endpoint = <&adv7511_input>;
+                               };
+                       };
+               };
        };
 };
index 1e25152dc0f6ccc5adb0ff18e21fccf86c854351..85dad29c08dc745028739efd45d2e6bfdf84b780 100644 (file)
 &dp {
        status = "okay";
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <4>;
index 0e2eb3f6b590b38dbcd561ce6006110af5110357..b7992b13c9de96d63720ec22eafd8319c79127e0 100644 (file)
@@ -80,8 +80,6 @@
 
 &dp {
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <4>;
index c9889b1f530af6782c52fd023f2a7f337ae3e7c5..ddfe1f558c105a1b962cce3ca69e0966021a01da 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&dp_hpd>;
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <2>;
-       samsung,hpd-gpio = <&gpx0 7 GPIO_ACTIVE_HIGH>;
+       hpd-gpios = <&gpx0 7 GPIO_ACTIVE_HIGH>;
 
        ports {
                port0 {
index 273d66282ebcaf0ac2f5e8e0aa47e6792dc54807..ac291f540812e813eebd67fc26e6a0e9b1e39ec0 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&dp_hpd_gpio>;
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <1>;
-       samsung,hpd-gpio = <&gpc3 0 GPIO_ACTIVE_HIGH>;
+       hpd-gpios = <&gpc3 0 GPIO_ACTIVE_HIGH>;
 };
 
 &ehci {
index 8811e170c2afb7c970a855bee8368ae450b5292c..f9d2e4f1a0e09598de0ad852bec24996b7373c56 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&dp_hpd_gpio>;
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x06>;
        samsung,lane-count = <2>;
-       samsung,hpd-gpio = <&gpx2 6 GPIO_ACTIVE_HIGH>;
+       hpd-gpios = <&gpx2 6 GPIO_ACTIVE_HIGH>;
 
        ports {
                port0 {
index 9b77940c920125dacf2e99f7aba62b19d54b5aaf..2e748d19322f29bdd91fbcc270c97a382234cbf1 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&dp_hpd>;
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <4>;
index f95992520a7749f6b562a8657de4d97ed83b5062..62ceb89e073f291ff93a133209066b7accb417b9 100644 (file)
        pinctrl-names = "default";
        pinctrl-0 = <&dp_hpd_gpio>;
        samsung,color-space = <0>;
-       samsung,dynamic-range = <0>;
-       samsung,ycbcr-coeff = <0>;
        samsung,color-depth = <1>;
        samsung,link-rate = <0x0a>;
        samsung,lane-count = <2>;
index 4ff1f92f89ca0cec08830a71104e38d928592583..698c7933d5826d82377264661d06b0884d865f24 100644 (file)
@@ -407,35 +407,6 @@ static inline int is_unrecognized_ioctl(int ret)
                ret == -ENOIOCTLCMD;
 }
 
-#ifdef CONFIG_FS_DAX
-bool blkdev_dax_capable(struct block_device *bdev)
-{
-       struct gendisk *disk = bdev->bd_disk;
-
-       if (!disk->fops->direct_access)
-               return false;
-
-       /*
-        * If the partition is not aligned on a page boundary, we can't
-        * do dax I/O to it.
-        */
-       if ((bdev->bd_part->start_sect % (PAGE_SIZE / 512))
-                       || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512)))
-               return false;
-
-       /*
-        * If the device has known bad blocks, force all I/O through the
-        * driver / page cache.
-        *
-        * TODO: support finer grained dax error handling
-        */
-       if (disk->bb && disk->bb->count)
-               return false;
-
-       return true;
-}
-#endif
-
 static int blkdev_flushbuf(struct block_device *bdev, fmode_t mode,
                unsigned cmd, unsigned long arg)
 {
@@ -598,9 +569,6 @@ int blkdev_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
        case BLKTRACESETUP:
        case BLKTRACETEARDOWN:
                return blk_trace_ioctl(bdev, cmd, argp);
-       case BLKDAXGET:
-               return put_int(arg, !!(bdev->bd_inode->i_flags & S_DAX));
-               break;
        case IOC_PR_REGISTER:
                return blkdev_pr_register(bdev, argp);
        case IOC_PR_RESERVE:
index 430f761b0d8d06800138483a442d706dc616e34a..e1e2066cecdb602e44f4a7103aa35827da9bbdd5 100644 (file)
@@ -192,6 +192,8 @@ source "drivers/android/Kconfig"
 
 source "drivers/nvdimm/Kconfig"
 
+source "drivers/dax/Kconfig"
+
 source "drivers/nvmem/Kconfig"
 
 source "drivers/hwtracing/stm/Kconfig"
index 8f5d076baeb0e83264c484e186e539c661660046..0b6f3d60193dcc2f2cdfaabe2f37e23a0b8f48a9 100644 (file)
@@ -66,6 +66,7 @@ obj-$(CONFIG_PARPORT)         += parport/
 obj-$(CONFIG_NVM)              += lightnvm/
 obj-y                          += base/ block/ misc/ mfd/ nfc/
 obj-$(CONFIG_LIBNVDIMM)                += nvdimm/
+obj-$(CONFIG_DEV_DAX)          += dax/
 obj-$(CONFIG_DMA_SHARED_BUFFER) += dma-buf/
 obj-$(CONFIG_NUBUS)            += nubus/
 obj-y                          += macintosh/
index 63cc9dbe4f3b4d1db7037fb4ca1df532b8dc5534..2215fc847fa90c572b40b426a5edc2a88f5792a2 100644 (file)
@@ -45,6 +45,11 @@ module_param(scrub_overflow_abort, uint, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(scrub_overflow_abort,
                "Number of times we overflow ARS results before abort");
 
+static bool disable_vendor_specific;
+module_param(disable_vendor_specific, bool, S_IRUGO);
+MODULE_PARM_DESC(disable_vendor_specific,
+               "Limit commands to the publicly specified set\n");
+
 static struct workqueue_struct *nfit_wq;
 
 struct nfit_table_prev {
@@ -171,33 +176,46 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
                unsigned int buf_len, int *cmd_rc)
 {
        struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc);
-       const struct nd_cmd_desc *desc = NULL;
        union acpi_object in_obj, in_buf, *out_obj;
+       const struct nd_cmd_desc *desc = NULL;
        struct device *dev = acpi_desc->dev;
+       struct nd_cmd_pkg *call_pkg = NULL;
        const char *cmd_name, *dimm_name;
-       unsigned long dsm_mask;
+       unsigned long cmd_mask, dsm_mask;
        acpi_handle handle;
+       unsigned int func;
        const u8 *uuid;
        u32 offset;
        int rc, i;
 
+       func = cmd;
+       if (cmd == ND_CMD_CALL) {
+               call_pkg = buf;
+               func = call_pkg->nd_command;
+       }
+
        if (nvdimm) {
                struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
                struct acpi_device *adev = nfit_mem->adev;
 
                if (!adev)
                        return -ENOTTY;
+               if (call_pkg && nfit_mem->family != call_pkg->nd_family)
+                       return -ENOTTY;
+
                dimm_name = nvdimm_name(nvdimm);
                cmd_name = nvdimm_cmd_name(cmd);
+               cmd_mask = nvdimm_cmd_mask(nvdimm);
                dsm_mask = nfit_mem->dsm_mask;
                desc = nd_cmd_dimm_desc(cmd);
-               uuid = to_nfit_uuid(NFIT_DEV_DIMM);
+               uuid = to_nfit_uuid(nfit_mem->family);
                handle = adev->handle;
        } else {
                struct acpi_device *adev = to_acpi_dev(acpi_desc);
 
                cmd_name = nvdimm_bus_cmd_name(cmd);
-               dsm_mask = nd_desc->dsm_mask;
+               cmd_mask = nd_desc->cmd_mask;
+               dsm_mask = cmd_mask;
                desc = nd_cmd_bus_desc(cmd);
                uuid = to_nfit_uuid(NFIT_DEV_BUS);
                handle = adev->handle;
@@ -207,7 +225,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
        if (!desc || (cmd && (desc->out_num + desc->in_num == 0)))
                return -ENOTTY;
 
-       if (!test_bit(cmd, &dsm_mask))
+       if (!test_bit(cmd, &cmd_mask) || !test_bit(func, &dsm_mask))
                return -ENOTTY;
 
        in_obj.type = ACPI_TYPE_PACKAGE;
@@ -222,21 +240,44 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
                in_buf.buffer.length += nd_cmd_in_size(nvdimm, cmd, desc,
                                i, buf);
 
+       if (call_pkg) {
+               /* skip over package wrapper */
+               in_buf.buffer.pointer = (void *) &call_pkg->nd_payload;
+               in_buf.buffer.length = call_pkg->nd_size_in;
+       }
+
        if (IS_ENABLED(CONFIG_ACPI_NFIT_DEBUG)) {
-               dev_dbg(dev, "%s:%s cmd: %s input length: %d\n", __func__,
-                               dimm_name, cmd_name, in_buf.buffer.length);
-               print_hex_dump_debug(cmd_name, DUMP_PREFIX_OFFSET, 4,
-                               4, in_buf.buffer.pointer, min_t(u32, 128,
-                                       in_buf.buffer.length), true);
+               dev_dbg(dev, "%s:%s cmd: %d: func: %d input length: %d\n",
+                               __func__, dimm_name, cmd, func,
+                               in_buf.buffer.length);
+               print_hex_dump_debug("nvdimm in  ", DUMP_PREFIX_OFFSET, 4, 4,
+                       in_buf.buffer.pointer,
+                       min_t(u32, 256, in_buf.buffer.length), true);
        }
 
-       out_obj = acpi_evaluate_dsm(handle, uuid, 1, cmd, &in_obj);
+       out_obj = acpi_evaluate_dsm(handle, uuid, 1, func, &in_obj);
        if (!out_obj) {
                dev_dbg(dev, "%s:%s _DSM failed cmd: %s\n", __func__, dimm_name,
                                cmd_name);
                return -EINVAL;
        }
 
+       if (call_pkg) {
+               call_pkg->nd_fw_size = out_obj->buffer.length;
+               memcpy(call_pkg->nd_payload + call_pkg->nd_size_in,
+                       out_obj->buffer.pointer,
+                       min(call_pkg->nd_fw_size, call_pkg->nd_size_out));
+
+               ACPI_FREE(out_obj);
+               /*
+                * Need to support FW function w/o known size in advance.
+                * Caller can determine required size based upon nd_fw_size.
+                * If we return an error (like elsewhere) then caller wouldn't
+                * be able to rely upon data returned to make calculation.
+                */
+               return 0;
+       }
+
        if (out_obj->package.type != ACPI_TYPE_BUFFER) {
                dev_dbg(dev, "%s:%s unexpected output object type cmd: %s type: %d\n",
                                __func__, dimm_name, cmd_name, out_obj->type);
@@ -658,6 +699,7 @@ static int nfit_mem_dcr_init(struct acpi_nfit_desc *acpi_desc,
                        if (!nfit_mem)
                                return -ENOMEM;
                        INIT_LIST_HEAD(&nfit_mem->list);
+                       nfit_mem->acpi_desc = acpi_desc;
                        list_add(&nfit_mem->list, &acpi_desc->dimms);
                }
 
@@ -819,7 +861,7 @@ static ssize_t vendor_show(struct device *dev,
 {
        struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
 
-       return sprintf(buf, "%#x\n", dcr->vendor_id);
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->vendor_id));
 }
 static DEVICE_ATTR_RO(vendor);
 
@@ -828,7 +870,7 @@ static ssize_t rev_id_show(struct device *dev,
 {
        struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
 
-       return sprintf(buf, "%#x\n", dcr->revision_id);
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->revision_id));
 }
 static DEVICE_ATTR_RO(rev_id);
 
@@ -837,28 +879,142 @@ static ssize_t device_show(struct device *dev,
 {
        struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
 
-       return sprintf(buf, "%#x\n", dcr->device_id);
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->device_id));
 }
 static DEVICE_ATTR_RO(device);
 
+static ssize_t subsystem_vendor_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
+
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->subsystem_vendor_id));
+}
+static DEVICE_ATTR_RO(subsystem_vendor);
+
+static ssize_t subsystem_rev_id_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
+
+       return sprintf(buf, "0x%04x\n",
+                       be16_to_cpu(dcr->subsystem_revision_id));
+}
+static DEVICE_ATTR_RO(subsystem_rev_id);
+
+static ssize_t subsystem_device_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
+
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->subsystem_device_id));
+}
+static DEVICE_ATTR_RO(subsystem_device);
+
+static int num_nvdimm_formats(struct nvdimm *nvdimm)
+{
+       struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
+       int formats = 0;
+
+       if (nfit_mem->memdev_pmem)
+               formats++;
+       if (nfit_mem->memdev_bdw)
+               formats++;
+       return formats;
+}
+
 static ssize_t format_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
        struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
 
-       return sprintf(buf, "%#x\n", dcr->code);
+       return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->code));
 }
 static DEVICE_ATTR_RO(format);
 
+static ssize_t format1_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       u32 handle;
+       ssize_t rc = -ENXIO;
+       struct nfit_mem *nfit_mem;
+       struct nfit_memdev *nfit_memdev;
+       struct acpi_nfit_desc *acpi_desc;
+       struct nvdimm *nvdimm = to_nvdimm(dev);
+       struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
+
+       nfit_mem = nvdimm_provider_data(nvdimm);
+       acpi_desc = nfit_mem->acpi_desc;
+       handle = to_nfit_memdev(dev)->device_handle;
+
+       /* assumes DIMMs have at most 2 published interface codes */
+       mutex_lock(&acpi_desc->init_mutex);
+       list_for_each_entry(nfit_memdev, &acpi_desc->memdevs, list) {
+               struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
+               struct nfit_dcr *nfit_dcr;
+
+               if (memdev->device_handle != handle)
+                       continue;
+
+               list_for_each_entry(nfit_dcr, &acpi_desc->dcrs, list) {
+                       if (nfit_dcr->dcr->region_index != memdev->region_index)
+                               continue;
+                       if (nfit_dcr->dcr->code == dcr->code)
+                               continue;
+                       rc = sprintf(buf, "%#x\n",
+                                       be16_to_cpu(nfit_dcr->dcr->code));
+                       break;
+               }
+               if (rc != ENXIO)
+                       break;
+       }
+       mutex_unlock(&acpi_desc->init_mutex);
+       return rc;
+}
+static DEVICE_ATTR_RO(format1);
+
+static ssize_t formats_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct nvdimm *nvdimm = to_nvdimm(dev);
+
+       return sprintf(buf, "%d\n", num_nvdimm_formats(nvdimm));
+}
+static DEVICE_ATTR_RO(formats);
+
 static ssize_t serial_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
        struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
 
-       return sprintf(buf, "%#x\n", dcr->serial_number);
+       return sprintf(buf, "0x%08x\n", be32_to_cpu(dcr->serial_number));
 }
 static DEVICE_ATTR_RO(serial);
 
+static ssize_t family_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct nvdimm *nvdimm = to_nvdimm(dev);
+       struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
+
+       if (nfit_mem->family < 0)
+               return -ENXIO;
+       return sprintf(buf, "%d\n", nfit_mem->family);
+}
+static DEVICE_ATTR_RO(family);
+
+static ssize_t dsm_mask_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct nvdimm *nvdimm = to_nvdimm(dev);
+       struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
+
+       if (nfit_mem->family < 0)
+               return -ENXIO;
+       return sprintf(buf, "%#lx\n", nfit_mem->dsm_mask);
+}
+static DEVICE_ATTR_RO(dsm_mask);
+
 static ssize_t flags_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
@@ -873,15 +1029,41 @@ static ssize_t flags_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(flags);
 
+static ssize_t id_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
+
+       if (dcr->valid_fields & ACPI_NFIT_CONTROL_MFG_INFO_VALID)
+               return sprintf(buf, "%04x-%02x-%04x-%08x\n",
+                               be16_to_cpu(dcr->vendor_id),
+                               dcr->manufacturing_location,
+                               be16_to_cpu(dcr->manufacturing_date),
+                               be32_to_cpu(dcr->serial_number));
+       else
+               return sprintf(buf, "%04x-%08x\n",
+                               be16_to_cpu(dcr->vendor_id),
+                               be32_to_cpu(dcr->serial_number));
+}
+static DEVICE_ATTR_RO(id);
+
 static struct attribute *acpi_nfit_dimm_attributes[] = {
        &dev_attr_handle.attr,
        &dev_attr_phys_id.attr,
        &dev_attr_vendor.attr,
        &dev_attr_device.attr,
+       &dev_attr_rev_id.attr,
+       &dev_attr_subsystem_vendor.attr,
+       &dev_attr_subsystem_device.attr,
+       &dev_attr_subsystem_rev_id.attr,
        &dev_attr_format.attr,
+       &dev_attr_formats.attr,
+       &dev_attr_format1.attr,
        &dev_attr_serial.attr,
-       &dev_attr_rev_id.attr,
        &dev_attr_flags.attr,
+       &dev_attr_id.attr,
+       &dev_attr_family.attr,
+       &dev_attr_dsm_mask.attr,
        NULL,
 };
 
@@ -889,11 +1071,13 @@ static umode_t acpi_nfit_dimm_attr_visible(struct kobject *kobj,
                struct attribute *a, int n)
 {
        struct device *dev = container_of(kobj, struct device, kobj);
+       struct nvdimm *nvdimm = to_nvdimm(dev);
 
-       if (to_nfit_dcr(dev))
-               return a->mode;
-       else
+       if (!to_nfit_dcr(dev))
                return 0;
+       if (a == &dev_attr_format1.attr && num_nvdimm_formats(nvdimm) <= 1)
+               return 0;
+       return a->mode;
 }
 
 static struct attribute_group acpi_nfit_dimm_attribute_group = {
@@ -926,10 +1110,13 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
 {
        struct acpi_device *adev, *adev_dimm;
        struct device *dev = acpi_desc->dev;
-       const u8 *uuid = to_nfit_uuid(NFIT_DEV_DIMM);
+       unsigned long dsm_mask;
+       const u8 *uuid;
        int i;
 
-       nfit_mem->dsm_mask = acpi_desc->dimm_dsm_force_en;
+       /* nfit test assumes 1:1 relationship between commands and dsms */
+       nfit_mem->dsm_mask = acpi_desc->dimm_cmd_force_en;
+       nfit_mem->family = NVDIMM_FAMILY_INTEL;
        adev = to_acpi_dev(acpi_desc);
        if (!adev)
                return 0;
@@ -942,7 +1129,35 @@ static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc,
                return force_enable_dimms ? 0 : -ENODEV;
        }
 
-       for (i = ND_CMD_SMART; i <= ND_CMD_VENDOR; i++)
+       /*
+        * Until standardization materializes we need to consider up to 3
+        * different command sets.  Note, that checking for function0 (bit0)
+        * tells us if any commands are reachable through this uuid.
+        */
+       for (i = NVDIMM_FAMILY_INTEL; i <= NVDIMM_FAMILY_HPE2; i++)
+               if (acpi_check_dsm(adev_dimm->handle, to_nfit_uuid(i), 1, 1))
+                       break;
+
+       /* limit the supported commands to those that are publicly documented */
+       nfit_mem->family = i;
+       if (nfit_mem->family == NVDIMM_FAMILY_INTEL) {
+               dsm_mask = 0x3fe;
+               if (disable_vendor_specific)
+                       dsm_mask &= ~(1 << ND_CMD_VENDOR);
+       } else if (nfit_mem->family == NVDIMM_FAMILY_HPE1)
+               dsm_mask = 0x1c3c76;
+       else if (nfit_mem->family == NVDIMM_FAMILY_HPE2) {
+               dsm_mask = 0x1fe;
+               if (disable_vendor_specific)
+                       dsm_mask &= ~(1 << 8);
+       } else {
+               dev_err(dev, "unknown dimm command family\n");
+               nfit_mem->family = -1;
+               return force_enable_dimms ? 0 : -ENODEV;
+       }
+
+       uuid = to_nfit_uuid(nfit_mem->family);
+       for_each_set_bit(i, &dsm_mask, BITS_PER_LONG)
                if (acpi_check_dsm(adev_dimm->handle, uuid, 1, 1ULL << i))
                        set_bit(i, &nfit_mem->dsm_mask);
 
@@ -955,8 +1170,8 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
        int dimm_count = 0;
 
        list_for_each_entry(nfit_mem, &acpi_desc->dimms, list) {
+               unsigned long flags = 0, cmd_mask;
                struct nvdimm *nvdimm;
-               unsigned long flags = 0;
                u32 device_handle;
                u16 mem_flags;
                int rc;
@@ -979,9 +1194,18 @@ static int acpi_nfit_register_dimms(struct acpi_nfit_desc *acpi_desc)
                if (rc)
                        continue;
 
+               /*
+                * TODO: provide translation for non-NVDIMM_FAMILY_INTEL
+                * devices (i.e. from nd_cmd to acpi_dsm) to standardize the
+                * userspace interface.
+                */
+               cmd_mask = 1UL << ND_CMD_CALL;
+               if (nfit_mem->family == NVDIMM_FAMILY_INTEL)
+                       cmd_mask |= nfit_mem->dsm_mask;
+
                nvdimm = nvdimm_create(acpi_desc->nvdimm_bus, nfit_mem,
                                acpi_nfit_dimm_attribute_groups,
-                               flags, &nfit_mem->dsm_mask);
+                               flags, cmd_mask);
                if (!nvdimm)
                        return -ENOMEM;
 
@@ -1010,14 +1234,14 @@ static void acpi_nfit_init_dsms(struct acpi_nfit_desc *acpi_desc)
        struct acpi_device *adev;
        int i;
 
-       nd_desc->dsm_mask = acpi_desc->bus_dsm_force_en;
+       nd_desc->cmd_mask = acpi_desc->bus_cmd_force_en;
        adev = to_acpi_dev(acpi_desc);
        if (!adev)
                return;
 
        for (i = ND_CMD_ARS_CAP; i <= ND_CMD_CLEAR_ERROR; i++)
                if (acpi_check_dsm(adev->handle, uuid, 1, 1ULL << i))
-                       set_bit(i, &nd_desc->dsm_mask);
+                       set_bit(i, &nd_desc->cmd_mask);
 }
 
 static ssize_t range_index_show(struct device *dev,
@@ -2309,7 +2533,7 @@ static int acpi_nfit_add(struct acpi_device *adev)
        acpi_size sz;
        int rc;
 
-       status = acpi_get_table_with_size("NFIT", 0, &tbl, &sz);
+       status = acpi_get_table_with_size(ACPI_SIG_NFIT, 0, &tbl, &sz);
        if (ACPI_FAILURE(status)) {
                /* This is ok, we could have an nvdimm hotplugged later */
                dev_dbg(dev, "failed to find NFIT at startup\n");
@@ -2466,6 +2690,8 @@ static __init int nfit_init(void)
        acpi_str_to_uuid(UUID_PERSISTENT_VIRTUAL_CD, nfit_uuid[NFIT_SPA_PCD]);
        acpi_str_to_uuid(UUID_NFIT_BUS, nfit_uuid[NFIT_DEV_BUS]);
        acpi_str_to_uuid(UUID_NFIT_DIMM, nfit_uuid[NFIT_DEV_DIMM]);
+       acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE1, nfit_uuid[NFIT_DEV_DIMM_N_HPE1]);
+       acpi_str_to_uuid(UUID_NFIT_DIMM_N_HPE2, nfit_uuid[NFIT_DEV_DIMM_N_HPE2]);
 
        nfit_wq = create_singlethread_workqueue("nfit");
        if (!nfit_wq)
index c75576b2d50ebaaff8768e5e1d54724bc54ef92c..11cb38348aef600cac3215985d98bc7559e37d63 100644 (file)
 #include <linux/acpi.h>
 #include <acpi/acuuid.h>
 
+/* ACPI 6.1 */
 #define UUID_NFIT_BUS "2f10e7a4-9e91-11e4-89d3-123b93f75cba"
+
+/* http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf */
 #define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
+
+/* https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/ */
+#define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
+#define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
+
 #define ACPI_NFIT_MEM_FAILED_MASK (ACPI_NFIT_MEM_SAVE_FAILED \
                | ACPI_NFIT_MEM_RESTORE_FAILED | ACPI_NFIT_MEM_FLUSH_FAILED \
                | ACPI_NFIT_MEM_NOT_ARMED)
 
 enum nfit_uuids {
+       /* for simplicity alias the uuid index with the family id */
+       NFIT_DEV_DIMM = NVDIMM_FAMILY_INTEL,
+       NFIT_DEV_DIMM_N_HPE1 = NVDIMM_FAMILY_HPE1,
+       NFIT_DEV_DIMM_N_HPE2 = NVDIMM_FAMILY_HPE2,
        NFIT_SPA_VOLATILE,
        NFIT_SPA_PM,
        NFIT_SPA_DCR,
@@ -37,15 +49,16 @@ enum nfit_uuids {
        NFIT_SPA_PDISK,
        NFIT_SPA_PCD,
        NFIT_DEV_BUS,
-       NFIT_DEV_DIMM,
        NFIT_UUID_MAX,
 };
 
-enum nfit_fic {
-       NFIT_FIC_BYTE = 0x101, /* byte-addressable energy backed */
-       NFIT_FIC_BLK = 0x201, /* block-addressable non-energy backed */
-       NFIT_FIC_BYTEN = 0x301, /* byte-addressable non-energy backed */
-};
+/*
+ * Region format interface codes are stored as an array of bytes in the
+ * NFIT DIMM Control Region structure
+ */
+#define NFIT_FIC_BYTE cpu_to_be16(0x101) /* byte-addressable energy backed */
+#define NFIT_FIC_BLK cpu_to_be16(0x201) /* block-addressable non-energy backed */
+#define NFIT_FIC_BYTEN cpu_to_be16(0x301) /* byte-addressable non-energy backed */
 
 enum {
        NFIT_BLK_READ_FLUSH = 1,
@@ -109,7 +122,9 @@ struct nfit_mem {
        struct nfit_flush *nfit_flush;
        struct list_head list;
        struct acpi_device *adev;
+       struct acpi_nfit_desc *acpi_desc;
        unsigned long dsm_mask;
+       int family;
 };
 
 struct acpi_nfit_desc {
@@ -132,8 +147,8 @@ struct acpi_nfit_desc {
        size_t ars_status_size;
        struct work_struct work;
        unsigned int cancel:1;
-       unsigned long dimm_dsm_force_en;
-       unsigned long bus_dsm_force_en;
+       unsigned long dimm_cmd_force_en;
+       unsigned long bus_cmd_force_en;
        int (*blk_do_io)(struct nd_blk_region *ndbr, resource_size_t dpa,
                        void *iobuf, u64 len, int rw);
 };
index ac832bf6f8c9ed66752d2d7de419710c5e4890a5..22c09952e177918fdefa400b02a51f483c6fb880 100644 (file)
@@ -625,7 +625,7 @@ acpi_status acpi_evaluate_lck(acpi_handle handle, int lock)
  * some old BIOSes do expect a buffer or an integer etc.
  */
 union acpi_object *
-acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid, int rev, int func,
+acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 func,
                  union acpi_object *argv4)
 {
        acpi_status ret;
@@ -674,7 +674,7 @@ EXPORT_SYMBOL(acpi_evaluate_dsm);
  * functions. Currently only support 64 functions at maximum, should be
  * enough for now.
  */
-bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
+bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs)
 {
        int i;
        u64 mask = 0;
index 227e356403d9558346a6ef0b99b24eac50a3fd4f..10c986018a085cb3dfdda9b76d0e08b2076007dd 100644 (file)
@@ -61,7 +61,6 @@ static const struct mtk_fixed_factor top_divs[] __initconst = {
        FACTOR(CLK_TOP_CLKRTC_INT, "clkrtc_int", "clk26m", 1, 793),
        FACTOR(CLK_TOP_FPC, "fpc_ck", "clk26m", 1, 1),
 
-       FACTOR(CLK_TOP_HDMITX_DIG_CTS, "hdmitx_dig_cts", "tvdpll_445p5m", 1, 3),
        FACTOR(CLK_TOP_HDMITXPLL_D2, "hdmitxpll_d2", "hdmitx_dig_cts", 1, 2),
        FACTOR(CLK_TOP_HDMITXPLL_D3, "hdmitxpll_d3", "hdmitx_dig_cts", 1, 3),
 
@@ -558,7 +557,11 @@ static const struct mtk_composite top_muxes[] __initconst = {
        MUX_GATE(CLK_TOP_ATB_SEL, "atb_sel", atb_parents, 0x0090, 16, 2, 23),
        MUX_GATE(CLK_TOP_VENC_LT_SEL, "venclt_sel", venc_lt_parents, 0x0090, 24, 4, 31),
        /* CLK_CFG_6 */
-       MUX_GATE(CLK_TOP_DPI0_SEL, "dpi0_sel", dpi0_parents, 0x00a0, 0, 3, 7),
+       /*
+        * The dpi0_sel clock should not propagate rate changes to its parent
+        * clock so the dpi driver can have full control over PLL and divider.
+        */
+       MUX_GATE_FLAGS(CLK_TOP_DPI0_SEL, "dpi0_sel", dpi0_parents, 0x00a0, 0, 3, 7, 0),
        MUX_GATE(CLK_TOP_IRDA_SEL, "irda_sel", irda_parents, 0x00a0, 8, 2, 15),
        MUX_GATE(CLK_TOP_CCI400_SEL, "cci400_sel", cci400_parents, 0x00a0, 16, 3, 23),
        MUX_GATE(CLK_TOP_AUD_1_SEL, "aud_1_sel", aud_1_parents, 0x00a0, 24, 2, 31),
@@ -1091,6 +1094,11 @@ static void __init mtk_apmixedsys_init(struct device_node *node)
                clk_data->clks[cku->id] = clk;
        }
 
+       clk = clk_register_divider(NULL, "hdmi_ref", "tvdpll_594m", 0,
+                                  base + 0x40, 16, 3, CLK_DIVIDER_POWER_OF_TWO,
+                                  NULL);
+       clk_data->clks[CLK_APMIXED_HDMI_REF] = clk;
+
        r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
        if (r)
                pr_err("%s(): could not register clock provider: %d\n",
index 32d2e455eb3fbd0bb3e59434af25d4c0d26f0158..9f24fcfa304f9c975b63af33e6597722a403afbd 100644 (file)
@@ -83,7 +83,11 @@ struct mtk_composite {
        signed char num_parents;
 };
 
-#define MUX_GATE(_id, _name, _parents, _reg, _shift, _width, _gate) {  \
+/*
+ * In case the rate change propagation to parent clocks is undesirable,
+ * this macro allows to specify the clock flags manually.
+ */
+#define MUX_GATE_FLAGS(_id, _name, _parents, _reg, _shift, _width, _gate, _flags) {    \
                .id = _id,                                              \
                .name = _name,                                          \
                .mux_reg = _reg,                                        \
@@ -94,9 +98,16 @@ struct mtk_composite {
                .divider_shift = -1,                                    \
                .parent_names = _parents,                               \
                .num_parents = ARRAY_SIZE(_parents),                    \
-               .flags = CLK_SET_RATE_PARENT,                           \
+               .flags = _flags,                                        \
        }
 
+/*
+ * Unless necessary, all MUX_GATE clocks propagate rate changes to their
+ * parent clock by default.
+ */
+#define MUX_GATE(_id, _name, _parents, _reg, _shift, _width, _gate)    \
+       MUX_GATE_FLAGS(_id, _name, _parents, _reg, _shift, _width, _gate, CLK_SET_RATE_PARENT)
+
 #define MUX(_id, _name, _parents, _reg, _shift, _width) {              \
                .id = _id,                                              \
                .name = _name,                                          \
diff --git a/drivers/dax/Kconfig b/drivers/dax/Kconfig
new file mode 100644 (file)
index 0000000..cedab75
--- /dev/null
@@ -0,0 +1,26 @@
+menuconfig DEV_DAX
+       tristate "DAX: direct access to differentiated memory"
+       default m if NVDIMM_DAX
+       depends on TRANSPARENT_HUGEPAGE
+       help
+         Support raw access to differentiated (persistence, bandwidth,
+         latency...) memory via an mmap(2) capable character
+         device.  Platform firmware or a device driver may identify a
+         platform memory resource that is differentiated from the
+         baseline memory pool.  Mappings of a /dev/daxX.Y device impose
+         restrictions that make the mapping behavior deterministic.
+
+if DEV_DAX
+
+config DEV_DAX_PMEM
+       tristate "PMEM DAX: direct access to persistent memory"
+       depends on NVDIMM_DAX
+       default DEV_DAX
+       help
+         Support raw access to persistent memory.  Note that this
+         driver consumes memory ranges allocated and exported by the
+         libnvdimm sub-system.
+
+         Say Y if unsure
+
+endif
diff --git a/drivers/dax/Makefile b/drivers/dax/Makefile
new file mode 100644 (file)
index 0000000..27c54e3
--- /dev/null
@@ -0,0 +1,4 @@
+obj-$(CONFIG_DEV_DAX) += dax.o
+obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o
+
+dax_pmem-y := pmem.o
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
new file mode 100644 (file)
index 0000000..b891a12
--- /dev/null
@@ -0,0 +1,575 @@
+/*
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/pagemap.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/pfn_t.h>
+#include <linux/slab.h>
+#include <linux/dax.h>
+#include <linux/fs.h>
+#include <linux/mm.h>
+
+static int dax_major;
+static struct class *dax_class;
+static DEFINE_IDA(dax_minor_ida);
+
+/**
+ * struct dax_region - mapping infrastructure for dax devices
+ * @id: kernel-wide unique region for a memory range
+ * @base: linear address corresponding to @res
+ * @kref: to pin while other agents have a need to do lookups
+ * @dev: parent device backing this region
+ * @align: allocation and mapping alignment for child dax devices
+ * @res: physical address range of the region
+ * @pfn_flags: identify whether the pfns are paged back or not
+ */
+struct dax_region {
+       int id;
+       struct ida ida;
+       void *base;
+       struct kref kref;
+       struct device *dev;
+       unsigned int align;
+       struct resource res;
+       unsigned long pfn_flags;
+};
+
+/**
+ * struct dax_dev - subdivision of a dax region
+ * @region - parent region
+ * @dev - device backing the character device
+ * @kref - enable this data to be tracked in filp->private_data
+ * @alive - !alive + rcu grace period == no new mappings can be established
+ * @id - child id in the region
+ * @num_resources - number of physical address extents in this device
+ * @res - array of physical address ranges
+ */
+struct dax_dev {
+       struct dax_region *region;
+       struct device *dev;
+       struct kref kref;
+       bool alive;
+       int id;
+       int num_resources;
+       struct resource res[0];
+};
+
+static void dax_region_free(struct kref *kref)
+{
+       struct dax_region *dax_region;
+
+       dax_region = container_of(kref, struct dax_region, kref);
+       kfree(dax_region);
+}
+
+void dax_region_put(struct dax_region *dax_region)
+{
+       kref_put(&dax_region->kref, dax_region_free);
+}
+EXPORT_SYMBOL_GPL(dax_region_put);
+
+static void dax_dev_free(struct kref *kref)
+{
+       struct dax_dev *dax_dev;
+
+       dax_dev = container_of(kref, struct dax_dev, kref);
+       dax_region_put(dax_dev->region);
+       kfree(dax_dev);
+}
+
+static void dax_dev_put(struct dax_dev *dax_dev)
+{
+       kref_put(&dax_dev->kref, dax_dev_free);
+}
+
+struct dax_region *alloc_dax_region(struct device *parent, int region_id,
+               struct resource *res, unsigned int align, void *addr,
+               unsigned long pfn_flags)
+{
+       struct dax_region *dax_region;
+
+       dax_region = kzalloc(sizeof(*dax_region), GFP_KERNEL);
+
+       if (!dax_region)
+               return NULL;
+
+       memcpy(&dax_region->res, res, sizeof(*res));
+       dax_region->pfn_flags = pfn_flags;
+       kref_init(&dax_region->kref);
+       dax_region->id = region_id;
+       ida_init(&dax_region->ida);
+       dax_region->align = align;
+       dax_region->dev = parent;
+       dax_region->base = addr;
+
+       return dax_region;
+}
+EXPORT_SYMBOL_GPL(alloc_dax_region);
+
+static ssize_t size_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct dax_dev *dax_dev = dev_get_drvdata(dev);
+       unsigned long long size = 0;
+       int i;
+
+       for (i = 0; i < dax_dev->num_resources; i++)
+               size += resource_size(&dax_dev->res[i]);
+
+       return sprintf(buf, "%llu\n", size);
+}
+static DEVICE_ATTR_RO(size);
+
+static struct attribute *dax_device_attributes[] = {
+       &dev_attr_size.attr,
+       NULL,
+};
+
+static const struct attribute_group dax_device_attribute_group = {
+       .attrs = dax_device_attributes,
+};
+
+static const struct attribute_group *dax_attribute_groups[] = {
+       &dax_device_attribute_group,
+       NULL,
+};
+
+static void unregister_dax_dev(void *_dev)
+{
+       struct device *dev = _dev;
+       struct dax_dev *dax_dev = dev_get_drvdata(dev);
+       struct dax_region *dax_region = dax_dev->region;
+
+       dev_dbg(dev, "%s\n", __func__);
+
+       /*
+        * Note, rcu is not protecting the liveness of dax_dev, rcu is
+        * ensuring that any fault handlers that might have seen
+        * dax_dev->alive == true, have completed.  Any fault handlers
+        * that start after synchronize_rcu() has started will abort
+        * upon seeing dax_dev->alive == false.
+        */
+       dax_dev->alive = false;
+       synchronize_rcu();
+
+       get_device(dev);
+       device_unregister(dev);
+       ida_simple_remove(&dax_region->ida, dax_dev->id);
+       ida_simple_remove(&dax_minor_ida, MINOR(dev->devt));
+       put_device(dev);
+       dax_dev_put(dax_dev);
+}
+
+int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res,
+               int count)
+{
+       struct device *parent = dax_region->dev;
+       struct dax_dev *dax_dev;
+       struct device *dev;
+       int rc, minor;
+       dev_t dev_t;
+
+       dax_dev = kzalloc(sizeof(*dax_dev) + sizeof(*res) * count, GFP_KERNEL);
+       if (!dax_dev)
+               return -ENOMEM;
+       memcpy(dax_dev->res, res, sizeof(*res) * count);
+       dax_dev->num_resources = count;
+       kref_init(&dax_dev->kref);
+       dax_dev->alive = true;
+       dax_dev->region = dax_region;
+       kref_get(&dax_region->kref);
+
+       dax_dev->id = ida_simple_get(&dax_region->ida, 0, 0, GFP_KERNEL);
+       if (dax_dev->id < 0) {
+               rc = dax_dev->id;
+               goto err_id;
+       }
+
+       minor = ida_simple_get(&dax_minor_ida, 0, 0, GFP_KERNEL);
+       if (minor < 0) {
+               rc = minor;
+               goto err_minor;
+       }
+
+       dev_t = MKDEV(dax_major, minor);
+       dev = device_create_with_groups(dax_class, parent, dev_t, dax_dev,
+                       dax_attribute_groups, "dax%d.%d", dax_region->id,
+                       dax_dev->id);
+       if (IS_ERR(dev)) {
+               rc = PTR_ERR(dev);
+               goto err_create;
+       }
+       dax_dev->dev = dev;
+
+       rc = devm_add_action(dax_region->dev, unregister_dax_dev, dev);
+       if (rc) {
+               unregister_dax_dev(dev);
+               return rc;
+       }
+
+       return 0;
+
+ err_create:
+       ida_simple_remove(&dax_minor_ida, minor);
+ err_minor:
+       ida_simple_remove(&dax_region->ida, dax_dev->id);
+ err_id:
+       dax_dev_put(dax_dev);
+
+       return rc;
+}
+EXPORT_SYMBOL_GPL(devm_create_dax_dev);
+
+/* return an unmapped area aligned to the dax region specified alignment */
+static unsigned long dax_dev_get_unmapped_area(struct file *filp,
+               unsigned long addr, unsigned long len, unsigned long pgoff,
+               unsigned long flags)
+{
+       unsigned long off, off_end, off_align, len_align, addr_align, align;
+       struct dax_dev *dax_dev = filp ? filp->private_data : NULL;
+       struct dax_region *dax_region;
+
+       if (!dax_dev || addr)
+               goto out;
+
+       dax_region = dax_dev->region;
+       align = dax_region->align;
+       off = pgoff << PAGE_SHIFT;
+       off_end = off + len;
+       off_align = round_up(off, align);
+
+       if ((off_end <= off_align) || ((off_end - off_align) < align))
+               goto out;
+
+       len_align = len + align;
+       if ((off + len_align) < off)
+               goto out;
+
+       addr_align = current->mm->get_unmapped_area(filp, addr, len_align,
+                       pgoff, flags);
+       if (!IS_ERR_VALUE(addr_align)) {
+               addr_align += (off - addr_align) & (align - 1);
+               return addr_align;
+       }
+ out:
+       return current->mm->get_unmapped_area(filp, addr, len, pgoff, flags);
+}
+
+static int __match_devt(struct device *dev, const void *data)
+{
+       const dev_t *devt = data;
+
+       return dev->devt == *devt;
+}
+
+static struct device *dax_dev_find(dev_t dev_t)
+{
+       return class_find_device(dax_class, NULL, &dev_t, __match_devt);
+}
+
+static int dax_dev_open(struct inode *inode, struct file *filp)
+{
+       struct dax_dev *dax_dev = NULL;
+       struct device *dev;
+
+       dev = dax_dev_find(inode->i_rdev);
+       if (!dev)
+               return -ENXIO;
+
+       device_lock(dev);
+       dax_dev = dev_get_drvdata(dev);
+       if (dax_dev) {
+               dev_dbg(dev, "%s\n", __func__);
+               filp->private_data = dax_dev;
+               kref_get(&dax_dev->kref);
+               inode->i_flags = S_DAX;
+       }
+       device_unlock(dev);
+
+       if (!dax_dev) {
+               put_device(dev);
+               return -ENXIO;
+       }
+       return 0;
+}
+
+static int dax_dev_release(struct inode *inode, struct file *filp)
+{
+       struct dax_dev *dax_dev = filp->private_data;
+       struct device *dev = dax_dev->dev;
+
+       dev_dbg(dax_dev->dev, "%s\n", __func__);
+       dax_dev_put(dax_dev);
+       put_device(dev);
+
+       return 0;
+}
+
+static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma,
+               const char *func)
+{
+       struct dax_region *dax_region = dax_dev->region;
+       struct device *dev = dax_dev->dev;
+       unsigned long mask;
+
+       if (!dax_dev->alive)
+               return -ENXIO;
+
+       /* prevent private / writable mappings from being established */
+       if ((vma->vm_flags & (VM_NORESERVE|VM_SHARED|VM_WRITE)) == VM_WRITE) {
+               dev_info(dev, "%s: %s: fail, attempted private mapping\n",
+                               current->comm, func);
+               return -EINVAL;
+       }
+
+       mask = dax_region->align - 1;
+       if (vma->vm_start & mask || vma->vm_end & mask) {
+               dev_info(dev, "%s: %s: fail, unaligned vma (%#lx - %#lx, %#lx)\n",
+                               current->comm, func, vma->vm_start, vma->vm_end,
+                               mask);
+               return -EINVAL;
+       }
+
+       if ((dax_region->pfn_flags & (PFN_DEV|PFN_MAP)) == PFN_DEV
+                       && (vma->vm_flags & VM_DONTCOPY) == 0) {
+               dev_info(dev, "%s: %s: fail, dax range requires MADV_DONTFORK\n",
+                               current->comm, func);
+               return -EINVAL;
+       }
+
+       if (!vma_is_dax(vma)) {
+               dev_info(dev, "%s: %s: fail, vma is not DAX capable\n",
+                               current->comm, func);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static phys_addr_t pgoff_to_phys(struct dax_dev *dax_dev, pgoff_t pgoff,
+               unsigned long size)
+{
+       struct resource *res;
+       phys_addr_t phys;
+       int i;
+
+       for (i = 0; i < dax_dev->num_resources; i++) {
+               res = &dax_dev->res[i];
+               phys = pgoff * PAGE_SIZE + res->start;
+               if (phys >= res->start && phys <= res->end)
+                       break;
+               pgoff -= PHYS_PFN(resource_size(res));
+       }
+
+       if (i < dax_dev->num_resources) {
+               res = &dax_dev->res[i];
+               if (phys + size - 1 <= res->end)
+                       return phys;
+       }
+
+       return -1;
+}
+
+static int __dax_dev_fault(struct dax_dev *dax_dev, struct vm_area_struct *vma,
+               struct vm_fault *vmf)
+{
+       unsigned long vaddr = (unsigned long) vmf->virtual_address;
+       struct device *dev = dax_dev->dev;
+       struct dax_region *dax_region;
+       int rc = VM_FAULT_SIGBUS;
+       phys_addr_t phys;
+       pfn_t pfn;
+
+       if (check_vma(dax_dev, vma, __func__))
+               return VM_FAULT_SIGBUS;
+
+       dax_region = dax_dev->region;
+       if (dax_region->align > PAGE_SIZE) {
+               dev_dbg(dev, "%s: alignment > fault size\n", __func__);
+               return VM_FAULT_SIGBUS;
+       }
+
+       phys = pgoff_to_phys(dax_dev, vmf->pgoff, PAGE_SIZE);
+       if (phys == -1) {
+               dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__,
+                               vmf->pgoff);
+               return VM_FAULT_SIGBUS;
+       }
+
+       pfn = phys_to_pfn_t(phys, dax_region->pfn_flags);
+
+       rc = vm_insert_mixed(vma, vaddr, pfn);
+
+       if (rc == -ENOMEM)
+               return VM_FAULT_OOM;
+       if (rc < 0 && rc != -EBUSY)
+               return VM_FAULT_SIGBUS;
+
+       return VM_FAULT_NOPAGE;
+}
+
+static int dax_dev_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
+{
+       int rc;
+       struct file *filp = vma->vm_file;
+       struct dax_dev *dax_dev = filp->private_data;
+
+       dev_dbg(dax_dev->dev, "%s: %s: %s (%#lx - %#lx)\n", __func__,
+                       current->comm, (vmf->flags & FAULT_FLAG_WRITE)
+                       ? "write" : "read", vma->vm_start, vma->vm_end);
+       rcu_read_lock();
+       rc = __dax_dev_fault(dax_dev, vma, vmf);
+       rcu_read_unlock();
+
+       return rc;
+}
+
+static int __dax_dev_pmd_fault(struct dax_dev *dax_dev,
+               struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd,
+               unsigned int flags)
+{
+       unsigned long pmd_addr = addr & PMD_MASK;
+       struct device *dev = dax_dev->dev;
+       struct dax_region *dax_region;
+       phys_addr_t phys;
+       pgoff_t pgoff;
+       pfn_t pfn;
+
+       if (check_vma(dax_dev, vma, __func__))
+               return VM_FAULT_SIGBUS;
+
+       dax_region = dax_dev->region;
+       if (dax_region->align > PMD_SIZE) {
+               dev_dbg(dev, "%s: alignment > fault size\n", __func__);
+               return VM_FAULT_SIGBUS;
+       }
+
+       /* dax pmd mappings require pfn_t_devmap() */
+       if ((dax_region->pfn_flags & (PFN_DEV|PFN_MAP)) != (PFN_DEV|PFN_MAP)) {
+               dev_dbg(dev, "%s: alignment > fault size\n", __func__);
+               return VM_FAULT_SIGBUS;
+       }
+
+       pgoff = linear_page_index(vma, pmd_addr);
+       phys = pgoff_to_phys(dax_dev, pgoff, PAGE_SIZE);
+       if (phys == -1) {
+               dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__,
+                               pgoff);
+               return VM_FAULT_SIGBUS;
+       }
+
+       pfn = phys_to_pfn_t(phys, dax_region->pfn_flags);
+
+       return vmf_insert_pfn_pmd(vma, addr, pmd, pfn,
+                       flags & FAULT_FLAG_WRITE);
+}
+
+static int dax_dev_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
+               pmd_t *pmd, unsigned int flags)
+{
+       int rc;
+       struct file *filp = vma->vm_file;
+       struct dax_dev *dax_dev = filp->private_data;
+
+       dev_dbg(dax_dev->dev, "%s: %s: %s (%#lx - %#lx)\n", __func__,
+                       current->comm, (flags & FAULT_FLAG_WRITE)
+                       ? "write" : "read", vma->vm_start, vma->vm_end);
+
+       rcu_read_lock();
+       rc = __dax_dev_pmd_fault(dax_dev, vma, addr, pmd, flags);
+       rcu_read_unlock();
+
+       return rc;
+}
+
+static void dax_dev_vm_open(struct vm_area_struct *vma)
+{
+       struct file *filp = vma->vm_file;
+       struct dax_dev *dax_dev = filp->private_data;
+
+       dev_dbg(dax_dev->dev, "%s\n", __func__);
+       kref_get(&dax_dev->kref);
+}
+
+static void dax_dev_vm_close(struct vm_area_struct *vma)
+{
+       struct file *filp = vma->vm_file;
+       struct dax_dev *dax_dev = filp->private_data;
+
+       dev_dbg(dax_dev->dev, "%s\n", __func__);
+       dax_dev_put(dax_dev);
+}
+
+static const struct vm_operations_struct dax_dev_vm_ops = {
+       .fault = dax_dev_fault,
+       .pmd_fault = dax_dev_pmd_fault,
+       .open = dax_dev_vm_open,
+       .close = dax_dev_vm_close,
+};
+
+static int dax_dev_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       struct dax_dev *dax_dev = filp->private_data;
+       int rc;
+
+       dev_dbg(dax_dev->dev, "%s\n", __func__);
+
+       rc = check_vma(dax_dev, vma, __func__);
+       if (rc)
+               return rc;
+
+       kref_get(&dax_dev->kref);
+       vma->vm_ops = &dax_dev_vm_ops;
+       vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE;
+       return 0;
+
+}
+
+static const struct file_operations dax_fops = {
+       .llseek = noop_llseek,
+       .owner = THIS_MODULE,
+       .open = dax_dev_open,
+       .release = dax_dev_release,
+       .get_unmapped_area = dax_dev_get_unmapped_area,
+       .mmap = dax_dev_mmap,
+};
+
+static int __init dax_init(void)
+{
+       int rc;
+
+       rc = register_chrdev(0, "dax", &dax_fops);
+       if (rc < 0)
+               return rc;
+       dax_major = rc;
+
+       dax_class = class_create(THIS_MODULE, "dax");
+       if (IS_ERR(dax_class)) {
+               unregister_chrdev(dax_major, "dax");
+               return PTR_ERR(dax_class);
+       }
+
+       return 0;
+}
+
+static void __exit dax_exit(void)
+{
+       class_destroy(dax_class);
+       unregister_chrdev(dax_major, "dax");
+       ida_destroy(&dax_minor_ida);
+}
+
+MODULE_AUTHOR("Intel Corporation");
+MODULE_LICENSE("GPL v2");
+subsys_initcall(dax_init);
+module_exit(dax_exit);
diff --git a/drivers/dax/dax.h b/drivers/dax/dax.h
new file mode 100644 (file)
index 0000000..d8b8f1f
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#ifndef __DAX_H__
+#define __DAX_H__
+struct device;
+struct resource;
+struct dax_region;
+void dax_region_put(struct dax_region *dax_region);
+struct dax_region *alloc_dax_region(struct device *parent,
+               int region_id, struct resource *res, unsigned int align,
+               void *addr, unsigned long flags);
+int devm_create_dax_dev(struct dax_region *dax_region, struct resource *res,
+               int count);
+#endif /* __DAX_H__ */
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
new file mode 100644 (file)
index 0000000..55d510e
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * Copyright(c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/percpu-refcount.h>
+#include <linux/memremap.h>
+#include <linux/module.h>
+#include <linux/pfn_t.h>
+#include "../nvdimm/pfn.h"
+#include "../nvdimm/nd.h"
+#include "dax.h"
+
+struct dax_pmem {
+       struct device *dev;
+       struct percpu_ref ref;
+       struct completion cmp;
+};
+
+struct dax_pmem *to_dax_pmem(struct percpu_ref *ref)
+{
+       return container_of(ref, struct dax_pmem, ref);
+}
+
+static void dax_pmem_percpu_release(struct percpu_ref *ref)
+{
+       struct dax_pmem *dax_pmem = to_dax_pmem(ref);
+
+       dev_dbg(dax_pmem->dev, "%s\n", __func__);
+       complete(&dax_pmem->cmp);
+}
+
+static void dax_pmem_percpu_exit(void *data)
+{
+       struct percpu_ref *ref = data;
+       struct dax_pmem *dax_pmem = to_dax_pmem(ref);
+
+       dev_dbg(dax_pmem->dev, "%s\n", __func__);
+       percpu_ref_exit(ref);
+       wait_for_completion(&dax_pmem->cmp);
+}
+
+static void dax_pmem_percpu_kill(void *data)
+{
+       struct percpu_ref *ref = data;
+       struct dax_pmem *dax_pmem = to_dax_pmem(ref);
+
+       dev_dbg(dax_pmem->dev, "%s\n", __func__);
+       percpu_ref_kill(ref);
+}
+
+static int dax_pmem_probe(struct device *dev)
+{
+       int rc;
+       void *addr;
+       struct resource res;
+       struct nd_pfn_sb *pfn_sb;
+       struct dax_pmem *dax_pmem;
+       struct nd_region *nd_region;
+       struct nd_namespace_io *nsio;
+       struct dax_region *dax_region;
+       struct nd_namespace_common *ndns;
+       struct nd_dax *nd_dax = to_nd_dax(dev);
+       struct nd_pfn *nd_pfn = &nd_dax->nd_pfn;
+       struct vmem_altmap __altmap, *altmap = NULL;
+
+       ndns = nvdimm_namespace_common_probe(dev);
+       if (IS_ERR(ndns))
+               return PTR_ERR(ndns);
+       nsio = to_nd_namespace_io(&ndns->dev);
+
+       /* parse the 'pfn' info block via ->rw_bytes */
+       devm_nsio_enable(dev, nsio);
+       altmap = nvdimm_setup_pfn(nd_pfn, &res, &__altmap);
+       if (IS_ERR(altmap))
+               return PTR_ERR(altmap);
+       devm_nsio_disable(dev, nsio);
+
+       pfn_sb = nd_pfn->pfn_sb;
+
+       if (!devm_request_mem_region(dev, nsio->res.start,
+                               resource_size(&nsio->res), dev_name(dev))) {
+               dev_warn(dev, "could not reserve region %pR\n", &nsio->res);
+               return -EBUSY;
+       }
+
+       dax_pmem = devm_kzalloc(dev, sizeof(*dax_pmem), GFP_KERNEL);
+       if (!dax_pmem)
+               return -ENOMEM;
+
+       dax_pmem->dev = dev;
+       init_completion(&dax_pmem->cmp);
+       rc = percpu_ref_init(&dax_pmem->ref, dax_pmem_percpu_release, 0,
+                       GFP_KERNEL);
+       if (rc)
+               return rc;
+
+       rc = devm_add_action(dev, dax_pmem_percpu_exit, &dax_pmem->ref);
+       if (rc) {
+               dax_pmem_percpu_exit(&dax_pmem->ref);
+               return rc;
+       }
+
+       addr = devm_memremap_pages(dev, &res, &dax_pmem->ref, altmap);
+       if (IS_ERR(addr))
+               return PTR_ERR(addr);
+
+       rc = devm_add_action(dev, dax_pmem_percpu_kill, &dax_pmem->ref);
+       if (rc) {
+               dax_pmem_percpu_kill(&dax_pmem->ref);
+               return rc;
+       }
+
+       nd_region = to_nd_region(dev->parent);
+       dax_region = alloc_dax_region(dev, nd_region->id, &res,
+                       le32_to_cpu(pfn_sb->align), addr, PFN_DEV|PFN_MAP);
+       if (!dax_region)
+               return -ENOMEM;
+
+       /* TODO: support for subdividing a dax region... */
+       rc = devm_create_dax_dev(dax_region, &res, 1);
+
+       /* child dax_dev instances now own the lifetime of the dax_region */
+       dax_region_put(dax_region);
+
+       return rc;
+}
+
+static struct nd_device_driver dax_pmem_driver = {
+       .probe = dax_pmem_probe,
+       .drv = {
+               .name = "dax_pmem",
+       },
+       .type = ND_DRIVER_DAX_PMEM,
+};
+
+static int __init dax_pmem_init(void)
+{
+       return nd_driver_register(&dax_pmem_driver);
+}
+module_init(dax_pmem_init);
+
+static void __exit dax_pmem_exit(void)
+{
+       driver_unregister(&dax_pmem_driver.drv);
+}
+module_exit(dax_pmem_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Intel Corporation");
+MODULE_ALIAS_ND_DEVICE(ND_DEVICE_DAX_PMEM);
index f2a74d0b68ae679a38c5cf8fb254c13ec20fde2c..fc357319de357cb0243330e75baeb8a35b23c889 100644 (file)
@@ -52,6 +52,7 @@ config DRM_KMS_FB_HELPER
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
+       select FB_DEFERRED_IO
        help
          FBDEV helpers for KMS drivers.
 
@@ -252,6 +253,8 @@ source "drivers/gpu/drm/rcar-du/Kconfig"
 
 source "drivers/gpu/drm/shmobile/Kconfig"
 
+source "drivers/gpu/drm/sun4i/Kconfig"
+
 source "drivers/gpu/drm/omapdrm/Kconfig"
 
 source "drivers/gpu/drm/tilcdc/Kconfig"
@@ -281,3 +284,9 @@ source "drivers/gpu/drm/imx/Kconfig"
 source "drivers/gpu/drm/vc4/Kconfig"
 
 source "drivers/gpu/drm/etnaviv/Kconfig"
+
+source "drivers/gpu/drm/arc/Kconfig"
+
+source "drivers/gpu/drm/hisilicon/Kconfig"
+
+source "drivers/gpu/drm/mediatek/Kconfig"
index 6eb94fc561dc29ba187baefb8a1368db2b550dbb..2bd3e5aa43c6ffa22b87750b30dd3294342a9b3d 100644 (file)
@@ -1,4 +1,4 @@
-#
+
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
@@ -65,6 +65,7 @@ obj-$(CONFIG_DRM_ATMEL_HLCDC) += atmel-hlcdc/
 obj-$(CONFIG_DRM_RCAR_DU) += rcar-du/
 obj-$(CONFIG_DRM_SHMOBILE) +=shmobile/
 obj-y                  += omapdrm/
+obj-$(CONFIG_DRM_SUN4I) += sun4i/
 obj-y                  += tilcdc/
 obj-$(CONFIG_DRM_QXL) += qxl/
 obj-$(CONFIG_DRM_BOCHS) += bochs/
@@ -73,8 +74,11 @@ obj-$(CONFIG_DRM_MSM) += msm/
 obj-$(CONFIG_DRM_TEGRA) += tegra/
 obj-$(CONFIG_DRM_STI) += sti/
 obj-$(CONFIG_DRM_IMX) += imx/
+obj-$(CONFIG_DRM_MEDIATEK) += mediatek/
 obj-y                  += i2c/
 obj-y                  += panel/
 obj-y                  += bridge/
 obj-$(CONFIG_DRM_FSL_DCU) += fsl-dcu/
 obj-$(CONFIG_DRM_ETNAVIV) += etnaviv/
+obj-$(CONFIG_DRM_ARCPGU)+= arc/
+obj-y                  += hisilicon/
index 7af83f142b4b8798bf86bd632a8ea0c5f3626423..c7d7205c9b11d0a6e590e6ae75c6bead3f05d889 100644 (file)
@@ -34,7 +34,7 @@
 
 #define mmACP_AZALIA_I2S_SELECT 0x51d4
 
-int amd_acp_hw_init(void *cgs_device,
+int amd_acp_hw_init(struct cgs_device *cgs_device,
                    unsigned acp_version_major, unsigned acp_version_minor)
 {
        unsigned int acp_mode = ACP_MODE_I2S;
index bccf47b63899130ca4c10fc1e7d51820d1edeb06..a72ddb2f69acba9b4b9a87405a07b611a328e734 100644 (file)
@@ -28,7 +28,7 @@
 #include "cgs_linux.h"
 #include "cgs_common.h"
 
-int amd_acp_hw_init(void *cgs_device,
+int amd_acp_hw_init(struct cgs_device *cgs_device,
                    unsigned acp_version_major, unsigned acp_version_minor);
 
 #endif /* _ACP_GFX_IF_H */
index b30fcfa4b1f2c8074b8dcfb1c3bcf92b221b38a5..7335c0420c7034d1d66aa4a52946d79ddd25aba7 100644 (file)
@@ -15,3 +15,13 @@ config DRM_AMDGPU_USERPTR
        help
          This option selects CONFIG_MMU_NOTIFIER if it isn't already
          selected to enabled full userptr support.
+
+config DRM_AMDGPU_GART_DEBUGFS
+       bool "Allow GART access through debugfs"
+       depends on DRM_AMDGPU
+       depends on DEBUG_FS
+       default n
+       help
+         Selecting this option creates a debugfs file to inspect the mapped
+         pages. Uses more memory for housekeeping, enable only for debugging.
+
index 1bcbade479dc2e384d4abf0481f5571c95699a16..2a009c398dcb539b91507e8bad3297c35d8a3eba 100644 (file)
@@ -283,7 +283,8 @@ struct amdgpu_ring_funcs {
        int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx);
        /* command emit functions */
        void (*emit_ib)(struct amdgpu_ring *ring,
-                       struct amdgpu_ib *ib);
+                       struct amdgpu_ib *ib,
+                       unsigned vm_id, bool ctx_switch);
        void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr,
                           uint64_t seq, unsigned flags);
        void (*emit_pipeline_sync)(struct amdgpu_ring *ring);
@@ -302,6 +303,8 @@ struct amdgpu_ring_funcs {
        void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
        /* pad the indirect buffer to the necessary number of dw */
        void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
+       unsigned (*init_cond_exec)(struct amdgpu_ring *ring);
+       void (*patch_cond_exec)(struct amdgpu_ring *ring, unsigned offset);
 };
 
 /*
@@ -365,13 +368,6 @@ struct amdgpu_fence_driver {
 #define AMDGPU_FENCE_FLAG_64BIT         (1 << 0)
 #define AMDGPU_FENCE_FLAG_INT           (1 << 1)
 
-struct amdgpu_user_fence {
-       /* write-back bo */
-       struct amdgpu_bo        *bo;
-       /* write-back address offset to bo start */
-       uint32_t                offset;
-};
-
 int amdgpu_fence_driver_init(struct amdgpu_device *adev);
 void amdgpu_fence_driver_fini(struct amdgpu_device *adev);
 void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev);
@@ -391,6 +387,14 @@ unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring);
 /*
  * TTM.
  */
+
+#define AMDGPU_TTM_LRU_SIZE    20
+
+struct amdgpu_mman_lru {
+       struct list_head                *lru[TTM_NUM_MEM_TYPES];
+       struct list_head                *swap_lru;
+};
+
 struct amdgpu_mman {
        struct ttm_bo_global_ref        bo_global_ref;
        struct drm_global_reference     mem_global_ref;
@@ -408,6 +412,9 @@ struct amdgpu_mman {
        struct amdgpu_ring                      *buffer_funcs_ring;
        /* Scheduler entity for buffer moves */
        struct amd_sched_entity                 entity;
+
+       /* custom LRU management */
+       struct amdgpu_mman_lru                  log2_size[AMDGPU_TTM_LRU_SIZE];
 };
 
 int amdgpu_copy_buffer(struct amdgpu_ring *ring,
@@ -494,9 +501,10 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,
                                struct drm_file *file_priv);
 unsigned long amdgpu_gem_timeout(uint64_t timeout_ns);
 struct sg_table *amdgpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
-struct drm_gem_object *amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
-                                                       struct dma_buf_attachment *attach,
-                                                       struct sg_table *sg);
+struct drm_gem_object *
+amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
+                                struct dma_buf_attachment *attach,
+                                struct sg_table *sg);
 struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,
                                        struct drm_gem_object *gobj,
                                        int flags);
@@ -586,6 +594,9 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
                     struct amdgpu_sync *sync,
                     struct reservation_object *resv,
                     void *owner);
+bool amdgpu_sync_is_idle(struct amdgpu_sync *sync);
+int amdgpu_sync_cycle_fences(struct amdgpu_sync *dst, struct amdgpu_sync *src,
+                            struct fence *fence);
 struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync);
 int amdgpu_sync_wait(struct amdgpu_sync *sync);
 void amdgpu_sync_free(struct amdgpu_sync *sync);
@@ -609,8 +620,9 @@ struct amdgpu_gart {
        unsigned                        num_gpu_pages;
        unsigned                        num_cpu_pages;
        unsigned                        table_size;
+#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
        struct page                     **pages;
-       dma_addr_t                      *pages_addr;
+#endif
        bool                            ready;
        const struct amdgpu_gart_funcs *gart_funcs;
 };
@@ -709,6 +721,7 @@ struct amdgpu_flip_work {
        unsigned                        shared_count;
        struct fence                    **shared;
        struct fence_cb                 cb;
+       bool                            async;
 };
 
 
@@ -721,17 +734,7 @@ struct amdgpu_ib {
        uint32_t                        length_dw;
        uint64_t                        gpu_addr;
        uint32_t                        *ptr;
-       struct amdgpu_user_fence        *user;
-       struct amdgpu_vm                *vm;
-       unsigned                        vm_id;
-       uint64_t                        vm_pd_addr;
-       struct amdgpu_ctx               *ctx;
-       uint32_t                        gds_base, gds_size;
-       uint32_t                        gws_base, gws_size;
-       uint32_t                        oa_base, oa_size;
        uint32_t                        flags;
-       /* resulting sequence number */
-       uint64_t                        sequence;
 };
 
 enum amdgpu_ring_type {
@@ -742,22 +745,25 @@ enum amdgpu_ring_type {
        AMDGPU_RING_TYPE_VCE
 };
 
-extern struct amd_sched_backend_ops amdgpu_sched_ops;
+extern const struct amd_sched_backend_ops amdgpu_sched_ops;
 
 int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
-                    struct amdgpu_job **job);
+                    struct amdgpu_job **job, struct amdgpu_vm *vm);
 int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
                             struct amdgpu_job **job);
+
 void amdgpu_job_free(struct amdgpu_job *job);
+void amdgpu_job_free_func(struct kref *refcount);
 int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
                      struct amd_sched_entity *entity, void *owner,
                      struct fence **f);
+void amdgpu_job_timeout_func(struct work_struct *work);
 
 struct amdgpu_ring {
        struct amdgpu_device            *adev;
        const struct amdgpu_ring_funcs  *funcs;
        struct amdgpu_fence_driver      fence_drv;
-       struct amd_gpu_scheduler        sched;
+       struct amd_gpu_scheduler        sched;
 
        spinlock_t              fence_lock;
        struct amdgpu_bo        *ring_obj;
@@ -785,9 +791,12 @@ struct amdgpu_ring {
        unsigned                wptr_offs;
        unsigned                next_rptr_offs;
        unsigned                fence_offs;
-       struct amdgpu_ctx       *current_ctx;
+       uint64_t                current_ctx;
        enum amdgpu_ring_type   type;
        char                    name[16];
+       unsigned                cond_exe_offs;
+       u64                             cond_exe_gpu_addr;
+       volatile u32    *cond_exe_cpu_addr;
 };
 
 /*
@@ -830,13 +839,6 @@ struct amdgpu_vm_pt {
        uint64_t                        addr;
 };
 
-struct amdgpu_vm_id {
-       struct amdgpu_vm_manager_id     *mgr_id;
-       uint64_t                        pd_gpu_addr;
-       /* last flushed PD/PT update */
-       struct fence                    *flushed_updates;
-};
-
 struct amdgpu_vm {
        /* tree of virtual addresses mapped */
        struct rb_root          va;
@@ -862,19 +864,29 @@ struct amdgpu_vm {
        struct amdgpu_vm_pt     *page_tables;
 
        /* for id and flush management per ring */
-       struct amdgpu_vm_id     ids[AMDGPU_MAX_RINGS];
+       struct amdgpu_vm_id     *ids[AMDGPU_MAX_RINGS];
 
        /* protecting freed */
        spinlock_t              freed_lock;
 
        /* Scheduler entity for page table updates */
        struct amd_sched_entity entity;
+
+       /* client id */
+       u64                     client_id;
 };
 
-struct amdgpu_vm_manager_id {
+struct amdgpu_vm_id {
        struct list_head        list;
-       struct fence            *active;
-       atomic_long_t           owner;
+       struct fence            *first;
+       struct amdgpu_sync      active;
+       struct fence            *last_flush;
+       struct amdgpu_ring      *last_user;
+       atomic64_t              owner;
+
+       uint64_t                pd_gpu_addr;
+       /* last flushed PD/PT update */
+       struct fence            *flushed_updates;
 
        uint32_t                gds_base;
        uint32_t                gds_size;
@@ -889,7 +901,7 @@ struct amdgpu_vm_manager {
        struct mutex                            lock;
        unsigned                                num_ids;
        struct list_head                        ids_lru;
-       struct amdgpu_vm_manager_id             ids[AMDGPU_NUM_VM];
+       struct amdgpu_vm_id                     ids[AMDGPU_NUM_VM];
 
        uint32_t                                max_pfn;
        /* vram base address for page table entry  */
@@ -901,6 +913,8 @@ struct amdgpu_vm_manager {
        struct amdgpu_ring                      *vm_pte_rings[AMDGPU_MAX_RINGS];
        unsigned                                vm_pte_num_rings;
        atomic_t                                vm_pte_next_ring;
+       /* client id counter */
+       atomic64_t                              client_counter;
 };
 
 void amdgpu_vm_manager_init(struct amdgpu_device *adev);
@@ -916,11 +930,11 @@ void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev,
 int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
                      struct amdgpu_sync *sync, struct fence *fence,
                      unsigned *vm_id, uint64_t *vm_pd_addr);
-void amdgpu_vm_flush(struct amdgpu_ring *ring,
-                    unsigned vm_id, uint64_t pd_addr,
-                    uint32_t gds_base, uint32_t gds_size,
-                    uint32_t gws_base, uint32_t gws_size,
-                    uint32_t oa_base, uint32_t oa_size);
+int amdgpu_vm_flush(struct amdgpu_ring *ring,
+                   unsigned vm_id, uint64_t pd_addr,
+                   uint32_t gds_base, uint32_t gds_size,
+                   uint32_t gws_base, uint32_t gws_size,
+                   uint32_t oa_base, uint32_t oa_size);
 void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id);
 uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr);
 int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
@@ -1026,6 +1040,11 @@ void amdgpu_bo_list_free(struct amdgpu_bo_list *list);
  */
 #include "clearstate_defs.h"
 
+struct amdgpu_rlc_funcs {
+       void (*enter_safe_mode)(struct amdgpu_device *adev);
+       void (*exit_safe_mode)(struct amdgpu_device *adev);
+};
+
 struct amdgpu_rlc {
        /* for power gating */
        struct amdgpu_bo        *save_restore_obj;
@@ -1044,6 +1063,24 @@ struct amdgpu_rlc {
        uint64_t                cp_table_gpu_addr;
        volatile uint32_t       *cp_table_ptr;
        u32                     cp_table_size;
+
+       /* safe mode for updating CG/PG state */
+       bool in_safe_mode;
+       const struct amdgpu_rlc_funcs *funcs;
+
+       /* for firmware data */
+       u32 save_and_restore_offset;
+       u32 clear_state_descriptor_offset;
+       u32 avail_scratch_ram_locations;
+       u32 reg_restore_list_size;
+       u32 reg_list_format_start;
+       u32 reg_list_format_separate_start;
+       u32 starting_offsets_start;
+       u32 reg_list_format_size_bytes;
+       u32 reg_list_size_bytes;
+
+       u32 *register_list_format;
+       u32 *register_restore;
 };
 
 struct amdgpu_mec {
@@ -1097,6 +1134,12 @@ struct amdgpu_gca_config {
        uint32_t macrotile_mode_array[16];
 };
 
+struct amdgpu_cu_info {
+       uint32_t number; /* total active CU number */
+       uint32_t ao_cu_mask;
+       uint32_t bitmap[4][4];
+};
+
 struct amdgpu_gfx {
        struct mutex                    gpu_clock_mutex;
        struct amdgpu_gca_config        config;
@@ -1129,17 +1172,19 @@ struct amdgpu_gfx {
        struct amdgpu_irq_src           priv_reg_irq;
        struct amdgpu_irq_src           priv_inst_irq;
        /* gfx status */
-       uint32_t gfx_current_status;
+       uint32_t                        gfx_current_status;
        /* ce ram size*/
-       unsigned ce_ram_size;
+       unsigned                        ce_ram_size;
+       struct amdgpu_cu_info           cu_info;
 };
 
 int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                  unsigned size, struct amdgpu_ib *ib);
-void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fence *f);
+void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
+                   struct fence *f);
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
                       struct amdgpu_ib *ib, struct fence *last_vm_update,
-                      struct fence **f);
+                      struct amdgpu_job *job, struct fence **f);
 int amdgpu_ib_pool_init(struct amdgpu_device *adev);
 void amdgpu_ib_pool_fini(struct amdgpu_device *adev);
 int amdgpu_ib_ring_tests(struct amdgpu_device *adev);
@@ -1164,7 +1209,7 @@ void amdgpu_ring_fini(struct amdgpu_ring *ring);
 struct amdgpu_cs_chunk {
        uint32_t                chunk_id;
        uint32_t                length_dw;
-       uint32_t                *kdata;
+       void                    *kdata;
 };
 
 struct amdgpu_cs_parser {
@@ -1195,13 +1240,25 @@ struct amdgpu_cs_parser {
 struct amdgpu_job {
        struct amd_sched_job    base;
        struct amdgpu_device    *adev;
+       struct amdgpu_vm        *vm;
        struct amdgpu_ring      *ring;
        struct amdgpu_sync      sync;
        struct amdgpu_ib        *ibs;
        struct fence            *fence; /* the hw fence */
        uint32_t                num_ibs;
        void                    *owner;
-       struct amdgpu_user_fence uf;
+       uint64_t                ctx;
+       unsigned                vm_id;
+       uint64_t                vm_pd_addr;
+       uint32_t                gds_base, gds_size;
+       uint32_t                gws_base, gws_size;
+       uint32_t                oa_base, oa_size;
+
+       /* user fence handling */
+       struct amdgpu_bo        *uf_bo;
+       uint32_t                uf_offset;
+       uint64_t                uf_sequence;
+
 };
 #define to_amdgpu_job(sched_job)               \
                container_of((sched_job), struct amdgpu_job, base)
@@ -1582,10 +1639,12 @@ void amdgpu_get_pcie_info(struct amdgpu_device *adev);
 /*
  * UVD
  */
-#define AMDGPU_MAX_UVD_HANDLES 10
-#define AMDGPU_UVD_STACK_SIZE  (1024*1024)
-#define AMDGPU_UVD_HEAP_SIZE   (1024*1024)
-#define AMDGPU_UVD_FIRMWARE_OFFSET 256
+#define AMDGPU_DEFAULT_UVD_HANDLES     10
+#define AMDGPU_MAX_UVD_HANDLES         40
+#define AMDGPU_UVD_STACK_SIZE          (200*1024)
+#define AMDGPU_UVD_HEAP_SIZE           (256*1024)
+#define AMDGPU_UVD_SESSION_SIZE                (50*1024)
+#define AMDGPU_UVD_FIRMWARE_OFFSET     256
 
 struct amdgpu_uvd {
        struct amdgpu_bo        *vcpu_bo;
@@ -1593,6 +1652,7 @@ struct amdgpu_uvd {
        uint64_t                gpu_addr;
        unsigned                fw_version;
        void                    *saved_bo;
+       unsigned                max_handles;
        atomic_t                handles[AMDGPU_MAX_UVD_HANDLES];
        struct drm_file         *filp[AMDGPU_MAX_UVD_HANDLES];
        struct delayed_work     idle_work;
@@ -1645,7 +1705,7 @@ struct amdgpu_sdma {
        struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
        struct amdgpu_irq_src   trap_irq;
        struct amdgpu_irq_src   illegal_inst_irq;
-       int                     num_instances;
+       int                     num_instances;
 };
 
 /*
@@ -1691,12 +1751,12 @@ static inline void amdgpu_mn_unregister(struct amdgpu_bo *bo) {}
  * Debugfs
  */
 struct amdgpu_debugfs {
-       struct drm_info_list    *files;
+       const struct drm_info_list      *files;
        unsigned                num_files;
 };
 
 int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
-                            struct drm_info_list *files,
+                            const struct drm_info_list *files,
                             unsigned nfiles);
 int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);
 
@@ -1738,13 +1798,6 @@ struct amdgpu_allowed_register_entry {
        bool grbm_indexed;
 };
 
-struct amdgpu_cu_info {
-       uint32_t number; /* total active CU number */
-       uint32_t ao_cu_mask;
-       uint32_t bitmap[4][4];
-};
-
-
 /*
  * ASIC specific functions.
  */
@@ -1762,7 +1815,6 @@ struct amdgpu_asic_funcs {
        u32 (*get_xclk)(struct amdgpu_device *adev);
        /* get the gpu clock counter */
        uint64_t (*get_gpu_clock_counter)(struct amdgpu_device *adev);
-       int (*get_cu_info)(struct amdgpu_device *adev, struct amdgpu_cu_info *info);
        /* MM block clocks */
        int (*set_uvd_clocks)(struct amdgpu_device *adev, u32 vclk, u32 dclk);
        int (*set_vce_clocks)(struct amdgpu_device *adev, u32 evclk, u32 ecclk);
@@ -1855,15 +1907,8 @@ struct amdgpu_atcs {
 /*
  * CGS
  */
-void *amdgpu_cgs_create_device(struct amdgpu_device *adev);
-void amdgpu_cgs_destroy_device(void *cgs_device);
-
-
-/*
- * CGS
- */
-void *amdgpu_cgs_create_device(struct amdgpu_device *adev);
-void amdgpu_cgs_destroy_device(void *cgs_device);
+struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev);
+void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device);
 
 
 /* GPU virtualization */
@@ -1904,16 +1949,15 @@ struct amdgpu_device {
        int                             usec_timeout;
        const struct amdgpu_asic_funcs  *asic_funcs;
        bool                            shutdown;
-       bool                            suspend;
        bool                            need_dma32;
        bool                            accel_working;
-       struct work_struct              reset_work;
+       struct work_struct              reset_work;
        struct notifier_block           acpi_nb;
        struct amdgpu_i2c_chan          *i2c_bus[AMDGPU_MAX_I2C_BUS];
        struct amdgpu_debugfs           debugfs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
-       unsigned                        debugfs_count;
+       unsigned                        debugfs_count;
 #if defined(CONFIG_DEBUG_FS)
-       struct dentry                   *debugfs_regs;
+       struct dentry                   *debugfs_regs[AMDGPU_DEBUGFS_MAX_COMPONENTS];
 #endif
        struct amdgpu_atif              atif;
        struct amdgpu_atcs              atcs;
@@ -1926,7 +1970,6 @@ struct amdgpu_device {
        /* BIOS */
        uint8_t                         *bios;
        bool                            is_atom_bios;
-       uint16_t                        bios_header_start;
        struct amdgpu_bo                *stollen_vga_memory;
        uint32_t                        bios_scratch[AMDGPU_BIOS_NUM_SCRATCH];
 
@@ -2163,7 +2206,6 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 #define amdgpu_asic_read_disabled_bios(adev) (adev)->asic_funcs->read_disabled_bios((adev))
 #define amdgpu_asic_read_bios_from_rom(adev, b, l) (adev)->asic_funcs->read_bios_from_rom((adev), (b), (l))
 #define amdgpu_asic_read_register(adev, se, sh, offset, v)((adev)->asic_funcs->read_register((adev), (se), (sh), (offset), (v)))
-#define amdgpu_asic_get_cu_info(adev, info) (adev)->asic_funcs->get_cu_info((adev), (info))
 #define amdgpu_gart_flush_gpu_tlb(adev, vmid) (adev)->gart.gart_funcs->flush_gpu_tlb((adev), (vmid))
 #define amdgpu_gart_set_pte_pde(adev, pt, idx, addr, flags) (adev)->gart.gart_funcs->set_pte_pde((adev), (pt), (idx), (addr), (flags))
 #define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count)))
@@ -2175,7 +2217,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
 #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
 #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
-#define amdgpu_ring_emit_ib(r, ib) (r)->funcs->emit_ib((r), (ib))
+#define amdgpu_ring_emit_ib(r, ib, vm_id, c) (r)->funcs->emit_ib((r), (ib), (vm_id), (c))
 #define amdgpu_ring_emit_pipeline_sync(r) (r)->funcs->emit_pipeline_sync((r))
 #define amdgpu_ring_emit_vm_flush(r, vmid, addr) (r)->funcs->emit_vm_flush((r), (vmid), (addr))
 #define amdgpu_ring_emit_fence(r, addr, seq, flags) (r)->funcs->emit_fence((r), (addr), (seq), (flags))
@@ -2183,6 +2225,8 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 #define amdgpu_ring_emit_hdp_flush(r) (r)->funcs->emit_hdp_flush((r))
 #define amdgpu_ring_emit_hdp_invalidate(r) (r)->funcs->emit_hdp_invalidate((r))
 #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))
+#define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r))
+#define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o))
 #define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev))
 #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv))
 #define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev))
@@ -2196,7 +2240,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 #define amdgpu_display_hpd_set_polarity(adev, h) (adev)->mode_info.funcs->hpd_set_polarity((adev), (h))
 #define amdgpu_display_hpd_get_gpio_reg(adev) (adev)->mode_info.funcs->hpd_get_gpio_reg((adev))
 #define amdgpu_display_bandwidth_update(adev) (adev)->mode_info.funcs->bandwidth_update((adev))
-#define amdgpu_display_page_flip(adev, crtc, base) (adev)->mode_info.funcs->page_flip((adev), (crtc), (base))
+#define amdgpu_display_page_flip(adev, crtc, base, async) (adev)->mode_info.funcs->page_flip((adev), (crtc), (base), (async))
 #define amdgpu_display_page_flip_get_scanoutpos(adev, crtc, vbl, pos) (adev)->mode_info.funcs->page_flip_get_scanoutpos((adev), (crtc), (vbl), (pos))
 #define amdgpu_display_add_encoder(adev, e, s, c) (adev)->mode_info.funcs->add_encoder((adev), (e), (s), (c))
 #define amdgpu_display_add_connector(adev, ci, sd, ct, ib, coi, h, r) (adev)->mode_info.funcs->add_connector((adev), (ci), (sd), (ct), (ib), (coi), (h), (r))
@@ -2339,7 +2383,7 @@ static inline void amdgpu_unregister_atpx_handler(void) {}
  * KMS
  */
 extern const struct drm_ioctl_desc amdgpu_ioctls_kms[];
-extern int amdgpu_max_kms_ioctl;
+extern const int amdgpu_max_kms_ioctl;
 
 int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags);
 int amdgpu_driver_unload_kms(struct drm_device *dev);
@@ -2398,5 +2442,4 @@ amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
                       uint64_t addr, struct amdgpu_bo **bo);
 
 #include "amdgpu_object.h"
-
 #endif
index b7b583c42ea82410b2c80825185da124e385219c..252edba16e367d9e92212f8b0e3b60fedb8aa1a2 100644 (file)
@@ -467,13 +467,6 @@ static int acp_soft_reset(void *handle)
        return 0;
 }
 
-static void acp_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "ACP STATUS\n");
-}
-
 static int acp_set_clockgating_state(void *handle,
                                     enum amd_clockgating_state state)
 {
@@ -487,6 +480,7 @@ static int acp_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs acp_ip_funcs = {
+       .name = "acp_ip",
        .early_init = acp_early_init,
        .late_init = NULL,
        .sw_init = acp_sw_init,
@@ -498,7 +492,6 @@ const struct amd_ip_funcs acp_ip_funcs = {
        .is_idle = acp_is_idle,
        .wait_for_idle = acp_wait_for_idle,
        .soft_reset = acp_soft_reset,
-       .print_status = acp_print_status,
        .set_clockgating_state = acp_set_clockgating_state,
        .set_powergating_state = acp_set_powergating_state,
 };
index f6e32a63910749d47fe852ebd57aa666241dad79..8a396313c86f8fc7b8a2bc2c7617a167f401e201 100644 (file)
@@ -30,7 +30,7 @@
 
 struct amdgpu_acp {
        struct device *parent;
-       void *cgs_device;
+       struct cgs_device *cgs_device;
        struct amd_acp_private *private;
        struct mfd_cell *acp_cell;
        struct resource *acp_res;
index 84b0ce39ee14d51014148e8b7a7f9f143e7b28d2..9df1bcb35bf097ba9971ff8c9f57d5f3f449f037 100644 (file)
@@ -234,16 +234,6 @@ amdgpu_atombios_get_hpd_info_from_gpio(struct amdgpu_device *adev,
        return hpd;
 }
 
-static bool amdgpu_atombios_apply_quirks(struct amdgpu_device *adev,
-                                        uint32_t supported_device,
-                                        int *connector_type,
-                                        struct amdgpu_i2c_bus_rec *i2c_bus,
-                                        uint16_t *line_mux,
-                                        struct amdgpu_hpd *hpd)
-{
-       return true;
-}
-
 static const int object_connector_convert[] = {
        DRM_MODE_CONNECTOR_Unknown,
        DRM_MODE_CONNECTOR_DVII,
@@ -514,11 +504,6 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
 
                        conn_id = le16_to_cpu(path->usConnObjectId);
 
-                       if (!amdgpu_atombios_apply_quirks
-                           (adev, le16_to_cpu(path->usDeviceTag), &connector_type,
-                            &ddc_bus, &conn_id, &hpd))
-                               continue;
-
                        amdgpu_display_add_connector(adev,
                                                      conn_id,
                                                      le16_to_cpu(path->usDeviceTag),
@@ -699,6 +684,36 @@ int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev)
        return ret;
 }
 
+union gfx_info {
+       ATOM_GFX_INFO_V2_1 info;
+};
+
+int amdgpu_atombios_get_gfx_info(struct amdgpu_device *adev)
+{
+       struct amdgpu_mode_info *mode_info = &adev->mode_info;
+       int index = GetIndexIntoMasterTable(DATA, GFX_Info);
+       uint8_t frev, crev;
+       uint16_t data_offset;
+       int ret = -EINVAL;
+
+       if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, NULL,
+                                  &frev, &crev, &data_offset)) {
+               union gfx_info *gfx_info = (union gfx_info *)
+                       (mode_info->atom_context->bios + data_offset);
+
+               adev->gfx.config.max_shader_engines = gfx_info->info.max_shader_engines;
+               adev->gfx.config.max_tile_pipes = gfx_info->info.max_tile_pipes;
+               adev->gfx.config.max_cu_per_sh = gfx_info->info.max_cu_per_sh;
+               adev->gfx.config.max_sh_per_se = gfx_info->info.max_sh_per_se;
+               adev->gfx.config.max_backends_per_se = gfx_info->info.max_backends_per_se;
+               adev->gfx.config.max_texture_channel_caches =
+                       gfx_info->info.max_texture_channel_caches;
+
+               ret = 0;
+       }
+       return ret;
+}
+
 union igp_info {
        struct _ATOM_INTEGRATED_SYSTEM_INFO info;
        struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
index 9e1442053fe4ffb72e1ff47c6a8fb5bc91d09533..8c2e69661799d0db7b390b00a48edade2b784cff 100644 (file)
@@ -144,6 +144,8 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
 
 int amdgpu_atombios_get_clock_info(struct amdgpu_device *adev);
 
+int amdgpu_atombios_get_gfx_info(struct amdgpu_device *adev);
+
 bool amdgpu_atombios_get_asic_ss_info(struct amdgpu_device *adev,
                                      struct amdgpu_atom_ss *ss,
                                      int id, u32 clock);
index cd639c362df3ae97fe16f4fcce8050a4df1f94d7..33e47a43ae321bded79822cfb03318c79a155211 100644 (file)
@@ -141,7 +141,7 @@ out_cleanup:
 void amdgpu_benchmark(struct amdgpu_device *adev, int test_number)
 {
        int i;
-       int common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = {
+       static const int common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = {
                640 * 480 * 4,
                720 * 480 * 4,
                800 * 600 * 4,
index 80add22375eed29e6d10de506b19941183ce8755..99ca75baa47d7b8e018a856936fffd016d808742 100644 (file)
@@ -349,7 +349,7 @@ static inline bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
 bool amdgpu_get_bios(struct amdgpu_device *adev)
 {
        bool r;
-       uint16_t tmp;
+       uint16_t tmp, bios_header_start;
 
        r = amdgpu_atrm_get_bios(adev);
        if (r == false)
@@ -383,11 +383,11 @@ bool amdgpu_get_bios(struct amdgpu_device *adev)
                goto free_bios;
        }
 
-       adev->bios_header_start = RBIOS16(0x48);
-       if (!adev->bios_header_start) {
+       bios_header_start = RBIOS16(0x48);
+       if (!bios_header_start) {
                goto free_bios;
        }
-       tmp = adev->bios_header_start + 4;
+       tmp = bios_header_start + 4;
        if (!memcmp(adev->bios + tmp, "ATOM", 4) ||
            !memcmp(adev->bios + tmp, "MOTA", 4)) {
                adev->is_atom_bios = true;
index eacd810fc09b12d43607e0f00e77acdd87a5b768..823bf5e0b0c841606e8a27cf7d488938113cc4a6 100644 (file)
@@ -106,7 +106,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
                struct amdgpu_bo *bo;
                struct mm_struct *usermm;
 
-               gobj = drm_gem_object_lookup(adev->ddev, filp, info[i].bo_handle);
+               gobj = drm_gem_object_lookup(filp, info[i].bo_handle);
                if (!gobj) {
                        r = -ENOENT;
                        goto error_free;
@@ -263,7 +263,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
                for (i = 0; i < args->in.bo_number; ++i) {
                        if (copy_from_user(&info[i], uptr, bytes))
                                goto error_free;
-                       
+
                        uptr += args->in.bo_info_size;
                }
        }
@@ -271,7 +271,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
        switch (args->in.operation) {
        case AMDGPU_BO_LIST_OP_CREATE:
                r = amdgpu_bo_list_create(fpriv, &list, &handle);
-               if (r) 
+               if (r)
                        goto error_free;
 
                r = amdgpu_bo_list_set(adev, filp, list, info,
@@ -281,7 +281,7 @@ int amdgpu_bo_list_ioctl(struct drm_device *dev, void *data,
                        goto error_free;
 
                break;
-               
+
        case AMDGPU_BO_LIST_OP_DESTROY:
                amdgpu_bo_list_destroy(fpriv, handle);
                handle = 0;
index 6043dc7c3a94d75350a6e8760376b772f0fc4baf..199f76baf22c3eea20207fec60c1e868d173d1cb 100644 (file)
@@ -42,7 +42,7 @@ struct amdgpu_cgs_device {
        struct amdgpu_device *adev =                                    \
                ((struct amdgpu_cgs_device *)cgs_device)->adev
 
-static int amdgpu_cgs_gpu_mem_info(void *cgs_device, enum cgs_gpu_mem_type type,
+static int amdgpu_cgs_gpu_mem_info(struct cgs_device *cgs_device, enum cgs_gpu_mem_type type,
                                   uint64_t *mc_start, uint64_t *mc_size,
                                   uint64_t *mem_size)
 {
@@ -73,7 +73,7 @@ static int amdgpu_cgs_gpu_mem_info(void *cgs_device, enum cgs_gpu_mem_type type,
        return 0;
 }
 
-static int amdgpu_cgs_gmap_kmem(void *cgs_device, void *kmem,
+static int amdgpu_cgs_gmap_kmem(struct cgs_device *cgs_device, void *kmem,
                                uint64_t size,
                                uint64_t min_offset, uint64_t max_offset,
                                cgs_handle_t *kmem_handle, uint64_t *mcaddr)
@@ -102,7 +102,7 @@ static int amdgpu_cgs_gmap_kmem(void *cgs_device, void *kmem,
        return ret;
 }
 
-static int amdgpu_cgs_gunmap_kmem(void *cgs_device, cgs_handle_t kmem_handle)
+static int amdgpu_cgs_gunmap_kmem(struct cgs_device *cgs_device, cgs_handle_t kmem_handle)
 {
        struct amdgpu_bo *obj = (struct amdgpu_bo *)kmem_handle;
 
@@ -118,7 +118,7 @@ static int amdgpu_cgs_gunmap_kmem(void *cgs_device, cgs_handle_t kmem_handle)
        return 0;
 }
 
-static int amdgpu_cgs_alloc_gpu_mem(void *cgs_device,
+static int amdgpu_cgs_alloc_gpu_mem(struct cgs_device *cgs_device,
                                    enum cgs_gpu_mem_type type,
                                    uint64_t size, uint64_t align,
                                    uint64_t min_offset, uint64_t max_offset,
@@ -208,7 +208,7 @@ static int amdgpu_cgs_alloc_gpu_mem(void *cgs_device,
        return ret;
 }
 
-static int amdgpu_cgs_free_gpu_mem(void *cgs_device, cgs_handle_t handle)
+static int amdgpu_cgs_free_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t handle)
 {
        struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
 
@@ -225,7 +225,7 @@ static int amdgpu_cgs_free_gpu_mem(void *cgs_device, cgs_handle_t handle)
        return 0;
 }
 
-static int amdgpu_cgs_gmap_gpu_mem(void *cgs_device, cgs_handle_t handle,
+static int amdgpu_cgs_gmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t handle,
                                   uint64_t *mcaddr)
 {
        int r;
@@ -246,7 +246,7 @@ static int amdgpu_cgs_gmap_gpu_mem(void *cgs_device, cgs_handle_t handle,
        return r;
 }
 
-static int amdgpu_cgs_gunmap_gpu_mem(void *cgs_device, cgs_handle_t handle)
+static int amdgpu_cgs_gunmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t handle)
 {
        int r;
        struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
@@ -258,7 +258,7 @@ static int amdgpu_cgs_gunmap_gpu_mem(void *cgs_device, cgs_handle_t handle)
        return r;
 }
 
-static int amdgpu_cgs_kmap_gpu_mem(void *cgs_device, cgs_handle_t handle,
+static int amdgpu_cgs_kmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t handle,
                                   void **map)
 {
        int r;
@@ -271,7 +271,7 @@ static int amdgpu_cgs_kmap_gpu_mem(void *cgs_device, cgs_handle_t handle,
        return r;
 }
 
-static int amdgpu_cgs_kunmap_gpu_mem(void *cgs_device, cgs_handle_t handle)
+static int amdgpu_cgs_kunmap_gpu_mem(struct cgs_device *cgs_device, cgs_handle_t handle)
 {
        int r;
        struct amdgpu_bo *obj = (struct amdgpu_bo *)handle;
@@ -283,20 +283,20 @@ static int amdgpu_cgs_kunmap_gpu_mem(void *cgs_device, cgs_handle_t handle)
        return r;
 }
 
-static uint32_t amdgpu_cgs_read_register(void *cgs_device, unsigned offset)
+static uint32_t amdgpu_cgs_read_register(struct cgs_device *cgs_device, unsigned offset)
 {
        CGS_FUNC_ADEV;
        return RREG32(offset);
 }
 
-static void amdgpu_cgs_write_register(void *cgs_device, unsigned offset,
+static void amdgpu_cgs_write_register(struct cgs_device *cgs_device, unsigned offset,
                                      uint32_t value)
 {
        CGS_FUNC_ADEV;
        WREG32(offset, value);
 }
 
-static uint32_t amdgpu_cgs_read_ind_register(void *cgs_device,
+static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,
                                             enum cgs_ind_reg space,
                                             unsigned index)
 {
@@ -320,7 +320,7 @@ static uint32_t amdgpu_cgs_read_ind_register(void *cgs_device,
        return 0;
 }
 
-static void amdgpu_cgs_write_ind_register(void *cgs_device,
+static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,
                                          enum cgs_ind_reg space,
                                          unsigned index, uint32_t value)
 {
@@ -343,7 +343,7 @@ static void amdgpu_cgs_write_ind_register(void *cgs_device,
        WARN(1, "Invalid indirect register space");
 }
 
-static uint8_t amdgpu_cgs_read_pci_config_byte(void *cgs_device, unsigned addr)
+static uint8_t amdgpu_cgs_read_pci_config_byte(struct cgs_device *cgs_device, unsigned addr)
 {
        CGS_FUNC_ADEV;
        uint8_t val;
@@ -353,7 +353,7 @@ static uint8_t amdgpu_cgs_read_pci_config_byte(void *cgs_device, unsigned addr)
        return val;
 }
 
-static uint16_t amdgpu_cgs_read_pci_config_word(void *cgs_device, unsigned addr)
+static uint16_t amdgpu_cgs_read_pci_config_word(struct cgs_device *cgs_device, unsigned addr)
 {
        CGS_FUNC_ADEV;
        uint16_t val;
@@ -363,7 +363,7 @@ static uint16_t amdgpu_cgs_read_pci_config_word(void *cgs_device, unsigned addr)
        return val;
 }
 
-static uint32_t amdgpu_cgs_read_pci_config_dword(void *cgs_device,
+static uint32_t amdgpu_cgs_read_pci_config_dword(struct cgs_device *cgs_device,
                                                 unsigned addr)
 {
        CGS_FUNC_ADEV;
@@ -374,7 +374,7 @@ static uint32_t amdgpu_cgs_read_pci_config_dword(void *cgs_device,
        return val;
 }
 
-static void amdgpu_cgs_write_pci_config_byte(void *cgs_device, unsigned addr,
+static void amdgpu_cgs_write_pci_config_byte(struct cgs_device *cgs_device, unsigned addr,
                                             uint8_t value)
 {
        CGS_FUNC_ADEV;
@@ -382,7 +382,7 @@ static void amdgpu_cgs_write_pci_config_byte(void *cgs_device, unsigned addr,
        WARN(ret, "pci_write_config_byte error");
 }
 
-static void amdgpu_cgs_write_pci_config_word(void *cgs_device, unsigned addr,
+static void amdgpu_cgs_write_pci_config_word(struct cgs_device *cgs_device, unsigned addr,
                                             uint16_t value)
 {
        CGS_FUNC_ADEV;
@@ -390,7 +390,7 @@ static void amdgpu_cgs_write_pci_config_word(void *cgs_device, unsigned addr,
        WARN(ret, "pci_write_config_word error");
 }
 
-static void amdgpu_cgs_write_pci_config_dword(void *cgs_device, unsigned addr,
+static void amdgpu_cgs_write_pci_config_dword(struct cgs_device *cgs_device, unsigned addr,
                                              uint32_t value)
 {
        CGS_FUNC_ADEV;
@@ -399,7 +399,7 @@ static void amdgpu_cgs_write_pci_config_dword(void *cgs_device, unsigned addr,
 }
 
 
-static int amdgpu_cgs_get_pci_resource(void *cgs_device,
+static int amdgpu_cgs_get_pci_resource(struct cgs_device *cgs_device,
                                       enum cgs_resource_type resource_type,
                                       uint64_t size,
                                       uint64_t offset,
@@ -433,7 +433,7 @@ static int amdgpu_cgs_get_pci_resource(void *cgs_device,
        }
 }
 
-static const void *amdgpu_cgs_atom_get_data_table(void *cgs_device,
+static const void *amdgpu_cgs_atom_get_data_table(struct cgs_device *cgs_device,
                                                  unsigned table, uint16_t *size,
                                                  uint8_t *frev, uint8_t *crev)
 {
@@ -449,7 +449,7 @@ static const void *amdgpu_cgs_atom_get_data_table(void *cgs_device,
        return NULL;
 }
 
-static int amdgpu_cgs_atom_get_cmd_table_revs(void *cgs_device, unsigned table,
+static int amdgpu_cgs_atom_get_cmd_table_revs(struct cgs_device *cgs_device, unsigned table,
                                              uint8_t *frev, uint8_t *crev)
 {
        CGS_FUNC_ADEV;
@@ -462,7 +462,7 @@ static int amdgpu_cgs_atom_get_cmd_table_revs(void *cgs_device, unsigned table,
        return -EINVAL;
 }
 
-static int amdgpu_cgs_atom_exec_cmd_table(void *cgs_device, unsigned table,
+static int amdgpu_cgs_atom_exec_cmd_table(struct cgs_device *cgs_device, unsigned table,
                                          void *args)
 {
        CGS_FUNC_ADEV;
@@ -471,33 +471,33 @@ static int amdgpu_cgs_atom_exec_cmd_table(void *cgs_device, unsigned table,
                adev->mode_info.atom_context, table, args);
 }
 
-static int amdgpu_cgs_create_pm_request(void *cgs_device, cgs_handle_t *request)
+static int amdgpu_cgs_create_pm_request(struct cgs_device *cgs_device, cgs_handle_t *request)
 {
        /* TODO */
        return 0;
 }
 
-static int amdgpu_cgs_destroy_pm_request(void *cgs_device, cgs_handle_t request)
+static int amdgpu_cgs_destroy_pm_request(struct cgs_device *cgs_device, cgs_handle_t request)
 {
        /* TODO */
        return 0;
 }
 
-static int amdgpu_cgs_set_pm_request(void *cgs_device, cgs_handle_t request,
+static int amdgpu_cgs_set_pm_request(struct cgs_device *cgs_device, cgs_handle_t request,
                                     int active)
 {
        /* TODO */
        return 0;
 }
 
-static int amdgpu_cgs_pm_request_clock(void *cgs_device, cgs_handle_t request,
+static int amdgpu_cgs_pm_request_clock(struct cgs_device *cgs_device, cgs_handle_t request,
                                       enum cgs_clock clock, unsigned freq)
 {
        /* TODO */
        return 0;
 }
 
-static int amdgpu_cgs_pm_request_engine(void *cgs_device, cgs_handle_t request,
+static int amdgpu_cgs_pm_request_engine(struct cgs_device *cgs_device, cgs_handle_t request,
                                        enum cgs_engine engine, int powered)
 {
        /* TODO */
@@ -506,7 +506,7 @@ static int amdgpu_cgs_pm_request_engine(void *cgs_device, cgs_handle_t request,
 
 
 
-static int amdgpu_cgs_pm_query_clock_limits(void *cgs_device,
+static int amdgpu_cgs_pm_query_clock_limits(struct cgs_device *cgs_device,
                                            enum cgs_clock clock,
                                            struct cgs_clock_limits *limits)
 {
@@ -514,7 +514,7 @@ static int amdgpu_cgs_pm_query_clock_limits(void *cgs_device,
        return 0;
 }
 
-static int amdgpu_cgs_set_camera_voltages(void *cgs_device, uint32_t mask,
+static int amdgpu_cgs_set_camera_voltages(struct cgs_device *cgs_device, uint32_t mask,
                                          const uint32_t *voltages)
 {
        DRM_ERROR("not implemented");
@@ -565,7 +565,7 @@ static const struct amdgpu_irq_src_funcs cgs_irq_funcs = {
        .process = cgs_process_irq,
 };
 
-static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id,
+static int amdgpu_cgs_add_irq_source(struct cgs_device *cgs_device, unsigned src_id,
                                     unsigned num_types,
                                     cgs_irq_source_set_func_t set,
                                     cgs_irq_handler_func_t handler,
@@ -600,19 +600,19 @@ static int amdgpu_cgs_add_irq_source(void *cgs_device, unsigned src_id,
        return ret;
 }
 
-static int amdgpu_cgs_irq_get(void *cgs_device, unsigned src_id, unsigned type)
+static int amdgpu_cgs_irq_get(struct cgs_device *cgs_device, unsigned src_id, unsigned type)
 {
        CGS_FUNC_ADEV;
        return amdgpu_irq_get(adev, adev->irq.sources[src_id], type);
 }
 
-static int amdgpu_cgs_irq_put(void *cgs_device, unsigned src_id, unsigned type)
+static int amdgpu_cgs_irq_put(struct cgs_device *cgs_device, unsigned src_id, unsigned type)
 {
        CGS_FUNC_ADEV;
        return amdgpu_irq_put(adev, adev->irq.sources[src_id], type);
 }
 
-int amdgpu_cgs_set_clockgating_state(void *cgs_device,
+int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,
                                  enum amd_ip_block_type block_type,
                                  enum amd_clockgating_state state)
 {
@@ -633,7 +633,7 @@ int amdgpu_cgs_set_clockgating_state(void *cgs_device,
        return r;
 }
 
-int amdgpu_cgs_set_powergating_state(void *cgs_device,
+int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device,
                                  enum amd_ip_block_type block_type,
                                  enum amd_powergating_state state)
 {
@@ -655,7 +655,7 @@ int amdgpu_cgs_set_powergating_state(void *cgs_device,
 }
 
 
-static uint32_t fw_type_convert(void *cgs_device, uint32_t fw_type)
+static uint32_t fw_type_convert(struct cgs_device *cgs_device, uint32_t fw_type)
 {
        CGS_FUNC_ADEV;
        enum AMDGPU_UCODE_ID result = AMDGPU_UCODE_ID_MAXIMUM;
@@ -681,9 +681,10 @@ static uint32_t fw_type_convert(void *cgs_device, uint32_t fw_type)
                result = AMDGPU_UCODE_ID_CP_MEC1;
                break;
        case CGS_UCODE_ID_CP_MEC_JT2:
-               if (adev->asic_type == CHIP_TONGA)
+               if (adev->asic_type == CHIP_TONGA || adev->asic_type == CHIP_POLARIS11
+                 || adev->asic_type == CHIP_POLARIS10)
                        result = AMDGPU_UCODE_ID_CP_MEC2;
-               else if (adev->asic_type == CHIP_CARRIZO)
+               else
                        result = AMDGPU_UCODE_ID_CP_MEC1;
                break;
        case CGS_UCODE_ID_RLC_G:
@@ -695,13 +696,13 @@ static uint32_t fw_type_convert(void *cgs_device, uint32_t fw_type)
        return result;
 }
 
-static int amdgpu_cgs_get_firmware_info(void *cgs_device,
+static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
                                        enum cgs_ucode_id type,
                                        struct cgs_firmware_info *info)
 {
        CGS_FUNC_ADEV;
 
-       if (CGS_UCODE_ID_SMU != type) {
+       if ((CGS_UCODE_ID_SMU != type) && (CGS_UCODE_ID_SMU_SK != type)) {
                uint64_t gpu_addr;
                uint32_t data_size;
                const struct gfx_firmware_header_v1_0 *header;
@@ -734,30 +735,44 @@ static int amdgpu_cgs_get_firmware_info(void *cgs_device,
                const uint8_t *src;
                const struct smc_firmware_header_v1_0 *hdr;
 
-               switch (adev->asic_type) {
-               case CHIP_TONGA:
-                       strcpy(fw_name, "amdgpu/tonga_smc.bin");
-                       break;
-               case CHIP_FIJI:
-                       strcpy(fw_name, "amdgpu/fiji_smc.bin");
-                       break;
-               default:
-                       DRM_ERROR("SMC firmware not supported\n");
-                       return -EINVAL;
-               }
+               if (!adev->pm.fw) {
+                       switch (adev->asic_type) {
+                       case CHIP_TONGA:
+                               strcpy(fw_name, "amdgpu/tonga_smc.bin");
+                               break;
+                       case CHIP_FIJI:
+                               strcpy(fw_name, "amdgpu/fiji_smc.bin");
+                               break;
+                       case CHIP_POLARIS11:
+                               if (type == CGS_UCODE_ID_SMU)
+                                       strcpy(fw_name, "amdgpu/polaris11_smc.bin");
+                               else if (type == CGS_UCODE_ID_SMU_SK)
+                                       strcpy(fw_name, "amdgpu/polaris11_smc_sk.bin");
+                               break;
+                       case CHIP_POLARIS10:
+                               if (type == CGS_UCODE_ID_SMU)
+                                       strcpy(fw_name, "amdgpu/polaris10_smc.bin");
+                               else if (type == CGS_UCODE_ID_SMU_SK)
+                                       strcpy(fw_name, "amdgpu/polaris10_smc_sk.bin");
+                               break;
+                       default:
+                               DRM_ERROR("SMC firmware not supported\n");
+                               return -EINVAL;
+                       }
 
-               err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
-               if (err) {
-                       DRM_ERROR("Failed to request firmware\n");
-                       return err;
-               }
+                       err = request_firmware(&adev->pm.fw, fw_name, adev->dev);
+                       if (err) {
+                               DRM_ERROR("Failed to request firmware\n");
+                               return err;
+                       }
 
-               err = amdgpu_ucode_validate(adev->pm.fw);
-               if (err) {
-                       DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
-                       release_firmware(adev->pm.fw);
-                       adev->pm.fw = NULL;
-                       return err;
+                       err = amdgpu_ucode_validate(adev->pm.fw);
+                       if (err) {
+                               DRM_ERROR("Failed to load firmware \"%s\"", fw_name);
+                               release_firmware(adev->pm.fw);
+                               adev->pm.fw = NULL;
+                               return err;
+                       }
                }
 
                hdr = (const struct smc_firmware_header_v1_0 *) adev->pm.fw->data;
@@ -774,7 +789,7 @@ static int amdgpu_cgs_get_firmware_info(void *cgs_device,
        return 0;
 }
 
-static int amdgpu_cgs_query_system_info(void *cgs_device,
+static int amdgpu_cgs_query_system_info(struct cgs_device *cgs_device,
                                struct cgs_system_info *sys_info)
 {
        CGS_FUNC_ADEV;
@@ -801,6 +816,9 @@ static int amdgpu_cgs_query_system_info(void *cgs_device,
        case CGS_SYSTEM_INFO_PG_FLAGS:
                sys_info->value = adev->pg_flags;
                break;
+       case CGS_SYSTEM_INFO_GFX_CU_INFO:
+               sys_info->value = adev->gfx.cu_info.number;
+               break;
        default:
                return -ENODEV;
        }
@@ -808,7 +826,7 @@ static int amdgpu_cgs_query_system_info(void *cgs_device,
        return 0;
 }
 
-static int amdgpu_cgs_get_active_displays_info(void *cgs_device,
+static int amdgpu_cgs_get_active_displays_info(struct cgs_device *cgs_device,
                                          struct cgs_display_info *info)
 {
        CGS_FUNC_ADEV;
@@ -851,7 +869,7 @@ static int amdgpu_cgs_get_active_displays_info(void *cgs_device,
 }
 
 
-static int amdgpu_cgs_notify_dpm_enabled(void *cgs_device, bool enabled)
+static int amdgpu_cgs_notify_dpm_enabled(struct cgs_device *cgs_device, bool enabled)
 {
        CGS_FUNC_ADEV;
 
@@ -867,7 +885,7 @@ static int amdgpu_cgs_notify_dpm_enabled(void *cgs_device, bool enabled)
  */
 
 #if defined(CONFIG_ACPI)
-static int amdgpu_cgs_acpi_eval_object(void *cgs_device,
+static int amdgpu_cgs_acpi_eval_object(struct cgs_device *cgs_device,
                                    struct cgs_acpi_method_info *info)
 {
        CGS_FUNC_ADEV;
@@ -1030,14 +1048,14 @@ error:
        return result;
 }
 #else
-static int amdgpu_cgs_acpi_eval_object(void *cgs_device,
+static int amdgpu_cgs_acpi_eval_object(struct cgs_device *cgs_device,
                                struct cgs_acpi_method_info *info)
 {
        return -EIO;
 }
 #endif
 
-int amdgpu_cgs_call_acpi_method(void *cgs_device,
+int amdgpu_cgs_call_acpi_method(struct cgs_device *cgs_device,
                                        uint32_t acpi_method,
                                        uint32_t acpi_function,
                                        void *pinput, void *poutput,
@@ -1121,7 +1139,7 @@ static const struct cgs_os_ops amdgpu_cgs_os_ops = {
        amdgpu_cgs_irq_put
 };
 
-void *amdgpu_cgs_create_device(struct amdgpu_device *adev)
+struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev)
 {
        struct amdgpu_cgs_device *cgs_device =
                kmalloc(sizeof(*cgs_device), GFP_KERNEL);
@@ -1135,10 +1153,10 @@ void *amdgpu_cgs_create_device(struct amdgpu_device *adev)
        cgs_device->base.os_ops = &amdgpu_cgs_os_ops;
        cgs_device->adev = adev;
 
-       return cgs_device;
+       return (struct cgs_device *)cgs_device;
 }
 
-void amdgpu_cgs_destroy_device(void *cgs_device)
+void amdgpu_cgs_destroy_device(struct cgs_device *cgs_device)
 {
        kfree(cgs_device);
 }
index 119cdc2c43e7cef7fadf72736100cfcef1e200cd..60a0c9ac11b223781414d1d2fffca795db4c680d 100644 (file)
@@ -439,7 +439,7 @@ static void amdgpu_connector_add_common_modes(struct drm_encoder *encoder,
        struct drm_display_mode *mode = NULL;
        struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
        int i;
-       struct mode_size {
+       static const struct mode_size {
                int w;
                int h;
        } common_modes[17] = {
index 9392e50a7ba48243ad0d26e3385e57f3603bdd83..9bc8f1d99733e6817ba35efe55e179aa8999e9f1 100644 (file)
@@ -24,7 +24,6 @@
  * Authors:
  *    Jerome Glisse <glisse@freedesktop.org>
  */
-#include <linux/list_sort.h>
 #include <linux/pagemap.h>
 #include <drm/drmP.h>
 #include <drm/amdgpu_drm.h>
@@ -88,44 +87,41 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
 }
 
 static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p,
-                                     struct amdgpu_user_fence *uf,
-                                     struct drm_amdgpu_cs_chunk_fence *fence_data)
+                                     struct drm_amdgpu_cs_chunk_fence *data,
+                                     uint32_t *offset)
 {
        struct drm_gem_object *gobj;
-       uint32_t handle;
 
-       handle = fence_data->handle;
-       gobj = drm_gem_object_lookup(p->adev->ddev, p->filp,
-                                    fence_data->handle);
+       gobj = drm_gem_object_lookup(p->filp, data->handle);
        if (gobj == NULL)
                return -EINVAL;
 
-       uf->bo = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
-       uf->offset = fence_data->offset;
-
-       if (amdgpu_ttm_tt_get_usermm(uf->bo->tbo.ttm)) {
-               drm_gem_object_unreference_unlocked(gobj);
-               return -EINVAL;
-       }
-
-       p->uf_entry.robj = amdgpu_bo_ref(uf->bo);
+       p->uf_entry.robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
        p->uf_entry.priority = 0;
        p->uf_entry.tv.bo = &p->uf_entry.robj->tbo;
        p->uf_entry.tv.shared = true;
        p->uf_entry.user_pages = NULL;
+       *offset = data->offset;
 
        drm_gem_object_unreference_unlocked(gobj);
+
+       if (amdgpu_ttm_tt_get_usermm(p->uf_entry.robj->tbo.ttm)) {
+               amdgpu_bo_unref(&p->uf_entry.robj);
+               return -EINVAL;
+       }
+
        return 0;
 }
 
 int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
 {
        struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
+       struct amdgpu_vm *vm = &fpriv->vm;
        union drm_amdgpu_cs *cs = data;
        uint64_t *chunk_array_user;
        uint64_t *chunk_array;
-       struct amdgpu_user_fence uf = {};
        unsigned size, num_ibs = 0;
+       uint32_t uf_offset = 0;
        int i;
        int ret;
 
@@ -200,7 +196,8 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
                                goto free_partial_kdata;
                        }
 
-                       ret = amdgpu_cs_user_fence_chunk(p, &uf, (void *)p->chunks[i].kdata);
+                       ret = amdgpu_cs_user_fence_chunk(p, p->chunks[i].kdata,
+                                                        &uf_offset);
                        if (ret)
                                goto free_partial_kdata;
 
@@ -215,11 +212,14 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
                }
        }
 
-       ret = amdgpu_job_alloc(p->adev, num_ibs, &p->job);
+       ret = amdgpu_job_alloc(p->adev, num_ibs, &p->job, vm);
        if (ret)
                goto free_all_kdata;
 
-       p->job->uf = uf;
+       if (p->uf_entry.robj) {
+               p->job->uf_bo = amdgpu_bo_ref(p->uf_entry.robj);
+               p->job->uf_offset = uf_offset;
+       }
 
        kfree(chunk_array);
        return 0;
@@ -377,7 +377,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
        INIT_LIST_HEAD(&duplicates);
        amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd);
 
-       if (p->job->uf.bo)
+       if (p->uf_entry.robj)
                list_add(&p->uf_entry.tv.head, &p->validated);
 
        if (need_mmap_lock)
@@ -473,6 +473,9 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
                goto error_validate;
 
        if (p->bo_list) {
+               struct amdgpu_bo *gds = p->bo_list->gds_obj;
+               struct amdgpu_bo *gws = p->bo_list->gws_obj;
+               struct amdgpu_bo *oa = p->bo_list->oa_obj;
                struct amdgpu_vm *vm = &fpriv->vm;
                unsigned i;
 
@@ -481,6 +484,19 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
 
                        p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo);
                }
+
+               if (gds) {
+                       p->job->gds_base = amdgpu_bo_gpu_offset(gds);
+                       p->job->gds_size = amdgpu_bo_size(gds);
+               }
+               if (gws) {
+                       p->job->gws_base = amdgpu_bo_gpu_offset(gws);
+                       p->job->gws_size = amdgpu_bo_size(gws);
+               }
+               if (oa) {
+                       p->job->oa_base = amdgpu_bo_gpu_offset(oa);
+                       p->job->oa_size = amdgpu_bo_size(oa);
+               }
        }
 
 error_validate:
@@ -527,16 +543,6 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
        return 0;
 }
 
-static int cmp_size_smaller_first(void *priv, struct list_head *a,
-                                 struct list_head *b)
-{
-       struct amdgpu_bo_list_entry *la = list_entry(a, struct amdgpu_bo_list_entry, tv.head);
-       struct amdgpu_bo_list_entry *lb = list_entry(b, struct amdgpu_bo_list_entry, tv.head);
-
-       /* Sort A before B if A is smaller. */
-       return (int)la->robj->tbo.num_pages - (int)lb->robj->tbo.num_pages;
-}
-
 /**
  * cs_parser_fini() - clean parser states
  * @parser:    parser structure holding parsing context.
@@ -553,18 +559,6 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo
        if (!error) {
                amdgpu_vm_move_pt_bos_in_lru(parser->adev, &fpriv->vm);
 
-               /* Sort the buffer list from the smallest to largest buffer,
-                * which affects the order of buffers in the LRU list.
-                * This assures that the smallest buffers are added first
-                * to the LRU list, so they are likely to be later evicted
-                * first, instead of large buffers whose eviction is more
-                * expensive.
-                *
-                * This slightly lowers the number of bytes moved by TTM
-                * per frame under memory pressure.
-                */
-               list_sort(NULL, &parser->validated, cmp_size_smaller_first);
-
                ttm_eu_fence_buffer_objects(&parser->ticket,
                                            &parser->validated,
                                            parser->fence);
@@ -763,41 +757,14 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
 
                ib->length_dw = chunk_ib->ib_bytes / 4;
                ib->flags = chunk_ib->flags;
-               ib->ctx = parser->ctx;
                j++;
        }
 
-       /* add GDS resources to first IB */
-       if (parser->bo_list) {
-               struct amdgpu_bo *gds = parser->bo_list->gds_obj;
-               struct amdgpu_bo *gws = parser->bo_list->gws_obj;
-               struct amdgpu_bo *oa = parser->bo_list->oa_obj;
-               struct amdgpu_ib *ib = &parser->job->ibs[0];
-
-               if (gds) {
-                       ib->gds_base = amdgpu_bo_gpu_offset(gds);
-                       ib->gds_size = amdgpu_bo_size(gds);
-               }
-               if (gws) {
-                       ib->gws_base = amdgpu_bo_gpu_offset(gws);
-                       ib->gws_size = amdgpu_bo_size(gws);
-               }
-               if (oa) {
-                       ib->oa_base = amdgpu_bo_gpu_offset(oa);
-                       ib->oa_size = amdgpu_bo_size(oa);
-               }
-       }
-       /* wrap the last IB with user fence */
-       if (parser->job->uf.bo) {
-               struct amdgpu_ib *ib = &parser->job->ibs[parser->job->num_ibs - 1];
-
-               /* UVD & VCE fw doesn't support user fences */
-               if (parser->job->ring->type == AMDGPU_RING_TYPE_UVD ||
-                   parser->job->ring->type == AMDGPU_RING_TYPE_VCE)
-                       return -EINVAL;
-
-               ib->user = &parser->job->uf;
-       }
+       /* UVD & VCE fw doesn't support user fences */
+       if (parser->job->uf_bo && (
+           parser->job->ring->type == AMDGPU_RING_TYPE_UVD ||
+           parser->job->ring->type == AMDGPU_RING_TYPE_VCE))
+               return -EINVAL;
 
        return 0;
 }
@@ -862,28 +829,28 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
                            union drm_amdgpu_cs *cs)
 {
        struct amdgpu_ring *ring = p->job->ring;
-       struct amd_sched_fence *fence;
+       struct amd_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
+       struct fence *fence;
        struct amdgpu_job *job;
+       int r;
 
        job = p->job;
        p->job = NULL;
 
-       job->base.sched = &ring->sched;
-       job->base.s_entity = &p->ctx->rings[ring->idx].entity;
-       job->owner = p->filp;
-
-       fence = amd_sched_fence_create(job->base.s_entity, p->filp);
-       if (!fence) {
+       r = amd_sched_job_init(&job->base, &ring->sched,
+                              entity, amdgpu_job_timeout_func,
+                              amdgpu_job_free_func,
+                              p->filp, &fence);
+       if (r) {
                amdgpu_job_free(job);
-               return -ENOMEM;
+               return r;
        }
 
-       job->base.s_fence = fence;
-       p->fence = fence_get(&fence->base);
-
-       cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring,
-                                             &fence->base);
-       job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
+       job->owner = p->filp;
+       job->ctx = entity->fence_context;
+       p->fence = fence_get(fence);
+       cs->out.handle = amdgpu_ctx_add_fence(p->ctx, ring, fence);
+       job->uf_sequence = cs->out.handle;
 
        trace_amdgpu_cs_ioctl(job);
        amd_sched_entity_push_job(&job->base);
index 2139da773da68d410f4310a321d73634166d89d2..bb8b149786d708de30a0143bb273f6be8af0390b 100644 (file)
@@ -59,6 +59,8 @@ static const char *amdgpu_asic_name[] = {
        "FIJI",
        "CARRIZO",
        "STONEY",
+       "POLARIS10",
+       "POLARIS11",
        "LAST",
 };
 
@@ -346,7 +348,7 @@ static int amdgpu_doorbell_init(struct amdgpu_device *adev)
        adev->doorbell.base = pci_resource_start(adev->pdev, 2);
        adev->doorbell.size = pci_resource_len(adev->pdev, 2);
 
-       adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32), 
+       adev->doorbell.num_doorbells = min_t(u32, adev->doorbell.size / sizeof(u32),
                                             AMDGPU_DOORBELL_MAX_ASSIGNMENT+1);
        if (adev->doorbell.num_doorbells == 0)
                return -EINVAL;
@@ -936,15 +938,11 @@ static void amdgpu_check_arguments(struct amdgpu_device *adev)
        }
 
        if (amdgpu_gart_size != -1) {
-               /* gtt size must be power of two and greater or equal to 32M */
+               /* gtt size must be greater or equal to 32M */
                if (amdgpu_gart_size < 32) {
                        dev_warn(adev->dev, "gart size (%d) too small\n",
                                 amdgpu_gart_size);
                        amdgpu_gart_size = -1;
-               } else if (!amdgpu_check_pot_argument(amdgpu_gart_size)) {
-                       dev_warn(adev->dev, "gart size (%d) must be a power of 2\n",
-                                amdgpu_gart_size);
-                       amdgpu_gart_size = -1;
                }
        }
 
@@ -1144,6 +1142,8 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
        case CHIP_TOPAZ:
        case CHIP_TONGA:
        case CHIP_FIJI:
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS10:
        case CHIP_CARRIZO:
        case CHIP_STONEY:
                if (adev->asic_type == CHIP_CARRIZO || adev->asic_type == CHIP_STONEY)
@@ -1196,7 +1196,7 @@ static int amdgpu_early_init(struct amdgpu_device *adev)
                                if (r == -ENOENT) {
                                        adev->ip_block_status[i].valid = false;
                                } else if (r) {
-                                       DRM_ERROR("early_init %d failed %d\n", i, r);
+                                       DRM_ERROR("early_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                                        return r;
                                } else {
                                        adev->ip_block_status[i].valid = true;
@@ -1219,7 +1219,7 @@ static int amdgpu_init(struct amdgpu_device *adev)
                        continue;
                r = adev->ip_blocks[i].funcs->sw_init((void *)adev);
                if (r) {
-                       DRM_ERROR("sw_init %d failed %d\n", i, r);
+                       DRM_ERROR("sw_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                        return r;
                }
                adev->ip_block_status[i].sw = true;
@@ -1252,7 +1252,7 @@ static int amdgpu_init(struct amdgpu_device *adev)
                        continue;
                r = adev->ip_blocks[i].funcs->hw_init((void *)adev);
                if (r) {
-                       DRM_ERROR("hw_init %d failed %d\n", i, r);
+                       DRM_ERROR("hw_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                        return r;
                }
                adev->ip_block_status[i].hw = true;
@@ -1272,13 +1272,13 @@ static int amdgpu_late_init(struct amdgpu_device *adev)
                r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
                                                                    AMD_CG_STATE_GATE);
                if (r) {
-                       DRM_ERROR("set_clockgating_state(gate) %d failed %d\n", i, r);
+                       DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                        return r;
                }
                if (adev->ip_blocks[i].funcs->late_init) {
                        r = adev->ip_blocks[i].funcs->late_init((void *)adev);
                        if (r) {
-                               DRM_ERROR("late_init %d failed %d\n", i, r);
+                               DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                                return r;
                        }
                }
@@ -1302,13 +1302,13 @@ static int amdgpu_fini(struct amdgpu_device *adev)
                r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
                                                                    AMD_CG_STATE_UNGATE);
                if (r) {
-                       DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r);
+                       DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                        return r;
                }
                r = adev->ip_blocks[i].funcs->hw_fini((void *)adev);
                /* XXX handle errors */
                if (r) {
-                       DRM_DEBUG("hw_fini %d failed %d\n", i, r);
+                       DRM_DEBUG("hw_fini of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                }
                adev->ip_block_status[i].hw = false;
        }
@@ -1319,7 +1319,7 @@ static int amdgpu_fini(struct amdgpu_device *adev)
                r = adev->ip_blocks[i].funcs->sw_fini((void *)adev);
                /* XXX handle errors */
                if (r) {
-                       DRM_DEBUG("sw_fini %d failed %d\n", i, r);
+                       DRM_DEBUG("sw_fini of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                }
                adev->ip_block_status[i].sw = false;
                adev->ip_block_status[i].valid = false;
@@ -1332,20 +1332,29 @@ static int amdgpu_suspend(struct amdgpu_device *adev)
 {
        int i, r;
 
+       /* ungate SMC block first */
+       r = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_SMC,
+                                        AMD_CG_STATE_UNGATE);
+       if (r) {
+               DRM_ERROR("set_clockgating_state(ungate) SMC failed %d\n",r);
+       }
+
        for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
                if (!adev->ip_block_status[i].valid)
                        continue;
                /* ungate blocks so that suspend can properly shut them down */
-               r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
-                                                                   AMD_CG_STATE_UNGATE);
-               if (r) {
-                       DRM_ERROR("set_clockgating_state(ungate) %d failed %d\n", i, r);
+               if (i != AMD_IP_BLOCK_TYPE_SMC) {
+                       r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev,
+                                                                           AMD_CG_STATE_UNGATE);
+                       if (r) {
+                               DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
+                       }
                }
                /* XXX handle errors */
                r = adev->ip_blocks[i].funcs->suspend(adev);
                /* XXX handle errors */
                if (r) {
-                       DRM_ERROR("suspend %d failed %d\n", i, r);
+                       DRM_ERROR("suspend of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                }
        }
 
@@ -1361,7 +1370,7 @@ static int amdgpu_resume(struct amdgpu_device *adev)
                        continue;
                r = adev->ip_blocks[i].funcs->resume(adev);
                if (r) {
-                       DRM_ERROR("resume %d failed %d\n", i, r);
+                       DRM_ERROR("resume of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r);
                        return r;
                }
        }
@@ -2007,7 +2016,7 @@ void amdgpu_get_pcie_info(struct amdgpu_device *adev)
  * Debugfs
  */
 int amdgpu_debugfs_add_files(struct amdgpu_device *adev,
-                            struct drm_info_list *files,
+                            const struct drm_info_list *files,
                             unsigned nfiles)
 {
        unsigned i;
@@ -2119,32 +2128,246 @@ static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
        return result;
 }
 
+static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
+                                       size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               value = RREG32_PCIE(*pos >> 2);
+               r = put_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
+static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
+                                        size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               r = get_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               WREG32_PCIE(*pos >> 2, value);
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
+static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
+                                       size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               value = RREG32_DIDT(*pos >> 2);
+               r = put_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
+static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
+                                        size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               r = get_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               WREG32_DIDT(*pos >> 2, value);
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
+static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
+                                       size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               value = RREG32_SMC(*pos >> 2);
+               r = put_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
+static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
+                                        size_t size, loff_t *pos)
+{
+       struct amdgpu_device *adev = f->f_inode->i_private;
+       ssize_t result = 0;
+       int r;
+
+       if (size & 0x3 || *pos & 0x3)
+               return -EINVAL;
+
+       while (size) {
+               uint32_t value;
+
+               r = get_user(value, (uint32_t *)buf);
+               if (r)
+                       return r;
+
+               WREG32_SMC(*pos >> 2, value);
+
+               result += 4;
+               buf += 4;
+               *pos += 4;
+               size -= 4;
+       }
+
+       return result;
+}
+
 static const struct file_operations amdgpu_debugfs_regs_fops = {
        .owner = THIS_MODULE,
        .read = amdgpu_debugfs_regs_read,
        .write = amdgpu_debugfs_regs_write,
        .llseek = default_llseek
 };
+static const struct file_operations amdgpu_debugfs_regs_didt_fops = {
+       .owner = THIS_MODULE,
+       .read = amdgpu_debugfs_regs_didt_read,
+       .write = amdgpu_debugfs_regs_didt_write,
+       .llseek = default_llseek
+};
+static const struct file_operations amdgpu_debugfs_regs_pcie_fops = {
+       .owner = THIS_MODULE,
+       .read = amdgpu_debugfs_regs_pcie_read,
+       .write = amdgpu_debugfs_regs_pcie_write,
+       .llseek = default_llseek
+};
+static const struct file_operations amdgpu_debugfs_regs_smc_fops = {
+       .owner = THIS_MODULE,
+       .read = amdgpu_debugfs_regs_smc_read,
+       .write = amdgpu_debugfs_regs_smc_write,
+       .llseek = default_llseek
+};
+
+static const struct file_operations *debugfs_regs[] = {
+       &amdgpu_debugfs_regs_fops,
+       &amdgpu_debugfs_regs_didt_fops,
+       &amdgpu_debugfs_regs_pcie_fops,
+       &amdgpu_debugfs_regs_smc_fops,
+};
+
+static const char *debugfs_regs_names[] = {
+       "amdgpu_regs",
+       "amdgpu_regs_didt",
+       "amdgpu_regs_pcie",
+       "amdgpu_regs_smc",
+};
 
 static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
 {
        struct drm_minor *minor = adev->ddev->primary;
        struct dentry *ent, *root = minor->debugfs_root;
+       unsigned i, j;
+
+       for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
+               ent = debugfs_create_file(debugfs_regs_names[i],
+                                         S_IFREG | S_IRUGO, root,
+                                         adev, debugfs_regs[i]);
+               if (IS_ERR(ent)) {
+                       for (j = 0; j < i; j++) {
+                               debugfs_remove(adev->debugfs_regs[i]);
+                               adev->debugfs_regs[i] = NULL;
+                       }
+                       return PTR_ERR(ent);
+               }
 
-       ent = debugfs_create_file("amdgpu_regs", S_IFREG | S_IRUGO, root,
-                                 adev, &amdgpu_debugfs_regs_fops);
-       if (IS_ERR(ent))
-               return PTR_ERR(ent);
-       i_size_write(ent->d_inode, adev->rmmio_size);
-       adev->debugfs_regs = ent;
+               if (!i)
+                       i_size_write(ent->d_inode, adev->rmmio_size);
+               adev->debugfs_regs[i] = ent;
+       }
 
        return 0;
 }
 
 static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev)
 {
-       debugfs_remove(adev->debugfs_regs);
-       adev->debugfs_regs = NULL;
+       unsigned i;
+
+       for (i = 0; i < ARRAY_SIZE(debugfs_regs); i++) {
+               if (adev->debugfs_regs[i]) {
+                       debugfs_remove(adev->debugfs_regs[i]);
+                       adev->debugfs_regs[i] = NULL;
+               }
+       }
 }
 
 int amdgpu_debugfs_init(struct drm_minor *minor)
index 3fb405b3a61457e4622dfe4b788ac3925d088f4a..b0832da2ef7e463ab8fe1c15d3234dcc657d14a7 100644 (file)
@@ -131,12 +131,17 @@ static void amdgpu_flip_work_func(struct work_struct *__work)
                                 vblank->framedur_ns / 1000,
                                 vblank->linedur_ns / 1000, stat, vpos, hpos);
 
-       /* set the flip status */
+       /* Do the flip (mmio) */
+       adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base, work->async);
+
+       /* Set the flip status */
        amdgpuCrtc->pflip_status = AMDGPU_FLIP_SUBMITTED;
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
 
-       /* Do the flip (mmio) */
-       adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base);
+
+       DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_SUBMITTED, work: %p,\n",
+                                        amdgpuCrtc->crtc_id, amdgpuCrtc, work);
+
 }
 
 /*
@@ -192,6 +197,7 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
        work->event = event;
        work->adev = adev;
        work->crtc_id = amdgpu_crtc->crtc_id;
+       work->async = (page_flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0;
 
        /* schedule unpin of the old buffer */
        old_amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb);
@@ -252,6 +258,9 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc,
        amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING;
        amdgpu_crtc->pflip_works = work;
 
+
+       DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
+                                        amdgpu_crtc->crtc_id, amdgpu_crtc, work);
        /* update crtc fb */
        crtc->primary->fb = fb;
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
@@ -554,7 +563,7 @@ amdgpu_user_framebuffer_create(struct drm_device *dev,
        struct amdgpu_framebuffer *amdgpu_fb;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (obj ==  NULL) {
                dev_err(&dev->pdev->dev, "No GEM object associated to handle 0x%08X, "
                        "can't create framebuffer\n", mode_cmd->handles[0]);
@@ -588,20 +597,20 @@ const struct drm_mode_config_funcs amdgpu_mode_funcs = {
        .output_poll_changed = amdgpu_output_poll_changed
 };
 
-static struct drm_prop_enum_list amdgpu_underscan_enum_list[] =
+static const struct drm_prop_enum_list amdgpu_underscan_enum_list[] =
 {      { UNDERSCAN_OFF, "off" },
        { UNDERSCAN_ON, "on" },
        { UNDERSCAN_AUTO, "auto" },
 };
 
-static struct drm_prop_enum_list amdgpu_audio_enum_list[] =
+static const struct drm_prop_enum_list amdgpu_audio_enum_list[] =
 {      { AMDGPU_AUDIO_DISABLE, "off" },
        { AMDGPU_AUDIO_ENABLE, "on" },
        { AMDGPU_AUDIO_AUTO, "auto" },
 };
 
 /* XXX support different dither options? spatial, temporal, both, etc. */
-static struct drm_prop_enum_list amdgpu_dither_enum_list[] =
+static const struct drm_prop_enum_list amdgpu_dither_enum_list[] =
 {      { AMDGPU_FMT_DITHER_DISABLE, "off" },
        { AMDGPU_FMT_DITHER_ENABLE, "on" },
 };
index 7b7f4aba60c0363e2682a9f674661f5fc6cf420f..fe36caf1b7d7b084762d19fb7fa6516a42dd3fa3 100644 (file)
@@ -150,7 +150,7 @@ u32 amdgpu_dpm_get_vrefresh(struct amdgpu_device *adev)
                list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                        amdgpu_crtc = to_amdgpu_crtc(crtc);
                        if (crtc->enabled && amdgpu_crtc->enabled && amdgpu_crtc->hw_mode.clock) {
-                               vrefresh = amdgpu_crtc->hw_mode.vrefresh;
+                               vrefresh = drm_mode_vrefresh(&amdgpu_crtc->hw_mode);
                                break;
                        }
                }
index f1e17d60055a4b3c9cbcb2982d5d0e2227506bd8..1dab5f2b725bb42d5792869239774ffef1f48427 100644 (file)
@@ -166,7 +166,7 @@ module_param_named(pcie_gen_cap, amdgpu_pcie_gen_cap, uint, 0444);
 MODULE_PARM_DESC(pcie_lane_cap, "PCIE Lane Caps (0: autodetect (default))");
 module_param_named(pcie_lane_cap, amdgpu_pcie_lane_cap, uint, 0444);
 
-static struct pci_device_id pciidlist[] = {
+static const struct pci_device_id pciidlist[] = {
 #ifdef CONFIG_DRM_AMDGPU_CIK
        /* Kaveri */
        {0x1002, 0x1304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KAVERI|AMD_IS_MOBILITY|AMD_IS_APU},
@@ -277,6 +277,16 @@ static struct pci_device_id pciidlist[] = {
        {0x1002, 0x9877, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
        /* stoney */
        {0x1002, 0x98E4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_STONEY|AMD_IS_APU},
+       /* Polaris11 */
+       {0x1002, 0x67E0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       {0x1002, 0x67E1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       {0x1002, 0x67E8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       {0x1002, 0x67E9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       {0x1002, 0x67EB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       {0x1002, 0x67FF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS11},
+       /* Polaris10 */
+       {0x1002, 0x67C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
+       {0x1002, 0x67DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_POLARIS10},
 
        {0, 0, 0}
 };
@@ -514,7 +524,7 @@ static struct drm_driver kms_driver = {
        .irq_uninstall = amdgpu_irq_uninstall,
        .irq_handler = amdgpu_irq_handler,
        .ioctls = amdgpu_ioctls_kms,
-       .gem_free_object = amdgpu_gem_object_free,
+       .gem_free_object_unlocked = amdgpu_gem_object_free,
        .gem_open_object = amdgpu_gem_object_open,
        .gem_close_object = amdgpu_gem_object_close,
        .dumb_create = amdgpu_mode_dumb_create,
@@ -556,12 +566,10 @@ static struct pci_driver amdgpu_kms_pci_driver = {
 static int __init amdgpu_init(void)
 {
        amdgpu_sync_init();
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force()) {
                DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
                return -EINVAL;
        }
-#endif
        DRM_INFO("amdgpu kernel modesetting enabled.\n");
        driver = &kms_driver;
        pdriver = &amdgpu_kms_pci_driver;
index d81f1f4883a6c4b1adff92ba0c32b52f1999b2fd..ba9c04283d01146dac368ba49e1e9ca1a1661e5a 100644 (file)
@@ -198,7 +198,7 @@ void amdgpu_fence_process(struct amdgpu_ring *ring)
 
                /* There is always exactly one thread signaling this fence slot */
                fence = rcu_dereference_protected(*ptr, 1);
-               rcu_assign_pointer(*ptr, NULL);
+               RCU_INIT_POINTER(*ptr, NULL);
 
                BUG_ON(!fence);
 
@@ -352,9 +352,9 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
        setup_timer(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback,
                    (unsigned long)ring);
 
-       ring->fence_drv.num_fences_mask = num_hw_submission - 1;
+       ring->fence_drv.num_fences_mask = num_hw_submission * 2 - 1;
        spin_lock_init(&ring->fence_drv.lock);
-       ring->fence_drv.fences = kcalloc(num_hw_submission, sizeof(void *),
+       ring->fence_drv.fences = kcalloc(num_hw_submission * 2, sizeof(void *),
                                         GFP_KERNEL);
        if (!ring->fence_drv.fences)
                return -ENOMEM;
@@ -639,7 +639,7 @@ static int amdgpu_debugfs_gpu_reset(struct seq_file *m, void *data)
        return 0;
 }
 
-static struct drm_info_list amdgpu_debugfs_fence_list[] = {
+static const struct drm_info_list amdgpu_debugfs_fence_list[] = {
        {"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL},
        {"amdgpu_gpu_reset", &amdgpu_debugfs_gpu_reset, 0, NULL}
 };
index 7312d729d30013d3e741f3dbda39f58f7d8d6357..921bce2df0b07cced181e9cb68693f989b7839fa 100644 (file)
@@ -238,18 +238,17 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, unsigned offset,
        t = offset / AMDGPU_GPU_PAGE_SIZE;
        p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
        for (i = 0; i < pages; i++, p++) {
-               if (adev->gart.pages[p]) {
-                       adev->gart.pages[p] = NULL;
-                       adev->gart.pages_addr[p] = adev->dummy_page.addr;
-                       page_base = adev->gart.pages_addr[p];
-                       if (!adev->gart.ptr)
-                               continue;
+#ifdef CONFIG_AMDGPU_GART_DEBUGFS
+               adev->gart.pages[p] = NULL;
+#endif
+               page_base = adev->dummy_page.addr;
+               if (!adev->gart.ptr)
+                       continue;
 
-                       for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
-                               amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
-                                                       t, page_base, flags);
-                               page_base += AMDGPU_GPU_PAGE_SIZE;
-                       }
+               for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
+                       amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
+                                               t, page_base, flags);
+                       page_base += AMDGPU_GPU_PAGE_SIZE;
                }
        }
        mb();
@@ -287,10 +286,11 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
        p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
 
        for (i = 0; i < pages; i++, p++) {
-               adev->gart.pages_addr[p] = dma_addr[i];
+#ifdef CONFIG_AMDGPU_GART_DEBUGFS
                adev->gart.pages[p] = pagelist[i];
+#endif
                if (adev->gart.ptr) {
-                       page_base = adev->gart.pages_addr[p];
+                       page_base = dma_addr[i];
                        for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
                                amdgpu_gart_set_pte_pde(adev, adev->gart.ptr, t, page_base, flags);
                                page_base += AMDGPU_GPU_PAGE_SIZE;
@@ -312,11 +312,11 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
  */
 int amdgpu_gart_init(struct amdgpu_device *adev)
 {
-       int r, i;
+       int r;
 
-       if (adev->gart.pages) {
+       if (adev->dummy_page.page)
                return 0;
-       }
+
        /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */
        if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) {
                DRM_ERROR("Page size is smaller than GPU page size!\n");
@@ -330,22 +330,16 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
        adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE;
        DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
                 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages);
+
+#ifdef CONFIG_AMDGPU_GART_DEBUGFS
        /* Allocate pages table */
        adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
        if (adev->gart.pages == NULL) {
                amdgpu_gart_fini(adev);
                return -ENOMEM;
        }
-       adev->gart.pages_addr = vzalloc(sizeof(dma_addr_t) *
-                                       adev->gart.num_cpu_pages);
-       if (adev->gart.pages_addr == NULL) {
-               amdgpu_gart_fini(adev);
-               return -ENOMEM;
-       }
-       /* set GART entry to point to the dummy page by default */
-       for (i = 0; i < adev->gart.num_cpu_pages; i++) {
-               adev->gart.pages_addr[i] = adev->dummy_page.addr;
-       }
+#endif
+
        return 0;
 }
 
@@ -358,15 +352,14 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
  */
 void amdgpu_gart_fini(struct amdgpu_device *adev)
 {
-       if (adev->gart.pages && adev->gart.pages_addr && adev->gart.ready) {
+       if (adev->gart.ready) {
                /* unbind pages */
                amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
        }
        adev->gart.ready = false;
+#ifdef CONFIG_AMDGPU_GART_DEBUGFS
        vfree(adev->gart.pages);
-       vfree(adev->gart.pages_addr);
        adev->gart.pages = NULL;
-       adev->gart.pages_addr = NULL;
-
+#endif
        amdgpu_dummy_page_fini(adev);
 }
index c3f4e85594fff9f33660f7f1cd4f51bce5d29cf7..503d540981283b38e0c9cb41027a7a6ec3502cda 100644 (file)
@@ -43,7 +43,7 @@ struct amdgpu_ring;
 struct amdgpu_bo;
 
 struct amdgpu_gds_asic_info {
-       uint32_t        total_size;
+       uint32_t        total_size;
        uint32_t        gfx_partition_size;
        uint32_t        cs_partition_size;
 };
@@ -52,8 +52,8 @@ struct amdgpu_gds {
        struct amdgpu_gds_asic_info     mem;
        struct amdgpu_gds_asic_info     gws;
        struct amdgpu_gds_asic_info     oa;
-       /* At present, GDS, GWS and OA resources for gfx (graphics) 
-        * is always pre-allocated and available for graphics operation. 
+       /* At present, GDS, GWS and OA resources for gfx (graphics)
+        * is always pre-allocated and available for graphics operation.
         * Such resource is shared between all gfx clients.
         * TODO: move this operation to user space
         * */
index fa6a27bff298b7ad11649f5a790b131c478702e0..8fab6486064f507c219872851ef4cd6a7fe98e10 100644 (file)
@@ -93,7 +93,7 @@ void amdgpu_gem_force_release(struct amdgpu_device *adev)
        struct drm_device *ddev = adev->ddev;
        struct drm_file *file;
 
-       mutex_lock(&ddev->struct_mutex);
+       mutex_lock(&ddev->filelist_mutex);
 
        list_for_each_entry(file, &ddev->filelist, lhead) {
                struct drm_gem_object *gobj;
@@ -103,13 +103,13 @@ void amdgpu_gem_force_release(struct amdgpu_device *adev)
                spin_lock(&file->table_lock);
                idr_for_each_entry(&file->object_idr, gobj, handle) {
                        WARN_ONCE(1, "And also active allocations!\n");
-                       drm_gem_object_unreference(gobj);
+                       drm_gem_object_unreference_unlocked(gobj);
                }
                idr_destroy(&file->object_idr);
                spin_unlock(&file->table_lock);
        }
 
-       mutex_unlock(&ddev->struct_mutex);
+       mutex_unlock(&ddev->filelist_mutex);
 }
 
 /*
@@ -338,7 +338,7 @@ int amdgpu_mode_dumb_mmap(struct drm_file *filp,
        struct drm_gem_object *gobj;
        struct amdgpu_bo *robj;
 
-       gobj = drm_gem_object_lookup(dev, filp, handle);
+       gobj = drm_gem_object_lookup(filp, handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -402,7 +402,7 @@ int amdgpu_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
        int r = 0;
        long ret;
 
-       gobj = drm_gem_object_lookup(dev, filp, handle);
+       gobj = drm_gem_object_lookup(filp, handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -436,7 +436,7 @@ int amdgpu_gem_metadata_ioctl(struct drm_device *dev, void *data,
        int r = -1;
 
        DRM_DEBUG("%d \n", args->handle);
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL)
                return -ENOENT;
        robj = gem_to_amdgpu_bo(gobj);
@@ -584,7 +584,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL)
                return -ENOENT;
        rbo = gem_to_amdgpu_bo(gobj);
@@ -646,7 +646,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
        struct amdgpu_bo *robj;
        int r;
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -769,7 +769,7 @@ static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
        struct drm_file *file;
        int r;
 
-       r = mutex_lock_interruptible(&dev->struct_mutex);
+       r = mutex_lock_interruptible(&dev->filelist_mutex);
        if (r)
                return r;
 
@@ -793,11 +793,11 @@ static int amdgpu_debugfs_gem_info(struct seq_file *m, void *data)
                spin_unlock(&file->table_lock);
        }
 
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->filelist_mutex);
        return 0;
 }
 
-static struct drm_info_list amdgpu_debugfs_gem_list[] = {
+static const struct drm_info_list amdgpu_debugfs_gem_list[] = {
        {"amdgpu_gem_info", &amdgpu_debugfs_gem_info, 0, NULL},
 };
 #endif
index 8443cea6821ad00cad2181d16ac450b8045223ec..34e35423b78e81d3d91102e2acacf889fa9792c0 100644 (file)
@@ -74,9 +74,6 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
                        ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo);
        }
 
-       ib->vm = vm;
-       ib->vm_id = 0;
-
        return 0;
 }
 
@@ -89,7 +86,8 @@ int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm,
  *
  * Free an IB (all asics).
  */
-void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fence *f)
+void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,
+                   struct fence *f)
 {
        amdgpu_sa_bo_free(adev, &ib->sa_bo, f);
 }
@@ -117,28 +115,37 @@ void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib, struct fen
  */
 int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
                       struct amdgpu_ib *ibs, struct fence *last_vm_update,
-                      struct fence **f)
+                      struct amdgpu_job *job, struct fence **f)
 {
        struct amdgpu_device *adev = ring->adev;
        struct amdgpu_ib *ib = &ibs[0];
-       struct amdgpu_ctx *ctx, *old_ctx;
+       bool skip_preamble, need_ctx_switch;
+       unsigned patch_offset = ~0;
        struct amdgpu_vm *vm;
        struct fence *hwf;
+       uint64_t ctx;
+
        unsigned i;
        int r = 0;
 
        if (num_ibs == 0)
                return -EINVAL;
 
-       ctx = ibs->ctx;
-       vm = ibs->vm;
+       /* ring tests don't use a job */
+       if (job) {
+               vm = job->vm;
+               ctx = job->ctx;
+       } else {
+               vm = NULL;
+               ctx = 0;
+       }
 
        if (!ring->ready) {
                dev_err(adev->dev, "couldn't schedule ib\n");
                return -EINVAL;
        }
 
-       if (vm && !ibs->vm_id) {
+       if (vm && !job->vm_id) {
                dev_err(adev->dev, "VM IB without ID\n");
                return -EINVAL;
        }
@@ -149,58 +156,68 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,
                return r;
        }
 
+       if (ring->type == AMDGPU_RING_TYPE_SDMA && ring->funcs->init_cond_exec)
+               patch_offset = amdgpu_ring_init_cond_exec(ring);
+
        if (vm) {
-               /* do context switch */
-               amdgpu_vm_flush(ring, ib->vm_id, ib->vm_pd_addr,
-                               ib->gds_base, ib->gds_size,
-                               ib->gws_base, ib->gws_size,
-                               ib->oa_base, ib->oa_size);
-
-               if (ring->funcs->emit_hdp_flush)
-                       amdgpu_ring_emit_hdp_flush(ring);
+               r = amdgpu_vm_flush(ring, job->vm_id, job->vm_pd_addr,
+                                   job->gds_base, job->gds_size,
+                                   job->gws_base, job->gws_size,
+                                   job->oa_base, job->oa_size);
+               if (r) {
+                       amdgpu_ring_undo(ring);
+                       return r;
+               }
        }
 
-       old_ctx = ring->current_ctx;
+       if (ring->funcs->emit_hdp_flush)
+               amdgpu_ring_emit_hdp_flush(ring);
+
+       /* always set cond_exec_polling to CONTINUE */
+       *ring->cond_exe_cpu_addr = 1;
+
+       skip_preamble = ring->current_ctx == ctx;
+       need_ctx_switch = ring->current_ctx != ctx;
        for (i = 0; i < num_ibs; ++i) {
                ib = &ibs[i];
 
-               if (ib->ctx != ctx || ib->vm != vm) {
-                       ring->current_ctx = old_ctx;
-                       if (ib->vm_id)
-                               amdgpu_vm_reset_id(adev, ib->vm_id);
-                       amdgpu_ring_undo(ring);
-                       return -EINVAL;
-               }
-               amdgpu_ring_emit_ib(ring, ib);
-               ring->current_ctx = ctx;
-       }
+               /* drop preamble IBs if we don't have a context switch */
+               if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && skip_preamble)
+                       continue;
 
-       if (vm) {
-               if (ring->funcs->emit_hdp_invalidate)
-                       amdgpu_ring_emit_hdp_invalidate(ring);
+               amdgpu_ring_emit_ib(ring, ib, job ? job->vm_id : 0,
+                                   need_ctx_switch);
+               need_ctx_switch = false;
        }
 
+       if (ring->funcs->emit_hdp_invalidate)
+               amdgpu_ring_emit_hdp_invalidate(ring);
+
        r = amdgpu_fence_emit(ring, &hwf);
        if (r) {
                dev_err(adev->dev, "failed to emit fence (%d)\n", r);
-               ring->current_ctx = old_ctx;
-               if (ib->vm_id)
-                       amdgpu_vm_reset_id(adev, ib->vm_id);
+               if (job && job->vm_id)
+                       amdgpu_vm_reset_id(adev, job->vm_id);
                amdgpu_ring_undo(ring);
                return r;
        }
 
        /* wrap the last IB with fence */
-       if (ib->user) {
-               uint64_t addr = amdgpu_bo_gpu_offset(ib->user->bo);
-               addr += ib->user->offset;
-               amdgpu_ring_emit_fence(ring, addr, ib->sequence,
+       if (job && job->uf_bo) {
+               uint64_t addr = amdgpu_bo_gpu_offset(job->uf_bo);
+
+               addr += job->uf_offset;
+               amdgpu_ring_emit_fence(ring, addr, job->uf_sequence,
                                       AMDGPU_FENCE_FLAG_64BIT);
        }
 
        if (f)
                *f = fence_get(hwf);
 
+       if (patch_offset != ~0 && ring->funcs->patch_cond_exec)
+               amdgpu_ring_patch_cond_exec(ring, patch_offset);
+
+       ring->current_ctx = ctx;
        amdgpu_ring_commit(ring);
        return 0;
 }
@@ -315,7 +332,7 @@ static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)
 
 }
 
-static struct drm_info_list amdgpu_debugfs_sa_list[] = {
+static const struct drm_info_list amdgpu_debugfs_sa_list[] = {
        {"amdgpu_sa_info", &amdgpu_debugfs_sa_info, 0, NULL},
 };
 
index 762cfdb85147471855418fff997877951d4aca6d..835a3fa8d8dfde320d73ba3af8f8fa306bd758e1 100644 (file)
@@ -219,7 +219,6 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
        if (r) {
                return r;
        }
-       adev->ddev->vblank_disable_allowed = true;
 
        /* enable msi */
        adev->irq.msi_enabled = false;
@@ -498,7 +497,7 @@ static int amdgpu_irqdomain_map(struct irq_domain *d,
        return 0;
 }
 
-static struct irq_domain_ops amdgpu_hw_irqdomain_ops = {
+static const struct irq_domain_ops amdgpu_hw_irqdomain_ops = {
        .map = amdgpu_irqdomain_map,
 };
 
index 9c9b19e2f353b4f1d52a405164038078262c74f7..f0dafa514fe48f785b5dbf53cc3367e214732414 100644 (file)
 #include "amdgpu.h"
 #include "amdgpu_trace.h"
 
+static void amdgpu_job_free_handler(struct work_struct *ws)
+{
+       struct amdgpu_job *job = container_of(ws, struct amdgpu_job, base.work_free_job);
+       amd_sched_job_put(&job->base);
+}
+
+void amdgpu_job_timeout_func(struct work_struct *work)
+{
+       struct amdgpu_job *job = container_of(work, struct amdgpu_job, base.work_tdr.work);
+       DRM_ERROR("ring %s timeout, last signaled seq=%u, last emitted seq=%u\n",
+                               job->base.sched->name,
+                               (uint32_t)atomic_read(&job->ring->fence_drv.last_seq),
+                               job->ring->fence_drv.sync_seq);
+
+       amd_sched_job_put(&job->base);
+}
+
 int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
-                    struct amdgpu_job **job)
+                    struct amdgpu_job **job, struct amdgpu_vm *vm)
 {
        size_t size = sizeof(struct amdgpu_job);
 
@@ -43,8 +60,10 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,
                return -ENOMEM;
 
        (*job)->adev = adev;
+       (*job)->vm = vm;
        (*job)->ibs = (void *)&(*job)[1];
        (*job)->num_ibs = num_ibs;
+       INIT_WORK(&(*job)->base.work_free_job, amdgpu_job_free_handler);
 
        amdgpu_sync_create(&(*job)->sync);
 
@@ -56,7 +75,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,
 {
        int r;
 
-       r = amdgpu_job_alloc(adev, 1, job);
+       r = amdgpu_job_alloc(adev, 1, job, NULL);
        if (r)
                return r;
 
@@ -78,8 +97,16 @@ void amdgpu_job_free(struct amdgpu_job *job)
                amdgpu_sa_bo_free(job->adev, &job->ibs[i].sa_bo, f);
        fence_put(job->fence);
 
-       amdgpu_bo_unref(&job->uf.bo);
+       amdgpu_bo_unref(&job->uf_bo);
        amdgpu_sync_free(&job->sync);
+
+       if (!job->base.use_sched)
+               kfree(job);
+}
+
+void amdgpu_job_free_func(struct kref *refcount)
+{
+       struct amdgpu_job *job = container_of(refcount, struct amdgpu_job, base.refcount);
        kfree(job);
 }
 
@@ -87,16 +114,22 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
                      struct amd_sched_entity *entity, void *owner,
                      struct fence **f)
 {
+       struct fence *fence;
+       int r;
        job->ring = ring;
-       job->base.sched = &ring->sched;
-       job->base.s_entity = entity;
-       job->base.s_fence = amd_sched_fence_create(job->base.s_entity, owner);
-       if (!job->base.s_fence)
-               return -ENOMEM;
 
-       *f = fence_get(&job->base.s_fence->base);
+       if (!f)
+               return -EINVAL;
+
+       r = amd_sched_job_init(&job->base, &ring->sched,
+                              entity, amdgpu_job_timeout_func,
+                              amdgpu_job_free_func, owner, &fence);
+       if (r)
+               return r;
 
        job->owner = owner;
+       job->ctx = entity->fence_context;
+       *f = fence_get(fence);
        amd_sched_entity_push_job(&job->base);
 
        return 0;
@@ -105,27 +138,19 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
 static struct fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
 {
        struct amdgpu_job *job = to_amdgpu_job(sched_job);
-       struct amdgpu_vm *vm = job->ibs->vm;
+       struct amdgpu_vm *vm = job->vm;
 
        struct fence *fence = amdgpu_sync_get_fence(&job->sync);
 
-       if (fence == NULL && vm && !job->ibs->vm_id) {
+       if (fence == NULL && vm && !job->vm_id) {
                struct amdgpu_ring *ring = job->ring;
-               unsigned i, vm_id;
-               uint64_t vm_pd_addr;
                int r;
 
                r = amdgpu_vm_grab_id(vm, ring, &job->sync,
                                      &job->base.s_fence->base,
-                                     &vm_id, &vm_pd_addr);
+                                     &job->vm_id, &job->vm_pd_addr);
                if (r)
                        DRM_ERROR("Error getting VM ID (%d)\n", r);
-               else {
-                       for (i = 0; i < job->num_ibs; ++i) {
-                               job->ibs[i].vm_id = vm_id;
-                               job->ibs[i].vm_pd_addr = vm_pd_addr;
-                       }
-               }
 
                fence = amdgpu_sync_get_fence(&job->sync);
        }
@@ -153,7 +178,7 @@ static struct fence *amdgpu_job_run(struct amd_sched_job *sched_job)
 
        trace_amdgpu_sched_run_job(job);
        r = amdgpu_ib_schedule(job->ring, job->num_ibs, job->ibs,
-                              job->sync.last_vm_update, &fence);
+                              job->sync.last_vm_update, job, &fence);
        if (r) {
                DRM_ERROR("Error scheduling IBs (%d)\n", r);
                goto err;
@@ -165,7 +190,9 @@ err:
        return fence;
 }
 
-struct amd_sched_backend_ops amdgpu_sched_ops = {
+const struct amd_sched_backend_ops amdgpu_sched_ops = {
        .dependency = amdgpu_job_dependency,
        .run_job = amdgpu_job_run,
+       .begin_job = amd_sched_job_begin,
+       .finish_job = amd_sched_job_finish,
 };
index b04337de65d193884ba823f511df802b08aadec6..40a23704a981072472877fd14ccc2a8393391e3b 100644 (file)
@@ -427,7 +427,6 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
        }
        case AMDGPU_INFO_DEV_INFO: {
                struct drm_amdgpu_info_device dev_info = {};
-               struct amdgpu_cu_info cu_info;
 
                dev_info.device_id = dev->pdev->device;
                dev_info.chip_rev = adev->rev_id;
@@ -461,11 +460,11 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
                                             AMDGPU_GPU_PAGE_SIZE;
                dev_info.gart_page_size = AMDGPU_GPU_PAGE_SIZE;
 
-               amdgpu_asic_get_cu_info(adev, &cu_info);
-               dev_info.cu_active_number = cu_info.number;
-               dev_info.cu_ao_mask = cu_info.ao_cu_mask;
+               dev_info.cu_active_number = adev->gfx.cu_info.number;
+               dev_info.cu_ao_mask = adev->gfx.cu_info.ao_cu_mask;
                dev_info.ce_ram_size = adev->gfx.ce_ram_size;
-               memcpy(&dev_info.cu_bitmap[0], &cu_info.bitmap[0], sizeof(cu_info.bitmap));
+               memcpy(&dev_info.cu_bitmap[0], &adev->gfx.cu_info.bitmap[0],
+                      sizeof(adev->gfx.cu_info.bitmap));
                dev_info.vram_type = adev->mc.vram_type;
                dev_info.vram_bit_width = adev->mc.vram_width;
                dev_info.vce_harvest_config = adev->vce.harvest_config;
@@ -755,4 +754,4 @@ const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
        DRM_IOCTL_DEF_DRV(AMDGPU_GEM_OP, amdgpu_gem_op_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(AMDGPU_GEM_USERPTR, amdgpu_gem_userptr_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
 };
-int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
+const int amdgpu_max_kms_ioctl = ARRAY_SIZE(amdgpu_ioctls_kms);
index 81bd964d3dfc2f12cba2bf0e64b63c677e964d37..6b1d7d3065645719787255395487c04f0dc8b11e 100644 (file)
@@ -283,7 +283,7 @@ struct amdgpu_display_funcs {
        u32 (*hpd_get_gpio_reg)(struct amdgpu_device *adev);
        /* pageflipping */
        void (*page_flip)(struct amdgpu_device *adev,
-                        int crtc_id, u64 crtc_base);
+                         int crtc_id, u64 crtc_base, bool async);
        int (*page_flip_get_scanoutpos)(struct amdgpu_device *adev, int crtc,
                                        u32 *vbl, u32 *position);
        /* display topology setup */
@@ -530,7 +530,7 @@ struct amdgpu_framebuffer {
                                ((em) == ATOM_ENCODER_MODE_DP_MST))
 
 /* Driver internal use only flags of amdgpu_get_crtc_scanoutpos() */
-#define USE_REAL_VBLANKSTART           (1 << 30)
+#define USE_REAL_VBLANKSTART           (1 << 30)
 #define GET_DISTANCE_TO_VBLANKSTART    (1 << 31)
 
 void amdgpu_link_encoder_connector(struct drm_device *dev);
index acc08018c6cc1ebfb50493b4e6a6080ab04de49a..bdb01d932548992099f5b77ed42de3fd2442a25e 100644 (file)
@@ -71,7 +71,7 @@ static inline int amdgpu_bo_reserve(struct amdgpu_bo *bo, bool no_intr)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, !no_intr, false, false, 0);
+       r = ttm_bo_reserve(&bo->tbo, !no_intr, false, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS)
                        dev_err(bo->adev->dev, "%p reserve failed\n", bo);
index ff9597ce268c69dc868f313ed0d2ab9255bea546..589b36e8c5cf4c1ac3373da7352bd57b0fd5758d 100644 (file)
@@ -362,16 +362,23 @@ static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,
        struct amdgpu_device *adev = ddev->dev_private;
        int ret;
        long level;
+       uint32_t i, mask = 0;
+       char sub_str[2];
 
-       ret = kstrtol(buf, 0, &level);
+       for (i = 0; i < strlen(buf) - 1; i++) {
+               sub_str[0] = *(buf + i);
+               sub_str[1] = '\0';
+               ret = kstrtol(sub_str, 0, &level);
 
-       if (ret) {
-               count = -EINVAL;
-               goto fail;
+               if (ret) {
+                       count = -EINVAL;
+                       goto fail;
+               }
+               mask |= 1 << level;
        }
 
        if (adev->pp_enabled)
-               amdgpu_dpm_force_clock_level(adev, PP_SCLK, level);
+               amdgpu_dpm_force_clock_level(adev, PP_SCLK, mask);
 fail:
        return count;
 }
@@ -399,16 +406,23 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,
        struct amdgpu_device *adev = ddev->dev_private;
        int ret;
        long level;
+       uint32_t i, mask = 0;
+       char sub_str[2];
 
-       ret = kstrtol(buf, 0, &level);
+       for (i = 0; i < strlen(buf) - 1; i++) {
+               sub_str[0] = *(buf + i);
+               sub_str[1] = '\0';
+               ret = kstrtol(sub_str, 0, &level);
 
-       if (ret) {
-               count = -EINVAL;
-               goto fail;
+               if (ret) {
+                       count = -EINVAL;
+                       goto fail;
+               }
+               mask |= 1 << level;
        }
 
        if (adev->pp_enabled)
-               amdgpu_dpm_force_clock_level(adev, PP_MCLK, level);
+               amdgpu_dpm_force_clock_level(adev, PP_MCLK, mask);
 fail:
        return count;
 }
@@ -436,16 +450,23 @@ static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev,
        struct amdgpu_device *adev = ddev->dev_private;
        int ret;
        long level;
+       uint32_t i, mask = 0;
+       char sub_str[2];
 
-       ret = kstrtol(buf, 0, &level);
+       for (i = 0; i < strlen(buf) - 1; i++) {
+               sub_str[0] = *(buf + i);
+               sub_str[1] = '\0';
+               ret = kstrtol(sub_str, 0, &level);
 
-       if (ret) {
-               count = -EINVAL;
-               goto fail;
+               if (ret) {
+                       count = -EINVAL;
+                       goto fail;
+               }
+               mask |= 1 << level;
        }
 
        if (adev->pp_enabled)
-               amdgpu_dpm_force_clock_level(adev, PP_PCIE, level);
+               amdgpu_dpm_force_clock_level(adev, PP_PCIE, mask);
 fail:
        return count;
 }
@@ -1212,7 +1233,7 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)
        return 0;
 }
 
-static struct drm_info_list amdgpu_pm_info_list[] = {
+static const struct drm_info_list amdgpu_pm_info_list[] = {
        {"amdgpu_pm_info", amdgpu_debugfs_pm_info, 0, NULL},
 };
 #endif
index e9c6ae6ed2f73357d762f9aa75406c010238dd4a..6bd961fb43dcc7c7e3562d994e5fc0e79515ed01 100644 (file)
@@ -99,6 +99,10 @@ static int amdgpu_pp_early_init(void *handle)
 
 #ifdef CONFIG_DRM_AMD_POWERPLAY
        switch (adev->asic_type) {
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS10:
+               adev->pp_enabled = true;
+               break;
        case CHIP_TONGA:
        case CHIP_FIJI:
                adev->pp_enabled = (amdgpu_powerplay == 0) ? false : true;
@@ -299,16 +303,8 @@ static int amdgpu_pp_soft_reset(void *handle)
        return ret;
 }
 
-static void amdgpu_pp_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       if (adev->powerplay.ip_funcs->print_status)
-               adev->powerplay.ip_funcs->print_status(
-                                       adev->powerplay.pp_handle);
-}
-
 const struct amd_ip_funcs amdgpu_pp_ip_funcs = {
+       .name = "amdgpu_powerplay",
        .early_init = amdgpu_pp_early_init,
        .late_init = amdgpu_pp_late_init,
        .sw_init = amdgpu_pp_sw_init,
@@ -320,7 +316,6 @@ const struct amd_ip_funcs amdgpu_pp_ip_funcs = {
        .is_idle = amdgpu_pp_is_idle,
        .wait_for_idle = amdgpu_pp_wait_for_idle,
        .soft_reset = amdgpu_pp_soft_reset,
-       .print_status = amdgpu_pp_print_status,
        .set_clockgating_state = amdgpu_pp_set_clockgating_state,
        .set_powergating_state = amdgpu_pp_set_powergating_state,
 };
index be6388f73ba27a4caa0097954d245a38a4a73527..7700dc22f2432bb3f6d020a7c3acf3f3ccaaae9f 100644 (file)
@@ -57,9 +57,10 @@ void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
        ttm_bo_kunmap(&bo->dma_buf_vmap);
 }
 
-struct drm_gem_object *amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
-                                                       struct dma_buf_attachment *attach,
-                                                       struct sg_table *sg)
+struct drm_gem_object *
+amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
+                                struct dma_buf_attachment *attach,
+                                struct sg_table *sg)
 {
        struct reservation_object *resv = attach->dmabuf->resv;
        struct amdgpu_device *adev = dev->dev_private;
index 972eed2ef787eff5a49028ae58f60f3a85c47690..3b02272db678e173f2caaffd96527aa332326dc0 100644 (file)
@@ -46,7 +46,8 @@
  * wptr.  The GPU then starts fetching commands and executes
  * them until the pointers are equal again.
  */
-static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring);
+static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev,
+                                   struct amdgpu_ring *ring);
 
 /**
  * amdgpu_ring_alloc - allocate space on the ring buffer
@@ -215,18 +216,17 @@ int amdgpu_ring_restore(struct amdgpu_ring *ring,
  *
  * @adev: amdgpu_device pointer
  * @ring: amdgpu_ring structure holding ring information
- * @ring_size: size of the ring
+ * @max_ndw: maximum number of dw for ring alloc
  * @nop: nop packet for this ring
  *
  * Initialize the driver information for the selected ring (all asics).
  * Returns 0 on success, error on failure.
  */
 int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
-                    unsigned ring_size, u32 nop, u32 align_mask,
+                    unsigned max_dw, u32 nop, u32 align_mask,
                     struct amdgpu_irq_src *irq_src, unsigned irq_type,
                     enum amdgpu_ring_type ring_type)
 {
-       u32 rb_bufsz;
        int r;
 
        if (ring->adev == NULL) {
@@ -265,8 +265,17 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
                dev_err(adev->dev, "(%d) ring next_rptr wb alloc failed\n", r);
                return r;
        }
-       ring->next_rptr_gpu_addr = adev->wb.gpu_addr + (ring->next_rptr_offs * 4);
+       ring->next_rptr_gpu_addr = adev->wb.gpu_addr + ring->next_rptr_offs * 4;
        ring->next_rptr_cpu_addr = &adev->wb.wb[ring->next_rptr_offs];
+
+       r = amdgpu_wb_get(adev, &ring->cond_exe_offs);
+       if (r) {
+               dev_err(adev->dev, "(%d) ring cond_exec_polling wb alloc failed\n", r);
+               return r;
+       }
+       ring->cond_exe_gpu_addr = adev->wb.gpu_addr + (ring->cond_exe_offs * 4);
+       ring->cond_exe_cpu_addr = &adev->wb.wb[ring->cond_exe_offs];
+
        spin_lock_init(&ring->fence_lock);
        r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
        if (r) {
@@ -274,10 +283,8 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
                return r;
        }
 
-       /* Align ring size */
-       rb_bufsz = order_base_2(ring_size / 8);
-       ring_size = (1 << (rb_bufsz + 1)) * 4;
-       ring->ring_size = ring_size;
+       ring->ring_size = roundup_pow_of_two(max_dw * 4 *
+                                            amdgpu_sched_hw_submission);
        ring->align_mask = align_mask;
        ring->nop = nop;
        ring->type = ring_type;
@@ -310,8 +317,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
                }
        }
        ring->ptr_mask = (ring->ring_size / 4) - 1;
-       ring->max_dw = DIV_ROUND_UP(ring->ring_size / 4,
-                                   amdgpu_sched_hw_submission);
+       ring->max_dw = max_dw;
 
        if (amdgpu_debugfs_ring_init(adev, ring)) {
                DRM_ERROR("Failed to register debugfs file for rings !\n");
@@ -363,9 +369,8 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)
        struct drm_info_node *node = (struct drm_info_node *) m->private;
        struct drm_device *dev = node->minor->dev;
        struct amdgpu_device *adev = dev->dev_private;
-       int roffset = *(int*)node->info_ent->data;
+       int roffset = (unsigned long)node->info_ent->data;
        struct amdgpu_ring *ring = (void *)(((uint8_t*)adev) + roffset);
-
        uint32_t rptr, wptr, rptr_next;
        unsigned i;
 
@@ -408,46 +413,37 @@ static int amdgpu_debugfs_ring_info(struct seq_file *m, void *data)
        return 0;
 }
 
-/* TODO: clean this up !*/
-static int amdgpu_gfx_index = offsetof(struct amdgpu_device, gfx.gfx_ring[0]);
-static int cayman_cp1_index = offsetof(struct amdgpu_device, gfx.compute_ring[0]);
-static int cayman_cp2_index = offsetof(struct amdgpu_device, gfx.compute_ring[1]);
-static int amdgpu_dma1_index = offsetof(struct amdgpu_device, sdma.instance[0].ring);
-static int amdgpu_dma2_index = offsetof(struct amdgpu_device, sdma.instance[1].ring);
-static int r600_uvd_index = offsetof(struct amdgpu_device, uvd.ring);
-static int si_vce1_index = offsetof(struct amdgpu_device, vce.ring[0]);
-static int si_vce2_index = offsetof(struct amdgpu_device, vce.ring[1]);
-
-static struct drm_info_list amdgpu_debugfs_ring_info_list[] = {
-       {"amdgpu_ring_gfx", amdgpu_debugfs_ring_info, 0, &amdgpu_gfx_index},
-       {"amdgpu_ring_cp1", amdgpu_debugfs_ring_info, 0, &cayman_cp1_index},
-       {"amdgpu_ring_cp2", amdgpu_debugfs_ring_info, 0, &cayman_cp2_index},
-       {"amdgpu_ring_dma1", amdgpu_debugfs_ring_info, 0, &amdgpu_dma1_index},
-       {"amdgpu_ring_dma2", amdgpu_debugfs_ring_info, 0, &amdgpu_dma2_index},
-       {"amdgpu_ring_uvd", amdgpu_debugfs_ring_info, 0, &r600_uvd_index},
-       {"amdgpu_ring_vce1", amdgpu_debugfs_ring_info, 0, &si_vce1_index},
-       {"amdgpu_ring_vce2", amdgpu_debugfs_ring_info, 0, &si_vce2_index},
-};
+static struct drm_info_list amdgpu_debugfs_ring_info_list[AMDGPU_MAX_RINGS];
+static char amdgpu_debugfs_ring_names[AMDGPU_MAX_RINGS][32];
 
 #endif
 
-static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring)
+static int amdgpu_debugfs_ring_init(struct amdgpu_device *adev,
+                                   struct amdgpu_ring *ring)
 {
 #if defined(CONFIG_DEBUG_FS)
+       unsigned offset = (uint8_t*)ring - (uint8_t*)adev;
        unsigned i;
+       struct drm_info_list *info;
+       char *name;
+
        for (i = 0; i < ARRAY_SIZE(amdgpu_debugfs_ring_info_list); ++i) {
-               struct drm_info_list *info = &amdgpu_debugfs_ring_info_list[i];
-               int roffset = *(int*)amdgpu_debugfs_ring_info_list[i].data;
-               struct amdgpu_ring *other = (void *)(((uint8_t*)adev) + roffset);
-               unsigned r;
+               info = &amdgpu_debugfs_ring_info_list[i];
+               if (!info->data)
+                       break;
+       }
 
-               if (other != ring)
-                       continue;
+       if (i == ARRAY_SIZE(amdgpu_debugfs_ring_info_list))
+               return -ENOSPC;
 
-               r = amdgpu_debugfs_add_files(adev, info, 1);
-               if (r)
-                       return r;
-       }
+       name = &amdgpu_debugfs_ring_names[i][0];
+       sprintf(name, "amdgpu_ring_%s", ring->name);
+       info->name = name;
+       info->show = amdgpu_debugfs_ring_info;
+       info->driver_features = 0;
+       info->data = (void*)(uintptr_t)offset;
+
+       return amdgpu_debugfs_add_files(adev, info, 1);
 #endif
        return 0;
 }
index c48b4fce5e57af9196eb2887f9969d49dec1a7ed..34a92808bbd4dabc7ad7f62e4d5beec259bb6f82 100644 (file)
@@ -108,6 +108,29 @@ static void amdgpu_sync_keep_later(struct fence **keep, struct fence *fence)
        *keep = fence_get(fence);
 }
 
+/**
+ * amdgpu_sync_add_later - add the fence to the hash
+ *
+ * @sync: sync object to add the fence to
+ * @f: fence to add
+ *
+ * Tries to add the fence to an existing hash entry. Returns true when an entry
+ * was found, false otherwise.
+ */
+static bool amdgpu_sync_add_later(struct amdgpu_sync *sync, struct fence *f)
+{
+       struct amdgpu_sync_entry *e;
+
+       hash_for_each_possible(sync->fences, e, node, f->context) {
+               if (unlikely(e->fence->context != f->context))
+                       continue;
+
+               amdgpu_sync_keep_later(&e->fence, f);
+               return true;
+       }
+       return false;
+}
+
 /**
  * amdgpu_sync_fence - remember to sync to this fence
  *
@@ -127,13 +150,8 @@ int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync,
            amdgpu_sync_get_owner(f) == AMDGPU_FENCE_OWNER_VM)
                amdgpu_sync_keep_later(&sync->last_vm_update, f);
 
-       hash_for_each_possible(sync->fences, e, node, f->context) {
-               if (unlikely(e->fence->context != f->context))
-                       continue;
-
-               amdgpu_sync_keep_later(&e->fence, f);
+       if (amdgpu_sync_add_later(sync, f))
                return 0;
-       }
 
        e = kmem_cache_alloc(amdgpu_sync_slab, GFP_KERNEL);
        if (!e)
@@ -204,6 +222,81 @@ int amdgpu_sync_resv(struct amdgpu_device *adev,
        return r;
 }
 
+/**
+ * amdgpu_sync_is_idle - test if all fences are signaled
+ *
+ * @sync: the sync object
+ *
+ * Returns true if all fences in the sync object are signaled.
+ */
+bool amdgpu_sync_is_idle(struct amdgpu_sync *sync)
+{
+       struct amdgpu_sync_entry *e;
+       struct hlist_node *tmp;
+       int i;
+
+       hash_for_each_safe(sync->fences, i, tmp, e, node) {
+               struct fence *f = e->fence;
+
+               if (fence_is_signaled(f)) {
+                       hash_del(&e->node);
+                       fence_put(f);
+                       kmem_cache_free(amdgpu_sync_slab, e);
+                       continue;
+               }
+
+               return false;
+       }
+
+       return true;
+}
+
+/**
+ * amdgpu_sync_cycle_fences - move fences from one sync object into another
+ *
+ * @dst: the destination sync object
+ * @src: the source sync object
+ * @fence: fence to add to source
+ *
+ * Remove all fences from source and put them into destination and add
+ * fence as new one into source.
+ */
+int amdgpu_sync_cycle_fences(struct amdgpu_sync *dst, struct amdgpu_sync *src,
+                            struct fence *fence)
+{
+       struct amdgpu_sync_entry *e, *newone;
+       struct hlist_node *tmp;
+       int i;
+
+       /* Allocate the new entry before moving the old ones */
+       newone = kmem_cache_alloc(amdgpu_sync_slab, GFP_KERNEL);
+       if (!newone)
+               return -ENOMEM;
+
+       hash_for_each_safe(src->fences, i, tmp, e, node) {
+               struct fence *f = e->fence;
+
+               hash_del(&e->node);
+               if (fence_is_signaled(f)) {
+                       fence_put(f);
+                       kmem_cache_free(amdgpu_sync_slab, e);
+                       continue;
+               }
+
+               if (amdgpu_sync_add_later(dst, f)) {
+                       kmem_cache_free(amdgpu_sync_slab, e);
+                       continue;
+               }
+
+               hash_add(dst->fences, &e->node, f->context);
+       }
+
+       hash_add(src->fences, &newone->node, fence->context);
+       newone->fence = fence_get(fence);
+
+       return 0;
+}
+
 struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync)
 {
        struct amdgpu_sync_entry *e;
index 11af4492b4bee2e3bf29d7910e9d25b3adb5f843..3b9053af47629617544f8f55d6ec5b714063146c 100644 (file)
@@ -911,6 +911,52 @@ uint32_t amdgpu_ttm_tt_pte_flags(struct amdgpu_device *adev, struct ttm_tt *ttm,
        return flags;
 }
 
+static void amdgpu_ttm_lru_removal(struct ttm_buffer_object *tbo)
+{
+       struct amdgpu_device *adev = amdgpu_get_adev(tbo->bdev);
+       unsigned i, j;
+
+       for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) {
+               struct amdgpu_mman_lru *lru = &adev->mman.log2_size[i];
+
+               for (j = 0; j < TTM_NUM_MEM_TYPES; ++j)
+                       if (&tbo->lru == lru->lru[j])
+                               lru->lru[j] = tbo->lru.prev;
+
+               if (&tbo->swap == lru->swap_lru)
+                       lru->swap_lru = tbo->swap.prev;
+       }
+}
+
+static struct amdgpu_mman_lru *amdgpu_ttm_lru(struct ttm_buffer_object *tbo)
+{
+       struct amdgpu_device *adev = amdgpu_get_adev(tbo->bdev);
+       unsigned log2_size = min(ilog2(tbo->num_pages),
+                                AMDGPU_TTM_LRU_SIZE - 1);
+
+       return &adev->mman.log2_size[log2_size];
+}
+
+static struct list_head *amdgpu_ttm_lru_tail(struct ttm_buffer_object *tbo)
+{
+       struct amdgpu_mman_lru *lru = amdgpu_ttm_lru(tbo);
+       struct list_head *res = lru->lru[tbo->mem.mem_type];
+
+       lru->lru[tbo->mem.mem_type] = &tbo->lru;
+
+       return res;
+}
+
+static struct list_head *amdgpu_ttm_swap_lru_tail(struct ttm_buffer_object *tbo)
+{
+       struct amdgpu_mman_lru *lru = amdgpu_ttm_lru(tbo);
+       struct list_head *res = lru->swap_lru;
+
+       lru->swap_lru = &tbo->swap;
+
+       return res;
+}
+
 static struct ttm_bo_driver amdgpu_bo_driver = {
        .ttm_tt_create = &amdgpu_ttm_tt_create,
        .ttm_tt_populate = &amdgpu_ttm_tt_populate,
@@ -924,10 +970,14 @@ static struct ttm_bo_driver amdgpu_bo_driver = {
        .fault_reserve_notify = &amdgpu_bo_fault_reserve_notify,
        .io_mem_reserve = &amdgpu_ttm_io_mem_reserve,
        .io_mem_free = &amdgpu_ttm_io_mem_free,
+       .lru_removal = &amdgpu_ttm_lru_removal,
+       .lru_tail = &amdgpu_ttm_lru_tail,
+       .swap_lru_tail = &amdgpu_ttm_swap_lru_tail,
 };
 
 int amdgpu_ttm_init(struct amdgpu_device *adev)
 {
+       unsigned i, j;
        int r;
 
        r = amdgpu_ttm_global_init(adev);
@@ -945,6 +995,15 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
                DRM_ERROR("failed initializing buffer object driver(%d).\n", r);
                return r;
        }
+
+       for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) {
+               struct amdgpu_mman_lru *lru = &adev->mman.log2_size[i];
+
+               for (j = 0; j < TTM_NUM_MEM_TYPES; ++j)
+                       lru->lru[j] = &adev->mman.bdev.man[j].lru;
+               lru->swap_lru = &adev->mman.bdev.glob->swap_lru;
+       }
+
        adev->mman.initialized = true;
        r = ttm_bo_init_mm(&adev->mman.bdev, TTM_PL_VRAM,
                                adev->mc.real_vram_size >> PAGE_SHIFT);
@@ -1167,7 +1226,7 @@ static int amdgpu_mm_dump_table(struct seq_file *m, void *data)
 static int ttm_pl_vram = TTM_PL_VRAM;
 static int ttm_pl_tt = TTM_PL_TT;
 
-static struct drm_info_list amdgpu_ttm_debugfs_list[] = {
+static const struct drm_info_list amdgpu_ttm_debugfs_list[] = {
        {"amdgpu_vram_mm", amdgpu_mm_dump_table, 0, &ttm_pl_vram},
        {"amdgpu_gtt_mm", amdgpu_mm_dump_table, 0, &ttm_pl_tt},
        {"ttm_page_pool", ttm_page_alloc_debugfs, 0, NULL},
@@ -1218,6 +1277,8 @@ static const struct file_operations amdgpu_ttm_vram_fops = {
        .llseek = default_llseek
 };
 
+#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
+
 static ssize_t amdgpu_ttm_gtt_read(struct file *f, char __user *buf,
                                   size_t size, loff_t *pos)
 {
@@ -1265,6 +1326,8 @@ static const struct file_operations amdgpu_ttm_gtt_fops = {
 
 #endif
 
+#endif
+
 static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
@@ -1280,6 +1343,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
        i_size_write(ent->d_inode, adev->mc.mc_vram_size);
        adev->mman.vram = ent;
 
+#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
        ent = debugfs_create_file("amdgpu_gtt", S_IFREG | S_IRUGO, root,
                                  adev, &amdgpu_ttm_gtt_fops);
        if (IS_ERR(ent))
@@ -1287,6 +1351,7 @@ static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev)
        i_size_write(ent->d_inode, adev->mc.gtt_size);
        adev->mman.gtt = ent;
 
+#endif
        count = ARRAY_SIZE(amdgpu_ttm_debugfs_list);
 
 #ifdef CONFIG_SWIOTLB
@@ -1308,7 +1373,10 @@ static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev)
        debugfs_remove(adev->mman.vram);
        adev->mman.vram = NULL;
 
+#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
        debugfs_remove(adev->mman.gtt);
        adev->mman.gtt = NULL;
 #endif
+
+#endif
 }
index 871018c634e0af896aa5a864bd87ee0653e35396..01abfc21b4a2249c43b5b0ce747b36ac111940c2 100644 (file)
 
 /* 1 second timeout */
 #define UVD_IDLE_TIMEOUT_MS    1000
+/* Polaris10/11 firmware version */
+#define FW_1_66_16 ((1 << 24) | (66 << 16) | (16 << 8))
 
 /* Firmware Names */
 #ifdef CONFIG_DRM_AMDGPU_CIK
 #define FIRMWARE_BONAIRE       "radeon/bonaire_uvd.bin"
-#define FIRMWARE_KABINI        "radeon/kabini_uvd.bin"
-#define FIRMWARE_KAVERI        "radeon/kaveri_uvd.bin"
-#define FIRMWARE_HAWAII        "radeon/hawaii_uvd.bin"
+#define FIRMWARE_KABINI        "radeon/kabini_uvd.bin"
+#define FIRMWARE_KAVERI        "radeon/kaveri_uvd.bin"
+#define FIRMWARE_HAWAII        "radeon/hawaii_uvd.bin"
 #define FIRMWARE_MULLINS       "radeon/mullins_uvd.bin"
 #endif
 #define FIRMWARE_TONGA         "amdgpu/tonga_uvd.bin"
 #define FIRMWARE_CARRIZO       "amdgpu/carrizo_uvd.bin"
 #define FIRMWARE_FIJI          "amdgpu/fiji_uvd.bin"
 #define FIRMWARE_STONEY                "amdgpu/stoney_uvd.bin"
+#define FIRMWARE_POLARIS10     "amdgpu/polaris10_uvd.bin"
+#define FIRMWARE_POLARIS11     "amdgpu/polaris11_uvd.bin"
 
 /**
  * amdgpu_uvd_cs_ctx - Command submission parser context
@@ -85,6 +89,8 @@ MODULE_FIRMWARE(FIRMWARE_TONGA);
 MODULE_FIRMWARE(FIRMWARE_CARRIZO);
 MODULE_FIRMWARE(FIRMWARE_FIJI);
 MODULE_FIRMWARE(FIRMWARE_STONEY);
+MODULE_FIRMWARE(FIRMWARE_POLARIS10);
+MODULE_FIRMWARE(FIRMWARE_POLARIS11);
 
 static void amdgpu_uvd_note_usage(struct amdgpu_device *adev);
 static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
@@ -131,6 +137,12 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
        case CHIP_STONEY:
                fw_name = FIRMWARE_STONEY;
                break;
+       case CHIP_POLARIS10:
+               fw_name = FIRMWARE_POLARIS10;
+               break;
+       case CHIP_POLARIS11:
+               fw_name = FIRMWARE_POLARIS11;
+               break;
        default:
                return -EINVAL;
        }
@@ -151,6 +163,9 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
                return r;
        }
 
+       /* Set the default UVD handles that the firmware can handle */
+       adev->uvd.max_handles = AMDGPU_DEFAULT_UVD_HANDLES;
+
        hdr = (const struct common_firmware_header *)adev->uvd.fw->data;
        family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
        version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
@@ -158,11 +173,28 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
        DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID: %hu\n",
                version_major, version_minor, family_id);
 
+       /*
+        * Limit the number of UVD handles depending on microcode major
+        * and minor versions. The firmware version which has 40 UVD
+        * instances support is 1.80. So all subsequent versions should
+        * also have the same support.
+        */
+       if ((version_major > 0x01) ||
+           ((version_major == 0x01) && (version_minor >= 0x50)))
+               adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
+
        adev->uvd.fw_version = ((version_major << 24) | (version_minor << 16) |
                                (family_id << 8));
 
+       if ((adev->asic_type == CHIP_POLARIS10 ||
+            adev->asic_type == CHIP_POLARIS11) &&
+           (adev->uvd.fw_version < FW_1_66_16))
+               DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is too old.\n",
+                         version_major, version_minor);
+
        bo_size = AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8)
-                +  AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE;
+                 +  AMDGPU_UVD_STACK_SIZE + AMDGPU_UVD_HEAP_SIZE
+                 +  AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles;
        r = amdgpu_bo_create(adev, bo_size, PAGE_SIZE, true,
                             AMDGPU_GEM_DOMAIN_VRAM,
                             AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
@@ -205,7 +237,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
                return r;
        }
 
-       for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < adev->uvd.max_handles; ++i) {
                atomic_set(&adev->uvd.handles[i], 0);
                adev->uvd.filp[i] = NULL;
        }
@@ -251,7 +283,7 @@ int amdgpu_uvd_suspend(struct amdgpu_device *adev)
        if (adev->uvd.vcpu_bo == NULL)
                return 0;
 
-       for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i)
+       for (i = 0; i < adev->uvd.max_handles; ++i)
                if (atomic_read(&adev->uvd.handles[i]))
                        break;
 
@@ -308,7 +340,7 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
        struct amdgpu_ring *ring = &adev->uvd.ring;
        int i, r;
 
-       for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < adev->uvd.max_handles; ++i) {
                uint32_t handle = atomic_read(&adev->uvd.handles[i]);
                if (handle != 0 && adev->uvd.filp[i] == filp) {
                        struct fence *fence;
@@ -390,7 +422,8 @@ static int amdgpu_uvd_cs_pass1(struct amdgpu_uvd_cs_ctx *ctx)
  *
  * Peek into the decode message and calculate the necessary buffer sizes.
  */
-static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[])
+static int amdgpu_uvd_cs_msg_decode(struct amdgpu_device *adev, uint32_t *msg,
+       unsigned buf_sizes[])
 {
        unsigned stream_type = msg[4];
        unsigned width = msg[6];
@@ -412,7 +445,6 @@ static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[])
 
        switch (stream_type) {
        case 0: /* H264 */
-       case 7: /* H264 Perf */
                switch(level) {
                case 30:
                        num_dpb_buffer = 8100 / fs_in_mb;
@@ -490,6 +522,54 @@ static int amdgpu_uvd_cs_msg_decode(uint32_t *msg, unsigned buf_sizes[])
                min_dpb_size += ALIGN(width_in_mb * height_in_mb * 32, 64);
                break;
 
+       case 7: /* H264 Perf */
+               switch(level) {
+               case 30:
+                       num_dpb_buffer = 8100 / fs_in_mb;
+                       break;
+               case 31:
+                       num_dpb_buffer = 18000 / fs_in_mb;
+                       break;
+               case 32:
+                       num_dpb_buffer = 20480 / fs_in_mb;
+                       break;
+               case 41:
+                       num_dpb_buffer = 32768 / fs_in_mb;
+                       break;
+               case 42:
+                       num_dpb_buffer = 34816 / fs_in_mb;
+                       break;
+               case 50:
+                       num_dpb_buffer = 110400 / fs_in_mb;
+                       break;
+               case 51:
+                       num_dpb_buffer = 184320 / fs_in_mb;
+                       break;
+               default:
+                       num_dpb_buffer = 184320 / fs_in_mb;
+                       break;
+               }
+               num_dpb_buffer++;
+               if (num_dpb_buffer > 17)
+                       num_dpb_buffer = 17;
+
+               /* reference picture buffer */
+               min_dpb_size = image_size * num_dpb_buffer;
+
+               if (adev->asic_type < CHIP_POLARIS10){
+                       /* macroblock context buffer */
+                       min_dpb_size +=
+                               width_in_mb * height_in_mb * num_dpb_buffer * 192;
+
+                       /* IT surface buffer */
+                       min_dpb_size += width_in_mb * height_in_mb * 32;
+               } else {
+                       /* macroblock context buffer */
+                       min_ctx_size =
+                               width_in_mb * height_in_mb * num_dpb_buffer * 192;
+               }
+               break;
+
        case 16: /* H265 */
                image_size = (ALIGN(width, 16) * ALIGN(height, 16) * 3) / 2;
                image_size = ALIGN(image_size, 256);
@@ -568,7 +648,7 @@ static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx,
                amdgpu_bo_kunmap(bo);
 
                /* try to alloc a new handle */
-               for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) {
+               for (i = 0; i < adev->uvd.max_handles; ++i) {
                        if (atomic_read(&adev->uvd.handles[i]) == handle) {
                                DRM_ERROR("Handle 0x%x already in use!\n", handle);
                                return -EINVAL;
@@ -585,13 +665,13 @@ static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx,
 
        case 1:
                /* it's a decode msg, calc buffer sizes */
-               r = amdgpu_uvd_cs_msg_decode(msg, ctx->buf_sizes);
+               r = amdgpu_uvd_cs_msg_decode(adev, msg, ctx->buf_sizes);
                amdgpu_bo_kunmap(bo);
                if (r)
                        return r;
 
                /* validate the handle */
-               for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i) {
+               for (i = 0; i < adev->uvd.max_handles; ++i) {
                        if (atomic_read(&adev->uvd.handles[i]) == handle) {
                                if (adev->uvd.filp[i] != ctx->parser->filp) {
                                        DRM_ERROR("UVD handle collision detected!\n");
@@ -606,7 +686,7 @@ static int amdgpu_uvd_cs_msg(struct amdgpu_uvd_cs_ctx *ctx,
 
        case 2:
                /* it's a destroy msg, free the handle */
-               for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i)
+               for (i = 0; i < adev->uvd.max_handles; ++i)
                        atomic_cmpxchg(&adev->uvd.handles[i], handle, 0);
                amdgpu_bo_kunmap(bo);
                return 0;
@@ -886,7 +966,7 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,
        ib->length_dw = 16;
 
        if (direct) {
-               r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f);
+               r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
                job->fence = f;
                if (r)
                        goto err_free;
@@ -1018,7 +1098,7 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work)
 
        fences = amdgpu_fence_count_emitted(&adev->uvd.ring);
 
-       for (i = 0; i < AMDGPU_MAX_UVD_HANDLES; ++i)
+       for (i = 0; i < adev->uvd.max_handles; ++i)
                if (atomic_read(&adev->uvd.handles[i]))
                        ++handles;
 
index 481a64fa9b470bfa7b2c2290bf6f85b882b4066a..875626a2eccbd912371e12f4f09e4573521e427c 100644 (file)
 /* Firmware Names */
 #ifdef CONFIG_DRM_AMDGPU_CIK
 #define FIRMWARE_BONAIRE       "radeon/bonaire_vce.bin"
-#define FIRMWARE_KABINI        "radeon/kabini_vce.bin"
-#define FIRMWARE_KAVERI        "radeon/kaveri_vce.bin"
-#define FIRMWARE_HAWAII        "radeon/hawaii_vce.bin"
+#define FIRMWARE_KABINI        "radeon/kabini_vce.bin"
+#define FIRMWARE_KAVERI        "radeon/kaveri_vce.bin"
+#define FIRMWARE_HAWAII        "radeon/hawaii_vce.bin"
 #define FIRMWARE_MULLINS       "radeon/mullins_vce.bin"
 #endif
 #define FIRMWARE_TONGA         "amdgpu/tonga_vce.bin"
 #define FIRMWARE_CARRIZO       "amdgpu/carrizo_vce.bin"
 #define FIRMWARE_FIJI          "amdgpu/fiji_vce.bin"
 #define FIRMWARE_STONEY                "amdgpu/stoney_vce.bin"
+#define FIRMWARE_POLARIS10     "amdgpu/polaris10_vce.bin"
+#define FIRMWARE_POLARIS11         "amdgpu/polaris11_vce.bin"
 
 #ifdef CONFIG_DRM_AMDGPU_CIK
 MODULE_FIRMWARE(FIRMWARE_BONAIRE);
@@ -62,6 +64,8 @@ MODULE_FIRMWARE(FIRMWARE_TONGA);
 MODULE_FIRMWARE(FIRMWARE_CARRIZO);
 MODULE_FIRMWARE(FIRMWARE_FIJI);
 MODULE_FIRMWARE(FIRMWARE_STONEY);
+MODULE_FIRMWARE(FIRMWARE_POLARIS10);
+MODULE_FIRMWARE(FIRMWARE_POLARIS11);
 
 static void amdgpu_vce_idle_work_handler(struct work_struct *work);
 
@@ -113,6 +117,12 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
        case CHIP_STONEY:
                fw_name = FIRMWARE_STONEY;
                break;
+       case CHIP_POLARIS10:
+               fw_name = FIRMWARE_POLARIS10;
+               break;
+       case CHIP_POLARIS11:
+               fw_name = FIRMWARE_POLARIS11;
+               break;
 
        default:
                return -EINVAL;
@@ -426,7 +436,7 @@ int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
        for (i = ib->length_dw; i < ib_size_dw; ++i)
                ib->ptr[i] = 0x0;
 
-       r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
        job->fence = f;
        if (r)
                goto err;
@@ -488,7 +498,7 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
                ib->ptr[i] = 0x0;
 
        if (direct) {
-               r = amdgpu_ib_schedule(ring, 1, ib, NULL, &f);
+               r = amdgpu_ib_schedule(ring, 1, ib, NULL, NULL, &f);
                job->fence = f;
                if (r)
                        goto err;
@@ -752,7 +762,8 @@ out:
  * @ib: the IB to execute
  *
  */
-void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
+void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
+                            unsigned vm_id, bool ctx_switch)
 {
        amdgpu_ring_write(ring, VCE_CMD_IB);
        amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
index ef99d237018259bf95489977f3ff6c5fc4a7c767..f40cf761c66f45f40fe5cf1d42646852d82101fb 100644 (file)
@@ -34,7 +34,8 @@ int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
                               bool direct, struct fence **fence);
 void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp);
 int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx);
-void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
+void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
+                            unsigned vm_id, bool ctx_switch);
 void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
                                unsigned flags);
 int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
index b6c011b83641205b5a7466d499017a80b8d2275a..ea708cb94862fba8bd9a4f8256b7cb16427c2cb3 100644 (file)
@@ -166,74 +166,109 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
 {
        uint64_t pd_addr = amdgpu_bo_gpu_offset(vm->page_directory);
        struct amdgpu_device *adev = ring->adev;
-       struct amdgpu_vm_id *id = &vm->ids[ring->idx];
        struct fence *updates = sync->last_vm_update;
+       struct amdgpu_vm_id *id;
+       unsigned i = ring->idx;
        int r;
 
        mutex_lock(&adev->vm_manager.lock);
 
-       /* check if the id is still valid */
-       if (id->mgr_id) {
-               struct fence *flushed = id->flushed_updates;
-               bool is_later;
-               long owner;
+       /* Check if we can use a VMID already assigned to this VM */
+       do {
+               struct fence *flushed;
 
-               if (!flushed)
-                       is_later = true;
-               else if (!updates)
-                       is_later = false;
-               else
-                       is_later = fence_is_later(updates, flushed);
+               id = vm->ids[i++];
+               if (i == AMDGPU_MAX_RINGS)
+                       i = 0;
+
+               /* Check all the prerequisites to using this VMID */
+               if (!id)
+                       continue;
+
+               if (atomic64_read(&id->owner) != vm->client_id)
+                       continue;
+
+               if (pd_addr != id->pd_gpu_addr)
+                       continue;
 
-               owner = atomic_long_read(&id->mgr_id->owner);
-               if (!is_later && owner == (long)id &&
-                   pd_addr == id->pd_gpu_addr) {
+               if (id->last_user != ring &&
+                   (!id->last_flush || !fence_is_signaled(id->last_flush)))
+                       continue;
+
+               flushed  = id->flushed_updates;
+               if (updates && (!flushed || fence_is_later(updates, flushed)))
+                       continue;
 
+               /* Good we can use this VMID */
+               if (id->last_user == ring) {
                        r = amdgpu_sync_fence(ring->adev, sync,
-                                             id->mgr_id->active);
-                       if (r) {
-                               mutex_unlock(&adev->vm_manager.lock);
-                               return r;
-                       }
+                                             id->first);
+                       if (r)
+                               goto error;
+               }
+
+               /* And remember this submission as user of the VMID */
+               r = amdgpu_sync_fence(ring->adev, &id->active, fence);
+               if (r)
+                       goto error;
+
+               list_move_tail(&id->list, &adev->vm_manager.ids_lru);
+               vm->ids[ring->idx] = id;
+
+               *vm_id = id - adev->vm_manager.ids;
+               *vm_pd_addr = AMDGPU_VM_NO_FLUSH;
+               trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id, *vm_pd_addr);
+
+               mutex_unlock(&adev->vm_manager.lock);
+               return 0;
 
-                       fence_put(id->mgr_id->active);
-                       id->mgr_id->active = fence_get(fence);
+       } while (i != ring->idx);
 
-                       list_move_tail(&id->mgr_id->list,
-                                      &adev->vm_manager.ids_lru);
+       id = list_first_entry(&adev->vm_manager.ids_lru,
+                             struct amdgpu_vm_id,
+                             list);
 
-                       *vm_id = id->mgr_id - adev->vm_manager.ids;
-                       *vm_pd_addr = AMDGPU_VM_NO_FLUSH;
-                       trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id,
-                                               *vm_pd_addr);
+       if (!amdgpu_sync_is_idle(&id->active)) {
+               struct list_head *head = &adev->vm_manager.ids_lru;
+               struct amdgpu_vm_id *tmp;
 
-                       mutex_unlock(&adev->vm_manager.lock);
-                       return 0;
+               list_for_each_entry_safe(id, tmp, &adev->vm_manager.ids_lru,
+                                        list) {
+                       if (amdgpu_sync_is_idle(&id->active)) {
+                               list_move(&id->list, head);
+                               head = &id->list;
+                       }
                }
+               id = list_first_entry(&adev->vm_manager.ids_lru,
+                                     struct amdgpu_vm_id,
+                                     list);
        }
 
-       id->mgr_id = list_first_entry(&adev->vm_manager.ids_lru,
-                                     struct amdgpu_vm_manager_id,
-                                     list);
+       r = amdgpu_sync_cycle_fences(sync, &id->active, fence);
+       if (r)
+               goto error;
 
-       r = amdgpu_sync_fence(ring->adev, sync, id->mgr_id->active);
-       if (!r) {
-               fence_put(id->mgr_id->active);
-               id->mgr_id->active = fence_get(fence);
+       fence_put(id->first);
+       id->first = fence_get(fence);
 
-               fence_put(id->flushed_updates);
-               id->flushed_updates = fence_get(updates);
+       fence_put(id->last_flush);
+       id->last_flush = NULL;
 
-               id->pd_gpu_addr = pd_addr;
+       fence_put(id->flushed_updates);
+       id->flushed_updates = fence_get(updates);
 
-               list_move_tail(&id->mgr_id->list, &adev->vm_manager.ids_lru);
-               atomic_long_set(&id->mgr_id->owner, (long)id);
+       id->pd_gpu_addr = pd_addr;
 
-               *vm_id = id->mgr_id - adev->vm_manager.ids;
-               *vm_pd_addr = pd_addr;
-               trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id, *vm_pd_addr);
-       }
+       list_move_tail(&id->list, &adev->vm_manager.ids_lru);
+       id->last_user = ring;
+       atomic64_set(&id->owner, vm->client_id);
+       vm->ids[ring->idx] = id;
+
+       *vm_id = id - adev->vm_manager.ids;
+       *vm_pd_addr = pd_addr;
+       trace_amdgpu_vm_grab_id(vm, ring->idx, *vm_id, *vm_pd_addr);
 
+error:
        mutex_unlock(&adev->vm_manager.lock);
        return r;
 }
@@ -247,43 +282,62 @@ int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
  *
  * Emit a VM flush when it is necessary.
  */
-void amdgpu_vm_flush(struct amdgpu_ring *ring,
-                    unsigned vm_id, uint64_t pd_addr,
-                    uint32_t gds_base, uint32_t gds_size,
-                    uint32_t gws_base, uint32_t gws_size,
-                    uint32_t oa_base, uint32_t oa_size)
+int amdgpu_vm_flush(struct amdgpu_ring *ring,
+                   unsigned vm_id, uint64_t pd_addr,
+                   uint32_t gds_base, uint32_t gds_size,
+                   uint32_t gws_base, uint32_t gws_size,
+                   uint32_t oa_base, uint32_t oa_size)
 {
        struct amdgpu_device *adev = ring->adev;
-       struct amdgpu_vm_manager_id *mgr_id = &adev->vm_manager.ids[vm_id];
+       struct amdgpu_vm_id *id = &adev->vm_manager.ids[vm_id];
        bool gds_switch_needed = ring->funcs->emit_gds_switch && (
-               mgr_id->gds_base != gds_base ||
-               mgr_id->gds_size != gds_size ||
-               mgr_id->gws_base != gws_base ||
-               mgr_id->gws_size != gws_size ||
-               mgr_id->oa_base != oa_base ||
-               mgr_id->oa_size != oa_size);
+               id->gds_base != gds_base ||
+               id->gds_size != gds_size ||
+               id->gws_base != gws_base ||
+               id->gws_size != gws_size ||
+               id->oa_base != oa_base ||
+               id->oa_size != oa_size);
+       int r;
 
        if (ring->funcs->emit_pipeline_sync && (
-           pd_addr != AMDGPU_VM_NO_FLUSH || gds_switch_needed))
+           pd_addr != AMDGPU_VM_NO_FLUSH || gds_switch_needed ||
+                   ring->type == AMDGPU_RING_TYPE_COMPUTE))
                amdgpu_ring_emit_pipeline_sync(ring);
 
-       if (pd_addr != AMDGPU_VM_NO_FLUSH) {
+       if (ring->funcs->emit_vm_flush &&
+           pd_addr != AMDGPU_VM_NO_FLUSH) {
+               struct fence *fence;
+
                trace_amdgpu_vm_flush(pd_addr, ring->idx, vm_id);
                amdgpu_ring_emit_vm_flush(ring, vm_id, pd_addr);
+
+               mutex_lock(&adev->vm_manager.lock);
+               if ((id->pd_gpu_addr == pd_addr) && (id->last_user == ring)) {
+                       r = amdgpu_fence_emit(ring, &fence);
+                       if (r) {
+                               mutex_unlock(&adev->vm_manager.lock);
+                               return r;
+                       }
+                       fence_put(id->last_flush);
+                       id->last_flush = fence;
+               }
+               mutex_unlock(&adev->vm_manager.lock);
        }
 
        if (gds_switch_needed) {
-               mgr_id->gds_base = gds_base;
-               mgr_id->gds_size = gds_size;
-               mgr_id->gws_base = gws_base;
-               mgr_id->gws_size = gws_size;
-               mgr_id->oa_base = oa_base;
-               mgr_id->oa_size = oa_size;
+               id->gds_base = gds_base;
+               id->gds_size = gds_size;
+               id->gws_base = gws_base;
+               id->gws_size = gws_size;
+               id->oa_base = oa_base;
+               id->oa_size = oa_size;
                amdgpu_ring_emit_gds_switch(ring, vm_id,
                                            gds_base, gds_size,
                                            gws_base, gws_size,
                                            oa_base, oa_size);
        }
+
+       return 0;
 }
 
 /**
@@ -296,14 +350,14 @@ void amdgpu_vm_flush(struct amdgpu_ring *ring,
  */
 void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id)
 {
-       struct amdgpu_vm_manager_id *mgr_id = &adev->vm_manager.ids[vm_id];
-
-       mgr_id->gds_base = 0;
-       mgr_id->gds_size = 0;
-       mgr_id->gws_base = 0;
-       mgr_id->gws_size = 0;
-       mgr_id->oa_base = 0;
-       mgr_id->oa_size = 0;
+       struct amdgpu_vm_id *id = &adev->vm_manager.ids[vm_id];
+
+       id->gds_base = 0;
+       id->gds_size = 0;
+       id->gws_base = 0;
+       id->gws_size = 0;
+       id->oa_base = 0;
+       id->oa_size = 0;
 }
 
 /**
@@ -335,8 +389,8 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
  * amdgpu_vm_update_pages - helper to call the right asic function
  *
  * @adev: amdgpu_device pointer
- * @gtt: GART instance to use for mapping
- * @gtt_flags: GTT hw access flags
+ * @src: address where to copy page table entries from
+ * @pages_addr: DMA addresses to use for mapping
  * @ib: indirect buffer to fill with commands
  * @pe: addr of the page entry
  * @addr: dst addr to write into pe
@@ -348,8 +402,8 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
  * to setup the page table using the DMA.
  */
 static void amdgpu_vm_update_pages(struct amdgpu_device *adev,
-                                  struct amdgpu_gart *gtt,
-                                  uint32_t gtt_flags,
+                                  uint64_t src,
+                                  dma_addr_t *pages_addr,
                                   struct amdgpu_ib *ib,
                                   uint64_t pe, uint64_t addr,
                                   unsigned count, uint32_t incr,
@@ -357,12 +411,11 @@ static void amdgpu_vm_update_pages(struct amdgpu_device *adev,
 {
        trace_amdgpu_vm_set_page(pe, addr, count, incr, flags);
 
-       if ((gtt == &adev->gart) && (flags == gtt_flags)) {
-               uint64_t src = gtt->table_addr + (addr >> 12) * 8;
+       if (src) {
+               src += (addr >> 12) * 8;
                amdgpu_vm_copy_pte(adev, ib, pe, src, count);
 
-       } else if (gtt) {
-               dma_addr_t *pages_addr = gtt->pages_addr;
+       } else if (pages_addr) {
                amdgpu_vm_write_pte(adev, ib, pages_addr, pe, addr,
                                    count, incr, flags);
 
@@ -412,7 +465,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,
        if (r)
                goto error;
 
-       amdgpu_vm_update_pages(adev, NULL, 0, &job->ibs[0], addr, 0, entries,
+       amdgpu_vm_update_pages(adev, 0, NULL, &job->ibs[0], addr, 0, entries,
                               0, 0);
        amdgpu_ring_pad_ib(ring, &job->ibs[0]);
 
@@ -522,7 +575,7 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
                    ((last_pt + incr * count) != pt)) {
 
                        if (count) {
-                               amdgpu_vm_update_pages(adev, NULL, 0, ib,
+                               amdgpu_vm_update_pages(adev, 0, NULL, ib,
                                                       last_pde, last_pt,
                                                       count, incr,
                                                       AMDGPU_PTE_VALID);
@@ -537,7 +590,7 @@ int amdgpu_vm_update_page_directory(struct amdgpu_device *adev,
        }
 
        if (count)
-               amdgpu_vm_update_pages(adev, NULL, 0, ib, last_pde, last_pt,
+               amdgpu_vm_update_pages(adev, 0, NULL, ib, last_pde, last_pt,
                                       count, incr, AMDGPU_PTE_VALID);
 
        if (ib->length_dw != 0) {
@@ -570,8 +623,8 @@ error_free:
  * amdgpu_vm_frag_ptes - add fragment information to PTEs
  *
  * @adev: amdgpu_device pointer
- * @gtt: GART instance to use for mapping
- * @gtt_flags: GTT hw mapping flags
+ * @src: address where to copy page table entries from
+ * @pages_addr: DMA addresses to use for mapping
  * @ib: IB for the update
  * @pe_start: first PTE to handle
  * @pe_end: last PTE to handle
@@ -579,8 +632,8 @@ error_free:
  * @flags: hw mapping flags
  */
 static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
-                               struct amdgpu_gart *gtt,
-                               uint32_t gtt_flags,
+                               uint64_t src,
+                               dma_addr_t *pages_addr,
                                struct amdgpu_ib *ib,
                                uint64_t pe_start, uint64_t pe_end,
                                uint64_t addr, uint32_t flags)
@@ -618,10 +671,11 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
                return;
 
        /* system pages are non continuously */
-       if (gtt || !(flags & AMDGPU_PTE_VALID) || (frag_start >= frag_end)) {
+       if (src || pages_addr || !(flags & AMDGPU_PTE_VALID) ||
+           (frag_start >= frag_end)) {
 
                count = (pe_end - pe_start) / 8;
-               amdgpu_vm_update_pages(adev, gtt, gtt_flags, ib, pe_start,
+               amdgpu_vm_update_pages(adev, src, pages_addr, ib, pe_start,
                                       addr, count, AMDGPU_GPU_PAGE_SIZE,
                                       flags);
                return;
@@ -630,21 +684,21 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
        /* handle the 4K area at the beginning */
        if (pe_start != frag_start) {
                count = (frag_start - pe_start) / 8;
-               amdgpu_vm_update_pages(adev, NULL, 0, ib, pe_start, addr,
+               amdgpu_vm_update_pages(adev, 0, NULL, ib, pe_start, addr,
                                       count, AMDGPU_GPU_PAGE_SIZE, flags);
                addr += AMDGPU_GPU_PAGE_SIZE * count;
        }
 
        /* handle the area in the middle */
        count = (frag_end - frag_start) / 8;
-       amdgpu_vm_update_pages(adev, NULL, 0, ib, frag_start, addr, count,
+       amdgpu_vm_update_pages(adev, 0, NULL, ib, frag_start, addr, count,
                               AMDGPU_GPU_PAGE_SIZE, flags | frag_flags);
 
        /* handle the 4K area at the end */
        if (frag_end != pe_end) {
                addr += AMDGPU_GPU_PAGE_SIZE * count;
                count = (pe_end - frag_end) / 8;
-               amdgpu_vm_update_pages(adev, NULL, 0, ib, frag_end, addr,
+               amdgpu_vm_update_pages(adev, 0, NULL, ib, frag_end, addr,
                                       count, AMDGPU_GPU_PAGE_SIZE, flags);
        }
 }
@@ -653,8 +707,8 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
  * amdgpu_vm_update_ptes - make sure that page tables are valid
  *
  * @adev: amdgpu_device pointer
- * @gtt: GART instance to use for mapping
- * @gtt_flags: GTT hw mapping flags
+ * @src: address where to copy page table entries from
+ * @pages_addr: DMA addresses to use for mapping
  * @vm: requested vm
  * @start: start of GPU address range
  * @end: end of GPU address range
@@ -664,8 +718,8 @@ static void amdgpu_vm_frag_ptes(struct amdgpu_device *adev,
  * Update the page tables in the range @start - @end.
  */
 static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
-                                 struct amdgpu_gart *gtt,
-                                 uint32_t gtt_flags,
+                                 uint64_t src,
+                                 dma_addr_t *pages_addr,
                                  struct amdgpu_vm *vm,
                                  struct amdgpu_ib *ib,
                                  uint64_t start, uint64_t end,
@@ -693,7 +747,7 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
 
                if (last_pe_end != pe_start) {
 
-                       amdgpu_vm_frag_ptes(adev, gtt, gtt_flags, ib,
+                       amdgpu_vm_frag_ptes(adev, src, pages_addr, ib,
                                            last_pe_start, last_pe_end,
                                            last_dst, flags);
 
@@ -708,17 +762,16 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
                dst += nptes * AMDGPU_GPU_PAGE_SIZE;
        }
 
-       amdgpu_vm_frag_ptes(adev, gtt, gtt_flags, ib,
-                           last_pe_start, last_pe_end,
-                           last_dst, flags);
+       amdgpu_vm_frag_ptes(adev, src, pages_addr, ib, last_pe_start,
+                           last_pe_end, last_dst, flags);
 }
 
 /**
  * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table
  *
  * @adev: amdgpu_device pointer
- * @gtt: GART instance to use for mapping
- * @gtt_flags: flags as they are used for GTT
+ * @src: address where to copy page table entries from
+ * @pages_addr: DMA addresses to use for mapping
  * @vm: requested vm
  * @start: start of mapped range
  * @last: last mapped entry
@@ -730,8 +783,8 @@ static void amdgpu_vm_update_ptes(struct amdgpu_device *adev,
  * Returns 0 for success, -EINVAL for failure.
  */
 static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
-                                      struct amdgpu_gart *gtt,
-                                      uint32_t gtt_flags,
+                                      uint64_t src,
+                                      dma_addr_t *pages_addr,
                                       struct amdgpu_vm *vm,
                                       uint64_t start, uint64_t last,
                                       uint32_t flags, uint64_t addr,
@@ -762,11 +815,11 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
        /* padding, etc. */
        ndw = 64;
 
-       if ((gtt == &adev->gart) && (flags == gtt_flags)) {
+       if (src) {
                /* only copy commands needed */
                ndw += ncmds * 7;
 
-       } else if (gtt) {
+       } else if (pages_addr) {
                /* header for write data commands */
                ndw += ncmds * 4;
 
@@ -796,8 +849,8 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
        if (r)
                goto error_free;
 
-       amdgpu_vm_update_ptes(adev, gtt, gtt_flags, vm, ib, start, last + 1,
-                             addr, flags);
+       amdgpu_vm_update_ptes(adev, src, pages_addr, vm, ib, start,
+                             last + 1, addr, flags);
 
        amdgpu_ring_pad_ib(ring, ib);
        WARN_ON(ib->length_dw > ndw);
@@ -823,11 +876,12 @@ error_free:
  * amdgpu_vm_bo_split_mapping - split a mapping into smaller chunks
  *
  * @adev: amdgpu_device pointer
- * @gtt: GART instance to use for mapping
+ * @gtt_flags: flags as they are used for GTT
+ * @pages_addr: DMA addresses to use for mapping
  * @vm: requested vm
  * @mapping: mapped range and flags to use for the update
  * @addr: addr to set the area to
- * @gtt_flags: flags as they are used for GTT
+ * @flags: HW flags for the mapping
  * @fence: optional resulting fence
  *
  * Split the mapping into smaller chunks so that each update fits
@@ -835,16 +889,16 @@ error_free:
  * Returns 0 for success, -EINVAL for failure.
  */
 static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
-                                     struct amdgpu_gart *gtt,
                                      uint32_t gtt_flags,
+                                     dma_addr_t *pages_addr,
                                      struct amdgpu_vm *vm,
                                      struct amdgpu_bo_va_mapping *mapping,
-                                     uint64_t addr, struct fence **fence)
+                                     uint32_t flags, uint64_t addr,
+                                     struct fence **fence)
 {
        const uint64_t max_size = 64ULL * 1024ULL * 1024ULL / AMDGPU_GPU_PAGE_SIZE;
 
-       uint64_t start = mapping->it.start;
-       uint32_t flags = gtt_flags;
+       uint64_t src = 0, start = mapping->it.start;
        int r;
 
        /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here
@@ -857,10 +911,15 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
 
        trace_amdgpu_vm_bo_update(mapping);
 
+       if (pages_addr) {
+               if (flags == gtt_flags)
+                       src = adev->gart.table_addr + (addr >> 12) * 8;
+               addr = 0;
+       }
        addr += mapping->offset;
 
-       if (!gtt || ((gtt == &adev->gart) && (flags == gtt_flags)))
-               return amdgpu_vm_bo_update_mapping(adev, gtt, gtt_flags, vm,
+       if (!pages_addr || src)
+               return amdgpu_vm_bo_update_mapping(adev, src, pages_addr, vm,
                                                   start, mapping->it.last,
                                                   flags, addr, fence);
 
@@ -868,7 +927,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,
                uint64_t last;
 
                last = min((uint64_t)mapping->it.last, start + max_size - 1);
-               r = amdgpu_vm_bo_update_mapping(adev, gtt, gtt_flags, vm,
+               r = amdgpu_vm_bo_update_mapping(adev, src, pages_addr, vm,
                                                start, last, flags, addr,
                                                fence);
                if (r)
@@ -899,16 +958,20 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
 {
        struct amdgpu_vm *vm = bo_va->vm;
        struct amdgpu_bo_va_mapping *mapping;
-       struct amdgpu_gart *gtt = NULL;
-       uint32_t flags;
+       dma_addr_t *pages_addr = NULL;
+       uint32_t gtt_flags, flags;
        uint64_t addr;
        int r;
 
        if (mem) {
+               struct ttm_dma_tt *ttm;
+
                addr = (u64)mem->start << PAGE_SHIFT;
                switch (mem->mem_type) {
                case TTM_PL_TT:
-                       gtt = &bo_va->bo->adev->gart;
+                       ttm = container_of(bo_va->bo->tbo.ttm, struct
+                                          ttm_dma_tt, ttm);
+                       pages_addr = ttm->dma_address;
                        break;
 
                case TTM_PL_VRAM:
@@ -923,6 +986,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        }
 
        flags = amdgpu_ttm_tt_pte_flags(adev, bo_va->bo->tbo.ttm, mem);
+       gtt_flags = (adev == bo_va->bo->adev) ? flags : 0;
 
        spin_lock(&vm->status_lock);
        if (!list_empty(&bo_va->vm_status))
@@ -930,7 +994,8 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        spin_unlock(&vm->status_lock);
 
        list_for_each_entry(mapping, &bo_va->invalids, list) {
-               r = amdgpu_vm_bo_split_mapping(adev, gtt, flags, vm, mapping, addr,
+               r = amdgpu_vm_bo_split_mapping(adev, gtt_flags, pages_addr, vm,
+                                              mapping, flags, addr,
                                               &bo_va->last_pt_update);
                if (r)
                        return r;
@@ -976,8 +1041,8 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
                        struct amdgpu_bo_va_mapping, list);
                list_del(&mapping->list);
 
-               r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, vm, mapping,
-                                              0, NULL);
+               r = amdgpu_vm_bo_split_mapping(adev, 0, NULL, vm, mapping,
+                                              0, 0, NULL);
                kfree(mapping);
                if (r)
                        return r;
@@ -1320,11 +1385,10 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
        struct amd_sched_rq *rq;
        int i, r;
 
-       for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
-               vm->ids[i].mgr_id = NULL;
-               vm->ids[i].flushed_updates = NULL;
-       }
+       for (i = 0; i < AMDGPU_MAX_RINGS; ++i)
+               vm->ids[i] = NULL;
        vm->va = RB_ROOT;
+       vm->client_id = atomic64_inc_return(&adev->vm_manager.client_counter);
        spin_lock_init(&vm->status_lock);
        INIT_LIST_HEAD(&vm->invalidated);
        INIT_LIST_HEAD(&vm->cleared);
@@ -1416,15 +1480,6 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
 
        amdgpu_bo_unref(&vm->page_directory);
        fence_put(vm->page_directory_fence);
-
-       for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
-               struct amdgpu_vm_id *id = &vm->ids[i];
-
-               if (id->mgr_id)
-                       atomic_long_cmpxchg(&id->mgr_id->owner,
-                                           (long)id, 0);
-               fence_put(id->flushed_updates);
-       }
 }
 
 /**
@@ -1443,11 +1498,13 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)
        /* skip over VMID 0, since it is the system VM */
        for (i = 1; i < adev->vm_manager.num_ids; ++i) {
                amdgpu_vm_reset_id(adev, i);
+               amdgpu_sync_create(&adev->vm_manager.ids[i].active);
                list_add_tail(&adev->vm_manager.ids[i].list,
                              &adev->vm_manager.ids_lru);
        }
 
        atomic_set(&adev->vm_manager.vm_pte_next_ring, 0);
+       atomic64_set(&adev->vm_manager.client_counter, 0);
 }
 
 /**
@@ -1461,6 +1518,11 @@ void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
 {
        unsigned i;
 
-       for (i = 0; i < AMDGPU_NUM_VM; ++i)
-               fence_put(adev->vm_manager.ids[i].active);
+       for (i = 0; i < AMDGPU_NUM_VM; ++i) {
+               struct amdgpu_vm_id *id = &adev->vm_manager.ids[i];
+
+               fence_put(adev->vm_manager.ids[i].first);
+               amdgpu_sync_free(&adev->vm_manager.ids[i].active);
+               fence_put(id->flushed_updates);
+       }
 }
index fece8f45dc7a3308c81f22e29fbd8b2a5e1bff70..49daf6d723e5557f740ebc6a7f7eb8f579beecba 100644 (file)
@@ -92,7 +92,7 @@
 #define ATOM_WS_AND_MASK       0x45
 #define ATOM_WS_FB_WINDOW      0x46
 #define ATOM_WS_ATTRIBUTES     0x47
-#define ATOM_WS_REGPTR         0x48
+#define ATOM_WS_REGPTR         0x48
 
 #define ATOM_IIO_NOP           0
 #define ATOM_IIO_START         1
index 49aa350166534f161288322b1ad04241d4ac6ba8..49a39b1a0a9637290b8b874eabef5ffba84c04ab 100644 (file)
@@ -461,13 +461,14 @@ union set_pixel_clock {
        PIXEL_CLOCK_PARAMETERS_V3 v3;
        PIXEL_CLOCK_PARAMETERS_V5 v5;
        PIXEL_CLOCK_PARAMETERS_V6 v6;
+       PIXEL_CLOCK_PARAMETERS_V7 v7;
 };
 
 /* on DCE5, make sure the voltage is high enough to support the
  * required disp clk.
  */
 void amdgpu_atombios_crtc_set_disp_eng_pll(struct amdgpu_device *adev,
-                                   u32 dispclk)
+                                          u32 dispclk)
 {
        u8 frev, crev;
        int index;
@@ -510,6 +511,49 @@ void amdgpu_atombios_crtc_set_disp_eng_pll(struct amdgpu_device *adev,
        amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
 }
 
+union set_dce_clock {
+       SET_DCE_CLOCK_PS_ALLOCATION_V1_1 v1_1;
+       SET_DCE_CLOCK_PS_ALLOCATION_V2_1 v2_1;
+};
+
+u32 amdgpu_atombios_crtc_set_dce_clock(struct amdgpu_device *adev,
+                                      u32 freq, u8 clk_type, u8 clk_src)
+{
+       u8 frev, crev;
+       int index;
+       union set_dce_clock args;
+       u32 ret_freq = 0;
+
+       memset(&args, 0, sizeof(args));
+
+       index = GetIndexIntoMasterTable(COMMAND, SetDCEClock);
+       if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev,
+                                  &crev))
+               return 0;
+
+       switch (frev) {
+       case 2:
+               switch (crev) {
+               case 1:
+                       args.v2_1.asParam.ulDCEClkFreq = cpu_to_le32(freq); /* 10kHz units */
+                       args.v2_1.asParam.ucDCEClkType = clk_type;
+                       args.v2_1.asParam.ucDCEClkSrc = clk_src;
+                       amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args);
+                       ret_freq = le32_to_cpu(args.v2_1.asParam.ulDCEClkFreq) * 10;
+                       break;
+               default:
+                       DRM_ERROR("Unknown table version %d %d\n", frev, crev);
+                       return 0;
+               }
+               break;
+       default:
+               DRM_ERROR("Unknown table version %d %d\n", frev, crev);
+               return 0;
+       }
+
+       return ret_freq;
+}
+
 static bool is_pixel_clock_source_from_pll(u32 encoder_mode, int pll_id)
 {
        if (ENCODER_MODE_IS_DP(encoder_mode)) {
@@ -523,18 +567,18 @@ static bool is_pixel_clock_source_from_pll(u32 encoder_mode, int pll_id)
 }
 
 void amdgpu_atombios_crtc_program_pll(struct drm_crtc *crtc,
-                              u32 crtc_id,
-                              int pll_id,
-                              u32 encoder_mode,
-                              u32 encoder_id,
-                              u32 clock,
-                              u32 ref_div,
-                              u32 fb_div,
-                              u32 frac_fb_div,
-                              u32 post_div,
-                              int bpc,
-                              bool ss_enabled,
-                              struct amdgpu_atom_ss *ss)
+                                     u32 crtc_id,
+                                     int pll_id,
+                                     u32 encoder_mode,
+                                     u32 encoder_id,
+                                     u32 clock,
+                                     u32 ref_div,
+                                     u32 fb_div,
+                                     u32 frac_fb_div,
+                                     u32 post_div,
+                                     int bpc,
+                                     bool ss_enabled,
+                                     struct amdgpu_atom_ss *ss)
 {
        struct drm_device *dev = crtc->dev;
        struct amdgpu_device *adev = dev->dev_private;
@@ -652,6 +696,34 @@ void amdgpu_atombios_crtc_program_pll(struct drm_crtc *crtc,
                        args.v6.ucEncoderMode = encoder_mode;
                        args.v6.ucPpll = pll_id;
                        break;
+               case 7:
+                       args.v7.ulPixelClock = cpu_to_le32(clock * 10); /* 100 hz units */
+                       args.v7.ucMiscInfo = 0;
+                       if ((encoder_mode == ATOM_ENCODER_MODE_DVI) &&
+                           (clock > 165000))
+                               args.v7.ucMiscInfo |= PIXEL_CLOCK_V7_MISC_DVI_DUALLINK_EN;
+                       args.v7.ucCRTC = crtc_id;
+                       if (encoder_mode == ATOM_ENCODER_MODE_HDMI) {
+                               switch (bpc) {
+                               case 8:
+                               default:
+                                       args.v7.ucDeepColorRatio = PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_DIS;
+                                       break;
+                               case 10:
+                                       args.v7.ucDeepColorRatio = PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_5_4;
+                                       break;
+                               case 12:
+                                       args.v7.ucDeepColorRatio = PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_3_2;
+                                       break;
+                               case 16:
+                                       args.v7.ucDeepColorRatio = PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_2_1;
+                                       break;
+                               }
+                       }
+                       args.v7.ucTransmitterID = encoder_id;
+                       args.v7.ucEncoderMode = encoder_mode;
+                       args.v7.ucPpll = pll_id;
+                       break;
                default:
                        DRM_ERROR("Unknown table version %d %d\n", frev, crev);
                        return;
index c67083335b13817a99f3220649f193fd29cb302f..0eeda8e3bf5c07590d68394edefd54203cce2192 100644 (file)
@@ -37,6 +37,8 @@ void amdgpu_atombios_crtc_set_dtd_timing(struct drm_crtc *crtc,
                                  struct drm_display_mode *mode);
 void amdgpu_atombios_crtc_set_disp_eng_pll(struct amdgpu_device *adev,
                                    u32 dispclk);
+u32 amdgpu_atombios_crtc_set_dce_clock(struct amdgpu_device *adev,
+                                      u32 freq, u8 clk_type, u8 clk_src);
 void amdgpu_atombios_crtc_program_pll(struct drm_crtc *crtc,
                               u32 crtc_id,
                               int pll_id,
index 1cd6de575305aa3f657fa1a7f5a70232b272d739..48b6bd671cda80fbed1fa1dc6efe85ddc686eec3 100644 (file)
@@ -567,6 +567,7 @@ union dig_encoder_control {
        DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
        DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
        DIG_ENCODER_CONTROL_PARAMETERS_V4 v4;
+       DIG_ENCODER_CONTROL_PARAMETERS_V5 v5;
 };
 
 void
@@ -694,6 +695,47 @@ amdgpu_atombios_encoder_setup_dig_encoder(struct drm_encoder *encoder,
                        else
                                args.v4.ucHPD_ID = hpd_id + 1;
                        break;
+               case 5:
+                       switch (action) {
+                       case ATOM_ENCODER_CMD_SETUP_PANEL_MODE:
+                               args.v5.asDPPanelModeParam.ucAction = action;
+                               args.v5.asDPPanelModeParam.ucPanelMode = panel_mode;
+                               args.v5.asDPPanelModeParam.ucDigId = dig->dig_encoder;
+                               break;
+                       case ATOM_ENCODER_CMD_STREAM_SETUP:
+                               args.v5.asStreamParam.ucAction = action;
+                               args.v5.asStreamParam.ucDigId = dig->dig_encoder;
+                               args.v5.asStreamParam.ucDigMode =
+                                       amdgpu_atombios_encoder_get_encoder_mode(encoder);
+                               if (ENCODER_MODE_IS_DP(args.v5.asStreamParam.ucDigMode))
+                                       args.v5.asStreamParam.ucLaneNum = dp_lane_count;
+                               else if (amdgpu_dig_monitor_is_duallink(encoder,
+                                                                       amdgpu_encoder->pixel_clock))
+                                       args.v5.asStreamParam.ucLaneNum = 8;
+                               else
+                                       args.v5.asStreamParam.ucLaneNum = 4;
+                               args.v5.asStreamParam.ulPixelClock =
+                                       cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
+                               args.v5.asStreamParam.ucBitPerColor =
+                                       amdgpu_atombios_encoder_get_bpc(encoder);
+                               args.v5.asStreamParam.ucLinkRateIn270Mhz = dp_clock / 27000;
+                               break;
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_START:
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1:
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2:
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN3:
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN4:
+                       case ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE:
+                       case ATOM_ENCODER_CMD_DP_VIDEO_OFF:
+                       case ATOM_ENCODER_CMD_DP_VIDEO_ON:
+                               args.v5.asCmdParam.ucAction = action;
+                               args.v5.asCmdParam.ucDigId = dig->dig_encoder;
+                               break;
+                       default:
+                               DRM_ERROR("Unsupported action 0x%x\n", action);
+                               break;
+                       }
+                       break;
                default:
                        DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
                        break;
@@ -714,11 +756,12 @@ union dig_transmitter_control {
        DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
        DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4;
        DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5 v5;
+       DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_6 v6;
 };
 
 void
 amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int action,
-                                      uint8_t lane_num, uint8_t lane_set)
+                                             uint8_t lane_num, uint8_t lane_set)
 {
        struct drm_device *dev = encoder->dev;
        struct amdgpu_device *adev = dev->dev_private;
@@ -1070,6 +1113,54 @@ amdgpu_atombios_encoder_setup_dig_transmitter(struct drm_encoder *encoder, int a
                        args.v5.ucDigEncoderSel = 1 << dig_encoder;
                        args.v5.ucDPLaneSet = lane_set;
                        break;
+               case 6:
+                       args.v6.ucAction = action;
+                       if (is_dp)
+                               args.v6.ulSymClock = cpu_to_le32(dp_clock / 10);
+                       else
+                               args.v6.ulSymClock = cpu_to_le32(amdgpu_encoder->pixel_clock / 10);
+
+                       switch (amdgpu_encoder->encoder_id) {
+                       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
+                               if (dig->linkb)
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYB;
+                               else
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYA;
+                               break;
+                       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
+                               if (dig->linkb)
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYD;
+                               else
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYC;
+                               break;
+                       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
+                               if (dig->linkb)
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYF;
+                               else
+                                       args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYE;
+                               break;
+                       case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
+                               args.v6.ucPhyId = ATOM_PHY_ID_UNIPHYG;
+                               break;
+                       }
+                       if (is_dp)
+                               args.v6.ucLaneNum = dp_lane_count;
+                       else if (amdgpu_dig_monitor_is_duallink(encoder, amdgpu_encoder->pixel_clock))
+                               args.v6.ucLaneNum = 8;
+                       else
+                               args.v6.ucLaneNum = 4;
+                       args.v6.ucConnObjId = connector_object_id;
+                       if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH)
+                               args.v6.ucDPLaneSet = lane_set;
+                       else
+                               args.v6.ucDigMode = amdgpu_atombios_encoder_get_encoder_mode(encoder);
+
+                       if (hpd_id == AMDGPU_HPD_NONE)
+                               args.v6.ucHPDSel = 0;
+                       else
+                               args.v6.ucHPDSel = hpd_id + 1;
+                       args.v6.ucDigEncoderSel = 1 << dig_encoder;
+                       break;
                default:
                        DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
                        break;
index 1f9109d3348bf63baf6b687de63d620d763bac18..ea407db1fbcfaaa54c844e7f41e06eb3a04bb1a2 100644 (file)
@@ -2549,19 +2549,17 @@ static int ci_get_dependency_volt_by_clk(struct amdgpu_device *adev,
        return 0;
 }
 
-static u8 ci_get_sleep_divider_id_from_clock(struct amdgpu_device *adev,
-                                            u32 sclk, u32 min_sclk_in_sr)
+static u8 ci_get_sleep_divider_id_from_clock(u32 sclk, u32 min_sclk_in_sr)
 {
        u32 i;
        u32 tmp;
-       u32 min = (min_sclk_in_sr > CISLAND_MINIMUM_ENGINE_CLOCK) ?
-               min_sclk_in_sr : CISLAND_MINIMUM_ENGINE_CLOCK;
+       u32 min = max(min_sclk_in_sr, (u32)CISLAND_MINIMUM_ENGINE_CLOCK);
 
        if (sclk < min)
                return 0;
 
        for (i = CISLAND_MAX_DEEPSLEEP_DIVIDER_ID;  ; i--) {
-               tmp = sclk / (1 << i);
+               tmp = sclk >> i;
                if (tmp >= min || i == 0)
                        break;
        }
@@ -3358,8 +3356,7 @@ static int ci_populate_single_graphic_level(struct amdgpu_device *adev,
        graphic_level->PowerThrottle = 0;
 
        if (pi->caps_sclk_ds)
-               graphic_level->DeepSleepDivId = ci_get_sleep_divider_id_from_clock(adev,
-                                                                                  engine_clock,
+               graphic_level->DeepSleepDivId = ci_get_sleep_divider_id_from_clock(engine_clock,
                                                                                   CISLAND_MINIMUM_ENGINE_CLOCK);
 
        graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
@@ -6309,215 +6306,6 @@ static int ci_dpm_wait_for_idle(void *handle)
        return 0;
 }
 
-static void ci_dpm_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "CIK DPM registers\n");
-       dev_info(adev->dev, "  BIOS_SCRATCH_4=0x%08X\n",
-                RREG32(mmBIOS_SCRATCH_4));
-       dev_info(adev->dev, "  MC_ARB_DRAM_TIMING=0x%08X\n",
-                RREG32(mmMC_ARB_DRAM_TIMING));
-       dev_info(adev->dev, "  MC_ARB_DRAM_TIMING2=0x%08X\n",
-                RREG32(mmMC_ARB_DRAM_TIMING2));
-       dev_info(adev->dev, "  MC_ARB_BURST_TIME=0x%08X\n",
-                RREG32(mmMC_ARB_BURST_TIME));
-       dev_info(adev->dev, "  MC_ARB_DRAM_TIMING_1=0x%08X\n",
-                RREG32(mmMC_ARB_DRAM_TIMING_1));
-       dev_info(adev->dev, "  MC_ARB_DRAM_TIMING2_1=0x%08X\n",
-                RREG32(mmMC_ARB_DRAM_TIMING2_1));
-       dev_info(adev->dev, "  MC_CG_CONFIG=0x%08X\n",
-                RREG32(mmMC_CG_CONFIG));
-       dev_info(adev->dev, "  MC_ARB_CG=0x%08X\n",
-                RREG32(mmMC_ARB_CG));
-       dev_info(adev->dev, "  DIDT_SQ_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_SQ_CTRL0));
-       dev_info(adev->dev, "  DIDT_DB_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_DB_CTRL0));
-       dev_info(adev->dev, "  DIDT_TD_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_TD_CTRL0));
-       dev_info(adev->dev, "  DIDT_TCP_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_TCP_CTRL0));
-       dev_info(adev->dev, "  CG_THERMAL_INT=0x%08X\n",
-                RREG32_SMC(ixCG_THERMAL_INT));
-       dev_info(adev->dev, "  CG_THERMAL_CTRL=0x%08X\n",
-                RREG32_SMC(ixCG_THERMAL_CTRL));
-       dev_info(adev->dev, "  GENERAL_PWRMGT=0x%08X\n",
-                RREG32_SMC(ixGENERAL_PWRMGT));
-       dev_info(adev->dev, "  MC_SEQ_CNTL_3=0x%08X\n",
-                RREG32(mmMC_SEQ_CNTL_3));
-       dev_info(adev->dev, "  LCAC_MC0_CNTL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC0_CNTL));
-       dev_info(adev->dev, "  LCAC_MC1_CNTL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC1_CNTL));
-       dev_info(adev->dev, "  LCAC_CPL_CNTL=0x%08X\n",
-                RREG32_SMC(ixLCAC_CPL_CNTL));
-       dev_info(adev->dev, "  SCLK_PWRMGT_CNTL=0x%08X\n",
-                RREG32_SMC(ixSCLK_PWRMGT_CNTL));
-       dev_info(adev->dev, "  BIF_LNCNT_RESET=0x%08X\n",
-                RREG32(mmBIF_LNCNT_RESET));
-       dev_info(adev->dev, "  FIRMWARE_FLAGS=0x%08X\n",
-                RREG32_SMC(ixFIRMWARE_FLAGS));
-       dev_info(adev->dev, "  CG_SPLL_FUNC_CNTL=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_FUNC_CNTL));
-       dev_info(adev->dev, "  CG_SPLL_FUNC_CNTL_2=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_FUNC_CNTL_2));
-       dev_info(adev->dev, "  CG_SPLL_FUNC_CNTL_3=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_FUNC_CNTL_3));
-       dev_info(adev->dev, "  CG_SPLL_FUNC_CNTL_4=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_FUNC_CNTL_4));
-       dev_info(adev->dev, "  CG_SPLL_SPREAD_SPECTRUM=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_SPREAD_SPECTRUM));
-       dev_info(adev->dev, "  CG_SPLL_SPREAD_SPECTRUM_2=0x%08X\n",
-                RREG32_SMC(ixCG_SPLL_SPREAD_SPECTRUM_2));
-       dev_info(adev->dev, "  DLL_CNTL=0x%08X\n",
-                RREG32(mmDLL_CNTL));
-       dev_info(adev->dev, "  MCLK_PWRMGT_CNTL=0x%08X\n",
-                RREG32(mmMCLK_PWRMGT_CNTL));
-       dev_info(adev->dev, "  MPLL_AD_FUNC_CNTL=0x%08X\n",
-                RREG32(mmMPLL_AD_FUNC_CNTL));
-       dev_info(adev->dev, "  MPLL_DQ_FUNC_CNTL=0x%08X\n",
-                RREG32(mmMPLL_DQ_FUNC_CNTL));
-       dev_info(adev->dev, "  MPLL_FUNC_CNTL=0x%08X\n",
-                RREG32(mmMPLL_FUNC_CNTL));
-       dev_info(adev->dev, "  MPLL_FUNC_CNTL_1=0x%08X\n",
-                RREG32(mmMPLL_FUNC_CNTL_1));
-       dev_info(adev->dev, "  MPLL_FUNC_CNTL_2=0x%08X\n",
-                RREG32(mmMPLL_FUNC_CNTL_2));
-       dev_info(adev->dev, "  MPLL_SS1=0x%08X\n",
-                RREG32(mmMPLL_SS1));
-       dev_info(adev->dev, "  MPLL_SS2=0x%08X\n",
-                RREG32(mmMPLL_SS2));
-       dev_info(adev->dev, "  CG_DISPLAY_GAP_CNTL=0x%08X\n",
-                RREG32_SMC(ixCG_DISPLAY_GAP_CNTL));
-       dev_info(adev->dev, "  CG_DISPLAY_GAP_CNTL2=0x%08X\n",
-                RREG32_SMC(ixCG_DISPLAY_GAP_CNTL2));
-       dev_info(adev->dev, "  CG_STATIC_SCREEN_PARAMETER=0x%08X\n",
-                RREG32_SMC(ixCG_STATIC_SCREEN_PARAMETER));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_0=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_0));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_1=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_1));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_2=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_2));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_3=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_3));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_4=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_4));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_5=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_5));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_6=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_6));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_7=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_7));
-       dev_info(adev->dev, "  RCU_UC_EVENTS=0x%08X\n",
-                RREG32_SMC(ixRCU_UC_EVENTS));
-       dev_info(adev->dev, "  DPM_TABLE_475=0x%08X\n",
-                RREG32_SMC(ixDPM_TABLE_475));
-       dev_info(adev->dev, "  MC_SEQ_RAS_TIMING_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_RAS_TIMING_LP));
-       dev_info(adev->dev, "  MC_SEQ_RAS_TIMING=0x%08X\n",
-                RREG32(mmMC_SEQ_RAS_TIMING));
-       dev_info(adev->dev, "  MC_SEQ_CAS_TIMING_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_CAS_TIMING_LP));
-       dev_info(adev->dev, "  MC_SEQ_CAS_TIMING=0x%08X\n",
-                RREG32(mmMC_SEQ_CAS_TIMING));
-       dev_info(adev->dev, "  MC_SEQ_DLL_STBY_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_DLL_STBY_LP));
-       dev_info(adev->dev, "  MC_SEQ_DLL_STBY=0x%08X\n",
-                RREG32(mmMC_SEQ_DLL_STBY));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CMD0_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CMD0_LP));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CMD0=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CMD0));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CMD1_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CMD1_LP));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CMD1=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CMD1));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CTRL_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CTRL_LP));
-       dev_info(adev->dev, "  MC_SEQ_G5PDX_CTRL=0x%08X\n",
-                RREG32(mmMC_SEQ_G5PDX_CTRL));
-       dev_info(adev->dev, "  MC_SEQ_PMG_DVS_CMD_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_DVS_CMD_LP));
-       dev_info(adev->dev, "  MC_SEQ_PMG_DVS_CMD=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_DVS_CMD));
-       dev_info(adev->dev, "  MC_SEQ_PMG_DVS_CTL_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_DVS_CTL_LP));
-       dev_info(adev->dev, "  MC_SEQ_PMG_DVS_CTL=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_DVS_CTL));
-       dev_info(adev->dev, "  MC_SEQ_MISC_TIMING_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_MISC_TIMING_LP));
-       dev_info(adev->dev, "  MC_SEQ_MISC_TIMING=0x%08X\n",
-                RREG32(mmMC_SEQ_MISC_TIMING));
-       dev_info(adev->dev, "  MC_SEQ_MISC_TIMING2_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_MISC_TIMING2_LP));
-       dev_info(adev->dev, "  MC_SEQ_MISC_TIMING2=0x%08X\n",
-                RREG32(mmMC_SEQ_MISC_TIMING2));
-       dev_info(adev->dev, "  MC_SEQ_PMG_CMD_EMRS_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_CMD_EMRS_LP));
-       dev_info(adev->dev, "  MC_PMG_CMD_EMRS=0x%08X\n",
-                RREG32(mmMC_PMG_CMD_EMRS));
-       dev_info(adev->dev, "  MC_SEQ_PMG_CMD_MRS_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_CMD_MRS_LP));
-       dev_info(adev->dev, "  MC_PMG_CMD_MRS=0x%08X\n",
-                RREG32(mmMC_PMG_CMD_MRS));
-       dev_info(adev->dev, "  MC_SEQ_PMG_CMD_MRS1_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_CMD_MRS1_LP));
-       dev_info(adev->dev, "  MC_PMG_CMD_MRS1=0x%08X\n",
-                RREG32(mmMC_PMG_CMD_MRS1));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_D0_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_D0_LP));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_D0=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_D0));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_D1_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_D1_LP));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_D1=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_D1));
-       dev_info(adev->dev, "  MC_SEQ_RD_CTL_D0_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_RD_CTL_D0_LP));
-       dev_info(adev->dev, "  MC_SEQ_RD_CTL_D0=0x%08X\n",
-                RREG32(mmMC_SEQ_RD_CTL_D0));
-       dev_info(adev->dev, "  MC_SEQ_RD_CTL_D1_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_RD_CTL_D1_LP));
-       dev_info(adev->dev, "  MC_SEQ_RD_CTL_D1=0x%08X\n",
-                RREG32(mmMC_SEQ_RD_CTL_D1));
-       dev_info(adev->dev, "  MC_SEQ_PMG_TIMING_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_TIMING_LP));
-       dev_info(adev->dev, "  MC_SEQ_PMG_TIMING=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_TIMING));
-       dev_info(adev->dev, "  MC_SEQ_PMG_CMD_MRS2_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_PMG_CMD_MRS2_LP));
-       dev_info(adev->dev, "  MC_PMG_CMD_MRS2=0x%08X\n",
-                RREG32(mmMC_PMG_CMD_MRS2));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_2_LP=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_2_LP));
-       dev_info(adev->dev, "  MC_SEQ_WR_CTL_2=0x%08X\n",
-                RREG32(mmMC_SEQ_WR_CTL_2));
-       dev_info(adev->dev, "  PCIE_LC_SPEED_CNTL=0x%08X\n",
-                RREG32_PCIE(ixPCIE_LC_SPEED_CNTL));
-       dev_info(adev->dev, "  PCIE_LC_LINK_WIDTH_CNTL=0x%08X\n",
-                RREG32_PCIE(ixPCIE_LC_LINK_WIDTH_CNTL));
-       dev_info(adev->dev, "  SMC_IND_INDEX_0=0x%08X\n",
-                RREG32(mmSMC_IND_INDEX_0));
-       dev_info(adev->dev, "  SMC_IND_DATA_0=0x%08X\n",
-                RREG32(mmSMC_IND_DATA_0));
-       dev_info(adev->dev, "  SMC_IND_ACCESS_CNTL=0x%08X\n",
-                RREG32(mmSMC_IND_ACCESS_CNTL));
-       dev_info(adev->dev, "  SMC_RESP_0=0x%08X\n",
-                RREG32(mmSMC_RESP_0));
-       dev_info(adev->dev, "  SMC_MESSAGE_0=0x%08X\n",
-                RREG32(mmSMC_MESSAGE_0));
-       dev_info(adev->dev, "  SMC_SYSCON_RESET_CNTL=0x%08X\n",
-                RREG32_SMC(ixSMC_SYSCON_RESET_CNTL));
-       dev_info(adev->dev, "  SMC_SYSCON_CLOCK_CNTL_0=0x%08X\n",
-                RREG32_SMC(ixSMC_SYSCON_CLOCK_CNTL_0));
-       dev_info(adev->dev, "  SMC_SYSCON_MISC_CNTL=0x%08X\n",
-                RREG32_SMC(ixSMC_SYSCON_MISC_CNTL));
-       dev_info(adev->dev, "  SMC_PC_C=0x%08X\n",
-                RREG32_SMC(ixSMC_PC_C));
-}
-
 static int ci_dpm_soft_reset(void *handle)
 {
        return 0;
@@ -6572,7 +6360,7 @@ static int ci_dpm_set_interrupt_state(struct amdgpu_device *adev,
 }
 
 static int ci_dpm_process_interrupt(struct amdgpu_device *adev,
-                                   struct amdgpu_irq_src *source, 
+                                   struct amdgpu_irq_src *source,
                                    struct amdgpu_iv_entry *entry)
 {
        bool queue_thermal = false;
@@ -6614,6 +6402,7 @@ static int ci_dpm_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs ci_dpm_ip_funcs = {
+       .name = "ci_dpm",
        .early_init = ci_dpm_early_init,
        .late_init = ci_dpm_late_init,
        .sw_init = ci_dpm_sw_init,
@@ -6625,7 +6414,6 @@ const struct amd_ip_funcs ci_dpm_ip_funcs = {
        .is_idle = ci_dpm_is_idle,
        .wait_for_idle = ci_dpm_wait_for_idle,
        .soft_reset = ci_dpm_soft_reset,
-       .print_status = ci_dpm_print_status,
        .set_clockgating_state = ci_dpm_set_clockgating_state,
        .set_powergating_state = ci_dpm_set_powergating_state,
 };
index bddc9ba11495543fb3d021dc6b9ff384547b73be..07bc795a4ca9f87662bdaaa6ebd34f6846bb932b 100644 (file)
@@ -962,7 +962,7 @@ static bool cik_read_bios_from_rom(struct amdgpu_device *adev,
        return true;
 }
 
-static struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
+static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {
        {mmGRBM_STATUS, false},
        {mmGB_ADDR_CONFIG, false},
        {mmMC_ARB_RAMCFG, false},
@@ -2007,7 +2007,6 @@ static const struct amdgpu_asic_funcs cik_asic_funcs =
        .get_xclk = &cik_get_xclk,
        .set_uvd_clocks = &cik_set_uvd_clocks,
        .set_vce_clocks = &cik_set_vce_clocks,
-       .get_cu_info = &gfx_v7_0_get_cu_info,
        /* these should be moved to their own ip modules */
        .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter,
        .wait_for_mc_idle = &gmc_v7_0_mc_wait_for_idle,
@@ -2214,11 +2213,6 @@ static int cik_common_wait_for_idle(void *handle)
        return 0;
 }
 
-static void cik_common_print_status(void *handle)
-{
-
-}
-
 static int cik_common_soft_reset(void *handle)
 {
        /* XXX hard reset?? */
@@ -2238,6 +2232,7 @@ static int cik_common_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs cik_common_ip_funcs = {
+       .name = "cik_common",
        .early_init = cik_common_early_init,
        .late_init = NULL,
        .sw_init = cik_common_sw_init,
@@ -2249,7 +2244,6 @@ const struct amd_ip_funcs cik_common_ip_funcs = {
        .is_idle = cik_common_is_idle,
        .wait_for_idle = cik_common_wait_for_idle,
        .soft_reset = cik_common_soft_reset,
-       .print_status = cik_common_print_status,
        .set_clockgating_state = cik_common_set_clockgating_state,
        .set_powergating_state = cik_common_set_powergating_state,
 };
index 30c9b3beeef94111652d5151829d2da3a9b7a58f..845c21b1b2ee04587bd2ab57749f3f76045a38dd 100644 (file)
@@ -243,7 +243,7 @@ static void cik_ih_decode_iv(struct amdgpu_device *adev,
        /* wptr/rptr are in bytes! */
        u32 ring_index = adev->irq.ih.rptr >> 2;
        uint32_t dw[4];
-       
+
        dw[0] = le32_to_cpu(adev->irq.ih.ring[ring_index + 0]);
        dw[1] = le32_to_cpu(adev->irq.ih.ring[ring_index + 1]);
        dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]);
@@ -372,35 +372,6 @@ static int cik_ih_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void cik_ih_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "CIK IH registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-       dev_info(adev->dev, "  INTERRUPT_CNTL=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL));
-       dev_info(adev->dev, "  INTERRUPT_CNTL2=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL2));
-       dev_info(adev->dev, "  IH_CNTL=0x%08X\n",
-                RREG32(mmIH_CNTL));
-       dev_info(adev->dev, "  IH_RB_CNTL=0x%08X\n",
-                RREG32(mmIH_RB_CNTL));
-       dev_info(adev->dev, "  IH_RB_BASE=0x%08X\n",
-                RREG32(mmIH_RB_BASE));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_LO=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_LO));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_HI));
-       dev_info(adev->dev, "  IH_RB_RPTR=0x%08X\n",
-                RREG32(mmIH_RB_RPTR));
-       dev_info(adev->dev, "  IH_RB_WPTR=0x%08X\n",
-                RREG32(mmIH_RB_WPTR));
-}
-
 static int cik_ih_soft_reset(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -412,8 +383,6 @@ static int cik_ih_soft_reset(void *handle)
                srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_IH_MASK;
 
        if (srbm_soft_reset) {
-               cik_ih_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -428,8 +397,6 @@ static int cik_ih_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               cik_ih_print_status((void *)adev);
        }
 
        return 0;
@@ -448,6 +415,7 @@ static int cik_ih_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs cik_ih_ip_funcs = {
+       .name = "cik_ih",
        .early_init = cik_ih_early_init,
        .late_init = NULL,
        .sw_init = cik_ih_sw_init,
@@ -459,7 +427,6 @@ const struct amd_ip_funcs cik_ih_ip_funcs = {
        .is_idle = cik_ih_is_idle,
        .wait_for_idle = cik_ih_wait_for_idle,
        .soft_reset = cik_ih_soft_reset,
-       .print_status = cik_ih_print_status,
        .set_clockgating_state = cik_ih_set_clockgating_state,
        .set_powergating_state = cik_ih_set_powergating_state,
 };
index d3ac3298fba8bafb77bb333f1056f4d449ed404a..518dca43b133a2eaa638031be93c4af9522c5b81 100644 (file)
@@ -210,9 +210,10 @@ static void cik_sdma_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
  * Schedule an IB in the DMA ring (CIK).
  */
 static void cik_sdma_ring_emit_ib(struct amdgpu_ring *ring,
-                          struct amdgpu_ib *ib)
+                                 struct amdgpu_ib *ib,
+                                 unsigned vm_id, bool ctx_switch)
 {
-       u32 extra_bits = ib->vm_id & 0xf;
+       u32 extra_bits = vm_id & 0xf;
        u32 next_rptr = ring->wptr + 5;
 
        while ((next_rptr & 7) != 4)
@@ -643,7 +644,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[3] = 1;
        ib.ptr[4] = 0xDEADBEEF;
        ib.length_dw = 5;
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r)
                goto err1;
 
@@ -976,7 +977,7 @@ static int cik_sdma_sw_init(void *handle)
                ring = &adev->sdma.instance[i].ring;
                ring->ring_obj = NULL;
                sprintf(ring->name, "sdma%d", i);
-               r = amdgpu_ring_init(adev, ring, 256 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf,
                                     &adev->sdma.trap_irq,
                                     (i == 0) ?
@@ -1064,57 +1065,6 @@ static int cik_sdma_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void cik_sdma_print_status(void *handle)
-{
-       int i, j;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "CIK SDMA registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-                RREG32(mmSRBM_STATUS2));
-       for (i = 0; i < adev->sdma.num_instances; i++) {
-               dev_info(adev->dev, "  SDMA%d_STATUS_REG=0x%08X\n",
-                        i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_ME_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_SEM_INCOMPLETE_TIMER_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_SEM_INCOMPLETE_TIMER_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_SEM_WAIT_FAIL_TIMER_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_IB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_WPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_LO=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_LO + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_TILING_CONFIG=0x%08X\n",
-                        i, RREG32(mmSDMA0_TILING_CONFIG + sdma_offsets[i]));
-               mutex_lock(&adev->srbm_mutex);
-               for (j = 0; j < 16; j++) {
-                       cik_srbm_select(adev, 0, 0, 0, j);
-                       dev_info(adev->dev, "  VM %d:\n", j);
-                       dev_info(adev->dev, "  SDMA0_GFX_VIRTUAL_ADDR=0x%08X\n",
-                                RREG32(mmSDMA0_GFX_VIRTUAL_ADDR + sdma_offsets[i]));
-                       dev_info(adev->dev, "  SDMA0_GFX_APE1_CNTL=0x%08X\n",
-                                RREG32(mmSDMA0_GFX_APE1_CNTL + sdma_offsets[i]));
-               }
-               cik_srbm_select(adev, 0, 0, 0, 0);
-               mutex_unlock(&adev->srbm_mutex);
-       }
-}
-
 static int cik_sdma_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -1137,8 +1087,6 @@ static int cik_sdma_soft_reset(void *handle)
        }
 
        if (srbm_soft_reset) {
-               cik_sdma_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -1153,8 +1101,6 @@ static int cik_sdma_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               cik_sdma_print_status((void *)adev);
        }
 
        return 0;
@@ -1278,6 +1224,7 @@ static int cik_sdma_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs cik_sdma_ip_funcs = {
+       .name = "cik_sdma",
        .early_init = cik_sdma_early_init,
        .late_init = NULL,
        .sw_init = cik_sdma_sw_init,
@@ -1289,7 +1236,6 @@ const struct amd_ip_funcs cik_sdma_ip_funcs = {
        .is_idle = cik_sdma_is_idle,
        .wait_for_idle = cik_sdma_wait_for_idle,
        .soft_reset = cik_sdma_soft_reset,
-       .print_status = cik_sdma_print_status,
        .set_clockgating_state = cik_sdma_set_clockgating_state,
        .set_powergating_state = cik_sdma_set_powergating_state,
 };
index 60d4493206dd11fef954d3a757a140d7ce1ab54d..c4f6f00d62bcb21d0daf8e7bedba17c3c0a5eb21 100644 (file)
 #       define MACRO_TILE_ASPECT(x)                            ((x) << 4)
 #       define NUM_BANKS(x)                                    ((x) << 6)
 
-#define                MSG_ENTER_RLC_SAFE_MODE                         1
-#define                MSG_EXIT_RLC_SAFE_MODE                          0
+#define                MSG_ENTER_RLC_SAFE_MODE                 1
+#define                MSG_EXIT_RLC_SAFE_MODE                  0
 
 /*
  * PM4
index e7ef2261ff4a70821a318e0377a33f7383607314..fa4449e126e6c811111026a13d0bac343931f7f5 100644 (file)
@@ -2230,6 +2230,7 @@ static void cz_dpm_powergate_vce(struct amdgpu_device *adev, bool gate)
 }
 
 const struct amd_ip_funcs cz_dpm_ip_funcs = {
+       .name = "cz_dpm",
        .early_init = cz_dpm_early_init,
        .late_init = cz_dpm_late_init,
        .sw_init = cz_dpm_sw_init,
@@ -2241,7 +2242,6 @@ const struct amd_ip_funcs cz_dpm_ip_funcs = {
        .is_idle = NULL,
        .wait_for_idle = NULL,
        .soft_reset = NULL,
-       .print_status = NULL,
        .set_clockgating_state = cz_dpm_set_clockgating_state,
        .set_powergating_state = cz_dpm_set_powergating_state,
 };
index c79638f8e732e1442470b2465633a5d122c35d8b..863cb16f6126dccd54075144ab0ff0d80016498e 100644 (file)
@@ -222,7 +222,7 @@ static void cz_ih_decode_iv(struct amdgpu_device *adev,
        /* wptr/rptr are in bytes! */
        u32 ring_index = adev->irq.ih.rptr >> 2;
        uint32_t dw[4];
-       
+
        dw[0] = le32_to_cpu(adev->irq.ih.ring[ring_index + 0]);
        dw[1] = le32_to_cpu(adev->irq.ih.ring[ring_index + 1]);
        dw[2] = le32_to_cpu(adev->irq.ih.ring[ring_index + 2]);
@@ -351,35 +351,6 @@ static int cz_ih_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void cz_ih_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "CZ IH registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-       dev_info(adev->dev, "  INTERRUPT_CNTL=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL));
-       dev_info(adev->dev, "  INTERRUPT_CNTL2=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL2));
-       dev_info(adev->dev, "  IH_CNTL=0x%08X\n",
-                RREG32(mmIH_CNTL));
-       dev_info(adev->dev, "  IH_RB_CNTL=0x%08X\n",
-                RREG32(mmIH_RB_CNTL));
-       dev_info(adev->dev, "  IH_RB_BASE=0x%08X\n",
-                RREG32(mmIH_RB_BASE));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_LO=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_LO));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_HI));
-       dev_info(adev->dev, "  IH_RB_RPTR=0x%08X\n",
-                RREG32(mmIH_RB_RPTR));
-       dev_info(adev->dev, "  IH_RB_WPTR=0x%08X\n",
-                RREG32(mmIH_RB_WPTR));
-}
-
 static int cz_ih_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -391,8 +362,6 @@ static int cz_ih_soft_reset(void *handle)
                                                SOFT_RESET_IH, 1);
 
        if (srbm_soft_reset) {
-               cz_ih_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -407,8 +376,6 @@ static int cz_ih_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               cz_ih_print_status((void *)adev);
        }
 
        return 0;
@@ -429,6 +396,7 @@ static int cz_ih_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs cz_ih_ip_funcs = {
+       .name = "cz_ih",
        .early_init = cz_ih_early_init,
        .late_init = NULL,
        .sw_init = cz_ih_sw_init,
@@ -440,7 +408,6 @@ const struct amd_ip_funcs cz_ih_ip_funcs = {
        .is_idle = cz_ih_is_idle,
        .wait_for_idle = cz_ih_wait_for_idle,
        .soft_reset = cz_ih_soft_reset,
-       .print_status = cz_ih_print_status,
        .set_clockgating_state = cz_ih_set_clockgating_state,
        .set_powergating_state = cz_ih_set_powergating_state,
 };
index 924d355b4e2c4335401c9638519e84eb6f5dea5b..026342fcf0f3e72cd4b85a3fa53332e684910cc2 100644 (file)
@@ -77,7 +77,7 @@ struct cz_smu_private_data {
        uint8_t         driver_buffer_length;
        uint8_t         scratch_buffer_length;
        uint16_t        toc_entry_used_count;
-       uint16_t        toc_entry_initialize_index;
+       uint16_t        toc_entry_initialize_index;
        uint16_t        toc_entry_power_profiling_index;
        uint16_t        toc_entry_aram;
        uint16_t        toc_entry_ih_register_restore_task_index;
index 6de2ce535e370a149f18d82c006b6e1ef72a64b3..8227344d2ff6e8ce43d0ce41e4c1179b57a2b6d1 100644 (file)
@@ -284,10 +284,16 @@ static void dce_v10_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
  * surface base address.
  */
 static void dce_v10_0_page_flip(struct amdgpu_device *adev,
-                             int crtc_id, u64 crtc_base)
+                               int crtc_id, u64 crtc_base, bool async)
 {
        struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+       u32 tmp;
 
+       /* flip at hsync for async, default is vsync */
+       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
+       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
+                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, async ? 1 : 0);
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
        /* update the primary scanout address */
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(crtc_base));
@@ -2211,6 +2217,14 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
 
        dce_v10_0_vga_enable(crtc, false);
 
+       /* Make sure surface address is updated at vertical blank rather than
+        * horizontal blank
+        */
+       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
+       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
+                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
+
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(fb_location));
        WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
@@ -2261,13 +2275,6 @@ static int dce_v10_0_crtc_do_set_base(struct drm_crtc *crtc,
        WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
               (viewport_w << 16) | viewport_h);
 
-       /* pageflip setup */
-       /* make sure flip is at vb rather than hb */
-       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
-       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
-                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
-       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
-
        /* set pageflip to happen only at start of vblank interval (front porch) */
        WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3);
 
@@ -2587,7 +2594,7 @@ static int dce_v10_0_crtc_cursor_set2(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, amdgpu_crtc->crtc_id);
                return -ENOENT;
@@ -2992,6 +2999,8 @@ static int dce_v10_0_sw_init(void *handle)
 
        adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
 
+       adev->ddev->mode_config.async_page_flip = true;
+
        adev->ddev->mode_config.max_width = 16384;
        adev->ddev->mode_config.max_height = 16384;
 
@@ -3130,14 +3139,6 @@ static int dce_v10_0_wait_for_idle(void *handle)
        return 0;
 }
 
-static void dce_v10_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "DCE 10.x registers\n");
-       /* XXX todo */
-}
-
 static int dce_v10_0_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0, tmp;
@@ -3147,8 +3148,6 @@ static int dce_v10_0_soft_reset(void *handle)
                srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
 
        if (srbm_soft_reset) {
-               dce_v10_0_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -3163,7 +3162,6 @@ static int dce_v10_0_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-               dce_v10_0_print_status((void *)adev);
        }
        return 0;
 }
@@ -3370,7 +3368,7 @@ static int dce_v10_0_pageflip_irq(struct amdgpu_device *adev,
 
        /* wakeup usersapce */
        if (works->event)
-               drm_send_vblank_event(adev->ddev, crtc_id, works->event);
+               drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
 
        spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
 
@@ -3501,6 +3499,7 @@ static int dce_v10_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs dce_v10_0_ip_funcs = {
+       .name = "dce_v10_0",
        .early_init = dce_v10_0_early_init,
        .late_init = NULL,
        .sw_init = dce_v10_0_sw_init,
@@ -3512,7 +3511,6 @@ const struct amd_ip_funcs dce_v10_0_ip_funcs = {
        .is_idle = dce_v10_0_is_idle,
        .wait_for_idle = dce_v10_0_wait_for_idle,
        .soft_reset = dce_v10_0_soft_reset,
-       .print_status = dce_v10_0_print_status,
        .set_clockgating_state = dce_v10_0_set_clockgating_state,
        .set_powergating_state = dce_v10_0_set_powergating_state,
 };
index e9ccc6b787f3e3071c244aa8caeb69745c3c7733..c11b6007af80ed4973405ce7536f471a9b08bb32 100644 (file)
@@ -132,6 +132,22 @@ static const u32 stoney_golden_settings_a11[] =
        mmFBC_MISC, 0x1f311fff, 0x14302000,
 };
 
+static const u32 polaris11_golden_settings_a11[] =
+{
+       mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
+       mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
+       mmFBC_DEBUG1, 0xffffffff, 0x00000008,
+       mmFBC_MISC, 0x9f313fff, 0x14300008,
+       mmHDMI_CONTROL, 0x313f031f, 0x00000011,
+};
+
+static const u32 polaris10_golden_settings_a11[] =
+{
+       mmDCI_CLK_CNTL, 0x00000080, 0x00000000,
+       mmFBC_DEBUG_COMP, 0x000000f0, 0x00000070,
+       mmFBC_MISC, 0x9f313fff, 0x14300008,
+       mmHDMI_CONTROL, 0x313f031f, 0x00000011,
+};
 
 static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
 {
@@ -149,6 +165,16 @@ static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)
                                                 stoney_golden_settings_a11,
                                                 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));
                break;
+       case CHIP_POLARIS11:
+               amdgpu_program_register_sequence(adev,
+                                                polaris11_golden_settings_a11,
+                                                (const u32)ARRAY_SIZE(polaris11_golden_settings_a11));
+               break;
+       case CHIP_POLARIS10:
+               amdgpu_program_register_sequence(adev,
+                                                polaris10_golden_settings_a11,
+                                                (const u32)ARRAY_SIZE(polaris10_golden_settings_a11));
+               break;
        default:
                break;
        }
@@ -276,10 +302,17 @@ static void dce_v11_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
  * surface base address.
  */
 static void dce_v11_0_page_flip(struct amdgpu_device *adev,
-                             int crtc_id, u64 crtc_base)
+                               int crtc_id, u64 crtc_base, bool async)
 {
        struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
+       u32 tmp;
 
+       /* flip at hsync for async, default is vsync */
+       /* use UPDATE_IMMEDIATE_EN instead for async? */
+       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
+       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
+                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, async ? 1 : 0);
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
        /* update the scanout addresses */
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(crtc_base));
@@ -565,35 +598,14 @@ static void dce_v11_0_stop_mc_access(struct amdgpu_device *adev,
                crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]),
                                             CRTC_CONTROL, CRTC_MASTER_EN);
                if (crtc_enabled) {
-#if 0
-                       u32 frame_count;
-                       int j;
-
+#if 1
                        save->crtc_enabled[i] = true;
                        tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
                        if (REG_GET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN) == 0) {
-                               amdgpu_display_vblank_wait(adev, i);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
+                               /*it is correct only for RGB ; black is 0*/
+                               WREG32(mmCRTC_BLANK_DATA_COLOR + crtc_offsets[i], 0);
                                tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 1);
                                WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                               WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       }
-                       /* wait for the next frame */
-                       frame_count = amdgpu_display_vblank_get_counter(adev, i);
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               if (amdgpu_display_vblank_get_counter(adev, i) != frame_count)
-                                       break;
-                               udelay(1);
-                       }
-                       tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK) == 0) {
-                               tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 1);
-                               WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK) == 0) {
-                               tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 1);
-                               WREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
                        }
 #else
                        /* XXX this is a hack to avoid strange behavior with EFI on certain systems */
@@ -614,54 +626,20 @@ static void dce_v11_0_stop_mc_access(struct amdgpu_device *adev,
 static void dce_v11_0_resume_mc_access(struct amdgpu_device *adev,
                                       struct amdgpu_mode_mc_save *save)
 {
-       u32 tmp, frame_count;
-       int i, j;
+       u32 tmp;
+       int i;
 
        /* update crtc base addresses */
        for (i = 0; i < adev->mode_info.num_crtc; i++) {
                WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
                       upper_32_bits(adev->mc.vram_start));
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + crtc_offsets[i],
-                      upper_32_bits(adev->mc.vram_start));
                WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS + crtc_offsets[i],
                       (u32)adev->mc.vram_start);
-               WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS + crtc_offsets[i],
-                      (u32)adev->mc.vram_start);
 
                if (save->crtc_enabled[i]) {
-                       tmp = RREG32(mmCRTC_MASTER_UPDATE_MODE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_MODE, MASTER_UPDATE_MODE) != 3) {
-                               tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_MODE, MASTER_UPDATE_MODE, 3);
-                               WREG32(mmCRTC_MASTER_UPDATE_MODE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK)) {
-                               tmp = REG_SET_FIELD(tmp, GRPH_UPDATE, GRPH_UPDATE_LOCK, 0);
-                               WREG32(mmGRPH_UPDATE + crtc_offsets[i], tmp);
-                       }
-                       tmp = RREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i]);
-                       if (REG_GET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK)) {
-                               tmp = REG_SET_FIELD(tmp, CRTC_MASTER_UPDATE_LOCK, MASTER_UPDATE_LOCK, 0);
-                               WREG32(mmCRTC_MASTER_UPDATE_LOCK + crtc_offsets[i], tmp);
-                       }
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               tmp = RREG32(mmGRPH_UPDATE + crtc_offsets[i]);
-                               if (REG_GET_FIELD(tmp, GRPH_UPDATE, GRPH_SURFACE_UPDATE_PENDING) == 0)
-                                       break;
-                               udelay(1);
-                       }
                        tmp = RREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i]);
                        tmp = REG_SET_FIELD(tmp, CRTC_BLANK_CONTROL, CRTC_BLANK_DATA_EN, 0);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1);
                        WREG32(mmCRTC_BLANK_CONTROL + crtc_offsets[i], tmp);
-                       WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0);
-                       /* wait for the next frame */
-                       frame_count = amdgpu_display_vblank_get_counter(adev, i);
-                       for (j = 0; j < adev->usec_timeout; j++) {
-                               if (amdgpu_display_vblank_get_counter(adev, i) != frame_count)
-                                       break;
-                               udelay(1);
-                       }
                }
        }
 
@@ -1624,6 +1602,7 @@ static const u32 pin_offsets[] =
        AUD4_REGISTER_OFFSET,
        AUD5_REGISTER_OFFSET,
        AUD6_REGISTER_OFFSET,
+       AUD7_REGISTER_OFFSET,
 };
 
 static int dce_v11_0_audio_init(struct amdgpu_device *adev)
@@ -1635,7 +1614,20 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)
 
        adev->mode_info.audio.enabled = true;
 
-       adev->mode_info.audio.num_pins = 7;
+       switch (adev->asic_type) {
+       case CHIP_CARRIZO:
+       case CHIP_STONEY:
+               adev->mode_info.audio.num_pins = 7;
+               break;
+       case CHIP_POLARIS10:
+               adev->mode_info.audio.num_pins = 8;
+               break;
+       case CHIP_POLARIS11:
+               adev->mode_info.audio.num_pins = 6;
+               break;
+       default:
+               return -EINVAL;
+       }
 
        for (i = 0; i < adev->mode_info.audio.num_pins; i++) {
                adev->mode_info.audio.pin[i].channels = -1;
@@ -2201,6 +2193,14 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
 
        dce_v11_0_vga_enable(crtc, false);
 
+       /* Make sure surface address is updated at vertical blank rather than
+        * horizontal blank
+        */
+       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
+       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
+                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
+
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(fb_location));
        WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
@@ -2251,13 +2251,6 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,
        WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
               (viewport_w << 16) | viewport_h);
 
-       /* pageflip setup */
-       /* make sure flip is at vb rather than hb */
-       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
-       tmp = REG_SET_FIELD(tmp, GRPH_FLIP_CONTROL,
-                           GRPH_SURFACE_UPDATE_H_RETRACE_EN, 0);
-       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
-
        /* set pageflip to happen only at start of vblank interval (front porch) */
        WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3);
 
@@ -2427,6 +2420,40 @@ static u32 dce_v11_0_pick_pll(struct drm_crtc *crtc)
        u32 pll_in_use;
        int pll;
 
+       if ((adev->asic_type == CHIP_POLARIS10) ||
+           (adev->asic_type == CHIP_POLARIS11)) {
+               struct amdgpu_encoder *amdgpu_encoder =
+                       to_amdgpu_encoder(amdgpu_crtc->encoder);
+               struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv;
+
+               if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder)))
+                       return ATOM_DP_DTO;
+
+               switch (amdgpu_encoder->encoder_id) {
+               case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
+                       if (dig->linkb)
+                               return ATOM_COMBOPHY_PLL1;
+                       else
+                               return ATOM_COMBOPHY_PLL0;
+                       break;
+               case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
+                       if (dig->linkb)
+                               return ATOM_COMBOPHY_PLL3;
+                       else
+                               return ATOM_COMBOPHY_PLL2;
+                       break;
+               case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
+                       if (dig->linkb)
+                               return ATOM_COMBOPHY_PLL5;
+                       else
+                               return ATOM_COMBOPHY_PLL4;
+                       break;
+               default:
+                       DRM_ERROR("invalid encoder_id: 0x%x\n", amdgpu_encoder->encoder_id);
+                       return ATOM_PPLL_INVALID;
+               }
+       }
+
        if (ENCODER_MODE_IS_DP(amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder))) {
                if (adev->clock.dp_extclk)
                        /* skip PPLL programming if using ext clock */
@@ -2578,7 +2605,7 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, amdgpu_crtc->crtc_id);
                return -ENOENT;
@@ -2782,7 +2809,17 @@ static void dce_v11_0_crtc_disable(struct drm_crtc *crtc)
        case ATOM_PPLL2:
                /* disable the ppll */
                amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id, amdgpu_crtc->pll_id,
-                                         0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
+                                                0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
+               break;
+       case ATOM_COMBOPHY_PLL0:
+       case ATOM_COMBOPHY_PLL1:
+       case ATOM_COMBOPHY_PLL2:
+       case ATOM_COMBOPHY_PLL3:
+       case ATOM_COMBOPHY_PLL4:
+       case ATOM_COMBOPHY_PLL5:
+               /* disable the ppll */
+               amdgpu_atombios_crtc_program_pll(crtc, ATOM_CRTC_INVALID, amdgpu_crtc->pll_id,
+                                                0, 0, ATOM_DISABLE, 0, 0, 0, 0, 0, false, &ss);
                break;
        default:
                break;
@@ -2800,11 +2837,28 @@ static int dce_v11_0_crtc_mode_set(struct drm_crtc *crtc,
                                  int x, int y, struct drm_framebuffer *old_fb)
 {
        struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       struct amdgpu_device *adev = dev->dev_private;
 
        if (!amdgpu_crtc->adjusted_clock)
                return -EINVAL;
 
-       amdgpu_atombios_crtc_set_pll(crtc, adjusted_mode);
+       if ((adev->asic_type == CHIP_POLARIS10) ||
+           (adev->asic_type == CHIP_POLARIS11)) {
+               struct amdgpu_encoder *amdgpu_encoder =
+                       to_amdgpu_encoder(amdgpu_crtc->encoder);
+               int encoder_mode =
+                       amdgpu_atombios_encoder_get_encoder_mode(amdgpu_crtc->encoder);
+
+               /* SetPixelClock calculates the plls and ss values now */
+               amdgpu_atombios_crtc_program_pll(crtc, amdgpu_crtc->crtc_id,
+                                                amdgpu_crtc->pll_id,
+                                                encoder_mode, amdgpu_encoder->encoder_id,
+                                                adjusted_mode->clock, 0, 0, 0, 0,
+                                                amdgpu_crtc->bpc, amdgpu_crtc->ss_enabled, &amdgpu_crtc->ss);
+       } else {
+               amdgpu_atombios_crtc_set_pll(crtc, adjusted_mode);
+       }
        amdgpu_atombios_crtc_set_dtd_timing(crtc, adjusted_mode);
        dce_v11_0_crtc_do_set_base(crtc, old_fb, x, y, 0);
        amdgpu_atombios_crtc_overscan_setup(crtc, mode, adjusted_mode);
@@ -2955,6 +3009,16 @@ static int dce_v11_0_early_init(void *handle)
                adev->mode_info.num_hpd = 6;
                adev->mode_info.num_dig = 9;
                break;
+       case CHIP_POLARIS10:
+               adev->mode_info.num_crtc = 6;
+               adev->mode_info.num_hpd = 6;
+               adev->mode_info.num_dig = 6;
+               break;
+       case CHIP_POLARIS11:
+               adev->mode_info.num_crtc = 5;
+               adev->mode_info.num_hpd = 5;
+               adev->mode_info.num_dig = 5;
+               break;
        default:
                /* FIXME: not supported yet */
                return -EINVAL;
@@ -2987,6 +3051,8 @@ static int dce_v11_0_sw_init(void *handle)
 
        adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
 
+       adev->ddev->mode_config.async_page_flip = true;
+
        adev->ddev->mode_config.max_width = 16384;
        adev->ddev->mode_config.max_height = 16384;
 
@@ -3057,7 +3123,15 @@ static int dce_v11_0_hw_init(void *handle)
        /* init dig PHYs, disp eng pll */
        amdgpu_atombios_crtc_powergate_init(adev);
        amdgpu_atombios_encoder_init_dig(adev);
-       amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
+       if ((adev->asic_type == CHIP_POLARIS10) ||
+           (adev->asic_type == CHIP_POLARIS11)) {
+               amdgpu_atombios_crtc_set_dce_clock(adev, adev->clock.default_dispclk,
+                                                  DCE_CLOCK_TYPE_DISPCLK, ATOM_GCK_DFS);
+               amdgpu_atombios_crtc_set_dce_clock(adev, 0,
+                                                  DCE_CLOCK_TYPE_DPREFCLK, ATOM_GCK_DFS);
+       } else {
+               amdgpu_atombios_crtc_set_disp_eng_pll(adev, adev->clock.default_dispclk);
+       }
 
        /* initialize hpd */
        dce_v11_0_hpd_init(adev);
@@ -3126,14 +3200,6 @@ static int dce_v11_0_wait_for_idle(void *handle)
        return 0;
 }
 
-static void dce_v11_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "DCE 10.x registers\n");
-       /* XXX todo */
-}
-
 static int dce_v11_0_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0, tmp;
@@ -3143,8 +3209,6 @@ static int dce_v11_0_soft_reset(void *handle)
                srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
 
        if (srbm_soft_reset) {
-               dce_v11_0_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -3159,7 +3223,6 @@ static int dce_v11_0_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-               dce_v11_0_print_status((void *)adev);
        }
        return 0;
 }
@@ -3366,7 +3429,7 @@ static int dce_v11_0_pageflip_irq(struct amdgpu_device *adev,
 
        /* wakeup usersapce */
        if(works->event)
-               drm_send_vblank_event(adev->ddev, crtc_id, works->event);
+               drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
 
        spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
 
@@ -3497,6 +3560,7 @@ static int dce_v11_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs dce_v11_0_ip_funcs = {
+       .name = "dce_v11_0",
        .early_init = dce_v11_0_early_init,
        .late_init = NULL,
        .sw_init = dce_v11_0_sw_init,
@@ -3508,7 +3572,6 @@ const struct amd_ip_funcs dce_v11_0_ip_funcs = {
        .is_idle = dce_v11_0_is_idle,
        .wait_for_idle = dce_v11_0_wait_for_idle,
        .soft_reset = dce_v11_0_soft_reset,
-       .print_status = dce_v11_0_print_status,
        .set_clockgating_state = dce_v11_0_set_clockgating_state,
        .set_powergating_state = dce_v11_0_set_powergating_state,
 };
index e56b55d8c280202a8f65f5fa55edaa489c19ead3..3fb65e41a6ef5e9402a4c2a3df4b30e1372ac5c8 100644 (file)
@@ -233,10 +233,13 @@ static void dce_v8_0_pageflip_interrupt_fini(struct amdgpu_device *adev)
  * surface base address.
  */
 static void dce_v8_0_page_flip(struct amdgpu_device *adev,
-                             int crtc_id, u64 crtc_base)
+                              int crtc_id, u64 crtc_base, bool async)
 {
        struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[crtc_id];
 
+       /* flip at hsync for async, default is vsync */
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, async ?
+              GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK : 0);
        /* update the primary scanout addresses */
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(crtc_base));
@@ -1999,7 +2002,7 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
        uint32_t fb_format, fb_pitch_pixels;
        u32 fb_swap = (GRPH_ENDIAN_NONE << GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT);
        u32 pipe_config;
-       u32 tmp, viewport_w, viewport_h;
+       u32 viewport_w, viewport_h;
        int r;
        bool bypass_lut = false;
 
@@ -2135,6 +2138,11 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
 
        dce_v8_0_vga_enable(crtc, false);
 
+       /* Make sure surface address is updated at vertical blank rather than
+        * horizontal blank
+        */
+       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, 0);
+
        WREG32(mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
               upper_32_bits(fb_location));
        WREG32(mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH + amdgpu_crtc->crtc_offset,
@@ -2182,12 +2190,6 @@ static int dce_v8_0_crtc_do_set_base(struct drm_crtc *crtc,
        WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,
               (viewport_w << 16) | viewport_h);
 
-       /* pageflip setup */
-       /* make sure flip is at vb rather than hb */
-       tmp = RREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset);
-       tmp &= ~GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK;
-       WREG32(mmGRPH_FLIP_CONTROL + amdgpu_crtc->crtc_offset, tmp);
-
        /* set pageflip to happen only at start of vblank interval (front porch) */
        WREG32(mmMASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3);
 
@@ -2499,7 +2501,7 @@ static int dce_v8_0_crtc_cursor_set2(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, amdgpu_crtc->crtc_id);
                return -ENOENT;
@@ -2902,6 +2904,8 @@ static int dce_v8_0_sw_init(void *handle)
 
        adev->ddev->mode_config.funcs = &amdgpu_mode_funcs;
 
+       adev->ddev->mode_config.async_page_flip = true;
+
        adev->ddev->mode_config.max_width = 16384;
        adev->ddev->mode_config.max_height = 16384;
 
@@ -3038,14 +3042,6 @@ static int dce_v8_0_wait_for_idle(void *handle)
        return 0;
 }
 
-static void dce_v8_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "DCE 8.x registers\n");
-       /* XXX todo */
-}
-
 static int dce_v8_0_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0, tmp;
@@ -3055,8 +3051,6 @@ static int dce_v8_0_soft_reset(void *handle)
                srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_DC_MASK;
 
        if (srbm_soft_reset) {
-               dce_v8_0_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -3071,7 +3065,6 @@ static int dce_v8_0_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-               dce_v8_0_print_status((void *)adev);
        }
        return 0;
 }
@@ -3379,7 +3372,7 @@ static int dce_v8_0_pageflip_irq(struct amdgpu_device *adev,
 
        /* wakeup usersapce */
        if (works->event)
-               drm_send_vblank_event(adev->ddev, crtc_id, works->event);
+               drm_crtc_send_vblank_event(&amdgpu_crtc->base, works->event);
 
        spin_unlock_irqrestore(&adev->ddev->event_lock, flags);
 
@@ -3431,6 +3424,7 @@ static int dce_v8_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs dce_v8_0_ip_funcs = {
+       .name = "dce_v8_0",
        .early_init = dce_v8_0_early_init,
        .late_init = NULL,
        .sw_init = dce_v8_0_sw_init,
@@ -3442,7 +3436,6 @@ const struct amd_ip_funcs dce_v8_0_ip_funcs = {
        .is_idle = dce_v8_0_is_idle,
        .wait_for_idle = dce_v8_0_wait_for_idle,
        .soft_reset = dce_v8_0_soft_reset,
-       .print_status = dce_v8_0_print_status,
        .set_clockgating_state = dce_v8_0_set_clockgating_state,
        .set_powergating_state = dce_v8_0_set_powergating_state,
 };
index 4b0e45a271297a6f8c896966a51459cf010c8a89..245cabf06575c73e1e9427011d878237e2e96fdf 100644 (file)
@@ -143,6 +143,7 @@ static int fiji_dpm_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs fiji_dpm_ip_funcs = {
+       .name = "fiji_dpm",
        .early_init = fiji_dpm_early_init,
        .late_init = NULL,
        .sw_init = fiji_dpm_sw_init,
@@ -154,7 +155,6 @@ const struct amd_ip_funcs fiji_dpm_ip_funcs = {
        .is_idle = NULL,
        .wait_for_idle = NULL,
        .soft_reset = NULL,
-       .print_status = NULL,
        .set_clockgating_state = fiji_dpm_set_clockgating_state,
        .set_powergating_state = fiji_dpm_set_powergating_state,
 };
index bb8709066fd8707338663b119f4c7c62f8662716..7f18a53ab53ac8bc18c992d7fdc76d10a283c3d4 100644 (file)
@@ -53,7 +53,6 @@
 static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev);
 static void gfx_v7_0_set_irq_funcs(struct amdgpu_device *adev);
 static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev);
-int gfx_v7_0_get_cu_info(struct amdgpu_device *, struct amdgpu_cu_info *);
 
 MODULE_FIRMWARE("radeon/bonaire_pfp.bin");
 MODULE_FIRMWARE("radeon/bonaire_me.bin");
@@ -882,6 +881,7 @@ static u32 gfx_v7_0_get_csb_size(struct amdgpu_device *adev);
 static void gfx_v7_0_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer);
 static void gfx_v7_0_init_cp_pg_table(struct amdgpu_device *adev);
 static void gfx_v7_0_init_pg(struct amdgpu_device *adev);
+static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev);
 
 /*
  * Core functions
@@ -1718,6 +1718,7 @@ static void gfx_v7_0_gpu_init(struct amdgpu_device *adev)
        gfx_v7_0_tiling_mode_table_init(adev);
 
        gfx_v7_0_setup_rb(adev);
+       gfx_v7_0_get_cu_info(adev);
 
        /* set HW defaults for 3D engine */
        WREG32(mmCP_MEQ_THRESHOLDS,
@@ -2029,17 +2030,13 @@ static void gfx_v7_0_ring_emit_fence_compute(struct amdgpu_ring *ring,
  * on the gfx ring for execution by the GPU.
  */
 static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                     struct amdgpu_ib *ib,
+                                     unsigned vm_id, bool ctx_switch)
 {
-       bool need_ctx_switch = ring->current_ctx != ib->ctx;
        u32 header, control = 0;
        u32 next_rptr = ring->wptr + 5;
 
-       /* drop the CE preamble IB for the same context */
-       if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch)
-               return;
-
-       if (need_ctx_switch)
+       if (ctx_switch)
                next_rptr += 2;
 
        next_rptr += 4;
@@ -2050,7 +2047,7 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        amdgpu_ring_write(ring, next_rptr);
 
        /* insert SWITCH_BUFFER packet before first IB in the ring frame */
-       if (need_ctx_switch) {
+       if (ctx_switch) {
                amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
                amdgpu_ring_write(ring, 0);
        }
@@ -2060,7 +2057,7 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        else
                header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw | (ib->vm_id << 24);
+       control |= ib->length_dw | (vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -2073,7 +2070,8 @@ static void gfx_v7_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
 }
 
 static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                         struct amdgpu_ib *ib,
+                                         unsigned vm_id, bool ctx_switch)
 {
        u32 header, control = 0;
        u32 next_rptr = ring->wptr + 5;
@@ -2088,7 +2086,7 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
 
        header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw | (ib->vm_id << 24);
+       control |= ib->length_dw | (vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -2136,7 +2134,7 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[2] = 0xDEADBEEF;
        ib.length_dw = 3;
 
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r)
                goto err2;
 
@@ -3053,6 +3051,19 @@ static int gfx_v7_0_cp_resume(struct amdgpu_device *adev)
 static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
 {
        int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
+       uint32_t seq = ring->fence_drv.sync_seq;
+       uint64_t addr = ring->fence_drv.gpu_addr;
+
+       amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
+       amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
+                                WAIT_REG_MEM_FUNCTION(3) | /* equal */
+                                WAIT_REG_MEM_ENGINE(usepfp)));   /* pfp or me */
+       amdgpu_ring_write(ring, addr & 0xfffffffc);
+       amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
+       amdgpu_ring_write(ring, seq);
+       amdgpu_ring_write(ring, 0xffffffff);
+       amdgpu_ring_write(ring, 4); /* poll interval */
+
        if (usepfp) {
                /* synce CE with ME to prevent CE fetch CEIB before context switch done */
                amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
@@ -3080,18 +3091,6 @@ static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
                                        unsigned vm_id, uint64_t pd_addr)
 {
        int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX);
-       uint32_t seq = ring->fence_drv.sync_seq;
-       uint64_t addr = ring->fence_drv.gpu_addr;
-
-       amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5));
-       amdgpu_ring_write(ring, (WAIT_REG_MEM_MEM_SPACE(1) | /* memory */
-                                WAIT_REG_MEM_FUNCTION(3) | /* equal */
-                                WAIT_REG_MEM_ENGINE(usepfp)));   /* pfp or me */
-       amdgpu_ring_write(ring, addr & 0xfffffffc);
-       amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff);
-       amdgpu_ring_write(ring, seq);
-       amdgpu_ring_write(ring, 0xffffffff);
-       amdgpu_ring_write(ring, 4); /* poll interval */
 
        amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3));
        amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) |
@@ -3869,18 +3868,13 @@ static u32 gfx_v7_0_get_cu_active_bitmap(struct amdgpu_device *adev)
 
 static void gfx_v7_0_init_ao_cu_mask(struct amdgpu_device *adev)
 {
-       uint32_t tmp, active_cu_number;
-       struct amdgpu_cu_info cu_info;
-
-       gfx_v7_0_get_cu_info(adev, &cu_info);
-       tmp = cu_info.ao_cu_mask;
-       active_cu_number = cu_info.number;
+       u32 tmp;
 
-       WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, tmp);
+       WREG32(mmRLC_PG_ALWAYS_ON_CU_MASK, adev->gfx.cu_info.ao_cu_mask);
 
        tmp = RREG32(mmRLC_MAX_PG_CU);
        tmp &= ~RLC_MAX_PG_CU__MAX_POWERED_UP_CU_MASK;
-       tmp |= (active_cu_number << RLC_MAX_PG_CU__MAX_POWERED_UP_CU__SHIFT);
+       tmp |= (adev->gfx.cu_info.number << RLC_MAX_PG_CU__MAX_POWERED_UP_CU__SHIFT);
        WREG32(mmRLC_MAX_PG_CU, tmp);
 }
 
@@ -4414,7 +4408,7 @@ static int gfx_v7_0_sw_init(void *handle)
                ring = &adev->gfx.gfx_ring[i];
                ring->ring_obj = NULL;
                sprintf(ring->name, "gfx");
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
                                     AMDGPU_RING_TYPE_GFX);
@@ -4438,10 +4432,10 @@ static int gfx_v7_0_sw_init(void *handle)
                ring->me = 1; /* first MEC */
                ring->pipe = i / 8;
                ring->queue = i % 8;
-               sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
+               sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
                irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
                /* type-2 packets are deprecated on MEC, use type-3 instead */
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, irq_type,
                                     AMDGPU_RING_TYPE_COMPUTE);
@@ -4572,256 +4566,6 @@ static int gfx_v7_0_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void gfx_v7_0_print_status(void *handle)
-{
-       int i;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "GFX 7.x registers\n");
-       dev_info(adev->dev, "  GRBM_STATUS=0x%08X\n",
-               RREG32(mmGRBM_STATUS));
-       dev_info(adev->dev, "  GRBM_STATUS2=0x%08X\n",
-               RREG32(mmGRBM_STATUS2));
-       dev_info(adev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
-               RREG32(mmGRBM_STATUS_SE0));
-       dev_info(adev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
-               RREG32(mmGRBM_STATUS_SE1));
-       dev_info(adev->dev, "  GRBM_STATUS_SE2=0x%08X\n",
-               RREG32(mmGRBM_STATUS_SE2));
-       dev_info(adev->dev, "  GRBM_STATUS_SE3=0x%08X\n",
-               RREG32(mmGRBM_STATUS_SE3));
-       dev_info(adev->dev, "  CP_STAT = 0x%08x\n", RREG32(mmCP_STAT));
-       dev_info(adev->dev, "  CP_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_STALLED_STAT2 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT2));
-       dev_info(adev->dev, "  CP_STALLED_STAT3 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT3));
-       dev_info(adev->dev, "  CP_CPF_BUSY_STAT = 0x%08x\n",
-                RREG32(mmCP_CPF_BUSY_STAT));
-       dev_info(adev->dev, "  CP_CPF_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_CPF_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_CPF_STATUS = 0x%08x\n", RREG32(mmCP_CPF_STATUS));
-       dev_info(adev->dev, "  CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(mmCP_CPC_BUSY_STAT));
-       dev_info(adev->dev, "  CP_CPC_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_CPC_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_CPC_STATUS = 0x%08x\n", RREG32(mmCP_CPC_STATUS));
-
-       for (i = 0; i < 32; i++) {
-               dev_info(adev->dev, "  GB_TILE_MODE%d=0x%08X\n",
-                        i, RREG32(mmGB_TILE_MODE0 + (i * 4)));
-       }
-       for (i = 0; i < 16; i++) {
-               dev_info(adev->dev, "  GB_MACROTILE_MODE%d=0x%08X\n",
-                        i, RREG32(mmGB_MACROTILE_MODE0 + (i * 4)));
-       }
-       for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
-               dev_info(adev->dev, "  se: %d\n", i);
-               gfx_v7_0_select_se_sh(adev, i, 0xffffffff);
-               dev_info(adev->dev, "  PA_SC_RASTER_CONFIG=0x%08X\n",
-                        RREG32(mmPA_SC_RASTER_CONFIG));
-               dev_info(adev->dev, "  PA_SC_RASTER_CONFIG_1=0x%08X\n",
-                        RREG32(mmPA_SC_RASTER_CONFIG_1));
-       }
-       gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
-
-       dev_info(adev->dev, "  GB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmGB_ADDR_CONFIG));
-       dev_info(adev->dev, "  HDP_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmHDP_ADDR_CONFIG));
-       dev_info(adev->dev, "  DMIF_ADDR_CALC=0x%08X\n",
-                RREG32(mmDMIF_ADDR_CALC));
-
-       dev_info(adev->dev, "  CP_MEQ_THRESHOLDS=0x%08X\n",
-                RREG32(mmCP_MEQ_THRESHOLDS));
-       dev_info(adev->dev, "  SX_DEBUG_1=0x%08X\n",
-                RREG32(mmSX_DEBUG_1));
-       dev_info(adev->dev, "  TA_CNTL_AUX=0x%08X\n",
-                RREG32(mmTA_CNTL_AUX));
-       dev_info(adev->dev, "  SPI_CONFIG_CNTL=0x%08X\n",
-                RREG32(mmSPI_CONFIG_CNTL));
-       dev_info(adev->dev, "  SQ_CONFIG=0x%08X\n",
-                RREG32(mmSQ_CONFIG));
-       dev_info(adev->dev, "  DB_DEBUG=0x%08X\n",
-                RREG32(mmDB_DEBUG));
-       dev_info(adev->dev, "  DB_DEBUG2=0x%08X\n",
-                RREG32(mmDB_DEBUG2));
-       dev_info(adev->dev, "  DB_DEBUG3=0x%08X\n",
-                RREG32(mmDB_DEBUG3));
-       dev_info(adev->dev, "  CB_HW_CONTROL=0x%08X\n",
-                RREG32(mmCB_HW_CONTROL));
-       dev_info(adev->dev, "  SPI_CONFIG_CNTL_1=0x%08X\n",
-                RREG32(mmSPI_CONFIG_CNTL_1));
-       dev_info(adev->dev, "  PA_SC_FIFO_SIZE=0x%08X\n",
-                RREG32(mmPA_SC_FIFO_SIZE));
-       dev_info(adev->dev, "  VGT_NUM_INSTANCES=0x%08X\n",
-                RREG32(mmVGT_NUM_INSTANCES));
-       dev_info(adev->dev, "  CP_PERFMON_CNTL=0x%08X\n",
-                RREG32(mmCP_PERFMON_CNTL));
-       dev_info(adev->dev, "  PA_SC_FORCE_EOV_MAX_CNTS=0x%08X\n",
-                RREG32(mmPA_SC_FORCE_EOV_MAX_CNTS));
-       dev_info(adev->dev, "  VGT_CACHE_INVALIDATION=0x%08X\n",
-                RREG32(mmVGT_CACHE_INVALIDATION));
-       dev_info(adev->dev, "  VGT_GS_VERTEX_REUSE=0x%08X\n",
-                RREG32(mmVGT_GS_VERTEX_REUSE));
-       dev_info(adev->dev, "  PA_SC_LINE_STIPPLE_STATE=0x%08X\n",
-                RREG32(mmPA_SC_LINE_STIPPLE_STATE));
-       dev_info(adev->dev, "  PA_CL_ENHANCE=0x%08X\n",
-                RREG32(mmPA_CL_ENHANCE));
-       dev_info(adev->dev, "  PA_SC_ENHANCE=0x%08X\n",
-                RREG32(mmPA_SC_ENHANCE));
-
-       dev_info(adev->dev, "  CP_ME_CNTL=0x%08X\n",
-                RREG32(mmCP_ME_CNTL));
-       dev_info(adev->dev, "  CP_MAX_CONTEXT=0x%08X\n",
-                RREG32(mmCP_MAX_CONTEXT));
-       dev_info(adev->dev, "  CP_ENDIAN_SWAP=0x%08X\n",
-                RREG32(mmCP_ENDIAN_SWAP));
-       dev_info(adev->dev, "  CP_DEVICE_ID=0x%08X\n",
-                RREG32(mmCP_DEVICE_ID));
-
-       dev_info(adev->dev, "  CP_SEM_WAIT_TIMER=0x%08X\n",
-                RREG32(mmCP_SEM_WAIT_TIMER));
-       if (adev->asic_type != CHIP_HAWAII)
-               dev_info(adev->dev, "  CP_SEM_INCOMPLETE_TIMER_CNTL=0x%08X\n",
-                        RREG32(mmCP_SEM_INCOMPLETE_TIMER_CNTL));
-
-       dev_info(adev->dev, "  CP_RB_WPTR_DELAY=0x%08X\n",
-                RREG32(mmCP_RB_WPTR_DELAY));
-       dev_info(adev->dev, "  CP_RB_VMID=0x%08X\n",
-                RREG32(mmCP_RB_VMID));
-       dev_info(adev->dev, "  CP_RB0_CNTL=0x%08X\n",
-                RREG32(mmCP_RB0_CNTL));
-       dev_info(adev->dev, "  CP_RB0_WPTR=0x%08X\n",
-                RREG32(mmCP_RB0_WPTR));
-       dev_info(adev->dev, "  CP_RB0_RPTR_ADDR=0x%08X\n",
-                RREG32(mmCP_RB0_RPTR_ADDR));
-       dev_info(adev->dev, "  CP_RB0_RPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmCP_RB0_RPTR_ADDR_HI));
-       dev_info(adev->dev, "  CP_RB0_CNTL=0x%08X\n",
-                RREG32(mmCP_RB0_CNTL));
-       dev_info(adev->dev, "  CP_RB0_BASE=0x%08X\n",
-                RREG32(mmCP_RB0_BASE));
-       dev_info(adev->dev, "  CP_RB0_BASE_HI=0x%08X\n",
-                RREG32(mmCP_RB0_BASE_HI));
-       dev_info(adev->dev, "  CP_MEC_CNTL=0x%08X\n",
-                RREG32(mmCP_MEC_CNTL));
-       dev_info(adev->dev, "  CP_CPF_DEBUG=0x%08X\n",
-                RREG32(mmCP_CPF_DEBUG));
-
-       dev_info(adev->dev, "  SCRATCH_ADDR=0x%08X\n",
-                RREG32(mmSCRATCH_ADDR));
-       dev_info(adev->dev, "  SCRATCH_UMSK=0x%08X\n",
-                RREG32(mmSCRATCH_UMSK));
-
-       /* init the pipes */
-       mutex_lock(&adev->srbm_mutex);
-       for (i = 0; i < (adev->gfx.mec.num_pipe * adev->gfx.mec.num_mec); i++) {
-               int me = (i < 4) ? 1 : 2;
-               int pipe = (i < 4) ? i : (i - 4);
-               int queue;
-
-               dev_info(adev->dev, "  me: %d, pipe: %d\n", me, pipe);
-               cik_srbm_select(adev, me, pipe, 0, 0);
-               dev_info(adev->dev, "  CP_HPD_EOP_BASE_ADDR=0x%08X\n",
-                        RREG32(mmCP_HPD_EOP_BASE_ADDR));
-               dev_info(adev->dev, "  CP_HPD_EOP_BASE_ADDR_HI=0x%08X\n",
-                        RREG32(mmCP_HPD_EOP_BASE_ADDR_HI));
-               dev_info(adev->dev, "  CP_HPD_EOP_VMID=0x%08X\n",
-                        RREG32(mmCP_HPD_EOP_VMID));
-               dev_info(adev->dev, "  CP_HPD_EOP_CONTROL=0x%08X\n",
-                        RREG32(mmCP_HPD_EOP_CONTROL));
-
-               for (queue = 0; queue < 8; queue++) {
-                       cik_srbm_select(adev, me, pipe, queue, 0);
-                       dev_info(adev->dev, "  queue: %d\n", queue);
-                       dev_info(adev->dev, "  CP_PQ_WPTR_POLL_CNTL=0x%08X\n",
-                                RREG32(mmCP_PQ_WPTR_POLL_CNTL));
-                       dev_info(adev->dev, "  CP_HQD_PQ_DOORBELL_CONTROL=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL));
-                       dev_info(adev->dev, "  CP_HQD_ACTIVE=0x%08X\n",
-                                RREG32(mmCP_HQD_ACTIVE));
-                       dev_info(adev->dev, "  CP_HQD_DEQUEUE_REQUEST=0x%08X\n",
-                                RREG32(mmCP_HQD_DEQUEUE_REQUEST));
-                       dev_info(adev->dev, "  CP_HQD_PQ_RPTR=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_RPTR));
-                       dev_info(adev->dev, "  CP_HQD_PQ_WPTR=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_WPTR));
-                       dev_info(adev->dev, "  CP_HQD_PQ_BASE=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_BASE));
-                       dev_info(adev->dev, "  CP_HQD_PQ_BASE_HI=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_BASE_HI));
-                       dev_info(adev->dev, "  CP_HQD_PQ_CONTROL=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_CONTROL));
-                       dev_info(adev->dev, "  CP_HQD_PQ_WPTR_POLL_ADDR=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_WPTR_POLL_ADDR));
-                       dev_info(adev->dev, "  CP_HQD_PQ_WPTR_POLL_ADDR_HI=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_WPTR_POLL_ADDR_HI));
-                       dev_info(adev->dev, "  CP_HQD_PQ_RPTR_REPORT_ADDR=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_RPTR_REPORT_ADDR));
-                       dev_info(adev->dev, "  CP_HQD_PQ_RPTR_REPORT_ADDR_HI=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_RPTR_REPORT_ADDR_HI));
-                       dev_info(adev->dev, "  CP_HQD_PQ_DOORBELL_CONTROL=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_DOORBELL_CONTROL));
-                       dev_info(adev->dev, "  CP_HQD_PQ_WPTR=0x%08X\n",
-                                RREG32(mmCP_HQD_PQ_WPTR));
-                       dev_info(adev->dev, "  CP_HQD_VMID=0x%08X\n",
-                                RREG32(mmCP_HQD_VMID));
-                       dev_info(adev->dev, "  CP_MQD_BASE_ADDR=0x%08X\n",
-                                RREG32(mmCP_MQD_BASE_ADDR));
-                       dev_info(adev->dev, "  CP_MQD_BASE_ADDR_HI=0x%08X\n",
-                                RREG32(mmCP_MQD_BASE_ADDR_HI));
-                       dev_info(adev->dev, "  CP_MQD_CONTROL=0x%08X\n",
-                                RREG32(mmCP_MQD_CONTROL));
-               }
-       }
-       cik_srbm_select(adev, 0, 0, 0, 0);
-       mutex_unlock(&adev->srbm_mutex);
-
-       dev_info(adev->dev, "  CP_INT_CNTL_RING0=0x%08X\n",
-                RREG32(mmCP_INT_CNTL_RING0));
-       dev_info(adev->dev, "  RLC_LB_CNTL=0x%08X\n",
-                RREG32(mmRLC_LB_CNTL));
-       dev_info(adev->dev, "  RLC_CNTL=0x%08X\n",
-                RREG32(mmRLC_CNTL));
-       dev_info(adev->dev, "  RLC_CGCG_CGLS_CTRL=0x%08X\n",
-                RREG32(mmRLC_CGCG_CGLS_CTRL));
-       dev_info(adev->dev, "  RLC_LB_CNTR_INIT=0x%08X\n",
-                RREG32(mmRLC_LB_CNTR_INIT));
-       dev_info(adev->dev, "  RLC_LB_CNTR_MAX=0x%08X\n",
-                RREG32(mmRLC_LB_CNTR_MAX));
-       dev_info(adev->dev, "  RLC_LB_INIT_CU_MASK=0x%08X\n",
-                RREG32(mmRLC_LB_INIT_CU_MASK));
-       dev_info(adev->dev, "  RLC_LB_PARAMS=0x%08X\n",
-                RREG32(mmRLC_LB_PARAMS));
-       dev_info(adev->dev, "  RLC_LB_CNTL=0x%08X\n",
-                RREG32(mmRLC_LB_CNTL));
-       dev_info(adev->dev, "  RLC_MC_CNTL=0x%08X\n",
-                RREG32(mmRLC_MC_CNTL));
-       dev_info(adev->dev, "  RLC_UCODE_CNTL=0x%08X\n",
-                RREG32(mmRLC_UCODE_CNTL));
-
-       if (adev->asic_type == CHIP_BONAIRE)
-               dev_info(adev->dev, "  RLC_DRIVER_CPDMA_STATUS=0x%08X\n",
-                        RREG32(mmRLC_DRIVER_CPDMA_STATUS));
-
-       mutex_lock(&adev->srbm_mutex);
-       for (i = 0; i < 16; i++) {
-               cik_srbm_select(adev, 0, 0, 0, i);
-               dev_info(adev->dev, "  VM %d:\n", i);
-               dev_info(adev->dev, "  SH_MEM_CONFIG=0x%08X\n",
-                        RREG32(mmSH_MEM_CONFIG));
-               dev_info(adev->dev, "  SH_MEM_APE1_BASE=0x%08X\n",
-                        RREG32(mmSH_MEM_APE1_BASE));
-               dev_info(adev->dev, "  SH_MEM_APE1_LIMIT=0x%08X\n",
-                        RREG32(mmSH_MEM_APE1_LIMIT));
-               dev_info(adev->dev, "  SH_MEM_BASES=0x%08X\n",
-                        RREG32(mmSH_MEM_BASES));
-       }
-       cik_srbm_select(adev, 0, 0, 0, 0);
-       mutex_unlock(&adev->srbm_mutex);
-}
-
 static int gfx_v7_0_soft_reset(void *handle)
 {
        u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
@@ -4855,7 +4599,6 @@ static int gfx_v7_0_soft_reset(void *handle)
                srbm_soft_reset |= SRBM_SOFT_RESET__SOFT_RESET_GRBM_MASK;
 
        if (grbm_soft_reset || srbm_soft_reset) {
-               gfx_v7_0_print_status((void *)adev);
                /* disable CG/PG */
                gfx_v7_0_fini_pg(adev);
                gfx_v7_0_update_cg(adev, false);
@@ -4898,7 +4641,6 @@ static int gfx_v7_0_soft_reset(void *handle)
                }
                /* Wait a little for things to settle down */
                udelay(50);
-               gfx_v7_0_print_status((void *)adev);
        }
        return 0;
 }
@@ -5150,6 +4892,7 @@ static int gfx_v7_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs gfx_v7_0_ip_funcs = {
+       .name = "gfx_v7_0",
        .early_init = gfx_v7_0_early_init,
        .late_init = gfx_v7_0_late_init,
        .sw_init = gfx_v7_0_sw_init,
@@ -5161,7 +4904,6 @@ const struct amd_ip_funcs gfx_v7_0_ip_funcs = {
        .is_idle = gfx_v7_0_is_idle,
        .wait_for_idle = gfx_v7_0_wait_for_idle,
        .soft_reset = gfx_v7_0_soft_reset,
-       .print_status = gfx_v7_0_print_status,
        .set_clockgating_state = gfx_v7_0_set_clockgating_state,
        .set_powergating_state = gfx_v7_0_set_powergating_state,
 };
@@ -5268,14 +5010,11 @@ static void gfx_v7_0_set_gds_init(struct amdgpu_device *adev)
 }
 
 
-int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
-                        struct amdgpu_cu_info *cu_info)
+static void gfx_v7_0_get_cu_info(struct amdgpu_device *adev)
 {
        int i, j, k, counter, active_cu_number = 0;
        u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
-
-       if (!adev || !cu_info)
-               return -EINVAL;
+       struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
 
        memset(cu_info, 0, sizeof(*cu_info));
 
@@ -5306,6 +5045,4 @@ int gfx_v7_0_get_cu_info(struct amdgpu_device *adev,
 
        cu_info->number = active_cu_number;
        cu_info->ao_cu_mask = ao_cu_mask;
-
-       return 0;
 }
index c04bfbabfc880edc347fbbf9244c482b50cf5183..e747aa935c88dc2342562ed5f80f316f8e952490 100644 (file)
@@ -32,6 +32,5 @@ void gfx_v7_0_exit_rlc_safe_mode(struct amdgpu_device *adev);
 void gfx_v7_0_rlc_stop(struct amdgpu_device *adev);
 uint64_t gfx_v7_0_get_gpu_clock_counter(struct amdgpu_device *adev);
 void gfx_v7_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num);
-int gfx_v7_0_get_cu_info(struct amdgpu_device *adev, struct amdgpu_cu_info *cu_info);
 
 #endif
index f0c7b3596480995afca643caa42a93827c04f841..92647fbf5b8b44700f4cd5aa4d27b4d0a9c5b428 100644 (file)
@@ -27,6 +27,7 @@
 #include "vi.h"
 #include "vid.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_atombios.h"
 #include "clearstate_vi.h"
 
 #include "gmc/gmc_8_2_d.h"
@@ -51,6 +52,7 @@
 
 #define TOPAZ_GB_ADDR_CONFIG_GOLDEN 0x22010001
 #define CARRIZO_GB_ADDR_CONFIG_GOLDEN 0x22010001
+#define POLARIS11_GB_ADDR_CONFIG_GOLDEN 0x22011002
 #define TONGA_GB_ADDR_CONFIG_GOLDEN 0x22011003
 
 #define ARRAY_MODE(x)                                  ((x) << GB_TILE_MODE0__ARRAY_MODE__SHIFT)
@@ -84,6 +86,8 @@ enum {
        BPM_REG_FGCG_MAX
 };
 
+#define RLC_FormatDirectRegListLength        14
+
 MODULE_FIRMWARE("amdgpu/carrizo_ce.bin");
 MODULE_FIRMWARE("amdgpu/carrizo_pfp.bin");
 MODULE_FIRMWARE("amdgpu/carrizo_me.bin");
@@ -117,6 +121,20 @@ MODULE_FIRMWARE("amdgpu/fiji_mec.bin");
 MODULE_FIRMWARE("amdgpu/fiji_mec2.bin");
 MODULE_FIRMWARE("amdgpu/fiji_rlc.bin");
 
+MODULE_FIRMWARE("amdgpu/polaris11_ce.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_pfp.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_me.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_mec.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_mec2.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_rlc.bin");
+
+MODULE_FIRMWARE("amdgpu/polaris10_ce.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_pfp.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_me.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_mec.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_mec2.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_rlc.bin");
+
 static const struct amdgpu_gds_reg_offset amdgpu_gds_reg_offset[] =
 {
        {mmGDS_VMID0_BASE, mmGDS_VMID0_SIZE, mmGDS_GWS_VMID0, mmGDS_OA_VMID0},
@@ -247,6 +265,64 @@ static const u32 tonga_mgcg_cgcg_init[] =
        mmCP_MEM_SLP_CNTL, 0x00000001, 0x00000001,
 };
 
+static const u32 golden_settings_polaris11_a11[] =
+{
+       mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
+       mmDB_DEBUG2, 0xf00fffff, 0x00000400,
+       mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
+       mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
+       mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
+       mmRLC_CGCG_CGLS_CTRL_3D, 0xffffffff, 0x0001003c,
+       mmSQ_CONFIG, 0x07f80000, 0x07180000,
+       mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
+       mmTCC_CTRL, 0x00100000, 0xf31fff7f,
+       mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f3,
+       mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
+       mmTCP_CHAN_STEER_LO, 0xffffffff, 0x00003210,
+};
+
+static const u32 polaris11_golden_common_all[] =
+{
+       mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
+       mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x16000012,
+       mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x00000000,
+       mmGB_ADDR_CONFIG, 0xffffffff, 0x22011002,
+       mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
+       mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
+       mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
+       mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF,
+};
+
+static const u32 golden_settings_polaris10_a11[] =
+{
+       mmATC_MISC_CG, 0x000c0fc0, 0x000c0200,
+       mmCB_HW_CONTROL_3, 0x000001ff, 0x00000040,
+       mmDB_DEBUG2, 0xf00fffff, 0x00000400,
+       mmPA_SC_ENHANCE, 0xffffffff, 0x20000001,
+       mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
+       mmPA_SC_RASTER_CONFIG, 0x3f3fffff, 0x16000012,
+       mmPA_SC_RASTER_CONFIG_1, 0x0000003f, 0x0000002a,
+       mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
+       mmRLC_CGCG_CGLS_CTRL_3D, 0xffffffff, 0x0001003c,
+       mmSQ_CONFIG, 0x07f80000, 0x07180000,
+       mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
+       mmTCC_CTRL, 0x00100000, 0xf31fff7f,
+       mmTCP_ADDR_CONFIG, 0x000003ff, 0x000000f7,
+       mmTCP_CHAN_STEER_HI, 0xffffffff, 0x00000000,
+};
+
+static const u32 polaris10_golden_common_all[] =
+{
+       mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
+       mmPA_SC_RASTER_CONFIG, 0xffffffff, 0x16000012,
+       mmPA_SC_RASTER_CONFIG_1, 0xffffffff, 0x0000002A,
+       mmGB_ADDR_CONFIG, 0xffffffff, 0x22011003,
+       mmSPI_RESOURCE_RESERVE_CU_0, 0xffffffff, 0x00000800,
+       mmSPI_RESOURCE_RESERVE_CU_1, 0xffffffff, 0x00000800,
+       mmSPI_RESOURCE_RESERVE_EN_CU_0, 0xffffffff, 0x00007FBF,
+       mmSPI_RESOURCE_RESERVE_EN_CU_1, 0xffffffff, 0x00007FAF,
+};
+
 static const u32 fiji_golden_common_all[] =
 {
        mmGRBM_GFX_INDEX, 0xffffffff, 0xe0000000,
@@ -527,7 +603,7 @@ static const u32 stoney_golden_settings_a11[] =
        mmPA_SC_LINE_STIPPLE_STATE, 0x0000ff0f, 0x00000000,
        mmRLC_CGCG_CGLS_CTRL, 0x00000003, 0x0001003c,
        mmTA_CNTL_AUX, 0x000f000f, 0x000b0000,
-       mmTCC_CTRL, 0x00100000, 0xf31fff7f,
+       mmTCC_CTRL, 0x00100000, 0xf31fff7f,
        mmTCC_EXE_DISABLE, 0x00000002, 0x00000002,
        mmTCP_ADDR_CONFIG, 0x0000000f, 0x000000f1,
        mmTCP_CHAN_STEER_LO, 0xffffffff, 0x10101010,
@@ -558,6 +634,9 @@ static const u32 stoney_mgcg_cgcg_init[] =
 static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev);
 static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev);
 static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev);
+static void gfx_v8_0_set_rlc_funcs(struct amdgpu_device *adev);
+static u32 gfx_v8_0_get_csb_size(struct amdgpu_device *adev);
+static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev);
 
 static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
 {
@@ -596,6 +675,22 @@ static void gfx_v8_0_init_golden_registers(struct amdgpu_device *adev)
                                                 tonga_golden_common_all,
                                                 (const u32)ARRAY_SIZE(tonga_golden_common_all));
                break;
+       case CHIP_POLARIS11:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris11_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris11_a11));
+               amdgpu_program_register_sequence(adev,
+                                                polaris11_golden_common_all,
+                                                (const u32)ARRAY_SIZE(polaris11_golden_common_all));
+               break;
+       case CHIP_POLARIS10:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris10_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris10_a11));
+               amdgpu_program_register_sequence(adev,
+                                                polaris10_golden_common_all,
+                                                (const u32)ARRAY_SIZE(polaris10_golden_common_all));
+               break;
        case CHIP_CARRIZO:
                amdgpu_program_register_sequence(adev,
                                                 cz_mgcg_cgcg_init,
@@ -706,7 +801,7 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[2] = 0xDEADBEEF;
        ib.length_dw = 3;
 
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r)
                goto err2;
 
@@ -747,6 +842,8 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
        struct amdgpu_firmware_info *info = NULL;
        const struct common_firmware_header *header = NULL;
        const struct gfx_firmware_header_v1_0 *cp_hdr;
+       const struct rlc_firmware_header_v2_0 *rlc_hdr;
+       unsigned int *tmp = NULL, i;
 
        DRM_DEBUG("\n");
 
@@ -763,6 +860,12 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
        case CHIP_FIJI:
                chip_name = "fiji";
                break;
+       case CHIP_POLARIS11:
+               chip_name = "polaris11";
+               break;
+       case CHIP_POLARIS10:
+               chip_name = "polaris10";
+               break;
        case CHIP_STONEY:
                chip_name = "stoney";
                break;
@@ -808,9 +911,49 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
        if (err)
                goto out;
        err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
-       cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.rlc_fw->data;
-       adev->gfx.rlc_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
-       adev->gfx.rlc_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
+       rlc_hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
+       adev->gfx.rlc_fw_version = le32_to_cpu(rlc_hdr->header.ucode_version);
+       adev->gfx.rlc_feature_version = le32_to_cpu(rlc_hdr->ucode_feature_version);
+
+       adev->gfx.rlc.save_and_restore_offset =
+                       le32_to_cpu(rlc_hdr->save_and_restore_offset);
+       adev->gfx.rlc.clear_state_descriptor_offset =
+                       le32_to_cpu(rlc_hdr->clear_state_descriptor_offset);
+       adev->gfx.rlc.avail_scratch_ram_locations =
+                       le32_to_cpu(rlc_hdr->avail_scratch_ram_locations);
+       adev->gfx.rlc.reg_restore_list_size =
+                       le32_to_cpu(rlc_hdr->reg_restore_list_size);
+       adev->gfx.rlc.reg_list_format_start =
+                       le32_to_cpu(rlc_hdr->reg_list_format_start);
+       adev->gfx.rlc.reg_list_format_separate_start =
+                       le32_to_cpu(rlc_hdr->reg_list_format_separate_start);
+       adev->gfx.rlc.starting_offsets_start =
+                       le32_to_cpu(rlc_hdr->starting_offsets_start);
+       adev->gfx.rlc.reg_list_format_size_bytes =
+                       le32_to_cpu(rlc_hdr->reg_list_format_size_bytes);
+       adev->gfx.rlc.reg_list_size_bytes =
+                       le32_to_cpu(rlc_hdr->reg_list_size_bytes);
+
+       adev->gfx.rlc.register_list_format =
+                       kmalloc(adev->gfx.rlc.reg_list_format_size_bytes +
+                                       adev->gfx.rlc.reg_list_size_bytes, GFP_KERNEL);
+
+       if (!adev->gfx.rlc.register_list_format) {
+               err = -ENOMEM;
+               goto out;
+       }
+
+       tmp = (unsigned int *)((uintptr_t)rlc_hdr +
+                       le32_to_cpu(rlc_hdr->reg_list_format_array_offset_bytes));
+       for (i = 0 ; i < (rlc_hdr->reg_list_format_size_bytes >> 2); i++)
+               adev->gfx.rlc.register_list_format[i] = le32_to_cpu(tmp[i]);
+
+       adev->gfx.rlc.register_restore = adev->gfx.rlc.register_list_format + i;
+
+       tmp = (unsigned int *)((uintptr_t)rlc_hdr +
+                       le32_to_cpu(rlc_hdr->reg_list_array_offset_bytes));
+       for (i = 0 ; i < (rlc_hdr->reg_list_size_bytes >> 2); i++)
+               adev->gfx.rlc.register_restore[i] = le32_to_cpu(tmp[i]);
 
        snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
        err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
@@ -911,6 +1054,153 @@ out:
        return err;
 }
 
+static void gfx_v8_0_get_csb_buffer(struct amdgpu_device *adev,
+                                   volatile u32 *buffer)
+{
+       u32 count = 0, i;
+       const struct cs_section_def *sect = NULL;
+       const struct cs_extent_def *ext = NULL;
+
+       if (adev->gfx.rlc.cs_data == NULL)
+               return;
+       if (buffer == NULL)
+               return;
+
+       buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
+       buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
+
+       buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1));
+       buffer[count++] = cpu_to_le32(0x80000000);
+       buffer[count++] = cpu_to_le32(0x80000000);
+
+       for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) {
+               for (ext = sect->section; ext->extent != NULL; ++ext) {
+                       if (sect->id == SECT_CONTEXT) {
+                               buffer[count++] =
+                                       cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count));
+                               buffer[count++] = cpu_to_le32(ext->reg_index -
+                                               PACKET3_SET_CONTEXT_REG_START);
+                               for (i = 0; i < ext->reg_count; i++)
+                                       buffer[count++] = cpu_to_le32(ext->extent[i]);
+                       } else {
+                               return;
+                       }
+               }
+       }
+
+       buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2));
+       buffer[count++] = cpu_to_le32(mmPA_SC_RASTER_CONFIG -
+                       PACKET3_SET_CONTEXT_REG_START);
+       switch (adev->asic_type) {
+       case CHIP_TONGA:
+       case CHIP_POLARIS10:
+               buffer[count++] = cpu_to_le32(0x16000012);
+               buffer[count++] = cpu_to_le32(0x0000002A);
+               break;
+       case CHIP_POLARIS11:
+               buffer[count++] = cpu_to_le32(0x16000012);
+               buffer[count++] = cpu_to_le32(0x00000000);
+               break;
+       case CHIP_FIJI:
+               buffer[count++] = cpu_to_le32(0x3a00161a);
+               buffer[count++] = cpu_to_le32(0x0000002e);
+               break;
+       case CHIP_TOPAZ:
+       case CHIP_CARRIZO:
+               buffer[count++] = cpu_to_le32(0x00000002);
+               buffer[count++] = cpu_to_le32(0x00000000);
+               break;
+       case CHIP_STONEY:
+               buffer[count++] = cpu_to_le32(0x00000000);
+               buffer[count++] = cpu_to_le32(0x00000000);
+               break;
+       default:
+               buffer[count++] = cpu_to_le32(0x00000000);
+               buffer[count++] = cpu_to_le32(0x00000000);
+               break;
+       }
+
+       buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0));
+       buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE);
+
+       buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0));
+       buffer[count++] = cpu_to_le32(0);
+}
+
+static void gfx_v8_0_rlc_fini(struct amdgpu_device *adev)
+{
+       int r;
+
+       /* clear state block */
+       if (adev->gfx.rlc.clear_state_obj) {
+               r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
+               if (unlikely(r != 0))
+                       dev_warn(adev->dev, "(%d) reserve RLC c bo failed\n", r);
+               amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj);
+               amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
+
+               amdgpu_bo_unref(&adev->gfx.rlc.clear_state_obj);
+               adev->gfx.rlc.clear_state_obj = NULL;
+       }
+}
+
+static int gfx_v8_0_rlc_init(struct amdgpu_device *adev)
+{
+       volatile u32 *dst_ptr;
+       u32 dws;
+       const struct cs_section_def *cs_data;
+       int r;
+
+       adev->gfx.rlc.cs_data = vi_cs_data;
+
+       cs_data = adev->gfx.rlc.cs_data;
+
+       if (cs_data) {
+               /* clear state block */
+               adev->gfx.rlc.clear_state_size = dws = gfx_v8_0_get_csb_size(adev);
+
+               if (adev->gfx.rlc.clear_state_obj == NULL) {
+                       r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true,
+                                            AMDGPU_GEM_DOMAIN_VRAM,
+                                            AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED,
+                                            NULL, NULL,
+                                            &adev->gfx.rlc.clear_state_obj);
+                       if (r) {
+                               dev_warn(adev->dev, "(%d) create RLC c bo failed\n", r);
+                               gfx_v8_0_rlc_fini(adev);
+                               return r;
+                       }
+               }
+               r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false);
+               if (unlikely(r != 0)) {
+                       gfx_v8_0_rlc_fini(adev);
+                       return r;
+               }
+               r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, AMDGPU_GEM_DOMAIN_VRAM,
+                                 &adev->gfx.rlc.clear_state_gpu_addr);
+               if (r) {
+                       amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
+                       dev_warn(adev->dev, "(%d) pin RLC c bo failed\n", r);
+                       gfx_v8_0_rlc_fini(adev);
+                       return r;
+               }
+
+               r = amdgpu_bo_kmap(adev->gfx.rlc.clear_state_obj, (void **)&adev->gfx.rlc.cs_ptr);
+               if (r) {
+                       dev_warn(adev->dev, "(%d) map RLC c bo failed\n", r);
+                       gfx_v8_0_rlc_fini(adev);
+                       return r;
+               }
+               /* set up the cs buffer */
+               dst_ptr = adev->gfx.rlc.cs_ptr;
+               gfx_v8_0_get_csb_buffer(adev, dst_ptr);
+               amdgpu_bo_kunmap(adev->gfx.rlc.clear_state_obj);
+               amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj);
+       }
+
+       return 0;
+}
+
 static void gfx_v8_0_mec_fini(struct amdgpu_device *adev)
 {
        int r;
@@ -1262,7 +1552,7 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)
        ib.ptr[ib.length_dw++] = EVENT_TYPE(7) | EVENT_INDEX(4);
 
        /* shedule the ib on the ring */
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r) {
                DRM_ERROR("amdgpu: ib submit failed (%d).\n", r);
                goto fail;
@@ -1296,12 +1586,13 @@ fail:
        return r;
 }
 
-static void gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
+static int gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
 {
        u32 gb_addr_config;
        u32 mc_shared_chmap, mc_arb_ramcfg;
        u32 dimm00_addr_map, dimm01_addr_map, dimm10_addr_map, dimm11_addr_map;
        u32 tmp;
+       int ret;
 
        switch (adev->asic_type) {
        case CHIP_TOPAZ:
@@ -1332,6 +1623,34 @@ static void gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
                adev->gfx.config.max_gs_threads = 32;
                adev->gfx.config.max_hw_contexts = 8;
 
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = TONGA_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       case CHIP_POLARIS11:
+               ret = amdgpu_atombios_get_gfx_info(adev);
+               if (ret)
+                       return ret;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 32;
+               adev->gfx.config.max_hw_contexts = 8;
+
+               adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
+               adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
+               adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
+               adev->gfx.config.sc_earlyz_tile_fifo_size = 0x130;
+               gb_addr_config = POLARIS11_GB_ADDR_CONFIG_GOLDEN;
+               break;
+       case CHIP_POLARIS10:
+               ret = amdgpu_atombios_get_gfx_info(adev);
+               if (ret)
+                       return ret;
+               adev->gfx.config.max_gprs = 256;
+               adev->gfx.config.max_gs_threads = 32;
+               adev->gfx.config.max_hw_contexts = 8;
+
                adev->gfx.config.sc_prim_fifo_size_frontend = 0x20;
                adev->gfx.config.sc_prim_fifo_size_backend = 0x100;
                adev->gfx.config.sc_hiz_tile_fifo_size = 0x30;
@@ -1520,6 +1839,8 @@ static void gfx_v8_0_gpu_early_init(struct amdgpu_device *adev)
                break;
        }
        adev->gfx.config.gb_addr_config = gb_addr_config;
+
+       return 0;
 }
 
 static int gfx_v8_0_sw_init(void *handle)
@@ -1553,6 +1874,12 @@ static int gfx_v8_0_sw_init(void *handle)
                return r;
        }
 
+       r = gfx_v8_0_rlc_init(adev);
+       if (r) {
+               DRM_ERROR("Failed to init rlc BOs!\n");
+               return r;
+       }
+
        r = gfx_v8_0_mec_init(adev);
        if (r) {
                DRM_ERROR("Failed to init MEC BOs!\n");
@@ -1570,7 +1897,7 @@ static int gfx_v8_0_sw_init(void *handle)
                        ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0;
                }
 
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP,
                                     AMDGPU_RING_TYPE_GFX);
@@ -1594,10 +1921,10 @@ static int gfx_v8_0_sw_init(void *handle)
                ring->me = 1; /* first MEC */
                ring->pipe = i / 8;
                ring->queue = i % 8;
-               sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue);
+               sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);
                irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;
                /* type-2 packets are deprecated on MEC, use type-3 instead */
-               r = amdgpu_ring_init(adev, ring, 1024 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     PACKET3(PACKET3_NOP, 0x3FFF), 0xf,
                                     &adev->gfx.eop_irq, irq_type,
                                     AMDGPU_RING_TYPE_COMPUTE);
@@ -1629,7 +1956,9 @@ static int gfx_v8_0_sw_init(void *handle)
 
        adev->gfx.ce_ram_size = 0x8000;
 
-       gfx_v8_0_gpu_early_init(adev);
+       r = gfx_v8_0_gpu_early_init(adev);
+       if (r)
+               return r;
 
        return 0;
 }
@@ -1650,6 +1979,10 @@ static int gfx_v8_0_sw_fini(void *handle)
 
        gfx_v8_0_mec_fini(adev);
 
+       gfx_v8_0_rlc_fini(adev);
+
+       kfree(adev->gfx.rlc.register_list_format);
+
        return 0;
 }
 
@@ -2195,21 +2528,425 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)
                                 MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
                                 NUM_BANKS(ADDR_SURF_16_BANK));
                mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
-                                NUM_BANKS(ADDR_SURF_16_BANK));
+                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                                NUM_BANKS(ADDR_SURF_16_BANK));
+               mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                                NUM_BANKS(ADDR_SURF_8_BANK));
+               mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                                NUM_BANKS(ADDR_SURF_4_BANK));
+               mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                                NUM_BANKS(ADDR_SURF_4_BANK));
+
+               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+                       WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
+
+               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+                       if (reg_offset != 7)
+                               WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
+
+               break;
+       case CHIP_POLARIS11:
+               modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16));
+               modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+
+               mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_2) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+
+               mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+
+               for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
+                       WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
+
+               for (reg_offset = 0; reg_offset < num_secondary_tile_mode_states; reg_offset++)
+                       if (reg_offset != 7)
+                               WREG32(mmGB_MACROTILE_MODE0 + reg_offset, mod2array[reg_offset]);
+
+               break;
+       case CHIP_POLARIS10:
+               modearray[0] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_64B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[1] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_128B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[2] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_256B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[3] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_512B) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[4] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[5] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[6] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[7] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               TILE_SPLIT(ADDR_SURF_TILE_SPLIT_2KB) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DEPTH_MICRO_TILING));
+               modearray[8] = (ARRAY_MODE(ARRAY_LINEAR_ALIGNED) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16));
+               modearray[9] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[10] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[11] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[12] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_DISPLAY_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[13] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[14] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[15] = (ARRAY_MODE(ARRAY_3D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[16] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[17] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[18] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[19] = (ARRAY_MODE(ARRAY_1D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[20] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[21] = (ARRAY_MODE(ARRAY_3D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[22] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[23] = (ARRAY_MODE(ARRAY_PRT_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[24] = (ARRAY_MODE(ARRAY_2D_TILED_THICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THIN_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[25] = (ARRAY_MODE(ARRAY_2D_TILED_XTHICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[26] = (ARRAY_MODE(ARRAY_3D_TILED_XTHICK) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_THICK_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_1));
+               modearray[27] = (ARRAY_MODE(ARRAY_1D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[28] = (ARRAY_MODE(ARRAY_2D_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_2));
+               modearray[29] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P8_32x32_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+               modearray[30] = (ARRAY_MODE(ARRAY_PRT_TILED_THIN1) |
+                               PIPE_CONFIG(ADDR_SURF_P4_16x16) |
+                               MICRO_TILE_MODE_NEW(ADDR_SURF_ROTATED_MICRO_TILING) |
+                               SAMPLE_SPLIT(ADDR_SURF_SAMPLE_SPLIT_8));
+
+               mod2array[0] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[1] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[2] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[3] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[4] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[5] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[6] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[8] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_8) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[9] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_4) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_4) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[10] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_2) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
+               mod2array[11] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_2) |
+                               NUM_BANKS(ADDR_SURF_16_BANK));
+
                mod2array[12] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                NUM_BANKS(ADDR_SURF_8_BANK));
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_8_BANK));
+
                mod2array[13] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                NUM_BANKS(ADDR_SURF_4_BANK));
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
+
                mod2array[14] = (BANK_WIDTH(ADDR_SURF_BANK_WIDTH_1) |
-                                BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
-                                MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
-                                NUM_BANKS(ADDR_SURF_4_BANK));
+                               BANK_HEIGHT(ADDR_SURF_BANK_HEIGHT_1) |
+                               MACRO_TILE_ASPECT(ADDR_SURF_MACRO_ASPECT_1) |
+                               NUM_BANKS(ADDR_SURF_4_BANK));
 
                for (reg_offset = 0; reg_offset < num_tile_mode_states; reg_offset++)
                        WREG32(mmGB_TILE_MODE0 + reg_offset, modearray[reg_offset]);
@@ -2695,6 +3432,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
        gfx_v8_0_tiling_mode_table_init(adev);
 
        gfx_v8_0_setup_rb(adev);
+       gfx_v8_0_get_cu_info(adev);
 
        /* XXX SH_MEM regs */
        /* where to put LDS, scratch, GPUVM in FSA64 space */
@@ -2788,6 +3526,188 @@ static void gfx_v8_0_enable_gui_idle_interrupt(struct amdgpu_device *adev,
        WREG32(mmCP_INT_CNTL_RING0, tmp);
 }
 
+static void gfx_v8_0_init_csb(struct amdgpu_device *adev)
+{
+       /* csib */
+       WREG32(mmRLC_CSIB_ADDR_HI,
+                       adev->gfx.rlc.clear_state_gpu_addr >> 32);
+       WREG32(mmRLC_CSIB_ADDR_LO,
+                       adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc);
+       WREG32(mmRLC_CSIB_LENGTH,
+                       adev->gfx.rlc.clear_state_size);
+}
+
+static void gfx_v8_0_parse_ind_reg_list(int *register_list_format,
+                               int ind_offset,
+                               int list_size,
+                               int *unique_indices,
+                               int *indices_count,
+                               int max_indices,
+                               int *ind_start_offsets,
+                               int *offset_count,
+                               int max_offset)
+{
+       int indices;
+       bool new_entry = true;
+
+       for (; ind_offset < list_size; ind_offset++) {
+
+               if (new_entry) {
+                       new_entry = false;
+                       ind_start_offsets[*offset_count] = ind_offset;
+                       *offset_count = *offset_count + 1;
+                       BUG_ON(*offset_count >= max_offset);
+               }
+
+               if (register_list_format[ind_offset] == 0xFFFFFFFF) {
+                       new_entry = true;
+                       continue;
+               }
+
+               ind_offset += 2;
+
+               /* look for the matching indice */
+               for (indices = 0;
+                       indices < *indices_count;
+                       indices++) {
+                       if (unique_indices[indices] ==
+                               register_list_format[ind_offset])
+                               break;
+               }
+
+               if (indices >= *indices_count) {
+                       unique_indices[*indices_count] =
+                               register_list_format[ind_offset];
+                       indices = *indices_count;
+                       *indices_count = *indices_count + 1;
+                       BUG_ON(*indices_count >= max_indices);
+               }
+
+               register_list_format[ind_offset] = indices;
+       }
+}
+
+static int gfx_v8_0_init_save_restore_list(struct amdgpu_device *adev)
+{
+       int i, temp, data;
+       int unique_indices[] = {0, 0, 0, 0, 0, 0, 0, 0};
+       int indices_count = 0;
+       int indirect_start_offsets[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+       int offset_count = 0;
+
+       int list_size;
+       unsigned int *register_list_format =
+               kmalloc(adev->gfx.rlc.reg_list_format_size_bytes, GFP_KERNEL);
+       if (register_list_format == NULL)
+               return -ENOMEM;
+       memcpy(register_list_format, adev->gfx.rlc.register_list_format,
+                       adev->gfx.rlc.reg_list_format_size_bytes);
+
+       gfx_v8_0_parse_ind_reg_list(register_list_format,
+                               RLC_FormatDirectRegListLength,
+                               adev->gfx.rlc.reg_list_format_size_bytes >> 2,
+                               unique_indices,
+                               &indices_count,
+                               sizeof(unique_indices) / sizeof(int),
+                               indirect_start_offsets,
+                               &offset_count,
+                               sizeof(indirect_start_offsets)/sizeof(int));
+
+       /* save and restore list */
+       temp = RREG32(mmRLC_SRM_CNTL);
+       temp |= RLC_SRM_CNTL__AUTO_INCR_ADDR_MASK;
+       WREG32(mmRLC_SRM_CNTL, temp);
+
+       WREG32(mmRLC_SRM_ARAM_ADDR, 0);
+       for (i = 0; i < adev->gfx.rlc.reg_list_size_bytes >> 2; i++)
+               WREG32(mmRLC_SRM_ARAM_DATA, adev->gfx.rlc.register_restore[i]);
+
+       /* indirect list */
+       WREG32(mmRLC_GPM_SCRATCH_ADDR, adev->gfx.rlc.reg_list_format_start);
+       for (i = 0; i < adev->gfx.rlc.reg_list_format_size_bytes >> 2; i++)
+               WREG32(mmRLC_GPM_SCRATCH_DATA, register_list_format[i]);
+
+       list_size = adev->gfx.rlc.reg_list_size_bytes >> 2;
+       list_size = list_size >> 1;
+       WREG32(mmRLC_GPM_SCRATCH_ADDR, adev->gfx.rlc.reg_restore_list_size);
+       WREG32(mmRLC_GPM_SCRATCH_DATA, list_size);
+
+       /* starting offsets starts */
+       WREG32(mmRLC_GPM_SCRATCH_ADDR,
+               adev->gfx.rlc.starting_offsets_start);
+       for (i = 0; i < sizeof(indirect_start_offsets)/sizeof(int); i++)
+               WREG32(mmRLC_GPM_SCRATCH_DATA,
+                               indirect_start_offsets[i]);
+
+       /* unique indices */
+       temp = mmRLC_SRM_INDEX_CNTL_ADDR_0;
+       data = mmRLC_SRM_INDEX_CNTL_DATA_0;
+       for (i = 0; i < sizeof(unique_indices) / sizeof(int); i++) {
+               amdgpu_mm_wreg(adev, temp + i, unique_indices[i] & 0x3FFFF, false);
+               amdgpu_mm_wreg(adev, data + i, unique_indices[i] >> 20, false);
+       }
+       kfree(register_list_format);
+
+       return 0;
+}
+
+static void gfx_v8_0_enable_save_restore_machine(struct amdgpu_device *adev)
+{
+       uint32_t data;
+
+       data = RREG32(mmRLC_SRM_CNTL);
+       data |= RLC_SRM_CNTL__SRM_ENABLE_MASK;
+       WREG32(mmRLC_SRM_CNTL, data);
+}
+
+static void polaris11_init_power_gating(struct amdgpu_device *adev)
+{
+       uint32_t data;
+
+       if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
+                       AMD_PG_SUPPORT_GFX_SMG |
+                       AMD_PG_SUPPORT_GFX_DMG)) {
+               data = RREG32(mmCP_RB_WPTR_POLL_CNTL);
+               data &= ~CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT_MASK;
+               data |= (0x60 << CP_RB_WPTR_POLL_CNTL__IDLE_POLL_COUNT__SHIFT);
+               WREG32(mmCP_RB_WPTR_POLL_CNTL, data);
+
+               data = 0;
+               data |= (0x10 << RLC_PG_DELAY__POWER_UP_DELAY__SHIFT);
+               data |= (0x10 << RLC_PG_DELAY__POWER_DOWN_DELAY__SHIFT);
+               data |= (0x10 << RLC_PG_DELAY__CMD_PROPAGATE_DELAY__SHIFT);
+               data |= (0x10 << RLC_PG_DELAY__MEM_SLEEP_DELAY__SHIFT);
+               WREG32(mmRLC_PG_DELAY, data);
+
+               data = RREG32(mmRLC_PG_DELAY_2);
+               data &= ~RLC_PG_DELAY_2__SERDES_CMD_DELAY_MASK;
+               data |= (0x3 << RLC_PG_DELAY_2__SERDES_CMD_DELAY__SHIFT);
+               WREG32(mmRLC_PG_DELAY_2, data);
+
+               data = RREG32(mmRLC_AUTO_PG_CTRL);
+               data &= ~RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD_MASK;
+               data |= (0x55f0 << RLC_AUTO_PG_CTRL__GRBM_REG_SAVE_GFX_IDLE_THRESHOLD__SHIFT);
+               WREG32(mmRLC_AUTO_PG_CTRL, data);
+       }
+}
+
+static void gfx_v8_0_init_pg(struct amdgpu_device *adev)
+{
+       if (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG |
+                             AMD_PG_SUPPORT_GFX_SMG |
+                             AMD_PG_SUPPORT_GFX_DMG |
+                             AMD_PG_SUPPORT_CP |
+                             AMD_PG_SUPPORT_GDS |
+                             AMD_PG_SUPPORT_RLC_SMU_HS)) {
+               gfx_v8_0_init_csb(adev);
+               gfx_v8_0_init_save_restore_list(adev);
+               gfx_v8_0_enable_save_restore_machine(adev);
+
+               if (adev->asic_type == CHIP_POLARIS11)
+                       polaris11_init_power_gating(adev);
+       }
+}
+
 void gfx_v8_0_rlc_stop(struct amdgpu_device *adev)
 {
        u32 tmp = RREG32(mmRLC_CNTL);
@@ -2858,12 +3778,17 @@ static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)
 
        /* disable CG */
        WREG32(mmRLC_CGCG_CGLS_CTRL, 0);
+       if (adev->asic_type == CHIP_POLARIS11 ||
+               adev->asic_type == CHIP_POLARIS10)
+               WREG32(mmRLC_CGCG_CGLS_CTRL_3D, 0);
 
        /* disable PG */
        WREG32(mmRLC_PG_CNTL, 0);
 
        gfx_v8_0_rlc_reset(adev);
 
+       gfx_v8_0_init_pg(adev);
+
        if (!adev->pp_enabled) {
                if (!adev->firmware.smu_load) {
                        /* legacy rlc firmware loading */
@@ -3035,9 +3960,14 @@ static int gfx_v8_0_cp_gfx_start(struct amdgpu_device *adev)
        amdgpu_ring_write(ring, mmPA_SC_RASTER_CONFIG - PACKET3_SET_CONTEXT_REG_START);
        switch (adev->asic_type) {
        case CHIP_TONGA:
+       case CHIP_POLARIS10:
                amdgpu_ring_write(ring, 0x16000012);
                amdgpu_ring_write(ring, 0x0000002A);
                break;
+       case CHIP_POLARIS11:
+               amdgpu_ring_write(ring, 0x16000012);
+               amdgpu_ring_write(ring, 0x00000000);
+               break;
        case CHIP_FIJI:
                amdgpu_ring_write(ring, 0x3a00161a);
                amdgpu_ring_write(ring, 0x0000002e);
@@ -3121,6 +4051,8 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)
                if (ring->use_doorbell) {
                        tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
                                            DOORBELL_OFFSET, ring->doorbell_index);
+                       tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
+                                           DOORBELL_HIT, 0);
                        tmp = REG_SET_FIELD(tmp, CP_RB_DOORBELL_CONTROL,
                                            DOORBELL_EN, 1);
                } else {
@@ -3679,7 +4611,9 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev)
                if (use_doorbell) {
                        if ((adev->asic_type == CHIP_CARRIZO) ||
                            (adev->asic_type == CHIP_FIJI) ||
-                           (adev->asic_type == CHIP_STONEY)) {
+                           (adev->asic_type == CHIP_STONEY) ||
+                           (adev->asic_type == CHIP_POLARIS11) ||
+                           (adev->asic_type == CHIP_POLARIS10)) {
                                WREG32(mmCP_MEC_DOORBELL_RANGE_LOWER,
                                       AMDGPU_DOORBELL_KIQ << 2);
                                WREG32(mmCP_MEC_DOORBELL_RANGE_UPPER,
@@ -3713,7 +4647,9 @@ static int gfx_v8_0_cp_compute_resume(struct amdgpu_device *adev)
                tmp = REG_SET_FIELD(tmp, CP_HQD_PERSISTENT_STATE, PRELOAD_SIZE, 0x53);
                WREG32(mmCP_HQD_PERSISTENT_STATE, tmp);
                mqd->cp_hqd_persistent_state = tmp;
-               if (adev->asic_type == CHIP_STONEY) {
+               if (adev->asic_type == CHIP_STONEY ||
+                       adev->asic_type == CHIP_POLARIS11 ||
+                       adev->asic_type == CHIP_POLARIS10) {
                        tmp = RREG32(mmCP_ME1_PIPE3_INT_CNTL);
                        tmp = REG_SET_FIELD(tmp, CP_ME1_PIPE3_INT_CNTL, GENERIC2_INT_ENABLE, 1);
                        WREG32(mmCP_ME1_PIPE3_INT_CNTL, tmp);
@@ -3845,6 +4781,9 @@ static int gfx_v8_0_hw_fini(void *handle)
        gfx_v8_0_rlc_stop(adev);
        gfx_v8_0_cp_compute_fini(adev);
 
+       amdgpu_set_powergating_state(adev,
+                       AMD_IP_BLOCK_TYPE_GFX, AMD_PG_STATE_UNGATE);
+
        return 0;
 }
 
@@ -3889,185 +4828,6 @@ static int gfx_v8_0_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void gfx_v8_0_print_status(void *handle)
-{
-       int i;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "GFX 8.x registers\n");
-       dev_info(adev->dev, "  GRBM_STATUS=0x%08X\n",
-                RREG32(mmGRBM_STATUS));
-       dev_info(adev->dev, "  GRBM_STATUS2=0x%08X\n",
-                RREG32(mmGRBM_STATUS2));
-       dev_info(adev->dev, "  GRBM_STATUS_SE0=0x%08X\n",
-                RREG32(mmGRBM_STATUS_SE0));
-       dev_info(adev->dev, "  GRBM_STATUS_SE1=0x%08X\n",
-                RREG32(mmGRBM_STATUS_SE1));
-       dev_info(adev->dev, "  GRBM_STATUS_SE2=0x%08X\n",
-                RREG32(mmGRBM_STATUS_SE2));
-       dev_info(adev->dev, "  GRBM_STATUS_SE3=0x%08X\n",
-                RREG32(mmGRBM_STATUS_SE3));
-       dev_info(adev->dev, "  CP_STAT = 0x%08x\n", RREG32(mmCP_STAT));
-       dev_info(adev->dev, "  CP_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_STALLED_STAT2 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT2));
-       dev_info(adev->dev, "  CP_STALLED_STAT3 = 0x%08x\n",
-                RREG32(mmCP_STALLED_STAT3));
-       dev_info(adev->dev, "  CP_CPF_BUSY_STAT = 0x%08x\n",
-                RREG32(mmCP_CPF_BUSY_STAT));
-       dev_info(adev->dev, "  CP_CPF_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_CPF_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_CPF_STATUS = 0x%08x\n", RREG32(mmCP_CPF_STATUS));
-       dev_info(adev->dev, "  CP_CPC_BUSY_STAT = 0x%08x\n", RREG32(mmCP_CPC_BUSY_STAT));
-       dev_info(adev->dev, "  CP_CPC_STALLED_STAT1 = 0x%08x\n",
-                RREG32(mmCP_CPC_STALLED_STAT1));
-       dev_info(adev->dev, "  CP_CPC_STATUS = 0x%08x\n", RREG32(mmCP_CPC_STATUS));
-
-       for (i = 0; i < 32; i++) {
-               dev_info(adev->dev, "  GB_TILE_MODE%d=0x%08X\n",
-                        i, RREG32(mmGB_TILE_MODE0 + (i * 4)));
-       }
-       for (i = 0; i < 16; i++) {
-               dev_info(adev->dev, "  GB_MACROTILE_MODE%d=0x%08X\n",
-                        i, RREG32(mmGB_MACROTILE_MODE0 + (i * 4)));
-       }
-       for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {
-               dev_info(adev->dev, "  se: %d\n", i);
-               gfx_v8_0_select_se_sh(adev, i, 0xffffffff);
-               dev_info(adev->dev, "  PA_SC_RASTER_CONFIG=0x%08X\n",
-                        RREG32(mmPA_SC_RASTER_CONFIG));
-               dev_info(adev->dev, "  PA_SC_RASTER_CONFIG_1=0x%08X\n",
-                        RREG32(mmPA_SC_RASTER_CONFIG_1));
-       }
-       gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff);
-
-       dev_info(adev->dev, "  GB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmGB_ADDR_CONFIG));
-       dev_info(adev->dev, "  HDP_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmHDP_ADDR_CONFIG));
-       dev_info(adev->dev, "  DMIF_ADDR_CALC=0x%08X\n",
-                RREG32(mmDMIF_ADDR_CALC));
-
-       dev_info(adev->dev, "  CP_MEQ_THRESHOLDS=0x%08X\n",
-                RREG32(mmCP_MEQ_THRESHOLDS));
-       dev_info(adev->dev, "  SX_DEBUG_1=0x%08X\n",
-                RREG32(mmSX_DEBUG_1));
-       dev_info(adev->dev, "  TA_CNTL_AUX=0x%08X\n",
-                RREG32(mmTA_CNTL_AUX));
-       dev_info(adev->dev, "  SPI_CONFIG_CNTL=0x%08X\n",
-                RREG32(mmSPI_CONFIG_CNTL));
-       dev_info(adev->dev, "  SQ_CONFIG=0x%08X\n",
-                RREG32(mmSQ_CONFIG));
-       dev_info(adev->dev, "  DB_DEBUG=0x%08X\n",
-                RREG32(mmDB_DEBUG));
-       dev_info(adev->dev, "  DB_DEBUG2=0x%08X\n",
-                RREG32(mmDB_DEBUG2));
-       dev_info(adev->dev, "  DB_DEBUG3=0x%08X\n",
-                RREG32(mmDB_DEBUG3));
-       dev_info(adev->dev, "  CB_HW_CONTROL=0x%08X\n",
-                RREG32(mmCB_HW_CONTROL));
-       dev_info(adev->dev, "  SPI_CONFIG_CNTL_1=0x%08X\n",
-                RREG32(mmSPI_CONFIG_CNTL_1));
-       dev_info(adev->dev, "  PA_SC_FIFO_SIZE=0x%08X\n",
-                RREG32(mmPA_SC_FIFO_SIZE));
-       dev_info(adev->dev, "  VGT_NUM_INSTANCES=0x%08X\n",
-                RREG32(mmVGT_NUM_INSTANCES));
-       dev_info(adev->dev, "  CP_PERFMON_CNTL=0x%08X\n",
-                RREG32(mmCP_PERFMON_CNTL));
-       dev_info(adev->dev, "  PA_SC_FORCE_EOV_MAX_CNTS=0x%08X\n",
-                RREG32(mmPA_SC_FORCE_EOV_MAX_CNTS));
-       dev_info(adev->dev, "  VGT_CACHE_INVALIDATION=0x%08X\n",
-                RREG32(mmVGT_CACHE_INVALIDATION));
-       dev_info(adev->dev, "  VGT_GS_VERTEX_REUSE=0x%08X\n",
-                RREG32(mmVGT_GS_VERTEX_REUSE));
-       dev_info(adev->dev, "  PA_SC_LINE_STIPPLE_STATE=0x%08X\n",
-                RREG32(mmPA_SC_LINE_STIPPLE_STATE));
-       dev_info(adev->dev, "  PA_CL_ENHANCE=0x%08X\n",
-                RREG32(mmPA_CL_ENHANCE));
-       dev_info(adev->dev, "  PA_SC_ENHANCE=0x%08X\n",
-                RREG32(mmPA_SC_ENHANCE));
-
-       dev_info(adev->dev, "  CP_ME_CNTL=0x%08X\n",
-                RREG32(mmCP_ME_CNTL));
-       dev_info(adev->dev, "  CP_MAX_CONTEXT=0x%08X\n",
-                RREG32(mmCP_MAX_CONTEXT));
-       dev_info(adev->dev, "  CP_ENDIAN_SWAP=0x%08X\n",
-                RREG32(mmCP_ENDIAN_SWAP));
-       dev_info(adev->dev, "  CP_DEVICE_ID=0x%08X\n",
-                RREG32(mmCP_DEVICE_ID));
-
-       dev_info(adev->dev, "  CP_SEM_WAIT_TIMER=0x%08X\n",
-                RREG32(mmCP_SEM_WAIT_TIMER));
-
-       dev_info(adev->dev, "  CP_RB_WPTR_DELAY=0x%08X\n",
-                RREG32(mmCP_RB_WPTR_DELAY));
-       dev_info(adev->dev, "  CP_RB_VMID=0x%08X\n",
-                RREG32(mmCP_RB_VMID));
-       dev_info(adev->dev, "  CP_RB0_CNTL=0x%08X\n",
-                RREG32(mmCP_RB0_CNTL));
-       dev_info(adev->dev, "  CP_RB0_WPTR=0x%08X\n",
-                RREG32(mmCP_RB0_WPTR));
-       dev_info(adev->dev, "  CP_RB0_RPTR_ADDR=0x%08X\n",
-                RREG32(mmCP_RB0_RPTR_ADDR));
-       dev_info(adev->dev, "  CP_RB0_RPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmCP_RB0_RPTR_ADDR_HI));
-       dev_info(adev->dev, "  CP_RB0_CNTL=0x%08X\n",
-                RREG32(mmCP_RB0_CNTL));
-       dev_info(adev->dev, "  CP_RB0_BASE=0x%08X\n",
-                RREG32(mmCP_RB0_BASE));
-       dev_info(adev->dev, "  CP_RB0_BASE_HI=0x%08X\n",
-                RREG32(mmCP_RB0_BASE_HI));
-       dev_info(adev->dev, "  CP_MEC_CNTL=0x%08X\n",
-                RREG32(mmCP_MEC_CNTL));
-       dev_info(adev->dev, "  CP_CPF_DEBUG=0x%08X\n",
-                RREG32(mmCP_CPF_DEBUG));
-
-       dev_info(adev->dev, "  SCRATCH_ADDR=0x%08X\n",
-                RREG32(mmSCRATCH_ADDR));
-       dev_info(adev->dev, "  SCRATCH_UMSK=0x%08X\n",
-                RREG32(mmSCRATCH_UMSK));
-
-       dev_info(adev->dev, "  CP_INT_CNTL_RING0=0x%08X\n",
-                RREG32(mmCP_INT_CNTL_RING0));
-       dev_info(adev->dev, "  RLC_LB_CNTL=0x%08X\n",
-                RREG32(mmRLC_LB_CNTL));
-       dev_info(adev->dev, "  RLC_CNTL=0x%08X\n",
-                RREG32(mmRLC_CNTL));
-       dev_info(adev->dev, "  RLC_CGCG_CGLS_CTRL=0x%08X\n",
-                RREG32(mmRLC_CGCG_CGLS_CTRL));
-       dev_info(adev->dev, "  RLC_LB_CNTR_INIT=0x%08X\n",
-                RREG32(mmRLC_LB_CNTR_INIT));
-       dev_info(adev->dev, "  RLC_LB_CNTR_MAX=0x%08X\n",
-                RREG32(mmRLC_LB_CNTR_MAX));
-       dev_info(adev->dev, "  RLC_LB_INIT_CU_MASK=0x%08X\n",
-                RREG32(mmRLC_LB_INIT_CU_MASK));
-       dev_info(adev->dev, "  RLC_LB_PARAMS=0x%08X\n",
-                RREG32(mmRLC_LB_PARAMS));
-       dev_info(adev->dev, "  RLC_LB_CNTL=0x%08X\n",
-                RREG32(mmRLC_LB_CNTL));
-       dev_info(adev->dev, "  RLC_MC_CNTL=0x%08X\n",
-                RREG32(mmRLC_MC_CNTL));
-       dev_info(adev->dev, "  RLC_UCODE_CNTL=0x%08X\n",
-                RREG32(mmRLC_UCODE_CNTL));
-
-       mutex_lock(&adev->srbm_mutex);
-       for (i = 0; i < 16; i++) {
-               vi_srbm_select(adev, 0, 0, 0, i);
-               dev_info(adev->dev, "  VM %d:\n", i);
-               dev_info(adev->dev, "  SH_MEM_CONFIG=0x%08X\n",
-                        RREG32(mmSH_MEM_CONFIG));
-               dev_info(adev->dev, "  SH_MEM_APE1_BASE=0x%08X\n",
-                        RREG32(mmSH_MEM_APE1_BASE));
-               dev_info(adev->dev, "  SH_MEM_APE1_LIMIT=0x%08X\n",
-                        RREG32(mmSH_MEM_APE1_LIMIT));
-               dev_info(adev->dev, "  SH_MEM_BASES=0x%08X\n",
-                        RREG32(mmSH_MEM_BASES));
-       }
-       vi_srbm_select(adev, 0, 0, 0, 0);
-       mutex_unlock(&adev->srbm_mutex);
-}
-
 static int gfx_v8_0_soft_reset(void *handle)
 {
        u32 grbm_soft_reset = 0, srbm_soft_reset = 0;
@@ -4108,7 +4868,6 @@ static int gfx_v8_0_soft_reset(void *handle)
                                                SRBM_SOFT_RESET, SOFT_RESET_GRBM, 1);
 
        if (grbm_soft_reset || srbm_soft_reset) {
-               gfx_v8_0_print_status((void *)adev);
                /* stop the rlc */
                gfx_v8_0_rlc_stop(adev);
 
@@ -4168,7 +4927,6 @@ static int gfx_v8_0_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-               gfx_v8_0_print_status((void *)adev);
        }
        return 0;
 }
@@ -4250,6 +5008,7 @@ static int gfx_v8_0_early_init(void *handle)
        gfx_v8_0_set_ring_funcs(adev);
        gfx_v8_0_set_irq_funcs(adev);
        gfx_v8_0_set_gds_init(adev);
+       gfx_v8_0_set_rlc_funcs(adev);
 
        return 0;
 }
@@ -4272,17 +5031,109 @@ static int gfx_v8_0_late_init(void *handle)
        if (r)
                return r;
 
+       amdgpu_set_powergating_state(adev,
+                       AMD_IP_BLOCK_TYPE_GFX, AMD_PG_STATE_GATE);
+
        return 0;
 }
 
+static void polaris11_enable_gfx_static_mg_power_gating(struct amdgpu_device *adev,
+               bool enable)
+{
+       uint32_t data, temp;
+
+       /* Send msg to SMU via Powerplay */
+       amdgpu_set_powergating_state(adev,
+                       AMD_IP_BLOCK_TYPE_SMC,
+                       enable ? AMD_PG_STATE_GATE : AMD_PG_STATE_UNGATE);
+
+       if (enable) {
+               /* Enable static MGPG */
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data |= RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       } else {
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data &= ~RLC_PG_CNTL__STATIC_PER_CU_PG_ENABLE_MASK;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       }
+}
+
+static void polaris11_enable_gfx_dynamic_mg_power_gating(struct amdgpu_device *adev,
+               bool enable)
+{
+       uint32_t data, temp;
+
+       if (enable) {
+               /* Enable dynamic MGPG */
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data |= RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       } else {
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data &= ~RLC_PG_CNTL__DYN_PER_CU_PG_ENABLE_MASK;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       }
+}
+
+static void polaris11_enable_gfx_quick_mg_power_gating(struct amdgpu_device *adev,
+               bool enable)
+{
+       uint32_t data, temp;
+
+       if (enable) {
+               /* Enable quick PG */
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data |= 0x100000;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       } else {
+               temp = data = RREG32(mmRLC_PG_CNTL);
+               data &= ~0x100000;
+
+               if (temp != data)
+                       WREG32(mmRLC_PG_CNTL, data);
+       }
+}
+
 static int gfx_v8_0_set_powergating_state(void *handle,
                                          enum amd_powergating_state state)
 {
+       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+
+       if (!(adev->pg_flags & AMD_PG_SUPPORT_GFX_PG))
+               return 0;
+
+       switch (adev->asic_type) {
+       case CHIP_POLARIS11:
+               if (adev->pg_flags & AMD_PG_SUPPORT_GFX_SMG)
+                       polaris11_enable_gfx_static_mg_power_gating(adev,
+                                       state == AMD_PG_STATE_GATE ? true : false);
+               else if (adev->pg_flags & AMD_PG_SUPPORT_GFX_DMG)
+                       polaris11_enable_gfx_dynamic_mg_power_gating(adev,
+                                       state == AMD_PG_STATE_GATE ? true : false);
+               else
+                       polaris11_enable_gfx_quick_mg_power_gating(adev,
+                                       state == AMD_PG_STATE_GATE ? true : false);
+               break;
+       default:
+               break;
+       }
+
        return 0;
 }
 
-static void fiji_send_serdes_cmd(struct amdgpu_device *adev,
-               uint32_t reg_addr, uint32_t cmd)
+static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,
+                                    uint32_t reg_addr, uint32_t cmd)
 {
        uint32_t data;
 
@@ -4292,7 +5143,8 @@ static void fiji_send_serdes_cmd(struct amdgpu_device *adev,
        WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff);
 
        data = RREG32(mmRLC_SERDES_WR_CTRL);
-       data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
+       if (adev->asic_type == CHIP_STONEY)
+                       data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
                        RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
                        RLC_SERDES_WR_CTRL__P1_SELECT_MASK |
                        RLC_SERDES_WR_CTRL__P2_SELECT_MASK |
@@ -4300,42 +5152,218 @@ static void fiji_send_serdes_cmd(struct amdgpu_device *adev,
                        RLC_SERDES_WR_CTRL__POWER_DOWN_MASK |
                        RLC_SERDES_WR_CTRL__POWER_UP_MASK |
                        RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK |
-                       RLC_SERDES_WR_CTRL__BPM_DATA_MASK |
-                       RLC_SERDES_WR_CTRL__REG_ADDR_MASK |
                        RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK);
+       else
+               data &= ~(RLC_SERDES_WR_CTRL__WRITE_COMMAND_MASK |
+                         RLC_SERDES_WR_CTRL__READ_COMMAND_MASK |
+                         RLC_SERDES_WR_CTRL__P1_SELECT_MASK |
+                         RLC_SERDES_WR_CTRL__P2_SELECT_MASK |
+                         RLC_SERDES_WR_CTRL__RDDATA_RESET_MASK |
+                         RLC_SERDES_WR_CTRL__POWER_DOWN_MASK |
+                         RLC_SERDES_WR_CTRL__POWER_UP_MASK |
+                         RLC_SERDES_WR_CTRL__SHORT_FORMAT_MASK |
+                         RLC_SERDES_WR_CTRL__BPM_DATA_MASK |
+                         RLC_SERDES_WR_CTRL__REG_ADDR_MASK |
+                         RLC_SERDES_WR_CTRL__SRBM_OVERRIDE_MASK);
        data |= (RLC_SERDES_WR_CTRL__RSVD_BPM_ADDR_MASK |
-                       (cmd << RLC_SERDES_WR_CTRL__BPM_DATA__SHIFT) |
-                       (reg_addr << RLC_SERDES_WR_CTRL__REG_ADDR__SHIFT) |
-                       (0xff << RLC_SERDES_WR_CTRL__BPM_ADDR__SHIFT));
+                (cmd << RLC_SERDES_WR_CTRL__BPM_DATA__SHIFT) |
+                (reg_addr << RLC_SERDES_WR_CTRL__REG_ADDR__SHIFT) |
+                (0xff << RLC_SERDES_WR_CTRL__BPM_ADDR__SHIFT));
 
        WREG32(mmRLC_SERDES_WR_CTRL, data);
 }
 
-static void fiji_update_medium_grain_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+#define MSG_ENTER_RLC_SAFE_MODE     1
+#define MSG_EXIT_RLC_SAFE_MODE      0
+
+#define RLC_GPR_REG2__REQ_MASK           0x00000001
+#define RLC_GPR_REG2__MESSAGE__SHIFT     0x00000001
+#define RLC_GPR_REG2__MESSAGE_MASK       0x0000001e
+
+static void cz_enter_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       u32 data = 0;
+       unsigned i;
+
+       data = RREG32(mmRLC_CNTL);
+       if ((data & RLC_CNTL__RLC_ENABLE_F32_MASK) == 0)
+               return;
+
+       if ((adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) ||
+           (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | AMD_PG_SUPPORT_GFX_SMG |
+                              AMD_PG_SUPPORT_GFX_DMG))) {
+               data |= RLC_GPR_REG2__REQ_MASK;
+               data &= ~RLC_GPR_REG2__MESSAGE_MASK;
+               data |= (MSG_ENTER_RLC_SAFE_MODE << RLC_GPR_REG2__MESSAGE__SHIFT);
+               WREG32(mmRLC_GPR_REG2, data);
+
+               for (i = 0; i < adev->usec_timeout; i++) {
+                       if ((RREG32(mmRLC_GPM_STAT) &
+                            (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
+                             RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) ==
+                           (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
+                            RLC_GPM_STAT__GFX_POWER_STATUS_MASK))
+                               break;
+                       udelay(1);
+               }
+
+               for (i = 0; i < adev->usec_timeout; i++) {
+                       if ((RREG32(mmRLC_GPR_REG2) & RLC_GPR_REG2__REQ_MASK) == 0)
+                               break;
+                       udelay(1);
+               }
+               adev->gfx.rlc.in_safe_mode = true;
+       }
+}
+
+static void cz_exit_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       u32 data;
+       unsigned i;
+
+       data = RREG32(mmRLC_CNTL);
+       if ((data & RLC_CNTL__RLC_ENABLE_F32_MASK) == 0)
+               return;
+
+       if ((adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) ||
+           (adev->pg_flags & (AMD_PG_SUPPORT_GFX_PG | AMD_PG_SUPPORT_GFX_SMG |
+                              AMD_PG_SUPPORT_GFX_DMG))) {
+               data |= RLC_GPR_REG2__REQ_MASK;
+               data &= ~RLC_GPR_REG2__MESSAGE_MASK;
+               data |= (MSG_EXIT_RLC_SAFE_MODE << RLC_GPR_REG2__MESSAGE__SHIFT);
+               WREG32(mmRLC_GPR_REG2, data);
+               adev->gfx.rlc.in_safe_mode = false;
+       }
+
+       for (i = 0; i < adev->usec_timeout; i++) {
+               if ((RREG32(mmRLC_GPR_REG2) & RLC_GPR_REG2__REQ_MASK) == 0)
+                       break;
+               udelay(1);
+       }
+}
+
+static void iceland_enter_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       u32 data;
+       unsigned i;
+
+       data = RREG32(mmRLC_CNTL);
+       if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK))
+               return;
+
+       if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) {
+               data |= RLC_SAFE_MODE__CMD_MASK;
+               data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
+               data |= (1 << RLC_SAFE_MODE__MESSAGE__SHIFT);
+               WREG32(mmRLC_SAFE_MODE, data);
+
+               for (i = 0; i < adev->usec_timeout; i++) {
+                       if ((RREG32(mmRLC_GPM_STAT) &
+                            (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
+                             RLC_GPM_STAT__GFX_POWER_STATUS_MASK)) ==
+                           (RLC_GPM_STAT__GFX_CLOCK_STATUS_MASK |
+                            RLC_GPM_STAT__GFX_POWER_STATUS_MASK))
+                               break;
+                       udelay(1);
+               }
+
+               for (i = 0; i < adev->usec_timeout; i++) {
+                       if ((RREG32(mmRLC_SAFE_MODE) & RLC_SAFE_MODE__CMD_MASK) == 0)
+                               break;
+                       udelay(1);
+               }
+               adev->gfx.rlc.in_safe_mode = true;
+       }
+}
+
+static void iceland_exit_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       u32 data = 0;
+       unsigned i;
+
+       data = RREG32(mmRLC_CNTL);
+       if (!(data & RLC_CNTL__RLC_ENABLE_F32_MASK))
+               return;
+
+       if (adev->cg_flags & (AMD_CG_SUPPORT_GFX_CGCG | AMD_CG_SUPPORT_GFX_MGCG)) {
+               if (adev->gfx.rlc.in_safe_mode) {
+                       data |= RLC_SAFE_MODE__CMD_MASK;
+                       data &= ~RLC_SAFE_MODE__MESSAGE_MASK;
+                       WREG32(mmRLC_SAFE_MODE, data);
+                       adev->gfx.rlc.in_safe_mode = false;
+               }
+       }
+
+       for (i = 0; i < adev->usec_timeout; i++) {
+               if ((RREG32(mmRLC_SAFE_MODE) & RLC_SAFE_MODE__CMD_MASK) == 0)
+                       break;
+               udelay(1);
+       }
+}
+
+static void gfx_v8_0_nop_enter_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       adev->gfx.rlc.in_safe_mode = true;
+}
+
+static void gfx_v8_0_nop_exit_rlc_safe_mode(struct amdgpu_device *adev)
+{
+       adev->gfx.rlc.in_safe_mode = false;
+}
+
+static const struct amdgpu_rlc_funcs cz_rlc_funcs = {
+       .enter_safe_mode = cz_enter_rlc_safe_mode,
+       .exit_safe_mode = cz_exit_rlc_safe_mode
+};
+
+static const struct amdgpu_rlc_funcs iceland_rlc_funcs = {
+       .enter_safe_mode = iceland_enter_rlc_safe_mode,
+       .exit_safe_mode = iceland_exit_rlc_safe_mode
+};
+
+static const struct amdgpu_rlc_funcs gfx_v8_0_nop_rlc_funcs = {
+       .enter_safe_mode = gfx_v8_0_nop_enter_rlc_safe_mode,
+       .exit_safe_mode = gfx_v8_0_nop_exit_rlc_safe_mode
+};
+
+static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev,
+                                                     bool enable)
 {
        uint32_t temp, data;
 
+       adev->gfx.rlc.funcs->enter_safe_mode(adev);
+
        /* It is disabled by HW by default */
-       if (enable) {
-               /* 1 - RLC memory Light sleep */
-               temp = data = RREG32(mmRLC_MEM_SLP_CNTL);
-               data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
-               if (temp != data)
-                       WREG32(mmRLC_MEM_SLP_CNTL, data);
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) {
+               if (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) {
+                       if (adev->cg_flags & AMD_CG_SUPPORT_GFX_RLC_LS) {
+                               /* 1 - RLC memory Light sleep */
+                               temp = data = RREG32(mmRLC_MEM_SLP_CNTL);
+                               data |= RLC_MEM_SLP_CNTL__RLC_MEM_LS_EN_MASK;
+                               if (temp != data)
+                                       WREG32(mmRLC_MEM_SLP_CNTL, data);
+                       }
 
-               /* 2 - CP memory Light sleep */
-               temp = data = RREG32(mmCP_MEM_SLP_CNTL);
-               data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
-               if (temp != data)
-                       WREG32(mmCP_MEM_SLP_CNTL, data);
+                       if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CP_LS) {
+                               /* 2 - CP memory Light sleep */
+                               temp = data = RREG32(mmCP_MEM_SLP_CNTL);
+                               data |= CP_MEM_SLP_CNTL__CP_MEM_LS_EN_MASK;
+                               if (temp != data)
+                                       WREG32(mmCP_MEM_SLP_CNTL, data);
+                       }
+               }
 
                /* 3 - RLC_CGTT_MGCG_OVERRIDE */
                temp = data = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
-               data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
-                               RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
-                               RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK |
-                               RLC_CGTT_MGCG_OVERRIDE__GRBM_MASK);
+               if (adev->flags & AMD_IS_APU)
+                       data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
+                                 RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
+                                 RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK);
+               else
+                       data &= ~(RLC_CGTT_MGCG_OVERRIDE__CPF_MASK |
+                                 RLC_CGTT_MGCG_OVERRIDE__RLC_MASK |
+                                 RLC_CGTT_MGCG_OVERRIDE__MGCG_MASK |
+                                 RLC_CGTT_MGCG_OVERRIDE__GRBM_MASK);
 
                if (temp != data)
                        WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data);
@@ -4344,19 +5372,23 @@ static void fiji_update_medium_grain_clock_gating(struct amdgpu_device *adev,
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* 5 - clear mgcg override */
-               fiji_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
-
-               /* 6 - Enable CGTS(Tree Shade) MGCG /MGLS */
-               temp = data = RREG32(mmCGTS_SM_CTRL_REG);
-               data &= ~(CGTS_SM_CTRL_REG__SM_MODE_MASK);
-               data |= (0x2 << CGTS_SM_CTRL_REG__SM_MODE__SHIFT);
-               data |= CGTS_SM_CTRL_REG__SM_MODE_ENABLE_MASK;
-               data &= ~CGTS_SM_CTRL_REG__OVERRIDE_MASK;
-               data &= ~CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK;
-               data |= CGTS_SM_CTRL_REG__ON_MONITOR_ADD_EN_MASK;
-               data |= (0x96 << CGTS_SM_CTRL_REG__ON_MONITOR_ADD__SHIFT);
-               if (temp != data)
-                       WREG32(mmCGTS_SM_CTRL_REG, data);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
+
+               if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS) {
+                       /* 6 - Enable CGTS(Tree Shade) MGCG /MGLS */
+                       temp = data = RREG32(mmCGTS_SM_CTRL_REG);
+                       data &= ~(CGTS_SM_CTRL_REG__SM_MODE_MASK);
+                       data |= (0x2 << CGTS_SM_CTRL_REG__SM_MODE__SHIFT);
+                       data |= CGTS_SM_CTRL_REG__SM_MODE_ENABLE_MASK;
+                       data &= ~CGTS_SM_CTRL_REG__OVERRIDE_MASK;
+                       if ((adev->cg_flags & AMD_CG_SUPPORT_GFX_MGLS) &&
+                           (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGTS_LS))
+                               data &= ~CGTS_SM_CTRL_REG__LS_OVERRIDE_MASK;
+                       data |= CGTS_SM_CTRL_REG__ON_MONITOR_ADD_EN_MASK;
+                       data |= (0x96 << CGTS_SM_CTRL_REG__ON_MONITOR_ADD__SHIFT);
+                       if (temp != data)
+                               WREG32(mmCGTS_SM_CTRL_REG, data);
+               }
                udelay(50);
 
                /* 7 - wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
@@ -4396,23 +5428,27 @@ static void fiji_update_medium_grain_clock_gating(struct amdgpu_device *adev,
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* 6 - set mgcg override */
-               fiji_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, SET_BPM_SERDES_CMD);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_MGCG_OVERRIDE, SET_BPM_SERDES_CMD);
 
                udelay(50);
 
                /* 7- wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
                gfx_v8_0_wait_for_rlc_serdes(adev);
        }
+
+       adev->gfx.rlc.funcs->exit_safe_mode(adev);
 }
 
-static void fiji_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
+                                                     bool enable)
 {
        uint32_t temp, temp1, data, data1;
 
        temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL);
 
-       if (enable) {
+       adev->gfx.rlc.funcs->enter_safe_mode(adev);
+
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {
                /* 1 enable cntx_empty_int_enable/cntx_busy_int_enable/
                 * Cmp_busy/GFX_Idle interrupts
                 */
@@ -4427,25 +5463,29 @@ static void fiji_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* 3 - clear cgcg override */
-               fiji_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, CLE_BPM_SERDES_CMD);
 
                /* wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* 4 - write cmd to set CGLS */
-               fiji_send_serdes_cmd(adev, BPM_REG_CGLS_EN, SET_BPM_SERDES_CMD);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGLS_EN, SET_BPM_SERDES_CMD);
 
                /* 5 - enable cgcg */
                data |= RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK;
 
-               /* enable cgls*/
-               data |= RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
+               if (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGLS) {
+                       /* enable cgls*/
+                       data |= RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
 
-               temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
-               data1 &= ~RLC_CGTT_MGCG_OVERRIDE__CGLS_MASK;
+                       temp1 = data1 = RREG32(mmRLC_CGTT_MGCG_OVERRIDE);
+                       data1 &= ~RLC_CGTT_MGCG_OVERRIDE__CGLS_MASK;
 
-               if (temp1 != data1)
-                       WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data1);
+                       if (temp1 != data1)
+                               WREG32(mmRLC_CGTT_MGCG_OVERRIDE, data1);
+               } else {
+                       data &= ~RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK;
+               }
 
                if (temp != data)
                        WREG32(mmRLC_CGCG_CGLS_CTRL, data);
@@ -4470,36 +5510,38 @@ static void fiji_update_coarse_grain_clock_gating(struct amdgpu_device *adev,
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* write cmd to Set CGCG Overrride */
-               fiji_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, SET_BPM_SERDES_CMD);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGCG_OVERRIDE, SET_BPM_SERDES_CMD);
 
                /* wait for RLC_SERDES_CU_MASTER & RLC_SERDES_NONCU_MASTER idle */
                gfx_v8_0_wait_for_rlc_serdes(adev);
 
                /* write cmd to Clear CGLS */
-               fiji_send_serdes_cmd(adev, BPM_REG_CGLS_EN, CLE_BPM_SERDES_CMD);
+               gfx_v8_0_send_serdes_cmd(adev, BPM_REG_CGLS_EN, CLE_BPM_SERDES_CMD);
 
                /* disable cgcg, cgls should be disabled too. */
                data &= ~(RLC_CGCG_CGLS_CTRL__CGCG_EN_MASK |
-                               RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
+                         RLC_CGCG_CGLS_CTRL__CGLS_EN_MASK);
                if (temp != data)
                        WREG32(mmRLC_CGCG_CGLS_CTRL, data);
        }
+
+       adev->gfx.rlc.funcs->exit_safe_mode(adev);
 }
-static int fiji_update_gfx_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,
+                                           bool enable)
 {
        if (enable) {
                /* CGCG/CGLS should be enabled after MGCG/MGLS/TS(CG/LS)
                 * ===  MGCG + MGLS + TS(CG/LS) ===
                 */
-               fiji_update_medium_grain_clock_gating(adev, enable);
-               fiji_update_coarse_grain_clock_gating(adev, enable);
+               gfx_v8_0_update_medium_grain_clock_gating(adev, enable);
+               gfx_v8_0_update_coarse_grain_clock_gating(adev, enable);
        } else {
                /* CGCG/CGLS should be disabled before MGCG/MGLS/TS(CG/LS)
                 * ===  CGCG + CGLS ===
                 */
-               fiji_update_coarse_grain_clock_gating(adev, enable);
-               fiji_update_medium_grain_clock_gating(adev, enable);
+               gfx_v8_0_update_coarse_grain_clock_gating(adev, enable);
+               gfx_v8_0_update_medium_grain_clock_gating(adev, enable);
        }
        return 0;
 }
@@ -4511,8 +5553,10 @@ static int gfx_v8_0_set_clockgating_state(void *handle,
 
        switch (adev->asic_type) {
        case CHIP_FIJI:
-               fiji_update_gfx_clock_gating(adev,
-                               state == AMD_CG_STATE_GATE ? true : false);
+       case CHIP_CARRIZO:
+       case CHIP_STONEY:
+               gfx_v8_0_update_gfx_clock_gating(adev,
+                                                state == AMD_CG_STATE_GATE ? true : false);
                break;
        default:
                break;
@@ -4602,17 +5646,13 @@ static void gfx_v8_0_ring_emit_hdp_invalidate(struct amdgpu_ring *ring)
 }
 
 static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                     struct amdgpu_ib *ib,
+                                     unsigned vm_id, bool ctx_switch)
 {
-       bool need_ctx_switch = ring->current_ctx != ib->ctx;
        u32 header, control = 0;
        u32 next_rptr = ring->wptr + 5;
 
-       /* drop the CE preamble IB for the same context */
-       if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && !need_ctx_switch)
-               return;
-
-       if (need_ctx_switch)
+       if (ctx_switch)
                next_rptr += 2;
 
        next_rptr += 4;
@@ -4623,7 +5663,7 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        amdgpu_ring_write(ring, next_rptr);
 
        /* insert SWITCH_BUFFER packet before first IB in the ring frame */
-       if (need_ctx_switch) {
+       if (ctx_switch) {
                amdgpu_ring_write(ring, PACKET3(PACKET3_SWITCH_BUFFER, 0));
                amdgpu_ring_write(ring, 0);
        }
@@ -4633,7 +5673,7 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
        else
                header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw | (ib->vm_id << 24);
+       control |= ib->length_dw | (vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -4646,7 +5686,8 @@ static void gfx_v8_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
 }
 
 static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                         struct amdgpu_ib *ib,
+                                         unsigned vm_id, bool ctx_switch)
 {
        u32 header, control = 0;
        u32 next_rptr = ring->wptr + 5;
@@ -4662,7 +5703,7 @@ static void gfx_v8_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
 
        header = PACKET3(PACKET3_INDIRECT_BUFFER, 2);
 
-       control |= ib->length_dw | (ib->vm_id << 24);
+       control |= ib->length_dw | (vm_id << 24);
 
        amdgpu_ring_write(ring, header);
        amdgpu_ring_write(ring,
@@ -5022,6 +6063,7 @@ static int gfx_v8_0_priv_inst_irq(struct amdgpu_device *adev,
 }
 
 const struct amd_ip_funcs gfx_v8_0_ip_funcs = {
+       .name = "gfx_v8_0",
        .early_init = gfx_v8_0_early_init,
        .late_init = gfx_v8_0_late_init,
        .sw_init = gfx_v8_0_sw_init,
@@ -5033,7 +6075,6 @@ const struct amd_ip_funcs gfx_v8_0_ip_funcs = {
        .is_idle = gfx_v8_0_is_idle,
        .wait_for_idle = gfx_v8_0_wait_for_idle,
        .soft_reset = gfx_v8_0_soft_reset,
-       .print_status = gfx_v8_0_print_status,
        .set_clockgating_state = gfx_v8_0_set_clockgating_state,
        .set_powergating_state = gfx_v8_0_set_powergating_state,
 };
@@ -5112,6 +6153,22 @@ static void gfx_v8_0_set_irq_funcs(struct amdgpu_device *adev)
        adev->gfx.priv_inst_irq.funcs = &gfx_v8_0_priv_inst_irq_funcs;
 }
 
+static void gfx_v8_0_set_rlc_funcs(struct amdgpu_device *adev)
+{
+       switch (adev->asic_type) {
+       case CHIP_TOPAZ:
+       case CHIP_STONEY:
+               adev->gfx.rlc.funcs = &iceland_rlc_funcs;
+               break;
+       case CHIP_CARRIZO:
+               adev->gfx.rlc.funcs = &cz_rlc_funcs;
+               break;
+       default:
+               adev->gfx.rlc.funcs = &gfx_v8_0_nop_rlc_funcs;
+               break;
+       }
+}
+
 static void gfx_v8_0_set_gds_init(struct amdgpu_device *adev)
 {
        /* init asci gds info */
@@ -5155,14 +6212,11 @@ static u32 gfx_v8_0_get_cu_active_bitmap(struct amdgpu_device *adev)
        return (~data) & mask;
 }
 
-int gfx_v8_0_get_cu_info(struct amdgpu_device *adev,
-                        struct amdgpu_cu_info *cu_info)
+static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)
 {
        int i, j, k, counter, active_cu_number = 0;
        u32 mask, bitmap, ao_bitmap, ao_cu_mask = 0;
-
-       if (!adev || !cu_info)
-               return -EINVAL;
+       struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info;
 
        memset(cu_info, 0, sizeof(*cu_info));
 
@@ -5193,6 +6247,4 @@ int gfx_v8_0_get_cu_info(struct amdgpu_device *adev,
 
        cu_info->number = active_cu_number;
        cu_info->ao_cu_mask = ao_cu_mask;
-
-       return 0;
 }
index 021e05193cb9630e1783a9d45f7c4742832e071a..16a49f53a2fa2aecbf78296e87100dcd36426647 100644 (file)
@@ -28,6 +28,5 @@ extern const struct amd_ip_funcs gfx_v8_0_ip_funcs;
 
 uint64_t gfx_v8_0_get_gpu_clock_counter(struct amdgpu_device *adev);
 void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, u32 se_num, u32 sh_num);
-int gfx_v8_0_get_cu_info(struct amdgpu_device *adev, struct amdgpu_cu_info *cu_info);
 
 #endif
index a4a2e6cc61bb975a190036317f474a27651dc7ee..1feb6439cb0b7fd4768a232f5ad7520df0716c2a 100644 (file)
@@ -1117,114 +1117,6 @@ static int gmc_v7_0_wait_for_idle(void *handle)
 
 }
 
-static void gmc_v7_0_print_status(void *handle)
-{
-       int i, j;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "GMC 8.x registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS));
-       dev_info(adev->dev, "  MC_VM_MX_L1_TLB_CNTL=0x%08X\n",
-                RREG32(mmMC_VM_MX_L1_TLB_CNTL));
-       dev_info(adev->dev, "  VM_L2_CNTL=0x%08X\n",
-                RREG32(mmVM_L2_CNTL));
-       dev_info(adev->dev, "  VM_L2_CNTL2=0x%08X\n",
-                RREG32(mmVM_L2_CNTL2));
-       dev_info(adev->dev, "  VM_L2_CNTL3=0x%08X\n",
-                RREG32(mmVM_L2_CNTL3));
-       dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_START_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_END_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_CNTL2=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_CNTL2));
-       dev_info(adev->dev, "  VM_CONTEXT0_CNTL=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_CNTL));
-       dev_info(adev->dev, "  0x15D4=0x%08X\n",
-                RREG32(0x575));
-       dev_info(adev->dev, "  0x15D8=0x%08X\n",
-                RREG32(0x576));
-       dev_info(adev->dev, "  0x15DC=0x%08X\n",
-                RREG32(0x577));
-       dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_START_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PAGE_TABLE_START_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_END_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PAGE_TABLE_END_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_CNTL2=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_CNTL2));
-       dev_info(adev->dev, "  VM_CONTEXT1_CNTL=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_CNTL));
-       for (i = 0; i < 16; i++) {
-               if (i < 8)
-                       dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
-                                i, RREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i));
-               else
-                       dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
-                                i, RREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8));
-       }
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_LOW_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR));
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_HIGH_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR));
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR));
-       dev_info(adev->dev, "  MC_VM_FB_LOCATION=0x%08X\n",
-                RREG32(mmMC_VM_FB_LOCATION));
-       dev_info(adev->dev, "  MC_VM_AGP_BASE=0x%08X\n",
-                RREG32(mmMC_VM_AGP_BASE));
-       dev_info(adev->dev, "  MC_VM_AGP_TOP=0x%08X\n",
-                RREG32(mmMC_VM_AGP_TOP));
-       dev_info(adev->dev, "  MC_VM_AGP_BOT=0x%08X\n",
-                RREG32(mmMC_VM_AGP_BOT));
-
-       if (adev->asic_type == CHIP_KAVERI) {
-               dev_info(adev->dev, "  CHUB_CONTROL=0x%08X\n",
-                        RREG32(mmCHUB_CONTROL));
-       }
-
-       dev_info(adev->dev, "  HDP_REG_COHERENCY_FLUSH_CNTL=0x%08X\n",
-                RREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL));
-       dev_info(adev->dev, "  HDP_NONSURFACE_BASE=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_BASE));
-       dev_info(adev->dev, "  HDP_NONSURFACE_INFO=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_INFO));
-       dev_info(adev->dev, "  HDP_NONSURFACE_SIZE=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_SIZE));
-       dev_info(adev->dev, "  HDP_MISC_CNTL=0x%08X\n",
-                RREG32(mmHDP_MISC_CNTL));
-       dev_info(adev->dev, "  HDP_HOST_PATH_CNTL=0x%08X\n",
-                RREG32(mmHDP_HOST_PATH_CNTL));
-
-       for (i = 0, j = 0; i < 32; i++, j += 0x6) {
-               dev_info(adev->dev, "  %d:\n", i);
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb05 + j, RREG32(0xb05 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb06 + j, RREG32(0xb06 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb07 + j, RREG32(0xb07 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb08 + j, RREG32(0xb08 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb09 + j, RREG32(0xb09 + j));
-       }
-
-       dev_info(adev->dev, "  BIF_FB_EN=0x%08X\n",
-                RREG32(mmBIF_FB_EN));
-}
-
 static int gmc_v7_0_soft_reset(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -1244,8 +1136,6 @@ static int gmc_v7_0_soft_reset(void *handle)
        }
 
        if (srbm_soft_reset) {
-               gmc_v7_0_print_status((void *)adev);
-
                gmc_v7_0_mc_stop(adev, &save);
                if (gmc_v7_0_wait_for_idle(adev)) {
                        dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
@@ -1269,8 +1159,6 @@ static int gmc_v7_0_soft_reset(void *handle)
 
                gmc_v7_0_mc_resume(adev, &save);
                udelay(50);
-
-               gmc_v7_0_print_status((void *)adev);
        }
 
        return 0;
@@ -1373,6 +1261,7 @@ static int gmc_v7_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs gmc_v7_0_ip_funcs = {
+       .name = "gmc_v7_0",
        .early_init = gmc_v7_0_early_init,
        .late_init = gmc_v7_0_late_init,
        .sw_init = gmc_v7_0_sw_init,
@@ -1384,7 +1273,6 @@ const struct amd_ip_funcs gmc_v7_0_ip_funcs = {
        .is_idle = gmc_v7_0_is_idle,
        .wait_for_idle = gmc_v7_0_wait_for_idle,
        .soft_reset = gmc_v7_0_soft_reset,
-       .print_status = gmc_v7_0_print_status,
        .set_clockgating_state = gmc_v7_0_set_clockgating_state,
        .set_powergating_state = gmc_v7_0_set_powergating_state,
 };
index 7a9db2c72c894853478693da97576b9b8b9cebbc..9945d5bbf1fe06244bf950167f09589b266b2a23 100644 (file)
@@ -43,6 +43,8 @@ static void gmc_v8_0_set_gart_funcs(struct amdgpu_device *adev);
 static void gmc_v8_0_set_irq_funcs(struct amdgpu_device *adev);
 
 MODULE_FIRMWARE("amdgpu/tonga_mc.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_mc.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_mc.bin");
 
 static const u32 golden_settings_tonga_a11[] =
 {
@@ -73,6 +75,23 @@ static const u32 fiji_mgcg_cgcg_init[] =
        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
 };
 
+static const u32 golden_settings_polaris11_a11[] =
+{
+       mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff
+};
+
+static const u32 golden_settings_polaris10_a11[] =
+{
+       mmMC_ARB_WTM_GRPWT_RD, 0x00000003, 0x00000000,
+       mmVM_PRT_APERTURE0_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE1_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE2_LOW_ADDR, 0x0fffffff, 0x0fffffff,
+       mmVM_PRT_APERTURE3_LOW_ADDR, 0x0fffffff, 0x0fffffff
+};
+
 static const u32 cz_mgcg_cgcg_init[] =
 {
        mmMC_MEM_POWER_LS, 0xffffffff, 0x00000104
@@ -103,6 +122,16 @@ static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
                                                 golden_settings_tonga_a11,
                                                 (const u32)ARRAY_SIZE(golden_settings_tonga_a11));
                break;
+       case CHIP_POLARIS11:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris11_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris11_a11));
+               break;
+       case CHIP_POLARIS10:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris10_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris10_a11));
+               break;
        case CHIP_CARRIZO:
                amdgpu_program_register_sequence(adev,
                                                 cz_mgcg_cgcg_init,
@@ -209,6 +238,12 @@ static int gmc_v8_0_init_microcode(struct amdgpu_device *adev)
        case CHIP_TONGA:
                chip_name = "tonga";
                break;
+       case CHIP_POLARIS11:
+               chip_name = "polaris11";
+               break;
+       case CHIP_POLARIS10:
+               chip_name = "polaris10";
+               break;
        case CHIP_FIJI:
        case CHIP_CARRIZO:
        case CHIP_STONEY:
@@ -1085,111 +1120,6 @@ static int gmc_v8_0_wait_for_idle(void *handle)
 
 }
 
-static void gmc_v8_0_print_status(void *handle)
-{
-       int i, j;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "GMC 8.x registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_ADDR   0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_STATUS));
-       dev_info(adev->dev, "  MC_VM_MX_L1_TLB_CNTL=0x%08X\n",
-                RREG32(mmMC_VM_MX_L1_TLB_CNTL));
-       dev_info(adev->dev, "  VM_L2_CNTL=0x%08X\n",
-                RREG32(mmVM_L2_CNTL));
-       dev_info(adev->dev, "  VM_L2_CNTL2=0x%08X\n",
-                RREG32(mmVM_L2_CNTL2));
-       dev_info(adev->dev, "  VM_L2_CNTL3=0x%08X\n",
-                RREG32(mmVM_L2_CNTL3));
-       dev_info(adev->dev, "  VM_L2_CNTL4=0x%08X\n",
-                RREG32(mmVM_L2_CNTL4));
-       dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_START_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_PAGE_TABLE_END_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT0_CNTL2=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_CNTL2));
-       dev_info(adev->dev, "  VM_CONTEXT0_CNTL=0x%08X\n",
-                RREG32(mmVM_CONTEXT0_CNTL));
-       dev_info(adev->dev, "  VM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR=0x%08X\n",
-                RREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_LOW_ADDR));
-       dev_info(adev->dev, "  VM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR=0x%08X\n",
-                RREG32(mmVM_L2_CONTEXT1_IDENTITY_APERTURE_HIGH_ADDR));
-       dev_info(adev->dev, "  mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET=0x%08X\n",
-                RREG32(mmVM_L2_CONTEXT_IDENTITY_PHYSICAL_OFFSET));
-       dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_START_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PAGE_TABLE_START_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PAGE_TABLE_END_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PAGE_TABLE_END_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR));
-       dev_info(adev->dev, "  VM_CONTEXT1_CNTL2=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_CNTL2));
-       dev_info(adev->dev, "  VM_CONTEXT1_CNTL=0x%08X\n",
-                RREG32(mmVM_CONTEXT1_CNTL));
-       for (i = 0; i < 16; i++) {
-               if (i < 8)
-                       dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
-                                i, RREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR + i));
-               else
-                       dev_info(adev->dev, "  VM_CONTEXT%d_PAGE_TABLE_BASE_ADDR=0x%08X\n",
-                                i, RREG32(mmVM_CONTEXT8_PAGE_TABLE_BASE_ADDR + i - 8));
-       }
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_LOW_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR));
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_HIGH_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR));
-       dev_info(adev->dev, "  MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR=0x%08X\n",
-                RREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR));
-       dev_info(adev->dev, "  MC_VM_FB_LOCATION=0x%08X\n",
-                RREG32(mmMC_VM_FB_LOCATION));
-       dev_info(adev->dev, "  MC_VM_AGP_BASE=0x%08X\n",
-                RREG32(mmMC_VM_AGP_BASE));
-       dev_info(adev->dev, "  MC_VM_AGP_TOP=0x%08X\n",
-                RREG32(mmMC_VM_AGP_TOP));
-       dev_info(adev->dev, "  MC_VM_AGP_BOT=0x%08X\n",
-                RREG32(mmMC_VM_AGP_BOT));
-
-       dev_info(adev->dev, "  HDP_REG_COHERENCY_FLUSH_CNTL=0x%08X\n",
-                RREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL));
-       dev_info(adev->dev, "  HDP_NONSURFACE_BASE=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_BASE));
-       dev_info(adev->dev, "  HDP_NONSURFACE_INFO=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_INFO));
-       dev_info(adev->dev, "  HDP_NONSURFACE_SIZE=0x%08X\n",
-                RREG32(mmHDP_NONSURFACE_SIZE));
-       dev_info(adev->dev, "  HDP_MISC_CNTL=0x%08X\n",
-                RREG32(mmHDP_MISC_CNTL));
-       dev_info(adev->dev, "  HDP_HOST_PATH_CNTL=0x%08X\n",
-                RREG32(mmHDP_HOST_PATH_CNTL));
-
-       for (i = 0, j = 0; i < 32; i++, j += 0x6) {
-               dev_info(adev->dev, "  %d:\n", i);
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb05 + j, RREG32(0xb05 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb06 + j, RREG32(0xb06 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb07 + j, RREG32(0xb07 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb08 + j, RREG32(0xb08 + j));
-               dev_info(adev->dev, "  0x%04X=0x%08X\n",
-                        0xb09 + j, RREG32(0xb09 + j));
-       }
-
-       dev_info(adev->dev, "  BIF_FB_EN=0x%08X\n",
-                RREG32(mmBIF_FB_EN));
-}
-
 static int gmc_v8_0_soft_reset(void *handle)
 {
        struct amdgpu_mode_mc_save save;
@@ -1209,8 +1139,6 @@ static int gmc_v8_0_soft_reset(void *handle)
        }
 
        if (srbm_soft_reset) {
-               gmc_v8_0_print_status((void *)adev);
-
                gmc_v8_0_mc_stop(adev, &save);
                if (gmc_v8_0_wait_for_idle(adev)) {
                        dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
@@ -1234,8 +1162,6 @@ static int gmc_v8_0_soft_reset(void *handle)
 
                gmc_v8_0_mc_resume(adev, &save);
                udelay(50);
-
-               gmc_v8_0_print_status((void *)adev);
        }
 
        return 0;
@@ -1313,11 +1239,11 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
 }
 
 static void fiji_update_mc_medium_grain_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+                                                    bool enable)
 {
        uint32_t data;
 
-       if (enable) {
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_MGCG)) {
                data = RREG32(mmMC_HUB_MISC_HUB_CG);
                data |= MC_HUB_MISC_HUB_CG__ENABLE_MASK;
                WREG32(mmMC_HUB_MISC_HUB_CG, data);
@@ -1393,11 +1319,11 @@ static void fiji_update_mc_medium_grain_clock_gating(struct amdgpu_device *adev,
 }
 
 static void fiji_update_mc_light_sleep(struct amdgpu_device *adev,
-               bool enable)
+                                      bool enable)
 {
        uint32_t data;
 
-       if (enable) {
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_MC_LS)) {
                data = RREG32(mmMC_HUB_MISC_HUB_CG);
                data |= MC_HUB_MISC_HUB_CG__MEM_LS_ENABLE_MASK;
                WREG32(mmMC_HUB_MISC_HUB_CG, data);
@@ -1497,6 +1423,7 @@ static int gmc_v8_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs gmc_v8_0_ip_funcs = {
+       .name = "gmc_v8_0",
        .early_init = gmc_v8_0_early_init,
        .late_init = gmc_v8_0_late_init,
        .sw_init = gmc_v8_0_sw_init,
@@ -1508,7 +1435,6 @@ const struct amd_ip_funcs gmc_v8_0_ip_funcs = {
        .is_idle = gmc_v8_0_is_idle,
        .wait_for_idle = gmc_v8_0_wait_for_idle,
        .soft_reset = gmc_v8_0_soft_reset,
-       .print_status = gmc_v8_0_print_status,
        .set_clockgating_state = gmc_v8_0_set_clockgating_state,
        .set_powergating_state = gmc_v8_0_set_powergating_state,
 };
index 208d55f41c7f62b49c2cda0fed770d85cc16f10d..460bc8ad37e6252a910c068e5114bcc687350faf 100644 (file)
@@ -157,6 +157,7 @@ static int iceland_dpm_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs iceland_dpm_ip_funcs = {
+       .name = "iceland_dpm",
        .early_init = iceland_dpm_early_init,
        .late_init = NULL,
        .sw_init = iceland_dpm_sw_init,
@@ -168,7 +169,6 @@ const struct amd_ip_funcs iceland_dpm_ip_funcs = {
        .is_idle = NULL,
        .wait_for_idle = NULL,
        .soft_reset = NULL,
-       .print_status = NULL,
        .set_clockgating_state = iceland_dpm_set_clockgating_state,
        .set_powergating_state = iceland_dpm_set_powergating_state,
 };
index 679e7394a4955f490057cec3646f548b2d3f4950..39bfc52d0b42150fa085b0073bf8e7088ef3d00d 100644 (file)
@@ -351,35 +351,6 @@ static int iceland_ih_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void iceland_ih_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "ICELAND IH registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-       dev_info(adev->dev, "  INTERRUPT_CNTL=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL));
-       dev_info(adev->dev, "  INTERRUPT_CNTL2=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL2));
-       dev_info(adev->dev, "  IH_CNTL=0x%08X\n",
-                RREG32(mmIH_CNTL));
-       dev_info(adev->dev, "  IH_RB_CNTL=0x%08X\n",
-                RREG32(mmIH_RB_CNTL));
-       dev_info(adev->dev, "  IH_RB_BASE=0x%08X\n",
-                RREG32(mmIH_RB_BASE));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_LO=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_LO));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_HI));
-       dev_info(adev->dev, "  IH_RB_RPTR=0x%08X\n",
-                RREG32(mmIH_RB_RPTR));
-       dev_info(adev->dev, "  IH_RB_WPTR=0x%08X\n",
-                RREG32(mmIH_RB_WPTR));
-}
-
 static int iceland_ih_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -391,8 +362,6 @@ static int iceland_ih_soft_reset(void *handle)
                                                SOFT_RESET_IH, 1);
 
        if (srbm_soft_reset) {
-               iceland_ih_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -407,8 +376,6 @@ static int iceland_ih_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               iceland_ih_print_status((void *)adev);
        }
 
        return 0;
@@ -427,6 +394,7 @@ static int iceland_ih_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs iceland_ih_ip_funcs = {
+       .name = "iceland_ih",
        .early_init = iceland_ih_early_init,
        .late_init = NULL,
        .sw_init = iceland_ih_sw_init,
@@ -438,7 +406,6 @@ const struct amd_ip_funcs iceland_ih_ip_funcs = {
        .is_idle = iceland_ih_is_idle,
        .wait_for_idle = iceland_ih_wait_for_idle,
        .soft_reset = iceland_ih_soft_reset,
-       .print_status = iceland_ih_print_status,
        .set_clockgating_state = iceland_ih_set_clockgating_state,
        .set_powergating_state = iceland_ih_set_powergating_state,
 };
index 654d76723bc39d8004b461c7c51d401384d2ee20..b45f54714574431f925712c73c11e4e40aa24004 100644 (file)
@@ -135,11 +135,6 @@ static void sumo_take_smu_control(struct amdgpu_device *adev, bool enable)
 #endif
 }
 
-static u32 sumo_get_sleep_divider_from_id(u32 id)
-{
-       return 1 << id;
-}
-
 static void sumo_construct_sclk_voltage_mapping_table(struct amdgpu_device *adev,
                                                      struct sumo_sclk_voltage_mapping_table *sclk_voltage_mapping_table,
                                                      ATOM_AVAILABLE_SCLK_LIST *table)
@@ -2176,8 +2171,7 @@ static u8 kv_get_sleep_divider_id_from_clock(struct amdgpu_device *adev,
        struct kv_power_info *pi = kv_get_pi(adev);
        u32 i;
        u32 temp;
-       u32 min = (min_sclk_in_sr > KV_MINIMUM_ENGINE_CLOCK) ?
-               min_sclk_in_sr : KV_MINIMUM_ENGINE_CLOCK;
+       u32 min = max(min_sclk_in_sr, (u32)KV_MINIMUM_ENGINE_CLOCK);
 
        if (sclk < min)
                return 0;
@@ -2186,7 +2180,7 @@ static u8 kv_get_sleep_divider_id_from_clock(struct amdgpu_device *adev,
                return 0;
 
        for (i = KV_MAX_DEEPSLEEP_DIVIDER_ID; i > 0; i--) {
-               temp = sclk / sumo_get_sleep_divider_from_id(i);
+               temp = sclk >> i;
                if (temp >= min)
                        break;
        }
@@ -3147,62 +3141,6 @@ static int kv_dpm_wait_for_idle(void *handle)
        return 0;
 }
 
-static void kv_dpm_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "KV/KB DPM registers\n");
-       dev_info(adev->dev, "  DIDT_SQ_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_SQ_CTRL0));
-       dev_info(adev->dev, "  DIDT_DB_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_DB_CTRL0));
-       dev_info(adev->dev, "  DIDT_TD_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_TD_CTRL0));
-       dev_info(adev->dev, "  DIDT_TCP_CTRL0=0x%08X\n",
-                RREG32_DIDT(ixDIDT_TCP_CTRL0));
-       dev_info(adev->dev, "  LCAC_SX0_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_SX0_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_SX0_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_SX0_OVR_VAL));
-       dev_info(adev->dev, "  LCAC_MC0_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC0_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_MC0_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC0_OVR_VAL));
-       dev_info(adev->dev, "  LCAC_MC1_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC1_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_MC1_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC1_OVR_VAL));
-       dev_info(adev->dev, "  LCAC_MC2_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC2_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_MC2_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC2_OVR_VAL));
-       dev_info(adev->dev, "  LCAC_MC3_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC3_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_MC3_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_MC3_OVR_VAL));
-       dev_info(adev->dev, "  LCAC_CPL_OVR_SEL=0x%08X\n",
-                RREG32_SMC(ixLCAC_CPL_OVR_SEL));
-       dev_info(adev->dev, "  LCAC_CPL_OVR_VAL=0x%08X\n",
-                RREG32_SMC(ixLCAC_CPL_OVR_VAL));
-       dev_info(adev->dev, "  CG_FREQ_TRAN_VOTING_0=0x%08X\n",
-                RREG32_SMC(ixCG_FREQ_TRAN_VOTING_0));
-       dev_info(adev->dev, "  GENERAL_PWRMGT=0x%08X\n",
-                RREG32_SMC(ixGENERAL_PWRMGT));
-       dev_info(adev->dev, "  SCLK_PWRMGT_CNTL=0x%08X\n",
-                RREG32_SMC(ixSCLK_PWRMGT_CNTL));
-       dev_info(adev->dev, "  SMC_MESSAGE_0=0x%08X\n",
-                RREG32(mmSMC_MESSAGE_0));
-       dev_info(adev->dev, "  SMC_RESP_0=0x%08X\n",
-                RREG32(mmSMC_RESP_0));
-       dev_info(adev->dev, "  SMC_MSG_ARG_0=0x%08X\n",
-                RREG32(mmSMC_MSG_ARG_0));
-       dev_info(adev->dev, "  SMC_IND_INDEX_0=0x%08X\n",
-                RREG32(mmSMC_IND_INDEX_0));
-       dev_info(adev->dev, "  SMC_IND_DATA_0=0x%08X\n",
-                RREG32(mmSMC_IND_DATA_0));
-       dev_info(adev->dev, "  SMC_IND_ACCESS_CNTL=0x%08X\n",
-                RREG32(mmSMC_IND_ACCESS_CNTL));
-}
 
 static int kv_dpm_soft_reset(void *handle)
 {
@@ -3300,6 +3238,7 @@ static int kv_dpm_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs kv_dpm_ip_funcs = {
+       .name = "kv_dpm",
        .early_init = kv_dpm_early_init,
        .late_init = kv_dpm_late_init,
        .sw_init = kv_dpm_sw_init,
@@ -3311,7 +3250,6 @@ const struct amd_ip_funcs kv_dpm_ip_funcs = {
        .is_idle = kv_dpm_is_idle,
        .wait_for_idle = kv_dpm_wait_for_idle,
        .soft_reset = kv_dpm_soft_reset,
-       .print_status = kv_dpm_print_status,
        .set_clockgating_state = kv_dpm_set_clockgating_state,
        .set_powergating_state = kv_dpm_set_powergating_state,
 };
index 6e0a86a563f3e8d35e7bf907bdaaa845aca5d55c..f4c3130d3fdb20eee732b7c4e6e123ca008906a1 100644 (file)
@@ -242,9 +242,10 @@ static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
  * Schedule an IB in the DMA ring (VI).
  */
 static void sdma_v2_4_ring_emit_ib(struct amdgpu_ring *ring,
-                                  struct amdgpu_ib *ib)
+                                  struct amdgpu_ib *ib,
+                                  unsigned vm_id, bool ctx_switch)
 {
-       u32 vmid = ib->vm_id & 0xf;
+       u32 vmid = vm_id & 0xf;
        u32 next_rptr = ring->wptr + 5;
 
        while ((next_rptr & 7) != 2)
@@ -701,7 +702,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[7] = SDMA_PKT_HEADER_OP(SDMA_OP_NOP);
        ib.length_dw = 8;
 
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r)
                goto err1;
 
@@ -990,7 +991,7 @@ static int sdma_v2_4_sw_init(void *handle)
                ring->ring_obj = NULL;
                ring->use_doorbell = false;
                sprintf(ring->name, "sdma%d", i);
-               r = amdgpu_ring_init(adev, ring, 256 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
                                     &adev->sdma.trap_irq,
                                     (i == 0) ?
@@ -1080,55 +1081,6 @@ static int sdma_v2_4_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void sdma_v2_4_print_status(void *handle)
-{
-       int i, j;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "VI SDMA registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-                RREG32(mmSRBM_STATUS2));
-       for (i = 0; i < adev->sdma.num_instances; i++) {
-               dev_info(adev->dev, "  SDMA%d_STATUS_REG=0x%08X\n",
-                        i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_F32_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_SEM_WAIT_FAIL_TIMER_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_IB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_WPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_LO=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_LO + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_TILING_CONFIG=0x%08X\n",
-                        i, RREG32(mmSDMA0_TILING_CONFIG + sdma_offsets[i]));
-               mutex_lock(&adev->srbm_mutex);
-               for (j = 0; j < 16; j++) {
-                       vi_srbm_select(adev, 0, 0, 0, j);
-                       dev_info(adev->dev, "  VM %d:\n", j);
-                       dev_info(adev->dev, "  SDMA%d_GFX_VIRTUAL_ADDR=0x%08X\n",
-                                i, RREG32(mmSDMA0_GFX_VIRTUAL_ADDR + sdma_offsets[i]));
-                       dev_info(adev->dev, "  SDMA%d_GFX_APE1_CNTL=0x%08X\n",
-                                i, RREG32(mmSDMA0_GFX_APE1_CNTL + sdma_offsets[i]));
-               }
-               vi_srbm_select(adev, 0, 0, 0, 0);
-               mutex_unlock(&adev->srbm_mutex);
-       }
-}
-
 static int sdma_v2_4_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -1151,8 +1103,6 @@ static int sdma_v2_4_soft_reset(void *handle)
        }
 
        if (srbm_soft_reset) {
-               sdma_v2_4_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -1167,8 +1117,6 @@ static int sdma_v2_4_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               sdma_v2_4_print_status((void *)adev);
        }
 
        return 0;
@@ -1283,6 +1231,7 @@ static int sdma_v2_4_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs sdma_v2_4_ip_funcs = {
+       .name = "sdma_v2_4",
        .early_init = sdma_v2_4_early_init,
        .late_init = NULL,
        .sw_init = sdma_v2_4_sw_init,
@@ -1294,7 +1243,6 @@ const struct amd_ip_funcs sdma_v2_4_ip_funcs = {
        .is_idle = sdma_v2_4_is_idle,
        .wait_for_idle = sdma_v2_4_wait_for_idle,
        .soft_reset = sdma_v2_4_soft_reset,
-       .print_status = sdma_v2_4_print_status,
        .set_clockgating_state = sdma_v2_4_set_clockgating_state,
        .set_powergating_state = sdma_v2_4_set_powergating_state,
 };
index 8c8ca98dd1298af2a1e7b397eb8f9d964e4b81fe..063f08a9957a1e96ecb82316fe479abe38dfc082 100644 (file)
@@ -56,6 +56,11 @@ MODULE_FIRMWARE("amdgpu/carrizo_sdma1.bin");
 MODULE_FIRMWARE("amdgpu/fiji_sdma.bin");
 MODULE_FIRMWARE("amdgpu/fiji_sdma1.bin");
 MODULE_FIRMWARE("amdgpu/stoney_sdma.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_sdma.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_sdma1.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_sdma.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_sdma1.bin");
+
 
 static const u32 sdma_offsets[SDMA_MAX_INSTANCE] =
 {
@@ -101,6 +106,32 @@ static const u32 fiji_mgcg_cgcg_init[] =
        mmSDMA1_CLK_CTRL, 0xff000ff0, 0x00000100
 };
 
+static const u32 golden_settings_polaris11_a11[] =
+{
+       mmSDMA0_CHICKEN_BITS, 0xfc910007, 0x00810007,
+       mmSDMA0_GFX_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA0_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA0_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_CHICKEN_BITS, 0xfc910007, 0x00810007,
+       mmSDMA1_GFX_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
+};
+
+static const u32 golden_settings_polaris10_a11[] =
+{
+       mmSDMA0_CHICKEN_BITS, 0xfc910007, 0x00810007,
+       mmSDMA0_CLK_CTRL, 0xff000fff, 0x00000000,
+       mmSDMA0_GFX_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA0_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA0_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_CHICKEN_BITS, 0xfc910007, 0x00810007,
+       mmSDMA1_CLK_CTRL, 0xff000fff, 0x00000000,
+       mmSDMA1_GFX_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_RLC0_IB_CNTL, 0x800f0111, 0x00000100,
+       mmSDMA1_RLC1_IB_CNTL, 0x800f0111, 0x00000100,
+};
+
 static const u32 cz_golden_settings_a11[] =
 {
        mmSDMA0_CHICKEN_BITS, 0xfc910007, 0x00810007,
@@ -172,6 +203,16 @@ static void sdma_v3_0_init_golden_registers(struct amdgpu_device *adev)
                                                 golden_settings_tonga_a11,
                                                 (const u32)ARRAY_SIZE(golden_settings_tonga_a11));
                break;
+       case CHIP_POLARIS11:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris11_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris11_a11));
+               break;
+       case CHIP_POLARIS10:
+               amdgpu_program_register_sequence(adev,
+                                                golden_settings_polaris10_a11,
+                                                (const u32)ARRAY_SIZE(golden_settings_polaris10_a11));
+               break;
        case CHIP_CARRIZO:
                amdgpu_program_register_sequence(adev,
                                                 cz_mgcg_cgcg_init,
@@ -220,6 +261,12 @@ static int sdma_v3_0_init_microcode(struct amdgpu_device *adev)
        case CHIP_FIJI:
                chip_name = "fiji";
                break;
+       case CHIP_POLARIS11:
+               chip_name = "polaris11";
+               break;
+       case CHIP_POLARIS10:
+               chip_name = "polaris10";
+               break;
        case CHIP_CARRIZO:
                chip_name = "carrizo";
                break;
@@ -353,9 +400,10 @@ static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
  * Schedule an IB in the DMA ring (VI).
  */
 static void sdma_v3_0_ring_emit_ib(struct amdgpu_ring *ring,
-                                  struct amdgpu_ib *ib)
+                                  struct amdgpu_ib *ib,
+                                  unsigned vm_id, bool ctx_switch)
 {
-       u32 vmid = ib->vm_id & 0xf;
+       u32 vmid = vm_id & 0xf;
        u32 next_rptr = ring->wptr + 5;
 
        while ((next_rptr & 7) != 2)
@@ -452,6 +500,31 @@ static void sdma_v3_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 se
        amdgpu_ring_write(ring, SDMA_PKT_TRAP_INT_CONTEXT_INT_CONTEXT(0));
 }
 
+unsigned init_cond_exec(struct amdgpu_ring *ring)
+{
+       unsigned ret;
+       amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_COND_EXE));
+       amdgpu_ring_write(ring, lower_32_bits(ring->cond_exe_gpu_addr));
+       amdgpu_ring_write(ring, upper_32_bits(ring->cond_exe_gpu_addr));
+       amdgpu_ring_write(ring, 1);
+       ret = ring->wptr;/* this is the offset we need patch later */
+       amdgpu_ring_write(ring, 0x55aa55aa);/* insert dummy here and patch it later */
+       return ret;
+}
+
+void patch_cond_exec(struct amdgpu_ring *ring, unsigned offset)
+{
+       unsigned cur;
+       BUG_ON(ring->ring[offset] != 0x55aa55aa);
+
+       cur = ring->wptr - 1;
+       if (likely(cur > offset))
+               ring->ring[offset] = cur - offset;
+       else
+               ring->ring[offset] = (ring->ring_size>>2) - offset + cur;
+}
+
+
 /**
  * sdma_v3_0_gfx_stop - stop the gfx async dma engines
  *
@@ -853,7 +926,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
        ib.ptr[7] = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP);
        ib.length_dw = 8;
 
-       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, &f);
+       r = amdgpu_ib_schedule(ring, 1, &ib, NULL, NULL, &f);
        if (r)
                goto err1;
 
@@ -1151,7 +1224,7 @@ static int sdma_v3_0_sw_init(void *handle)
                        AMDGPU_DOORBELL_sDMA_ENGINE0 : AMDGPU_DOORBELL_sDMA_ENGINE1;
 
                sprintf(ring->name, "sdma%d", i);
-               r = amdgpu_ring_init(adev, ring, 256 * 1024,
+               r = amdgpu_ring_init(adev, ring, 1024,
                                     SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf,
                                     &adev->sdma.trap_irq,
                                     (i == 0) ?
@@ -1242,57 +1315,6 @@ static int sdma_v3_0_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void sdma_v3_0_print_status(void *handle)
-{
-       int i, j;
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "VI SDMA registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-                RREG32(mmSRBM_STATUS2));
-       for (i = 0; i < adev->sdma.num_instances; i++) {
-               dev_info(adev->dev, "  SDMA%d_STATUS_REG=0x%08X\n",
-                        i, RREG32(mmSDMA0_STATUS_REG + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_F32_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_F32_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_SEM_WAIT_FAIL_TIMER_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_IB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_CNTL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_WPTR=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_WPTR + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_RPTR_ADDR_LO=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_RPTR_ADDR_LO + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_RB_BASE_HI=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_RB_BASE_HI + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_GFX_DOORBELL=0x%08X\n",
-                        i, RREG32(mmSDMA0_GFX_DOORBELL + sdma_offsets[i]));
-               dev_info(adev->dev, "  SDMA%d_TILING_CONFIG=0x%08X\n",
-                        i, RREG32(mmSDMA0_TILING_CONFIG + sdma_offsets[i]));
-               mutex_lock(&adev->srbm_mutex);
-               for (j = 0; j < 16; j++) {
-                       vi_srbm_select(adev, 0, 0, 0, j);
-                       dev_info(adev->dev, "  VM %d:\n", j);
-                       dev_info(adev->dev, "  SDMA%d_GFX_VIRTUAL_ADDR=0x%08X\n",
-                                i, RREG32(mmSDMA0_GFX_VIRTUAL_ADDR + sdma_offsets[i]));
-                       dev_info(adev->dev, "  SDMA%d_GFX_APE1_CNTL=0x%08X\n",
-                                i, RREG32(mmSDMA0_GFX_APE1_CNTL + sdma_offsets[i]));
-               }
-               vi_srbm_select(adev, 0, 0, 0, 0);
-               mutex_unlock(&adev->srbm_mutex);
-       }
-}
-
 static int sdma_v3_0_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -1315,8 +1337,6 @@ static int sdma_v3_0_soft_reset(void *handle)
        }
 
        if (srbm_soft_reset) {
-               sdma_v3_0_print_status((void *)adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -1331,8 +1351,6 @@ static int sdma_v3_0_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               sdma_v3_0_print_status((void *)adev);
        }
 
        return 0;
@@ -1433,40 +1451,31 @@ static int sdma_v3_0_process_illegal_inst_irq(struct amdgpu_device *adev,
        return 0;
 }
 
-static void fiji_update_sdma_medium_grain_clock_gating(
+static void sdma_v3_0_update_sdma_medium_grain_clock_gating(
                struct amdgpu_device *adev,
                bool enable)
 {
        uint32_t temp, data;
+       int i;
 
-       if (enable) {
-               temp = data = RREG32(mmSDMA0_CLK_CTRL);
-               data &= ~(SDMA0_CLK_CTRL__SOFT_OVERRIDE7_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE6_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE5_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE4_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE3_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE2_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE1_MASK |
-                               SDMA0_CLK_CTRL__SOFT_OVERRIDE0_MASK);
-               if (data != temp)
-                       WREG32(mmSDMA0_CLK_CTRL, data);
-
-               temp = data = RREG32(mmSDMA1_CLK_CTRL);
-               data &= ~(SDMA1_CLK_CTRL__SOFT_OVERRIDE7_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE6_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE5_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE4_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE3_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE2_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE1_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE0_MASK);
-
-               if (data != temp)
-                       WREG32(mmSDMA1_CLK_CTRL, data);
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_MGCG)) {
+               for (i = 0; i < adev->sdma.num_instances; i++) {
+                       temp = data = RREG32(mmSDMA0_CLK_CTRL + sdma_offsets[i]);
+                       data &= ~(SDMA0_CLK_CTRL__SOFT_OVERRIDE7_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE6_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE5_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE4_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE3_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE2_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE1_MASK |
+                                 SDMA0_CLK_CTRL__SOFT_OVERRIDE0_MASK);
+                       if (data != temp)
+                               WREG32(mmSDMA0_CLK_CTRL + sdma_offsets[i], data);
+               }
        } else {
-               temp = data = RREG32(mmSDMA0_CLK_CTRL);
-               data |= SDMA0_CLK_CTRL__SOFT_OVERRIDE7_MASK |
+               for (i = 0; i < adev->sdma.num_instances; i++) {
+                       temp = data = RREG32(mmSDMA0_CLK_CTRL + sdma_offsets[i]);
+                       data |= SDMA0_CLK_CTRL__SOFT_OVERRIDE7_MASK |
                                SDMA0_CLK_CTRL__SOFT_OVERRIDE6_MASK |
                                SDMA0_CLK_CTRL__SOFT_OVERRIDE5_MASK |
                                SDMA0_CLK_CTRL__SOFT_OVERRIDE4_MASK |
@@ -1475,54 +1484,35 @@ static void fiji_update_sdma_medium_grain_clock_gating(
                                SDMA0_CLK_CTRL__SOFT_OVERRIDE1_MASK |
                                SDMA0_CLK_CTRL__SOFT_OVERRIDE0_MASK;
 
-               if (data != temp)
-                       WREG32(mmSDMA0_CLK_CTRL, data);
-
-               temp = data = RREG32(mmSDMA1_CLK_CTRL);
-               data |= SDMA1_CLK_CTRL__SOFT_OVERRIDE7_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE6_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE5_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE4_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE3_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE2_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE1_MASK |
-                               SDMA1_CLK_CTRL__SOFT_OVERRIDE0_MASK;
-
-               if (data != temp)
-                       WREG32(mmSDMA1_CLK_CTRL, data);
+                       if (data != temp)
+                               WREG32(mmSDMA0_CLK_CTRL + sdma_offsets[i], data);
+               }
        }
 }
 
-static void fiji_update_sdma_medium_grain_light_sleep(
+static void sdma_v3_0_update_sdma_medium_grain_light_sleep(
                struct amdgpu_device *adev,
                bool enable)
 {
        uint32_t temp, data;
+       int i;
 
-       if (enable) {
-               temp = data = RREG32(mmSDMA0_POWER_CNTL);
-               data |= SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
-
-               if (temp != data)
-                       WREG32(mmSDMA0_POWER_CNTL, data);
-
-               temp = data = RREG32(mmSDMA1_POWER_CNTL);
-               data |= SDMA1_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_SDMA_LS)) {
+               for (i = 0; i < adev->sdma.num_instances; i++) {
+                       temp = data = RREG32(mmSDMA0_POWER_CNTL + sdma_offsets[i]);
+                       data |= SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
 
-               if (temp != data)
-                       WREG32(mmSDMA1_POWER_CNTL, data);
+                       if (temp != data)
+                               WREG32(mmSDMA0_POWER_CNTL + sdma_offsets[i], data);
+               }
        } else {
-               temp = data = RREG32(mmSDMA0_POWER_CNTL);
-               data &= ~SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
-
-               if (temp != data)
-                       WREG32(mmSDMA0_POWER_CNTL, data);
-
-               temp = data = RREG32(mmSDMA1_POWER_CNTL);
-               data &= ~SDMA1_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
+               for (i = 0; i < adev->sdma.num_instances; i++) {
+                       temp = data = RREG32(mmSDMA0_POWER_CNTL + sdma_offsets[i]);
+                       data &= ~SDMA0_POWER_CNTL__MEM_POWER_OVERRIDE_MASK;
 
-               if (temp != data)
-                       WREG32(mmSDMA1_POWER_CNTL, data);
+                       if (temp != data)
+                               WREG32(mmSDMA0_POWER_CNTL + sdma_offsets[i], data);
+               }
        }
 }
 
@@ -1533,9 +1523,11 @@ static int sdma_v3_0_set_clockgating_state(void *handle,
 
        switch (adev->asic_type) {
        case CHIP_FIJI:
-               fiji_update_sdma_medium_grain_clock_gating(adev,
+       case CHIP_CARRIZO:
+       case CHIP_STONEY:
+               sdma_v3_0_update_sdma_medium_grain_clock_gating(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
-               fiji_update_sdma_medium_grain_light_sleep(adev,
+               sdma_v3_0_update_sdma_medium_grain_light_sleep(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
                break;
        default:
@@ -1551,6 +1543,7 @@ static int sdma_v3_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs sdma_v3_0_ip_funcs = {
+       .name = "sdma_v3_0",
        .early_init = sdma_v3_0_early_init,
        .late_init = NULL,
        .sw_init = sdma_v3_0_sw_init,
@@ -1562,7 +1555,6 @@ const struct amd_ip_funcs sdma_v3_0_ip_funcs = {
        .is_idle = sdma_v3_0_is_idle,
        .wait_for_idle = sdma_v3_0_wait_for_idle,
        .soft_reset = sdma_v3_0_soft_reset,
-       .print_status = sdma_v3_0_print_status,
        .set_clockgating_state = sdma_v3_0_set_clockgating_state,
        .set_powergating_state = sdma_v3_0_set_powergating_state,
 };
index c24a81eebc7cb10c99a6a3b9d7f577a1f9044724..880152c0f775e350e51e0b0ccb5d72ebcd45f806 100644 (file)
@@ -44,6 +44,7 @@
 #define UCODE_ID_IH_REG_RESTORE   11
 #define UCODE_ID_VBIOS            12
 #define UCODE_ID_MISC_METADATA    13
+#define UCODE_ID_SMU_SK                      14
 #define UCODE_ID_RLC_SCRATCH      32
 #define UCODE_ID_RLC_SRM_ARAM     33
 #define UCODE_ID_RLC_SRM_DRAM     34
index 0497784b36523086a029bb5a08cd977c9a9f6372..b7615cefcac40b5d2607a194b5184ed2fe3a9bcf 100644 (file)
@@ -143,6 +143,7 @@ static int tonga_dpm_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs tonga_dpm_ip_funcs = {
+       .name = "tonga_dpm",
        .early_init = tonga_dpm_early_init,
        .late_init = NULL,
        .sw_init = tonga_dpm_sw_init,
@@ -154,7 +155,6 @@ const struct amd_ip_funcs tonga_dpm_ip_funcs = {
        .is_idle = NULL,
        .wait_for_idle = NULL,
        .soft_reset = NULL,
-       .print_status = NULL,
        .set_clockgating_state = tonga_dpm_set_clockgating_state,
        .set_powergating_state = tonga_dpm_set_powergating_state,
 };
index 0f14199cf716e157aa5638b7adebc041958225ac..f036af937fbc950216418e3e62d3ec9787bd70d3 100644 (file)
@@ -374,35 +374,6 @@ static int tonga_ih_wait_for_idle(void *handle)
        return -ETIMEDOUT;
 }
 
-static void tonga_ih_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "TONGA IH registers\n");
-       dev_info(adev->dev, "  SRBM_STATUS=0x%08X\n",
-               RREG32(mmSRBM_STATUS));
-       dev_info(adev->dev, "  SRBM_STATUS2=0x%08X\n",
-               RREG32(mmSRBM_STATUS2));
-       dev_info(adev->dev, "  INTERRUPT_CNTL=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL));
-       dev_info(adev->dev, "  INTERRUPT_CNTL2=0x%08X\n",
-                RREG32(mmINTERRUPT_CNTL2));
-       dev_info(adev->dev, "  IH_CNTL=0x%08X\n",
-                RREG32(mmIH_CNTL));
-       dev_info(adev->dev, "  IH_RB_CNTL=0x%08X\n",
-                RREG32(mmIH_RB_CNTL));
-       dev_info(adev->dev, "  IH_RB_BASE=0x%08X\n",
-                RREG32(mmIH_RB_BASE));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_LO=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_LO));
-       dev_info(adev->dev, "  IH_RB_WPTR_ADDR_HI=0x%08X\n",
-                RREG32(mmIH_RB_WPTR_ADDR_HI));
-       dev_info(adev->dev, "  IH_RB_RPTR=0x%08X\n",
-                RREG32(mmIH_RB_RPTR));
-       dev_info(adev->dev, "  IH_RB_WPTR=0x%08X\n",
-                RREG32(mmIH_RB_WPTR));
-}
-
 static int tonga_ih_soft_reset(void *handle)
 {
        u32 srbm_soft_reset = 0;
@@ -414,8 +385,6 @@ static int tonga_ih_soft_reset(void *handle)
                                                SOFT_RESET_IH, 1);
 
        if (srbm_soft_reset) {
-               tonga_ih_print_status(adev);
-
                tmp = RREG32(mmSRBM_SOFT_RESET);
                tmp |= srbm_soft_reset;
                dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
@@ -430,8 +399,6 @@ static int tonga_ih_soft_reset(void *handle)
 
                /* Wait a little for things to settle down */
                udelay(50);
-
-               tonga_ih_print_status(adev);
        }
 
        return 0;
@@ -450,6 +417,7 @@ static int tonga_ih_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs tonga_ih_ip_funcs = {
+       .name = "tonga_ih",
        .early_init = tonga_ih_early_init,
        .late_init = NULL,
        .sw_init = tonga_ih_sw_init,
@@ -461,7 +429,6 @@ const struct amd_ip_funcs tonga_ih_ip_funcs = {
        .is_idle = tonga_ih_is_idle,
        .wait_for_idle = tonga_ih_wait_for_idle,
        .soft_reset = tonga_ih_soft_reset,
-       .print_status = tonga_ih_print_status,
        .set_clockgating_state = tonga_ih_set_clockgating_state,
        .set_powergating_state = tonga_ih_set_powergating_state,
 };
index cb463753115b8d4f8266464a9d69956be21a5750..f07551476a70db5ba2fd4b7c6c3eb3f87a2889b1 100644 (file)
@@ -114,7 +114,7 @@ static int uvd_v4_2_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
@@ -489,7 +489,8 @@ static int uvd_v4_2_ring_test_ring(struct amdgpu_ring *ring)
  * Write ring commands to execute the indirect buffer
  */
 static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                 struct amdgpu_ib *ib,
+                                 unsigned vm_id, bool ctx_switch)
 {
        amdgpu_ring_write(ring, PACKET0(mmUVD_RBC_IB_BASE, 0));
        amdgpu_ring_write(ring, ib->gpu_addr);
@@ -559,12 +560,13 @@ static void uvd_v4_2_mc_resume(struct amdgpu_device *adev)
        WREG32(mmUVD_VCPU_CACHE_SIZE0, size);
 
        addr += size;
-       size = AMDGPU_UVD_STACK_SIZE >> 3;
+       size = AMDGPU_UVD_HEAP_SIZE >> 3;
        WREG32(mmUVD_VCPU_CACHE_OFFSET1, addr);
        WREG32(mmUVD_VCPU_CACHE_SIZE1, size);
 
        addr += size;
-       size = AMDGPU_UVD_HEAP_SIZE >> 3;
+       size = (AMDGPU_UVD_STACK_SIZE +
+              (AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles)) >> 3;
        WREG32(mmUVD_VCPU_CACHE_OFFSET2, addr);
        WREG32(mmUVD_VCPU_CACHE_SIZE2, size);
 
@@ -679,117 +681,6 @@ static int uvd_v4_2_soft_reset(void *handle)
        return uvd_v4_2_start(adev);
 }
 
-static void uvd_v4_2_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-       dev_info(adev->dev, "UVD 4.2 registers\n");
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_LOW=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_LOW));
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_HIGH=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_HIGH));
-       dev_info(adev->dev, "  UVD_SEMA_CMD=0x%08X\n",
-                RREG32(mmUVD_SEMA_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_CMD=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA0=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA0));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA1=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA1));
-       dev_info(adev->dev, "  UVD_ENGINE_CNTL=0x%08X\n",
-                RREG32(mmUVD_ENGINE_CNTL));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_SEMA_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_CNTL));
-       dev_info(adev->dev, "  UVD_LMI_EXT40_ADDR=0x%08X\n",
-                RREG32(mmUVD_LMI_EXT40_ADDR));
-       dev_info(adev->dev, "  UVD_CTX_INDEX=0x%08X\n",
-                RREG32(mmUVD_CTX_INDEX));
-       dev_info(adev->dev, "  UVD_CTX_DATA=0x%08X\n",
-                RREG32(mmUVD_CTX_DATA));
-       dev_info(adev->dev, "  UVD_CGC_GATE=0x%08X\n",
-                RREG32(mmUVD_CGC_GATE));
-       dev_info(adev->dev, "  UVD_CGC_CTRL=0x%08X\n",
-                RREG32(mmUVD_CGC_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_CTRL2=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL2));
-       dev_info(adev->dev, "  UVD_MASTINT_EN=0x%08X\n",
-                RREG32(mmUVD_MASTINT_EN));
-       dev_info(adev->dev, "  UVD_LMI_ADDR_EXT=0x%08X\n",
-                RREG32(mmUVD_LMI_ADDR_EXT));
-       dev_info(adev->dev, "  UVD_LMI_CTRL=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_LMI_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MP_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_MP_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUX=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUX));
-       dev_info(adev->dev, "  UVD_MPC_SET_ALU=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_ALU));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET2));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE2));
-       dev_info(adev->dev, "  UVD_VCPU_CNTL=0x%08X\n",
-                RREG32(mmUVD_VCPU_CNTL));
-       dev_info(adev->dev, "  UVD_SOFT_RESET=0x%08X\n",
-                RREG32(mmUVD_SOFT_RESET));
-       dev_info(adev->dev, "  UVD_RBC_IB_BASE=0x%08X\n",
-                RREG32(mmUVD_RBC_IB_BASE));
-       dev_info(adev->dev, "  UVD_RBC_IB_SIZE=0x%08X\n",
-                RREG32(mmUVD_RBC_IB_SIZE));
-       dev_info(adev->dev, "  UVD_RBC_RB_BASE=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_BASE));
-       dev_info(adev->dev, "  UVD_RBC_RB_RPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_RPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR_CNTL));
-       dev_info(adev->dev, "  UVD_RBC_RB_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_CNTL));
-       dev_info(adev->dev, "  UVD_STATUS=0x%08X\n",
-                RREG32(mmUVD_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_TIMEOUT_STATUS=0x%08X\n",
-                RREG32(mmUVD_SEMA_TIMEOUT_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_CONTEXT_ID=0x%08X\n",
-                RREG32(mmUVD_CONTEXT_ID));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-
-}
-
 static int uvd_v4_2_set_interrupt_state(struct amdgpu_device *adev,
                                        struct amdgpu_irq_src *source,
                                        unsigned type,
@@ -849,6 +740,7 @@ static int uvd_v4_2_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs uvd_v4_2_ip_funcs = {
+       .name = "uvd_v4_2",
        .early_init = uvd_v4_2_early_init,
        .late_init = NULL,
        .sw_init = uvd_v4_2_sw_init,
@@ -860,7 +752,6 @@ const struct amd_ip_funcs uvd_v4_2_ip_funcs = {
        .is_idle = uvd_v4_2_is_idle,
        .wait_for_idle = uvd_v4_2_wait_for_idle,
        .soft_reset = uvd_v4_2_soft_reset,
-       .print_status = uvd_v4_2_print_status,
        .set_clockgating_state = uvd_v4_2_set_clockgating_state,
        .set_powergating_state = uvd_v4_2_set_powergating_state,
 };
index 16476d80f475a77c17ae4bb8a5f60aa05c4562c8..e0a76a883d46bab43513df7b3e1b5f9e3cda90dd 100644 (file)
@@ -31,6 +31,7 @@
 #include "uvd/uvd_5_0_sh_mask.h"
 #include "oss/oss_2_0_d.h"
 #include "oss/oss_2_0_sh_mask.h"
+#include "vi.h"
 
 static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev);
 static void uvd_v5_0_set_irq_funcs(struct amdgpu_device *adev);
@@ -110,7 +111,7 @@ static int uvd_v5_0_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
@@ -271,12 +272,13 @@ static void uvd_v5_0_mc_resume(struct amdgpu_device *adev)
        WREG32(mmUVD_VCPU_CACHE_SIZE0, size);
 
        offset += size;
-       size = AMDGPU_UVD_STACK_SIZE;
+       size = AMDGPU_UVD_HEAP_SIZE;
        WREG32(mmUVD_VCPU_CACHE_OFFSET1, offset >> 3);
        WREG32(mmUVD_VCPU_CACHE_SIZE1, size);
 
        offset += size;
-       size = AMDGPU_UVD_HEAP_SIZE;
+       size = AMDGPU_UVD_STACK_SIZE +
+              (AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles);
        WREG32(mmUVD_VCPU_CACHE_OFFSET2, offset >> 3);
        WREG32(mmUVD_VCPU_CACHE_SIZE2, size);
 
@@ -537,7 +539,8 @@ static int uvd_v5_0_ring_test_ring(struct amdgpu_ring *ring)
  * Write ring commands to execute the indirect buffer
  */
 static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                 struct amdgpu_ib *ib,
+                                 unsigned vm_id, bool ctx_switch)
 {
        amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0));
        amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
@@ -622,120 +625,6 @@ static int uvd_v5_0_soft_reset(void *handle)
        return uvd_v5_0_start(adev);
 }
 
-static void uvd_v5_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-       dev_info(adev->dev, "UVD 5.0 registers\n");
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_LOW=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_LOW));
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_HIGH=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_HIGH));
-       dev_info(adev->dev, "  UVD_SEMA_CMD=0x%08X\n",
-                RREG32(mmUVD_SEMA_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_CMD=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA0=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA0));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA1=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA1));
-       dev_info(adev->dev, "  UVD_ENGINE_CNTL=0x%08X\n",
-                RREG32(mmUVD_ENGINE_CNTL));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_SEMA_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_CNTL));
-       dev_info(adev->dev, "  UVD_LMI_EXT40_ADDR=0x%08X\n",
-                RREG32(mmUVD_LMI_EXT40_ADDR));
-       dev_info(adev->dev, "  UVD_CTX_INDEX=0x%08X\n",
-                RREG32(mmUVD_CTX_INDEX));
-       dev_info(adev->dev, "  UVD_CTX_DATA=0x%08X\n",
-                RREG32(mmUVD_CTX_DATA));
-       dev_info(adev->dev, "  UVD_CGC_GATE=0x%08X\n",
-                RREG32(mmUVD_CGC_GATE));
-       dev_info(adev->dev, "  UVD_CGC_CTRL=0x%08X\n",
-                RREG32(mmUVD_CGC_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_CTRL2=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL2));
-       dev_info(adev->dev, "  UVD_MASTINT_EN=0x%08X\n",
-                RREG32(mmUVD_MASTINT_EN));
-       dev_info(adev->dev, "  UVD_LMI_ADDR_EXT=0x%08X\n",
-                RREG32(mmUVD_LMI_ADDR_EXT));
-       dev_info(adev->dev, "  UVD_LMI_CTRL=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_LMI_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MP_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_MP_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUX=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUX));
-       dev_info(adev->dev, "  UVD_MPC_SET_ALU=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_ALU));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET2));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE2));
-       dev_info(adev->dev, "  UVD_VCPU_CNTL=0x%08X\n",
-                RREG32(mmUVD_VCPU_CNTL));
-       dev_info(adev->dev, "  UVD_SOFT_RESET=0x%08X\n",
-                RREG32(mmUVD_SOFT_RESET));
-       dev_info(adev->dev, "  UVD_LMI_RBC_IB_64BIT_BAR_LOW=0x%08X\n",
-                RREG32(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW));
-       dev_info(adev->dev, "  UVD_LMI_RBC_IB_64BIT_BAR_HIGH=0x%08X\n",
-                RREG32(mmUVD_LMI_RBC_IB_64BIT_BAR_HIGH));
-       dev_info(adev->dev, "  UVD_RBC_IB_SIZE=0x%08X\n",
-                RREG32(mmUVD_RBC_IB_SIZE));
-       dev_info(adev->dev, "  UVD_LMI_RBC_RB_64BIT_BAR_LOW=0x%08X\n",
-                RREG32(mmUVD_LMI_RBC_RB_64BIT_BAR_LOW));
-       dev_info(adev->dev, "  UVD_LMI_RBC_RB_64BIT_BAR_HIGH=0x%08X\n",
-                RREG32(mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH));
-       dev_info(adev->dev, "  UVD_RBC_RB_RPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_RPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR_CNTL));
-       dev_info(adev->dev, "  UVD_RBC_RB_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_CNTL));
-       dev_info(adev->dev, "  UVD_STATUS=0x%08X\n",
-                RREG32(mmUVD_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_TIMEOUT_STATUS=0x%08X\n",
-                RREG32(mmUVD_SEMA_TIMEOUT_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_CONTEXT_ID=0x%08X\n",
-                RREG32(mmUVD_CONTEXT_ID));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-}
-
 static int uvd_v5_0_set_interrupt_state(struct amdgpu_device *adev,
                                        struct amdgpu_irq_src *source,
                                        unsigned type,
@@ -754,14 +643,128 @@ static int uvd_v5_0_process_interrupt(struct amdgpu_device *adev,
        return 0;
 }
 
+static void uvd_v5_0_set_sw_clock_gating(struct amdgpu_device *adev)
+{
+       uint32_t data, data1, data2, suvd_flags;
+
+       data = RREG32(mmUVD_CGC_CTRL);
+       data1 = RREG32(mmUVD_SUVD_CGC_GATE);
+       data2 = RREG32(mmUVD_SUVD_CGC_CTRL);
+
+       data &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK |
+                 UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
+
+       suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
+                    UVD_SUVD_CGC_GATE__SIT_MASK |
+                    UVD_SUVD_CGC_GATE__SMP_MASK |
+                    UVD_SUVD_CGC_GATE__SCM_MASK |
+                    UVD_SUVD_CGC_GATE__SDB_MASK;
+
+       data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
+               (1 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_GATE_DLY_TIMER)) |
+               (4 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_OFF_DELAY));
+
+       data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
+                       UVD_CGC_CTRL__SYS_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_MODE_MASK |
+                       UVD_CGC_CTRL__MPEG2_MODE_MASK |
+                       UVD_CGC_CTRL__REGS_MODE_MASK |
+                       UVD_CGC_CTRL__RBC_MODE_MASK |
+                       UVD_CGC_CTRL__LMI_MC_MODE_MASK |
+                       UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
+                       UVD_CGC_CTRL__IDCT_MODE_MASK |
+                       UVD_CGC_CTRL__MPRD_MODE_MASK |
+                       UVD_CGC_CTRL__MPC_MODE_MASK |
+                       UVD_CGC_CTRL__LBSI_MODE_MASK |
+                       UVD_CGC_CTRL__LRBBM_MODE_MASK |
+                       UVD_CGC_CTRL__WCB_MODE_MASK |
+                       UVD_CGC_CTRL__VCPU_MODE_MASK |
+                       UVD_CGC_CTRL__JPEG_MODE_MASK |
+                       UVD_CGC_CTRL__SCPU_MODE_MASK);
+       data2 &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SDB_MODE_MASK);
+       data1 |= suvd_flags;
+
+       WREG32(mmUVD_CGC_CTRL, data);
+       WREG32(mmUVD_CGC_GATE, 0);
+       WREG32(mmUVD_SUVD_CGC_GATE, data1);
+       WREG32(mmUVD_SUVD_CGC_CTRL, data2);
+}
+
+#if 0
+static void uvd_v5_0_set_hw_clock_gating(struct amdgpu_device *adev)
+{
+       uint32_t data, data1, cgc_flags, suvd_flags;
+
+       data = RREG32(mmUVD_CGC_GATE);
+       data1 = RREG32(mmUVD_SUVD_CGC_GATE);
+
+       cgc_flags = UVD_CGC_GATE__SYS_MASK |
+                               UVD_CGC_GATE__UDEC_MASK |
+                               UVD_CGC_GATE__MPEG2_MASK |
+                               UVD_CGC_GATE__RBC_MASK |
+                               UVD_CGC_GATE__LMI_MC_MASK |
+                               UVD_CGC_GATE__IDCT_MASK |
+                               UVD_CGC_GATE__MPRD_MASK |
+                               UVD_CGC_GATE__MPC_MASK |
+                               UVD_CGC_GATE__LBSI_MASK |
+                               UVD_CGC_GATE__LRBBM_MASK |
+                               UVD_CGC_GATE__UDEC_RE_MASK |
+                               UVD_CGC_GATE__UDEC_CM_MASK |
+                               UVD_CGC_GATE__UDEC_IT_MASK |
+                               UVD_CGC_GATE__UDEC_DB_MASK |
+                               UVD_CGC_GATE__UDEC_MP_MASK |
+                               UVD_CGC_GATE__WCB_MASK |
+                               UVD_CGC_GATE__VCPU_MASK |
+                               UVD_CGC_GATE__SCPU_MASK;
+
+       suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
+                               UVD_SUVD_CGC_GATE__SIT_MASK |
+                               UVD_SUVD_CGC_GATE__SMP_MASK |
+                               UVD_SUVD_CGC_GATE__SCM_MASK |
+                               UVD_SUVD_CGC_GATE__SDB_MASK;
+
+       data |= cgc_flags;
+       data1 |= suvd_flags;
+
+       WREG32(mmUVD_CGC_GATE, data);
+       WREG32(mmUVD_SUVD_CGC_GATE, data1);
+}
+#endif
+
 static int uvd_v5_0_set_clockgating_state(void *handle,
                                          enum amd_clockgating_state state)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+       bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
+       static int curstate = -1;
 
        if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))
                return 0;
 
+       if (curstate == state)
+               return 0;
+
+       curstate = state;
+       if (enable) {
+               /* disable HW gating and enable Sw gating */
+               uvd_v5_0_set_sw_clock_gating(adev);
+       } else {
+               /* wait for STATUS to clear */
+               if (uvd_v5_0_wait_for_idle(handle))
+                       return -EBUSY;
+
+               /* enable HW gates because UVD is idle */
+/*             uvd_v5_0_set_hw_clock_gating(adev); */
+       }
+
        return 0;
 }
 
@@ -789,6 +792,7 @@ static int uvd_v5_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs uvd_v5_0_ip_funcs = {
+       .name = "uvd_v5_0",
        .early_init = uvd_v5_0_early_init,
        .late_init = NULL,
        .sw_init = uvd_v5_0_sw_init,
@@ -800,7 +804,6 @@ const struct amd_ip_funcs uvd_v5_0_ip_funcs = {
        .is_idle = uvd_v5_0_is_idle,
        .wait_for_idle = uvd_v5_0_wait_for_idle,
        .soft_reset = uvd_v5_0_soft_reset,
-       .print_status = uvd_v5_0_print_status,
        .set_clockgating_state = uvd_v5_0_set_clockgating_state,
        .set_powergating_state = uvd_v5_0_set_powergating_state,
 };
index d49379145ef22e8468866a1b60bb17d40ebb5e70..c9929d665c015195837cf1dc587b4e8c5ee371ba 100644 (file)
 #include "uvd/uvd_6_0_sh_mask.h"
 #include "oss/oss_2_0_d.h"
 #include "oss/oss_2_0_sh_mask.h"
+#include "smu/smu_7_1_3_d.h"
+#include "smu/smu_7_1_3_sh_mask.h"
+#include "vi.h"
 
 static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev);
 static void uvd_v6_0_set_irq_funcs(struct amdgpu_device *adev);
 static int uvd_v6_0_start(struct amdgpu_device *adev);
 static void uvd_v6_0_stop(struct amdgpu_device *adev);
+static void uvd_v6_0_set_sw_clock_gating(struct amdgpu_device *adev);
 
 /**
  * uvd_v6_0_ring_get_rptr - get read pointer
@@ -110,7 +114,7 @@ static int uvd_v6_0_sw_init(void *handle)
 
        ring = &adev->uvd.ring;
        sprintf(ring->name, "uvd");
-       r = amdgpu_ring_init(adev, ring, 4096, CP_PACKET2, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, CP_PACKET2, 0xf,
                             &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD);
 
        return r;
@@ -270,20 +274,24 @@ static void uvd_v6_0_mc_resume(struct amdgpu_device *adev)
        WREG32(mmUVD_VCPU_CACHE_SIZE0, size);
 
        offset += size;
-       size = AMDGPU_UVD_STACK_SIZE;
+       size = AMDGPU_UVD_HEAP_SIZE;
        WREG32(mmUVD_VCPU_CACHE_OFFSET1, offset >> 3);
        WREG32(mmUVD_VCPU_CACHE_SIZE1, size);
 
        offset += size;
-       size = AMDGPU_UVD_HEAP_SIZE;
+       size = AMDGPU_UVD_STACK_SIZE +
+              (AMDGPU_UVD_SESSION_SIZE * adev->uvd.max_handles);
        WREG32(mmUVD_VCPU_CACHE_OFFSET2, offset >> 3);
        WREG32(mmUVD_VCPU_CACHE_SIZE2, size);
 
        WREG32(mmUVD_UDEC_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
        WREG32(mmUVD_UDEC_DB_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
        WREG32(mmUVD_UDEC_DBW_ADDR_CONFIG, adev->gfx.config.gb_addr_config);
+
+       WREG32(mmUVD_GP_SCRATCH4, adev->uvd.max_handles);
 }
 
+#if 0
 static void cz_set_uvd_clock_gating_branches(struct amdgpu_device *adev,
                bool enable)
 {
@@ -360,157 +368,7 @@ static void cz_set_uvd_clock_gating_branches(struct amdgpu_device *adev,
        WREG32(mmUVD_CGC_GATE, data);
        WREG32(mmUVD_SUVD_CGC_GATE, data1);
 }
-
-static void tonga_set_uvd_clock_gating_branches(struct amdgpu_device *adev,
-               bool enable)
-{
-       u32 data, data1;
-
-       data = RREG32(mmUVD_CGC_GATE);
-       data1 = RREG32(mmUVD_SUVD_CGC_GATE);
-       if (enable) {
-               data |= UVD_CGC_GATE__SYS_MASK |
-                               UVD_CGC_GATE__UDEC_MASK |
-                               UVD_CGC_GATE__MPEG2_MASK |
-                               UVD_CGC_GATE__RBC_MASK |
-                               UVD_CGC_GATE__LMI_MC_MASK |
-                               UVD_CGC_GATE__IDCT_MASK |
-                               UVD_CGC_GATE__MPRD_MASK |
-                               UVD_CGC_GATE__MPC_MASK |
-                               UVD_CGC_GATE__LBSI_MASK |
-                               UVD_CGC_GATE__LRBBM_MASK |
-                               UVD_CGC_GATE__UDEC_RE_MASK |
-                               UVD_CGC_GATE__UDEC_CM_MASK |
-                               UVD_CGC_GATE__UDEC_IT_MASK |
-                               UVD_CGC_GATE__UDEC_DB_MASK |
-                               UVD_CGC_GATE__UDEC_MP_MASK |
-                               UVD_CGC_GATE__WCB_MASK |
-                               UVD_CGC_GATE__VCPU_MASK |
-                               UVD_CGC_GATE__SCPU_MASK;
-               data1 |= UVD_SUVD_CGC_GATE__SRE_MASK |
-                               UVD_SUVD_CGC_GATE__SIT_MASK |
-                               UVD_SUVD_CGC_GATE__SMP_MASK |
-                               UVD_SUVD_CGC_GATE__SCM_MASK |
-                               UVD_SUVD_CGC_GATE__SDB_MASK;
-       } else {
-               data &= ~(UVD_CGC_GATE__SYS_MASK |
-                               UVD_CGC_GATE__UDEC_MASK |
-                               UVD_CGC_GATE__MPEG2_MASK |
-                               UVD_CGC_GATE__RBC_MASK |
-                               UVD_CGC_GATE__LMI_MC_MASK |
-                               UVD_CGC_GATE__LMI_UMC_MASK |
-                               UVD_CGC_GATE__IDCT_MASK |
-                               UVD_CGC_GATE__MPRD_MASK |
-                               UVD_CGC_GATE__MPC_MASK |
-                               UVD_CGC_GATE__LBSI_MASK |
-                               UVD_CGC_GATE__LRBBM_MASK |
-                               UVD_CGC_GATE__UDEC_RE_MASK |
-                               UVD_CGC_GATE__UDEC_CM_MASK |
-                               UVD_CGC_GATE__UDEC_IT_MASK |
-                               UVD_CGC_GATE__UDEC_DB_MASK |
-                               UVD_CGC_GATE__UDEC_MP_MASK |
-                               UVD_CGC_GATE__WCB_MASK |
-                               UVD_CGC_GATE__VCPU_MASK |
-                               UVD_CGC_GATE__SCPU_MASK);
-               data1 &= ~(UVD_SUVD_CGC_GATE__SRE_MASK |
-                               UVD_SUVD_CGC_GATE__SIT_MASK |
-                               UVD_SUVD_CGC_GATE__SMP_MASK |
-                               UVD_SUVD_CGC_GATE__SCM_MASK |
-                               UVD_SUVD_CGC_GATE__SDB_MASK);
-       }
-       WREG32(mmUVD_CGC_GATE, data);
-       WREG32(mmUVD_SUVD_CGC_GATE, data1);
-}
-
-static void uvd_v6_0_set_uvd_dynamic_clock_mode(struct amdgpu_device *adev,
-               bool swmode)
-{
-       u32 data, data1 = 0, data2;
-
-       /* Always un-gate UVD REGS bit */
-       data = RREG32(mmUVD_CGC_GATE);
-       data &= ~(UVD_CGC_GATE__REGS_MASK);
-       WREG32(mmUVD_CGC_GATE, data);
-
-       data = RREG32(mmUVD_CGC_CTRL);
-       data &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK |
-                       UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
-       data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
-                       1 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_GATE_DLY_TIMER) |
-                       4 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_OFF_DELAY);
-
-       data2 = RREG32(mmUVD_SUVD_CGC_CTRL);
-       if (swmode) {
-               data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
-                               UVD_CGC_CTRL__SYS_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_MODE_MASK |
-                               UVD_CGC_CTRL__MPEG2_MODE_MASK |
-                               UVD_CGC_CTRL__REGS_MODE_MASK |
-                               UVD_CGC_CTRL__RBC_MODE_MASK |
-                               UVD_CGC_CTRL__LMI_MC_MODE_MASK |
-                               UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
-                               UVD_CGC_CTRL__IDCT_MODE_MASK |
-                               UVD_CGC_CTRL__MPRD_MODE_MASK |
-                               UVD_CGC_CTRL__MPC_MODE_MASK |
-                               UVD_CGC_CTRL__LBSI_MODE_MASK |
-                               UVD_CGC_CTRL__LRBBM_MODE_MASK |
-                               UVD_CGC_CTRL__WCB_MODE_MASK |
-                               UVD_CGC_CTRL__VCPU_MODE_MASK |
-                               UVD_CGC_CTRL__JPEG_MODE_MASK |
-                               UVD_CGC_CTRL__SCPU_MODE_MASK);
-               data1 |= UVD_CGC_CTRL2__DYN_OCLK_RAMP_EN_MASK |
-                               UVD_CGC_CTRL2__DYN_RCLK_RAMP_EN_MASK;
-               data1 &= ~UVD_CGC_CTRL2__GATER_DIV_ID_MASK;
-               data1 |= 7 << REG_FIELD_SHIFT(UVD_CGC_CTRL2, GATER_DIV_ID);
-               data2 &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SDB_MODE_MASK);
-       } else {
-               data |= UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
-                               UVD_CGC_CTRL__SYS_MODE_MASK |
-                               UVD_CGC_CTRL__UDEC_MODE_MASK |
-                               UVD_CGC_CTRL__MPEG2_MODE_MASK |
-                               UVD_CGC_CTRL__REGS_MODE_MASK |
-                               UVD_CGC_CTRL__RBC_MODE_MASK |
-                               UVD_CGC_CTRL__LMI_MC_MODE_MASK |
-                               UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
-                               UVD_CGC_CTRL__IDCT_MODE_MASK |
-                               UVD_CGC_CTRL__MPRD_MODE_MASK |
-                               UVD_CGC_CTRL__MPC_MODE_MASK |
-                               UVD_CGC_CTRL__LBSI_MODE_MASK |
-                               UVD_CGC_CTRL__LRBBM_MODE_MASK |
-                               UVD_CGC_CTRL__WCB_MODE_MASK |
-                               UVD_CGC_CTRL__VCPU_MODE_MASK |
-                               UVD_CGC_CTRL__SCPU_MODE_MASK;
-               data2 |= UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
-                               UVD_SUVD_CGC_CTRL__SDB_MODE_MASK;
-       }
-       WREG32(mmUVD_CGC_CTRL, data);
-       WREG32(mmUVD_SUVD_CGC_CTRL, data2);
-
-       data = RREG32_UVD_CTX(ixUVD_CGC_CTRL2);
-       data &= ~(REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_OCLK_RAMP_EN) |
-                       REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_RCLK_RAMP_EN) |
-                       REG_FIELD_MASK(UVD_CGC_CTRL2, GATER_DIV_ID));
-       data1 &= (REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_OCLK_RAMP_EN) |
-                       REG_FIELD_MASK(UVD_CGC_CTRL2, DYN_RCLK_RAMP_EN) |
-                       REG_FIELD_MASK(UVD_CGC_CTRL2, GATER_DIV_ID));
-       data |= data1;
-       WREG32_UVD_CTX(ixUVD_CGC_CTRL2, data);
-}
+#endif
 
 /**
  * uvd_v6_0_start - start UVD block
@@ -538,11 +396,7 @@ static int uvd_v6_0_start(struct amdgpu_device *adev)
 
        /* Set dynamic clock gating in S/W control mode */
        if (adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG) {
-               if (adev->flags & AMD_IS_APU)
-                       cz_set_uvd_clock_gating_branches(adev, false);
-               else
-                       tonga_set_uvd_clock_gating_branches(adev, false);
-               uvd_v6_0_set_uvd_dynamic_clock_mode(adev, true);
+               uvd_v6_0_set_sw_clock_gating(adev);
        } else {
                /* disable clock gating */
                uint32_t data = RREG32(mmUVD_CGC_CTRL);
@@ -777,7 +631,8 @@ static int uvd_v6_0_ring_test_ring(struct amdgpu_ring *ring)
  * Write ring commands to execute the indirect buffer
  */
 static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
-                                 struct amdgpu_ib *ib)
+                                 struct amdgpu_ib *ib,
+                                 unsigned vm_id, bool ctx_switch)
 {
        amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_64BIT_BAR_LOW, 0));
        amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
@@ -854,112 +709,6 @@ static int uvd_v6_0_soft_reset(void *handle)
        return uvd_v6_0_start(adev);
 }
 
-static void uvd_v6_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-       dev_info(adev->dev, "UVD 6.0 registers\n");
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_LOW=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_LOW));
-       dev_info(adev->dev, "  UVD_SEMA_ADDR_HIGH=0x%08X\n",
-                RREG32(mmUVD_SEMA_ADDR_HIGH));
-       dev_info(adev->dev, "  UVD_SEMA_CMD=0x%08X\n",
-                RREG32(mmUVD_SEMA_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_CMD=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_CMD));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA0=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA0));
-       dev_info(adev->dev, "  UVD_GPCOM_VCPU_DATA1=0x%08X\n",
-                RREG32(mmUVD_GPCOM_VCPU_DATA1));
-       dev_info(adev->dev, "  UVD_ENGINE_CNTL=0x%08X\n",
-                RREG32(mmUVD_ENGINE_CNTL));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_SEMA_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_CNTL));
-       dev_info(adev->dev, "  UVD_LMI_EXT40_ADDR=0x%08X\n",
-                RREG32(mmUVD_LMI_EXT40_ADDR));
-       dev_info(adev->dev, "  UVD_CTX_INDEX=0x%08X\n",
-                RREG32(mmUVD_CTX_INDEX));
-       dev_info(adev->dev, "  UVD_CTX_DATA=0x%08X\n",
-                RREG32(mmUVD_CTX_DATA));
-       dev_info(adev->dev, "  UVD_CGC_GATE=0x%08X\n",
-                RREG32(mmUVD_CGC_GATE));
-       dev_info(adev->dev, "  UVD_CGC_CTRL=0x%08X\n",
-                RREG32(mmUVD_CGC_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_CTRL2=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL2));
-       dev_info(adev->dev, "  UVD_MASTINT_EN=0x%08X\n",
-                RREG32(mmUVD_MASTINT_EN));
-       dev_info(adev->dev, "  UVD_LMI_ADDR_EXT=0x%08X\n",
-                RREG32(mmUVD_LMI_ADDR_EXT));
-       dev_info(adev->dev, "  UVD_LMI_CTRL=0x%08X\n",
-                RREG32(mmUVD_LMI_CTRL));
-       dev_info(adev->dev, "  UVD_LMI_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_LMI_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MP_SWAP_CNTL=0x%08X\n",
-                RREG32(mmUVD_MP_SWAP_CNTL));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXA1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXA1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB0=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB0));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUXB1=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUXB1));
-       dev_info(adev->dev, "  UVD_MPC_SET_MUX=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_MUX));
-       dev_info(adev->dev, "  UVD_MPC_SET_ALU=0x%08X\n",
-                RREG32(mmUVD_MPC_SET_ALU));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE0=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE0));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE1=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE1));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_OFFSET2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_OFFSET2));
-       dev_info(adev->dev, "  UVD_VCPU_CACHE_SIZE2=0x%08X\n",
-                RREG32(mmUVD_VCPU_CACHE_SIZE2));
-       dev_info(adev->dev, "  UVD_VCPU_CNTL=0x%08X\n",
-                RREG32(mmUVD_VCPU_CNTL));
-       dev_info(adev->dev, "  UVD_SOFT_RESET=0x%08X\n",
-                RREG32(mmUVD_SOFT_RESET));
-       dev_info(adev->dev, "  UVD_RBC_IB_SIZE=0x%08X\n",
-                RREG32(mmUVD_RBC_IB_SIZE));
-       dev_info(adev->dev, "  UVD_RBC_RB_RPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_RPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR));
-       dev_info(adev->dev, "  UVD_RBC_RB_WPTR_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_WPTR_CNTL));
-       dev_info(adev->dev, "  UVD_RBC_RB_CNTL=0x%08X\n",
-                RREG32(mmUVD_RBC_RB_CNTL));
-       dev_info(adev->dev, "  UVD_STATUS=0x%08X\n",
-                RREG32(mmUVD_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_TIMEOUT_STATUS=0x%08X\n",
-                RREG32(mmUVD_SEMA_TIMEOUT_STATUS));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL=0x%08X\n",
-                RREG32(mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL));
-       dev_info(adev->dev, "  UVD_CONTEXT_ID=0x%08X\n",
-                RREG32(mmUVD_CONTEXT_ID));
-       dev_info(adev->dev, "  UVD_UDEC_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DB_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DB_ADDR_CONFIG));
-       dev_info(adev->dev, "  UVD_UDEC_DBW_ADDR_CONFIG=0x%08X\n",
-                RREG32(mmUVD_UDEC_DBW_ADDR_CONFIG));
-}
-
 static int uvd_v6_0_set_interrupt_state(struct amdgpu_device *adev,
                                        struct amdgpu_irq_src *source,
                                        unsigned type,
@@ -978,25 +727,146 @@ static int uvd_v6_0_process_interrupt(struct amdgpu_device *adev,
        return 0;
 }
 
+static void uvd_v6_0_set_sw_clock_gating(struct amdgpu_device *adev)
+{
+       uint32_t data, data1, data2, suvd_flags;
+
+       data = RREG32(mmUVD_CGC_CTRL);
+       data1 = RREG32(mmUVD_SUVD_CGC_GATE);
+       data2 = RREG32(mmUVD_SUVD_CGC_CTRL);
+
+       data &= ~(UVD_CGC_CTRL__CLK_OFF_DELAY_MASK |
+                 UVD_CGC_CTRL__CLK_GATE_DLY_TIMER_MASK);
+
+       suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
+                    UVD_SUVD_CGC_GATE__SIT_MASK |
+                    UVD_SUVD_CGC_GATE__SMP_MASK |
+                    UVD_SUVD_CGC_GATE__SCM_MASK |
+                    UVD_SUVD_CGC_GATE__SDB_MASK;
+
+       data |= UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK |
+               (1 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_GATE_DLY_TIMER)) |
+               (4 << REG_FIELD_SHIFT(UVD_CGC_CTRL, CLK_OFF_DELAY));
+
+       data &= ~(UVD_CGC_CTRL__UDEC_RE_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_CM_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_IT_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_DB_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_MP_MODE_MASK |
+                       UVD_CGC_CTRL__SYS_MODE_MASK |
+                       UVD_CGC_CTRL__UDEC_MODE_MASK |
+                       UVD_CGC_CTRL__MPEG2_MODE_MASK |
+                       UVD_CGC_CTRL__REGS_MODE_MASK |
+                       UVD_CGC_CTRL__RBC_MODE_MASK |
+                       UVD_CGC_CTRL__LMI_MC_MODE_MASK |
+                       UVD_CGC_CTRL__LMI_UMC_MODE_MASK |
+                       UVD_CGC_CTRL__IDCT_MODE_MASK |
+                       UVD_CGC_CTRL__MPRD_MODE_MASK |
+                       UVD_CGC_CTRL__MPC_MODE_MASK |
+                       UVD_CGC_CTRL__LBSI_MODE_MASK |
+                       UVD_CGC_CTRL__LRBBM_MODE_MASK |
+                       UVD_CGC_CTRL__WCB_MODE_MASK |
+                       UVD_CGC_CTRL__VCPU_MODE_MASK |
+                       UVD_CGC_CTRL__JPEG_MODE_MASK |
+                       UVD_CGC_CTRL__SCPU_MODE_MASK |
+                       UVD_CGC_CTRL__JPEG2_MODE_MASK);
+       data2 &= ~(UVD_SUVD_CGC_CTRL__SRE_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SIT_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SMP_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SCM_MODE_MASK |
+                       UVD_SUVD_CGC_CTRL__SDB_MODE_MASK);
+       data1 |= suvd_flags;
+
+       WREG32(mmUVD_CGC_CTRL, data);
+       WREG32(mmUVD_CGC_GATE, 0);
+       WREG32(mmUVD_SUVD_CGC_GATE, data1);
+       WREG32(mmUVD_SUVD_CGC_CTRL, data2);
+}
+
+#if 0
+static void uvd_v6_0_set_hw_clock_gating(struct amdgpu_device *adev)
+{
+       uint32_t data, data1, cgc_flags, suvd_flags;
+
+       data = RREG32(mmUVD_CGC_GATE);
+       data1 = RREG32(mmUVD_SUVD_CGC_GATE);
+
+       cgc_flags = UVD_CGC_GATE__SYS_MASK |
+               UVD_CGC_GATE__UDEC_MASK |
+               UVD_CGC_GATE__MPEG2_MASK |
+               UVD_CGC_GATE__RBC_MASK |
+               UVD_CGC_GATE__LMI_MC_MASK |
+               UVD_CGC_GATE__IDCT_MASK |
+               UVD_CGC_GATE__MPRD_MASK |
+               UVD_CGC_GATE__MPC_MASK |
+               UVD_CGC_GATE__LBSI_MASK |
+               UVD_CGC_GATE__LRBBM_MASK |
+               UVD_CGC_GATE__UDEC_RE_MASK |
+               UVD_CGC_GATE__UDEC_CM_MASK |
+               UVD_CGC_GATE__UDEC_IT_MASK |
+               UVD_CGC_GATE__UDEC_DB_MASK |
+               UVD_CGC_GATE__UDEC_MP_MASK |
+               UVD_CGC_GATE__WCB_MASK |
+               UVD_CGC_GATE__VCPU_MASK |
+               UVD_CGC_GATE__SCPU_MASK |
+               UVD_CGC_GATE__JPEG_MASK |
+               UVD_CGC_GATE__JPEG2_MASK;
+
+       suvd_flags = UVD_SUVD_CGC_GATE__SRE_MASK |
+                               UVD_SUVD_CGC_GATE__SIT_MASK |
+                               UVD_SUVD_CGC_GATE__SMP_MASK |
+                               UVD_SUVD_CGC_GATE__SCM_MASK |
+                               UVD_SUVD_CGC_GATE__SDB_MASK;
+
+       data |= cgc_flags;
+       data1 |= suvd_flags;
+
+       WREG32(mmUVD_CGC_GATE, data);
+       WREG32(mmUVD_SUVD_CGC_GATE, data1);
+}
+#endif
+
+static void uvd_v6_set_bypass_mode(struct amdgpu_device *adev, bool enable)
+{
+       u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
+
+       if (enable)
+               tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
+                       GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
+       else
+               tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK |
+                        GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK);
+
+       WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp);
+}
+
 static int uvd_v6_0_set_clockgating_state(void *handle,
                                          enum amd_clockgating_state state)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
+       static int curstate = -1;
+
+       if (adev->asic_type == CHIP_FIJI)
+               uvd_v6_set_bypass_mode(adev, enable);
 
        if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG))
                return 0;
 
+       if (curstate == state)
+               return 0;
+
+       curstate = state;
        if (enable) {
-               if (adev->flags & AMD_IS_APU)
-                       cz_set_uvd_clock_gating_branches(adev, enable);
-               else
-                       tonga_set_uvd_clock_gating_branches(adev, enable);
-               uvd_v6_0_set_uvd_dynamic_clock_mode(adev, true);
+               /* disable HW gating and enable Sw gating */
+               uvd_v6_0_set_sw_clock_gating(adev);
        } else {
-               uint32_t data = RREG32(mmUVD_CGC_CTRL);
-               data &= ~UVD_CGC_CTRL__DYN_CLOCK_MODE_MASK;
-               WREG32(mmUVD_CGC_CTRL, data);
+               /* wait for STATUS to clear */
+               if (uvd_v6_0_wait_for_idle(handle))
+                       return -EBUSY;
+
+               /* enable HW gates because UVD is idle */
+/*             uvd_v6_0_set_hw_clock_gating(adev); */
        }
 
        return 0;
@@ -1026,6 +896,7 @@ static int uvd_v6_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs uvd_v6_0_ip_funcs = {
+       .name = "uvd_v6_0",
        .early_init = uvd_v6_0_early_init,
        .late_init = NULL,
        .sw_init = uvd_v6_0_sw_init,
@@ -1037,7 +908,6 @@ const struct amd_ip_funcs uvd_v6_0_ip_funcs = {
        .is_idle = uvd_v6_0_is_idle,
        .wait_for_idle = uvd_v6_0_wait_for_idle,
        .soft_reset = uvd_v6_0_soft_reset,
-       .print_status = uvd_v6_0_print_status,
        .set_clockgating_state = uvd_v6_0_set_clockgating_state,
        .set_powergating_state = uvd_v6_0_set_powergating_state,
 };
index c7e885bcfd41700112dfc7ab7102cf300b33b74a..45d92aceb485f7477ec80c4d31aca52228c2c20a 100644 (file)
@@ -44,7 +44,7 @@
 static void vce_v2_0_mc_resume(struct amdgpu_device *adev);
 static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev);
 static void vce_v2_0_set_irq_funcs(struct amdgpu_device *adev);
-
+static int vce_v2_0_wait_for_idle(void *handle);
 /**
  * vce_v2_0_ring_get_rptr - get read pointer
  *
@@ -201,14 +201,14 @@ static int vce_v2_0_sw_init(void *handle)
 
        ring = &adev->vce.ring[0];
        sprintf(ring->name, "vce0");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
 
        ring = &adev->vce.ring[1];
        sprintf(ring->name, "vce1");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
@@ -240,7 +240,8 @@ static int vce_v2_0_hw_init(void *handle)
 
        r = vce_v2_0_start(adev);
        if (r)
-               return r;
+/* this error mean vcpu not in running state, so just skip ring test, not stop driver initialize */
+               return 0;
 
        ring = &adev->vce.ring[0];
        ring->ready = true;
@@ -318,7 +319,7 @@ static void vce_v2_0_set_sw_cg(struct amdgpu_device *adev, bool gated)
                WREG32(mmVCE_UENC_REG_CLOCK_GATING, tmp);
 
                WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0);
-    } else {
+       } else {
                tmp = RREG32(mmVCE_CLOCK_GATING_B);
                tmp |= 0xe7;
                tmp &= ~0xe70000;
@@ -339,6 +340,21 @@ static void vce_v2_0_set_dyn_cg(struct amdgpu_device *adev, bool gated)
 {
        u32 orig, tmp;
 
+       if (gated) {
+               if (vce_v2_0_wait_for_idle(adev)) {
+                       DRM_INFO("VCE is busy, Can't set clock gateing");
+                       return;
+               }
+               WREG32_P(mmVCE_VCPU_CNTL, 0, ~VCE_VCPU_CNTL__CLK_EN_MASK);
+               WREG32_P(mmVCE_SOFT_RESET, VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
+               mdelay(100);
+               WREG32(mmVCE_STATUS, 0);
+       } else {
+               WREG32_P(mmVCE_VCPU_CNTL, VCE_VCPU_CNTL__CLK_EN_MASK, ~VCE_VCPU_CNTL__CLK_EN_MASK);
+               WREG32_P(mmVCE_SOFT_RESET, VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
+               mdelay(100);
+       }
+
        tmp = RREG32(mmVCE_CLOCK_GATING_B);
        tmp &= ~0x00060006;
        if (gated) {
@@ -362,6 +378,7 @@ static void vce_v2_0_set_dyn_cg(struct amdgpu_device *adev, bool gated)
 
        if (gated)
                WREG32(mmVCE_CGTT_CLK_OVERRIDE, 0);
+       WREG32_P(mmVCE_SOFT_RESET, 0, ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
 }
 
 static void vce_v2_0_disable_cg(struct amdgpu_device *adev)
@@ -478,75 +495,6 @@ static int vce_v2_0_soft_reset(void *handle)
        return vce_v2_0_start(adev);
 }
 
-static void vce_v2_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "VCE 2.0 registers\n");
-       dev_info(adev->dev, "  VCE_STATUS=0x%08X\n",
-                RREG32(mmVCE_STATUS));
-       dev_info(adev->dev, "  VCE_VCPU_CNTL=0x%08X\n",
-                RREG32(mmVCE_VCPU_CNTL));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET0=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET0));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE0=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE0));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET1=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET1));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE1=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE1));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET2=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET2));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE2=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE2));
-       dev_info(adev->dev, "  VCE_SOFT_RESET=0x%08X\n",
-                RREG32(mmVCE_SOFT_RESET));
-       dev_info(adev->dev, "  VCE_RB_BASE_LO2=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_LO2));
-       dev_info(adev->dev, "  VCE_RB_BASE_HI2=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_HI2));
-       dev_info(adev->dev, "  VCE_RB_SIZE2=0x%08X\n",
-                RREG32(mmVCE_RB_SIZE2));
-       dev_info(adev->dev, "  VCE_RB_RPTR2=0x%08X\n",
-                RREG32(mmVCE_RB_RPTR2));
-       dev_info(adev->dev, "  VCE_RB_WPTR2=0x%08X\n",
-                RREG32(mmVCE_RB_WPTR2));
-       dev_info(adev->dev, "  VCE_RB_BASE_LO=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_LO));
-       dev_info(adev->dev, "  VCE_RB_BASE_HI=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_HI));
-       dev_info(adev->dev, "  VCE_RB_SIZE=0x%08X\n",
-                RREG32(mmVCE_RB_SIZE));
-       dev_info(adev->dev, "  VCE_RB_RPTR=0x%08X\n",
-                RREG32(mmVCE_RB_RPTR));
-       dev_info(adev->dev, "  VCE_RB_WPTR=0x%08X\n",
-                RREG32(mmVCE_RB_WPTR));
-       dev_info(adev->dev, "  VCE_CLOCK_GATING_A=0x%08X\n",
-                RREG32(mmVCE_CLOCK_GATING_A));
-       dev_info(adev->dev, "  VCE_CLOCK_GATING_B=0x%08X\n",
-                RREG32(mmVCE_CLOCK_GATING_B));
-       dev_info(adev->dev, "  VCE_CGTT_CLK_OVERRIDE=0x%08X\n",
-                RREG32(mmVCE_CGTT_CLK_OVERRIDE));
-       dev_info(adev->dev, "  VCE_UENC_CLOCK_GATING=0x%08X\n",
-                RREG32(mmVCE_UENC_CLOCK_GATING));
-       dev_info(adev->dev, "  VCE_UENC_REG_CLOCK_GATING=0x%08X\n",
-                RREG32(mmVCE_UENC_REG_CLOCK_GATING));
-       dev_info(adev->dev, "  VCE_SYS_INT_EN=0x%08X\n",
-                RREG32(mmVCE_SYS_INT_EN));
-       dev_info(adev->dev, "  VCE_LMI_CTRL2=0x%08X\n",
-                RREG32(mmVCE_LMI_CTRL2));
-       dev_info(adev->dev, "  VCE_LMI_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_CTRL));
-       dev_info(adev->dev, "  VCE_LMI_VM_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_VM_CTRL));
-       dev_info(adev->dev, "  VCE_LMI_SWAP_CNTL=0x%08X\n",
-                RREG32(mmVCE_LMI_SWAP_CNTL));
-       dev_info(adev->dev, "  VCE_LMI_SWAP_CNTL1=0x%08X\n",
-                RREG32(mmVCE_LMI_SWAP_CNTL1));
-       dev_info(adev->dev, "  VCE_LMI_CACHE_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_CACHE_CTRL));
-}
-
 static int vce_v2_0_set_interrupt_state(struct amdgpu_device *adev,
                                        struct amdgpu_irq_src *source,
                                        unsigned type,
@@ -619,6 +567,7 @@ static int vce_v2_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs vce_v2_0_ip_funcs = {
+       .name = "vce_v2_0",
        .early_init = vce_v2_0_early_init,
        .late_init = NULL,
        .sw_init = vce_v2_0_sw_init,
@@ -630,7 +579,6 @@ const struct amd_ip_funcs vce_v2_0_ip_funcs = {
        .is_idle = vce_v2_0_is_idle,
        .wait_for_idle = vce_v2_0_wait_for_idle,
        .soft_reset = vce_v2_0_soft_reset,
-       .print_status = vce_v2_0_print_status,
        .set_clockgating_state = vce_v2_0_set_clockgating_state,
        .set_powergating_state = vce_v2_0_set_powergating_state,
 };
index ce468ee5da2a769b755438700922d371ad592eeb..30e8099e94c5629ca6d7703526b20bf0a715267c 100644 (file)
@@ -40,9 +40,9 @@
 
 #define GRBM_GFX_INDEX__VCE_INSTANCE__SHIFT    0x04
 #define GRBM_GFX_INDEX__VCE_INSTANCE_MASK      0x10
-#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR0        0x8616
-#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR1        0x8617
-#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR2        0x8618
+#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR0        0x8616
+#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR1        0x8617
+#define mmVCE_LMI_VCPU_CACHE_40BIT_BAR2        0x8618
 
 #define VCE_V3_0_FW_SIZE       (384 * 1024)
 #define VCE_V3_0_STACK_SIZE    (64 * 1024)
@@ -315,9 +315,11 @@ static unsigned vce_v3_0_get_harvest_config(struct amdgpu_device *adev)
 {
        u32 tmp;
 
-       /* Fiji, Stoney are single pipe */
+       /* Fiji, Stoney, Polaris10, Polaris11 are single pipe */
        if ((adev->asic_type == CHIP_FIJI) ||
-           (adev->asic_type == CHIP_STONEY))
+           (adev->asic_type == CHIP_STONEY) ||
+           (adev->asic_type == CHIP_POLARIS10) ||
+           (adev->asic_type == CHIP_POLARIS11))
                return AMDGPU_VCE_HARVEST_VCE1;
 
        /* Tonga and CZ are dual or single pipe */
@@ -381,14 +383,14 @@ static int vce_v3_0_sw_init(void *handle)
 
        ring = &adev->vce.ring[0];
        sprintf(ring->name, "vce0");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
 
        ring = &adev->vce.ring[1];
        sprintf(ring->name, "vce1");
-       r = amdgpu_ring_init(adev, ring, 4096, VCE_CMD_NO_OP, 0xf,
+       r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf,
                             &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE);
        if (r)
                return r;
@@ -564,73 +566,6 @@ static int vce_v3_0_soft_reset(void *handle)
        return vce_v3_0_start(adev);
 }
 
-static void vce_v3_0_print_status(void *handle)
-{
-       struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
-       dev_info(adev->dev, "VCE 3.0 registers\n");
-       dev_info(adev->dev, "  VCE_STATUS=0x%08X\n",
-                RREG32(mmVCE_STATUS));
-       dev_info(adev->dev, "  VCE_VCPU_CNTL=0x%08X\n",
-                RREG32(mmVCE_VCPU_CNTL));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET0=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET0));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE0=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE0));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET1=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET1));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE1=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE1));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_OFFSET2=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_OFFSET2));
-       dev_info(adev->dev, "  VCE_VCPU_CACHE_SIZE2=0x%08X\n",
-                RREG32(mmVCE_VCPU_CACHE_SIZE2));
-       dev_info(adev->dev, "  VCE_SOFT_RESET=0x%08X\n",
-                RREG32(mmVCE_SOFT_RESET));
-       dev_info(adev->dev, "  VCE_RB_BASE_LO2=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_LO2));
-       dev_info(adev->dev, "  VCE_RB_BASE_HI2=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_HI2));
-       dev_info(adev->dev, "  VCE_RB_SIZE2=0x%08X\n",
-                RREG32(mmVCE_RB_SIZE2));
-       dev_info(adev->dev, "  VCE_RB_RPTR2=0x%08X\n",
-                RREG32(mmVCE_RB_RPTR2));
-       dev_info(adev->dev, "  VCE_RB_WPTR2=0x%08X\n",
-                RREG32(mmVCE_RB_WPTR2));
-       dev_info(adev->dev, "  VCE_RB_BASE_LO=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_LO));
-       dev_info(adev->dev, "  VCE_RB_BASE_HI=0x%08X\n",
-                RREG32(mmVCE_RB_BASE_HI));
-       dev_info(adev->dev, "  VCE_RB_SIZE=0x%08X\n",
-                RREG32(mmVCE_RB_SIZE));
-       dev_info(adev->dev, "  VCE_RB_RPTR=0x%08X\n",
-                RREG32(mmVCE_RB_RPTR));
-       dev_info(adev->dev, "  VCE_RB_WPTR=0x%08X\n",
-                RREG32(mmVCE_RB_WPTR));
-       dev_info(adev->dev, "  VCE_CLOCK_GATING_A=0x%08X\n",
-                RREG32(mmVCE_CLOCK_GATING_A));
-       dev_info(adev->dev, "  VCE_CLOCK_GATING_B=0x%08X\n",
-                RREG32(mmVCE_CLOCK_GATING_B));
-       dev_info(adev->dev, "  VCE_UENC_CLOCK_GATING=0x%08X\n",
-                RREG32(mmVCE_UENC_CLOCK_GATING));
-       dev_info(adev->dev, "  VCE_UENC_REG_CLOCK_GATING=0x%08X\n",
-                RREG32(mmVCE_UENC_REG_CLOCK_GATING));
-       dev_info(adev->dev, "  VCE_SYS_INT_EN=0x%08X\n",
-                RREG32(mmVCE_SYS_INT_EN));
-       dev_info(adev->dev, "  VCE_LMI_CTRL2=0x%08X\n",
-                RREG32(mmVCE_LMI_CTRL2));
-       dev_info(adev->dev, "  VCE_LMI_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_CTRL));
-       dev_info(adev->dev, "  VCE_LMI_VM_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_VM_CTRL));
-       dev_info(adev->dev, "  VCE_LMI_SWAP_CNTL=0x%08X\n",
-                RREG32(mmVCE_LMI_SWAP_CNTL));
-       dev_info(adev->dev, "  VCE_LMI_SWAP_CNTL1=0x%08X\n",
-                RREG32(mmVCE_LMI_SWAP_CNTL1));
-       dev_info(adev->dev, "  VCE_LMI_CACHE_CTRL=0x%08X\n",
-                RREG32(mmVCE_LMI_CACHE_CTRL));
-}
-
 static int vce_v3_0_set_interrupt_state(struct amdgpu_device *adev,
                                        struct amdgpu_irq_src *source,
                                        unsigned type,
@@ -739,6 +674,7 @@ static int vce_v3_0_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs vce_v3_0_ip_funcs = {
+       .name = "vce_v3_0",
        .early_init = vce_v3_0_early_init,
        .late_init = NULL,
        .sw_init = vce_v3_0_sw_init,
@@ -750,7 +686,6 @@ const struct amd_ip_funcs vce_v3_0_ip_funcs = {
        .is_idle = vce_v3_0_is_idle,
        .wait_for_idle = vce_v3_0_wait_for_idle,
        .soft_reset = vce_v3_0_soft_reset,
-       .print_status = vce_v3_0_print_status,
        .set_clockgating_state = vce_v3_0_set_clockgating_state,
        .set_powergating_state = vce_v3_0_set_powergating_state,
 };
index 1c120efa292cef9f1c718cc0705cfe83414995b4..2c88d0b66cf396b35016b169c04091feaa2cc6e5 100644 (file)
 #include "amdgpu_acp.h"
 #endif
 
+MODULE_FIRMWARE("amdgpu/polaris10_smc.bin");
+MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_smc.bin");
+MODULE_FIRMWARE("amdgpu/polaris11_smc_sk.bin");
+
 /*
  * Indirect registers accessor
  */
@@ -276,6 +281,8 @@ static void vi_init_golden_registers(struct amdgpu_device *adev)
                                                 stoney_mgcg_cgcg_init,
                                                 (const u32)ARRAY_SIZE(stoney_mgcg_cgcg_init));
                break;
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS10:
        default:
                break;
        }
@@ -414,11 +421,11 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev,
        return true;
 }
 
-static struct amdgpu_allowed_register_entry tonga_allowed_read_registers[] = {
+static const struct amdgpu_allowed_register_entry tonga_allowed_read_registers[] = {
        {mmGB_MACROTILE_MODE7, true},
 };
 
-static struct amdgpu_allowed_register_entry cz_allowed_read_registers[] = {
+static const struct amdgpu_allowed_register_entry cz_allowed_read_registers[] = {
        {mmGB_TILE_MODE7, true},
        {mmGB_TILE_MODE12, true},
        {mmGB_TILE_MODE17, true},
@@ -426,7 +433,7 @@ static struct amdgpu_allowed_register_entry cz_allowed_read_registers[] = {
        {mmGB_MACROTILE_MODE7, true},
 };
 
-static struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {
+static const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {
        {mmGRBM_STATUS, false},
        {mmGRBM_STATUS2, false},
        {mmGRBM_STATUS_SE0, false},
@@ -525,8 +532,8 @@ static uint32_t vi_read_indexed_register(struct amdgpu_device *adev, u32 se_num,
 static int vi_read_register(struct amdgpu_device *adev, u32 se_num,
                            u32 sh_num, u32 reg_offset, u32 *value)
 {
-       struct amdgpu_allowed_register_entry *asic_register_table = NULL;
-       struct amdgpu_allowed_register_entry *asic_register_entry;
+       const struct amdgpu_allowed_register_entry *asic_register_table = NULL;
+       const struct amdgpu_allowed_register_entry *asic_register_entry;
        uint32_t size, i;
 
        *value = 0;
@@ -537,6 +544,8 @@ static int vi_read_register(struct amdgpu_device *adev, u32 se_num,
                break;
        case CHIP_FIJI:
        case CHIP_TONGA:
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS10:
        case CHIP_CARRIZO:
        case CHIP_STONEY:
                asic_register_table = cz_allowed_read_registers;
@@ -907,6 +916,74 @@ static const struct amdgpu_ip_block_version fiji_ip_blocks[] =
        },
 };
 
+static const struct amdgpu_ip_block_version polaris11_ip_blocks[] =
+{
+       /* ORDER MATTERS! */
+       {
+               .type = AMD_IP_BLOCK_TYPE_COMMON,
+               .major = 2,
+               .minor = 0,
+               .rev = 0,
+               .funcs = &vi_common_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_GMC,
+               .major = 8,
+               .minor = 1,
+               .rev = 0,
+               .funcs = &gmc_v8_0_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_IH,
+               .major = 3,
+               .minor = 1,
+               .rev = 0,
+               .funcs = &tonga_ih_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_SMC,
+               .major = 7,
+               .minor = 2,
+               .rev = 0,
+               .funcs = &amdgpu_pp_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_DCE,
+               .major = 11,
+               .minor = 2,
+               .rev = 0,
+               .funcs = &dce_v11_0_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_GFX,
+               .major = 8,
+               .minor = 0,
+               .rev = 0,
+               .funcs = &gfx_v8_0_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_SDMA,
+               .major = 3,
+               .minor = 1,
+               .rev = 0,
+               .funcs = &sdma_v3_0_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_UVD,
+               .major = 6,
+               .minor = 3,
+               .rev = 0,
+               .funcs = &uvd_v6_0_ip_funcs,
+       },
+       {
+               .type = AMD_IP_BLOCK_TYPE_VCE,
+               .major = 3,
+               .minor = 4,
+               .rev = 0,
+               .funcs = &vce_v3_0_ip_funcs,
+       },
+};
+
 static const struct amdgpu_ip_block_version cz_ip_blocks[] =
 {
        /* ORDER MATTERS! */
@@ -999,6 +1076,11 @@ int vi_set_ip_blocks(struct amdgpu_device *adev)
                adev->ip_blocks = tonga_ip_blocks;
                adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks);
                break;
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS10:
+               adev->ip_blocks = polaris11_ip_blocks;
+               adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks);
+               break;
        case CHIP_CARRIZO:
        case CHIP_STONEY:
                adev->ip_blocks = cz_ip_blocks;
@@ -1036,7 +1118,6 @@ static const struct amdgpu_asic_funcs vi_asic_funcs =
        .get_xclk = &vi_get_xclk,
        .set_uvd_clocks = &vi_set_uvd_clocks,
        .set_vce_clocks = &vi_set_vce_clocks,
-       .get_cu_info = &gfx_v8_0_get_cu_info,
        /* these should be moved to their own ip modules */
        .get_gpu_clock_counter = &gfx_v8_0_get_gpu_clock_counter,
        .wait_for_mc_idle = &gmc_v8_0_mc_wait_for_idle,
@@ -1076,18 +1157,68 @@ static int vi_common_early_init(void *handle)
                adev->external_rev_id = 0x1;
                break;
        case CHIP_FIJI:
-               adev->cg_flags = 0;
+               adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |
+                       AMD_CG_SUPPORT_GFX_MGLS |
+                       AMD_CG_SUPPORT_GFX_RLC_LS |
+                       AMD_CG_SUPPORT_GFX_CP_LS |
+                       AMD_CG_SUPPORT_GFX_CGTS |
+                       AMD_CG_SUPPORT_GFX_CGTS_LS |
+                       AMD_CG_SUPPORT_GFX_CGCG |
+                       AMD_CG_SUPPORT_GFX_CGLS |
+                       AMD_CG_SUPPORT_SDMA_MGCG |
+                       AMD_CG_SUPPORT_SDMA_LS |
+                       AMD_CG_SUPPORT_BIF_LS |
+                       AMD_CG_SUPPORT_HDP_MGCG |
+                       AMD_CG_SUPPORT_HDP_LS |
+                       AMD_CG_SUPPORT_ROM_MGCG |
+                       AMD_CG_SUPPORT_MC_MGCG |
+                       AMD_CG_SUPPORT_MC_LS;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x3c;
                break;
        case CHIP_TONGA:
-               adev->cg_flags = 0;
+               adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x14;
                break;
+       case CHIP_POLARIS11:
+               adev->cg_flags = 0;
+               adev->pg_flags = 0;
+               adev->external_rev_id = adev->rev_id + 0x5A;
+               break;
+       case CHIP_POLARIS10:
+               adev->cg_flags = 0;
+               adev->pg_flags = 0;
+               adev->external_rev_id = adev->rev_id + 0x50;
+               break;
        case CHIP_CARRIZO:
+               adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
+                       AMD_CG_SUPPORT_GFX_MGCG |
+                       AMD_CG_SUPPORT_GFX_MGLS |
+                       AMD_CG_SUPPORT_GFX_RLC_LS |
+                       AMD_CG_SUPPORT_GFX_CP_LS |
+                       AMD_CG_SUPPORT_GFX_CGTS |
+                       AMD_CG_SUPPORT_GFX_MGLS |
+                       AMD_CG_SUPPORT_GFX_CGTS_LS |
+                       AMD_CG_SUPPORT_GFX_CGCG |
+                       AMD_CG_SUPPORT_GFX_CGLS |
+                       AMD_CG_SUPPORT_BIF_LS |
+                       AMD_CG_SUPPORT_HDP_MGCG |
+                       AMD_CG_SUPPORT_HDP_LS |
+                       AMD_CG_SUPPORT_SDMA_MGCG |
+                       AMD_CG_SUPPORT_SDMA_LS;
+               adev->pg_flags = 0;
+               adev->external_rev_id = adev->rev_id + 0x1;
+               break;
        case CHIP_STONEY:
-               adev->cg_flags = 0;
+               adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG |
+                       AMD_CG_SUPPORT_GFX_MGCG |
+                       AMD_CG_SUPPORT_GFX_MGLS |
+                       AMD_CG_SUPPORT_BIF_LS |
+                       AMD_CG_SUPPORT_HDP_MGCG |
+                       AMD_CG_SUPPORT_HDP_LS |
+                       AMD_CG_SUPPORT_SDMA_MGCG |
+                       AMD_CG_SUPPORT_SDMA_LS;
                adev->pg_flags = 0;
                adev->external_rev_id = adev->rev_id + 0x1;
                break;
@@ -1164,24 +1295,19 @@ static int vi_common_wait_for_idle(void *handle)
        return 0;
 }
 
-static void vi_common_print_status(void *handle)
-{
-       return;
-}
-
 static int vi_common_soft_reset(void *handle)
 {
        return 0;
 }
 
-static void fiji_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
-               bool enable)
+static void vi_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
+                                                  bool enable)
 {
        uint32_t temp, data;
 
        temp = data = RREG32_PCIE(ixPCIE_CNTL2);
 
-       if (enable)
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_BIF_LS))
                data |= PCIE_CNTL2__SLV_MEM_LS_EN_MASK |
                                PCIE_CNTL2__MST_MEM_LS_EN_MASK |
                                PCIE_CNTL2__REPLAY_MEM_LS_EN_MASK;
@@ -1194,14 +1320,14 @@ static void fiji_update_bif_medium_grain_light_sleep(struct amdgpu_device *adev,
                WREG32_PCIE(ixPCIE_CNTL2, data);
 }
 
-static void fiji_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+static void vi_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev,
+                                                   bool enable)
 {
        uint32_t temp, data;
 
        temp = data = RREG32(mmHDP_HOST_PATH_CNTL);
 
-       if (enable)
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_MGCG))
                data &= ~HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
        else
                data |= HDP_HOST_PATH_CNTL__CLOCK_GATING_DIS_MASK;
@@ -1210,14 +1336,14 @@ static void fiji_update_hdp_medium_grain_clock_gating(struct amdgpu_device *adev
                WREG32(mmHDP_HOST_PATH_CNTL, data);
 }
 
-static void fiji_update_hdp_light_sleep(struct amdgpu_device *adev,
-               bool enable)
+static void vi_update_hdp_light_sleep(struct amdgpu_device *adev,
+                                     bool enable)
 {
        uint32_t temp, data;
 
        temp = data = RREG32(mmHDP_MEM_POWER_LS);
 
-       if (enable)
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_HDP_LS))
                data |= HDP_MEM_POWER_LS__LS_ENABLE_MASK;
        else
                data &= ~HDP_MEM_POWER_LS__LS_ENABLE_MASK;
@@ -1226,14 +1352,14 @@ static void fiji_update_hdp_light_sleep(struct amdgpu_device *adev,
                WREG32(mmHDP_MEM_POWER_LS, data);
 }
 
-static void fiji_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
-               bool enable)
+static void vi_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev,
+                                                   bool enable)
 {
        uint32_t temp, data;
 
        temp = data = RREG32_SMC(ixCGTT_ROM_CLK_CTRL0);
 
-       if (enable)
+       if (enable && (adev->cg_flags & AMD_CG_SUPPORT_ROM_MGCG))
                data &= ~(CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE0_MASK |
                                CGTT_ROM_CLK_CTRL0__SOFT_OVERRIDE1_MASK);
        else
@@ -1245,19 +1371,28 @@ static void fiji_update_rom_medium_grain_clock_gating(struct amdgpu_device *adev
 }
 
 static int vi_common_set_clockgating_state(void *handle,
-                                           enum amd_clockgating_state state)
+                                          enum amd_clockgating_state state)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
        switch (adev->asic_type) {
        case CHIP_FIJI:
-               fiji_update_bif_medium_grain_light_sleep(adev,
+               vi_update_bif_medium_grain_light_sleep(adev,
+                               state == AMD_CG_STATE_GATE ? true : false);
+               vi_update_hdp_medium_grain_clock_gating(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
-               fiji_update_hdp_medium_grain_clock_gating(adev,
+               vi_update_hdp_light_sleep(adev,
+                               state == AMD_CG_STATE_GATE ? true : false);
+               vi_update_rom_medium_grain_clock_gating(adev,
+                               state == AMD_CG_STATE_GATE ? true : false);
+               break;
+       case CHIP_CARRIZO:
+       case CHIP_STONEY:
+               vi_update_bif_medium_grain_light_sleep(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
-               fiji_update_hdp_light_sleep(adev,
+               vi_update_hdp_medium_grain_clock_gating(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
-               fiji_update_rom_medium_grain_clock_gating(adev,
+               vi_update_hdp_light_sleep(adev,
                                state == AMD_CG_STATE_GATE ? true : false);
                break;
        default:
@@ -1273,6 +1408,7 @@ static int vi_common_set_powergating_state(void *handle,
 }
 
 const struct amd_ip_funcs vi_common_ip_funcs = {
+       .name = "vi_common",
        .early_init = vi_common_early_init,
        .late_init = NULL,
        .sw_init = vi_common_sw_init,
@@ -1284,7 +1420,6 @@ const struct amd_ip_funcs vi_common_ip_funcs = {
        .is_idle = vi_common_is_idle,
        .wait_for_idle = vi_common_wait_for_idle,
        .soft_reset = vi_common_soft_reset,
-       .print_status = vi_common_print_status,
        .set_clockgating_state = vi_common_set_clockgating_state,
        .set_powergating_state = vi_common_set_powergating_state,
 };
index ace49976f7be08efe9d6ea6e246fb83bc4727ab2..062ee16764800908aca8003b7a0cda6631da212a 100644 (file)
@@ -54,7 +54,8 @@
 #define AUD3_REGISTER_OFFSET                 (0x17b4 - 0x17a8)
 #define AUD4_REGISTER_OFFSET                 (0x17b8 - 0x17a8)
 #define AUD5_REGISTER_OFFSET                 (0x17bc - 0x17a8)
-#define AUD6_REGISTER_OFFSET                 (0x17c4 - 0x17a8)
+#define AUD6_REGISTER_OFFSET                 (0x17c0 - 0x17a8)
+#define AUD7_REGISTER_OFFSET                 (0x17c4 - 0x17a8)
 
 /* hpd instance offsets */
 #define HPD0_REGISTER_OFFSET                 (0x1898 - 0x1898)
 #define VCE_CMD_IB             0x00000002
 #define VCE_CMD_FENCE          0x00000003
 #define VCE_CMD_TRAP           0x00000004
-#define VCE_CMD_IB_AUTO        0x00000005
+#define VCE_CMD_IB_AUTO        0x00000005
 #define VCE_CMD_SEMAPHORE      0x00000006
 
 #endif
index 07ac724e3ec909102c22d0fc47ce4be19c8606ab..ee3e04e10dae3380c09c715673dfb79773746e73 100644 (file)
@@ -109,7 +109,7 @@ static int kfd_open(struct inode *inode, struct file *filep)
 
        is_32bit_user_mode = in_compat_syscall();
 
-       if (is_32bit_user_mode == true) {
+       if (is_32bit_user_mode) {
                dev_warn(kfd_device,
                        "Process %d (32-bit) failed to open /dev/kfd\n"
                        "32-bit processes are not supported by amdkfd\n",
@@ -131,12 +131,11 @@ static int kfd_ioctl_get_version(struct file *filep, struct kfd_process *p,
                                        void *data)
 {
        struct kfd_ioctl_get_version_args *args = data;
-       int err = 0;
 
        args->major_version = KFD_IOCTL_MAJOR_VERSION;
        args->minor_version = KFD_IOCTL_MINOR_VERSION;
 
-       return err;
+       return 0;
 }
 
 static int set_queue_properties_from_user(struct queue_properties *q_properties,
index 4bb7f42237624f7c5edd0a4331ea75d426fc1347..f49c551195b3c0538b46f0221e2e8fef48491144 100644 (file)
@@ -216,7 +216,7 @@ static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q)
                }
        }
 
-       if (set == false)
+       if (!set)
                return -EBUSY;
 
        pr_debug("kfd: DQM %s hqd slot - pipe (%d) queue(%d)\n",
@@ -354,7 +354,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q)
                return -ENOMEM;
        }
 
-       if (q->properties.is_active == true)
+       if (q->properties.is_active)
                prev_active = true;
 
        /*
@@ -363,9 +363,9 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q)
         * and modify counter accordingly
         */
        retval = mqd->update_mqd(mqd, q->mqd, &q->properties);
-       if ((q->properties.is_active == true) && (prev_active == false))
+       if ((q->properties.is_active) && (!prev_active))
                dqm->queue_count++;
-       else if ((q->properties.is_active == false) && (prev_active == true))
+       else if ((!q->properties.is_active) && (prev_active))
                dqm->queue_count--;
 
        if (sched_policy != KFD_SCHED_POLICY_NO_HWS)
@@ -954,7 +954,7 @@ static int destroy_queues_cpsch(struct device_queue_manager *dqm,
 
        if (lock)
                mutex_lock(&dqm->lock);
-       if (dqm->active_runlist == false)
+       if (!dqm->active_runlist)
                goto out;
 
        pr_debug("kfd: Before destroying queues, sdma queue count is : %u\n",
index b6e28dcaea1d78c42f9a81cb5147e3d9c7751433..a6a4b2b1c0d901bb6d59497f5595355490d3f74e 100644 (file)
@@ -177,9 +177,9 @@ static bool allocate_event_notification_slot(struct file *devkfd,
        bool ret;
 
        ret = allocate_free_slot(p, page, signal_slot_index);
-       if (ret == false) {
+       if (!ret) {
                ret = allocate_signal_page(devkfd, p);
-               if (ret == true)
+               if (ret)
                        ret = allocate_free_slot(p, page, signal_slot_index);
        }
 
index 8fa894100290a945fa14f8a2cb6a0cffd90784cc..9beae87aadd54a418ebf5033b86eff2665d7ea5f 100644 (file)
@@ -300,7 +300,7 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
                break;
        }
 
-       if (kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE) == false) {
+       if (!kq->ops.initialize(kq, dev, type, KFD_KERNEL_QUEUE_SIZE)) {
                pr_err("amdkfd: failed to init kernel queue\n");
                kfree(kq);
                return NULL;
index 90f391434fa392b79d9fb2bc3bb41b6ea79bd746..ca8c09326b310331e5d71b91dfb4c32aed9c3d80 100644 (file)
@@ -98,7 +98,7 @@ static int pm_allocate_runlist_ib(struct packet_manager *pm,
        int retval;
 
        BUG_ON(!pm);
-       BUG_ON(pm->allocated == true);
+       BUG_ON(pm->allocated);
        BUG_ON(is_over_subscription == NULL);
 
        pm_calc_rlib_size(pm, rl_buffer_size, is_over_subscription);
@@ -292,7 +292,7 @@ static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer,
                        q->properties.doorbell_off;
 
        packet->mes_map_queues_ordinals[0].bitfields3.is_static =
-                       (use_static == true) ? 1 : 0;
+                       (use_static) ? 1 : 0;
 
        packet->mes_map_queues_ordinals[0].mqd_addr_lo =
                        lower_32_bits(q->gart_mqd_addr);
@@ -357,7 +357,7 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
                                alloc_size_bytes);
 
                list_for_each_entry(kq, &qpd->priv_queue_list, list) {
-                       if (kq->queue->properties.is_active != true)
+                       if (!kq->queue->properties.is_active)
                                continue;
 
                        pr_debug("kfd: static_queue, mapping kernel q %d, is debug status %d\n",
@@ -383,7 +383,7 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
                }
 
                list_for_each_entry(q, &qpd->queues_list, list) {
-                       if (q->properties.is_active != true)
+                       if (!q->properties.is_active)
                                continue;
 
                        pr_debug("kfd: static_queue, mapping user queue %d, is debug status %d\n",
@@ -531,7 +531,7 @@ fail_create_runlist:
 fail_acquire_packet_buffer:
        mutex_unlock(&pm->lock);
 fail_create_runlist_ib:
-       if (pm->allocated == true)
+       if (pm->allocated)
                pm_release_ib(pm);
        return retval;
 }
@@ -647,7 +647,7 @@ int pm_send_unmap_queue(struct packet_manager *pm, enum kfd_queue_type type,
        default:
                BUG();
                break;
-       };
+       }
 
        pm->priv_queue->ops.submit_packet(pm->priv_queue);
 
index 04e4090666fb2257307b50018729c18c3bc3b48e..6080951d539d0d3fd4c85390a0afa18ce2df8cd7 100644 (file)
@@ -48,6 +48,8 @@ enum amd_asic_type {
        CHIP_FIJI,
        CHIP_CARRIZO,
        CHIP_STONEY,
+       CHIP_POLARIS10,
+       CHIP_POLARIS11,
        CHIP_LAST,
 };
 
@@ -104,6 +106,7 @@ enum amd_powergating_state {
 #define AMD_CG_SUPPORT_VCE_MGCG                        (1 << 14)
 #define AMD_CG_SUPPORT_HDP_LS                  (1 << 15)
 #define AMD_CG_SUPPORT_HDP_MGCG                        (1 << 16)
+#define AMD_CG_SUPPORT_ROM_MGCG                        (1 << 17)
 
 /* PG flags */
 #define AMD_PG_SUPPORT_GFX_PG                  (1 << 0)
@@ -140,6 +143,8 @@ enum amd_pm_state_type {
 };
 
 struct amd_ip_funcs {
+       /* Name of IP block */
+       char *name;
        /* sets up early driver state (pre sw_init), does not configure hw - Optional */
        int (*early_init)(void *handle);
        /* sets up late driver/hw state (post hw_init) - Optional */
@@ -162,8 +167,6 @@ struct amd_ip_funcs {
        int (*wait_for_idle)(void *handle);
        /* soft reset the IP block */
        int (*soft_reset)(void *handle);
-       /* dump the IP block status registers */
-       void (*print_status)(void *handle);
        /* enable/disable cg for the IP block */
        int (*set_clockgating_state)(void *handle,
                                     enum amd_clockgating_state state);
diff --git a/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_d.h b/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_d.h
new file mode 100755 (executable)
index 0000000..09a7df1
--- /dev/null
@@ -0,0 +1,10075 @@
+/*
+ * DCE_11_2 Register documentation
+ *
+ * Copyright (C) 2016  Advanced Micro Devices, 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) 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 DCE_11_2_D_H
+#define DCE_11_2_D_H
+
+#define mmPIPE0_PG_CONFIG                                                       0x2c0
+#define mmPIPE0_PG_ENABLE                                                       0x2c1
+#define mmPIPE0_PG_STATUS                                                       0x2c2
+#define mmPIPE1_PG_CONFIG                                                       0x2c3
+#define mmPIPE1_PG_ENABLE                                                       0x2c4
+#define mmPIPE1_PG_STATUS                                                       0x2c5
+#define mmPIPE2_PG_CONFIG                                                       0x2c6
+#define mmPIPE2_PG_ENABLE                                                       0x2c7
+#define mmPIPE2_PG_STATUS                                                       0x2c8
+#define mmPIPE3_PG_CONFIG                                                       0x2c9
+#define mmPIPE3_PG_ENABLE                                                       0x2ca
+#define mmPIPE3_PG_STATUS                                                       0x2cb
+#define mmPIPE4_PG_CONFIG                                                       0x2cc
+#define mmPIPE4_PG_ENABLE                                                       0x2cd
+#define mmPIPE4_PG_STATUS                                                       0x2ce
+#define mmPIPE5_PG_CONFIG                                                       0x2cf
+#define mmPIPE5_PG_ENABLE                                                       0x2d0
+#define mmPIPE5_PG_STATUS                                                       0x2d1
+#define mmDCPG_INTERRUPT_STATUS                                                 0x2de
+#define mmDCPG_INTERRUPT_CONTROL                                                0x2df
+#define mmDCPG_INTERRUPT_CONTROL2                                               0x2e0
+#define mmDC_IP_REQUEST_CNTL                                                    0x2d2
+#define mmDC_PGFSM_CONFIG_REG                                                   0x2d3
+#define mmDC_PGFSM_WRITE_REG                                                    0x2d4
+#define mmDC_PGCNTL_STATUS_REG                                                  0x2d5
+#define mmDCPG_TEST_DEBUG_INDEX                                                 0x2d6
+#define mmDCPG_TEST_DEBUG_DATA                                                  0x2d7
+#define mmBL1_PWM_AMBIENT_LIGHT_LEVEL                                           0x1628
+#define mmBL1_PWM_USER_LEVEL                                                    0x1629
+#define mmBL1_PWM_TARGET_ABM_LEVEL                                              0x162a
+#define mmBL1_PWM_CURRENT_ABM_LEVEL                                             0x162b
+#define mmBL1_PWM_FINAL_DUTY_CYCLE                                              0x162c
+#define mmBL1_PWM_MINIMUM_DUTY_CYCLE                                            0x162d
+#define mmBL1_PWM_ABM_CNTL                                                      0x162e
+#define mmBL1_PWM_BL_UPDATE_SAMPLE_RATE                                         0x162f
+#define mmBL1_PWM_GRP2_REG_LOCK                                                 0x1630
+#define mmDC_ABM1_CNTL                                                          0x1638
+#define mmDC_ABM1_IPCSC_COEFF_SEL                                               0x1639
+#define mmDC_ABM1_ACE_OFFSET_SLOPE_0                                            0x163a
+#define mmDC_ABM1_ACE_OFFSET_SLOPE_1                                            0x163b
+#define mmDC_ABM1_ACE_OFFSET_SLOPE_2                                            0x163c
+#define mmDC_ABM1_ACE_OFFSET_SLOPE_3                                            0x163d
+#define mmDC_ABM1_ACE_OFFSET_SLOPE_4                                            0x163e
+#define mmDC_ABM1_ACE_THRES_12                                                  0x163f
+#define mmDC_ABM1_ACE_THRES_34                                                  0x1640
+#define mmDC_ABM1_ACE_CNTL_MISC                                                 0x1641
+#define mmDC_ABM1_DEBUG_MISC                                                    0x1649
+#define mmDC_ABM1_HGLS_REG_READ_PROGRESS                                        0x164a
+#define mmDC_ABM1_HG_MISC_CTRL                                                  0x164b
+#define mmDC_ABM1_LS_SUM_OF_LUMA                                                0x164c
+#define mmDC_ABM1_LS_MIN_MAX_LUMA                                               0x164d
+#define mmDC_ABM1_LS_FILTERED_MIN_MAX_LUMA                                      0x164e
+#define mmDC_ABM1_LS_PIXEL_COUNT                                                0x164f
+#define mmDC_ABM1_LS_OVR_SCAN_BIN                                               0x1650
+#define mmDC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES                                  0x1651
+#define mmDC_ABM1_LS_MIN_PIXEL_VALUE_COUNT                                      0x1652
+#define mmDC_ABM1_LS_MAX_PIXEL_VALUE_COUNT                                      0x1653
+#define mmDC_ABM1_HG_SAMPLE_RATE                                                0x1654
+#define mmDC_ABM1_LS_SAMPLE_RATE                                                0x1655
+#define mmDC_ABM1_HG_BIN_1_32_SHIFT_FLAG                                        0x1656
+#define mmDC_ABM1_HG_BIN_1_8_SHIFT_INDEX                                        0x1657
+#define mmDC_ABM1_HG_BIN_9_16_SHIFT_INDEX                                       0x1658
+#define mmDC_ABM1_HG_BIN_17_24_SHIFT_INDEX                                      0x1659
+#define mmDC_ABM1_HG_BIN_25_32_SHIFT_INDEX                                      0x165a
+#define mmDC_ABM1_HG_RESULT_1                                                   0x165b
+#define mmDC_ABM1_HG_RESULT_2                                                   0x165c
+#define mmDC_ABM1_HG_RESULT_3                                                   0x165d
+#define mmDC_ABM1_HG_RESULT_4                                                   0x165e
+#define mmDC_ABM1_HG_RESULT_5                                                   0x165f
+#define mmDC_ABM1_HG_RESULT_6                                                   0x1660
+#define mmDC_ABM1_HG_RESULT_7                                                   0x1661
+#define mmDC_ABM1_HG_RESULT_8                                                   0x1662
+#define mmDC_ABM1_HG_RESULT_9                                                   0x1663
+#define mmDC_ABM1_HG_RESULT_10                                                  0x1664
+#define mmDC_ABM1_HG_RESULT_11                                                  0x1665
+#define mmDC_ABM1_HG_RESULT_12                                                  0x1666
+#define mmDC_ABM1_HG_RESULT_13                                                  0x1667
+#define mmDC_ABM1_HG_RESULT_14                                                  0x1668
+#define mmDC_ABM1_HG_RESULT_15                                                  0x1669
+#define mmDC_ABM1_HG_RESULT_16                                                  0x166a
+#define mmDC_ABM1_HG_RESULT_17                                                  0x166b
+#define mmDC_ABM1_HG_RESULT_18                                                  0x166c
+#define mmDC_ABM1_HG_RESULT_19                                                  0x166d
+#define mmDC_ABM1_HG_RESULT_20                                                  0x166e
+#define mmDC_ABM1_HG_RESULT_21                                                  0x166f
+#define mmDC_ABM1_HG_RESULT_22                                                  0x1670
+#define mmDC_ABM1_HG_RESULT_23                                                  0x1671
+#define mmDC_ABM1_HG_RESULT_24                                                  0x1672
+#define mmDC_ABM1_OVERSCAN_PIXEL_VALUE                                          0x169b
+#define mmDC_ABM1_BL_MASTER_LOCK                                                0x169c
+#define mmABM_TEST_DEBUG_INDEX                                                  0x169e
+#define mmABM_TEST_DEBUG_DATA                                                   0x169f
+#define mmCRTC_H_BLANK_EARLY_NUM                                                0x1b7d
+#define mmCRTC0_CRTC_H_BLANK_EARLY_NUM                                          0x1b7d
+#define mmCRTC1_CRTC_H_BLANK_EARLY_NUM                                          0x1d7d
+#define mmCRTC2_CRTC_H_BLANK_EARLY_NUM                                          0x1f7d
+#define mmCRTC3_CRTC_H_BLANK_EARLY_NUM                                          0x417d
+#define mmCRTC4_CRTC_H_BLANK_EARLY_NUM                                          0x437d
+#define mmCRTC5_CRTC_H_BLANK_EARLY_NUM                                          0x457d
+#define mmCRTC_H_TOTAL                                                          0x1b80
+#define mmCRTC0_CRTC_H_TOTAL                                                    0x1b80
+#define mmCRTC1_CRTC_H_TOTAL                                                    0x1d80
+#define mmCRTC2_CRTC_H_TOTAL                                                    0x1f80
+#define mmCRTC3_CRTC_H_TOTAL                                                    0x4180
+#define mmCRTC4_CRTC_H_TOTAL                                                    0x4380
+#define mmCRTC5_CRTC_H_TOTAL                                                    0x4580
+#define mmCRTC_H_BLANK_START_END                                                0x1b81
+#define mmCRTC0_CRTC_H_BLANK_START_END                                          0x1b81
+#define mmCRTC1_CRTC_H_BLANK_START_END                                          0x1d81
+#define mmCRTC2_CRTC_H_BLANK_START_END                                          0x1f81
+#define mmCRTC3_CRTC_H_BLANK_START_END                                          0x4181
+#define mmCRTC4_CRTC_H_BLANK_START_END                                          0x4381
+#define mmCRTC5_CRTC_H_BLANK_START_END                                          0x4581
+#define mmCRTC_H_SYNC_A                                                         0x1b82
+#define mmCRTC0_CRTC_H_SYNC_A                                                   0x1b82
+#define mmCRTC1_CRTC_H_SYNC_A                                                   0x1d82
+#define mmCRTC2_CRTC_H_SYNC_A                                                   0x1f82
+#define mmCRTC3_CRTC_H_SYNC_A                                                   0x4182
+#define mmCRTC4_CRTC_H_SYNC_A                                                   0x4382
+#define mmCRTC5_CRTC_H_SYNC_A                                                   0x4582
+#define mmCRTC_H_SYNC_A_CNTL                                                    0x1b83
+#define mmCRTC0_CRTC_H_SYNC_A_CNTL                                              0x1b83
+#define mmCRTC1_CRTC_H_SYNC_A_CNTL                                              0x1d83
+#define mmCRTC2_CRTC_H_SYNC_A_CNTL                                              0x1f83
+#define mmCRTC3_CRTC_H_SYNC_A_CNTL                                              0x4183
+#define mmCRTC4_CRTC_H_SYNC_A_CNTL                                              0x4383
+#define mmCRTC5_CRTC_H_SYNC_A_CNTL                                              0x4583
+#define mmCRTC_H_SYNC_B                                                         0x1b84
+#define mmCRTC0_CRTC_H_SYNC_B                                                   0x1b84
+#define mmCRTC1_CRTC_H_SYNC_B                                                   0x1d84
+#define mmCRTC2_CRTC_H_SYNC_B                                                   0x1f84
+#define mmCRTC3_CRTC_H_SYNC_B                                                   0x4184
+#define mmCRTC4_CRTC_H_SYNC_B                                                   0x4384
+#define mmCRTC5_CRTC_H_SYNC_B                                                   0x4584
+#define mmCRTC_H_SYNC_B_CNTL                                                    0x1b85
+#define mmCRTC0_CRTC_H_SYNC_B_CNTL                                              0x1b85
+#define mmCRTC1_CRTC_H_SYNC_B_CNTL                                              0x1d85
+#define mmCRTC2_CRTC_H_SYNC_B_CNTL                                              0x1f85
+#define mmCRTC3_CRTC_H_SYNC_B_CNTL                                              0x4185
+#define mmCRTC4_CRTC_H_SYNC_B_CNTL                                              0x4385
+#define mmCRTC5_CRTC_H_SYNC_B_CNTL                                              0x4585
+#define mmCRTC_VBI_END                                                          0x1b86
+#define mmCRTC0_CRTC_VBI_END                                                    0x1b86
+#define mmCRTC1_CRTC_VBI_END                                                    0x1d86
+#define mmCRTC2_CRTC_VBI_END                                                    0x1f86
+#define mmCRTC3_CRTC_VBI_END                                                    0x4186
+#define mmCRTC4_CRTC_VBI_END                                                    0x4386
+#define mmCRTC5_CRTC_VBI_END                                                    0x4586
+#define mmCRTC_V_TOTAL                                                          0x1b87
+#define mmCRTC0_CRTC_V_TOTAL                                                    0x1b87
+#define mmCRTC1_CRTC_V_TOTAL                                                    0x1d87
+#define mmCRTC2_CRTC_V_TOTAL                                                    0x1f87
+#define mmCRTC3_CRTC_V_TOTAL                                                    0x4187
+#define mmCRTC4_CRTC_V_TOTAL                                                    0x4387
+#define mmCRTC5_CRTC_V_TOTAL                                                    0x4587
+#define mmCRTC_V_TOTAL_MIN                                                      0x1b88
+#define mmCRTC0_CRTC_V_TOTAL_MIN                                                0x1b88
+#define mmCRTC1_CRTC_V_TOTAL_MIN                                                0x1d88
+#define mmCRTC2_CRTC_V_TOTAL_MIN                                                0x1f88
+#define mmCRTC3_CRTC_V_TOTAL_MIN                                                0x4188
+#define mmCRTC4_CRTC_V_TOTAL_MIN                                                0x4388
+#define mmCRTC5_CRTC_V_TOTAL_MIN                                                0x4588
+#define mmCRTC_V_TOTAL_MAX                                                      0x1b89
+#define mmCRTC0_CRTC_V_TOTAL_MAX                                                0x1b89
+#define mmCRTC1_CRTC_V_TOTAL_MAX                                                0x1d89
+#define mmCRTC2_CRTC_V_TOTAL_MAX                                                0x1f89
+#define mmCRTC3_CRTC_V_TOTAL_MAX                                                0x4189
+#define mmCRTC4_CRTC_V_TOTAL_MAX                                                0x4389
+#define mmCRTC5_CRTC_V_TOTAL_MAX                                                0x4589
+#define mmCRTC_V_TOTAL_CONTROL                                                  0x1b8a
+#define mmCRTC0_CRTC_V_TOTAL_CONTROL                                            0x1b8a
+#define mmCRTC1_CRTC_V_TOTAL_CONTROL                                            0x1d8a
+#define mmCRTC2_CRTC_V_TOTAL_CONTROL                                            0x1f8a
+#define mmCRTC3_CRTC_V_TOTAL_CONTROL                                            0x418a
+#define mmCRTC4_CRTC_V_TOTAL_CONTROL                                            0x438a
+#define mmCRTC5_CRTC_V_TOTAL_CONTROL                                            0x458a
+#define mmCRTC_V_TOTAL_INT_STATUS                                               0x1b8b
+#define mmCRTC0_CRTC_V_TOTAL_INT_STATUS                                         0x1b8b
+#define mmCRTC1_CRTC_V_TOTAL_INT_STATUS                                         0x1d8b
+#define mmCRTC2_CRTC_V_TOTAL_INT_STATUS                                         0x1f8b
+#define mmCRTC3_CRTC_V_TOTAL_INT_STATUS                                         0x418b
+#define mmCRTC4_CRTC_V_TOTAL_INT_STATUS                                         0x438b
+#define mmCRTC5_CRTC_V_TOTAL_INT_STATUS                                         0x458b
+#define mmCRTC_VSYNC_NOM_INT_STATUS                                             0x1b8c
+#define mmCRTC0_CRTC_VSYNC_NOM_INT_STATUS                                       0x1b8c
+#define mmCRTC1_CRTC_VSYNC_NOM_INT_STATUS                                       0x1d8c
+#define mmCRTC2_CRTC_VSYNC_NOM_INT_STATUS                                       0x1f8c
+#define mmCRTC3_CRTC_VSYNC_NOM_INT_STATUS                                       0x418c
+#define mmCRTC4_CRTC_VSYNC_NOM_INT_STATUS                                       0x438c
+#define mmCRTC5_CRTC_VSYNC_NOM_INT_STATUS                                       0x458c
+#define mmCRTC_V_BLANK_START_END                                                0x1b8d
+#define mmCRTC0_CRTC_V_BLANK_START_END                                          0x1b8d
+#define mmCRTC1_CRTC_V_BLANK_START_END                                          0x1d8d
+#define mmCRTC2_CRTC_V_BLANK_START_END                                          0x1f8d
+#define mmCRTC3_CRTC_V_BLANK_START_END                                          0x418d
+#define mmCRTC4_CRTC_V_BLANK_START_END                                          0x438d
+#define mmCRTC5_CRTC_V_BLANK_START_END                                          0x458d
+#define mmCRTC_V_SYNC_A                                                         0x1b8e
+#define mmCRTC0_CRTC_V_SYNC_A                                                   0x1b8e
+#define mmCRTC1_CRTC_V_SYNC_A                                                   0x1d8e
+#define mmCRTC2_CRTC_V_SYNC_A                                                   0x1f8e
+#define mmCRTC3_CRTC_V_SYNC_A                                                   0x418e
+#define mmCRTC4_CRTC_V_SYNC_A                                                   0x438e
+#define mmCRTC5_CRTC_V_SYNC_A                                                   0x458e
+#define mmCRTC_V_SYNC_A_CNTL                                                    0x1b8f
+#define mmCRTC0_CRTC_V_SYNC_A_CNTL                                              0x1b8f
+#define mmCRTC1_CRTC_V_SYNC_A_CNTL                                              0x1d8f
+#define mmCRTC2_CRTC_V_SYNC_A_CNTL                                              0x1f8f
+#define mmCRTC3_CRTC_V_SYNC_A_CNTL                                              0x418f
+#define mmCRTC4_CRTC_V_SYNC_A_CNTL                                              0x438f
+#define mmCRTC5_CRTC_V_SYNC_A_CNTL                                              0x458f
+#define mmCRTC_V_SYNC_B                                                         0x1b90
+#define mmCRTC0_CRTC_V_SYNC_B                                                   0x1b90
+#define mmCRTC1_CRTC_V_SYNC_B                                                   0x1d90
+#define mmCRTC2_CRTC_V_SYNC_B                                                   0x1f90
+#define mmCRTC3_CRTC_V_SYNC_B                                                   0x4190
+#define mmCRTC4_CRTC_V_SYNC_B                                                   0x4390
+#define mmCRTC5_CRTC_V_SYNC_B                                                   0x4590
+#define mmCRTC_V_SYNC_B_CNTL                                                    0x1b91
+#define mmCRTC0_CRTC_V_SYNC_B_CNTL                                              0x1b91
+#define mmCRTC1_CRTC_V_SYNC_B_CNTL                                              0x1d91
+#define mmCRTC2_CRTC_V_SYNC_B_CNTL                                              0x1f91
+#define mmCRTC3_CRTC_V_SYNC_B_CNTL                                              0x4191
+#define mmCRTC4_CRTC_V_SYNC_B_CNTL                                              0x4391
+#define mmCRTC5_CRTC_V_SYNC_B_CNTL                                              0x4591
+#define mmCRTC_DTMTEST_CNTL                                                     0x1b92
+#define mmCRTC0_CRTC_DTMTEST_CNTL                                               0x1b92
+#define mmCRTC1_CRTC_DTMTEST_CNTL                                               0x1d92
+#define mmCRTC2_CRTC_DTMTEST_CNTL                                               0x1f92
+#define mmCRTC3_CRTC_DTMTEST_CNTL                                               0x4192
+#define mmCRTC4_CRTC_DTMTEST_CNTL                                               0x4392
+#define mmCRTC5_CRTC_DTMTEST_CNTL                                               0x4592
+#define mmCRTC_DTMTEST_STATUS_POSITION                                          0x1b93
+#define mmCRTC0_CRTC_DTMTEST_STATUS_POSITION                                    0x1b93
+#define mmCRTC1_CRTC_DTMTEST_STATUS_POSITION                                    0x1d93
+#define mmCRTC2_CRTC_DTMTEST_STATUS_POSITION                                    0x1f93
+#define mmCRTC3_CRTC_DTMTEST_STATUS_POSITION                                    0x4193
+#define mmCRTC4_CRTC_DTMTEST_STATUS_POSITION                                    0x4393
+#define mmCRTC5_CRTC_DTMTEST_STATUS_POSITION                                    0x4593
+#define mmCRTC_TRIGA_CNTL                                                       0x1b94
+#define mmCRTC0_CRTC_TRIGA_CNTL                                                 0x1b94
+#define mmCRTC1_CRTC_TRIGA_CNTL                                                 0x1d94
+#define mmCRTC2_CRTC_TRIGA_CNTL                                                 0x1f94
+#define mmCRTC3_CRTC_TRIGA_CNTL                                                 0x4194
+#define mmCRTC4_CRTC_TRIGA_CNTL                                                 0x4394
+#define mmCRTC5_CRTC_TRIGA_CNTL                                                 0x4594
+#define mmCRTC_TRIGA_MANUAL_TRIG                                                0x1b95
+#define mmCRTC0_CRTC_TRIGA_MANUAL_TRIG                                          0x1b95
+#define mmCRTC1_CRTC_TRIGA_MANUAL_TRIG                                          0x1d95
+#define mmCRTC2_CRTC_TRIGA_MANUAL_TRIG                                          0x1f95
+#define mmCRTC3_CRTC_TRIGA_MANUAL_TRIG                                          0x4195
+#define mmCRTC4_CRTC_TRIGA_MANUAL_TRIG                                          0x4395
+#define mmCRTC5_CRTC_TRIGA_MANUAL_TRIG                                          0x4595
+#define mmCRTC_TRIGB_CNTL                                                       0x1b96
+#define mmCRTC0_CRTC_TRIGB_CNTL                                                 0x1b96
+#define mmCRTC1_CRTC_TRIGB_CNTL                                                 0x1d96
+#define mmCRTC2_CRTC_TRIGB_CNTL                                                 0x1f96
+#define mmCRTC3_CRTC_TRIGB_CNTL                                                 0x4196
+#define mmCRTC4_CRTC_TRIGB_CNTL                                                 0x4396
+#define mmCRTC5_CRTC_TRIGB_CNTL                                                 0x4596
+#define mmCRTC_TRIGB_MANUAL_TRIG                                                0x1b97
+#define mmCRTC0_CRTC_TRIGB_MANUAL_TRIG                                          0x1b97
+#define mmCRTC1_CRTC_TRIGB_MANUAL_TRIG                                          0x1d97
+#define mmCRTC2_CRTC_TRIGB_MANUAL_TRIG                                          0x1f97
+#define mmCRTC3_CRTC_TRIGB_MANUAL_TRIG                                          0x4197
+#define mmCRTC4_CRTC_TRIGB_MANUAL_TRIG                                          0x4397
+#define mmCRTC5_CRTC_TRIGB_MANUAL_TRIG                                          0x4597
+#define mmCRTC_FORCE_COUNT_NOW_CNTL                                             0x1b98
+#define mmCRTC0_CRTC_FORCE_COUNT_NOW_CNTL                                       0x1b98
+#define mmCRTC1_CRTC_FORCE_COUNT_NOW_CNTL                                       0x1d98
+#define mmCRTC2_CRTC_FORCE_COUNT_NOW_CNTL                                       0x1f98
+#define mmCRTC3_CRTC_FORCE_COUNT_NOW_CNTL                                       0x4198
+#define mmCRTC4_CRTC_FORCE_COUNT_NOW_CNTL                                       0x4398
+#define mmCRTC5_CRTC_FORCE_COUNT_NOW_CNTL                                       0x4598
+#define mmCRTC_FLOW_CONTROL                                                     0x1b99
+#define mmCRTC0_CRTC_FLOW_CONTROL                                               0x1b99
+#define mmCRTC1_CRTC_FLOW_CONTROL                                               0x1d99
+#define mmCRTC2_CRTC_FLOW_CONTROL                                               0x1f99
+#define mmCRTC3_CRTC_FLOW_CONTROL                                               0x4199
+#define mmCRTC4_CRTC_FLOW_CONTROL                                               0x4399
+#define mmCRTC5_CRTC_FLOW_CONTROL                                               0x4599
+#define mmCRTC_STEREO_FORCE_NEXT_EYE                                            0x1b9a
+#define mmCRTC0_CRTC_STEREO_FORCE_NEXT_EYE                                      0x1b9a
+#define mmCRTC1_CRTC_STEREO_FORCE_NEXT_EYE                                      0x1d9a
+#define mmCRTC2_CRTC_STEREO_FORCE_NEXT_EYE                                      0x1f9a
+#define mmCRTC3_CRTC_STEREO_FORCE_NEXT_EYE                                      0x419a
+#define mmCRTC4_CRTC_STEREO_FORCE_NEXT_EYE                                      0x439a
+#define mmCRTC5_CRTC_STEREO_FORCE_NEXT_EYE                                      0x459a
+#define mmCRTC_AVSYNC_COUNTER                                                   0x1b9b
+#define mmCRTC0_CRTC_AVSYNC_COUNTER                                             0x1b9b
+#define mmCRTC1_CRTC_AVSYNC_COUNTER                                             0x1d9b
+#define mmCRTC2_CRTC_AVSYNC_COUNTER                                             0x1f9b
+#define mmCRTC3_CRTC_AVSYNC_COUNTER                                             0x419b
+#define mmCRTC4_CRTC_AVSYNC_COUNTER                                             0x439b
+#define mmCRTC5_CRTC_AVSYNC_COUNTER                                             0x459b
+#define mmCRTC_CONTROL                                                          0x1b9c
+#define mmCRTC0_CRTC_CONTROL                                                    0x1b9c
+#define mmCRTC1_CRTC_CONTROL                                                    0x1d9c
+#define mmCRTC2_CRTC_CONTROL                                                    0x1f9c
+#define mmCRTC3_CRTC_CONTROL                                                    0x419c
+#define mmCRTC4_CRTC_CONTROL                                                    0x439c
+#define mmCRTC5_CRTC_CONTROL                                                    0x459c
+#define mmCRTC_BLANK_CONTROL                                                    0x1b9d
+#define mmCRTC0_CRTC_BLANK_CONTROL                                              0x1b9d
+#define mmCRTC1_CRTC_BLANK_CONTROL                                              0x1d9d
+#define mmCRTC2_CRTC_BLANK_CONTROL                                              0x1f9d
+#define mmCRTC3_CRTC_BLANK_CONTROL                                              0x419d
+#define mmCRTC4_CRTC_BLANK_CONTROL                                              0x439d
+#define mmCRTC5_CRTC_BLANK_CONTROL                                              0x459d
+#define mmCRTC_INTERLACE_CONTROL                                                0x1b9e
+#define mmCRTC0_CRTC_INTERLACE_CONTROL                                          0x1b9e
+#define mmCRTC1_CRTC_INTERLACE_CONTROL                                          0x1d9e
+#define mmCRTC2_CRTC_INTERLACE_CONTROL                                          0x1f9e
+#define mmCRTC3_CRTC_INTERLACE_CONTROL                                          0x419e
+#define mmCRTC4_CRTC_INTERLACE_CONTROL                                          0x439e
+#define mmCRTC5_CRTC_INTERLACE_CONTROL                                          0x459e
+#define mmCRTC_INTERLACE_STATUS                                                 0x1b9f
+#define mmCRTC0_CRTC_INTERLACE_STATUS                                           0x1b9f
+#define mmCRTC1_CRTC_INTERLACE_STATUS                                           0x1d9f
+#define mmCRTC2_CRTC_INTERLACE_STATUS                                           0x1f9f
+#define mmCRTC3_CRTC_INTERLACE_STATUS                                           0x419f
+#define mmCRTC4_CRTC_INTERLACE_STATUS                                           0x439f
+#define mmCRTC5_CRTC_INTERLACE_STATUS                                           0x459f
+#define mmCRTC_FIELD_INDICATION_CONTROL                                         0x1ba0
+#define mmCRTC0_CRTC_FIELD_INDICATION_CONTROL                                   0x1ba0
+#define mmCRTC1_CRTC_FIELD_INDICATION_CONTROL                                   0x1da0
+#define mmCRTC2_CRTC_FIELD_INDICATION_CONTROL                                   0x1fa0
+#define mmCRTC3_CRTC_FIELD_INDICATION_CONTROL                                   0x41a0
+#define mmCRTC4_CRTC_FIELD_INDICATION_CONTROL                                   0x43a0
+#define mmCRTC5_CRTC_FIELD_INDICATION_CONTROL                                   0x45a0
+#define mmCRTC_PIXEL_DATA_READBACK0                                             0x1ba1
+#define mmCRTC0_CRTC_PIXEL_DATA_READBACK0                                       0x1ba1
+#define mmCRTC1_CRTC_PIXEL_DATA_READBACK0                                       0x1da1
+#define mmCRTC2_CRTC_PIXEL_DATA_READBACK0                                       0x1fa1
+#define mmCRTC3_CRTC_PIXEL_DATA_READBACK0                                       0x41a1
+#define mmCRTC4_CRTC_PIXEL_DATA_READBACK0                                       0x43a1
+#define mmCRTC5_CRTC_PIXEL_DATA_READBACK0                                       0x45a1
+#define mmCRTC_PIXEL_DATA_READBACK1                                             0x1ba2
+#define mmCRTC0_CRTC_PIXEL_DATA_READBACK1                                       0x1ba2
+#define mmCRTC1_CRTC_PIXEL_DATA_READBACK1                                       0x1da2
+#define mmCRTC2_CRTC_PIXEL_DATA_READBACK1                                       0x1fa2
+#define mmCRTC3_CRTC_PIXEL_DATA_READBACK1                                       0x41a2
+#define mmCRTC4_CRTC_PIXEL_DATA_READBACK1                                       0x43a2
+#define mmCRTC5_CRTC_PIXEL_DATA_READBACK1                                       0x45a2
+#define mmCRTC_STATUS                                                           0x1ba3
+#define mmCRTC0_CRTC_STATUS                                                     0x1ba3
+#define mmCRTC1_CRTC_STATUS                                                     0x1da3
+#define mmCRTC2_CRTC_STATUS                                                     0x1fa3
+#define mmCRTC3_CRTC_STATUS                                                     0x41a3
+#define mmCRTC4_CRTC_STATUS                                                     0x43a3
+#define mmCRTC5_CRTC_STATUS                                                     0x45a3
+#define mmCRTC_STATUS_POSITION                                                  0x1ba4
+#define mmCRTC0_CRTC_STATUS_POSITION                                            0x1ba4
+#define mmCRTC1_CRTC_STATUS_POSITION                                            0x1da4
+#define mmCRTC2_CRTC_STATUS_POSITION                                            0x1fa4
+#define mmCRTC3_CRTC_STATUS_POSITION                                            0x41a4
+#define mmCRTC4_CRTC_STATUS_POSITION                                            0x43a4
+#define mmCRTC5_CRTC_STATUS_POSITION                                            0x45a4
+#define mmCRTC_NOM_VERT_POSITION                                                0x1ba5
+#define mmCRTC0_CRTC_NOM_VERT_POSITION                                          0x1ba5
+#define mmCRTC1_CRTC_NOM_VERT_POSITION                                          0x1da5
+#define mmCRTC2_CRTC_NOM_VERT_POSITION                                          0x1fa5
+#define mmCRTC3_CRTC_NOM_VERT_POSITION                                          0x41a5
+#define mmCRTC4_CRTC_NOM_VERT_POSITION                                          0x43a5
+#define mmCRTC5_CRTC_NOM_VERT_POSITION                                          0x45a5
+#define mmCRTC_STATUS_FRAME_COUNT                                               0x1ba6
+#define mmCRTC0_CRTC_STATUS_FRAME_COUNT                                         0x1ba6
+#define mmCRTC1_CRTC_STATUS_FRAME_COUNT                                         0x1da6
+#define mmCRTC2_CRTC_STATUS_FRAME_COUNT                                         0x1fa6
+#define mmCRTC3_CRTC_STATUS_FRAME_COUNT                                         0x41a6
+#define mmCRTC4_CRTC_STATUS_FRAME_COUNT                                         0x43a6
+#define mmCRTC5_CRTC_STATUS_FRAME_COUNT                                         0x45a6
+#define mmCRTC_STATUS_VF_COUNT                                                  0x1ba7
+#define mmCRTC0_CRTC_STATUS_VF_COUNT                                            0x1ba7
+#define mmCRTC1_CRTC_STATUS_VF_COUNT                                            0x1da7
+#define mmCRTC2_CRTC_STATUS_VF_COUNT                                            0x1fa7
+#define mmCRTC3_CRTC_STATUS_VF_COUNT                                            0x41a7
+#define mmCRTC4_CRTC_STATUS_VF_COUNT                                            0x43a7
+#define mmCRTC5_CRTC_STATUS_VF_COUNT                                            0x45a7
+#define mmCRTC_STATUS_HV_COUNT                                                  0x1ba8
+#define mmCRTC0_CRTC_STATUS_HV_COUNT                                            0x1ba8
+#define mmCRTC1_CRTC_STATUS_HV_COUNT                                            0x1da8
+#define mmCRTC2_CRTC_STATUS_HV_COUNT                                            0x1fa8
+#define mmCRTC3_CRTC_STATUS_HV_COUNT                                            0x41a8
+#define mmCRTC4_CRTC_STATUS_HV_COUNT                                            0x43a8
+#define mmCRTC5_CRTC_STATUS_HV_COUNT                                            0x45a8
+#define mmCRTC_COUNT_CONTROL                                                    0x1ba9
+#define mmCRTC0_CRTC_COUNT_CONTROL                                              0x1ba9
+#define mmCRTC1_CRTC_COUNT_CONTROL                                              0x1da9
+#define mmCRTC2_CRTC_COUNT_CONTROL                                              0x1fa9
+#define mmCRTC3_CRTC_COUNT_CONTROL                                              0x41a9
+#define mmCRTC4_CRTC_COUNT_CONTROL                                              0x43a9
+#define mmCRTC5_CRTC_COUNT_CONTROL                                              0x45a9
+#define mmCRTC_COUNT_RESET                                                      0x1baa
+#define mmCRTC0_CRTC_COUNT_RESET                                                0x1baa
+#define mmCRTC1_CRTC_COUNT_RESET                                                0x1daa
+#define mmCRTC2_CRTC_COUNT_RESET                                                0x1faa
+#define mmCRTC3_CRTC_COUNT_RESET                                                0x41aa
+#define mmCRTC4_CRTC_COUNT_RESET                                                0x43aa
+#define mmCRTC5_CRTC_COUNT_RESET                                                0x45aa
+#define mmCRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                                     0x1bab
+#define mmCRTC0_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x1bab
+#define mmCRTC1_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x1dab
+#define mmCRTC2_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x1fab
+#define mmCRTC3_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x41ab
+#define mmCRTC4_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x43ab
+#define mmCRTC5_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE                               0x45ab
+#define mmCRTC_VERT_SYNC_CONTROL                                                0x1bac
+#define mmCRTC0_CRTC_VERT_SYNC_CONTROL                                          0x1bac
+#define mmCRTC1_CRTC_VERT_SYNC_CONTROL                                          0x1dac
+#define mmCRTC2_CRTC_VERT_SYNC_CONTROL                                          0x1fac
+#define mmCRTC3_CRTC_VERT_SYNC_CONTROL                                          0x41ac
+#define mmCRTC4_CRTC_VERT_SYNC_CONTROL                                          0x43ac
+#define mmCRTC5_CRTC_VERT_SYNC_CONTROL                                          0x45ac
+#define mmCRTC_STEREO_STATUS                                                    0x1bad
+#define mmCRTC0_CRTC_STEREO_STATUS                                              0x1bad
+#define mmCRTC1_CRTC_STEREO_STATUS                                              0x1dad
+#define mmCRTC2_CRTC_STEREO_STATUS                                              0x1fad
+#define mmCRTC3_CRTC_STEREO_STATUS                                              0x41ad
+#define mmCRTC4_CRTC_STEREO_STATUS                                              0x43ad
+#define mmCRTC5_CRTC_STEREO_STATUS                                              0x45ad
+#define mmCRTC_STEREO_CONTROL                                                   0x1bae
+#define mmCRTC0_CRTC_STEREO_CONTROL                                             0x1bae
+#define mmCRTC1_CRTC_STEREO_CONTROL                                             0x1dae
+#define mmCRTC2_CRTC_STEREO_CONTROL                                             0x1fae
+#define mmCRTC3_CRTC_STEREO_CONTROL                                             0x41ae
+#define mmCRTC4_CRTC_STEREO_CONTROL                                             0x43ae
+#define mmCRTC5_CRTC_STEREO_CONTROL                                             0x45ae
+#define mmCRTC_SNAPSHOT_STATUS                                                  0x1baf
+#define mmCRTC0_CRTC_SNAPSHOT_STATUS                                            0x1baf
+#define mmCRTC1_CRTC_SNAPSHOT_STATUS                                            0x1daf
+#define mmCRTC2_CRTC_SNAPSHOT_STATUS                                            0x1faf
+#define mmCRTC3_CRTC_SNAPSHOT_STATUS                                            0x41af
+#define mmCRTC4_CRTC_SNAPSHOT_STATUS                                            0x43af
+#define mmCRTC5_CRTC_SNAPSHOT_STATUS                                            0x45af
+#define mmCRTC_SNAPSHOT_CONTROL                                                 0x1bb0
+#define mmCRTC0_CRTC_SNAPSHOT_CONTROL                                           0x1bb0
+#define mmCRTC1_CRTC_SNAPSHOT_CONTROL                                           0x1db0
+#define mmCRTC2_CRTC_SNAPSHOT_CONTROL                                           0x1fb0
+#define mmCRTC3_CRTC_SNAPSHOT_CONTROL                                           0x41b0
+#define mmCRTC4_CRTC_SNAPSHOT_CONTROL                                           0x43b0
+#define mmCRTC5_CRTC_SNAPSHOT_CONTROL                                           0x45b0
+#define mmCRTC_SNAPSHOT_POSITION                                                0x1bb1
+#define mmCRTC0_CRTC_SNAPSHOT_POSITION                                          0x1bb1
+#define mmCRTC1_CRTC_SNAPSHOT_POSITION                                          0x1db1
+#define mmCRTC2_CRTC_SNAPSHOT_POSITION                                          0x1fb1
+#define mmCRTC3_CRTC_SNAPSHOT_POSITION                                          0x41b1
+#define mmCRTC4_CRTC_SNAPSHOT_POSITION                                          0x43b1
+#define mmCRTC5_CRTC_SNAPSHOT_POSITION                                          0x45b1
+#define mmCRTC_SNAPSHOT_FRAME                                                   0x1bb2
+#define mmCRTC0_CRTC_SNAPSHOT_FRAME                                             0x1bb2
+#define mmCRTC1_CRTC_SNAPSHOT_FRAME                                             0x1db2
+#define mmCRTC2_CRTC_SNAPSHOT_FRAME                                             0x1fb2
+#define mmCRTC3_CRTC_SNAPSHOT_FRAME                                             0x41b2
+#define mmCRTC4_CRTC_SNAPSHOT_FRAME                                             0x43b2
+#define mmCRTC5_CRTC_SNAPSHOT_FRAME                                             0x45b2
+#define mmCRTC_START_LINE_CONTROL                                               0x1bb3
+#define mmCRTC0_CRTC_START_LINE_CONTROL                                         0x1bb3
+#define mmCRTC1_CRTC_START_LINE_CONTROL                                         0x1db3
+#define mmCRTC2_CRTC_START_LINE_CONTROL                                         0x1fb3
+#define mmCRTC3_CRTC_START_LINE_CONTROL                                         0x41b3
+#define mmCRTC4_CRTC_START_LINE_CONTROL                                         0x43b3
+#define mmCRTC5_CRTC_START_LINE_CONTROL                                         0x45b3
+#define mmCRTC_INTERRUPT_CONTROL                                                0x1bb4
+#define mmCRTC0_CRTC_INTERRUPT_CONTROL                                          0x1bb4
+#define mmCRTC1_CRTC_INTERRUPT_CONTROL                                          0x1db4
+#define mmCRTC2_CRTC_INTERRUPT_CONTROL                                          0x1fb4
+#define mmCRTC3_CRTC_INTERRUPT_CONTROL                                          0x41b4
+#define mmCRTC4_CRTC_INTERRUPT_CONTROL                                          0x43b4
+#define mmCRTC5_CRTC_INTERRUPT_CONTROL                                          0x45b4
+#define mmCRTC_UPDATE_LOCK                                                      0x1bb5
+#define mmCRTC0_CRTC_UPDATE_LOCK                                                0x1bb5
+#define mmCRTC1_CRTC_UPDATE_LOCK                                                0x1db5
+#define mmCRTC2_CRTC_UPDATE_LOCK                                                0x1fb5
+#define mmCRTC3_CRTC_UPDATE_LOCK                                                0x41b5
+#define mmCRTC4_CRTC_UPDATE_LOCK                                                0x43b5
+#define mmCRTC5_CRTC_UPDATE_LOCK                                                0x45b5
+#define mmCRTC_DOUBLE_BUFFER_CONTROL                                            0x1bb6
+#define mmCRTC0_CRTC_DOUBLE_BUFFER_CONTROL                                      0x1bb6
+#define mmCRTC1_CRTC_DOUBLE_BUFFER_CONTROL                                      0x1db6
+#define mmCRTC2_CRTC_DOUBLE_BUFFER_CONTROL                                      0x1fb6
+#define mmCRTC3_CRTC_DOUBLE_BUFFER_CONTROL                                      0x41b6
+#define mmCRTC4_CRTC_DOUBLE_BUFFER_CONTROL                                      0x43b6
+#define mmCRTC5_CRTC_DOUBLE_BUFFER_CONTROL                                      0x45b6
+#define mmCRTC_VGA_PARAMETER_CAPTURE_MODE                                       0x1bb7
+#define mmCRTC0_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x1bb7
+#define mmCRTC1_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x1db7
+#define mmCRTC2_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x1fb7
+#define mmCRTC3_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x41b7
+#define mmCRTC4_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x43b7
+#define mmCRTC5_CRTC_VGA_PARAMETER_CAPTURE_MODE                                 0x45b7
+#define mmCRTC_TEST_PATTERN_CONTROL                                             0x1bba
+#define mmCRTC0_CRTC_TEST_PATTERN_CONTROL                                       0x1bba
+#define mmCRTC1_CRTC_TEST_PATTERN_CONTROL                                       0x1dba
+#define mmCRTC2_CRTC_TEST_PATTERN_CONTROL                                       0x1fba
+#define mmCRTC3_CRTC_TEST_PATTERN_CONTROL                                       0x41ba
+#define mmCRTC4_CRTC_TEST_PATTERN_CONTROL                                       0x43ba
+#define mmCRTC5_CRTC_TEST_PATTERN_CONTROL                                       0x45ba
+#define mmCRTC_TEST_PATTERN_PARAMETERS                                          0x1bbb
+#define mmCRTC0_CRTC_TEST_PATTERN_PARAMETERS                                    0x1bbb
+#define mmCRTC1_CRTC_TEST_PATTERN_PARAMETERS                                    0x1dbb
+#define mmCRTC2_CRTC_TEST_PATTERN_PARAMETERS                                    0x1fbb
+#define mmCRTC3_CRTC_TEST_PATTERN_PARAMETERS                                    0x41bb
+#define mmCRTC4_CRTC_TEST_PATTERN_PARAMETERS                                    0x43bb
+#define mmCRTC5_CRTC_TEST_PATTERN_PARAMETERS                                    0x45bb
+#define mmCRTC_TEST_PATTERN_COLOR                                               0x1bbc
+#define mmCRTC0_CRTC_TEST_PATTERN_COLOR                                         0x1bbc
+#define mmCRTC1_CRTC_TEST_PATTERN_COLOR                                         0x1dbc
+#define mmCRTC2_CRTC_TEST_PATTERN_COLOR                                         0x1fbc
+#define mmCRTC3_CRTC_TEST_PATTERN_COLOR                                         0x41bc
+#define mmCRTC4_CRTC_TEST_PATTERN_COLOR                                         0x43bc
+#define mmCRTC5_CRTC_TEST_PATTERN_COLOR                                         0x45bc
+#define mmCRTC_MASTER_UPDATE_LOCK                                               0x1bbd
+#define mmCRTC0_CRTC_MASTER_UPDATE_LOCK                                         0x1bbd
+#define mmCRTC1_CRTC_MASTER_UPDATE_LOCK                                         0x1dbd
+#define mmCRTC2_CRTC_MASTER_UPDATE_LOCK                                         0x1fbd
+#define mmCRTC3_CRTC_MASTER_UPDATE_LOCK                                         0x41bd
+#define mmCRTC4_CRTC_MASTER_UPDATE_LOCK                                         0x43bd
+#define mmCRTC5_CRTC_MASTER_UPDATE_LOCK                                         0x45bd
+#define mmCRTC_MASTER_UPDATE_MODE                                               0x1bbe
+#define mmCRTC0_CRTC_MASTER_UPDATE_MODE                                         0x1bbe
+#define mmCRTC1_CRTC_MASTER_UPDATE_MODE                                         0x1dbe
+#define mmCRTC2_CRTC_MASTER_UPDATE_MODE                                         0x1fbe
+#define mmCRTC3_CRTC_MASTER_UPDATE_MODE                                         0x41be
+#define mmCRTC4_CRTC_MASTER_UPDATE_MODE                                         0x43be
+#define mmCRTC5_CRTC_MASTER_UPDATE_MODE                                         0x45be
+#define mmCRTC_MVP_INBAND_CNTL_INSERT                                           0x1bbf
+#define mmCRTC0_CRTC_MVP_INBAND_CNTL_INSERT                                     0x1bbf
+#define mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT                                     0x1dbf
+#define mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT                                     0x1fbf
+#define mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT                                     0x41bf
+#define mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT                                     0x43bf
+#define mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT                                     0x45bf
+#define mmCRTC_MVP_INBAND_CNTL_INSERT_TIMER                                     0x1bc0
+#define mmCRTC0_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x1bc0
+#define mmCRTC1_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x1dc0
+#define mmCRTC2_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x1fc0
+#define mmCRTC3_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x41c0
+#define mmCRTC4_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x43c0
+#define mmCRTC5_CRTC_MVP_INBAND_CNTL_INSERT_TIMER                               0x45c0
+#define mmCRTC_MVP_STATUS                                                       0x1bc1
+#define mmCRTC0_CRTC_MVP_STATUS                                                 0x1bc1
+#define mmCRTC1_CRTC_MVP_STATUS                                                 0x1dc1
+#define mmCRTC2_CRTC_MVP_STATUS                                                 0x1fc1
+#define mmCRTC3_CRTC_MVP_STATUS                                                 0x41c1
+#define mmCRTC4_CRTC_MVP_STATUS                                                 0x43c1
+#define mmCRTC5_CRTC_MVP_STATUS                                                 0x45c1
+#define mmCRTC_MASTER_EN                                                        0x1bc2
+#define mmCRTC0_CRTC_MASTER_EN                                                  0x1bc2
+#define mmCRTC1_CRTC_MASTER_EN                                                  0x1dc2
+#define mmCRTC2_CRTC_MASTER_EN                                                  0x1fc2
+#define mmCRTC3_CRTC_MASTER_EN                                                  0x41c2
+#define mmCRTC4_CRTC_MASTER_EN                                                  0x43c2
+#define mmCRTC5_CRTC_MASTER_EN                                                  0x45c2
+#define mmCRTC_ALLOW_STOP_OFF_V_CNT                                             0x1bc3
+#define mmCRTC0_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x1bc3
+#define mmCRTC1_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x1dc3
+#define mmCRTC2_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x1fc3
+#define mmCRTC3_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x41c3
+#define mmCRTC4_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x43c3
+#define mmCRTC5_CRTC_ALLOW_STOP_OFF_V_CNT                                       0x45c3
+#define mmCRTC_V_UPDATE_INT_STATUS                                              0x1bc4
+#define mmCRTC0_CRTC_V_UPDATE_INT_STATUS                                        0x1bc4
+#define mmCRTC1_CRTC_V_UPDATE_INT_STATUS                                        0x1dc4
+#define mmCRTC2_CRTC_V_UPDATE_INT_STATUS                                        0x1fc4
+#define mmCRTC3_CRTC_V_UPDATE_INT_STATUS                                        0x41c4
+#define mmCRTC4_CRTC_V_UPDATE_INT_STATUS                                        0x43c4
+#define mmCRTC5_CRTC_V_UPDATE_INT_STATUS                                        0x45c4
+#define mmCRTC_OVERSCAN_COLOR                                                   0x1bc8
+#define mmCRTC0_CRTC_OVERSCAN_COLOR                                             0x1bc8
+#define mmCRTC1_CRTC_OVERSCAN_COLOR                                             0x1dc8
+#define mmCRTC2_CRTC_OVERSCAN_COLOR                                             0x1fc8
+#define mmCRTC3_CRTC_OVERSCAN_COLOR                                             0x41c8
+#define mmCRTC4_CRTC_OVERSCAN_COLOR                                             0x43c8
+#define mmCRTC5_CRTC_OVERSCAN_COLOR                                             0x45c8
+#define mmCRTC_OVERSCAN_COLOR_EXT                                               0x1bc9
+#define mmCRTC0_CRTC_OVERSCAN_COLOR_EXT                                         0x1bc9
+#define mmCRTC1_CRTC_OVERSCAN_COLOR_EXT                                         0x1dc9
+#define mmCRTC2_CRTC_OVERSCAN_COLOR_EXT                                         0x1fc9
+#define mmCRTC3_CRTC_OVERSCAN_COLOR_EXT                                         0x41c9
+#define mmCRTC4_CRTC_OVERSCAN_COLOR_EXT                                         0x43c9
+#define mmCRTC5_CRTC_OVERSCAN_COLOR_EXT                                         0x45c9
+#define mmCRTC_BLANK_DATA_COLOR                                                 0x1bca
+#define mmCRTC0_CRTC_BLANK_DATA_COLOR                                           0x1bca
+#define mmCRTC1_CRTC_BLANK_DATA_COLOR                                           0x1dca
+#define mmCRTC2_CRTC_BLANK_DATA_COLOR                                           0x1fca
+#define mmCRTC3_CRTC_BLANK_DATA_COLOR                                           0x41ca
+#define mmCRTC4_CRTC_BLANK_DATA_COLOR                                           0x43ca
+#define mmCRTC5_CRTC_BLANK_DATA_COLOR                                           0x45ca
+#define mmCRTC_BLANK_DATA_COLOR_EXT                                             0x1bcb
+#define mmCRTC0_CRTC_BLANK_DATA_COLOR_EXT                                       0x1bcb
+#define mmCRTC1_CRTC_BLANK_DATA_COLOR_EXT                                       0x1dcb
+#define mmCRTC2_CRTC_BLANK_DATA_COLOR_EXT                                       0x1fcb
+#define mmCRTC3_CRTC_BLANK_DATA_COLOR_EXT                                       0x41cb
+#define mmCRTC4_CRTC_BLANK_DATA_COLOR_EXT                                       0x43cb
+#define mmCRTC5_CRTC_BLANK_DATA_COLOR_EXT                                       0x45cb
+#define mmCRTC_BLACK_COLOR                                                      0x1bcc
+#define mmCRTC0_CRTC_BLACK_COLOR                                                0x1bcc
+#define mmCRTC1_CRTC_BLACK_COLOR                                                0x1dcc
+#define mmCRTC2_CRTC_BLACK_COLOR                                                0x1fcc
+#define mmCRTC3_CRTC_BLACK_COLOR                                                0x41cc
+#define mmCRTC4_CRTC_BLACK_COLOR                                                0x43cc
+#define mmCRTC5_CRTC_BLACK_COLOR                                                0x45cc
+#define mmCRTC_BLACK_COLOR_EXT                                                  0x1bcd
+#define mmCRTC0_CRTC_BLACK_COLOR_EXT                                            0x1bcd
+#define mmCRTC1_CRTC_BLACK_COLOR_EXT                                            0x1dcd
+#define mmCRTC2_CRTC_BLACK_COLOR_EXT                                            0x1fcd
+#define mmCRTC3_CRTC_BLACK_COLOR_EXT                                            0x41cd
+#define mmCRTC4_CRTC_BLACK_COLOR_EXT                                            0x43cd
+#define mmCRTC5_CRTC_BLACK_COLOR_EXT                                            0x45cd
+#define mmCRTC_VERTICAL_INTERRUPT0_POSITION                                     0x1bce
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x1bce
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x1dce
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x1fce
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x41ce
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x43ce
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT0_POSITION                               0x45ce
+#define mmCRTC_VERTICAL_INTERRUPT0_CONTROL                                      0x1bcf
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x1bcf
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x1dcf
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x1fcf
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x41cf
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x43cf
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT0_CONTROL                                0x45cf
+#define mmCRTC_VERTICAL_INTERRUPT1_POSITION                                     0x1bd0
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x1bd0
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x1dd0
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x1fd0
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x41d0
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x43d0
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT1_POSITION                               0x45d0
+#define mmCRTC_VERTICAL_INTERRUPT1_CONTROL                                      0x1bd1
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x1bd1
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x1dd1
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x1fd1
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x41d1
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x43d1
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT1_CONTROL                                0x45d1
+#define mmCRTC_VERTICAL_INTERRUPT2_POSITION                                     0x1bd2
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x1bd2
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x1dd2
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x1fd2
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x41d2
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x43d2
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT2_POSITION                               0x45d2
+#define mmCRTC_VERTICAL_INTERRUPT2_CONTROL                                      0x1bd3
+#define mmCRTC0_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x1bd3
+#define mmCRTC1_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x1dd3
+#define mmCRTC2_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x1fd3
+#define mmCRTC3_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x41d3
+#define mmCRTC4_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x43d3
+#define mmCRTC5_CRTC_VERTICAL_INTERRUPT2_CONTROL                                0x45d3
+#define mmCRTC_CRC_CNTL                                                         0x1bd4
+#define mmCRTC0_CRTC_CRC_CNTL                                                   0x1bd4
+#define mmCRTC1_CRTC_CRC_CNTL                                                   0x1dd4
+#define mmCRTC2_CRTC_CRC_CNTL                                                   0x1fd4
+#define mmCRTC3_CRTC_CRC_CNTL                                                   0x41d4
+#define mmCRTC4_CRTC_CRC_CNTL                                                   0x43d4
+#define mmCRTC5_CRTC_CRC_CNTL                                                   0x45d4
+#define mmCRTC_CRC0_WINDOWA_X_CONTROL                                           0x1bd5
+#define mmCRTC0_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x1bd5
+#define mmCRTC1_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x1dd5
+#define mmCRTC2_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x1fd5
+#define mmCRTC3_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x41d5
+#define mmCRTC4_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x43d5
+#define mmCRTC5_CRTC_CRC0_WINDOWA_X_CONTROL                                     0x45d5
+#define mmCRTC_CRC0_WINDOWA_Y_CONTROL                                           0x1bd6
+#define mmCRTC0_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x1bd6
+#define mmCRTC1_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x1dd6
+#define mmCRTC2_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x1fd6
+#define mmCRTC3_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x41d6
+#define mmCRTC4_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x43d6
+#define mmCRTC5_CRTC_CRC0_WINDOWA_Y_CONTROL                                     0x45d6
+#define mmCRTC_CRC0_WINDOWB_X_CONTROL                                           0x1bd7
+#define mmCRTC0_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x1bd7
+#define mmCRTC1_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x1dd7
+#define mmCRTC2_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x1fd7
+#define mmCRTC3_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x41d7
+#define mmCRTC4_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x43d7
+#define mmCRTC5_CRTC_CRC0_WINDOWB_X_CONTROL                                     0x45d7
+#define mmCRTC_CRC0_WINDOWB_Y_CONTROL                                           0x1bd8
+#define mmCRTC0_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x1bd8
+#define mmCRTC1_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x1dd8
+#define mmCRTC2_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x1fd8
+#define mmCRTC3_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x41d8
+#define mmCRTC4_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x43d8
+#define mmCRTC5_CRTC_CRC0_WINDOWB_Y_CONTROL                                     0x45d8
+#define mmCRTC_CRC0_DATA_RG                                                     0x1bd9
+#define mmCRTC0_CRTC_CRC0_DATA_RG                                               0x1bd9
+#define mmCRTC1_CRTC_CRC0_DATA_RG                                               0x1dd9
+#define mmCRTC2_CRTC_CRC0_DATA_RG                                               0x1fd9
+#define mmCRTC3_CRTC_CRC0_DATA_RG                                               0x41d9
+#define mmCRTC4_CRTC_CRC0_DATA_RG                                               0x43d9
+#define mmCRTC5_CRTC_CRC0_DATA_RG                                               0x45d9
+#define mmCRTC_CRC0_DATA_B                                                      0x1bda
+#define mmCRTC0_CRTC_CRC0_DATA_B                                                0x1bda
+#define mmCRTC1_CRTC_CRC0_DATA_B                                                0x1dda
+#define mmCRTC2_CRTC_CRC0_DATA_B                                                0x1fda
+#define mmCRTC3_CRTC_CRC0_DATA_B                                                0x41da
+#define mmCRTC4_CRTC_CRC0_DATA_B                                                0x43da
+#define mmCRTC5_CRTC_CRC0_DATA_B                                                0x45da
+#define mmCRTC_CRC1_WINDOWA_X_CONTROL                                           0x1bdb
+#define mmCRTC0_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x1bdb
+#define mmCRTC1_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x1ddb
+#define mmCRTC2_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x1fdb
+#define mmCRTC3_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x41db
+#define mmCRTC4_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x43db
+#define mmCRTC5_CRTC_CRC1_WINDOWA_X_CONTROL                                     0x45db
+#define mmCRTC_CRC1_WINDOWA_Y_CONTROL                                           0x1bdc
+#define mmCRTC0_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x1bdc
+#define mmCRTC1_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x1ddc
+#define mmCRTC2_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x1fdc
+#define mmCRTC3_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x41dc
+#define mmCRTC4_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x43dc
+#define mmCRTC5_CRTC_CRC1_WINDOWA_Y_CONTROL                                     0x45dc
+#define mmCRTC_CRC1_WINDOWB_X_CONTROL                                           0x1bdd
+#define mmCRTC0_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x1bdd
+#define mmCRTC1_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x1ddd
+#define mmCRTC2_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x1fdd
+#define mmCRTC3_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x41dd
+#define mmCRTC4_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x43dd
+#define mmCRTC5_CRTC_CRC1_WINDOWB_X_CONTROL                                     0x45dd
+#define mmCRTC_CRC1_WINDOWB_Y_CONTROL                                           0x1bde
+#define mmCRTC0_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x1bde
+#define mmCRTC1_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x1dde
+#define mmCRTC2_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x1fde
+#define mmCRTC3_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x41de
+#define mmCRTC4_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x43de
+#define mmCRTC5_CRTC_CRC1_WINDOWB_Y_CONTROL                                     0x45de
+#define mmCRTC_CRC1_DATA_RG                                                     0x1bdf
+#define mmCRTC0_CRTC_CRC1_DATA_RG                                               0x1bdf
+#define mmCRTC1_CRTC_CRC1_DATA_RG                                               0x1ddf
+#define mmCRTC2_CRTC_CRC1_DATA_RG                                               0x1fdf
+#define mmCRTC3_CRTC_CRC1_DATA_RG                                               0x41df
+#define mmCRTC4_CRTC_CRC1_DATA_RG                                               0x43df
+#define mmCRTC5_CRTC_CRC1_DATA_RG                                               0x45df
+#define mmCRTC_CRC1_DATA_B                                                      0x1be0
+#define mmCRTC0_CRTC_CRC1_DATA_B                                                0x1be0
+#define mmCRTC1_CRTC_CRC1_DATA_B                                                0x1de0
+#define mmCRTC2_CRTC_CRC1_DATA_B                                                0x1fe0
+#define mmCRTC3_CRTC_CRC1_DATA_B                                                0x41e0
+#define mmCRTC4_CRTC_CRC1_DATA_B                                                0x43e0
+#define mmCRTC5_CRTC_CRC1_DATA_B                                                0x45e0
+#define mmCRTC_EXT_TIMING_SYNC_CONTROL                                          0x1be1
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x1be1
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x1de1
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x1fe1
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x41e1
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x43e1
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_CONTROL                                    0x45e1
+#define mmCRTC_EXT_TIMING_SYNC_WINDOW_START                                     0x1be2
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x1be2
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x1de2
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x1fe2
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x41e2
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x43e2
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_WINDOW_START                               0x45e2
+#define mmCRTC_EXT_TIMING_SYNC_WINDOW_END                                       0x1be3
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x1be3
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x1de3
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x1fe3
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x41e3
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x43e3
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_WINDOW_END                                 0x45e3
+#define mmCRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                           0x1be4
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x1be4
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x1de4
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x1fe4
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x41e4
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x43e4
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL                     0x45e4
+#define mmCRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                                0x1be5
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x1be5
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x1de5
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x1fe5
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x41e5
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x43e5
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL                          0x45e5
+#define mmCRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                         0x1be6
+#define mmCRTC0_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x1be6
+#define mmCRTC1_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x1de6
+#define mmCRTC2_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x1fe6
+#define mmCRTC3_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x41e6
+#define mmCRTC4_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x43e6
+#define mmCRTC5_CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL                   0x45e6
+#define mmCRTC_STATIC_SCREEN_CONTROL                                            0x1be7
+#define mmCRTC0_CRTC_STATIC_SCREEN_CONTROL                                      0x1be7
+#define mmCRTC1_CRTC_STATIC_SCREEN_CONTROL                                      0x1de7
+#define mmCRTC2_CRTC_STATIC_SCREEN_CONTROL                                      0x1fe7
+#define mmCRTC3_CRTC_STATIC_SCREEN_CONTROL                                      0x41e7
+#define mmCRTC4_CRTC_STATIC_SCREEN_CONTROL                                      0x43e7
+#define mmCRTC5_CRTC_STATIC_SCREEN_CONTROL                                      0x45e7
+#define mmCRTC_3D_STRUCTURE_CONTROL                                             0x1b78
+#define mmCRTC0_CRTC_3D_STRUCTURE_CONTROL                                       0x1b78
+#define mmCRTC1_CRTC_3D_STRUCTURE_CONTROL                                       0x1d78
+#define mmCRTC2_CRTC_3D_STRUCTURE_CONTROL                                       0x1f78
+#define mmCRTC3_CRTC_3D_STRUCTURE_CONTROL                                       0x4178
+#define mmCRTC4_CRTC_3D_STRUCTURE_CONTROL                                       0x4378
+#define mmCRTC5_CRTC_3D_STRUCTURE_CONTROL                                       0x4578
+#define mmCRTC_GSL_VSYNC_GAP                                                    0x1b79
+#define mmCRTC0_CRTC_GSL_VSYNC_GAP                                              0x1b79
+#define mmCRTC1_CRTC_GSL_VSYNC_GAP                                              0x1d79
+#define mmCRTC2_CRTC_GSL_VSYNC_GAP                                              0x1f79
+#define mmCRTC3_CRTC_GSL_VSYNC_GAP                                              0x4179
+#define mmCRTC4_CRTC_GSL_VSYNC_GAP                                              0x4379
+#define mmCRTC5_CRTC_GSL_VSYNC_GAP                                              0x4579
+#define mmCRTC_GSL_WINDOW                                                       0x1b7a
+#define mmCRTC0_CRTC_GSL_WINDOW                                                 0x1b7a
+#define mmCRTC1_CRTC_GSL_WINDOW                                                 0x1d7a
+#define mmCRTC2_CRTC_GSL_WINDOW                                                 0x1f7a
+#define mmCRTC3_CRTC_GSL_WINDOW                                                 0x417a
+#define mmCRTC4_CRTC_GSL_WINDOW                                                 0x437a
+#define mmCRTC5_CRTC_GSL_WINDOW                                                 0x457a
+#define mmCRTC_GSL_CONTROL                                                      0x1b7b
+#define mmCRTC0_CRTC_GSL_CONTROL                                                0x1b7b
+#define mmCRTC1_CRTC_GSL_CONTROL                                                0x1d7b
+#define mmCRTC2_CRTC_GSL_CONTROL                                                0x1f7b
+#define mmCRTC3_CRTC_GSL_CONTROL                                                0x417b
+#define mmCRTC4_CRTC_GSL_CONTROL                                                0x437b
+#define mmCRTC5_CRTC_GSL_CONTROL                                                0x457b
+#define mmCRTC_TEST_DEBUG_INDEX                                                 0x1bc6
+#define mmCRTC0_CRTC_TEST_DEBUG_INDEX                                           0x1bc6
+#define mmCRTC1_CRTC_TEST_DEBUG_INDEX                                           0x1dc6
+#define mmCRTC2_CRTC_TEST_DEBUG_INDEX                                           0x1fc6
+#define mmCRTC3_CRTC_TEST_DEBUG_INDEX                                           0x41c6
+#define mmCRTC4_CRTC_TEST_DEBUG_INDEX                                           0x43c6
+#define mmCRTC5_CRTC_TEST_DEBUG_INDEX                                           0x45c6
+#define mmCRTC_TEST_DEBUG_DATA                                                  0x1bc7
+#define mmCRTC0_CRTC_TEST_DEBUG_DATA                                            0x1bc7
+#define mmCRTC1_CRTC_TEST_DEBUG_DATA                                            0x1dc7
+#define mmCRTC2_CRTC_TEST_DEBUG_DATA                                            0x1fc7
+#define mmCRTC3_CRTC_TEST_DEBUG_DATA                                            0x41c7
+#define mmCRTC4_CRTC_TEST_DEBUG_DATA                                            0x43c7
+#define mmCRTC5_CRTC_TEST_DEBUG_DATA                                            0x45c7
+#define mmDAC_ENABLE                                                            0x16aa
+#define mmDAC_SOURCE_SELECT                                                     0x16ab
+#define mmDAC_CRC_EN                                                            0x16ac
+#define mmDAC_CRC_CONTROL                                                       0x16ad
+#define mmDAC_CRC_SIG_RGB_MASK                                                  0x16ae
+#define mmDAC_CRC_SIG_CONTROL_MASK                                              0x16af
+#define mmDAC_CRC_SIG_RGB                                                       0x16b0
+#define mmDAC_CRC_SIG_CONTROL                                                   0x16b1
+#define mmDAC_SYNC_TRISTATE_CONTROL                                             0x16b2
+#define mmDAC_STEREOSYNC_SELECT                                                 0x16b3
+#define mmDAC_AUTODETECT_CONTROL                                                0x16b4
+#define mmDAC_AUTODETECT_CONTROL2                                               0x16b5
+#define mmDAC_AUTODETECT_CONTROL3                                               0x16b6
+#define mmDAC_AUTODETECT_STATUS                                                 0x16b7
+#define mmDAC_AUTODETECT_INT_CONTROL                                            0x16b8
+#define mmDAC_FORCE_OUTPUT_CNTL                                                 0x16b9
+#define mmDAC_FORCE_DATA                                                        0x16ba
+#define mmDAC_POWERDOWN                                                         0x16bb
+#define mmDAC_CONTROL                                                           0x16bc
+#define mmDAC_COMPARATOR_ENABLE                                                 0x16bd
+#define mmDAC_COMPARATOR_OUTPUT                                                 0x16be
+#define mmDAC_PWR_CNTL                                                          0x16bf
+#define mmDAC_DFT_CONFIG                                                        0x16c0
+#define mmDAC_FIFO_STATUS                                                       0x16c1
+#define mmDAC_TEST_DEBUG_INDEX                                                  0x16c2
+#define mmDAC_TEST_DEBUG_DATA                                                   0x16c3
+#define mmPERFCOUNTER_CNTL                                                      0x170
+#define mmDC_PERFMON0_PERFCOUNTER_CNTL                                          0x170
+#define mmDC_PERFMON1_PERFCOUNTER_CNTL                                          0x358
+#define mmDC_PERFMON2_PERFCOUNTER_CNTL                                          0x364
+#define mmDC_PERFMON3_PERFCOUNTER_CNTL                                          0x18c8
+#define mmDC_PERFMON4_PERFCOUNTER_CNTL                                          0x1b24
+#define mmDC_PERFMON5_PERFCOUNTER_CNTL                                          0x1d24
+#define mmDC_PERFMON6_PERFCOUNTER_CNTL                                          0x1f24
+#define mmDC_PERFMON7_PERFCOUNTER_CNTL                                          0x4124
+#define mmDC_PERFMON8_PERFCOUNTER_CNTL                                          0x4324
+#define mmDC_PERFMON9_PERFCOUNTER_CNTL                                          0x4524
+#define mmDC_PERFMON10_PERFCOUNTER_CNTL                                         0x4724
+#define mmDC_PERFMON11_PERFCOUNTER_CNTL                                         0x59a0
+#define mmDC_PERFMON12_PERFCOUNTER_CNTL                                         0x5f68
+#define mmDC_PERFMON13_PERFCOUNTER_CNTL                                         0x9924
+#define mmPERFCOUNTER_STATE                                                     0x171
+#define mmDC_PERFMON0_PERFCOUNTER_STATE                                         0x171
+#define mmDC_PERFMON1_PERFCOUNTER_STATE                                         0x359
+#define mmDC_PERFMON2_PERFCOUNTER_STATE                                         0x365
+#define mmDC_PERFMON3_PERFCOUNTER_STATE                                         0x18c9
+#define mmDC_PERFMON4_PERFCOUNTER_STATE                                         0x1b25
+#define mmDC_PERFMON5_PERFCOUNTER_STATE                                         0x1d25
+#define mmDC_PERFMON6_PERFCOUNTER_STATE                                         0x1f25
+#define mmDC_PERFMON7_PERFCOUNTER_STATE                                         0x4125
+#define mmDC_PERFMON8_PERFCOUNTER_STATE                                         0x4325
+#define mmDC_PERFMON9_PERFCOUNTER_STATE                                         0x4525
+#define mmDC_PERFMON10_PERFCOUNTER_STATE                                        0x4725
+#define mmDC_PERFMON11_PERFCOUNTER_STATE                                        0x59a1
+#define mmDC_PERFMON12_PERFCOUNTER_STATE                                        0x5f69
+#define mmDC_PERFMON13_PERFCOUNTER_STATE                                        0x9925
+#define mmPERFMON_CNTL                                                          0x173
+#define mmDC_PERFMON0_PERFMON_CNTL                                              0x173
+#define mmDC_PERFMON1_PERFMON_CNTL                                              0x35b
+#define mmDC_PERFMON2_PERFMON_CNTL                                              0x367
+#define mmDC_PERFMON3_PERFMON_CNTL                                              0x18cb
+#define mmDC_PERFMON4_PERFMON_CNTL                                              0x1b27
+#define mmDC_PERFMON5_PERFMON_CNTL                                              0x1d27
+#define mmDC_PERFMON6_PERFMON_CNTL                                              0x1f27
+#define mmDC_PERFMON7_PERFMON_CNTL                                              0x4127
+#define mmDC_PERFMON8_PERFMON_CNTL                                              0x4327
+#define mmDC_PERFMON9_PERFMON_CNTL                                              0x4527
+#define mmDC_PERFMON10_PERFMON_CNTL                                             0x4727
+#define mmDC_PERFMON11_PERFMON_CNTL                                             0x59a3
+#define mmDC_PERFMON12_PERFMON_CNTL                                             0x5f6b
+#define mmDC_PERFMON13_PERFMON_CNTL                                             0x9927
+#define mmPERFMON_CNTL2                                                         0x17a
+#define mmDC_PERFMON0_PERFMON_CNTL2                                             0x17a
+#define mmDC_PERFMON1_PERFMON_CNTL2                                             0x362
+#define mmDC_PERFMON2_PERFMON_CNTL2                                             0x36e
+#define mmDC_PERFMON3_PERFMON_CNTL2                                             0x18d2
+#define mmDC_PERFMON4_PERFMON_CNTL2                                             0x1b2e
+#define mmDC_PERFMON5_PERFMON_CNTL2                                             0x1d2e
+#define mmDC_PERFMON6_PERFMON_CNTL2                                             0x1f2e
+#define mmDC_PERFMON7_PERFMON_CNTL2                                             0x412e
+#define mmDC_PERFMON8_PERFMON_CNTL2                                             0x432e
+#define mmDC_PERFMON9_PERFMON_CNTL2                                             0x452e
+#define mmDC_PERFMON10_PERFMON_CNTL2                                            0x472e
+#define mmDC_PERFMON11_PERFMON_CNTL2                                            0x59aa
+#define mmDC_PERFMON12_PERFMON_CNTL2                                            0x5f72
+#define mmDC_PERFMON13_PERFMON_CNTL2                                            0x992e
+#define mmPERFMON_CVALUE_INT_MISC                                               0x172
+#define mmDC_PERFMON0_PERFMON_CVALUE_INT_MISC                                   0x172
+#define mmDC_PERFMON1_PERFMON_CVALUE_INT_MISC                                   0x35a
+#define mmDC_PERFMON2_PERFMON_CVALUE_INT_MISC                                   0x366
+#define mmDC_PERFMON3_PERFMON_CVALUE_INT_MISC                                   0x18ca
+#define mmDC_PERFMON4_PERFMON_CVALUE_INT_MISC                                   0x1b26
+#define mmDC_PERFMON5_PERFMON_CVALUE_INT_MISC                                   0x1d26
+#define mmDC_PERFMON6_PERFMON_CVALUE_INT_MISC                                   0x1f26
+#define mmDC_PERFMON7_PERFMON_CVALUE_INT_MISC                                   0x4126
+#define mmDC_PERFMON8_PERFMON_CVALUE_INT_MISC                                   0x4326
+#define mmDC_PERFMON9_PERFMON_CVALUE_INT_MISC                                   0x4526
+#define mmDC_PERFMON10_PERFMON_CVALUE_INT_MISC                                  0x4726
+#define mmDC_PERFMON11_PERFMON_CVALUE_INT_MISC                                  0x59a2
+#define mmDC_PERFMON12_PERFMON_CVALUE_INT_MISC                                  0x5f6a
+#define mmDC_PERFMON13_PERFMON_CVALUE_INT_MISC                                  0x9926
+#define mmPERFMON_CVALUE_LOW                                                    0x174
+#define mmDC_PERFMON0_PERFMON_CVALUE_LOW                                        0x174
+#define mmDC_PERFMON1_PERFMON_CVALUE_LOW                                        0x35c
+#define mmDC_PERFMON2_PERFMON_CVALUE_LOW                                        0x368
+#define mmDC_PERFMON3_PERFMON_CVALUE_LOW                                        0x18cc
+#define mmDC_PERFMON4_PERFMON_CVALUE_LOW                                        0x1b28
+#define mmDC_PERFMON5_PERFMON_CVALUE_LOW                                        0x1d28
+#define mmDC_PERFMON6_PERFMON_CVALUE_LOW                                        0x1f28
+#define mmDC_PERFMON7_PERFMON_CVALUE_LOW                                        0x4128
+#define mmDC_PERFMON8_PERFMON_CVALUE_LOW                                        0x4328
+#define mmDC_PERFMON9_PERFMON_CVALUE_LOW                                        0x4528
+#define mmDC_PERFMON10_PERFMON_CVALUE_LOW                                       0x4728
+#define mmDC_PERFMON11_PERFMON_CVALUE_LOW                                       0x59a4
+#define mmDC_PERFMON12_PERFMON_CVALUE_LOW                                       0x5f6c
+#define mmDC_PERFMON13_PERFMON_CVALUE_LOW                                       0x9928
+#define mmPERFMON_HI                                                            0x175
+#define mmDC_PERFMON0_PERFMON_HI                                                0x175
+#define mmDC_PERFMON1_PERFMON_HI                                                0x35d
+#define mmDC_PERFMON2_PERFMON_HI                                                0x369
+#define mmDC_PERFMON3_PERFMON_HI                                                0x18cd
+#define mmDC_PERFMON4_PERFMON_HI                                                0x1b29
+#define mmDC_PERFMON5_PERFMON_HI                                                0x1d29
+#define mmDC_PERFMON6_PERFMON_HI                                                0x1f29
+#define mmDC_PERFMON7_PERFMON_HI                                                0x4129
+#define mmDC_PERFMON8_PERFMON_HI                                                0x4329
+#define mmDC_PERFMON9_PERFMON_HI                                                0x4529
+#define mmDC_PERFMON10_PERFMON_HI                                               0x4729
+#define mmDC_PERFMON11_PERFMON_HI                                               0x59a5
+#define mmDC_PERFMON12_PERFMON_HI                                               0x5f6d
+#define mmDC_PERFMON13_PERFMON_HI                                               0x9929
+#define mmPERFMON_LOW                                                           0x176
+#define mmDC_PERFMON0_PERFMON_LOW                                               0x176
+#define mmDC_PERFMON1_PERFMON_LOW                                               0x35e
+#define mmDC_PERFMON2_PERFMON_LOW                                               0x36a
+#define mmDC_PERFMON3_PERFMON_LOW                                               0x18ce
+#define mmDC_PERFMON4_PERFMON_LOW                                               0x1b2a
+#define mmDC_PERFMON5_PERFMON_LOW                                               0x1d2a
+#define mmDC_PERFMON6_PERFMON_LOW                                               0x1f2a
+#define mmDC_PERFMON7_PERFMON_LOW                                               0x412a
+#define mmDC_PERFMON8_PERFMON_LOW                                               0x432a
+#define mmDC_PERFMON9_PERFMON_LOW                                               0x452a
+#define mmDC_PERFMON10_PERFMON_LOW                                              0x472a
+#define mmDC_PERFMON11_PERFMON_LOW                                              0x59a6
+#define mmDC_PERFMON12_PERFMON_LOW                                              0x5f6e
+#define mmDC_PERFMON13_PERFMON_LOW                                              0x992a
+#define mmPERFMON_TEST_DEBUG_INDEX                                              0x177
+#define mmDC_PERFMON0_PERFMON_TEST_DEBUG_INDEX                                  0x177
+#define mmDC_PERFMON1_PERFMON_TEST_DEBUG_INDEX                                  0x35f
+#define mmDC_PERFMON2_PERFMON_TEST_DEBUG_INDEX                                  0x36b
+#define mmDC_PERFMON3_PERFMON_TEST_DEBUG_INDEX                                  0x18cf
+#define mmDC_PERFMON4_PERFMON_TEST_DEBUG_INDEX                                  0x1b2b
+#define mmDC_PERFMON5_PERFMON_TEST_DEBUG_INDEX                                  0x1d2b
+#define mmDC_PERFMON6_PERFMON_TEST_DEBUG_INDEX                                  0x1f2b
+#define mmDC_PERFMON7_PERFMON_TEST_DEBUG_INDEX                                  0x412b
+#define mmDC_PERFMON8_PERFMON_TEST_DEBUG_INDEX                                  0x432b
+#define mmDC_PERFMON9_PERFMON_TEST_DEBUG_INDEX                                  0x452b
+#define mmDC_PERFMON10_PERFMON_TEST_DEBUG_INDEX                                 0x472b
+#define mmDC_PERFMON11_PERFMON_TEST_DEBUG_INDEX                                 0x59a7
+#define mmDC_PERFMON12_PERFMON_TEST_DEBUG_INDEX                                 0x5f6f
+#define mmDC_PERFMON13_PERFMON_TEST_DEBUG_INDEX                                 0x992b
+#define mmPERFMON_TEST_DEBUG_DATA                                               0x178
+#define mmDC_PERFMON0_PERFMON_TEST_DEBUG_DATA                                   0x178
+#define mmDC_PERFMON1_PERFMON_TEST_DEBUG_DATA                                   0x360
+#define mmDC_PERFMON2_PERFMON_TEST_DEBUG_DATA                                   0x36c
+#define mmDC_PERFMON3_PERFMON_TEST_DEBUG_DATA                                   0x18d0
+#define mmDC_PERFMON4_PERFMON_TEST_DEBUG_DATA                                   0x1b2c
+#define mmDC_PERFMON5_PERFMON_TEST_DEBUG_DATA                                   0x1d2c
+#define mmDC_PERFMON6_PERFMON_TEST_DEBUG_DATA                                   0x1f2c
+#define mmDC_PERFMON7_PERFMON_TEST_DEBUG_DATA                                   0x412c
+#define mmDC_PERFMON8_PERFMON_TEST_DEBUG_DATA                                   0x432c
+#define mmDC_PERFMON9_PERFMON_TEST_DEBUG_DATA                                   0x452c
+#define mmDC_PERFMON10_PERFMON_TEST_DEBUG_DATA                                  0x472c
+#define mmDC_PERFMON11_PERFMON_TEST_DEBUG_DATA                                  0x59a8
+#define mmDC_PERFMON12_PERFMON_TEST_DEBUG_DATA                                  0x5f70
+#define mmDC_PERFMON13_PERFMON_TEST_DEBUG_DATA                                  0x992c
+#define mmREFCLK_CNTL                                                           0x109
+#define mmDCCG_CBUS_ANTIGLITCH_RESETB                                           0x15c
+#define mmDCCG_CBUS_SPARE                                                       0x15d
+#define mmDCCG_CBUS_WRCMD_DELAY                                                 0x110
+#define mmDPREFCLK_CNTL                                                         0x118
+#define mmDCE_VERSION                                                           0x11e
+#define mmAVSYNC_COUNTER_WRITE                                                  0x12a
+#define mmAVSYNC_COUNTER_CONTROL                                                0x12b
+#define mmAVSYNC_COUNTER_READ                                                   0x12f
+#define mmDCCG_GTC_CNTL                                                         0x120
+#define mmDCCG_GTC_DTO_INCR                                                     0x121
+#define mmDCCG_GTC_DTO_MODULO                                                   0x122
+#define mmDCCG_GTC_CURRENT                                                      0x123
+#define mmDCCG_DS_DTO_INCR                                                      0x113
+#define mmDCCG_DS_DTO_MODULO                                                    0x114
+#define mmDCCG_DS_CNTL                                                          0x115
+#define mmDCCG_DS_HW_CAL_INTERVAL                                               0x116
+#define mmDCCG_DS_DEBUG_CNTL                                                    0x112
+#define mmDMCU_SMU_INTERRUPT_CNTL                                               0x12c
+#define mmSMU_CONTROL                                                           0x12d
+#define mmSMU_INTERRUPT_CONTROL                                                 0x12e
+#define mmDAC_CLK_ENABLE                                                        0x128
+#define mmDVO_CLK_ENABLE                                                        0x129
+#define mmDCCG_GATE_DISABLE_CNTL                                                0x134
+#define mmDCCG_GATE_DISABLE_CNTL2                                               0x13c
+#define mmDISPCLK_CGTT_BLK_CTRL_REG                                             0x135
+#define mmSCLK_CGTT_BLK_CTRL_REG                                                0x136
+#define mmDPREFCLK_CGTT_BLK_CTRL_REG                                            0x108
+#define mmREFCLK_CGTT_BLK_CTRL_REG                                              0x10b
+#define mmSYMCLK_CGTT_BLK_CTRL_REG                                              0x13d
+#define mmDCCG_CAC_STATUS                                                       0x137
+#define mmPIXCLK0_RESYNC_CNTL                                                   0x13a
+#define mmPHYPLLA_PIXCLK_RESYNC_CNTL                                            0x100
+#define mmPHYPLLB_PIXCLK_RESYNC_CNTL                                            0x101
+#define mmPHYPLLC_PIXCLK_RESYNC_CNTL                                            0x102
+#define mmPHYPLLD_PIXCLK_RESYNC_CNTL                                            0x103
+#define mmPHYPLLE_PIXCLK_RESYNC_CNTL                                            0x10c
+#define mmPHYPLLF_PIXCLK_RESYNC_CNTL                                            0x13e
+#define mmMICROSECOND_TIME_BASE_DIV                                             0x13b
+#define mmDCCG_DISP_CNTL_REG                                                    0x13f
+#define mmMILLISECOND_TIME_BASE_DIV                                             0x130
+#define mmDISPCLK_FREQ_CHANGE_CNTL                                              0x131
+#define mmDC_MEM_GLOBAL_PWR_REQ_CNTL                                            0x132
+#define mmDCCG_PERFMON_CNTL                                                     0x133
+#define mmDCCG_PERFMON_CNTL2                                                    0x10e
+#define mmCRTC0_PIXEL_RATE_CNTL                                                 0x140
+#define mmDP_DTO0_PHASE                                                         0x141
+#define mmDP_DTO0_MODULO                                                        0x142
+#define mmCRTC0_PHYPLL_PIXEL_RATE_CNTL                                          0x143
+#define mmCRTC1_PIXEL_RATE_CNTL                                                 0x144
+#define mmDP_DTO1_PHASE                                                         0x145
+#define mmDP_DTO1_MODULO                                                        0x146
+#define mmCRTC1_PHYPLL_PIXEL_RATE_CNTL                                          0x147
+#define mmCRTC2_PIXEL_RATE_CNTL                                                 0x148
+#define mmDP_DTO2_PHASE                                                         0x149
+#define mmDP_DTO2_MODULO                                                        0x14a
+#define mmCRTC2_PHYPLL_PIXEL_RATE_CNTL                                          0x14b
+#define mmCRTC3_PIXEL_RATE_CNTL                                                 0x14c
+#define mmDP_DTO3_PHASE                                                         0x14d
+#define mmDP_DTO3_MODULO                                                        0x14e
+#define mmCRTC3_PHYPLL_PIXEL_RATE_CNTL                                          0x14f
+#define mmCRTC4_PIXEL_RATE_CNTL                                                 0x150
+#define mmDP_DTO4_PHASE                                                         0x151
+#define mmDP_DTO4_MODULO                                                        0x152
+#define mmCRTC4_PHYPLL_PIXEL_RATE_CNTL                                          0x153
+#define mmCRTC5_PIXEL_RATE_CNTL                                                 0x154
+#define mmDP_DTO5_PHASE                                                         0x155
+#define mmDP_DTO5_MODULO                                                        0x156
+#define mmCRTC5_PHYPLL_PIXEL_RATE_CNTL                                          0x157
+#define mmDCCG_SOFT_RESET                                                       0x15f
+#define mmSYMCLKA_CLOCK_ENABLE                                                  0x160
+#define mmSYMCLKB_CLOCK_ENABLE                                                  0x161
+#define mmSYMCLKC_CLOCK_ENABLE                                                  0x162
+#define mmSYMCLKD_CLOCK_ENABLE                                                  0x163
+#define mmSYMCLKE_CLOCK_ENABLE                                                  0x164
+#define mmSYMCLKF_CLOCK_ENABLE                                                  0x165
+#define mmDPDBG_CLK_FORCE_CONTROL                                               0x10d
+#define mmDCCG_AUDIO_DTO_SOURCE                                                 0x16b
+#define mmDCCG_AUDIO_DTO0_PHASE                                                 0x16c
+#define mmDCCG_AUDIO_DTO0_MODULE                                                0x16d
+#define mmDCCG_AUDIO_DTO1_PHASE                                                 0x16e
+#define mmDCCG_AUDIO_DTO1_MODULE                                                0x16f
+#define mmDCCG_TEST_DEBUG_INDEX                                                 0x17c
+#define mmDCCG_TEST_DEBUG_DATA                                                  0x17d
+#define mmDCCG_TEST_CLK_SEL                                                     0x17e
+#define mmCPLL_MACRO_CNTL_RESERVED0                                             0x5fd0
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED0                                  0x5fd0
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED0                                  0x5fdc
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED0                                  0x5fe8
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED0                                  0x5ff4
+#define mmCPLL_MACRO_CNTL_RESERVED1                                             0x5fd1
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED1                                  0x5fd1
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED1                                  0x5fdd
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED1                                  0x5fe9
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED1                                  0x5ff5
+#define mmCPLL_MACRO_CNTL_RESERVED2                                             0x5fd2
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED2                                  0x5fd2
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED2                                  0x5fde
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED2                                  0x5fea
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED2                                  0x5ff6
+#define mmCPLL_MACRO_CNTL_RESERVED3                                             0x5fd3
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED3                                  0x5fd3
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED3                                  0x5fdf
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED3                                  0x5feb
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED3                                  0x5ff7
+#define mmCPLL_MACRO_CNTL_RESERVED4                                             0x5fd4
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED4                                  0x5fd4
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED4                                  0x5fe0
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED4                                  0x5fec
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED4                                  0x5ff8
+#define mmCPLL_MACRO_CNTL_RESERVED5                                             0x5fd5
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED5                                  0x5fd5
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED5                                  0x5fe1
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED5                                  0x5fed
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED5                                  0x5ff9
+#define mmCPLL_MACRO_CNTL_RESERVED6                                             0x5fd6
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED6                                  0x5fd6
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED6                                  0x5fe2
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED6                                  0x5fee
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED6                                  0x5ffa
+#define mmCPLL_MACRO_CNTL_RESERVED7                                             0x5fd7
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED7                                  0x5fd7
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED7                                  0x5fe3
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED7                                  0x5fef
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED7                                  0x5ffb
+#define mmCPLL_MACRO_CNTL_RESERVED8                                             0x5fd8
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED8                                  0x5fd8
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED8                                  0x5fe4
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED8                                  0x5ff0
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED8                                  0x5ffc
+#define mmCPLL_MACRO_CNTL_RESERVED9                                             0x5fd9
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED9                                  0x5fd9
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED9                                  0x5fe5
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED9                                  0x5ff1
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED9                                  0x5ffd
+#define mmCPLL_MACRO_CNTL_RESERVED10                                            0x5fda
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED10                                 0x5fda
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED10                                 0x5fe6
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED10                                 0x5ff2
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED10                                 0x5ffe
+#define mmCPLL_MACRO_CNTL_RESERVED11                                            0x5fdb
+#define mmDCCG_CPLL0_CPLL_MACRO_CNTL_RESERVED11                                 0x5fdb
+#define mmDCCG_CPLL1_CPLL_MACRO_CNTL_RESERVED11                                 0x5fe7
+#define mmDCCG_CPLL2_CPLL_MACRO_CNTL_RESERVED11                                 0x5ff3
+#define mmDCCG_CPLL3_CPLL_MACRO_CNTL_RESERVED11                                 0x5fff
+#define mmPLL_MACRO_CNTL_RESERVED0                                              0x1700
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED0                                    0x1700
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED0                                    0x172a
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED0                                    0x1754
+#define mmPLL_MACRO_CNTL_RESERVED1                                              0x1701
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED1                                    0x1701
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED1                                    0x172b
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED1                                    0x1755
+#define mmPLL_MACRO_CNTL_RESERVED2                                              0x1702
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED2                                    0x1702
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED2                                    0x172c
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED2                                    0x1756
+#define mmPLL_MACRO_CNTL_RESERVED3                                              0x1703
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED3                                    0x1703
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED3                                    0x172d
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED3                                    0x1757
+#define mmPLL_MACRO_CNTL_RESERVED4                                              0x1704
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED4                                    0x1704
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED4                                    0x172e
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED4                                    0x1758
+#define mmPLL_MACRO_CNTL_RESERVED5                                              0x1705
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED5                                    0x1705
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED5                                    0x172f
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED5                                    0x1759
+#define mmPLL_MACRO_CNTL_RESERVED6                                              0x1706
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED6                                    0x1706
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED6                                    0x1730
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED6                                    0x175a
+#define mmPLL_MACRO_CNTL_RESERVED7                                              0x1707
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED7                                    0x1707
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED7                                    0x1731
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED7                                    0x175b
+#define mmPLL_MACRO_CNTL_RESERVED8                                              0x1708
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED8                                    0x1708
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED8                                    0x1732
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED8                                    0x175c
+#define mmPLL_MACRO_CNTL_RESERVED9                                              0x1709
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED9                                    0x1709
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED9                                    0x1733
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED9                                    0x175d
+#define mmPLL_MACRO_CNTL_RESERVED10                                             0x170a
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED10                                   0x170a
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED10                                   0x1734
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED10                                   0x175e
+#define mmPLL_MACRO_CNTL_RESERVED11                                             0x170b
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED11                                   0x170b
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED11                                   0x1735
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED11                                   0x175f
+#define mmPLL_MACRO_CNTL_RESERVED12                                             0x170c
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED12                                   0x170c
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED12                                   0x1736
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED12                                   0x1760
+#define mmPLL_MACRO_CNTL_RESERVED13                                             0x170d
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED13                                   0x170d
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED13                                   0x1737
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED13                                   0x1761
+#define mmPLL_MACRO_CNTL_RESERVED14                                             0x170e
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED14                                   0x170e
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED14                                   0x1738
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED14                                   0x1762
+#define mmPLL_MACRO_CNTL_RESERVED15                                             0x170f
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED15                                   0x170f
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED15                                   0x1739
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED15                                   0x1763
+#define mmPLL_MACRO_CNTL_RESERVED16                                             0x1710
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED16                                   0x1710
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED16                                   0x173a
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED16                                   0x1764
+#define mmPLL_MACRO_CNTL_RESERVED17                                             0x1711
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED17                                   0x1711
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED17                                   0x173b
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED17                                   0x1765
+#define mmPLL_MACRO_CNTL_RESERVED18                                             0x1712
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED18                                   0x1712
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED18                                   0x173c
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED18                                   0x1766
+#define mmPLL_MACRO_CNTL_RESERVED19                                             0x1713
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED19                                   0x1713
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED19                                   0x173d
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED19                                   0x1767
+#define mmPLL_MACRO_CNTL_RESERVED20                                             0x1714
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED20                                   0x1714
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED20                                   0x173e
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED20                                   0x1768
+#define mmPLL_MACRO_CNTL_RESERVED21                                             0x1715
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED21                                   0x1715
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED21                                   0x173f
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED21                                   0x1769
+#define mmPLL_MACRO_CNTL_RESERVED22                                             0x1716
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED22                                   0x1716
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED22                                   0x1740
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED22                                   0x176a
+#define mmPLL_MACRO_CNTL_RESERVED23                                             0x1717
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED23                                   0x1717
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED23                                   0x1741
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED23                                   0x176b
+#define mmPLL_MACRO_CNTL_RESERVED24                                             0x1718
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED24                                   0x1718
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED24                                   0x1742
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED24                                   0x176c
+#define mmPLL_MACRO_CNTL_RESERVED25                                             0x1719
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED25                                   0x1719
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED25                                   0x1743
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED25                                   0x176d
+#define mmPLL_MACRO_CNTL_RESERVED26                                             0x171a
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED26                                   0x171a
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED26                                   0x1744
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED26                                   0x176e
+#define mmPLL_MACRO_CNTL_RESERVED27                                             0x171b
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED27                                   0x171b
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED27                                   0x1745
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED27                                   0x176f
+#define mmPLL_MACRO_CNTL_RESERVED28                                             0x171c
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED28                                   0x171c
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED28                                   0x1746
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED28                                   0x1770
+#define mmPLL_MACRO_CNTL_RESERVED29                                             0x171d
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED29                                   0x171d
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED29                                   0x1747
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED29                                   0x1771
+#define mmPLL_MACRO_CNTL_RESERVED30                                             0x171e
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED30                                   0x171e
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED30                                   0x1748
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED30                                   0x1772
+#define mmPLL_MACRO_CNTL_RESERVED31                                             0x171f
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED31                                   0x171f
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED31                                   0x1749
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED31                                   0x1773
+#define mmPLL_MACRO_CNTL_RESERVED32                                             0x1720
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED32                                   0x1720
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED32                                   0x174a
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED32                                   0x1774
+#define mmPLL_MACRO_CNTL_RESERVED33                                             0x1721
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED33                                   0x1721
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED33                                   0x174b
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED33                                   0x1775
+#define mmPLL_MACRO_CNTL_RESERVED34                                             0x1722
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED34                                   0x1722
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED34                                   0x174c
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED34                                   0x1776
+#define mmPLL_MACRO_CNTL_RESERVED35                                             0x1723
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED35                                   0x1723
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED35                                   0x174d
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED35                                   0x1777
+#define mmPLL_MACRO_CNTL_RESERVED36                                             0x1724
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED36                                   0x1724
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED36                                   0x174e
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED36                                   0x1778
+#define mmPLL_MACRO_CNTL_RESERVED37                                             0x1725
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED37                                   0x1725
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED37                                   0x174f
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED37                                   0x1779
+#define mmPLL_MACRO_CNTL_RESERVED38                                             0x1726
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED38                                   0x1726
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED38                                   0x1750
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED38                                   0x177a
+#define mmPLL_MACRO_CNTL_RESERVED39                                             0x1727
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED39                                   0x1727
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED39                                   0x1751
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED39                                   0x177b
+#define mmPLL_MACRO_CNTL_RESERVED40                                             0x1728
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED40                                   0x1728
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED40                                   0x1752
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED40                                   0x177c
+#define mmPLL_MACRO_CNTL_RESERVED41                                             0x1729
+#define mmDCCG_PLL0_PLL_MACRO_CNTL_RESERVED41                                   0x1729
+#define mmDCCG_PLL1_PLL_MACRO_CNTL_RESERVED41                                   0x1753
+#define mmDCCG_PLL2_PLL_MACRO_CNTL_RESERVED41                                   0x177d
+#define mmDENTIST_DISPCLK_CNTL                                                  0x124
+#define mmDCDEBUG_BUS_CLK1_SEL                                                  0x16c4
+#define mmDCDEBUG_BUS_CLK2_SEL                                                  0x16c5
+#define mmDCDEBUG_BUS_CLK3_SEL                                                  0x16c6
+#define mmDCDEBUG_BUS_CLK4_SEL                                                  0x16c7
+#define mmDCDEBUG_BUS_CLK5_SEL                                                  0x16c8
+#define mmDCDEBUG_OUT_PIN_OVERRIDE                                              0x16c9
+#define mmDCDEBUG_OUT_CNTL                                                      0x16ca
+#define mmDCDEBUG_OUT_DATA                                                      0x16cb
+#define mmDMIF_CONTROL                                                          0x2f6
+#define mmDMIF_STATUS                                                           0x2f7
+#define mmDMIFV_STATUS                                                          0x2f5
+#define mmDMIF_HW_DEBUG                                                         0x2f8
+#define mmDMIF_ARBITRATION_CONTROL                                              0x2f9
+#define mmPIPE0_ARBITRATION_CONTROL3                                            0x2fa
+#define mmPIPE1_ARBITRATION_CONTROL3                                            0x2fb
+#define mmPIPE2_ARBITRATION_CONTROL3                                            0x2fc
+#define mmPIPE3_ARBITRATION_CONTROL3                                            0x2fd
+#define mmPIPE4_ARBITRATION_CONTROL3                                            0x2fe
+#define mmPIPE5_ARBITRATION_CONTROL3                                            0x2ff
+#define mmPIPE6_ARBITRATION_CONTROL3                                            0x32a
+#define mmPIPE7_ARBITRATION_CONTROL3                                            0x32b
+#define mmDMIF_P_VMID                                                           0x300
+#define mmDMIF_URG_OVERRIDE                                                     0x329
+#define mmDMIF_TEST_DEBUG_INDEX                                                 0x301
+#define mmDMIF_TEST_DEBUG_DATA                                                  0x302
+#define ixDMIF_DEBUG02_CORE0                                                    0x2
+#define ixDMIF_DEBUG02_CORE1                                                    0xa
+#define mmDMIF_ADDR_CALC                                                        0x303
+#define mmDMIF_STATUS2                                                          0x304
+#define mmPIPE0_MAX_REQUESTS                                                    0x305
+#define mmPIPE1_MAX_REQUESTS                                                    0x306
+#define mmPIPE2_MAX_REQUESTS                                                    0x307
+#define mmPIPE3_MAX_REQUESTS                                                    0x308
+#define mmPIPE4_MAX_REQUESTS                                                    0x309
+#define mmPIPE5_MAX_REQUESTS                                                    0x30a
+#define mmPIPE6_MAX_REQUESTS                                                    0x32c
+#define mmPIPE7_MAX_REQUESTS                                                    0x32d
+#define mmDVMM_REG_RD_STATUS                                                    0x32e
+#define mmDVMM_REG_RD_DATA                                                      0x32f
+#define mmDVMM_PTE_REQ                                                          0x330
+#define mmDVMM_CNTL                                                             0x331
+#define mmDVMM_FAULT_STATUS                                                     0x332
+#define mmDVMM_FAULT_ADDR                                                       0x333
+#define mmLOW_POWER_TILING_CONTROL                                              0x30b
+#define mmMCIF_CONTROL                                                          0x30c
+#define mmMCIF_WRITE_COMBINE_CONTROL                                            0x30d
+#define mmMCIF_TEST_DEBUG_INDEX                                                 0x30e
+#define mmMCIF_TEST_DEBUG_DATA                                                  0x30f
+#define ixIDDCCIF02_DBG_DCCIF_C                                                 0x9
+#define ixIDDCCIF04_DBG_DCCIF_E                                                 0xb
+#define ixIDDCCIF05_DBG_DCCIF_F                                                 0xc
+#define mmMCIF_VMID                                                             0x310
+#define mmMCIF_MEM_CONTROL                                                      0x311
+#define mmCC_DC_PIPE_DIS                                                        0x312
+#define mmMC_DC_INTERFACE_NACK_STATUS                                           0x313
+#define mmRBBMIF_TIMEOUT                                                        0x314
+#define mmRBBMIF_STATUS                                                         0x315
+#define mmRBBMIF_TIMEOUT_DIS                                                    0x316
+#define mmRBBMIF_STATUS_FLAG                                                    0x327
+#define mmDCI_MEM_PWR_STATUS                                                    0x317
+#define mmDCI_MEM_PWR_STATUS2                                                   0x318
+#define mmDCI_MEM_PWR_STATUS3                                                   0x33d
+#define mmDCI_CLK_CNTL                                                          0x319
+#define mmDCI_CLK_RAMP_CNTL                                                     0x31a
+#define mmDCI_MEM_PWR_CNTL                                                      0x31b
+#define mmDCI_MEM_PWR_CNTL2                                                     0x31c
+#define mmDCI_MEM_PWR_CNTL3                                                     0x31d
+#define mmDCI_MEM_PWR_CNTL4                                                     0x33b
+#define mmDVMM_PTE_PGMEM_CONTROL                                                0x335
+#define mmDVMM_PTE_PGMEM_STATE                                                  0x336
+#define mmDCI_SOFT_RESET                                                        0x328
+#define mmDCI_MISC                                                              0x33c
+#define mmDCI_TEST_DEBUG_INDEX                                                  0x31e
+#define mmDCI_TEST_DEBUG_DATA                                                   0x31f
+#define mmDCI_DEBUG_CONFIG                                                      0x320
+#define mmPIPE0_DMIF_BUFFER_CONTROL                                             0x321
+#define mmPIPE1_DMIF_BUFFER_CONTROL                                             0x322
+#define mmPIPE2_DMIF_BUFFER_CONTROL                                             0x323
+#define mmPIPE3_DMIF_BUFFER_CONTROL                                             0x324
+#define mmPIPE4_DMIF_BUFFER_CONTROL                                             0x325
+#define mmPIPE5_DMIF_BUFFER_CONTROL                                             0x326
+#define mmDC_GENERICA                                                           0x4800
+#define mmDC_GENERICB                                                           0x4801
+#define mmDC_PAD_EXTERN_SIG                                                     0x4802
+#define mmDC_REF_CLK_CNTL                                                       0x4803
+#define mmDC_GPIO_DEBUG                                                         0x4804
+#define mmUNIPHYA_LINK_CNTL                                                     0x4805
+#define mmUNIPHYB_LINK_CNTL                                                     0x4807
+#define mmUNIPHYC_LINK_CNTL                                                     0x4809
+#define mmUNIPHYD_LINK_CNTL                                                     0x480b
+#define mmUNIPHYE_LINK_CNTL                                                     0x480d
+#define mmUNIPHYF_LINK_CNTL                                                     0x480f
+#define mmUNIPHYG_LINK_CNTL                                                     0x4811
+#define mmUNIPHYA_CHANNEL_XBAR_CNTL                                             0x4806
+#define mmUNIPHYB_CHANNEL_XBAR_CNTL                                             0x4808
+#define mmUNIPHYC_CHANNEL_XBAR_CNTL                                             0x480a
+#define mmUNIPHYD_CHANNEL_XBAR_CNTL                                             0x480c
+#define mmUNIPHYE_CHANNEL_XBAR_CNTL                                             0x480e
+#define mmUNIPHYF_CHANNEL_XBAR_CNTL                                             0x4810
+#define mmUNIPHYG_CHANNEL_XBAR_CNTL                                             0x4812
+#define mmUNIPHYLPA_LINK_CNTL                                                   0x4847
+#define mmUNIPHYLPB_LINK_CNTL                                                   0x4848
+#define mmUNIPHYLPA_CHANNEL_XBAR_CNTL                                           0x4849
+#define mmUNIPHYLPB_CHANNEL_XBAR_CNTL                                           0x484a
+#define mmUNIPHY_IMPCAL_LINKA                                                   0x4838
+#define mmUNIPHY_IMPCAL_LINKB                                                   0x4839
+#define mmUNIPHY_IMPCAL_LINKC                                                   0x483f
+#define mmUNIPHY_IMPCAL_LINKD                                                   0x4840
+#define mmUNIPHY_IMPCAL_LINKE                                                   0x4843
+#define mmUNIPHY_IMPCAL_LINKF                                                   0x4844
+#define mmUNIPHY_IMPCAL_PERIOD                                                  0x483a
+#define mmAUXP_IMPCAL                                                           0x483b
+#define mmAUXN_IMPCAL                                                           0x483c
+#define mmDCIO_IMPCAL_CNTL                                                      0x483d
+#define mmUNIPHY_IMPCAL_PSW_AB                                                  0x483e
+#define mmDCIO_IMPCAL_CNTL_CD                                                   0x4841
+#define mmUNIPHY_IMPCAL_PSW_CD                                                  0x4842
+#define mmDCIO_IMPCAL_CNTL_EF                                                   0x4845
+#define mmUNIPHY_IMPCAL_PSW_EF                                                  0x4846
+#define mmDCIO_WRCMD_DELAY                                                      0x4816
+#define mmDC_PINSTRAPS                                                          0x4818
+#define mmDC_DVODATA_CONFIG                                                     0x481a
+#define mmLVTMA_PWRSEQ_CNTL                                                     0x481b
+#define mmLVTMA_PWRSEQ_STATE                                                    0x481c
+#define mmLVTMA_PWRSEQ_REF_DIV                                                  0x481d
+#define mmLVTMA_PWRSEQ_DELAY1                                                   0x481e
+#define mmLVTMA_PWRSEQ_DELAY2                                                   0x481f
+#define mmBL_PWM_CNTL                                                           0x4820
+#define mmBL_PWM_CNTL2                                                          0x4821
+#define mmBL_PWM_PERIOD_CNTL                                                    0x4822
+#define mmBL_PWM_GRP1_REG_LOCK                                                  0x4823
+#define mmDCIO_GSL_GENLK_PAD_CNTL                                               0x4824
+#define mmDCIO_GSL_SWAPLOCK_PAD_CNTL                                            0x4825
+#define mmDCIO_GSL0_CNTL                                                        0x4826
+#define mmDCIO_GSL1_CNTL                                                        0x4827
+#define mmDCIO_GSL2_CNTL                                                        0x4828
+#define mmDC_GPU_TIMER_START_POSITION_V_UPDATE                                  0x4829
+#define mmDC_GPU_TIMER_START_POSITION_P_FLIP                                    0x482a
+#define mmDC_GPU_TIMER_READ                                                     0x482b
+#define mmDC_GPU_TIMER_READ_CNTL                                                0x482c
+#define mmDCIO_CLOCK_CNTL                                                       0x482d
+#define mmDCIO_DEBUG                                                            0x482f
+#define mmDCO_DCFE_EXT_VSYNC_CNTL                                               0x4830
+#define mmDBG_OUT_CNTL                                                          0x4834
+#define mmDCIO_DEBUG_CONFIG                                                     0x4835
+#define mmDCIO_SOFT_RESET                                                       0x4836
+#define mmDCIO_DPHY_SEL                                                         0x4837
+#define mmDCIO_DPCS_TX_INTERRUPT                                                0x484b
+#define mmDCIO_DPCS_RX_INTERRUPT                                                0x484c
+#define mmDCIO_SEMAPHORE0                                                       0x484d
+#define mmDCIO_SEMAPHORE1                                                       0x484e
+#define mmDCIO_SEMAPHORE2                                                       0x484f
+#define mmDCIO_SEMAPHORE3                                                       0x4850
+#define mmDCIO_SEMAPHORE4                                                       0x4851
+#define mmDCIO_SEMAPHORE5                                                       0x4852
+#define mmDCIO_SEMAPHORE6                                                       0x4853
+#define mmDCIO_SEMAPHORE7                                                       0x4854
+#define mmDCIO_TEST_DEBUG_INDEX                                                 0x4831
+#define mmDCIO_TEST_DEBUG_DATA                                                  0x4832
+#define ixDCIO_DEBUG1                                                           0x1
+#define ixDCIO_DEBUG2                                                           0x2
+#define ixDCIO_DEBUG3                                                           0x3
+#define ixDCIO_DEBUG4                                                           0x4
+#define ixDCIO_DEBUG5                                                           0x5
+#define ixDCIO_DEBUG6                                                           0x6
+#define ixDCIO_DEBUG7                                                           0x7
+#define ixDCIO_DEBUG8                                                           0x8
+#define ixDCIO_DEBUG9                                                           0x9
+#define ixDCIO_DEBUGA                                                           0xa
+#define ixDCIO_DEBUGB                                                           0xb
+#define ixDCIO_DEBUGC                                                           0xc
+#define ixDCIO_DEBUGD                                                           0xd
+#define ixDCIO_DEBUGE                                                           0xe
+#define ixDCIO_DEBUGF                                                           0xf
+#define ixDCIO_DEBUG10                                                          0x10
+#define ixDCIO_DEBUG11                                                          0x11
+#define ixDCIO_DEBUG12                                                          0x12
+#define ixDCIO_DEBUG13                                                          0x13
+#define ixDCIO_DEBUG14                                                          0x14
+#define ixDCIO_DEBUG15                                                          0x15
+#define ixDCIO_DEBUG16                                                          0x16
+#define ixDCIO_DEBUG17                                                          0x17
+#define ixDCIO_DEBUG18                                                          0x18
+#define ixDCIO_DEBUG19                                                          0x19
+#define ixDCIO_DEBUG1A                                                          0x1a
+#define ixDCIO_DEBUG1B                                                          0x1b
+#define ixDCIO_DEBUG1C                                                          0x1c
+#define ixDCIO_DEBUG1D                                                          0x1d
+#define ixDCIO_DEBUG1E                                                          0x1e
+#define ixDCIO_DEBUG1F                                                          0x1f
+#define ixDCIO_DEBUG20                                                          0x20
+#define ixDCIO_DEBUG21                                                          0x21
+#define ixDCIO_DEBUG22                                                          0x22
+#define ixDCIO_DEBUG23                                                          0x23
+#define ixDCIO_DEBUG24                                                          0x24
+#define ixDCIO_DEBUG25                                                          0x25
+#define ixDCIO_DEBUG26                                                          0x26
+#define ixDCIO_DEBUG27                                                          0x27
+#define ixDCIO_DEBUG28                                                          0x28
+#define ixDCIO_DEBUG_ID                                                         0x0
+#define mmDC_GPIO_GENERIC_MASK                                                  0x4860
+#define mmDC_GPIO_GENERIC_A                                                     0x4861
+#define mmDC_GPIO_GENERIC_EN                                                    0x4862
+#define mmDC_GPIO_GENERIC_Y                                                     0x4863
+#define mmDC_GPIO_DDC1_MASK                                                     0x4868
+#define mmDC_GPIO_DDC1_A                                                        0x4869
+#define mmDC_GPIO_DDC1_EN                                                       0x486a
+#define mmDC_GPIO_DDC1_Y                                                        0x486b
+#define mmDC_GPIO_DDC2_MASK                                                     0x486c
+#define mmDC_GPIO_DDC2_A                                                        0x486d
+#define mmDC_GPIO_DDC2_EN                                                       0x486e
+#define mmDC_GPIO_DDC2_Y                                                        0x486f
+#define mmDC_GPIO_DDC3_MASK                                                     0x4870
+#define mmDC_GPIO_DDC3_A                                                        0x4871
+#define mmDC_GPIO_DDC3_EN                                                       0x4872
+#define mmDC_GPIO_DDC3_Y                                                        0x4873
+#define mmDC_GPIO_DDC4_MASK                                                     0x4874
+#define mmDC_GPIO_DDC4_A                                                        0x4875
+#define mmDC_GPIO_DDC4_EN                                                       0x4876
+#define mmDC_GPIO_DDC4_Y                                                        0x4877
+#define mmDC_GPIO_DDC5_MASK                                                     0x4878
+#define mmDC_GPIO_DDC5_A                                                        0x4879
+#define mmDC_GPIO_DDC5_EN                                                       0x487a
+#define mmDC_GPIO_DDC5_Y                                                        0x487b
+#define mmDC_GPIO_DDC6_MASK                                                     0x487c
+#define mmDC_GPIO_DDC6_A                                                        0x487d
+#define mmDC_GPIO_DDC6_EN                                                       0x487e
+#define mmDC_GPIO_DDC6_Y                                                        0x487f
+#define mmDC_GPIO_DDCVGA_MASK                                                   0x4880
+#define mmDC_GPIO_DDCVGA_A                                                      0x4881
+#define mmDC_GPIO_DDCVGA_EN                                                     0x4882
+#define mmDC_GPIO_DDCVGA_Y                                                      0x4883
+#define mmDC_GPIO_SYNCA_MASK                                                    0x4884
+#define mmDC_GPIO_SYNCA_A                                                       0x4885
+#define mmDC_GPIO_SYNCA_EN                                                      0x4886
+#define mmDC_GPIO_SYNCA_Y                                                       0x4887
+#define mmDC_GPIO_GENLK_MASK                                                    0x4888
+#define mmDC_GPIO_GENLK_A                                                       0x4889
+#define mmDC_GPIO_GENLK_EN                                                      0x488a
+#define mmDC_GPIO_GENLK_Y                                                       0x488b
+#define mmDC_GPIO_HPD_MASK                                                      0x488c
+#define mmDC_GPIO_HPD_A                                                         0x488d
+#define mmDC_GPIO_HPD_EN                                                        0x488e
+#define mmDC_GPIO_HPD_Y                                                         0x488f
+#define mmDC_GPIO_PWRSEQ_MASK                                                   0x4890
+#define mmDC_GPIO_PWRSEQ_A                                                      0x4891
+#define mmDC_GPIO_PWRSEQ_EN                                                     0x4892
+#define mmDC_GPIO_PWRSEQ_Y                                                      0x4893
+#define mmDC_GPIO_PAD_STRENGTH_1                                                0x4894
+#define mmDC_GPIO_PAD_STRENGTH_2                                                0x4895
+#define mmPHY_AUX_CNTL                                                          0x4897
+#define mmDC_GPIO_I2CPAD_A                                                      0x4899
+#define mmDC_GPIO_I2CPAD_EN                                                     0x489a
+#define mmDC_GPIO_I2CPAD_Y                                                      0x489b
+#define mmDC_GPIO_I2CPAD_STRENGTH                                               0x489c
+#define mmDVO_VREF_CONTROL                                                      0x489e
+#define mmDVO_SKEW_ADJUST                                                       0x489f
+#define mmDC_GPIO_RECEIVER_EN0                                                  0x48a0
+#define mmDC_GPIO_RECEIVER_EN1                                                  0x48a1
+#define mmDC_GPIO_I2S_SPDIF_MASK                                                0x48a8
+#define mmDC_GPIO_I2S_SPDIF_A                                                   0x48a9
+#define mmDC_GPIO_I2S_SPDIF_EN                                                  0x48aa
+#define mmDC_GPIO_I2S_SPDIF_Y                                                   0x48ab
+#define mmDC_GPIO_I2S_SPDIF_STRENGTH                                            0x48ac
+#define mmDC_GPIO_TX12_EN                                                       0x48ad
+#define mmDC_GPIO_AUX_CTRL_0                                                    0x48ae
+#define mmDC_GPIO_AUX_CTRL_1                                                    0x48af
+#define mmDC_GPIO_AUX_CTRL_2                                                    0x48b0
+#define mmDC_GPIO_HPD_CTRL_0                                                    0x48b1
+#define mmDC_GPIO_HPD_CTRL_1                                                    0x48b2
+#define mmDAC_MACRO_CNTL_RESERVED0                                              0x48b8
+#define mmDAC_MACRO_CNTL_RESERVED1                                              0x48b9
+#define mmDAC_MACRO_CNTL_RESERVED2                                              0x48ba
+#define mmDAC_MACRO_CNTL_RESERVED3                                              0x48bb
+#define mmUNIPHY_MACRO_CNTL_RESERVED0                                           0x48c0
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED0                              0x48c0
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED0                              0x4960
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED0                              0x9a00
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED0                              0x9aa0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED0                              0x9b40
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED0                              0x9be0
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED0                              0x9c80
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED0                              0x9d20
+#define mmUNIPHY_MACRO_CNTL_RESERVED1                                           0x48c1
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED1                              0x48c1
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED1                              0x4961
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED1                              0x9a01
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED1                              0x9aa1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED1                              0x9b41
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED1                              0x9be1
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED1                              0x9c81
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED1                              0x9d21
+#define mmUNIPHY_MACRO_CNTL_RESERVED2                                           0x48c2
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED2                              0x48c2
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED2                              0x4962
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED2                              0x9a02
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED2                              0x9aa2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED2                              0x9b42
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED2                              0x9be2
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED2                              0x9c82
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED2                              0x9d22
+#define mmUNIPHY_MACRO_CNTL_RESERVED3                                           0x48c3
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED3                              0x48c3
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED3                              0x4963
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED3                              0x9a03
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED3                              0x9aa3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED3                              0x9b43
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED3                              0x9be3
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED3                              0x9c83
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED3                              0x9d23
+#define mmUNIPHY_MACRO_CNTL_RESERVED4                                           0x48c4
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED4                              0x48c4
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED4                              0x4964
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED4                              0x9a04
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED4                              0x9aa4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED4                              0x9b44
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED4                              0x9be4
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED4                              0x9c84
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED4                              0x9d24
+#define mmUNIPHY_MACRO_CNTL_RESERVED5                                           0x48c5
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED5                              0x48c5
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED5                              0x4965
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED5                              0x9a05
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED5                              0x9aa5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED5                              0x9b45
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED5                              0x9be5
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED5                              0x9c85
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED5                              0x9d25
+#define mmUNIPHY_MACRO_CNTL_RESERVED6                                           0x48c6
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED6                              0x48c6
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED6                              0x4966
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED6                              0x9a06
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED6                              0x9aa6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED6                              0x9b46
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED6                              0x9be6
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED6                              0x9c86
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED6                              0x9d26
+#define mmUNIPHY_MACRO_CNTL_RESERVED7                                           0x48c7
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED7                              0x48c7
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED7                              0x4967
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED7                              0x9a07
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED7                              0x9aa7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED7                              0x9b47
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED7                              0x9be7
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED7                              0x9c87
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED7                              0x9d27
+#define mmUNIPHY_MACRO_CNTL_RESERVED8                                           0x48c8
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED8                              0x48c8
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED8                              0x4968
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED8                              0x9a08
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED8                              0x9aa8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED8                              0x9b48
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED8                              0x9be8
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED8                              0x9c88
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED8                              0x9d28
+#define mmUNIPHY_MACRO_CNTL_RESERVED9                                           0x48c9
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED9                              0x48c9
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED9                              0x4969
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED9                              0x9a09
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED9                              0x9aa9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED9                              0x9b49
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED9                              0x9be9
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED9                              0x9c89
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED9                              0x9d29
+#define mmUNIPHY_MACRO_CNTL_RESERVED10                                          0x48ca
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED10                             0x48ca
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED10                             0x496a
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED10                             0x9a0a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED10                             0x9aaa
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED10                             0x9b4a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED10                             0x9bea
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED10                             0x9c8a
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED10                             0x9d2a
+#define mmUNIPHY_MACRO_CNTL_RESERVED11                                          0x48cb
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED11                             0x48cb
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED11                             0x496b
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED11                             0x9a0b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED11                             0x9aab
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED11                             0x9b4b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED11                             0x9beb
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED11                             0x9c8b
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED11                             0x9d2b
+#define mmUNIPHY_MACRO_CNTL_RESERVED12                                          0x48cc
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED12                             0x48cc
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED12                             0x496c
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED12                             0x9a0c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED12                             0x9aac
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED12                             0x9b4c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED12                             0x9bec
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED12                             0x9c8c
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED12                             0x9d2c
+#define mmUNIPHY_MACRO_CNTL_RESERVED13                                          0x48cd
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED13                             0x48cd
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED13                             0x496d
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED13                             0x9a0d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED13                             0x9aad
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED13                             0x9b4d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED13                             0x9bed
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED13                             0x9c8d
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED13                             0x9d2d
+#define mmUNIPHY_MACRO_CNTL_RESERVED14                                          0x48ce
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED14                             0x48ce
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED14                             0x496e
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED14                             0x9a0e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED14                             0x9aae
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED14                             0x9b4e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED14                             0x9bee
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED14                             0x9c8e
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED14                             0x9d2e
+#define mmUNIPHY_MACRO_CNTL_RESERVED15                                          0x48cf
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED15                             0x48cf
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED15                             0x496f
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED15                             0x9a0f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED15                             0x9aaf
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED15                             0x9b4f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED15                             0x9bef
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED15                             0x9c8f
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED15                             0x9d2f
+#define mmUNIPHY_MACRO_CNTL_RESERVED16                                          0x48d0
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED16                             0x48d0
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED16                             0x4970
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED16                             0x9a10
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED16                             0x9ab0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED16                             0x9b50
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED16                             0x9bf0
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED16                             0x9c90
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED16                             0x9d30
+#define mmUNIPHY_MACRO_CNTL_RESERVED17                                          0x48d1
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED17                             0x48d1
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED17                             0x4971
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED17                             0x9a11
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED17                             0x9ab1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED17                             0x9b51
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED17                             0x9bf1
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED17                             0x9c91
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED17                             0x9d31
+#define mmUNIPHY_MACRO_CNTL_RESERVED18                                          0x48d2
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED18                             0x48d2
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED18                             0x4972
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED18                             0x9a12
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED18                             0x9ab2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED18                             0x9b52
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED18                             0x9bf2
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED18                             0x9c92
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED18                             0x9d32
+#define mmUNIPHY_MACRO_CNTL_RESERVED19                                          0x48d3
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED19                             0x48d3
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED19                             0x4973
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED19                             0x9a13
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED19                             0x9ab3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED19                             0x9b53
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED19                             0x9bf3
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED19                             0x9c93
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED19                             0x9d33
+#define mmUNIPHY_MACRO_CNTL_RESERVED20                                          0x48d4
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED20                             0x48d4
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED20                             0x4974
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED20                             0x9a14
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED20                             0x9ab4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED20                             0x9b54
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED20                             0x9bf4
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED20                             0x9c94
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED20                             0x9d34
+#define mmUNIPHY_MACRO_CNTL_RESERVED21                                          0x48d5
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED21                             0x48d5
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED21                             0x4975
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED21                             0x9a15
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED21                             0x9ab5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED21                             0x9b55
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED21                             0x9bf5
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED21                             0x9c95
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED21                             0x9d35
+#define mmUNIPHY_MACRO_CNTL_RESERVED22                                          0x48d6
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED22                             0x48d6
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED22                             0x4976
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED22                             0x9a16
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED22                             0x9ab6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED22                             0x9b56
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED22                             0x9bf6
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED22                             0x9c96
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED22                             0x9d36
+#define mmUNIPHY_MACRO_CNTL_RESERVED23                                          0x48d7
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED23                             0x48d7
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED23                             0x4977
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED23                             0x9a17
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED23                             0x9ab7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED23                             0x9b57
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED23                             0x9bf7
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED23                             0x9c97
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED23                             0x9d37
+#define mmUNIPHY_MACRO_CNTL_RESERVED24                                          0x48d8
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED24                             0x48d8
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED24                             0x4978
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED24                             0x9a18
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED24                             0x9ab8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED24                             0x9b58
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED24                             0x9bf8
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED24                             0x9c98
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED24                             0x9d38
+#define mmUNIPHY_MACRO_CNTL_RESERVED25                                          0x48d9
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED25                             0x48d9
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED25                             0x4979
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED25                             0x9a19
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED25                             0x9ab9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED25                             0x9b59
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED25                             0x9bf9
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED25                             0x9c99
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED25                             0x9d39
+#define mmUNIPHY_MACRO_CNTL_RESERVED26                                          0x48da
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED26                             0x48da
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED26                             0x497a
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED26                             0x9a1a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED26                             0x9aba
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED26                             0x9b5a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED26                             0x9bfa
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED26                             0x9c9a
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED26                             0x9d3a
+#define mmUNIPHY_MACRO_CNTL_RESERVED27                                          0x48db
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED27                             0x48db
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED27                             0x497b
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED27                             0x9a1b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED27                             0x9abb
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED27                             0x9b5b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED27                             0x9bfb
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED27                             0x9c9b
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED27                             0x9d3b
+#define mmUNIPHY_MACRO_CNTL_RESERVED28                                          0x48dc
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED28                             0x48dc
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED28                             0x497c
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED28                             0x9a1c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED28                             0x9abc
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED28                             0x9b5c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED28                             0x9bfc
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED28                             0x9c9c
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED28                             0x9d3c
+#define mmUNIPHY_MACRO_CNTL_RESERVED29                                          0x48dd
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED29                             0x48dd
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED29                             0x497d
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED29                             0x9a1d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED29                             0x9abd
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED29                             0x9b5d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED29                             0x9bfd
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED29                             0x9c9d
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED29                             0x9d3d
+#define mmUNIPHY_MACRO_CNTL_RESERVED30                                          0x48de
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED30                             0x48de
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED30                             0x497e
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED30                             0x9a1e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED30                             0x9abe
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED30                             0x9b5e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED30                             0x9bfe
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED30                             0x9c9e
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED30                             0x9d3e
+#define mmUNIPHY_MACRO_CNTL_RESERVED31                                          0x48df
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED31                             0x48df
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED31                             0x497f
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED31                             0x9a1f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED31                             0x9abf
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED31                             0x9b5f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED31                             0x9bff
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED31                             0x9c9f
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED31                             0x9d3f
+#define mmUNIPHY_MACRO_CNTL_RESERVED32                                          0x48e0
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED32                             0x48e0
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED32                             0x4980
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED32                             0x9a20
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED32                             0x9ac0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED32                             0x9b60
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED32                             0x9c00
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED32                             0x9ca0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED32                             0x9d40
+#define mmUNIPHY_MACRO_CNTL_RESERVED33                                          0x48e1
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED33                             0x48e1
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED33                             0x4981
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED33                             0x9a21
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED33                             0x9ac1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED33                             0x9b61
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED33                             0x9c01
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED33                             0x9ca1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED33                             0x9d41
+#define mmUNIPHY_MACRO_CNTL_RESERVED34                                          0x48e2
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED34                             0x48e2
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED34                             0x4982
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED34                             0x9a22
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED34                             0x9ac2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED34                             0x9b62
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED34                             0x9c02
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED34                             0x9ca2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED34                             0x9d42
+#define mmUNIPHY_MACRO_CNTL_RESERVED35                                          0x48e3
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED35                             0x48e3
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED35                             0x4983
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED35                             0x9a23
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED35                             0x9ac3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED35                             0x9b63
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED35                             0x9c03
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED35                             0x9ca3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED35                             0x9d43
+#define mmUNIPHY_MACRO_CNTL_RESERVED36                                          0x48e4
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED36                             0x48e4
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED36                             0x4984
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED36                             0x9a24
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED36                             0x9ac4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED36                             0x9b64
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED36                             0x9c04
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED36                             0x9ca4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED36                             0x9d44
+#define mmUNIPHY_MACRO_CNTL_RESERVED37                                          0x48e5
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED37                             0x48e5
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED37                             0x4985
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED37                             0x9a25
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED37                             0x9ac5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED37                             0x9b65
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED37                             0x9c05
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED37                             0x9ca5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED37                             0x9d45
+#define mmUNIPHY_MACRO_CNTL_RESERVED38                                          0x48e6
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED38                             0x48e6
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED38                             0x4986
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED38                             0x9a26
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED38                             0x9ac6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED38                             0x9b66
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED38                             0x9c06
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED38                             0x9ca6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED38                             0x9d46
+#define mmUNIPHY_MACRO_CNTL_RESERVED39                                          0x48e7
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED39                             0x48e7
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED39                             0x4987
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED39                             0x9a27
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED39                             0x9ac7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED39                             0x9b67
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED39                             0x9c07
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED39                             0x9ca7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED39                             0x9d47
+#define mmUNIPHY_MACRO_CNTL_RESERVED40                                          0x48e8
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED40                             0x48e8
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED40                             0x4988
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED40                             0x9a28
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED40                             0x9ac8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED40                             0x9b68
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED40                             0x9c08
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED40                             0x9ca8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED40                             0x9d48
+#define mmUNIPHY_MACRO_CNTL_RESERVED41                                          0x48e9
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED41                             0x48e9
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED41                             0x4989
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED41                             0x9a29
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED41                             0x9ac9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED41                             0x9b69
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED41                             0x9c09
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED41                             0x9ca9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED41                             0x9d49
+#define mmUNIPHY_MACRO_CNTL_RESERVED42                                          0x48ea
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED42                             0x48ea
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED42                             0x498a
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED42                             0x9a2a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED42                             0x9aca
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED42                             0x9b6a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED42                             0x9c0a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED42                             0x9caa
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED42                             0x9d4a
+#define mmUNIPHY_MACRO_CNTL_RESERVED43                                          0x48eb
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED43                             0x48eb
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED43                             0x498b
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED43                             0x9a2b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED43                             0x9acb
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED43                             0x9b6b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED43                             0x9c0b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED43                             0x9cab
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED43                             0x9d4b
+#define mmUNIPHY_MACRO_CNTL_RESERVED44                                          0x48ec
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED44                             0x48ec
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED44                             0x498c
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED44                             0x9a2c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED44                             0x9acc
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED44                             0x9b6c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED44                             0x9c0c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED44                             0x9cac
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED44                             0x9d4c
+#define mmUNIPHY_MACRO_CNTL_RESERVED45                                          0x48ed
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED45                             0x48ed
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED45                             0x498d
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED45                             0x9a2d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED45                             0x9acd
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED45                             0x9b6d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED45                             0x9c0d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED45                             0x9cad
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED45                             0x9d4d
+#define mmUNIPHY_MACRO_CNTL_RESERVED46                                          0x48ee
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED46                             0x48ee
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED46                             0x498e
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED46                             0x9a2e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED46                             0x9ace
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED46                             0x9b6e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED46                             0x9c0e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED46                             0x9cae
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED46                             0x9d4e
+#define mmUNIPHY_MACRO_CNTL_RESERVED47                                          0x48ef
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED47                             0x48ef
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED47                             0x498f
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED47                             0x9a2f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED47                             0x9acf
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED47                             0x9b6f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED47                             0x9c0f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED47                             0x9caf
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED47                             0x9d4f
+#define mmUNIPHY_MACRO_CNTL_RESERVED48                                          0x48f0
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED48                             0x48f0
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED48                             0x4990
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED48                             0x9a30
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED48                             0x9ad0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED48                             0x9b70
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED48                             0x9c10
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED48                             0x9cb0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED48                             0x9d50
+#define mmUNIPHY_MACRO_CNTL_RESERVED49                                          0x48f1
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED49                             0x48f1
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED49                             0x4991
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED49                             0x9a31
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED49                             0x9ad1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED49                             0x9b71
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED49                             0x9c11
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED49                             0x9cb1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED49                             0x9d51
+#define mmUNIPHY_MACRO_CNTL_RESERVED50                                          0x48f2
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED50                             0x48f2
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED50                             0x4992
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED50                             0x9a32
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED50                             0x9ad2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED50                             0x9b72
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED50                             0x9c12
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED50                             0x9cb2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED50                             0x9d52
+#define mmUNIPHY_MACRO_CNTL_RESERVED51                                          0x48f3
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED51                             0x48f3
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED51                             0x4993
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED51                             0x9a33
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED51                             0x9ad3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED51                             0x9b73
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED51                             0x9c13
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED51                             0x9cb3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED51                             0x9d53
+#define mmUNIPHY_MACRO_CNTL_RESERVED52                                          0x48f4
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED52                             0x48f4
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED52                             0x4994
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED52                             0x9a34
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED52                             0x9ad4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED52                             0x9b74
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED52                             0x9c14
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED52                             0x9cb4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED52                             0x9d54
+#define mmUNIPHY_MACRO_CNTL_RESERVED53                                          0x48f5
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED53                             0x48f5
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED53                             0x4995
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED53                             0x9a35
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED53                             0x9ad5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED53                             0x9b75
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED53                             0x9c15
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED53                             0x9cb5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED53                             0x9d55
+#define mmUNIPHY_MACRO_CNTL_RESERVED54                                          0x48f6
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED54                             0x48f6
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED54                             0x4996
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED54                             0x9a36
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED54                             0x9ad6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED54                             0x9b76
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED54                             0x9c16
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED54                             0x9cb6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED54                             0x9d56
+#define mmUNIPHY_MACRO_CNTL_RESERVED55                                          0x48f7
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED55                             0x48f7
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED55                             0x4997
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED55                             0x9a37
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED55                             0x9ad7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED55                             0x9b77
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED55                             0x9c17
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED55                             0x9cb7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED55                             0x9d57
+#define mmUNIPHY_MACRO_CNTL_RESERVED56                                          0x48f8
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED56                             0x48f8
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED56                             0x4998
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED56                             0x9a38
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED56                             0x9ad8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED56                             0x9b78
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED56                             0x9c18
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED56                             0x9cb8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED56                             0x9d58
+#define mmUNIPHY_MACRO_CNTL_RESERVED57                                          0x48f9
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED57                             0x48f9
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED57                             0x4999
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED57                             0x9a39
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED57                             0x9ad9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED57                             0x9b79
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED57                             0x9c19
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED57                             0x9cb9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED57                             0x9d59
+#define mmUNIPHY_MACRO_CNTL_RESERVED58                                          0x48fa
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED58                             0x48fa
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED58                             0x499a
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED58                             0x9a3a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED58                             0x9ada
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED58                             0x9b7a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED58                             0x9c1a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED58                             0x9cba
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED58                             0x9d5a
+#define mmUNIPHY_MACRO_CNTL_RESERVED59                                          0x48fb
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED59                             0x48fb
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED59                             0x499b
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED59                             0x9a3b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED59                             0x9adb
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED59                             0x9b7b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED59                             0x9c1b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED59                             0x9cbb
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED59                             0x9d5b
+#define mmUNIPHY_MACRO_CNTL_RESERVED60                                          0x48fc
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED60                             0x48fc
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED60                             0x499c
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED60                             0x9a3c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED60                             0x9adc
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED60                             0x9b7c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED60                             0x9c1c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED60                             0x9cbc
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED60                             0x9d5c
+#define mmUNIPHY_MACRO_CNTL_RESERVED61                                          0x48fd
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED61                             0x48fd
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED61                             0x499d
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED61                             0x9a3d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED61                             0x9add
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED61                             0x9b7d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED61                             0x9c1d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED61                             0x9cbd
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED61                             0x9d5d
+#define mmUNIPHY_MACRO_CNTL_RESERVED62                                          0x48fe
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED62                             0x48fe
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED62                             0x499e
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED62                             0x9a3e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED62                             0x9ade
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED62                             0x9b7e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED62                             0x9c1e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED62                             0x9cbe
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED62                             0x9d5e
+#define mmUNIPHY_MACRO_CNTL_RESERVED63                                          0x48ff
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED63                             0x48ff
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED63                             0x499f
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED63                             0x9a3f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED63                             0x9adf
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED63                             0x9b7f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED63                             0x9c1f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED63                             0x9cbf
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED63                             0x9d5f
+#define mmUNIPHY_MACRO_CNTL_RESERVED64                                          0x4900
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED64                             0x4900
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED64                             0x49a0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED64                             0x9a40
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED64                             0x9ae0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED64                             0x9b80
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED64                             0x9c20
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED64                             0x9cc0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED64                             0x9d60
+#define mmUNIPHY_MACRO_CNTL_RESERVED65                                          0x4901
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED65                             0x4901
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED65                             0x49a1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED65                             0x9a41
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED65                             0x9ae1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED65                             0x9b81
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED65                             0x9c21
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED65                             0x9cc1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED65                             0x9d61
+#define mmUNIPHY_MACRO_CNTL_RESERVED66                                          0x4902
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED66                             0x4902
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED66                             0x49a2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED66                             0x9a42
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED66                             0x9ae2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED66                             0x9b82
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED66                             0x9c22
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED66                             0x9cc2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED66                             0x9d62
+#define mmUNIPHY_MACRO_CNTL_RESERVED67                                          0x4903
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED67                             0x4903
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED67                             0x49a3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED67                             0x9a43
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED67                             0x9ae3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED67                             0x9b83
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED67                             0x9c23
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED67                             0x9cc3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED67                             0x9d63
+#define mmUNIPHY_MACRO_CNTL_RESERVED68                                          0x4904
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED68                             0x4904
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED68                             0x49a4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED68                             0x9a44
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED68                             0x9ae4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED68                             0x9b84
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED68                             0x9c24
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED68                             0x9cc4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED68                             0x9d64
+#define mmUNIPHY_MACRO_CNTL_RESERVED69                                          0x4905
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED69                             0x4905
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED69                             0x49a5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED69                             0x9a45
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED69                             0x9ae5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED69                             0x9b85
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED69                             0x9c25
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED69                             0x9cc5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED69                             0x9d65
+#define mmUNIPHY_MACRO_CNTL_RESERVED70                                          0x4906
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED70                             0x4906
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED70                             0x49a6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED70                             0x9a46
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED70                             0x9ae6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED70                             0x9b86
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED70                             0x9c26
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED70                             0x9cc6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED70                             0x9d66
+#define mmUNIPHY_MACRO_CNTL_RESERVED71                                          0x4907
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED71                             0x4907
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED71                             0x49a7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED71                             0x9a47
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED71                             0x9ae7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED71                             0x9b87
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED71                             0x9c27
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED71                             0x9cc7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED71                             0x9d67
+#define mmUNIPHY_MACRO_CNTL_RESERVED72                                          0x4908
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED72                             0x4908
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED72                             0x49a8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED72                             0x9a48
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED72                             0x9ae8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED72                             0x9b88
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED72                             0x9c28
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED72                             0x9cc8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED72                             0x9d68
+#define mmUNIPHY_MACRO_CNTL_RESERVED73                                          0x4909
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED73                             0x4909
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED73                             0x49a9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED73                             0x9a49
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED73                             0x9ae9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED73                             0x9b89
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED73                             0x9c29
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED73                             0x9cc9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED73                             0x9d69
+#define mmUNIPHY_MACRO_CNTL_RESERVED74                                          0x490a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED74                             0x490a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED74                             0x49aa
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED74                             0x9a4a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED74                             0x9aea
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED74                             0x9b8a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED74                             0x9c2a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED74                             0x9cca
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED74                             0x9d6a
+#define mmUNIPHY_MACRO_CNTL_RESERVED75                                          0x490b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED75                             0x490b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED75                             0x49ab
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED75                             0x9a4b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED75                             0x9aeb
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED75                             0x9b8b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED75                             0x9c2b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED75                             0x9ccb
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED75                             0x9d6b
+#define mmUNIPHY_MACRO_CNTL_RESERVED76                                          0x490c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED76                             0x490c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED76                             0x49ac
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED76                             0x9a4c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED76                             0x9aec
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED76                             0x9b8c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED76                             0x9c2c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED76                             0x9ccc
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED76                             0x9d6c
+#define mmUNIPHY_MACRO_CNTL_RESERVED77                                          0x490d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED77                             0x490d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED77                             0x49ad
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED77                             0x9a4d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED77                             0x9aed
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED77                             0x9b8d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED77                             0x9c2d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED77                             0x9ccd
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED77                             0x9d6d
+#define mmUNIPHY_MACRO_CNTL_RESERVED78                                          0x490e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED78                             0x490e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED78                             0x49ae
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED78                             0x9a4e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED78                             0x9aee
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED78                             0x9b8e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED78                             0x9c2e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED78                             0x9cce
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED78                             0x9d6e
+#define mmUNIPHY_MACRO_CNTL_RESERVED79                                          0x490f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED79                             0x490f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED79                             0x49af
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED79                             0x9a4f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED79                             0x9aef
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED79                             0x9b8f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED79                             0x9c2f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED79                             0x9ccf
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED79                             0x9d6f
+#define mmUNIPHY_MACRO_CNTL_RESERVED80                                          0x4910
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED80                             0x4910
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED80                             0x49b0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED80                             0x9a50
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED80                             0x9af0
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED80                             0x9b90
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED80                             0x9c30
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED80                             0x9cd0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED80                             0x9d70
+#define mmUNIPHY_MACRO_CNTL_RESERVED81                                          0x4911
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED81                             0x4911
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED81                             0x49b1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED81                             0x9a51
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED81                             0x9af1
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED81                             0x9b91
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED81                             0x9c31
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED81                             0x9cd1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED81                             0x9d71
+#define mmUNIPHY_MACRO_CNTL_RESERVED82                                          0x4912
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED82                             0x4912
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED82                             0x49b2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED82                             0x9a52
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED82                             0x9af2
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED82                             0x9b92
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED82                             0x9c32
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED82                             0x9cd2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED82                             0x9d72
+#define mmUNIPHY_MACRO_CNTL_RESERVED83                                          0x4913
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED83                             0x4913
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED83                             0x49b3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED83                             0x9a53
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED83                             0x9af3
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED83                             0x9b93
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED83                             0x9c33
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED83                             0x9cd3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED83                             0x9d73
+#define mmUNIPHY_MACRO_CNTL_RESERVED84                                          0x4914
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED84                             0x4914
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED84                             0x49b4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED84                             0x9a54
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED84                             0x9af4
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED84                             0x9b94
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED84                             0x9c34
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED84                             0x9cd4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED84                             0x9d74
+#define mmUNIPHY_MACRO_CNTL_RESERVED85                                          0x4915
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED85                             0x4915
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED85                             0x49b5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED85                             0x9a55
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED85                             0x9af5
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED85                             0x9b95
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED85                             0x9c35
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED85                             0x9cd5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED85                             0x9d75
+#define mmUNIPHY_MACRO_CNTL_RESERVED86                                          0x4916
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED86                             0x4916
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED86                             0x49b6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED86                             0x9a56
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED86                             0x9af6
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED86                             0x9b96
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED86                             0x9c36
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED86                             0x9cd6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED86                             0x9d76
+#define mmUNIPHY_MACRO_CNTL_RESERVED87                                          0x4917
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED87                             0x4917
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED87                             0x49b7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED87                             0x9a57
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED87                             0x9af7
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED87                             0x9b97
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED87                             0x9c37
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED87                             0x9cd7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED87                             0x9d77
+#define mmUNIPHY_MACRO_CNTL_RESERVED88                                          0x4918
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED88                             0x4918
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED88                             0x49b8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED88                             0x9a58
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED88                             0x9af8
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED88                             0x9b98
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED88                             0x9c38
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED88                             0x9cd8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED88                             0x9d78
+#define mmUNIPHY_MACRO_CNTL_RESERVED89                                          0x4919
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED89                             0x4919
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED89                             0x49b9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED89                             0x9a59
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED89                             0x9af9
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED89                             0x9b99
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED89                             0x9c39
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED89                             0x9cd9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED89                             0x9d79
+#define mmUNIPHY_MACRO_CNTL_RESERVED90                                          0x491a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED90                             0x491a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED90                             0x49ba
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED90                             0x9a5a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED90                             0x9afa
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED90                             0x9b9a
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED90                             0x9c3a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED90                             0x9cda
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED90                             0x9d7a
+#define mmUNIPHY_MACRO_CNTL_RESERVED91                                          0x491b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED91                             0x491b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED91                             0x49bb
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED91                             0x9a5b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED91                             0x9afb
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED91                             0x9b9b
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED91                             0x9c3b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED91                             0x9cdb
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED91                             0x9d7b
+#define mmUNIPHY_MACRO_CNTL_RESERVED92                                          0x491c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED92                             0x491c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED92                             0x49bc
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED92                             0x9a5c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED92                             0x9afc
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED92                             0x9b9c
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED92                             0x9c3c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED92                             0x9cdc
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED92                             0x9d7c
+#define mmUNIPHY_MACRO_CNTL_RESERVED93                                          0x491d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED93                             0x491d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED93                             0x49bd
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED93                             0x9a5d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED93                             0x9afd
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED93                             0x9b9d
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED93                             0x9c3d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED93                             0x9cdd
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED93                             0x9d7d
+#define mmUNIPHY_MACRO_CNTL_RESERVED94                                          0x491e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED94                             0x491e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED94                             0x49be
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED94                             0x9a5e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED94                             0x9afe
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED94                             0x9b9e
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED94                             0x9c3e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED94                             0x9cde
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED94                             0x9d7e
+#define mmUNIPHY_MACRO_CNTL_RESERVED95                                          0x491f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED95                             0x491f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED95                             0x49bf
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED95                             0x9a5f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED95                             0x9aff
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED95                             0x9b9f
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED95                             0x9c3f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED95                             0x9cdf
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED95                             0x9d7f
+#define mmUNIPHY_MACRO_CNTL_RESERVED96                                          0x4920
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED96                             0x4920
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED96                             0x49c0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED96                             0x9a60
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED96                             0x9b00
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED96                             0x9ba0
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED96                             0x9c40
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED96                             0x9ce0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED96                             0x9d80
+#define mmUNIPHY_MACRO_CNTL_RESERVED97                                          0x4921
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED97                             0x4921
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED97                             0x49c1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED97                             0x9a61
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED97                             0x9b01
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED97                             0x9ba1
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED97                             0x9c41
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED97                             0x9ce1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED97                             0x9d81
+#define mmUNIPHY_MACRO_CNTL_RESERVED98                                          0x4922
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED98                             0x4922
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED98                             0x49c2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED98                             0x9a62
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED98                             0x9b02
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED98                             0x9ba2
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED98                             0x9c42
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED98                             0x9ce2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED98                             0x9d82
+#define mmUNIPHY_MACRO_CNTL_RESERVED99                                          0x4923
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED99                             0x4923
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED99                             0x49c3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED99                             0x9a63
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED99                             0x9b03
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED99                             0x9ba3
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED99                             0x9c43
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED99                             0x9ce3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED99                             0x9d83
+#define mmUNIPHY_MACRO_CNTL_RESERVED100                                         0x4924
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED100                            0x4924
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED100                            0x49c4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED100                            0x9a64
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED100                            0x9b04
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED100                            0x9ba4
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED100                            0x9c44
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED100                            0x9ce4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED100                            0x9d84
+#define mmUNIPHY_MACRO_CNTL_RESERVED101                                         0x4925
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED101                            0x4925
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED101                            0x49c5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED101                            0x9a65
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED101                            0x9b05
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED101                            0x9ba5
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED101                            0x9c45
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED101                            0x9ce5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED101                            0x9d85
+#define mmUNIPHY_MACRO_CNTL_RESERVED102                                         0x4926
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED102                            0x4926
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED102                            0x49c6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED102                            0x9a66
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED102                            0x9b06
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED102                            0x9ba6
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED102                            0x9c46
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED102                            0x9ce6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED102                            0x9d86
+#define mmUNIPHY_MACRO_CNTL_RESERVED103                                         0x4927
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED103                            0x4927
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED103                            0x49c7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED103                            0x9a67
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED103                            0x9b07
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED103                            0x9ba7
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED103                            0x9c47
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED103                            0x9ce7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED103                            0x9d87
+#define mmUNIPHY_MACRO_CNTL_RESERVED104                                         0x4928
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED104                            0x4928
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED104                            0x49c8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED104                            0x9a68
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED104                            0x9b08
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED104                            0x9ba8
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED104                            0x9c48
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED104                            0x9ce8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED104                            0x9d88
+#define mmUNIPHY_MACRO_CNTL_RESERVED105                                         0x4929
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED105                            0x4929
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED105                            0x49c9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED105                            0x9a69
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED105                            0x9b09
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED105                            0x9ba9
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED105                            0x9c49
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED105                            0x9ce9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED105                            0x9d89
+#define mmUNIPHY_MACRO_CNTL_RESERVED106                                         0x492a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED106                            0x492a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED106                            0x49ca
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED106                            0x9a6a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED106                            0x9b0a
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED106                            0x9baa
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED106                            0x9c4a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED106                            0x9cea
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED106                            0x9d8a
+#define mmUNIPHY_MACRO_CNTL_RESERVED107                                         0x492b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED107                            0x492b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED107                            0x49cb
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED107                            0x9a6b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED107                            0x9b0b
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED107                            0x9bab
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED107                            0x9c4b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED107                            0x9ceb
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED107                            0x9d8b
+#define mmUNIPHY_MACRO_CNTL_RESERVED108                                         0x492c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED108                            0x492c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED108                            0x49cc
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED108                            0x9a6c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED108                            0x9b0c
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED108                            0x9bac
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED108                            0x9c4c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED108                            0x9cec
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED108                            0x9d8c
+#define mmUNIPHY_MACRO_CNTL_RESERVED109                                         0x492d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED109                            0x492d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED109                            0x49cd
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED109                            0x9a6d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED109                            0x9b0d
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED109                            0x9bad
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED109                            0x9c4d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED109                            0x9ced
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED109                            0x9d8d
+#define mmUNIPHY_MACRO_CNTL_RESERVED110                                         0x492e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED110                            0x492e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED110                            0x49ce
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED110                            0x9a6e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED110                            0x9b0e
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED110                            0x9bae
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED110                            0x9c4e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED110                            0x9cee
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED110                            0x9d8e
+#define mmUNIPHY_MACRO_CNTL_RESERVED111                                         0x492f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED111                            0x492f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED111                            0x49cf
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED111                            0x9a6f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED111                            0x9b0f
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED111                            0x9baf
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED111                            0x9c4f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED111                            0x9cef
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED111                            0x9d8f
+#define mmUNIPHY_MACRO_CNTL_RESERVED112                                         0x4930
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED112                            0x4930
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED112                            0x49d0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED112                            0x9a70
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED112                            0x9b10
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED112                            0x9bb0
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED112                            0x9c50
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED112                            0x9cf0
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED112                            0x9d90
+#define mmUNIPHY_MACRO_CNTL_RESERVED113                                         0x4931
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED113                            0x4931
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED113                            0x49d1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED113                            0x9a71
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED113                            0x9b11
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED113                            0x9bb1
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED113                            0x9c51
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED113                            0x9cf1
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED113                            0x9d91
+#define mmUNIPHY_MACRO_CNTL_RESERVED114                                         0x4932
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED114                            0x4932
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED114                            0x49d2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED114                            0x9a72
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED114                            0x9b12
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED114                            0x9bb2
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED114                            0x9c52
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED114                            0x9cf2
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED114                            0x9d92
+#define mmUNIPHY_MACRO_CNTL_RESERVED115                                         0x4933
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED115                            0x4933
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED115                            0x49d3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED115                            0x9a73
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED115                            0x9b13
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED115                            0x9bb3
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED115                            0x9c53
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED115                            0x9cf3
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED115                            0x9d93
+#define mmUNIPHY_MACRO_CNTL_RESERVED116                                         0x4934
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED116                            0x4934
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED116                            0x49d4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED116                            0x9a74
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED116                            0x9b14
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED116                            0x9bb4
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED116                            0x9c54
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED116                            0x9cf4
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED116                            0x9d94
+#define mmUNIPHY_MACRO_CNTL_RESERVED117                                         0x4935
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED117                            0x4935
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED117                            0x49d5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED117                            0x9a75
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED117                            0x9b15
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED117                            0x9bb5
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED117                            0x9c55
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED117                            0x9cf5
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED117                            0x9d95
+#define mmUNIPHY_MACRO_CNTL_RESERVED118                                         0x4936
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED118                            0x4936
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED118                            0x49d6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED118                            0x9a76
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED118                            0x9b16
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED118                            0x9bb6
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED118                            0x9c56
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED118                            0x9cf6
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED118                            0x9d96
+#define mmUNIPHY_MACRO_CNTL_RESERVED119                                         0x4937
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED119                            0x4937
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED119                            0x49d7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED119                            0x9a77
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED119                            0x9b17
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED119                            0x9bb7
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED119                            0x9c57
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED119                            0x9cf7
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED119                            0x9d97
+#define mmUNIPHY_MACRO_CNTL_RESERVED120                                         0x4938
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED120                            0x4938
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED120                            0x49d8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED120                            0x9a78
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED120                            0x9b18
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED120                            0x9bb8
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED120                            0x9c58
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED120                            0x9cf8
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED120                            0x9d98
+#define mmUNIPHY_MACRO_CNTL_RESERVED121                                         0x4939
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED121                            0x4939
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED121                            0x49d9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED121                            0x9a79
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED121                            0x9b19
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED121                            0x9bb9
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED121                            0x9c59
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED121                            0x9cf9
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED121                            0x9d99
+#define mmUNIPHY_MACRO_CNTL_RESERVED122                                         0x493a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED122                            0x493a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED122                            0x49da
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED122                            0x9a7a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED122                            0x9b1a
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED122                            0x9bba
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED122                            0x9c5a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED122                            0x9cfa
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED122                            0x9d9a
+#define mmUNIPHY_MACRO_CNTL_RESERVED123                                         0x493b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED123                            0x493b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED123                            0x49db
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED123                            0x9a7b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED123                            0x9b1b
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED123                            0x9bbb
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED123                            0x9c5b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED123                            0x9cfb
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED123                            0x9d9b
+#define mmUNIPHY_MACRO_CNTL_RESERVED124                                         0x493c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED124                            0x493c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED124                            0x49dc
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED124                            0x9a7c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED124                            0x9b1c
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED124                            0x9bbc
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED124                            0x9c5c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED124                            0x9cfc
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED124                            0x9d9c
+#define mmUNIPHY_MACRO_CNTL_RESERVED125                                         0x493d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED125                            0x493d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED125                            0x49dd
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED125                            0x9a7d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED125                            0x9b1d
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED125                            0x9bbd
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED125                            0x9c5d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED125                            0x9cfd
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED125                            0x9d9d
+#define mmUNIPHY_MACRO_CNTL_RESERVED126                                         0x493e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED126                            0x493e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED126                            0x49de
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED126                            0x9a7e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED126                            0x9b1e
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED126                            0x9bbe
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED126                            0x9c5e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED126                            0x9cfe
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED126                            0x9d9e
+#define mmUNIPHY_MACRO_CNTL_RESERVED127                                         0x493f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED127                            0x493f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED127                            0x49df
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED127                            0x9a7f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED127                            0x9b1f
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED127                            0x9bbf
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED127                            0x9c5f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED127                            0x9cff
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED127                            0x9d9f
+#define mmUNIPHY_MACRO_CNTL_RESERVED128                                         0x4940
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED128                            0x4940
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED128                            0x49e0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED128                            0x9a80
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED128                            0x9b20
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED128                            0x9bc0
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED128                            0x9c60
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED128                            0x9d00
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED128                            0x9da0
+#define mmUNIPHY_MACRO_CNTL_RESERVED129                                         0x4941
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED129                            0x4941
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED129                            0x49e1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED129                            0x9a81
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED129                            0x9b21
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED129                            0x9bc1
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED129                            0x9c61
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED129                            0x9d01
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED129                            0x9da1
+#define mmUNIPHY_MACRO_CNTL_RESERVED130                                         0x4942
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED130                            0x4942
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED130                            0x49e2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED130                            0x9a82
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED130                            0x9b22
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED130                            0x9bc2
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED130                            0x9c62
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED130                            0x9d02
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED130                            0x9da2
+#define mmUNIPHY_MACRO_CNTL_RESERVED131                                         0x4943
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED131                            0x4943
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED131                            0x49e3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED131                            0x9a83
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED131                            0x9b23
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED131                            0x9bc3
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED131                            0x9c63
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED131                            0x9d03
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED131                            0x9da3
+#define mmUNIPHY_MACRO_CNTL_RESERVED132                                         0x4944
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED132                            0x4944
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED132                            0x49e4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED132                            0x9a84
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED132                            0x9b24
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED132                            0x9bc4
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED132                            0x9c64
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED132                            0x9d04
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED132                            0x9da4
+#define mmUNIPHY_MACRO_CNTL_RESERVED133                                         0x4945
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED133                            0x4945
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED133                            0x49e5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED133                            0x9a85
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED133                            0x9b25
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED133                            0x9bc5
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED133                            0x9c65
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED133                            0x9d05
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED133                            0x9da5
+#define mmUNIPHY_MACRO_CNTL_RESERVED134                                         0x4946
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED134                            0x4946
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED134                            0x49e6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED134                            0x9a86
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED134                            0x9b26
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED134                            0x9bc6
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED134                            0x9c66
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED134                            0x9d06
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED134                            0x9da6
+#define mmUNIPHY_MACRO_CNTL_RESERVED135                                         0x4947
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED135                            0x4947
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED135                            0x49e7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED135                            0x9a87
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED135                            0x9b27
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED135                            0x9bc7
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED135                            0x9c67
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED135                            0x9d07
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED135                            0x9da7
+#define mmUNIPHY_MACRO_CNTL_RESERVED136                                         0x4948
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED136                            0x4948
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED136                            0x49e8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED136                            0x9a88
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED136                            0x9b28
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED136                            0x9bc8
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED136                            0x9c68
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED136                            0x9d08
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED136                            0x9da8
+#define mmUNIPHY_MACRO_CNTL_RESERVED137                                         0x4949
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED137                            0x4949
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED137                            0x49e9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED137                            0x9a89
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED137                            0x9b29
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED137                            0x9bc9
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED137                            0x9c69
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED137                            0x9d09
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED137                            0x9da9
+#define mmUNIPHY_MACRO_CNTL_RESERVED138                                         0x494a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED138                            0x494a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED138                            0x49ea
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED138                            0x9a8a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED138                            0x9b2a
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED138                            0x9bca
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED138                            0x9c6a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED138                            0x9d0a
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED138                            0x9daa
+#define mmUNIPHY_MACRO_CNTL_RESERVED139                                         0x494b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED139                            0x494b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED139                            0x49eb
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED139                            0x9a8b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED139                            0x9b2b
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED139                            0x9bcb
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED139                            0x9c6b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED139                            0x9d0b
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED139                            0x9dab
+#define mmUNIPHY_MACRO_CNTL_RESERVED140                                         0x494c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED140                            0x494c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED140                            0x49ec
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED140                            0x9a8c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED140                            0x9b2c
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED140                            0x9bcc
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED140                            0x9c6c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED140                            0x9d0c
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED140                            0x9dac
+#define mmUNIPHY_MACRO_CNTL_RESERVED141                                         0x494d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED141                            0x494d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED141                            0x49ed
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED141                            0x9a8d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED141                            0x9b2d
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED141                            0x9bcd
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED141                            0x9c6d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED141                            0x9d0d
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED141                            0x9dad
+#define mmUNIPHY_MACRO_CNTL_RESERVED142                                         0x494e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED142                            0x494e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED142                            0x49ee
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED142                            0x9a8e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED142                            0x9b2e
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED142                            0x9bce
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED142                            0x9c6e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED142                            0x9d0e
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED142                            0x9dae
+#define mmUNIPHY_MACRO_CNTL_RESERVED143                                         0x494f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED143                            0x494f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED143                            0x49ef
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED143                            0x9a8f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED143                            0x9b2f
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED143                            0x9bcf
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED143                            0x9c6f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED143                            0x9d0f
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED143                            0x9daf
+#define mmUNIPHY_MACRO_CNTL_RESERVED144                                         0x4950
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED144                            0x4950
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED144                            0x49f0
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED144                            0x9a90
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED144                            0x9b30
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED144                            0x9bd0
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED144                            0x9c70
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED144                            0x9d10
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED144                            0x9db0
+#define mmUNIPHY_MACRO_CNTL_RESERVED145                                         0x4951
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED145                            0x4951
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED145                            0x49f1
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED145                            0x9a91
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED145                            0x9b31
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED145                            0x9bd1
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED145                            0x9c71
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED145                            0x9d11
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED145                            0x9db1
+#define mmUNIPHY_MACRO_CNTL_RESERVED146                                         0x4952
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED146                            0x4952
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED146                            0x49f2
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED146                            0x9a92
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED146                            0x9b32
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED146                            0x9bd2
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED146                            0x9c72
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED146                            0x9d12
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED146                            0x9db2
+#define mmUNIPHY_MACRO_CNTL_RESERVED147                                         0x4953
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED147                            0x4953
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED147                            0x49f3
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED147                            0x9a93
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED147                            0x9b33
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED147                            0x9bd3
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED147                            0x9c73
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED147                            0x9d13
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED147                            0x9db3
+#define mmUNIPHY_MACRO_CNTL_RESERVED148                                         0x4954
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED148                            0x4954
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED148                            0x49f4
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED148                            0x9a94
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED148                            0x9b34
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED148                            0x9bd4
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED148                            0x9c74
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED148                            0x9d14
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED148                            0x9db4
+#define mmUNIPHY_MACRO_CNTL_RESERVED149                                         0x4955
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED149                            0x4955
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED149                            0x49f5
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED149                            0x9a95
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED149                            0x9b35
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED149                            0x9bd5
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED149                            0x9c75
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED149                            0x9d15
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED149                            0x9db5
+#define mmUNIPHY_MACRO_CNTL_RESERVED150                                         0x4956
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED150                            0x4956
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED150                            0x49f6
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED150                            0x9a96
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED150                            0x9b36
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED150                            0x9bd6
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED150                            0x9c76
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED150                            0x9d16
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED150                            0x9db6
+#define mmUNIPHY_MACRO_CNTL_RESERVED151                                         0x4957
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED151                            0x4957
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED151                            0x49f7
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED151                            0x9a97
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED151                            0x9b37
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED151                            0x9bd7
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED151                            0x9c77
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED151                            0x9d17
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED151                            0x9db7
+#define mmUNIPHY_MACRO_CNTL_RESERVED152                                         0x4958
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED152                            0x4958
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED152                            0x49f8
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED152                            0x9a98
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED152                            0x9b38
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED152                            0x9bd8
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED152                            0x9c78
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED152                            0x9d18
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED152                            0x9db8
+#define mmUNIPHY_MACRO_CNTL_RESERVED153                                         0x4959
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED153                            0x4959
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED153                            0x49f9
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED153                            0x9a99
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED153                            0x9b39
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED153                            0x9bd9
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED153                            0x9c79
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED153                            0x9d19
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED153                            0x9db9
+#define mmUNIPHY_MACRO_CNTL_RESERVED154                                         0x495a
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED154                            0x495a
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED154                            0x49fa
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED154                            0x9a9a
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED154                            0x9b3a
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED154                            0x9bda
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED154                            0x9c7a
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED154                            0x9d1a
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED154                            0x9dba
+#define mmUNIPHY_MACRO_CNTL_RESERVED155                                         0x495b
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED155                            0x495b
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED155                            0x49fb
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED155                            0x9a9b
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED155                            0x9b3b
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED155                            0x9bdb
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED155                            0x9c7b
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED155                            0x9d1b
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED155                            0x9dbb
+#define mmUNIPHY_MACRO_CNTL_RESERVED156                                         0x495c
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED156                            0x495c
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED156                            0x49fc
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED156                            0x9a9c
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED156                            0x9b3c
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED156                            0x9bdc
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED156                            0x9c7c
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED156                            0x9d1c
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED156                            0x9dbc
+#define mmUNIPHY_MACRO_CNTL_RESERVED157                                         0x495d
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED157                            0x495d
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED157                            0x49fd
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED157                            0x9a9d
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED157                            0x9b3d
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED157                            0x9bdd
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED157                            0x9c7d
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED157                            0x9d1d
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED157                            0x9dbd
+#define mmUNIPHY_MACRO_CNTL_RESERVED158                                         0x495e
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED158                            0x495e
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED158                            0x49fe
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED158                            0x9a9e
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED158                            0x9b3e
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED158                            0x9bde
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED158                            0x9c7e
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED158                            0x9d1e
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED158                            0x9dbe
+#define mmUNIPHY_MACRO_CNTL_RESERVED159                                         0x495f
+#define mmDCIO_UNIPHY0_UNIPHY_MACRO_CNTL_RESERVED159                            0x495f
+#define mmDCIO_UNIPHY1_UNIPHY_MACRO_CNTL_RESERVED159                            0x49ff
+#define mmDCIO_UNIPHY2_UNIPHY_MACRO_CNTL_RESERVED159                            0x9a9f
+#define mmDCIO_UNIPHY3_UNIPHY_MACRO_CNTL_RESERVED159                            0x9b3f
+#define mmDCIO_UNIPHY4_UNIPHY_MACRO_CNTL_RESERVED159                            0x9bdf
+#define mmDCIO_UNIPHY5_UNIPHY_MACRO_CNTL_RESERVED159                            0x9c7f
+#define mmDCIO_UNIPHY6_UNIPHY_MACRO_CNTL_RESERVED159                            0x9d1f
+#define mmDCIO_UNIPHY7_UNIPHY_MACRO_CNTL_RESERVED159                            0x9dbf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED0                                         0x5a84
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED1                                         0x5a85
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED2                                         0x5a86
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED3                                         0x5a87
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED4                                         0x5a88
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED5                                         0x5a89
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED6                                         0x5a8a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED7                                         0x5a8b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED8                                         0x5a8c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED9                                         0x5a8d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED10                                        0x5a8e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED11                                        0x5a8f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED12                                        0x5a90
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED13                                        0x5a91
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED14                                        0x5a92
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED15                                        0x5a93
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED16                                        0x5a94
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED17                                        0x5a95
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED18                                        0x5a96
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED19                                        0x5a97
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED20                                        0x5a98
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED21                                        0x5a99
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED22                                        0x5a9a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED23                                        0x5a9b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED24                                        0x5a9c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED25                                        0x5a9d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED26                                        0x5a9e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED27                                        0x5a9f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED28                                        0x5aa0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED29                                        0x5aa1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED30                                        0x5aa2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED31                                        0x5aa3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED32                                        0x5aa4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED33                                        0x5aa5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED34                                        0x5aa6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED35                                        0x5aa7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED36                                        0x5aa8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED37                                        0x5aa9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED38                                        0x5aaa
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED39                                        0x5aab
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED40                                        0x5aac
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED41                                        0x5aad
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED42                                        0x5aae
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED43                                        0x5aaf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED44                                        0x5ab0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED45                                        0x5ab1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED46                                        0x5ab2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED47                                        0x5ab3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED48                                        0x5ab4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED49                                        0x5ab5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED50                                        0x5ab6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED51                                        0x5ab7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED52                                        0x5ab8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED53                                        0x5ab9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED54                                        0x5aba
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED55                                        0x5abb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED56                                        0x5abc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED57                                        0x5abd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED58                                        0x5abe
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED59                                        0x5abf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED60                                        0x5ac0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED61                                        0x5ac1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED62                                        0x5ac2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED63                                        0x5ac3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED64                                        0x5ac4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED65                                        0x5ac5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED66                                        0x5ac6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED67                                        0x5ac7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED68                                        0x5ac8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED69                                        0x5ac9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED70                                        0x5aca
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED71                                        0x5acb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED72                                        0x5acc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED73                                        0x5acd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED74                                        0x5ace
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED75                                        0x5acf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED76                                        0x5ad0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED77                                        0x5ad1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED78                                        0x5ad2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED79                                        0x5ad3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED80                                        0x5ad4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED81                                        0x5ad5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED82                                        0x5ad6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED83                                        0x5ad7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED84                                        0x5ad8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED85                                        0x5ad9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED86                                        0x5ada
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED87                                        0x5adb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED88                                        0x5adc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED89                                        0x5add
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED90                                        0x5ade
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED91                                        0x5adf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED92                                        0x5ae0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED93                                        0x5ae1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED94                                        0x5ae2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED95                                        0x5ae3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED96                                        0x5ae4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED97                                        0x5ae5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED98                                        0x5ae6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED99                                        0x5ae7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED100                                       0x5ae8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED101                                       0x5ae9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED102                                       0x5aea
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED103                                       0x5aeb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED104                                       0x5aec
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED105                                       0x5aed
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED106                                       0x5aee
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED107                                       0x5aef
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED108                                       0x5af0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED109                                       0x5af1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED110                                       0x5af2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED111                                       0x5af3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED112                                       0x5af4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED113                                       0x5af5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED114                                       0x5af6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED115                                       0x5af7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED116                                       0x5af8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED117                                       0x5af9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED118                                       0x5afa
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED119                                       0x5afb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED120                                       0x5afc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED121                                       0x5afd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED122                                       0x5afe
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED123                                       0x5aff
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED124                                       0x5b00
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED125                                       0x5b01
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED126                                       0x5b02
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED127                                       0x5b03
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED128                                       0x5b04
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED129                                       0x5b05
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED130                                       0x5b06
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED131                                       0x5b07
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED132                                       0x5b08
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED133                                       0x5b09
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED134                                       0x5b0a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED135                                       0x5b0b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED136                                       0x5b0c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED137                                       0x5b0d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED138                                       0x5b0e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED139                                       0x5b0f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED140                                       0x5b10
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED141                                       0x5b11
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED142                                       0x5b12
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED143                                       0x5b13
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED144                                       0x5b14
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED145                                       0x5b15
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED146                                       0x5b16
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED147                                       0x5b17
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED148                                       0x5b18
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED149                                       0x5b19
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED150                                       0x5b1a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED151                                       0x5b1b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED152                                       0x5b1c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED153                                       0x5b1d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED154                                       0x5b1e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED155                                       0x5b1f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED156                                       0x5b20
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED157                                       0x5b21
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED158                                       0x5b22
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED159                                       0x5b23
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED160                                       0x5b24
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED161                                       0x5b25
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED162                                       0x5b26
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED163                                       0x5b27
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED164                                       0x5b28
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED165                                       0x5b29
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED166                                       0x5b2a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED167                                       0x5b2b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED168                                       0x5b2c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED169                                       0x5b2d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED170                                       0x5b2e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED171                                       0x5b2f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED172                                       0x5b30
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED173                                       0x5b31
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED174                                       0x5b32
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED175                                       0x5b33
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED176                                       0x5b34
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED177                                       0x5b35
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED178                                       0x5b36
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED179                                       0x5b37
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED180                                       0x5b38
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED181                                       0x5b39
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED182                                       0x5b3a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED183                                       0x5b3b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED184                                       0x5b3c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED185                                       0x5b3d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED186                                       0x5b3e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED187                                       0x5b3f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED188                                       0x5b40
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED189                                       0x5b41
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED190                                       0x5b42
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED191                                       0x5b43
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED192                                       0x5b44
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED193                                       0x5b45
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED194                                       0x5b46
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED195                                       0x5b47
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED196                                       0x5b48
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED197                                       0x5b49
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED198                                       0x5b4a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED199                                       0x5b4b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED200                                       0x5b4c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED201                                       0x5b4d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED202                                       0x5b4e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED203                                       0x5b4f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED204                                       0x5b50
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED205                                       0x5b51
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED206                                       0x5b52
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED207                                       0x5b53
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED208                                       0x5b54
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED209                                       0x5b55
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED210                                       0x5b56
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED211                                       0x5b57
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED212                                       0x5b58
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED213                                       0x5b59
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED214                                       0x5b5a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED215                                       0x5b5b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED216                                       0x5b5c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED217                                       0x5b5d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED218                                       0x5b5e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED219                                       0x5b5f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED220                                       0x5b60
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED221                                       0x5b61
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED222                                       0x5b62
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED223                                       0x5b63
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED224                                       0x5b64
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED225                                       0x5b65
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED226                                       0x5b66
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED227                                       0x5b67
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED228                                       0x5b68
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED229                                       0x5b69
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED230                                       0x5b6a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED231                                       0x5b6b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED232                                       0x5b6c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED233                                       0x5b6d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED234                                       0x5b6e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED235                                       0x5b6f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED236                                       0x5b70
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED237                                       0x5b71
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED238                                       0x5b72
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED239                                       0x5b73
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED240                                       0x5b74
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED241                                       0x5b75
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED242                                       0x5b76
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED243                                       0x5b77
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED244                                       0x5b78
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED245                                       0x5b79
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED246                                       0x5b7a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED247                                       0x5b7b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED248                                       0x5b7c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED249                                       0x5b7d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED250                                       0x5b7e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED251                                       0x5b7f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED252                                       0x5b80
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED253                                       0x5b81
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED254                                       0x5b82
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED255                                       0x5b83
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED256                                       0x5b84
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED257                                       0x5b85
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED258                                       0x5b86
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED259                                       0x5b87
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED260                                       0x5b88
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED261                                       0x5b89
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED262                                       0x5b8a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED263                                       0x5b8b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED264                                       0x5b8c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED265                                       0x5b8d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED266                                       0x5b8e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED267                                       0x5b8f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED268                                       0x5b90
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED269                                       0x5b91
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED270                                       0x5b92
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED271                                       0x5b93
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED272                                       0x5b94
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED273                                       0x5b95
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED274                                       0x5b96
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED275                                       0x5b97
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED276                                       0x5b98
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED277                                       0x5b99
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED278                                       0x5b9a
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED279                                       0x5b9b
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED280                                       0x5b9c
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED281                                       0x5b9d
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED282                                       0x5b9e
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED283                                       0x5b9f
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED284                                       0x5ba0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED285                                       0x5ba1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED286                                       0x5ba2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED287                                       0x5ba3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED288                                       0x5ba4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED289                                       0x5ba5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED290                                       0x5ba6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED291                                       0x5ba7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED292                                       0x5ba8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED293                                       0x5ba9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED294                                       0x5baa
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED295                                       0x5bab
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED296                                       0x5bac
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED297                                       0x5bad
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED298                                       0x5bae
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED299                                       0x5baf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED300                                       0x5bb0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED301                                       0x5bb1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED302                                       0x5bb2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED303                                       0x5bb3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED304                                       0x5bb4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED305                                       0x5bb5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED306                                       0x5bb6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED307                                       0x5bb7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED308                                       0x5bb8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED309                                       0x5bb9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED310                                       0x5bba
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED311                                       0x5bbb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED312                                       0x5bbc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED313                                       0x5bbd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED314                                       0x5bbe
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED315                                       0x5bbf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED316                                       0x5bc0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED317                                       0x5bc1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED318                                       0x5bc2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED319                                       0x5bc3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED320                                       0x5bc4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED321                                       0x5bc5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED322                                       0x5bc6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED323                                       0x5bc7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED324                                       0x5bc8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED325                                       0x5bc9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED326                                       0x5bca
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED327                                       0x5bcb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED328                                       0x5bcc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED329                                       0x5bcd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED330                                       0x5bce
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED331                                       0x5bcf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED332                                       0x5bd0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED333                                       0x5bd1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED334                                       0x5bd2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED335                                       0x5bd3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED336                                       0x5bd4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED337                                       0x5bd5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED338                                       0x5bd6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED339                                       0x5bd7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED340                                       0x5bd8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED341                                       0x5bd9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED342                                       0x5bda
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED343                                       0x5bdb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED344                                       0x5bdc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED345                                       0x5bdd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED346                                       0x5bde
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED347                                       0x5bdf
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED348                                       0x5be0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED349                                       0x5be1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED350                                       0x5be2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED351                                       0x5be3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED352                                       0x5be4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED353                                       0x5be5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED354                                       0x5be6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED355                                       0x5be7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED356                                       0x5be8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED357                                       0x5be9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED358                                       0x5bea
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED359                                       0x5beb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED360                                       0x5bec
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED361                                       0x5bed
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED362                                       0x5bee
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED363                                       0x5bef
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED364                                       0x5bf0
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED365                                       0x5bf1
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED366                                       0x5bf2
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED367                                       0x5bf3
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED368                                       0x5bf4
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED369                                       0x5bf5
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED370                                       0x5bf6
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED371                                       0x5bf7
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED372                                       0x5bf8
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED373                                       0x5bf9
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED374                                       0x5bfa
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED375                                       0x5bfb
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED376                                       0x5bfc
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED377                                       0x5bfd
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED378                                       0x5bfe
+#define mmDCRX_PHY_MACRO_CNTL_RESERVED379                                       0x5bff
+#define mmDPHY_MACRO_CNTL_RESERVED0                                             0x5d98
+#define mmDPHY_MACRO_CNTL_RESERVED1                                             0x5d99
+#define mmDPHY_MACRO_CNTL_RESERVED2                                             0x5d9a
+#define mmDPHY_MACRO_CNTL_RESERVED3                                             0x5d9b
+#define mmDPHY_MACRO_CNTL_RESERVED4                                             0x5d9c
+#define mmDPHY_MACRO_CNTL_RESERVED5                                             0x5d9d
+#define mmDPHY_MACRO_CNTL_RESERVED6                                             0x5d9e
+#define mmDPHY_MACRO_CNTL_RESERVED7                                             0x5d9f
+#define mmDPHY_MACRO_CNTL_RESERVED8                                             0x5da0
+#define mmDPHY_MACRO_CNTL_RESERVED9                                             0x5da1
+#define mmDPHY_MACRO_CNTL_RESERVED10                                            0x5da2
+#define mmDPHY_MACRO_CNTL_RESERVED11                                            0x5da3
+#define mmDPHY_MACRO_CNTL_RESERVED12                                            0x5da4
+#define mmDPHY_MACRO_CNTL_RESERVED13                                            0x5da5
+#define mmDPHY_MACRO_CNTL_RESERVED14                                            0x5da6
+#define mmDPHY_MACRO_CNTL_RESERVED15                                            0x5da7
+#define mmDPHY_MACRO_CNTL_RESERVED16                                            0x5da8
+#define mmDPHY_MACRO_CNTL_RESERVED17                                            0x5da9
+#define mmDPHY_MACRO_CNTL_RESERVED18                                            0x5daa
+#define mmDPHY_MACRO_CNTL_RESERVED19                                            0x5dab
+#define mmDPHY_MACRO_CNTL_RESERVED20                                            0x5dac
+#define mmDPHY_MACRO_CNTL_RESERVED21                                            0x5dad
+#define mmDPHY_MACRO_CNTL_RESERVED22                                            0x5dae
+#define mmDPHY_MACRO_CNTL_RESERVED23                                            0x5daf
+#define mmDPHY_MACRO_CNTL_RESERVED24                                            0x5db0
+#define mmDPHY_MACRO_CNTL_RESERVED25                                            0x5db1
+#define mmDPHY_MACRO_CNTL_RESERVED26                                            0x5db2
+#define mmDPHY_MACRO_CNTL_RESERVED27                                            0x5db3
+#define mmDPHY_MACRO_CNTL_RESERVED28                                            0x5db4
+#define mmDPHY_MACRO_CNTL_RESERVED29                                            0x5db5
+#define mmDPHY_MACRO_CNTL_RESERVED30                                            0x5db6
+#define mmDPHY_MACRO_CNTL_RESERVED31                                            0x5db7
+#define mmDPHY_MACRO_CNTL_RESERVED32                                            0x5db8
+#define mmDPHY_MACRO_CNTL_RESERVED33                                            0x5db9
+#define mmDPHY_MACRO_CNTL_RESERVED34                                            0x5dba
+#define mmDPHY_MACRO_CNTL_RESERVED35                                            0x5dbb
+#define mmDPHY_MACRO_CNTL_RESERVED36                                            0x5dbc
+#define mmDPHY_MACRO_CNTL_RESERVED37                                            0x5dbd
+#define mmDPHY_MACRO_CNTL_RESERVED38                                            0x5dbe
+#define mmDPHY_MACRO_CNTL_RESERVED39                                            0x5dbf
+#define mmDPHY_MACRO_CNTL_RESERVED40                                            0x5dc0
+#define mmDPHY_MACRO_CNTL_RESERVED41                                            0x5dc1
+#define mmDPHY_MACRO_CNTL_RESERVED42                                            0x5dc2
+#define mmDPHY_MACRO_CNTL_RESERVED43                                            0x5dc3
+#define mmDPHY_MACRO_CNTL_RESERVED44                                            0x5dc4
+#define mmDPHY_MACRO_CNTL_RESERVED45                                            0x5dc5
+#define mmDPHY_MACRO_CNTL_RESERVED46                                            0x5dc6
+#define mmDPHY_MACRO_CNTL_RESERVED47                                            0x5dc7
+#define mmDPHY_MACRO_CNTL_RESERVED48                                            0x5dc8
+#define mmDPHY_MACRO_CNTL_RESERVED49                                            0x5dc9
+#define mmDPHY_MACRO_CNTL_RESERVED50                                            0x5dca
+#define mmDPHY_MACRO_CNTL_RESERVED51                                            0x5dcb
+#define mmDPHY_MACRO_CNTL_RESERVED52                                            0x5dcc
+#define mmDPHY_MACRO_CNTL_RESERVED53                                            0x5dcd
+#define mmDPHY_MACRO_CNTL_RESERVED54                                            0x5dce
+#define mmDPHY_MACRO_CNTL_RESERVED55                                            0x5dcf
+#define mmDPHY_MACRO_CNTL_RESERVED56                                            0x5dd0
+#define mmDPHY_MACRO_CNTL_RESERVED57                                            0x5dd1
+#define mmDPHY_MACRO_CNTL_RESERVED58                                            0x5dd2
+#define mmDPHY_MACRO_CNTL_RESERVED59                                            0x5dd3
+#define mmDPHY_MACRO_CNTL_RESERVED60                                            0x5dd4
+#define mmDPHY_MACRO_CNTL_RESERVED61                                            0x5dd5
+#define mmDPHY_MACRO_CNTL_RESERVED62                                            0x5dd6
+#define mmDPHY_MACRO_CNTL_RESERVED63                                            0x5dd7
+#define mmGRPH_ENABLE                                                           0x1a00
+#define mmDCP0_GRPH_ENABLE                                                      0x1a00
+#define mmDCP1_GRPH_ENABLE                                                      0x1c00
+#define mmDCP2_GRPH_ENABLE                                                      0x1e00
+#define mmDCP3_GRPH_ENABLE                                                      0x4000
+#define mmDCP4_GRPH_ENABLE                                                      0x4200
+#define mmDCP5_GRPH_ENABLE                                                      0x4400
+#define mmGRPH_CONTROL                                                          0x1a01
+#define mmDCP0_GRPH_CONTROL                                                     0x1a01
+#define mmDCP1_GRPH_CONTROL                                                     0x1c01
+#define mmDCP2_GRPH_CONTROL                                                     0x1e01
+#define mmDCP3_GRPH_CONTROL                                                     0x4001
+#define mmDCP4_GRPH_CONTROL                                                     0x4201
+#define mmDCP5_GRPH_CONTROL                                                     0x4401
+#define mmGRPH_LUT_10BIT_BYPASS                                                 0x1a02
+#define mmDCP0_GRPH_LUT_10BIT_BYPASS                                            0x1a02
+#define mmDCP1_GRPH_LUT_10BIT_BYPASS                                            0x1c02
+#define mmDCP2_GRPH_LUT_10BIT_BYPASS                                            0x1e02
+#define mmDCP3_GRPH_LUT_10BIT_BYPASS                                            0x4002
+#define mmDCP4_GRPH_LUT_10BIT_BYPASS                                            0x4202
+#define mmDCP5_GRPH_LUT_10BIT_BYPASS                                            0x4402
+#define mmGRPH_SWAP_CNTL                                                        0x1a03
+#define mmDCP0_GRPH_SWAP_CNTL                                                   0x1a03
+#define mmDCP1_GRPH_SWAP_CNTL                                                   0x1c03
+#define mmDCP2_GRPH_SWAP_CNTL                                                   0x1e03
+#define mmDCP3_GRPH_SWAP_CNTL                                                   0x4003
+#define mmDCP4_GRPH_SWAP_CNTL                                                   0x4203
+#define mmDCP5_GRPH_SWAP_CNTL                                                   0x4403
+#define mmGRPH_PRIMARY_SURFACE_ADDRESS                                          0x1a04
+#define mmDCP0_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x1a04
+#define mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x1c04
+#define mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x1e04
+#define mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x4004
+#define mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x4204
+#define mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS                                     0x4404
+#define mmGRPH_SECONDARY_SURFACE_ADDRESS                                        0x1a05
+#define mmDCP0_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x1a05
+#define mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x1c05
+#define mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x1e05
+#define mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x4005
+#define mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x4205
+#define mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS                                   0x4405
+#define mmGRPH_PITCH                                                            0x1a06
+#define mmDCP0_GRPH_PITCH                                                       0x1a06
+#define mmDCP1_GRPH_PITCH                                                       0x1c06
+#define mmDCP2_GRPH_PITCH                                                       0x1e06
+#define mmDCP3_GRPH_PITCH                                                       0x4006
+#define mmDCP4_GRPH_PITCH                                                       0x4206
+#define mmDCP5_GRPH_PITCH                                                       0x4406
+#define mmGRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                     0x1a07
+#define mmDCP0_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x1a07
+#define mmDCP1_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x1c07
+#define mmDCP2_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x1e07
+#define mmDCP3_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x4007
+#define mmDCP4_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x4207
+#define mmDCP5_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH                                0x4407
+#define mmGRPH_SECONDARY_SURFACE_ADDRESS_HIGH                                   0x1a08
+#define mmDCP0_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x1a08
+#define mmDCP1_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x1c08
+#define mmDCP2_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x1e08
+#define mmDCP3_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x4008
+#define mmDCP4_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x4208
+#define mmDCP5_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH                              0x4408
+#define mmGRPH_SURFACE_OFFSET_X                                                 0x1a09
+#define mmDCP0_GRPH_SURFACE_OFFSET_X                                            0x1a09
+#define mmDCP1_GRPH_SURFACE_OFFSET_X                                            0x1c09
+#define mmDCP2_GRPH_SURFACE_OFFSET_X                                            0x1e09
+#define mmDCP3_GRPH_SURFACE_OFFSET_X                                            0x4009
+#define mmDCP4_GRPH_SURFACE_OFFSET_X                                            0x4209
+#define mmDCP5_GRPH_SURFACE_OFFSET_X                                            0x4409
+#define mmGRPH_SURFACE_OFFSET_Y                                                 0x1a0a
+#define mmDCP0_GRPH_SURFACE_OFFSET_Y                                            0x1a0a
+#define mmDCP1_GRPH_SURFACE_OFFSET_Y                                            0x1c0a
+#define mmDCP2_GRPH_SURFACE_OFFSET_Y                                            0x1e0a
+#define mmDCP3_GRPH_SURFACE_OFFSET_Y                                            0x400a
+#define mmDCP4_GRPH_SURFACE_OFFSET_Y                                            0x420a
+#define mmDCP5_GRPH_SURFACE_OFFSET_Y                                            0x440a
+#define mmGRPH_X_START                                                          0x1a0b
+#define mmDCP0_GRPH_X_START                                                     0x1a0b
+#define mmDCP1_GRPH_X_START                                                     0x1c0b
+#define mmDCP2_GRPH_X_START                                                     0x1e0b
+#define mmDCP3_GRPH_X_START                                                     0x400b
+#define mmDCP4_GRPH_X_START                                                     0x420b
+#define mmDCP5_GRPH_X_START                                                     0x440b
+#define mmGRPH_Y_START                                                          0x1a0c
+#define mmDCP0_GRPH_Y_START                                                     0x1a0c
+#define mmDCP1_GRPH_Y_START                                                     0x1c0c
+#define mmDCP2_GRPH_Y_START                                                     0x1e0c
+#define mmDCP3_GRPH_Y_START                                                     0x400c
+#define mmDCP4_GRPH_Y_START                                                     0x420c
+#define mmDCP5_GRPH_Y_START                                                     0x440c
+#define mmGRPH_X_END                                                            0x1a0d
+#define mmDCP0_GRPH_X_END                                                       0x1a0d
+#define mmDCP1_GRPH_X_END                                                       0x1c0d
+#define mmDCP2_GRPH_X_END                                                       0x1e0d
+#define mmDCP3_GRPH_X_END                                                       0x400d
+#define mmDCP4_GRPH_X_END                                                       0x420d
+#define mmDCP5_GRPH_X_END                                                       0x440d
+#define mmGRPH_Y_END                                                            0x1a0e
+#define mmDCP0_GRPH_Y_END                                                       0x1a0e
+#define mmDCP1_GRPH_Y_END                                                       0x1c0e
+#define mmDCP2_GRPH_Y_END                                                       0x1e0e
+#define mmDCP3_GRPH_Y_END                                                       0x400e
+#define mmDCP4_GRPH_Y_END                                                       0x420e
+#define mmDCP5_GRPH_Y_END                                                       0x440e
+#define mmINPUT_GAMMA_CONTROL                                                   0x1a10
+#define mmDCP0_INPUT_GAMMA_CONTROL                                              0x1a10
+#define mmDCP1_INPUT_GAMMA_CONTROL                                              0x1c10
+#define mmDCP2_INPUT_GAMMA_CONTROL                                              0x1e10
+#define mmDCP3_INPUT_GAMMA_CONTROL                                              0x4010
+#define mmDCP4_INPUT_GAMMA_CONTROL                                              0x4210
+#define mmDCP5_INPUT_GAMMA_CONTROL                                              0x4410
+#define mmGRPH_UPDATE                                                           0x1a11
+#define mmDCP0_GRPH_UPDATE                                                      0x1a11
+#define mmDCP1_GRPH_UPDATE                                                      0x1c11
+#define mmDCP2_GRPH_UPDATE                                                      0x1e11
+#define mmDCP3_GRPH_UPDATE                                                      0x4011
+#define mmDCP4_GRPH_UPDATE                                                      0x4211
+#define mmDCP5_GRPH_UPDATE                                                      0x4411
+#define mmGRPH_FLIP_CONTROL                                                     0x1a12
+#define mmDCP0_GRPH_FLIP_CONTROL                                                0x1a12
+#define mmDCP1_GRPH_FLIP_CONTROL                                                0x1c12
+#define mmDCP2_GRPH_FLIP_CONTROL                                                0x1e12
+#define mmDCP3_GRPH_FLIP_CONTROL                                                0x4012
+#define mmDCP4_GRPH_FLIP_CONTROL                                                0x4212
+#define mmDCP5_GRPH_FLIP_CONTROL                                                0x4412
+#define mmGRPH_SURFACE_ADDRESS_INUSE                                            0x1a13
+#define mmDCP0_GRPH_SURFACE_ADDRESS_INUSE                                       0x1a13
+#define mmDCP1_GRPH_SURFACE_ADDRESS_INUSE                                       0x1c13
+#define mmDCP2_GRPH_SURFACE_ADDRESS_INUSE                                       0x1e13
+#define mmDCP3_GRPH_SURFACE_ADDRESS_INUSE                                       0x4013
+#define mmDCP4_GRPH_SURFACE_ADDRESS_INUSE                                       0x4213
+#define mmDCP5_GRPH_SURFACE_ADDRESS_INUSE                                       0x4413
+#define mmGRPH_DFQ_CONTROL                                                      0x1a14
+#define mmDCP0_GRPH_DFQ_CONTROL                                                 0x1a14
+#define mmDCP1_GRPH_DFQ_CONTROL                                                 0x1c14
+#define mmDCP2_GRPH_DFQ_CONTROL                                                 0x1e14
+#define mmDCP3_GRPH_DFQ_CONTROL                                                 0x4014
+#define mmDCP4_GRPH_DFQ_CONTROL                                                 0x4214
+#define mmDCP5_GRPH_DFQ_CONTROL                                                 0x4414
+#define mmGRPH_DFQ_STATUS                                                       0x1a15
+#define mmDCP0_GRPH_DFQ_STATUS                                                  0x1a15
+#define mmDCP1_GRPH_DFQ_STATUS                                                  0x1c15
+#define mmDCP2_GRPH_DFQ_STATUS                                                  0x1e15
+#define mmDCP3_GRPH_DFQ_STATUS                                                  0x4015
+#define mmDCP4_GRPH_DFQ_STATUS                                                  0x4215
+#define mmDCP5_GRPH_DFQ_STATUS                                                  0x4415
+#define mmGRPH_INTERRUPT_STATUS                                                 0x1a16
+#define mmDCP0_GRPH_INTERRUPT_STATUS                                            0x1a16
+#define mmDCP1_GRPH_INTERRUPT_STATUS                                            0x1c16
+#define mmDCP2_GRPH_INTERRUPT_STATUS                                            0x1e16
+#define mmDCP3_GRPH_INTERRUPT_STATUS                                            0x4016
+#define mmDCP4_GRPH_INTERRUPT_STATUS                                            0x4216
+#define mmDCP5_GRPH_INTERRUPT_STATUS                                            0x4416
+#define mmGRPH_INTERRUPT_CONTROL                                                0x1a17
+#define mmDCP0_GRPH_INTERRUPT_CONTROL                                           0x1a17
+#define mmDCP1_GRPH_INTERRUPT_CONTROL                                           0x1c17
+#define mmDCP2_GRPH_INTERRUPT_CONTROL                                           0x1e17
+#define mmDCP3_GRPH_INTERRUPT_CONTROL                                           0x4017
+#define mmDCP4_GRPH_INTERRUPT_CONTROL                                           0x4217
+#define mmDCP5_GRPH_INTERRUPT_CONTROL                                           0x4417
+#define mmGRPH_SURFACE_ADDRESS_HIGH_INUSE                                       0x1a18
+#define mmDCP0_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x1a18
+#define mmDCP1_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x1c18
+#define mmDCP2_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x1e18
+#define mmDCP3_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x4018
+#define mmDCP4_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x4218
+#define mmDCP5_GRPH_SURFACE_ADDRESS_HIGH_INUSE                                  0x4418
+#define mmGRPH_COMPRESS_SURFACE_ADDRESS                                         0x1a19
+#define mmDCP0_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x1a19
+#define mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x1c19
+#define mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x1e19
+#define mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x4019
+#define mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x4219
+#define mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS                                    0x4419
+#define mmGRPH_COMPRESS_PITCH                                                   0x1a1a
+#define mmDCP0_GRPH_COMPRESS_PITCH                                              0x1a1a
+#define mmDCP1_GRPH_COMPRESS_PITCH                                              0x1c1a
+#define mmDCP2_GRPH_COMPRESS_PITCH                                              0x1e1a
+#define mmDCP3_GRPH_COMPRESS_PITCH                                              0x401a
+#define mmDCP4_GRPH_COMPRESS_PITCH                                              0x421a
+#define mmDCP5_GRPH_COMPRESS_PITCH                                              0x441a
+#define mmGRPH_COMPRESS_SURFACE_ADDRESS_HIGH                                    0x1a1b
+#define mmDCP0_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x1a1b
+#define mmDCP1_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x1c1b
+#define mmDCP2_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x1e1b
+#define mmDCP3_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x401b
+#define mmDCP4_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x421b
+#define mmDCP5_GRPH_COMPRESS_SURFACE_ADDRESS_HIGH                               0x441b
+#define mmGRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                                   0x1a1c
+#define mmDCP0_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x1a1c
+#define mmDCP1_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x1c1c
+#define mmDCP2_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x1e1c
+#define mmDCP3_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x401c
+#define mmDCP4_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x421c
+#define mmDCP5_GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT                              0x441c
+#define mmPRESCALE_GRPH_CONTROL                                                 0x1a2d
+#define mmDCP0_PRESCALE_GRPH_CONTROL                                            0x1a2d
+#define mmDCP1_PRESCALE_GRPH_CONTROL                                            0x1c2d
+#define mmDCP2_PRESCALE_GRPH_CONTROL                                            0x1e2d
+#define mmDCP3_PRESCALE_GRPH_CONTROL                                            0x402d
+#define mmDCP4_PRESCALE_GRPH_CONTROL                                            0x422d
+#define mmDCP5_PRESCALE_GRPH_CONTROL                                            0x442d
+#define mmPRESCALE_VALUES_GRPH_R                                                0x1a2e
+#define mmDCP0_PRESCALE_VALUES_GRPH_R                                           0x1a2e
+#define mmDCP1_PRESCALE_VALUES_GRPH_R                                           0x1c2e
+#define mmDCP2_PRESCALE_VALUES_GRPH_R                                           0x1e2e
+#define mmDCP3_PRESCALE_VALUES_GRPH_R                                           0x402e
+#define mmDCP4_PRESCALE_VALUES_GRPH_R                                           0x422e
+#define mmDCP5_PRESCALE_VALUES_GRPH_R                                           0x442e
+#define mmPRESCALE_VALUES_GRPH_G                                                0x1a2f
+#define mmDCP0_PRESCALE_VALUES_GRPH_G                                           0x1a2f
+#define mmDCP1_PRESCALE_VALUES_GRPH_G                                           0x1c2f
+#define mmDCP2_PRESCALE_VALUES_GRPH_G                                           0x1e2f
+#define mmDCP3_PRESCALE_VALUES_GRPH_G                                           0x402f
+#define mmDCP4_PRESCALE_VALUES_GRPH_G                                           0x422f
+#define mmDCP5_PRESCALE_VALUES_GRPH_G                                           0x442f
+#define mmPRESCALE_VALUES_GRPH_B                                                0x1a30
+#define mmDCP0_PRESCALE_VALUES_GRPH_B                                           0x1a30
+#define mmDCP1_PRESCALE_VALUES_GRPH_B                                           0x1c30
+#define mmDCP2_PRESCALE_VALUES_GRPH_B                                           0x1e30
+#define mmDCP3_PRESCALE_VALUES_GRPH_B                                           0x4030
+#define mmDCP4_PRESCALE_VALUES_GRPH_B                                           0x4230
+#define mmDCP5_PRESCALE_VALUES_GRPH_B                                           0x4430
+#define mmINPUT_CSC_CONTROL                                                     0x1a35
+#define mmDCP0_INPUT_CSC_CONTROL                                                0x1a35
+#define mmDCP1_INPUT_CSC_CONTROL                                                0x1c35
+#define mmDCP2_INPUT_CSC_CONTROL                                                0x1e35
+#define mmDCP3_INPUT_CSC_CONTROL                                                0x4035
+#define mmDCP4_INPUT_CSC_CONTROL                                                0x4235
+#define mmDCP5_INPUT_CSC_CONTROL                                                0x4435
+#define mmINPUT_CSC_C11_C12                                                     0x1a36
+#define mmDCP0_INPUT_CSC_C11_C12                                                0x1a36
+#define mmDCP1_INPUT_CSC_C11_C12                                                0x1c36
+#define mmDCP2_INPUT_CSC_C11_C12                                                0x1e36
+#define mmDCP3_INPUT_CSC_C11_C12                                                0x4036
+#define mmDCP4_INPUT_CSC_C11_C12                                                0x4236
+#define mmDCP5_INPUT_CSC_C11_C12                                                0x4436
+#define mmINPUT_CSC_C13_C14                                                     0x1a37
+#define mmDCP0_INPUT_CSC_C13_C14                                                0x1a37
+#define mmDCP1_INPUT_CSC_C13_C14                                                0x1c37
+#define mmDCP2_INPUT_CSC_C13_C14                                                0x1e37
+#define mmDCP3_INPUT_CSC_C13_C14                                                0x4037
+#define mmDCP4_INPUT_CSC_C13_C14                                                0x4237
+#define mmDCP5_INPUT_CSC_C13_C14                                                0x4437
+#define mmINPUT_CSC_C21_C22                                                     0x1a38
+#define mmDCP0_INPUT_CSC_C21_C22                                                0x1a38
+#define mmDCP1_INPUT_CSC_C21_C22                                                0x1c38
+#define mmDCP2_INPUT_CSC_C21_C22                                                0x1e38
+#define mmDCP3_INPUT_CSC_C21_C22                                                0x4038
+#define mmDCP4_INPUT_CSC_C21_C22                                                0x4238
+#define mmDCP5_INPUT_CSC_C21_C22                                                0x4438
+#define mmINPUT_CSC_C23_C24                                                     0x1a39
+#define mmDCP0_INPUT_CSC_C23_C24                                                0x1a39
+#define mmDCP1_INPUT_CSC_C23_C24                                                0x1c39
+#define mmDCP2_INPUT_CSC_C23_C24                                                0x1e39
+#define mmDCP3_INPUT_CSC_C23_C24                                                0x4039
+#define mmDCP4_INPUT_CSC_C23_C24                                                0x4239
+#define mmDCP5_INPUT_CSC_C23_C24                                                0x4439
+#define mmINPUT_CSC_C31_C32                                                     0x1a3a
+#define mmDCP0_INPUT_CSC_C31_C32                                                0x1a3a
+#define mmDCP1_INPUT_CSC_C31_C32                                                0x1c3a
+#define mmDCP2_INPUT_CSC_C31_C32                                                0x1e3a
+#define mmDCP3_INPUT_CSC_C31_C32                                                0x403a
+#define mmDCP4_INPUT_CSC_C31_C32                                                0x423a
+#define mmDCP5_INPUT_CSC_C31_C32                                                0x443a
+#define mmINPUT_CSC_C33_C34                                                     0x1a3b
+#define mmDCP0_INPUT_CSC_C33_C34                                                0x1a3b
+#define mmDCP1_INPUT_CSC_C33_C34                                                0x1c3b
+#define mmDCP2_INPUT_CSC_C33_C34                                                0x1e3b
+#define mmDCP3_INPUT_CSC_C33_C34                                                0x403b
+#define mmDCP4_INPUT_CSC_C33_C34                                                0x423b
+#define mmDCP5_INPUT_CSC_C33_C34                                                0x443b
+#define mmOUTPUT_CSC_CONTROL                                                    0x1a3c
+#define mmDCP0_OUTPUT_CSC_CONTROL                                               0x1a3c
+#define mmDCP1_OUTPUT_CSC_CONTROL                                               0x1c3c
+#define mmDCP2_OUTPUT_CSC_CONTROL                                               0x1e3c
+#define mmDCP3_OUTPUT_CSC_CONTROL                                               0x403c
+#define mmDCP4_OUTPUT_CSC_CONTROL                                               0x423c
+#define mmDCP5_OUTPUT_CSC_CONTROL                                               0x443c
+#define mmOUTPUT_CSC_C11_C12                                                    0x1a3d
+#define mmDCP0_OUTPUT_CSC_C11_C12                                               0x1a3d
+#define mmDCP1_OUTPUT_CSC_C11_C12                                               0x1c3d
+#define mmDCP2_OUTPUT_CSC_C11_C12                                               0x1e3d
+#define mmDCP3_OUTPUT_CSC_C11_C12                                               0x403d
+#define mmDCP4_OUTPUT_CSC_C11_C12                                               0x423d
+#define mmDCP5_OUTPUT_CSC_C11_C12                                               0x443d
+#define mmOUTPUT_CSC_C13_C14                                                    0x1a3e
+#define mmDCP0_OUTPUT_CSC_C13_C14                                               0x1a3e
+#define mmDCP1_OUTPUT_CSC_C13_C14                                               0x1c3e
+#define mmDCP2_OUTPUT_CSC_C13_C14                                               0x1e3e
+#define mmDCP3_OUTPUT_CSC_C13_C14                                               0x403e
+#define mmDCP4_OUTPUT_CSC_C13_C14                                               0x423e
+#define mmDCP5_OUTPUT_CSC_C13_C14                                               0x443e
+#define mmOUTPUT_CSC_C21_C22                                                    0x1a3f
+#define mmDCP0_OUTPUT_CSC_C21_C22                                               0x1a3f
+#define mmDCP1_OUTPUT_CSC_C21_C22                                               0x1c3f
+#define mmDCP2_OUTPUT_CSC_C21_C22                                               0x1e3f
+#define mmDCP3_OUTPUT_CSC_C21_C22                                               0x403f
+#define mmDCP4_OUTPUT_CSC_C21_C22                                               0x423f
+#define mmDCP5_OUTPUT_CSC_C21_C22                                               0x443f
+#define mmOUTPUT_CSC_C23_C24                                                    0x1a40
+#define mmDCP0_OUTPUT_CSC_C23_C24                                               0x1a40
+#define mmDCP1_OUTPUT_CSC_C23_C24                                               0x1c40
+#define mmDCP2_OUTPUT_CSC_C23_C24                                               0x1e40
+#define mmDCP3_OUTPUT_CSC_C23_C24                                               0x4040
+#define mmDCP4_OUTPUT_CSC_C23_C24                                               0x4240
+#define mmDCP5_OUTPUT_CSC_C23_C24                                               0x4440
+#define mmOUTPUT_CSC_C31_C32                                                    0x1a41
+#define mmDCP0_OUTPUT_CSC_C31_C32                                               0x1a41
+#define mmDCP1_OUTPUT_CSC_C31_C32                                               0x1c41
+#define mmDCP2_OUTPUT_CSC_C31_C32                                               0x1e41
+#define mmDCP3_OUTPUT_CSC_C31_C32                                               0x4041
+#define mmDCP4_OUTPUT_CSC_C31_C32                                               0x4241
+#define mmDCP5_OUTPUT_CSC_C31_C32                                               0x4441
+#define mmOUTPUT_CSC_C33_C34                                                    0x1a42
+#define mmDCP0_OUTPUT_CSC_C33_C34                                               0x1a42
+#define mmDCP1_OUTPUT_CSC_C33_C34                                               0x1c42
+#define mmDCP2_OUTPUT_CSC_C33_C34                                               0x1e42
+#define mmDCP3_OUTPUT_CSC_C33_C34                                               0x4042
+#define mmDCP4_OUTPUT_CSC_C33_C34                                               0x4242
+#define mmDCP5_OUTPUT_CSC_C33_C34                                               0x4442
+#define mmCOMM_MATRIXA_TRANS_C11_C12                                            0x1a43
+#define mmDCP0_COMM_MATRIXA_TRANS_C11_C12                                       0x1a43
+#define mmDCP1_COMM_MATRIXA_TRANS_C11_C12                                       0x1c43
+#define mmDCP2_COMM_MATRIXA_TRANS_C11_C12                                       0x1e43
+#define mmDCP3_COMM_MATRIXA_TRANS_C11_C12                                       0x4043
+#define mmDCP4_COMM_MATRIXA_TRANS_C11_C12                                       0x4243
+#define mmDCP5_COMM_MATRIXA_TRANS_C11_C12                                       0x4443
+#define mmCOMM_MATRIXA_TRANS_C13_C14                                            0x1a44
+#define mmDCP0_COMM_MATRIXA_TRANS_C13_C14                                       0x1a44
+#define mmDCP1_COMM_MATRIXA_TRANS_C13_C14                                       0x1c44
+#define mmDCP2_COMM_MATRIXA_TRANS_C13_C14                                       0x1e44
+#define mmDCP3_COMM_MATRIXA_TRANS_C13_C14                                       0x4044
+#define mmDCP4_COMM_MATRIXA_TRANS_C13_C14                                       0x4244
+#define mmDCP5_COMM_MATRIXA_TRANS_C13_C14                                       0x4444
+#define mmCOMM_MATRIXA_TRANS_C21_C22                                            0x1a45
+#define mmDCP0_COMM_MATRIXA_TRANS_C21_C22                                       0x1a45
+#define mmDCP1_COMM_MATRIXA_TRANS_C21_C22                                       0x1c45
+#define mmDCP2_COMM_MATRIXA_TRANS_C21_C22                                       0x1e45
+#define mmDCP3_COMM_MATRIXA_TRANS_C21_C22                                       0x4045
+#define mmDCP4_COMM_MATRIXA_TRANS_C21_C22                                       0x4245
+#define mmDCP5_COMM_MATRIXA_TRANS_C21_C22                                       0x4445
+#define mmCOMM_MATRIXA_TRANS_C23_C24                                            0x1a46
+#define mmDCP0_COMM_MATRIXA_TRANS_C23_C24                                       0x1a46
+#define mmDCP1_COMM_MATRIXA_TRANS_C23_C24                                       0x1c46
+#define mmDCP2_COMM_MATRIXA_TRANS_C23_C24                                       0x1e46
+#define mmDCP3_COMM_MATRIXA_TRANS_C23_C24                                       0x4046
+#define mmDCP4_COMM_MATRIXA_TRANS_C23_C24                                       0x4246
+#define mmDCP5_COMM_MATRIXA_TRANS_C23_C24                                       0x4446
+#define mmCOMM_MATRIXA_TRANS_C31_C32                                            0x1a47
+#define mmDCP0_COMM_MATRIXA_TRANS_C31_C32                                       0x1a47
+#define mmDCP1_COMM_MATRIXA_TRANS_C31_C32                                       0x1c47
+#define mmDCP2_COMM_MATRIXA_TRANS_C31_C32                                       0x1e47
+#define mmDCP3_COMM_MATRIXA_TRANS_C31_C32                                       0x4047
+#define mmDCP4_COMM_MATRIXA_TRANS_C31_C32                                       0x4247
+#define mmDCP5_COMM_MATRIXA_TRANS_C31_C32                                       0x4447
+#define mmCOMM_MATRIXA_TRANS_C33_C34                                            0x1a48
+#define mmDCP0_COMM_MATRIXA_TRANS_C33_C34                                       0x1a48
+#define mmDCP1_COMM_MATRIXA_TRANS_C33_C34                                       0x1c48
+#define mmDCP2_COMM_MATRIXA_TRANS_C33_C34                                       0x1e48
+#define mmDCP3_COMM_MATRIXA_TRANS_C33_C34                                       0x4048
+#define mmDCP4_COMM_MATRIXA_TRANS_C33_C34                                       0x4248
+#define mmDCP5_COMM_MATRIXA_TRANS_C33_C34                                       0x4448
+#define mmCOMM_MATRIXB_TRANS_C11_C12                                            0x1a49
+#define mmDCP0_COMM_MATRIXB_TRANS_C11_C12                                       0x1a49
+#define mmDCP1_COMM_MATRIXB_TRANS_C11_C12                                       0x1c49
+#define mmDCP2_COMM_MATRIXB_TRANS_C11_C12                                       0x1e49
+#define mmDCP3_COMM_MATRIXB_TRANS_C11_C12                                       0x4049
+#define mmDCP4_COMM_MATRIXB_TRANS_C11_C12                                       0x4249
+#define mmDCP5_COMM_MATRIXB_TRANS_C11_C12                                       0x4449
+#define mmCOMM_MATRIXB_TRANS_C13_C14                                            0x1a4a
+#define mmDCP0_COMM_MATRIXB_TRANS_C13_C14                                       0x1a4a
+#define mmDCP1_COMM_MATRIXB_TRANS_C13_C14                                       0x1c4a
+#define mmDCP2_COMM_MATRIXB_TRANS_C13_C14                                       0x1e4a
+#define mmDCP3_COMM_MATRIXB_TRANS_C13_C14                                       0x404a
+#define mmDCP4_COMM_MATRIXB_TRANS_C13_C14                                       0x424a
+#define mmDCP5_COMM_MATRIXB_TRANS_C13_C14                                       0x444a
+#define mmCOMM_MATRIXB_TRANS_C21_C22                                            0x1a4b
+#define mmDCP0_COMM_MATRIXB_TRANS_C21_C22                                       0x1a4b
+#define mmDCP1_COMM_MATRIXB_TRANS_C21_C22                                       0x1c4b
+#define mmDCP2_COMM_MATRIXB_TRANS_C21_C22                                       0x1e4b
+#define mmDCP3_COMM_MATRIXB_TRANS_C21_C22                                       0x404b
+#define mmDCP4_COMM_MATRIXB_TRANS_C21_C22                                       0x424b
+#define mmDCP5_COMM_MATRIXB_TRANS_C21_C22                                       0x444b
+#define mmCOMM_MATRIXB_TRANS_C23_C24                                            0x1a4c
+#define mmDCP0_COMM_MATRIXB_TRANS_C23_C24                                       0x1a4c
+#define mmDCP1_COMM_MATRIXB_TRANS_C23_C24                                       0x1c4c
+#define mmDCP2_COMM_MATRIXB_TRANS_C23_C24                                       0x1e4c
+#define mmDCP3_COMM_MATRIXB_TRANS_C23_C24                                       0x404c
+#define mmDCP4_COMM_MATRIXB_TRANS_C23_C24                                       0x424c
+#define mmDCP5_COMM_MATRIXB_TRANS_C23_C24                                       0x444c
+#define mmCOMM_MATRIXB_TRANS_C31_C32                                            0x1a4d
+#define mmDCP0_COMM_MATRIXB_TRANS_C31_C32                                       0x1a4d
+#define mmDCP1_COMM_MATRIXB_TRANS_C31_C32                                       0x1c4d
+#define mmDCP2_COMM_MATRIXB_TRANS_C31_C32                                       0x1e4d
+#define mmDCP3_COMM_MATRIXB_TRANS_C31_C32                                       0x404d
+#define mmDCP4_COMM_MATRIXB_TRANS_C31_C32                                       0x424d
+#define mmDCP5_COMM_MATRIXB_TRANS_C31_C32                                       0x444d
+#define mmCOMM_MATRIXB_TRANS_C33_C34                                            0x1a4e
+#define mmDCP0_COMM_MATRIXB_TRANS_C33_C34                                       0x1a4e
+#define mmDCP1_COMM_MATRIXB_TRANS_C33_C34                                       0x1c4e
+#define mmDCP2_COMM_MATRIXB_TRANS_C33_C34                                       0x1e4e
+#define mmDCP3_COMM_MATRIXB_TRANS_C33_C34                                       0x404e
+#define mmDCP4_COMM_MATRIXB_TRANS_C33_C34                                       0x424e
+#define mmDCP5_COMM_MATRIXB_TRANS_C33_C34                                       0x444e
+#define mmDENORM_CONTROL                                                        0x1a50
+#define mmDCP0_DENORM_CONTROL                                                   0x1a50
+#define mmDCP1_DENORM_CONTROL                                                   0x1c50
+#define mmDCP2_DENORM_CONTROL                                                   0x1e50
+#define mmDCP3_DENORM_CONTROL                                                   0x4050
+#define mmDCP4_DENORM_CONTROL                                                   0x4250
+#define mmDCP5_DENORM_CONTROL                                                   0x4450
+#define mmOUT_ROUND_CONTROL                                                     0x1a51
+#define mmDCP0_OUT_ROUND_CONTROL                                                0x1a51
+#define mmDCP1_OUT_ROUND_CONTROL                                                0x1c51
+#define mmDCP2_OUT_ROUND_CONTROL                                                0x1e51
+#define mmDCP3_OUT_ROUND_CONTROL                                                0x4051
+#define mmDCP4_OUT_ROUND_CONTROL                                                0x4251
+#define mmDCP5_OUT_ROUND_CONTROL                                                0x4451
+#define mmOUT_CLAMP_CONTROL_R_CR                                                0x1a52
+#define mmDCP0_OUT_CLAMP_CONTROL_R_CR                                           0x1a52
+#define mmDCP1_OUT_CLAMP_CONTROL_R_CR                                           0x1c52
+#define mmDCP2_OUT_CLAMP_CONTROL_R_CR                                           0x1e52
+#define mmDCP3_OUT_CLAMP_CONTROL_R_CR                                           0x4052
+#define mmDCP4_OUT_CLAMP_CONTROL_R_CR                                           0x4252
+#define mmDCP5_OUT_CLAMP_CONTROL_R_CR                                           0x4452
+#define mmOUT_CLAMP_CONTROL_G_Y                                                 0x1a9c
+#define mmDCP0_OUT_CLAMP_CONTROL_G_Y                                            0x1a9c
+#define mmDCP1_OUT_CLAMP_CONTROL_G_Y                                            0x1c9c
+#define mmDCP2_OUT_CLAMP_CONTROL_G_Y                                            0x1e9c
+#define mmDCP3_OUT_CLAMP_CONTROL_G_Y                                            0x409c
+#define mmDCP4_OUT_CLAMP_CONTROL_G_Y                                            0x429c
+#define mmDCP5_OUT_CLAMP_CONTROL_G_Y                                            0x449c
+#define mmOUT_CLAMP_CONTROL_B_CB                                                0x1a9d
+#define mmDCP0_OUT_CLAMP_CONTROL_B_CB                                           0x1a9d
+#define mmDCP1_OUT_CLAMP_CONTROL_B_CB                                           0x1c9d
+#define mmDCP2_OUT_CLAMP_CONTROL_B_CB                                           0x1e9d
+#define mmDCP3_OUT_CLAMP_CONTROL_B_CB                                           0x409d
+#define mmDCP4_OUT_CLAMP_CONTROL_B_CB                                           0x429d
+#define mmDCP5_OUT_CLAMP_CONTROL_B_CB                                           0x449d
+#define mmKEY_CONTROL                                                           0x1a53
+#define mmDCP0_KEY_CONTROL                                                      0x1a53
+#define mmDCP1_KEY_CONTROL                                                      0x1c53
+#define mmDCP2_KEY_CONTROL                                                      0x1e53
+#define mmDCP3_KEY_CONTROL                                                      0x4053
+#define mmDCP4_KEY_CONTROL                                                      0x4253
+#define mmDCP5_KEY_CONTROL                                                      0x4453
+#define mmKEY_RANGE_ALPHA                                                       0x1a54
+#define mmDCP0_KEY_RANGE_ALPHA                                                  0x1a54
+#define mmDCP1_KEY_RANGE_ALPHA                                                  0x1c54
+#define mmDCP2_KEY_RANGE_ALPHA                                                  0x1e54
+#define mmDCP3_KEY_RANGE_ALPHA                                                  0x4054
+#define mmDCP4_KEY_RANGE_ALPHA                                                  0x4254
+#define mmDCP5_KEY_RANGE_ALPHA                                                  0x4454
+#define mmKEY_RANGE_RED                                                         0x1a55
+#define mmDCP0_KEY_RANGE_RED                                                    0x1a55
+#define mmDCP1_KEY_RANGE_RED                                                    0x1c55
+#define mmDCP2_KEY_RANGE_RED                                                    0x1e55
+#define mmDCP3_KEY_RANGE_RED                                                    0x4055
+#define mmDCP4_KEY_RANGE_RED                                                    0x4255
+#define mmDCP5_KEY_RANGE_RED                                                    0x4455
+#define mmKEY_RANGE_GREEN                                                       0x1a56
+#define mmDCP0_KEY_RANGE_GREEN                                                  0x1a56
+#define mmDCP1_KEY_RANGE_GREEN                                                  0x1c56
+#define mmDCP2_KEY_RANGE_GREEN                                                  0x1e56
+#define mmDCP3_KEY_RANGE_GREEN                                                  0x4056
+#define mmDCP4_KEY_RANGE_GREEN                                                  0x4256
+#define mmDCP5_KEY_RANGE_GREEN                                                  0x4456
+#define mmKEY_RANGE_BLUE                                                        0x1a57
+#define mmDCP0_KEY_RANGE_BLUE                                                   0x1a57
+#define mmDCP1_KEY_RANGE_BLUE                                                   0x1c57
+#define mmDCP2_KEY_RANGE_BLUE                                                   0x1e57
+#define mmDCP3_KEY_RANGE_BLUE                                                   0x4057
+#define mmDCP4_KEY_RANGE_BLUE                                                   0x4257
+#define mmDCP5_KEY_RANGE_BLUE                                                   0x4457
+#define mmDEGAMMA_CONTROL                                                       0x1a58
+#define mmDCP0_DEGAMMA_CONTROL                                                  0x1a58
+#define mmDCP1_DEGAMMA_CONTROL                                                  0x1c58
+#define mmDCP2_DEGAMMA_CONTROL                                                  0x1e58
+#define mmDCP3_DEGAMMA_CONTROL                                                  0x4058
+#define mmDCP4_DEGAMMA_CONTROL                                                  0x4258
+#define mmDCP5_DEGAMMA_CONTROL                                                  0x4458
+#define mmGAMUT_REMAP_CONTROL                                                   0x1a59
+#define mmDCP0_GAMUT_REMAP_CONTROL                                              0x1a59
+#define mmDCP1_GAMUT_REMAP_CONTROL                                              0x1c59
+#define mmDCP2_GAMUT_REMAP_CONTROL                                              0x1e59
+#define mmDCP3_GAMUT_REMAP_CONTROL                                              0x4059
+#define mmDCP4_GAMUT_REMAP_CONTROL                                              0x4259
+#define mmDCP5_GAMUT_REMAP_CONTROL                                              0x4459
+#define mmGAMUT_REMAP_C11_C12                                                   0x1a5a
+#define mmDCP0_GAMUT_REMAP_C11_C12                                              0x1a5a
+#define mmDCP1_GAMUT_REMAP_C11_C12                                              0x1c5a
+#define mmDCP2_GAMUT_REMAP_C11_C12                                              0x1e5a
+#define mmDCP3_GAMUT_REMAP_C11_C12                                              0x405a
+#define mmDCP4_GAMUT_REMAP_C11_C12                                              0x425a
+#define mmDCP5_GAMUT_REMAP_C11_C12                                              0x445a
+#define mmGAMUT_REMAP_C13_C14                                                   0x1a5b
+#define mmDCP0_GAMUT_REMAP_C13_C14                                              0x1a5b
+#define mmDCP1_GAMUT_REMAP_C13_C14                                              0x1c5b
+#define mmDCP2_GAMUT_REMAP_C13_C14                                              0x1e5b
+#define mmDCP3_GAMUT_REMAP_C13_C14                                              0x405b
+#define mmDCP4_GAMUT_REMAP_C13_C14                                              0x425b
+#define mmDCP5_GAMUT_REMAP_C13_C14                                              0x445b
+#define mmGAMUT_REMAP_C21_C22                                                   0x1a5c
+#define mmDCP0_GAMUT_REMAP_C21_C22                                              0x1a5c
+#define mmDCP1_GAMUT_REMAP_C21_C22                                              0x1c5c
+#define mmDCP2_GAMUT_REMAP_C21_C22                                              0x1e5c
+#define mmDCP3_GAMUT_REMAP_C21_C22                                              0x405c
+#define mmDCP4_GAMUT_REMAP_C21_C22                                              0x425c
+#define mmDCP5_GAMUT_REMAP_C21_C22                                              0x445c
+#define mmGAMUT_REMAP_C23_C24                                                   0x1a5d
+#define mmDCP0_GAMUT_REMAP_C23_C24                                              0x1a5d
+#define mmDCP1_GAMUT_REMAP_C23_C24                                              0x1c5d
+#define mmDCP2_GAMUT_REMAP_C23_C24                                              0x1e5d
+#define mmDCP3_GAMUT_REMAP_C23_C24                                              0x405d
+#define mmDCP4_GAMUT_REMAP_C23_C24                                              0x425d
+#define mmDCP5_GAMUT_REMAP_C23_C24                                              0x445d
+#define mmGAMUT_REMAP_C31_C32                                                   0x1a5e
+#define mmDCP0_GAMUT_REMAP_C31_C32                                              0x1a5e
+#define mmDCP1_GAMUT_REMAP_C31_C32                                              0x1c5e
+#define mmDCP2_GAMUT_REMAP_C31_C32                                              0x1e5e
+#define mmDCP3_GAMUT_REMAP_C31_C32                                              0x405e
+#define mmDCP4_GAMUT_REMAP_C31_C32                                              0x425e
+#define mmDCP5_GAMUT_REMAP_C31_C32                                              0x445e
+#define mmGAMUT_REMAP_C33_C34                                                   0x1a5f
+#define mmDCP0_GAMUT_REMAP_C33_C34                                              0x1a5f
+#define mmDCP1_GAMUT_REMAP_C33_C34                                              0x1c5f
+#define mmDCP2_GAMUT_REMAP_C33_C34                                              0x1e5f
+#define mmDCP3_GAMUT_REMAP_C33_C34                                              0x405f
+#define mmDCP4_GAMUT_REMAP_C33_C34                                              0x425f
+#define mmDCP5_GAMUT_REMAP_C33_C34                                              0x445f
+#define mmDCP_SPATIAL_DITHER_CNTL                                               0x1a60
+#define mmDCP0_DCP_SPATIAL_DITHER_CNTL                                          0x1a60
+#define mmDCP1_DCP_SPATIAL_DITHER_CNTL                                          0x1c60
+#define mmDCP2_DCP_SPATIAL_DITHER_CNTL                                          0x1e60
+#define mmDCP3_DCP_SPATIAL_DITHER_CNTL                                          0x4060
+#define mmDCP4_DCP_SPATIAL_DITHER_CNTL                                          0x4260
+#define mmDCP5_DCP_SPATIAL_DITHER_CNTL                                          0x4460
+#define mmDCP_RANDOM_SEEDS                                                      0x1a61
+#define mmDCP0_DCP_RANDOM_SEEDS                                                 0x1a61
+#define mmDCP1_DCP_RANDOM_SEEDS                                                 0x1c61
+#define mmDCP2_DCP_RANDOM_SEEDS                                                 0x1e61
+#define mmDCP3_DCP_RANDOM_SEEDS                                                 0x4061
+#define mmDCP4_DCP_RANDOM_SEEDS                                                 0x4261
+#define mmDCP5_DCP_RANDOM_SEEDS                                                 0x4461
+#define mmDCP_FP_CONVERTED_FIELD                                                0x1a65
+#define mmDCP0_DCP_FP_CONVERTED_FIELD                                           0x1a65
+#define mmDCP1_DCP_FP_CONVERTED_FIELD                                           0x1c65
+#define mmDCP2_DCP_FP_CONVERTED_FIELD                                           0x1e65
+#define mmDCP3_DCP_FP_CONVERTED_FIELD                                           0x4065
+#define mmDCP4_DCP_FP_CONVERTED_FIELD                                           0x4265
+#define mmDCP5_DCP_FP_CONVERTED_FIELD                                           0x4465
+#define mmCUR_CONTROL                                                           0x1a66
+#define mmDCP0_CUR_CONTROL                                                      0x1a66
+#define mmDCP1_CUR_CONTROL                                                      0x1c66
+#define mmDCP2_CUR_CONTROL                                                      0x1e66
+#define mmDCP3_CUR_CONTROL                                                      0x4066
+#define mmDCP4_CUR_CONTROL                                                      0x4266
+#define mmDCP5_CUR_CONTROL                                                      0x4466
+#define mmCUR_SURFACE_ADDRESS                                                   0x1a67
+#define mmDCP0_CUR_SURFACE_ADDRESS                                              0x1a67
+#define mmDCP1_CUR_SURFACE_ADDRESS                                              0x1c67
+#define mmDCP2_CUR_SURFACE_ADDRESS                                              0x1e67
+#define mmDCP3_CUR_SURFACE_ADDRESS                                              0x4067
+#define mmDCP4_CUR_SURFACE_ADDRESS                                              0x4267
+#define mmDCP5_CUR_SURFACE_ADDRESS                                              0x4467
+#define mmCUR_SIZE                                                              0x1a68
+#define mmDCP0_CUR_SIZE                                                         0x1a68
+#define mmDCP1_CUR_SIZE                                                         0x1c68
+#define mmDCP2_CUR_SIZE                                                         0x1e68
+#define mmDCP3_CUR_SIZE                                                         0x4068
+#define mmDCP4_CUR_SIZE                                                         0x4268
+#define mmDCP5_CUR_SIZE                                                         0x4468
+#define mmCUR_SURFACE_ADDRESS_HIGH                                              0x1a69
+#define mmDCP0_CUR_SURFACE_ADDRESS_HIGH                                         0x1a69
+#define mmDCP1_CUR_SURFACE_ADDRESS_HIGH                                         0x1c69
+#define mmDCP2_CUR_SURFACE_ADDRESS_HIGH                                         0x1e69
+#define mmDCP3_CUR_SURFACE_ADDRESS_HIGH                                         0x4069
+#define mmDCP4_CUR_SURFACE_ADDRESS_HIGH                                         0x4269
+#define mmDCP5_CUR_SURFACE_ADDRESS_HIGH                                         0x4469
+#define mmCUR_POSITION                                                          0x1a6a
+#define mmDCP0_CUR_POSITION                                                     0x1a6a
+#define mmDCP1_CUR_POSITION                                                     0x1c6a
+#define mmDCP2_CUR_POSITION                                                     0x1e6a
+#define mmDCP3_CUR_POSITION                                                     0x406a
+#define mmDCP4_CUR_POSITION                                                     0x426a
+#define mmDCP5_CUR_POSITION                                                     0x446a
+#define mmCUR_HOT_SPOT                                                          0x1a6b
+#define mmDCP0_CUR_HOT_SPOT                                                     0x1a6b
+#define mmDCP1_CUR_HOT_SPOT                                                     0x1c6b
+#define mmDCP2_CUR_HOT_SPOT                                                     0x1e6b
+#define mmDCP3_CUR_HOT_SPOT                                                     0x406b
+#define mmDCP4_CUR_HOT_SPOT                                                     0x426b
+#define mmDCP5_CUR_HOT_SPOT                                                     0x446b
+#define mmCUR_COLOR1                                                            0x1a6c
+#define mmDCP0_CUR_COLOR1                                                       0x1a6c
+#define mmDCP1_CUR_COLOR1                                                       0x1c6c
+#define mmDCP2_CUR_COLOR1                                                       0x1e6c
+#define mmDCP3_CUR_COLOR1                                                       0x406c
+#define mmDCP4_CUR_COLOR1                                                       0x426c
+#define mmDCP5_CUR_COLOR1                                                       0x446c
+#define mmCUR_COLOR2                                                            0x1a6d
+#define mmDCP0_CUR_COLOR2                                                       0x1a6d
+#define mmDCP1_CUR_COLOR2                                                       0x1c6d
+#define mmDCP2_CUR_COLOR2                                                       0x1e6d
+#define mmDCP3_CUR_COLOR2                                                       0x406d
+#define mmDCP4_CUR_COLOR2                                                       0x426d
+#define mmDCP5_CUR_COLOR2                                                       0x446d
+#define mmCUR_UPDATE                                                            0x1a6e
+#define mmDCP0_CUR_UPDATE                                                       0x1a6e
+#define mmDCP1_CUR_UPDATE                                                       0x1c6e
+#define mmDCP2_CUR_UPDATE                                                       0x1e6e
+#define mmDCP3_CUR_UPDATE                                                       0x406e
+#define mmDCP4_CUR_UPDATE                                                       0x426e
+#define mmDCP5_CUR_UPDATE                                                       0x446e
+#define mmCUR_REQUEST_FILTER_CNTL                                               0x1a99
+#define mmDCP0_CUR_REQUEST_FILTER_CNTL                                          0x1a99
+#define mmDCP1_CUR_REQUEST_FILTER_CNTL                                          0x1c99
+#define mmDCP2_CUR_REQUEST_FILTER_CNTL                                          0x1e99
+#define mmDCP3_CUR_REQUEST_FILTER_CNTL                                          0x4099
+#define mmDCP4_CUR_REQUEST_FILTER_CNTL                                          0x4299
+#define mmDCP5_CUR_REQUEST_FILTER_CNTL                                          0x4499
+#define mmCUR_STEREO_CONTROL                                                    0x1a9a
+#define mmDCP0_CUR_STEREO_CONTROL                                               0x1a9a
+#define mmDCP1_CUR_STEREO_CONTROL                                               0x1c9a
+#define mmDCP2_CUR_STEREO_CONTROL                                               0x1e9a
+#define mmDCP3_CUR_STEREO_CONTROL                                               0x409a
+#define mmDCP4_CUR_STEREO_CONTROL                                               0x429a
+#define mmDCP5_CUR_STEREO_CONTROL                                               0x449a
+#define mmDC_LUT_RW_MODE                                                        0x1a78
+#define mmDCP0_DC_LUT_RW_MODE                                                   0x1a78
+#define mmDCP1_DC_LUT_RW_MODE                                                   0x1c78
+#define mmDCP2_DC_LUT_RW_MODE                                                   0x1e78
+#define mmDCP3_DC_LUT_RW_MODE                                                   0x4078
+#define mmDCP4_DC_LUT_RW_MODE                                                   0x4278
+#define mmDCP5_DC_LUT_RW_MODE                                                   0x4478
+#define mmDC_LUT_RW_INDEX                                                       0x1a79
+#define mmDCP0_DC_LUT_RW_INDEX                                                  0x1a79
+#define mmDCP1_DC_LUT_RW_INDEX                                                  0x1c79
+#define mmDCP2_DC_LUT_RW_INDEX                                                  0x1e79
+#define mmDCP3_DC_LUT_RW_INDEX                                                  0x4079
+#define mmDCP4_DC_LUT_RW_INDEX                                                  0x4279
+#define mmDCP5_DC_LUT_RW_INDEX                                                  0x4479
+#define mmDC_LUT_SEQ_COLOR                                                      0x1a7a
+#define mmDCP0_DC_LUT_SEQ_COLOR                                                 0x1a7a
+#define mmDCP1_DC_LUT_SEQ_COLOR                                                 0x1c7a
+#define mmDCP2_DC_LUT_SEQ_COLOR                                                 0x1e7a
+#define mmDCP3_DC_LUT_SEQ_COLOR                                                 0x407a
+#define mmDCP4_DC_LUT_SEQ_COLOR                                                 0x427a
+#define mmDCP5_DC_LUT_SEQ_COLOR                                                 0x447a
+#define mmDC_LUT_PWL_DATA                                                       0x1a7b
+#define mmDCP0_DC_LUT_PWL_DATA                                                  0x1a7b
+#define mmDCP1_DC_LUT_PWL_DATA                                                  0x1c7b
+#define mmDCP2_DC_LUT_PWL_DATA                                                  0x1e7b
+#define mmDCP3_DC_LUT_PWL_DATA                                                  0x407b
+#define mmDCP4_DC_LUT_PWL_DATA                                                  0x427b
+#define mmDCP5_DC_LUT_PWL_DATA                                                  0x447b
+#define mmDC_LUT_30_COLOR                                                       0x1a7c
+#define mmDCP0_DC_LUT_30_COLOR                                                  0x1a7c
+#define mmDCP1_DC_LUT_30_COLOR                                                  0x1c7c
+#define mmDCP2_DC_LUT_30_COLOR                                                  0x1e7c
+#define mmDCP3_DC_LUT_30_COLOR                                                  0x407c
+#define mmDCP4_DC_LUT_30_COLOR                                                  0x427c
+#define mmDCP5_DC_LUT_30_COLOR                                                  0x447c
+#define mmDC_LUT_VGA_ACCESS_ENABLE                                              0x1a7d
+#define mmDCP0_DC_LUT_VGA_ACCESS_ENABLE                                         0x1a7d
+#define mmDCP1_DC_LUT_VGA_ACCESS_ENABLE                                         0x1c7d
+#define mmDCP2_DC_LUT_VGA_ACCESS_ENABLE                                         0x1e7d
+#define mmDCP3_DC_LUT_VGA_ACCESS_ENABLE                                         0x407d
+#define mmDCP4_DC_LUT_VGA_ACCESS_ENABLE                                         0x427d
+#define mmDCP5_DC_LUT_VGA_ACCESS_ENABLE                                         0x447d
+#define mmDC_LUT_WRITE_EN_MASK                                                  0x1a7e
+#define mmDCP0_DC_LUT_WRITE_EN_MASK                                             0x1a7e
+#define mmDCP1_DC_LUT_WRITE_EN_MASK                                             0x1c7e
+#define mmDCP2_DC_LUT_WRITE_EN_MASK                                             0x1e7e
+#define mmDCP3_DC_LUT_WRITE_EN_MASK                                             0x407e
+#define mmDCP4_DC_LUT_WRITE_EN_MASK                                             0x427e
+#define mmDCP5_DC_LUT_WRITE_EN_MASK                                             0x447e
+#define mmDC_LUT_AUTOFILL                                                       0x1a7f
+#define mmDCP0_DC_LUT_AUTOFILL                                                  0x1a7f
+#define mmDCP1_DC_LUT_AUTOFILL                                                  0x1c7f
+#define mmDCP2_DC_LUT_AUTOFILL                                                  0x1e7f
+#define mmDCP3_DC_LUT_AUTOFILL                                                  0x407f
+#define mmDCP4_DC_LUT_AUTOFILL                                                  0x427f
+#define mmDCP5_DC_LUT_AUTOFILL                                                  0x447f
+#define mmDC_LUT_CONTROL                                                        0x1a80
+#define mmDCP0_DC_LUT_CONTROL                                                   0x1a80
+#define mmDCP1_DC_LUT_CONTROL                                                   0x1c80
+#define mmDCP2_DC_LUT_CONTROL                                                   0x1e80
+#define mmDCP3_DC_LUT_CONTROL                                                   0x4080
+#define mmDCP4_DC_LUT_CONTROL                                                   0x4280
+#define mmDCP5_DC_LUT_CONTROL                                                   0x4480
+#define mmDC_LUT_BLACK_OFFSET_BLUE                                              0x1a81
+#define mmDCP0_DC_LUT_BLACK_OFFSET_BLUE                                         0x1a81
+#define mmDCP1_DC_LUT_BLACK_OFFSET_BLUE                                         0x1c81
+#define mmDCP2_DC_LUT_BLACK_OFFSET_BLUE                                         0x1e81
+#define mmDCP3_DC_LUT_BLACK_OFFSET_BLUE                                         0x4081
+#define mmDCP4_DC_LUT_BLACK_OFFSET_BLUE                                         0x4281
+#define mmDCP5_DC_LUT_BLACK_OFFSET_BLUE                                         0x4481
+#define mmDC_LUT_BLACK_OFFSET_GREEN                                             0x1a82
+#define mmDCP0_DC_LUT_BLACK_OFFSET_GREEN                                        0x1a82
+#define mmDCP1_DC_LUT_BLACK_OFFSET_GREEN                                        0x1c82
+#define mmDCP2_DC_LUT_BLACK_OFFSET_GREEN                                        0x1e82
+#define mmDCP3_DC_LUT_BLACK_OFFSET_GREEN                                        0x4082
+#define mmDCP4_DC_LUT_BLACK_OFFSET_GREEN                                        0x4282
+#define mmDCP5_DC_LUT_BLACK_OFFSET_GREEN                                        0x4482
+#define mmDC_LUT_BLACK_OFFSET_RED                                               0x1a83
+#define mmDCP0_DC_LUT_BLACK_OFFSET_RED                                          0x1a83
+#define mmDCP1_DC_LUT_BLACK_OFFSET_RED                                          0x1c83
+#define mmDCP2_DC_LUT_BLACK_OFFSET_RED                                          0x1e83
+#define mmDCP3_DC_LUT_BLACK_OFFSET_RED                                          0x4083
+#define mmDCP4_DC_LUT_BLACK_OFFSET_RED                                          0x4283
+#define mmDCP5_DC_LUT_BLACK_OFFSET_RED                                          0x4483
+#define mmDC_LUT_WHITE_OFFSET_BLUE                                              0x1a84
+#define mmDCP0_DC_LUT_WHITE_OFFSET_BLUE                                         0x1a84
+#define mmDCP1_DC_LUT_WHITE_OFFSET_BLUE                                         0x1c84
+#define mmDCP2_DC_LUT_WHITE_OFFSET_BLUE                                         0x1e84
+#define mmDCP3_DC_LUT_WHITE_OFFSET_BLUE                                         0x4084
+#define mmDCP4_DC_LUT_WHITE_OFFSET_BLUE                                         0x4284
+#define mmDCP5_DC_LUT_WHITE_OFFSET_BLUE                                         0x4484
+#define mmDC_LUT_WHITE_OFFSET_GREEN                                             0x1a85
+#define mmDCP0_DC_LUT_WHITE_OFFSET_GREEN                                        0x1a85
+#define mmDCP1_DC_LUT_WHITE_OFFSET_GREEN                                        0x1c85
+#define mmDCP2_DC_LUT_WHITE_OFFSET_GREEN                                        0x1e85
+#define mmDCP3_DC_LUT_WHITE_OFFSET_GREEN                                        0x4085
+#define mmDCP4_DC_LUT_WHITE_OFFSET_GREEN                                        0x4285
+#define mmDCP5_DC_LUT_WHITE_OFFSET_GREEN                                        0x4485
+#define mmDC_LUT_WHITE_OFFSET_RED                                               0x1a86
+#define mmDCP0_DC_LUT_WHITE_OFFSET_RED                                          0x1a86
+#define mmDCP1_DC_LUT_WHITE_OFFSET_RED                                          0x1c86
+#define mmDCP2_DC_LUT_WHITE_OFFSET_RED                                          0x1e86
+#define mmDCP3_DC_LUT_WHITE_OFFSET_RED                                          0x4086
+#define mmDCP4_DC_LUT_WHITE_OFFSET_RED                                          0x4286
+#define mmDCP5_DC_LUT_WHITE_OFFSET_RED                                          0x4486
+#define mmDCP_CRC_CONTROL                                                       0x1a87
+#define mmDCP0_DCP_CRC_CONTROL                                                  0x1a87
+#define mmDCP1_DCP_CRC_CONTROL                                                  0x1c87
+#define mmDCP2_DCP_CRC_CONTROL                                                  0x1e87
+#define mmDCP3_DCP_CRC_CONTROL                                                  0x4087
+#define mmDCP4_DCP_CRC_CONTROL                                                  0x4287
+#define mmDCP5_DCP_CRC_CONTROL                                                  0x4487
+#define mmDCP_CRC_MASK                                                          0x1a88
+#define mmDCP0_DCP_CRC_MASK                                                     0x1a88
+#define mmDCP1_DCP_CRC_MASK                                                     0x1c88
+#define mmDCP2_DCP_CRC_MASK                                                     0x1e88
+#define mmDCP3_DCP_CRC_MASK                                                     0x4088
+#define mmDCP4_DCP_CRC_MASK                                                     0x4288
+#define mmDCP5_DCP_CRC_MASK                                                     0x4488
+#define mmDCP_CRC_CURRENT                                                       0x1a89
+#define mmDCP0_DCP_CRC_CURRENT                                                  0x1a89
+#define mmDCP1_DCP_CRC_CURRENT                                                  0x1c89
+#define mmDCP2_DCP_CRC_CURRENT                                                  0x1e89
+#define mmDCP3_DCP_CRC_CURRENT                                                  0x4089
+#define mmDCP4_DCP_CRC_CURRENT                                                  0x4289
+#define mmDCP5_DCP_CRC_CURRENT                                                  0x4489
+#define mmDVMM_PTE_CONTROL                                                      0x1a8a
+#define mmDCP0_DVMM_PTE_CONTROL                                                 0x1a8a
+#define mmDCP1_DVMM_PTE_CONTROL                                                 0x1c8a
+#define mmDCP2_DVMM_PTE_CONTROL                                                 0x1e8a
+#define mmDCP3_DVMM_PTE_CONTROL                                                 0x408a
+#define mmDCP4_DVMM_PTE_CONTROL                                                 0x428a
+#define mmDCP5_DVMM_PTE_CONTROL                                                 0x448a
+#define mmDCP_CRC_LAST                                                          0x1a8b
+#define mmDCP0_DCP_CRC_LAST                                                     0x1a8b
+#define mmDCP1_DCP_CRC_LAST                                                     0x1c8b
+#define mmDCP2_DCP_CRC_LAST                                                     0x1e8b
+#define mmDCP3_DCP_CRC_LAST                                                     0x408b
+#define mmDCP4_DCP_CRC_LAST                                                     0x428b
+#define mmDCP5_DCP_CRC_LAST                                                     0x448b
+#define mmDCP_DEBUG                                                             0x1a8d
+#define mmDCP0_DCP_DEBUG                                                        0x1a8d
+#define mmDCP1_DCP_DEBUG                                                        0x1c8d
+#define mmDCP2_DCP_DEBUG                                                        0x1e8d
+#define mmDCP3_DCP_DEBUG                                                        0x408d
+#define mmDCP4_DCP_DEBUG                                                        0x428d
+#define mmDCP5_DCP_DEBUG                                                        0x448d
+#define mmGRPH_FLIP_RATE_CNTL                                                   0x1a8e
+#define mmDCP0_GRPH_FLIP_RATE_CNTL                                              0x1a8e
+#define mmDCP1_GRPH_FLIP_RATE_CNTL                                              0x1c8e
+#define mmDCP2_GRPH_FLIP_RATE_CNTL                                              0x1e8e
+#define mmDCP3_GRPH_FLIP_RATE_CNTL                                              0x408e
+#define mmDCP4_GRPH_FLIP_RATE_CNTL                                              0x428e
+#define mmDCP5_GRPH_FLIP_RATE_CNTL                                              0x448e
+#define mmDCP_GSL_CONTROL                                                       0x1a90
+#define mmDCP0_DCP_GSL_CONTROL                                                  0x1a90
+#define mmDCP1_DCP_GSL_CONTROL                                                  0x1c90
+#define mmDCP2_DCP_GSL_CONTROL                                                  0x1e90
+#define mmDCP3_DCP_GSL_CONTROL                                                  0x4090
+#define mmDCP4_DCP_GSL_CONTROL                                                  0x4290
+#define mmDCP5_DCP_GSL_CONTROL                                                  0x4490
+#define mmDCP_LB_DATA_GAP_BETWEEN_CHUNK                                         0x1a91
+#define mmDCP0_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x1a91
+#define mmDCP1_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x1c91
+#define mmDCP2_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x1e91
+#define mmDCP3_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x4091
+#define mmDCP4_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x4291
+#define mmDCP5_DCP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x4491
+#define mmDCP_DEBUG_SG                                                          0x1a92
+#define mmDCP0_DCP_DEBUG_SG                                                     0x1a92
+#define mmDCP1_DCP_DEBUG_SG                                                     0x1c92
+#define mmDCP2_DCP_DEBUG_SG                                                     0x1e92
+#define mmDCP3_DCP_DEBUG_SG                                                     0x4092
+#define mmDCP4_DCP_DEBUG_SG                                                     0x4292
+#define mmDCP5_DCP_DEBUG_SG                                                     0x4492
+#define mmDCP_DEBUG_SG2                                                         0x1a94
+#define mmDCP0_DCP_DEBUG_SG2                                                    0x1a94
+#define mmDCP1_DCP_DEBUG_SG2                                                    0x1c94
+#define mmDCP2_DCP_DEBUG_SG2                                                    0x1e94
+#define mmDCP3_DCP_DEBUG_SG2                                                    0x4094
+#define mmDCP4_DCP_DEBUG_SG2                                                    0x4294
+#define mmDCP5_DCP_DEBUG_SG2                                                    0x4494
+#define mmDCP_DVMM_DEBUG                                                        0x1a93
+#define mmDCP0_DCP_DVMM_DEBUG                                                   0x1a93
+#define mmDCP1_DCP_DVMM_DEBUG                                                   0x1c93
+#define mmDCP2_DCP_DVMM_DEBUG                                                   0x1e93
+#define mmDCP3_DCP_DVMM_DEBUG                                                   0x4093
+#define mmDCP4_DCP_DVMM_DEBUG                                                   0x4293
+#define mmDCP5_DCP_DVMM_DEBUG                                                   0x4493
+#define mmDCP_TEST_DEBUG_INDEX                                                  0x1a95
+#define mmDCP0_DCP_TEST_DEBUG_INDEX                                             0x1a95
+#define mmDCP1_DCP_TEST_DEBUG_INDEX                                             0x1c95
+#define mmDCP2_DCP_TEST_DEBUG_INDEX                                             0x1e95
+#define mmDCP3_DCP_TEST_DEBUG_INDEX                                             0x4095
+#define mmDCP4_DCP_TEST_DEBUG_INDEX                                             0x4295
+#define mmDCP5_DCP_TEST_DEBUG_INDEX                                             0x4495
+#define mmDCP_TEST_DEBUG_DATA                                                   0x1a96
+#define mmDCP0_DCP_TEST_DEBUG_DATA                                              0x1a96
+#define mmDCP1_DCP_TEST_DEBUG_DATA                                              0x1c96
+#define mmDCP2_DCP_TEST_DEBUG_DATA                                              0x1e96
+#define mmDCP3_DCP_TEST_DEBUG_DATA                                              0x4096
+#define mmDCP4_DCP_TEST_DEBUG_DATA                                              0x4296
+#define mmDCP5_DCP_TEST_DEBUG_DATA                                              0x4496
+#define mmGRPH_STEREOSYNC_FLIP                                                  0x1a97
+#define mmDCP0_GRPH_STEREOSYNC_FLIP                                             0x1a97
+#define mmDCP1_GRPH_STEREOSYNC_FLIP                                             0x1c97
+#define mmDCP2_GRPH_STEREOSYNC_FLIP                                             0x1e97
+#define mmDCP3_GRPH_STEREOSYNC_FLIP                                             0x4097
+#define mmDCP4_GRPH_STEREOSYNC_FLIP                                             0x4297
+#define mmDCP5_GRPH_STEREOSYNC_FLIP                                             0x4497
+#define mmDCP_DEBUG2                                                            0x1a98
+#define mmDCP0_DCP_DEBUG2                                                       0x1a98
+#define mmDCP1_DCP_DEBUG2                                                       0x1c98
+#define mmDCP2_DCP_DEBUG2                                                       0x1e98
+#define mmDCP3_DCP_DEBUG2                                                       0x4098
+#define mmDCP4_DCP_DEBUG2                                                       0x4298
+#define mmDCP5_DCP_DEBUG2                                                       0x4498
+#define mmHW_ROTATION                                                           0x1a9e
+#define mmDCP0_HW_ROTATION                                                      0x1a9e
+#define mmDCP1_HW_ROTATION                                                      0x1c9e
+#define mmDCP2_HW_ROTATION                                                      0x1e9e
+#define mmDCP3_HW_ROTATION                                                      0x409e
+#define mmDCP4_HW_ROTATION                                                      0x429e
+#define mmDCP5_HW_ROTATION                                                      0x449e
+#define mmGRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                                    0x1a9f
+#define mmDCP0_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x1a9f
+#define mmDCP1_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x1c9f
+#define mmDCP2_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x1e9f
+#define mmDCP3_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x409f
+#define mmDCP4_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x429f
+#define mmDCP5_GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL                               0x449f
+#define mmREGAMMA_CONTROL                                                       0x1aa0
+#define mmDCP0_REGAMMA_CONTROL                                                  0x1aa0
+#define mmDCP1_REGAMMA_CONTROL                                                  0x1ca0
+#define mmDCP2_REGAMMA_CONTROL                                                  0x1ea0
+#define mmDCP3_REGAMMA_CONTROL                                                  0x40a0
+#define mmDCP4_REGAMMA_CONTROL                                                  0x42a0
+#define mmDCP5_REGAMMA_CONTROL                                                  0x44a0
+#define mmREGAMMA_LUT_INDEX                                                     0x1aa1
+#define mmDCP0_REGAMMA_LUT_INDEX                                                0x1aa1
+#define mmDCP1_REGAMMA_LUT_INDEX                                                0x1ca1
+#define mmDCP2_REGAMMA_LUT_INDEX                                                0x1ea1
+#define mmDCP3_REGAMMA_LUT_INDEX                                                0x40a1
+#define mmDCP4_REGAMMA_LUT_INDEX                                                0x42a1
+#define mmDCP5_REGAMMA_LUT_INDEX                                                0x44a1
+#define mmREGAMMA_LUT_DATA                                                      0x1aa2
+#define mmDCP0_REGAMMA_LUT_DATA                                                 0x1aa2
+#define mmDCP1_REGAMMA_LUT_DATA                                                 0x1ca2
+#define mmDCP2_REGAMMA_LUT_DATA                                                 0x1ea2
+#define mmDCP3_REGAMMA_LUT_DATA                                                 0x40a2
+#define mmDCP4_REGAMMA_LUT_DATA                                                 0x42a2
+#define mmDCP5_REGAMMA_LUT_DATA                                                 0x44a2
+#define mmREGAMMA_LUT_WRITE_EN_MASK                                             0x1aa3
+#define mmDCP0_REGAMMA_LUT_WRITE_EN_MASK                                        0x1aa3
+#define mmDCP1_REGAMMA_LUT_WRITE_EN_MASK                                        0x1ca3
+#define mmDCP2_REGAMMA_LUT_WRITE_EN_MASK                                        0x1ea3
+#define mmDCP3_REGAMMA_LUT_WRITE_EN_MASK                                        0x40a3
+#define mmDCP4_REGAMMA_LUT_WRITE_EN_MASK                                        0x42a3
+#define mmDCP5_REGAMMA_LUT_WRITE_EN_MASK                                        0x44a3
+#define mmREGAMMA_CNTLA_START_CNTL                                              0x1aa4
+#define mmDCP0_REGAMMA_CNTLA_START_CNTL                                         0x1aa4
+#define mmDCP1_REGAMMA_CNTLA_START_CNTL                                         0x1ca4
+#define mmDCP2_REGAMMA_CNTLA_START_CNTL                                         0x1ea4
+#define mmDCP3_REGAMMA_CNTLA_START_CNTL                                         0x40a4
+#define mmDCP4_REGAMMA_CNTLA_START_CNTL                                         0x42a4
+#define mmDCP5_REGAMMA_CNTLA_START_CNTL                                         0x44a4
+#define mmREGAMMA_CNTLA_SLOPE_CNTL                                              0x1aa5
+#define mmDCP0_REGAMMA_CNTLA_SLOPE_CNTL                                         0x1aa5
+#define mmDCP1_REGAMMA_CNTLA_SLOPE_CNTL                                         0x1ca5
+#define mmDCP2_REGAMMA_CNTLA_SLOPE_CNTL                                         0x1ea5
+#define mmDCP3_REGAMMA_CNTLA_SLOPE_CNTL                                         0x40a5
+#define mmDCP4_REGAMMA_CNTLA_SLOPE_CNTL                                         0x42a5
+#define mmDCP5_REGAMMA_CNTLA_SLOPE_CNTL                                         0x44a5
+#define mmREGAMMA_CNTLA_END_CNTL1                                               0x1aa6
+#define mmDCP0_REGAMMA_CNTLA_END_CNTL1                                          0x1aa6
+#define mmDCP1_REGAMMA_CNTLA_END_CNTL1                                          0x1ca6
+#define mmDCP2_REGAMMA_CNTLA_END_CNTL1                                          0x1ea6
+#define mmDCP3_REGAMMA_CNTLA_END_CNTL1                                          0x40a6
+#define mmDCP4_REGAMMA_CNTLA_END_CNTL1                                          0x42a6
+#define mmDCP5_REGAMMA_CNTLA_END_CNTL1                                          0x44a6
+#define mmREGAMMA_CNTLA_END_CNTL2                                               0x1aa7
+#define mmDCP0_REGAMMA_CNTLA_END_CNTL2                                          0x1aa7
+#define mmDCP1_REGAMMA_CNTLA_END_CNTL2                                          0x1ca7
+#define mmDCP2_REGAMMA_CNTLA_END_CNTL2                                          0x1ea7
+#define mmDCP3_REGAMMA_CNTLA_END_CNTL2                                          0x40a7
+#define mmDCP4_REGAMMA_CNTLA_END_CNTL2                                          0x42a7
+#define mmDCP5_REGAMMA_CNTLA_END_CNTL2                                          0x44a7
+#define mmREGAMMA_CNTLA_REGION_0_1                                              0x1aa8
+#define mmDCP0_REGAMMA_CNTLA_REGION_0_1                                         0x1aa8
+#define mmDCP1_REGAMMA_CNTLA_REGION_0_1                                         0x1ca8
+#define mmDCP2_REGAMMA_CNTLA_REGION_0_1                                         0x1ea8
+#define mmDCP3_REGAMMA_CNTLA_REGION_0_1                                         0x40a8
+#define mmDCP4_REGAMMA_CNTLA_REGION_0_1                                         0x42a8
+#define mmDCP5_REGAMMA_CNTLA_REGION_0_1                                         0x44a8
+#define mmREGAMMA_CNTLA_REGION_2_3                                              0x1aa9
+#define mmDCP0_REGAMMA_CNTLA_REGION_2_3                                         0x1aa9
+#define mmDCP1_REGAMMA_CNTLA_REGION_2_3                                         0x1ca9
+#define mmDCP2_REGAMMA_CNTLA_REGION_2_3                                         0x1ea9
+#define mmDCP3_REGAMMA_CNTLA_REGION_2_3                                         0x40a9
+#define mmDCP4_REGAMMA_CNTLA_REGION_2_3                                         0x42a9
+#define mmDCP5_REGAMMA_CNTLA_REGION_2_3                                         0x44a9
+#define mmREGAMMA_CNTLA_REGION_4_5                                              0x1aaa
+#define mmDCP0_REGAMMA_CNTLA_REGION_4_5                                         0x1aaa
+#define mmDCP1_REGAMMA_CNTLA_REGION_4_5                                         0x1caa
+#define mmDCP2_REGAMMA_CNTLA_REGION_4_5                                         0x1eaa
+#define mmDCP3_REGAMMA_CNTLA_REGION_4_5                                         0x40aa
+#define mmDCP4_REGAMMA_CNTLA_REGION_4_5                                         0x42aa
+#define mmDCP5_REGAMMA_CNTLA_REGION_4_5                                         0x44aa
+#define mmREGAMMA_CNTLA_REGION_6_7                                              0x1aab
+#define mmDCP0_REGAMMA_CNTLA_REGION_6_7                                         0x1aab
+#define mmDCP1_REGAMMA_CNTLA_REGION_6_7                                         0x1cab
+#define mmDCP2_REGAMMA_CNTLA_REGION_6_7                                         0x1eab
+#define mmDCP3_REGAMMA_CNTLA_REGION_6_7                                         0x40ab
+#define mmDCP4_REGAMMA_CNTLA_REGION_6_7                                         0x42ab
+#define mmDCP5_REGAMMA_CNTLA_REGION_6_7                                         0x44ab
+#define mmREGAMMA_CNTLA_REGION_8_9                                              0x1aac
+#define mmDCP0_REGAMMA_CNTLA_REGION_8_9                                         0x1aac
+#define mmDCP1_REGAMMA_CNTLA_REGION_8_9                                         0x1cac
+#define mmDCP2_REGAMMA_CNTLA_REGION_8_9                                         0x1eac
+#define mmDCP3_REGAMMA_CNTLA_REGION_8_9                                         0x40ac
+#define mmDCP4_REGAMMA_CNTLA_REGION_8_9                                         0x42ac
+#define mmDCP5_REGAMMA_CNTLA_REGION_8_9                                         0x44ac
+#define mmREGAMMA_CNTLA_REGION_10_11                                            0x1aad
+#define mmDCP0_REGAMMA_CNTLA_REGION_10_11                                       0x1aad
+#define mmDCP1_REGAMMA_CNTLA_REGION_10_11                                       0x1cad
+#define mmDCP2_REGAMMA_CNTLA_REGION_10_11                                       0x1ead
+#define mmDCP3_REGAMMA_CNTLA_REGION_10_11                                       0x40ad
+#define mmDCP4_REGAMMA_CNTLA_REGION_10_11                                       0x42ad
+#define mmDCP5_REGAMMA_CNTLA_REGION_10_11                                       0x44ad
+#define mmREGAMMA_CNTLA_REGION_12_13                                            0x1aae
+#define mmDCP0_REGAMMA_CNTLA_REGION_12_13                                       0x1aae
+#define mmDCP1_REGAMMA_CNTLA_REGION_12_13                                       0x1cae
+#define mmDCP2_REGAMMA_CNTLA_REGION_12_13                                       0x1eae
+#define mmDCP3_REGAMMA_CNTLA_REGION_12_13                                       0x40ae
+#define mmDCP4_REGAMMA_CNTLA_REGION_12_13                                       0x42ae
+#define mmDCP5_REGAMMA_CNTLA_REGION_12_13                                       0x44ae
+#define mmREGAMMA_CNTLA_REGION_14_15                                            0x1aaf
+#define mmDCP0_REGAMMA_CNTLA_REGION_14_15                                       0x1aaf
+#define mmDCP1_REGAMMA_CNTLA_REGION_14_15                                       0x1caf
+#define mmDCP2_REGAMMA_CNTLA_REGION_14_15                                       0x1eaf
+#define mmDCP3_REGAMMA_CNTLA_REGION_14_15                                       0x40af
+#define mmDCP4_REGAMMA_CNTLA_REGION_14_15                                       0x42af
+#define mmDCP5_REGAMMA_CNTLA_REGION_14_15                                       0x44af
+#define mmREGAMMA_CNTLB_START_CNTL                                              0x1ab0
+#define mmDCP0_REGAMMA_CNTLB_START_CNTL                                         0x1ab0
+#define mmDCP1_REGAMMA_CNTLB_START_CNTL                                         0x1cb0
+#define mmDCP2_REGAMMA_CNTLB_START_CNTL                                         0x1eb0
+#define mmDCP3_REGAMMA_CNTLB_START_CNTL                                         0x40b0
+#define mmDCP4_REGAMMA_CNTLB_START_CNTL                                         0x42b0
+#define mmDCP5_REGAMMA_CNTLB_START_CNTL                                         0x44b0
+#define mmREGAMMA_CNTLB_SLOPE_CNTL                                              0x1ab1
+#define mmDCP0_REGAMMA_CNTLB_SLOPE_CNTL                                         0x1ab1
+#define mmDCP1_REGAMMA_CNTLB_SLOPE_CNTL                                         0x1cb1
+#define mmDCP2_REGAMMA_CNTLB_SLOPE_CNTL                                         0x1eb1
+#define mmDCP3_REGAMMA_CNTLB_SLOPE_CNTL                                         0x40b1
+#define mmDCP4_REGAMMA_CNTLB_SLOPE_CNTL                                         0x42b1
+#define mmDCP5_REGAMMA_CNTLB_SLOPE_CNTL                                         0x44b1
+#define mmREGAMMA_CNTLB_END_CNTL1                                               0x1ab2
+#define mmDCP0_REGAMMA_CNTLB_END_CNTL1                                          0x1ab2
+#define mmDCP1_REGAMMA_CNTLB_END_CNTL1                                          0x1cb2
+#define mmDCP2_REGAMMA_CNTLB_END_CNTL1                                          0x1eb2
+#define mmDCP3_REGAMMA_CNTLB_END_CNTL1                                          0x40b2
+#define mmDCP4_REGAMMA_CNTLB_END_CNTL1                                          0x42b2
+#define mmDCP5_REGAMMA_CNTLB_END_CNTL1                                          0x44b2
+#define mmREGAMMA_CNTLB_END_CNTL2                                               0x1ab3
+#define mmDCP0_REGAMMA_CNTLB_END_CNTL2                                          0x1ab3
+#define mmDCP1_REGAMMA_CNTLB_END_CNTL2                                          0x1cb3
+#define mmDCP2_REGAMMA_CNTLB_END_CNTL2                                          0x1eb3
+#define mmDCP3_REGAMMA_CNTLB_END_CNTL2                                          0x40b3
+#define mmDCP4_REGAMMA_CNTLB_END_CNTL2                                          0x42b3
+#define mmDCP5_REGAMMA_CNTLB_END_CNTL2                                          0x44b3
+#define mmREGAMMA_CNTLB_REGION_0_1                                              0x1ab4
+#define mmDCP0_REGAMMA_CNTLB_REGION_0_1                                         0x1ab4
+#define mmDCP1_REGAMMA_CNTLB_REGION_0_1                                         0x1cb4
+#define mmDCP2_REGAMMA_CNTLB_REGION_0_1                                         0x1eb4
+#define mmDCP3_REGAMMA_CNTLB_REGION_0_1                                         0x40b4
+#define mmDCP4_REGAMMA_CNTLB_REGION_0_1                                         0x42b4
+#define mmDCP5_REGAMMA_CNTLB_REGION_0_1                                         0x44b4
+#define mmREGAMMA_CNTLB_REGION_2_3                                              0x1ab5
+#define mmDCP0_REGAMMA_CNTLB_REGION_2_3                                         0x1ab5
+#define mmDCP1_REGAMMA_CNTLB_REGION_2_3                                         0x1cb5
+#define mmDCP2_REGAMMA_CNTLB_REGION_2_3                                         0x1eb5
+#define mmDCP3_REGAMMA_CNTLB_REGION_2_3                                         0x40b5
+#define mmDCP4_REGAMMA_CNTLB_REGION_2_3                                         0x42b5
+#define mmDCP5_REGAMMA_CNTLB_REGION_2_3                                         0x44b5
+#define mmREGAMMA_CNTLB_REGION_4_5                                              0x1ab6
+#define mmDCP0_REGAMMA_CNTLB_REGION_4_5                                         0x1ab6
+#define mmDCP1_REGAMMA_CNTLB_REGION_4_5                                         0x1cb6
+#define mmDCP2_REGAMMA_CNTLB_REGION_4_5                                         0x1eb6
+#define mmDCP3_REGAMMA_CNTLB_REGION_4_5                                         0x40b6
+#define mmDCP4_REGAMMA_CNTLB_REGION_4_5                                         0x42b6
+#define mmDCP5_REGAMMA_CNTLB_REGION_4_5                                         0x44b6
+#define mmREGAMMA_CNTLB_REGION_6_7                                              0x1ab7
+#define mmDCP0_REGAMMA_CNTLB_REGION_6_7                                         0x1ab7
+#define mmDCP1_REGAMMA_CNTLB_REGION_6_7                                         0x1cb7
+#define mmDCP2_REGAMMA_CNTLB_REGION_6_7                                         0x1eb7
+#define mmDCP3_REGAMMA_CNTLB_REGION_6_7                                         0x40b7
+#define mmDCP4_REGAMMA_CNTLB_REGION_6_7                                         0x42b7
+#define mmDCP5_REGAMMA_CNTLB_REGION_6_7                                         0x44b7
+#define mmREGAMMA_CNTLB_REGION_8_9                                              0x1ab8
+#define mmDCP0_REGAMMA_CNTLB_REGION_8_9                                         0x1ab8
+#define mmDCP1_REGAMMA_CNTLB_REGION_8_9                                         0x1cb8
+#define mmDCP2_REGAMMA_CNTLB_REGION_8_9                                         0x1eb8
+#define mmDCP3_REGAMMA_CNTLB_REGION_8_9                                         0x40b8
+#define mmDCP4_REGAMMA_CNTLB_REGION_8_9                                         0x42b8
+#define mmDCP5_REGAMMA_CNTLB_REGION_8_9                                         0x44b8
+#define mmREGAMMA_CNTLB_REGION_10_11                                            0x1ab9
+#define mmDCP0_REGAMMA_CNTLB_REGION_10_11                                       0x1ab9
+#define mmDCP1_REGAMMA_CNTLB_REGION_10_11                                       0x1cb9
+#define mmDCP2_REGAMMA_CNTLB_REGION_10_11                                       0x1eb9
+#define mmDCP3_REGAMMA_CNTLB_REGION_10_11                                       0x40b9
+#define mmDCP4_REGAMMA_CNTLB_REGION_10_11                                       0x42b9
+#define mmDCP5_REGAMMA_CNTLB_REGION_10_11                                       0x44b9
+#define mmREGAMMA_CNTLB_REGION_12_13                                            0x1aba
+#define mmDCP0_REGAMMA_CNTLB_REGION_12_13                                       0x1aba
+#define mmDCP1_REGAMMA_CNTLB_REGION_12_13                                       0x1cba
+#define mmDCP2_REGAMMA_CNTLB_REGION_12_13                                       0x1eba
+#define mmDCP3_REGAMMA_CNTLB_REGION_12_13                                       0x40ba
+#define mmDCP4_REGAMMA_CNTLB_REGION_12_13                                       0x42ba
+#define mmDCP5_REGAMMA_CNTLB_REGION_12_13                                       0x44ba
+#define mmREGAMMA_CNTLB_REGION_14_15                                            0x1abb
+#define mmDCP0_REGAMMA_CNTLB_REGION_14_15                                       0x1abb
+#define mmDCP1_REGAMMA_CNTLB_REGION_14_15                                       0x1cbb
+#define mmDCP2_REGAMMA_CNTLB_REGION_14_15                                       0x1ebb
+#define mmDCP3_REGAMMA_CNTLB_REGION_14_15                                       0x40bb
+#define mmDCP4_REGAMMA_CNTLB_REGION_14_15                                       0x42bb
+#define mmDCP5_REGAMMA_CNTLB_REGION_14_15                                       0x44bb
+#define mmALPHA_CONTROL                                                         0x1abc
+#define mmDCP0_ALPHA_CONTROL                                                    0x1abc
+#define mmDCP1_ALPHA_CONTROL                                                    0x1cbc
+#define mmDCP2_ALPHA_CONTROL                                                    0x1ebc
+#define mmDCP3_ALPHA_CONTROL                                                    0x40bc
+#define mmDCP4_ALPHA_CONTROL                                                    0x42bc
+#define mmDCP5_ALPHA_CONTROL                                                    0x44bc
+#define mmGRPH_XDMA_RECOVERY_SURFACE_ADDRESS                                    0x1abd
+#define mmDCP0_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x1abd
+#define mmDCP1_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x1cbd
+#define mmDCP2_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x1ebd
+#define mmDCP3_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x40bd
+#define mmDCP4_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x42bd
+#define mmDCP5_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS                               0x44bd
+#define mmGRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                               0x1abe
+#define mmDCP0_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x1abe
+#define mmDCP1_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x1cbe
+#define mmDCP2_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x1ebe
+#define mmDCP3_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x40be
+#define mmDCP4_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x42be
+#define mmDCP5_GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH                          0x44be
+#define mmGRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                                  0x1abf
+#define mmDCP0_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x1abf
+#define mmDCP1_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x1cbf
+#define mmDCP2_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x1ebf
+#define mmDCP3_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x40bf
+#define mmDCP4_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x42bf
+#define mmDCP5_GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS                             0x44bf
+#define mmGRPH_SURFACE_COUNTER_CONTROL                                          0x1a0f
+#define mmDCP0_GRPH_SURFACE_COUNTER_CONTROL                                     0x1a0f
+#define mmDCP1_GRPH_SURFACE_COUNTER_CONTROL                                     0x1c0f
+#define mmDCP2_GRPH_SURFACE_COUNTER_CONTROL                                     0x1e0f
+#define mmDCP3_GRPH_SURFACE_COUNTER_CONTROL                                     0x400f
+#define mmDCP4_GRPH_SURFACE_COUNTER_CONTROL                                     0x420f
+#define mmDCP5_GRPH_SURFACE_COUNTER_CONTROL                                     0x440f
+#define mmGRPH_SURFACE_COUNTER_OUTPUT                                           0x1a1d
+#define mmDCP0_GRPH_SURFACE_COUNTER_OUTPUT                                      0x1a1d
+#define mmDCP1_GRPH_SURFACE_COUNTER_OUTPUT                                      0x1c1d
+#define mmDCP2_GRPH_SURFACE_COUNTER_OUTPUT                                      0x1e1d
+#define mmDCP3_GRPH_SURFACE_COUNTER_OUTPUT                                      0x401d
+#define mmDCP4_GRPH_SURFACE_COUNTER_OUTPUT                                      0x421d
+#define mmDCP5_GRPH_SURFACE_COUNTER_OUTPUT                                      0x441d
+#define mmDIG_FE_CNTL                                                           0x4a00
+#define mmDIG0_DIG_FE_CNTL                                                      0x4a00
+#define mmDIG1_DIG_FE_CNTL                                                      0x4b00
+#define mmDIG2_DIG_FE_CNTL                                                      0x4c00
+#define mmDIG3_DIG_FE_CNTL                                                      0x4d00
+#define mmDIG4_DIG_FE_CNTL                                                      0x4e00
+#define mmDIG5_DIG_FE_CNTL                                                      0x4f00
+#define mmDIG6_DIG_FE_CNTL                                                      0x5400
+#define mmDIG7_DIG_FE_CNTL                                                      0x5600
+#define mmDIG8_DIG_FE_CNTL                                                      0x5700
+#define mmDIG_OUTPUT_CRC_CNTL                                                   0x4a01
+#define mmDIG0_DIG_OUTPUT_CRC_CNTL                                              0x4a01
+#define mmDIG1_DIG_OUTPUT_CRC_CNTL                                              0x4b01
+#define mmDIG2_DIG_OUTPUT_CRC_CNTL                                              0x4c01
+#define mmDIG3_DIG_OUTPUT_CRC_CNTL                                              0x4d01
+#define mmDIG4_DIG_OUTPUT_CRC_CNTL                                              0x4e01
+#define mmDIG5_DIG_OUTPUT_CRC_CNTL                                              0x4f01
+#define mmDIG6_DIG_OUTPUT_CRC_CNTL                                              0x5401
+#define mmDIG7_DIG_OUTPUT_CRC_CNTL                                              0x5601
+#define mmDIG8_DIG_OUTPUT_CRC_CNTL                                              0x5701
+#define mmDIG_OUTPUT_CRC_RESULT                                                 0x4a02
+#define mmDIG0_DIG_OUTPUT_CRC_RESULT                                            0x4a02
+#define mmDIG1_DIG_OUTPUT_CRC_RESULT                                            0x4b02
+#define mmDIG2_DIG_OUTPUT_CRC_RESULT                                            0x4c02
+#define mmDIG3_DIG_OUTPUT_CRC_RESULT                                            0x4d02
+#define mmDIG4_DIG_OUTPUT_CRC_RESULT                                            0x4e02
+#define mmDIG5_DIG_OUTPUT_CRC_RESULT                                            0x4f02
+#define mmDIG6_DIG_OUTPUT_CRC_RESULT                                            0x5402
+#define mmDIG7_DIG_OUTPUT_CRC_RESULT                                            0x5602
+#define mmDIG8_DIG_OUTPUT_CRC_RESULT                                            0x5702
+#define mmDIG_CLOCK_PATTERN                                                     0x4a03
+#define mmDIG0_DIG_CLOCK_PATTERN                                                0x4a03
+#define mmDIG1_DIG_CLOCK_PATTERN                                                0x4b03
+#define mmDIG2_DIG_CLOCK_PATTERN                                                0x4c03
+#define mmDIG3_DIG_CLOCK_PATTERN                                                0x4d03
+#define mmDIG4_DIG_CLOCK_PATTERN                                                0x4e03
+#define mmDIG5_DIG_CLOCK_PATTERN                                                0x4f03
+#define mmDIG6_DIG_CLOCK_PATTERN                                                0x5403
+#define mmDIG7_DIG_CLOCK_PATTERN                                                0x5603
+#define mmDIG8_DIG_CLOCK_PATTERN                                                0x5703
+#define mmDIG_TEST_PATTERN                                                      0x4a04
+#define mmDIG0_DIG_TEST_PATTERN                                                 0x4a04
+#define mmDIG1_DIG_TEST_PATTERN                                                 0x4b04
+#define mmDIG2_DIG_TEST_PATTERN                                                 0x4c04
+#define mmDIG3_DIG_TEST_PATTERN                                                 0x4d04
+#define mmDIG4_DIG_TEST_PATTERN                                                 0x4e04
+#define mmDIG5_DIG_TEST_PATTERN                                                 0x4f04
+#define mmDIG6_DIG_TEST_PATTERN                                                 0x5404
+#define mmDIG7_DIG_TEST_PATTERN                                                 0x5604
+#define mmDIG8_DIG_TEST_PATTERN                                                 0x5704
+#define mmDIG_RANDOM_PATTERN_SEED                                               0x4a05
+#define mmDIG0_DIG_RANDOM_PATTERN_SEED                                          0x4a05
+#define mmDIG1_DIG_RANDOM_PATTERN_SEED                                          0x4b05
+#define mmDIG2_DIG_RANDOM_PATTERN_SEED                                          0x4c05
+#define mmDIG3_DIG_RANDOM_PATTERN_SEED                                          0x4d05
+#define mmDIG4_DIG_RANDOM_PATTERN_SEED                                          0x4e05
+#define mmDIG5_DIG_RANDOM_PATTERN_SEED                                          0x4f05
+#define mmDIG6_DIG_RANDOM_PATTERN_SEED                                          0x5405
+#define mmDIG7_DIG_RANDOM_PATTERN_SEED                                          0x5605
+#define mmDIG8_DIG_RANDOM_PATTERN_SEED                                          0x5705
+#define mmDIG_FIFO_STATUS                                                       0x4a06
+#define mmDIG0_DIG_FIFO_STATUS                                                  0x4a06
+#define mmDIG1_DIG_FIFO_STATUS                                                  0x4b06
+#define mmDIG2_DIG_FIFO_STATUS                                                  0x4c06
+#define mmDIG3_DIG_FIFO_STATUS                                                  0x4d06
+#define mmDIG4_DIG_FIFO_STATUS                                                  0x4e06
+#define mmDIG5_DIG_FIFO_STATUS                                                  0x4f06
+#define mmDIG6_DIG_FIFO_STATUS                                                  0x5406
+#define mmDIG7_DIG_FIFO_STATUS                                                  0x5606
+#define mmDIG8_DIG_FIFO_STATUS                                                  0x5706
+#define mmDIG_DISPCLK_SWITCH_CNTL                                               0x4a07
+#define mmDIG0_DIG_DISPCLK_SWITCH_CNTL                                          0x4a07
+#define mmDIG1_DIG_DISPCLK_SWITCH_CNTL                                          0x4b07
+#define mmDIG2_DIG_DISPCLK_SWITCH_CNTL                                          0x4c07
+#define mmDIG3_DIG_DISPCLK_SWITCH_CNTL                                          0x4d07
+#define mmDIG4_DIG_DISPCLK_SWITCH_CNTL                                          0x4e07
+#define mmDIG5_DIG_DISPCLK_SWITCH_CNTL                                          0x4f07
+#define mmDIG6_DIG_DISPCLK_SWITCH_CNTL                                          0x5407
+#define mmDIG7_DIG_DISPCLK_SWITCH_CNTL                                          0x5607
+#define mmDIG8_DIG_DISPCLK_SWITCH_CNTL                                          0x5707
+#define mmDIG_DISPCLK_SWITCH_STATUS                                             0x4a08
+#define mmDIG0_DIG_DISPCLK_SWITCH_STATUS                                        0x4a08
+#define mmDIG1_DIG_DISPCLK_SWITCH_STATUS                                        0x4b08
+#define mmDIG2_DIG_DISPCLK_SWITCH_STATUS                                        0x4c08
+#define mmDIG3_DIG_DISPCLK_SWITCH_STATUS                                        0x4d08
+#define mmDIG4_DIG_DISPCLK_SWITCH_STATUS                                        0x4e08
+#define mmDIG5_DIG_DISPCLK_SWITCH_STATUS                                        0x4f08
+#define mmDIG6_DIG_DISPCLK_SWITCH_STATUS                                        0x5408
+#define mmDIG7_DIG_DISPCLK_SWITCH_STATUS                                        0x5608
+#define mmDIG8_DIG_DISPCLK_SWITCH_STATUS                                        0x5708
+#define mmHDMI_CONTROL                                                          0x4a09
+#define mmDIG0_HDMI_CONTROL                                                     0x4a09
+#define mmDIG1_HDMI_CONTROL                                                     0x4b09
+#define mmDIG2_HDMI_CONTROL                                                     0x4c09
+#define mmDIG3_HDMI_CONTROL                                                     0x4d09
+#define mmDIG4_HDMI_CONTROL                                                     0x4e09
+#define mmDIG5_HDMI_CONTROL                                                     0x4f09
+#define mmDIG6_HDMI_CONTROL                                                     0x5409
+#define mmDIG7_HDMI_CONTROL                                                     0x5609
+#define mmDIG8_HDMI_CONTROL                                                     0x5709
+#define mmHDMI_STATUS                                                           0x4a0a
+#define mmDIG0_HDMI_STATUS                                                      0x4a0a
+#define mmDIG1_HDMI_STATUS                                                      0x4b0a
+#define mmDIG2_HDMI_STATUS                                                      0x4c0a
+#define mmDIG3_HDMI_STATUS                                                      0x4d0a
+#define mmDIG4_HDMI_STATUS                                                      0x4e0a
+#define mmDIG5_HDMI_STATUS                                                      0x4f0a
+#define mmDIG6_HDMI_STATUS                                                      0x540a
+#define mmDIG7_HDMI_STATUS                                                      0x560a
+#define mmDIG8_HDMI_STATUS                                                      0x570a
+#define mmHDMI_AUDIO_PACKET_CONTROL                                             0x4a0b
+#define mmDIG0_HDMI_AUDIO_PACKET_CONTROL                                        0x4a0b
+#define mmDIG1_HDMI_AUDIO_PACKET_CONTROL                                        0x4b0b
+#define mmDIG2_HDMI_AUDIO_PACKET_CONTROL                                        0x4c0b
+#define mmDIG3_HDMI_AUDIO_PACKET_CONTROL                                        0x4d0b
+#define mmDIG4_HDMI_AUDIO_PACKET_CONTROL                                        0x4e0b
+#define mmDIG5_HDMI_AUDIO_PACKET_CONTROL                                        0x4f0b
+#define mmDIG6_HDMI_AUDIO_PACKET_CONTROL                                        0x540b
+#define mmDIG7_HDMI_AUDIO_PACKET_CONTROL                                        0x560b
+#define mmDIG8_HDMI_AUDIO_PACKET_CONTROL                                        0x570b
+#define mmHDMI_ACR_PACKET_CONTROL                                               0x4a0c
+#define mmDIG0_HDMI_ACR_PACKET_CONTROL                                          0x4a0c
+#define mmDIG1_HDMI_ACR_PACKET_CONTROL                                          0x4b0c
+#define mmDIG2_HDMI_ACR_PACKET_CONTROL                                          0x4c0c
+#define mmDIG3_HDMI_ACR_PACKET_CONTROL                                          0x4d0c
+#define mmDIG4_HDMI_ACR_PACKET_CONTROL                                          0x4e0c
+#define mmDIG5_HDMI_ACR_PACKET_CONTROL                                          0x4f0c
+#define mmDIG6_HDMI_ACR_PACKET_CONTROL                                          0x540c
+#define mmDIG7_HDMI_ACR_PACKET_CONTROL                                          0x560c
+#define mmDIG8_HDMI_ACR_PACKET_CONTROL                                          0x570c
+#define mmHDMI_VBI_PACKET_CONTROL                                               0x4a0d
+#define mmDIG0_HDMI_VBI_PACKET_CONTROL                                          0x4a0d
+#define mmDIG1_HDMI_VBI_PACKET_CONTROL                                          0x4b0d
+#define mmDIG2_HDMI_VBI_PACKET_CONTROL                                          0x4c0d
+#define mmDIG3_HDMI_VBI_PACKET_CONTROL                                          0x4d0d
+#define mmDIG4_HDMI_VBI_PACKET_CONTROL                                          0x4e0d
+#define mmDIG5_HDMI_VBI_PACKET_CONTROL                                          0x4f0d
+#define mmDIG6_HDMI_VBI_PACKET_CONTROL                                          0x540d
+#define mmDIG7_HDMI_VBI_PACKET_CONTROL                                          0x560d
+#define mmDIG8_HDMI_VBI_PACKET_CONTROL                                          0x570d
+#define mmHDMI_INFOFRAME_CONTROL0                                               0x4a0e
+#define mmDIG0_HDMI_INFOFRAME_CONTROL0                                          0x4a0e
+#define mmDIG1_HDMI_INFOFRAME_CONTROL0                                          0x4b0e
+#define mmDIG2_HDMI_INFOFRAME_CONTROL0                                          0x4c0e
+#define mmDIG3_HDMI_INFOFRAME_CONTROL0                                          0x4d0e
+#define mmDIG4_HDMI_INFOFRAME_CONTROL0                                          0x4e0e
+#define mmDIG5_HDMI_INFOFRAME_CONTROL0                                          0x4f0e
+#define mmDIG6_HDMI_INFOFRAME_CONTROL0                                          0x540e
+#define mmDIG7_HDMI_INFOFRAME_CONTROL0                                          0x560e
+#define mmDIG8_HDMI_INFOFRAME_CONTROL0                                          0x570e
+#define mmHDMI_INFOFRAME_CONTROL1                                               0x4a0f
+#define mmDIG0_HDMI_INFOFRAME_CONTROL1                                          0x4a0f
+#define mmDIG1_HDMI_INFOFRAME_CONTROL1                                          0x4b0f
+#define mmDIG2_HDMI_INFOFRAME_CONTROL1                                          0x4c0f
+#define mmDIG3_HDMI_INFOFRAME_CONTROL1                                          0x4d0f
+#define mmDIG4_HDMI_INFOFRAME_CONTROL1                                          0x4e0f
+#define mmDIG5_HDMI_INFOFRAME_CONTROL1                                          0x4f0f
+#define mmDIG6_HDMI_INFOFRAME_CONTROL1                                          0x540f
+#define mmDIG7_HDMI_INFOFRAME_CONTROL1                                          0x560f
+#define mmDIG8_HDMI_INFOFRAME_CONTROL1                                          0x570f
+#define mmHDMI_GENERIC_PACKET_CONTROL0                                          0x4a10
+#define mmDIG0_HDMI_GENERIC_PACKET_CONTROL0                                     0x4a10
+#define mmDIG1_HDMI_GENERIC_PACKET_CONTROL0                                     0x4b10
+#define mmDIG2_HDMI_GENERIC_PACKET_CONTROL0                                     0x4c10
+#define mmDIG3_HDMI_GENERIC_PACKET_CONTROL0                                     0x4d10
+#define mmDIG4_HDMI_GENERIC_PACKET_CONTROL0                                     0x4e10
+#define mmDIG5_HDMI_GENERIC_PACKET_CONTROL0                                     0x4f10
+#define mmDIG6_HDMI_GENERIC_PACKET_CONTROL0                                     0x5410
+#define mmDIG7_HDMI_GENERIC_PACKET_CONTROL0                                     0x5610
+#define mmDIG8_HDMI_GENERIC_PACKET_CONTROL0                                     0x5710
+#define mmAFMT_INTERRUPT_STATUS                                                 0x4a11
+#define mmDIG0_AFMT_INTERRUPT_STATUS                                            0x4a11
+#define mmDIG1_AFMT_INTERRUPT_STATUS                                            0x4b11
+#define mmDIG2_AFMT_INTERRUPT_STATUS                                            0x4c11
+#define mmDIG3_AFMT_INTERRUPT_STATUS                                            0x4d11
+#define mmDIG4_AFMT_INTERRUPT_STATUS                                            0x4e11
+#define mmDIG5_AFMT_INTERRUPT_STATUS                                            0x4f11
+#define mmDIG6_AFMT_INTERRUPT_STATUS                                            0x5411
+#define mmDIG7_AFMT_INTERRUPT_STATUS                                            0x5611
+#define mmDIG8_AFMT_INTERRUPT_STATUS                                            0x5711
+#define mmHDMI_GC                                                               0x4a13
+#define mmDIG0_HDMI_GC                                                          0x4a13
+#define mmDIG1_HDMI_GC                                                          0x4b13
+#define mmDIG2_HDMI_GC                                                          0x4c13
+#define mmDIG3_HDMI_GC                                                          0x4d13
+#define mmDIG4_HDMI_GC                                                          0x4e13
+#define mmDIG5_HDMI_GC                                                          0x4f13
+#define mmDIG6_HDMI_GC                                                          0x5413
+#define mmDIG7_HDMI_GC                                                          0x5613
+#define mmDIG8_HDMI_GC                                                          0x5713
+#define mmAFMT_AUDIO_PACKET_CONTROL2                                            0x4a14
+#define mmDIG0_AFMT_AUDIO_PACKET_CONTROL2                                       0x4a14
+#define mmDIG1_AFMT_AUDIO_PACKET_CONTROL2                                       0x4b14
+#define mmDIG2_AFMT_AUDIO_PACKET_CONTROL2                                       0x4c14
+#define mmDIG3_AFMT_AUDIO_PACKET_CONTROL2                                       0x4d14
+#define mmDIG4_AFMT_AUDIO_PACKET_CONTROL2                                       0x4e14
+#define mmDIG5_AFMT_AUDIO_PACKET_CONTROL2                                       0x4f14
+#define mmDIG6_AFMT_AUDIO_PACKET_CONTROL2                                       0x5414
+#define mmDIG7_AFMT_AUDIO_PACKET_CONTROL2                                       0x5614
+#define mmDIG8_AFMT_AUDIO_PACKET_CONTROL2                                       0x5714
+#define mmAFMT_ISRC1_0                                                          0x4a15
+#define mmDIG0_AFMT_ISRC1_0                                                     0x4a15
+#define mmDIG1_AFMT_ISRC1_0                                                     0x4b15
+#define mmDIG2_AFMT_ISRC1_0                                                     0x4c15
+#define mmDIG3_AFMT_ISRC1_0                                                     0x4d15
+#define mmDIG4_AFMT_ISRC1_0                                                     0x4e15
+#define mmDIG5_AFMT_ISRC1_0                                                     0x4f15
+#define mmDIG6_AFMT_ISRC1_0                                                     0x5415
+#define mmDIG7_AFMT_ISRC1_0                                                     0x5615
+#define mmDIG8_AFMT_ISRC1_0                                                     0x5715
+#define mmAFMT_ISRC1_1                                                          0x4a16
+#define mmDIG0_AFMT_ISRC1_1                                                     0x4a16
+#define mmDIG1_AFMT_ISRC1_1                                                     0x4b16
+#define mmDIG2_AFMT_ISRC1_1                                                     0x4c16
+#define mmDIG3_AFMT_ISRC1_1                                                     0x4d16
+#define mmDIG4_AFMT_ISRC1_1                                                     0x4e16
+#define mmDIG5_AFMT_ISRC1_1                                                     0x4f16
+#define mmDIG6_AFMT_ISRC1_1                                                     0x5416
+#define mmDIG7_AFMT_ISRC1_1                                                     0x5616
+#define mmDIG8_AFMT_ISRC1_1                                                     0x5716
+#define mmAFMT_ISRC1_2                                                          0x4a17
+#define mmDIG0_AFMT_ISRC1_2                                                     0x4a17
+#define mmDIG1_AFMT_ISRC1_2                                                     0x4b17
+#define mmDIG2_AFMT_ISRC1_2                                                     0x4c17
+#define mmDIG3_AFMT_ISRC1_2                                                     0x4d17
+#define mmDIG4_AFMT_ISRC1_2                                                     0x4e17
+#define mmDIG5_AFMT_ISRC1_2                                                     0x4f17
+#define mmDIG6_AFMT_ISRC1_2                                                     0x5417
+#define mmDIG7_AFMT_ISRC1_2                                                     0x5617
+#define mmDIG8_AFMT_ISRC1_2                                                     0x5717
+#define mmAFMT_ISRC1_3                                                          0x4a18
+#define mmDIG0_AFMT_ISRC1_3                                                     0x4a18
+#define mmDIG1_AFMT_ISRC1_3                                                     0x4b18
+#define mmDIG2_AFMT_ISRC1_3                                                     0x4c18
+#define mmDIG3_AFMT_ISRC1_3                                                     0x4d18
+#define mmDIG4_AFMT_ISRC1_3                                                     0x4e18
+#define mmDIG5_AFMT_ISRC1_3                                                     0x4f18
+#define mmDIG6_AFMT_ISRC1_3                                                     0x5418
+#define mmDIG7_AFMT_ISRC1_3                                                     0x5618
+#define mmDIG8_AFMT_ISRC1_3                                                     0x5718
+#define mmAFMT_ISRC1_4                                                          0x4a19
+#define mmDIG0_AFMT_ISRC1_4                                                     0x4a19
+#define mmDIG1_AFMT_ISRC1_4                                                     0x4b19
+#define mmDIG2_AFMT_ISRC1_4                                                     0x4c19
+#define mmDIG3_AFMT_ISRC1_4                                                     0x4d19
+#define mmDIG4_AFMT_ISRC1_4                                                     0x4e19
+#define mmDIG5_AFMT_ISRC1_4                                                     0x4f19
+#define mmDIG6_AFMT_ISRC1_4                                                     0x5419
+#define mmDIG7_AFMT_ISRC1_4                                                     0x5619
+#define mmDIG8_AFMT_ISRC1_4                                                     0x5719
+#define mmAFMT_ISRC2_0                                                          0x4a1a
+#define mmDIG0_AFMT_ISRC2_0                                                     0x4a1a
+#define mmDIG1_AFMT_ISRC2_0                                                     0x4b1a
+#define mmDIG2_AFMT_ISRC2_0                                                     0x4c1a
+#define mmDIG3_AFMT_ISRC2_0                                                     0x4d1a
+#define mmDIG4_AFMT_ISRC2_0                                                     0x4e1a
+#define mmDIG5_AFMT_ISRC2_0                                                     0x4f1a
+#define mmDIG6_AFMT_ISRC2_0                                                     0x541a
+#define mmDIG7_AFMT_ISRC2_0                                                     0x561a
+#define mmDIG8_AFMT_ISRC2_0                                                     0x571a
+#define mmAFMT_ISRC2_1                                                          0x4a1b
+#define mmDIG0_AFMT_ISRC2_1                                                     0x4a1b
+#define mmDIG1_AFMT_ISRC2_1                                                     0x4b1b
+#define mmDIG2_AFMT_ISRC2_1                                                     0x4c1b
+#define mmDIG3_AFMT_ISRC2_1                                                     0x4d1b
+#define mmDIG4_AFMT_ISRC2_1                                                     0x4e1b
+#define mmDIG5_AFMT_ISRC2_1                                                     0x4f1b
+#define mmDIG6_AFMT_ISRC2_1                                                     0x541b
+#define mmDIG7_AFMT_ISRC2_1                                                     0x561b
+#define mmDIG8_AFMT_ISRC2_1                                                     0x571b
+#define mmAFMT_ISRC2_2                                                          0x4a1c
+#define mmDIG0_AFMT_ISRC2_2                                                     0x4a1c
+#define mmDIG1_AFMT_ISRC2_2                                                     0x4b1c
+#define mmDIG2_AFMT_ISRC2_2                                                     0x4c1c
+#define mmDIG3_AFMT_ISRC2_2                                                     0x4d1c
+#define mmDIG4_AFMT_ISRC2_2                                                     0x4e1c
+#define mmDIG5_AFMT_ISRC2_2                                                     0x4f1c
+#define mmDIG6_AFMT_ISRC2_2                                                     0x541c
+#define mmDIG7_AFMT_ISRC2_2                                                     0x561c
+#define mmDIG8_AFMT_ISRC2_2                                                     0x571c
+#define mmAFMT_ISRC2_3                                                          0x4a1d
+#define mmDIG0_AFMT_ISRC2_3                                                     0x4a1d
+#define mmDIG1_AFMT_ISRC2_3                                                     0x4b1d
+#define mmDIG2_AFMT_ISRC2_3                                                     0x4c1d
+#define mmDIG3_AFMT_ISRC2_3                                                     0x4d1d
+#define mmDIG4_AFMT_ISRC2_3                                                     0x4e1d
+#define mmDIG5_AFMT_ISRC2_3                                                     0x4f1d
+#define mmDIG6_AFMT_ISRC2_3                                                     0x541d
+#define mmDIG7_AFMT_ISRC2_3                                                     0x561d
+#define mmDIG8_AFMT_ISRC2_3                                                     0x571d
+#define mmAFMT_AVI_INFO0                                                        0x4a1e
+#define mmDIG0_AFMT_AVI_INFO0                                                   0x4a1e
+#define mmDIG1_AFMT_AVI_INFO0                                                   0x4b1e
+#define mmDIG2_AFMT_AVI_INFO0                                                   0x4c1e
+#define mmDIG3_AFMT_AVI_INFO0                                                   0x4d1e
+#define mmDIG4_AFMT_AVI_INFO0                                                   0x4e1e
+#define mmDIG5_AFMT_AVI_INFO0                                                   0x4f1e
+#define mmDIG6_AFMT_AVI_INFO0                                                   0x541e
+#define mmDIG7_AFMT_AVI_INFO0                                                   0x561e
+#define mmDIG8_AFMT_AVI_INFO0                                                   0x571e
+#define mmAFMT_AVI_INFO1                                                        0x4a1f
+#define mmDIG0_AFMT_AVI_INFO1                                                   0x4a1f
+#define mmDIG1_AFMT_AVI_INFO1                                                   0x4b1f
+#define mmDIG2_AFMT_AVI_INFO1                                                   0x4c1f
+#define mmDIG3_AFMT_AVI_INFO1                                                   0x4d1f
+#define mmDIG4_AFMT_AVI_INFO1                                                   0x4e1f
+#define mmDIG5_AFMT_AVI_INFO1                                                   0x4f1f
+#define mmDIG6_AFMT_AVI_INFO1                                                   0x541f
+#define mmDIG7_AFMT_AVI_INFO1                                                   0x561f
+#define mmDIG8_AFMT_AVI_INFO1                                                   0x571f
+#define mmAFMT_AVI_INFO2                                                        0x4a20
+#define mmDIG0_AFMT_AVI_INFO2                                                   0x4a20
+#define mmDIG1_AFMT_AVI_INFO2                                                   0x4b20
+#define mmDIG2_AFMT_AVI_INFO2                                                   0x4c20
+#define mmDIG3_AFMT_AVI_INFO2                                                   0x4d20
+#define mmDIG4_AFMT_AVI_INFO2                                                   0x4e20
+#define mmDIG5_AFMT_AVI_INFO2                                                   0x4f20
+#define mmDIG6_AFMT_AVI_INFO2                                                   0x5420
+#define mmDIG7_AFMT_AVI_INFO2                                                   0x5620
+#define mmDIG8_AFMT_AVI_INFO2                                                   0x5720
+#define mmAFMT_AVI_INFO3                                                        0x4a21
+#define mmDIG0_AFMT_AVI_INFO3                                                   0x4a21
+#define mmDIG1_AFMT_AVI_INFO3                                                   0x4b21
+#define mmDIG2_AFMT_AVI_INFO3                                                   0x4c21
+#define mmDIG3_AFMT_AVI_INFO3                                                   0x4d21
+#define mmDIG4_AFMT_AVI_INFO3                                                   0x4e21
+#define mmDIG5_AFMT_AVI_INFO3                                                   0x4f21
+#define mmDIG6_AFMT_AVI_INFO3                                                   0x5421
+#define mmDIG7_AFMT_AVI_INFO3                                                   0x5621
+#define mmDIG8_AFMT_AVI_INFO3                                                   0x5721
+#define mmAFMT_MPEG_INFO0                                                       0x4a22
+#define mmDIG0_AFMT_MPEG_INFO0                                                  0x4a22
+#define mmDIG1_AFMT_MPEG_INFO0                                                  0x4b22
+#define mmDIG2_AFMT_MPEG_INFO0                                                  0x4c22
+#define mmDIG3_AFMT_MPEG_INFO0                                                  0x4d22
+#define mmDIG4_AFMT_MPEG_INFO0                                                  0x4e22
+#define mmDIG5_AFMT_MPEG_INFO0                                                  0x4f22
+#define mmDIG6_AFMT_MPEG_INFO0                                                  0x5422
+#define mmDIG7_AFMT_MPEG_INFO0                                                  0x5622
+#define mmDIG8_AFMT_MPEG_INFO0                                                  0x5722
+#define mmAFMT_MPEG_INFO1                                                       0x4a23
+#define mmDIG0_AFMT_MPEG_INFO1                                                  0x4a23
+#define mmDIG1_AFMT_MPEG_INFO1                                                  0x4b23
+#define mmDIG2_AFMT_MPEG_INFO1                                                  0x4c23
+#define mmDIG3_AFMT_MPEG_INFO1                                                  0x4d23
+#define mmDIG4_AFMT_MPEG_INFO1                                                  0x4e23
+#define mmDIG5_AFMT_MPEG_INFO1                                                  0x4f23
+#define mmDIG6_AFMT_MPEG_INFO1                                                  0x5423
+#define mmDIG7_AFMT_MPEG_INFO1                                                  0x5623
+#define mmDIG8_AFMT_MPEG_INFO1                                                  0x5723
+#define mmAFMT_GENERIC_HDR                                                      0x4a24
+#define mmDIG0_AFMT_GENERIC_HDR                                                 0x4a24
+#define mmDIG1_AFMT_GENERIC_HDR                                                 0x4b24
+#define mmDIG2_AFMT_GENERIC_HDR                                                 0x4c24
+#define mmDIG3_AFMT_GENERIC_HDR                                                 0x4d24
+#define mmDIG4_AFMT_GENERIC_HDR                                                 0x4e24
+#define mmDIG5_AFMT_GENERIC_HDR                                                 0x4f24
+#define mmDIG6_AFMT_GENERIC_HDR                                                 0x5424
+#define mmDIG7_AFMT_GENERIC_HDR                                                 0x5624
+#define mmDIG8_AFMT_GENERIC_HDR                                                 0x5724
+#define mmAFMT_GENERIC_0                                                        0x4a25
+#define mmDIG0_AFMT_GENERIC_0                                                   0x4a25
+#define mmDIG1_AFMT_GENERIC_0                                                   0x4b25
+#define mmDIG2_AFMT_GENERIC_0                                                   0x4c25
+#define mmDIG3_AFMT_GENERIC_0                                                   0x4d25
+#define mmDIG4_AFMT_GENERIC_0                                                   0x4e25
+#define mmDIG5_AFMT_GENERIC_0                                                   0x4f25
+#define mmDIG6_AFMT_GENERIC_0                                                   0x5425
+#define mmDIG7_AFMT_GENERIC_0                                                   0x5625
+#define mmDIG8_AFMT_GENERIC_0                                                   0x5725
+#define mmAFMT_GENERIC_1                                                        0x4a26
+#define mmDIG0_AFMT_GENERIC_1                                                   0x4a26
+#define mmDIG1_AFMT_GENERIC_1                                                   0x4b26
+#define mmDIG2_AFMT_GENERIC_1                                                   0x4c26
+#define mmDIG3_AFMT_GENERIC_1                                                   0x4d26
+#define mmDIG4_AFMT_GENERIC_1                                                   0x4e26
+#define mmDIG5_AFMT_GENERIC_1                                                   0x4f26
+#define mmDIG6_AFMT_GENERIC_1                                                   0x5426
+#define mmDIG7_AFMT_GENERIC_1                                                   0x5626
+#define mmDIG8_AFMT_GENERIC_1                                                   0x5726
+#define mmAFMT_GENERIC_2                                                        0x4a27
+#define mmDIG0_AFMT_GENERIC_2                                                   0x4a27
+#define mmDIG1_AFMT_GENERIC_2                                                   0x4b27
+#define mmDIG2_AFMT_GENERIC_2                                                   0x4c27
+#define mmDIG3_AFMT_GENERIC_2                                                   0x4d27
+#define mmDIG4_AFMT_GENERIC_2                                                   0x4e27
+#define mmDIG5_AFMT_GENERIC_2                                                   0x4f27
+#define mmDIG6_AFMT_GENERIC_2                                                   0x5427
+#define mmDIG7_AFMT_GENERIC_2                                                   0x5627
+#define mmDIG8_AFMT_GENERIC_2                                                   0x5727
+#define mmAFMT_GENERIC_3                                                        0x4a28
+#define mmDIG0_AFMT_GENERIC_3                                                   0x4a28
+#define mmDIG1_AFMT_GENERIC_3                                                   0x4b28
+#define mmDIG2_AFMT_GENERIC_3                                                   0x4c28
+#define mmDIG3_AFMT_GENERIC_3                                                   0x4d28
+#define mmDIG4_AFMT_GENERIC_3                                                   0x4e28
+#define mmDIG5_AFMT_GENERIC_3                                                   0x4f28
+#define mmDIG6_AFMT_GENERIC_3                                                   0x5428
+#define mmDIG7_AFMT_GENERIC_3                                                   0x5628
+#define mmDIG8_AFMT_GENERIC_3                                                   0x5728
+#define mmAFMT_GENERIC_4                                                        0x4a29
+#define mmDIG0_AFMT_GENERIC_4                                                   0x4a29
+#define mmDIG1_AFMT_GENERIC_4                                                   0x4b29
+#define mmDIG2_AFMT_GENERIC_4                                                   0x4c29
+#define mmDIG3_AFMT_GENERIC_4                                                   0x4d29
+#define mmDIG4_AFMT_GENERIC_4                                                   0x4e29
+#define mmDIG5_AFMT_GENERIC_4                                                   0x4f29
+#define mmDIG6_AFMT_GENERIC_4                                                   0x5429
+#define mmDIG7_AFMT_GENERIC_4                                                   0x5629
+#define mmDIG8_AFMT_GENERIC_4                                                   0x5729
+#define mmAFMT_GENERIC_5                                                        0x4a2a
+#define mmDIG0_AFMT_GENERIC_5                                                   0x4a2a
+#define mmDIG1_AFMT_GENERIC_5                                                   0x4b2a
+#define mmDIG2_AFMT_GENERIC_5                                                   0x4c2a
+#define mmDIG3_AFMT_GENERIC_5                                                   0x4d2a
+#define mmDIG4_AFMT_GENERIC_5                                                   0x4e2a
+#define mmDIG5_AFMT_GENERIC_5                                                   0x4f2a
+#define mmDIG6_AFMT_GENERIC_5                                                   0x542a
+#define mmDIG7_AFMT_GENERIC_5                                                   0x562a
+#define mmDIG8_AFMT_GENERIC_5                                                   0x572a
+#define mmAFMT_GENERIC_6                                                        0x4a2b
+#define mmDIG0_AFMT_GENERIC_6                                                   0x4a2b
+#define mmDIG1_AFMT_GENERIC_6                                                   0x4b2b
+#define mmDIG2_AFMT_GENERIC_6                                                   0x4c2b
+#define mmDIG3_AFMT_GENERIC_6                                                   0x4d2b
+#define mmDIG4_AFMT_GENERIC_6                                                   0x4e2b
+#define mmDIG5_AFMT_GENERIC_6                                                   0x4f2b
+#define mmDIG6_AFMT_GENERIC_6                                                   0x542b
+#define mmDIG7_AFMT_GENERIC_6                                                   0x562b
+#define mmDIG8_AFMT_GENERIC_6                                                   0x572b
+#define mmAFMT_GENERIC_7                                                        0x4a2c
+#define mmDIG0_AFMT_GENERIC_7                                                   0x4a2c
+#define mmDIG1_AFMT_GENERIC_7                                                   0x4b2c
+#define mmDIG2_AFMT_GENERIC_7                                                   0x4c2c
+#define mmDIG3_AFMT_GENERIC_7                                                   0x4d2c
+#define mmDIG4_AFMT_GENERIC_7                                                   0x4e2c
+#define mmDIG5_AFMT_GENERIC_7                                                   0x4f2c
+#define mmDIG6_AFMT_GENERIC_7                                                   0x542c
+#define mmDIG7_AFMT_GENERIC_7                                                   0x562c
+#define mmDIG8_AFMT_GENERIC_7                                                   0x572c
+#define mmHDMI_GENERIC_PACKET_CONTROL1                                          0x4a2d
+#define mmDIG0_HDMI_GENERIC_PACKET_CONTROL1                                     0x4a2d
+#define mmDIG1_HDMI_GENERIC_PACKET_CONTROL1                                     0x4b2d
+#define mmDIG2_HDMI_GENERIC_PACKET_CONTROL1                                     0x4c2d
+#define mmDIG3_HDMI_GENERIC_PACKET_CONTROL1                                     0x4d2d
+#define mmDIG4_HDMI_GENERIC_PACKET_CONTROL1                                     0x4e2d
+#define mmDIG5_HDMI_GENERIC_PACKET_CONTROL1                                     0x4f2d
+#define mmDIG6_HDMI_GENERIC_PACKET_CONTROL1                                     0x542d
+#define mmDIG7_HDMI_GENERIC_PACKET_CONTROL1                                     0x562d
+#define mmDIG8_HDMI_GENERIC_PACKET_CONTROL1                                     0x572d
+#define mmHDMI_ACR_32_0                                                         0x4a2e
+#define mmDIG0_HDMI_ACR_32_0                                                    0x4a2e
+#define mmDIG1_HDMI_ACR_32_0                                                    0x4b2e
+#define mmDIG2_HDMI_ACR_32_0                                                    0x4c2e
+#define mmDIG3_HDMI_ACR_32_0                                                    0x4d2e
+#define mmDIG4_HDMI_ACR_32_0                                                    0x4e2e
+#define mmDIG5_HDMI_ACR_32_0                                                    0x4f2e
+#define mmDIG6_HDMI_ACR_32_0                                                    0x542e
+#define mmDIG7_HDMI_ACR_32_0                                                    0x562e
+#define mmDIG8_HDMI_ACR_32_0                                                    0x572e
+#define mmHDMI_ACR_32_1                                                         0x4a2f
+#define mmDIG0_HDMI_ACR_32_1                                                    0x4a2f
+#define mmDIG1_HDMI_ACR_32_1                                                    0x4b2f
+#define mmDIG2_HDMI_ACR_32_1                                                    0x4c2f
+#define mmDIG3_HDMI_ACR_32_1                                                    0x4d2f
+#define mmDIG4_HDMI_ACR_32_1                                                    0x4e2f
+#define mmDIG5_HDMI_ACR_32_1                                                    0x4f2f
+#define mmDIG6_HDMI_ACR_32_1                                                    0x542f
+#define mmDIG7_HDMI_ACR_32_1                                                    0x562f
+#define mmDIG8_HDMI_ACR_32_1                                                    0x572f
+#define mmHDMI_ACR_44_0                                                         0x4a30
+#define mmDIG0_HDMI_ACR_44_0                                                    0x4a30
+#define mmDIG1_HDMI_ACR_44_0                                                    0x4b30
+#define mmDIG2_HDMI_ACR_44_0                                                    0x4c30
+#define mmDIG3_HDMI_ACR_44_0                                                    0x4d30
+#define mmDIG4_HDMI_ACR_44_0                                                    0x4e30
+#define mmDIG5_HDMI_ACR_44_0                                                    0x4f30
+#define mmDIG6_HDMI_ACR_44_0                                                    0x5430
+#define mmDIG7_HDMI_ACR_44_0                                                    0x5630
+#define mmDIG8_HDMI_ACR_44_0                                                    0x5730
+#define mmHDMI_ACR_44_1                                                         0x4a31
+#define mmDIG0_HDMI_ACR_44_1                                                    0x4a31
+#define mmDIG1_HDMI_ACR_44_1                                                    0x4b31
+#define mmDIG2_HDMI_ACR_44_1                                                    0x4c31
+#define mmDIG3_HDMI_ACR_44_1                                                    0x4d31
+#define mmDIG4_HDMI_ACR_44_1                                                    0x4e31
+#define mmDIG5_HDMI_ACR_44_1                                                    0x4f31
+#define mmDIG6_HDMI_ACR_44_1                                                    0x5431
+#define mmDIG7_HDMI_ACR_44_1                                                    0x5631
+#define mmDIG8_HDMI_ACR_44_1                                                    0x5731
+#define mmHDMI_ACR_48_0                                                         0x4a32
+#define mmDIG0_HDMI_ACR_48_0                                                    0x4a32
+#define mmDIG1_HDMI_ACR_48_0                                                    0x4b32
+#define mmDIG2_HDMI_ACR_48_0                                                    0x4c32
+#define mmDIG3_HDMI_ACR_48_0                                                    0x4d32
+#define mmDIG4_HDMI_ACR_48_0                                                    0x4e32
+#define mmDIG5_HDMI_ACR_48_0                                                    0x4f32
+#define mmDIG6_HDMI_ACR_48_0                                                    0x5432
+#define mmDIG7_HDMI_ACR_48_0                                                    0x5632
+#define mmDIG8_HDMI_ACR_48_0                                                    0x5732
+#define mmHDMI_ACR_48_1                                                         0x4a33
+#define mmDIG0_HDMI_ACR_48_1                                                    0x4a33
+#define mmDIG1_HDMI_ACR_48_1                                                    0x4b33
+#define mmDIG2_HDMI_ACR_48_1                                                    0x4c33
+#define mmDIG3_HDMI_ACR_48_1                                                    0x4d33
+#define mmDIG4_HDMI_ACR_48_1                                                    0x4e33
+#define mmDIG5_HDMI_ACR_48_1                                                    0x4f33
+#define mmDIG6_HDMI_ACR_48_1                                                    0x5433
+#define mmDIG7_HDMI_ACR_48_1                                                    0x5633
+#define mmDIG8_HDMI_ACR_48_1                                                    0x5733
+#define mmHDMI_ACR_STATUS_0                                                     0x4a34
+#define mmDIG0_HDMI_ACR_STATUS_0                                                0x4a34
+#define mmDIG1_HDMI_ACR_STATUS_0                                                0x4b34
+#define mmDIG2_HDMI_ACR_STATUS_0                                                0x4c34
+#define mmDIG3_HDMI_ACR_STATUS_0                                                0x4d34
+#define mmDIG4_HDMI_ACR_STATUS_0                                                0x4e34
+#define mmDIG5_HDMI_ACR_STATUS_0                                                0x4f34
+#define mmDIG6_HDMI_ACR_STATUS_0                                                0x5434
+#define mmDIG7_HDMI_ACR_STATUS_0                                                0x5634
+#define mmDIG8_HDMI_ACR_STATUS_0                                                0x5734
+#define mmHDMI_ACR_STATUS_1                                                     0x4a35
+#define mmDIG0_HDMI_ACR_STATUS_1                                                0x4a35
+#define mmDIG1_HDMI_ACR_STATUS_1                                                0x4b35
+#define mmDIG2_HDMI_ACR_STATUS_1                                                0x4c35
+#define mmDIG3_HDMI_ACR_STATUS_1                                                0x4d35
+#define mmDIG4_HDMI_ACR_STATUS_1                                                0x4e35
+#define mmDIG5_HDMI_ACR_STATUS_1                                                0x4f35
+#define mmDIG6_HDMI_ACR_STATUS_1                                                0x5435
+#define mmDIG7_HDMI_ACR_STATUS_1                                                0x5635
+#define mmDIG8_HDMI_ACR_STATUS_1                                                0x5735
+#define mmAFMT_AUDIO_INFO0                                                      0x4a36
+#define mmDIG0_AFMT_AUDIO_INFO0                                                 0x4a36
+#define mmDIG1_AFMT_AUDIO_INFO0                                                 0x4b36
+#define mmDIG2_AFMT_AUDIO_INFO0                                                 0x4c36
+#define mmDIG3_AFMT_AUDIO_INFO0                                                 0x4d36
+#define mmDIG4_AFMT_AUDIO_INFO0                                                 0x4e36
+#define mmDIG5_AFMT_AUDIO_INFO0                                                 0x4f36
+#define mmDIG6_AFMT_AUDIO_INFO0                                                 0x5436
+#define mmDIG7_AFMT_AUDIO_INFO0                                                 0x5636
+#define mmDIG8_AFMT_AUDIO_INFO0                                                 0x5736
+#define mmAFMT_AUDIO_INFO1                                                      0x4a37
+#define mmDIG0_AFMT_AUDIO_INFO1                                                 0x4a37
+#define mmDIG1_AFMT_AUDIO_INFO1                                                 0x4b37
+#define mmDIG2_AFMT_AUDIO_INFO1                                                 0x4c37
+#define mmDIG3_AFMT_AUDIO_INFO1                                                 0x4d37
+#define mmDIG4_AFMT_AUDIO_INFO1                                                 0x4e37
+#define mmDIG5_AFMT_AUDIO_INFO1                                                 0x4f37
+#define mmDIG6_AFMT_AUDIO_INFO1                                                 0x5437
+#define mmDIG7_AFMT_AUDIO_INFO1                                                 0x5637
+#define mmDIG8_AFMT_AUDIO_INFO1                                                 0x5737
+#define mmAFMT_60958_0                                                          0x4a38
+#define mmDIG0_AFMT_60958_0                                                     0x4a38
+#define mmDIG1_AFMT_60958_0                                                     0x4b38
+#define mmDIG2_AFMT_60958_0                                                     0x4c38
+#define mmDIG3_AFMT_60958_0                                                     0x4d38
+#define mmDIG4_AFMT_60958_0                                                     0x4e38
+#define mmDIG5_AFMT_60958_0                                                     0x4f38
+#define mmDIG6_AFMT_60958_0                                                     0x5438
+#define mmDIG7_AFMT_60958_0                                                     0x5638
+#define mmDIG8_AFMT_60958_0                                                     0x5738
+#define mmAFMT_60958_1                                                          0x4a39
+#define mmDIG0_AFMT_60958_1                                                     0x4a39
+#define mmDIG1_AFMT_60958_1                                                     0x4b39
+#define mmDIG2_AFMT_60958_1                                                     0x4c39
+#define mmDIG3_AFMT_60958_1                                                     0x4d39
+#define mmDIG4_AFMT_60958_1                                                     0x4e39
+#define mmDIG5_AFMT_60958_1                                                     0x4f39
+#define mmDIG6_AFMT_60958_1                                                     0x5439
+#define mmDIG7_AFMT_60958_1                                                     0x5639
+#define mmDIG8_AFMT_60958_1                                                     0x5739
+#define mmAFMT_AUDIO_CRC_CONTROL                                                0x4a3a
+#define mmDIG0_AFMT_AUDIO_CRC_CONTROL                                           0x4a3a
+#define mmDIG1_AFMT_AUDIO_CRC_CONTROL                                           0x4b3a
+#define mmDIG2_AFMT_AUDIO_CRC_CONTROL                                           0x4c3a
+#define mmDIG3_AFMT_AUDIO_CRC_CONTROL                                           0x4d3a
+#define mmDIG4_AFMT_AUDIO_CRC_CONTROL                                           0x4e3a
+#define mmDIG5_AFMT_AUDIO_CRC_CONTROL                                           0x4f3a
+#define mmDIG6_AFMT_AUDIO_CRC_CONTROL                                           0x543a
+#define mmDIG7_AFMT_AUDIO_CRC_CONTROL                                           0x563a
+#define mmDIG8_AFMT_AUDIO_CRC_CONTROL                                           0x573a
+#define mmAFMT_RAMP_CONTROL0                                                    0x4a3b
+#define mmDIG0_AFMT_RAMP_CONTROL0                                               0x4a3b
+#define mmDIG1_AFMT_RAMP_CONTROL0                                               0x4b3b
+#define mmDIG2_AFMT_RAMP_CONTROL0                                               0x4c3b
+#define mmDIG3_AFMT_RAMP_CONTROL0                                               0x4d3b
+#define mmDIG4_AFMT_RAMP_CONTROL0                                               0x4e3b
+#define mmDIG5_AFMT_RAMP_CONTROL0                                               0x4f3b
+#define mmDIG6_AFMT_RAMP_CONTROL0                                               0x543b
+#define mmDIG7_AFMT_RAMP_CONTROL0                                               0x563b
+#define mmDIG8_AFMT_RAMP_CONTROL0                                               0x573b
+#define mmAFMT_RAMP_CONTROL1                                                    0x4a3c
+#define mmDIG0_AFMT_RAMP_CONTROL1                                               0x4a3c
+#define mmDIG1_AFMT_RAMP_CONTROL1                                               0x4b3c
+#define mmDIG2_AFMT_RAMP_CONTROL1                                               0x4c3c
+#define mmDIG3_AFMT_RAMP_CONTROL1                                               0x4d3c
+#define mmDIG4_AFMT_RAMP_CONTROL1                                               0x4e3c
+#define mmDIG5_AFMT_RAMP_CONTROL1                                               0x4f3c
+#define mmDIG6_AFMT_RAMP_CONTROL1                                               0x543c
+#define mmDIG7_AFMT_RAMP_CONTROL1                                               0x563c
+#define mmDIG8_AFMT_RAMP_CONTROL1                                               0x573c
+#define mmAFMT_RAMP_CONTROL2                                                    0x4a3d
+#define mmDIG0_AFMT_RAMP_CONTROL2                                               0x4a3d
+#define mmDIG1_AFMT_RAMP_CONTROL2                                               0x4b3d
+#define mmDIG2_AFMT_RAMP_CONTROL2                                               0x4c3d
+#define mmDIG3_AFMT_RAMP_CONTROL2                                               0x4d3d
+#define mmDIG4_AFMT_RAMP_CONTROL2                                               0x4e3d
+#define mmDIG5_AFMT_RAMP_CONTROL2                                               0x4f3d
+#define mmDIG6_AFMT_RAMP_CONTROL2                                               0x543d
+#define mmDIG7_AFMT_RAMP_CONTROL2                                               0x563d
+#define mmDIG8_AFMT_RAMP_CONTROL2                                               0x573d
+#define mmAFMT_RAMP_CONTROL3                                                    0x4a3e
+#define mmDIG0_AFMT_RAMP_CONTROL3                                               0x4a3e
+#define mmDIG1_AFMT_RAMP_CONTROL3                                               0x4b3e
+#define mmDIG2_AFMT_RAMP_CONTROL3                                               0x4c3e
+#define mmDIG3_AFMT_RAMP_CONTROL3                                               0x4d3e
+#define mmDIG4_AFMT_RAMP_CONTROL3                                               0x4e3e
+#define mmDIG5_AFMT_RAMP_CONTROL3                                               0x4f3e
+#define mmDIG6_AFMT_RAMP_CONTROL3                                               0x543e
+#define mmDIG7_AFMT_RAMP_CONTROL3                                               0x563e
+#define mmDIG8_AFMT_RAMP_CONTROL3                                               0x573e
+#define mmAFMT_60958_2                                                          0x4a3f
+#define mmDIG0_AFMT_60958_2                                                     0x4a3f
+#define mmDIG1_AFMT_60958_2                                                     0x4b3f
+#define mmDIG2_AFMT_60958_2                                                     0x4c3f
+#define mmDIG3_AFMT_60958_2                                                     0x4d3f
+#define mmDIG4_AFMT_60958_2                                                     0x4e3f
+#define mmDIG5_AFMT_60958_2                                                     0x4f3f
+#define mmDIG6_AFMT_60958_2                                                     0x543f
+#define mmDIG7_AFMT_60958_2                                                     0x563f
+#define mmDIG8_AFMT_60958_2                                                     0x573f
+#define mmAFMT_AUDIO_CRC_RESULT                                                 0x4a40
+#define mmDIG0_AFMT_AUDIO_CRC_RESULT                                            0x4a40
+#define mmDIG1_AFMT_AUDIO_CRC_RESULT                                            0x4b40
+#define mmDIG2_AFMT_AUDIO_CRC_RESULT                                            0x4c40
+#define mmDIG3_AFMT_AUDIO_CRC_RESULT                                            0x4d40
+#define mmDIG4_AFMT_AUDIO_CRC_RESULT                                            0x4e40
+#define mmDIG5_AFMT_AUDIO_CRC_RESULT                                            0x4f40
+#define mmDIG6_AFMT_AUDIO_CRC_RESULT                                            0x5440
+#define mmDIG7_AFMT_AUDIO_CRC_RESULT                                            0x5640
+#define mmDIG8_AFMT_AUDIO_CRC_RESULT                                            0x5740
+#define mmAFMT_STATUS                                                           0x4a41
+#define mmDIG0_AFMT_STATUS                                                      0x4a41
+#define mmDIG1_AFMT_STATUS                                                      0x4b41
+#define mmDIG2_AFMT_STATUS                                                      0x4c41
+#define mmDIG3_AFMT_STATUS                                                      0x4d41
+#define mmDIG4_AFMT_STATUS                                                      0x4e41
+#define mmDIG5_AFMT_STATUS                                                      0x4f41
+#define mmDIG6_AFMT_STATUS                                                      0x5441
+#define mmDIG7_AFMT_STATUS                                                      0x5641
+#define mmDIG8_AFMT_STATUS                                                      0x5741
+#define mmAFMT_AUDIO_PACKET_CONTROL                                             0x4a42
+#define mmDIG0_AFMT_AUDIO_PACKET_CONTROL                                        0x4a42
+#define mmDIG1_AFMT_AUDIO_PACKET_CONTROL                                        0x4b42
+#define mmDIG2_AFMT_AUDIO_PACKET_CONTROL                                        0x4c42
+#define mmDIG3_AFMT_AUDIO_PACKET_CONTROL                                        0x4d42
+#define mmDIG4_AFMT_AUDIO_PACKET_CONTROL                                        0x4e42
+#define mmDIG5_AFMT_AUDIO_PACKET_CONTROL                                        0x4f42
+#define mmDIG6_AFMT_AUDIO_PACKET_CONTROL                                        0x5442
+#define mmDIG7_AFMT_AUDIO_PACKET_CONTROL                                        0x5642
+#define mmDIG8_AFMT_AUDIO_PACKET_CONTROL                                        0x5742
+#define mmAFMT_VBI_PACKET_CONTROL                                               0x4a43
+#define mmDIG0_AFMT_VBI_PACKET_CONTROL                                          0x4a43
+#define mmDIG1_AFMT_VBI_PACKET_CONTROL                                          0x4b43
+#define mmDIG2_AFMT_VBI_PACKET_CONTROL                                          0x4c43
+#define mmDIG3_AFMT_VBI_PACKET_CONTROL                                          0x4d43
+#define mmDIG4_AFMT_VBI_PACKET_CONTROL                                          0x4e43
+#define mmDIG5_AFMT_VBI_PACKET_CONTROL                                          0x4f43
+#define mmDIG6_AFMT_VBI_PACKET_CONTROL                                          0x5443
+#define mmDIG7_AFMT_VBI_PACKET_CONTROL                                          0x5643
+#define mmDIG8_AFMT_VBI_PACKET_CONTROL                                          0x5743
+#define mmAFMT_INFOFRAME_CONTROL0                                               0x4a44
+#define mmDIG0_AFMT_INFOFRAME_CONTROL0                                          0x4a44
+#define mmDIG1_AFMT_INFOFRAME_CONTROL0                                          0x4b44
+#define mmDIG2_AFMT_INFOFRAME_CONTROL0                                          0x4c44
+#define mmDIG3_AFMT_INFOFRAME_CONTROL0                                          0x4d44
+#define mmDIG4_AFMT_INFOFRAME_CONTROL0                                          0x4e44
+#define mmDIG5_AFMT_INFOFRAME_CONTROL0                                          0x4f44
+#define mmDIG6_AFMT_INFOFRAME_CONTROL0                                          0x5444
+#define mmDIG7_AFMT_INFOFRAME_CONTROL0                                          0x5644
+#define mmDIG8_AFMT_INFOFRAME_CONTROL0                                          0x5744
+#define mmAFMT_AUDIO_SRC_CONTROL                                                0x4a45
+#define mmDIG0_AFMT_AUDIO_SRC_CONTROL                                           0x4a45
+#define mmDIG1_AFMT_AUDIO_SRC_CONTROL                                           0x4b45
+#define mmDIG2_AFMT_AUDIO_SRC_CONTROL                                           0x4c45
+#define mmDIG3_AFMT_AUDIO_SRC_CONTROL                                           0x4d45
+#define mmDIG4_AFMT_AUDIO_SRC_CONTROL                                           0x4e45
+#define mmDIG5_AFMT_AUDIO_SRC_CONTROL                                           0x4f45
+#define mmDIG6_AFMT_AUDIO_SRC_CONTROL                                           0x5445
+#define mmDIG7_AFMT_AUDIO_SRC_CONTROL                                           0x5645
+#define mmDIG8_AFMT_AUDIO_SRC_CONTROL                                           0x5745
+#define mmAFMT_AUDIO_DBG_DTO_CNTL                                               0x4a46
+#define mmDIG0_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4a46
+#define mmDIG1_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4b46
+#define mmDIG2_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4c46
+#define mmDIG3_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4d46
+#define mmDIG4_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4e46
+#define mmDIG5_AFMT_AUDIO_DBG_DTO_CNTL                                          0x4f46
+#define mmDIG6_AFMT_AUDIO_DBG_DTO_CNTL                                          0x5446
+#define mmDIG7_AFMT_AUDIO_DBG_DTO_CNTL                                          0x5646
+#define mmDIG8_AFMT_AUDIO_DBG_DTO_CNTL                                          0x5746
+#define mmAFMT_CNTL                                                             0x4a7e
+#define mmDIG0_AFMT_CNTL                                                        0x4a7e
+#define mmDIG1_AFMT_CNTL                                                        0x4b7e
+#define mmDIG2_AFMT_CNTL                                                        0x4c7e
+#define mmDIG3_AFMT_CNTL                                                        0x4d7e
+#define mmDIG4_AFMT_CNTL                                                        0x4e7e
+#define mmDIG5_AFMT_CNTL                                                        0x4f7e
+#define mmDIG6_AFMT_CNTL                                                        0x547e
+#define mmDIG7_AFMT_CNTL                                                        0x567e
+#define mmDIG8_AFMT_CNTL                                                        0x577e
+#define mmDIG_BE_CNTL                                                           0x4a47
+#define mmDIG0_DIG_BE_CNTL                                                      0x4a47
+#define mmDIG1_DIG_BE_CNTL                                                      0x4b47
+#define mmDIG2_DIG_BE_CNTL                                                      0x4c47
+#define mmDIG3_DIG_BE_CNTL                                                      0x4d47
+#define mmDIG4_DIG_BE_CNTL                                                      0x4e47
+#define mmDIG5_DIG_BE_CNTL                                                      0x4f47
+#define mmDIG6_DIG_BE_CNTL                                                      0x5447
+#define mmDIG7_DIG_BE_CNTL                                                      0x5647
+#define mmDIG8_DIG_BE_CNTL                                                      0x5747
+#define mmDIG_BE_EN_CNTL                                                        0x4a48
+#define mmDIG0_DIG_BE_EN_CNTL                                                   0x4a48
+#define mmDIG1_DIG_BE_EN_CNTL                                                   0x4b48
+#define mmDIG2_DIG_BE_EN_CNTL                                                   0x4c48
+#define mmDIG3_DIG_BE_EN_CNTL                                                   0x4d48
+#define mmDIG4_DIG_BE_EN_CNTL                                                   0x4e48
+#define mmDIG5_DIG_BE_EN_CNTL                                                   0x4f48
+#define mmDIG6_DIG_BE_EN_CNTL                                                   0x5448
+#define mmDIG7_DIG_BE_EN_CNTL                                                   0x5648
+#define mmDIG8_DIG_BE_EN_CNTL                                                   0x5748
+#define mmTMDS_CNTL                                                             0x4a6b
+#define mmDIG0_TMDS_CNTL                                                        0x4a6b
+#define mmDIG1_TMDS_CNTL                                                        0x4b6b
+#define mmDIG2_TMDS_CNTL                                                        0x4c6b
+#define mmDIG3_TMDS_CNTL                                                        0x4d6b
+#define mmDIG4_TMDS_CNTL                                                        0x4e6b
+#define mmDIG5_TMDS_CNTL                                                        0x4f6b
+#define mmDIG6_TMDS_CNTL                                                        0x546b
+#define mmDIG7_TMDS_CNTL                                                        0x566b
+#define mmDIG8_TMDS_CNTL                                                        0x576b
+#define mmTMDS_CONTROL_CHAR                                                     0x4a6c
+#define mmDIG0_TMDS_CONTROL_CHAR                                                0x4a6c
+#define mmDIG1_TMDS_CONTROL_CHAR                                                0x4b6c
+#define mmDIG2_TMDS_CONTROL_CHAR                                                0x4c6c
+#define mmDIG3_TMDS_CONTROL_CHAR                                                0x4d6c
+#define mmDIG4_TMDS_CONTROL_CHAR                                                0x4e6c
+#define mmDIG5_TMDS_CONTROL_CHAR                                                0x4f6c
+#define mmDIG6_TMDS_CONTROL_CHAR                                                0x546c
+#define mmDIG7_TMDS_CONTROL_CHAR                                                0x566c
+#define mmDIG8_TMDS_CONTROL_CHAR                                                0x576c
+#define mmTMDS_CONTROL0_FEEDBACK                                                0x4a6d
+#define mmDIG0_TMDS_CONTROL0_FEEDBACK                                           0x4a6d
+#define mmDIG1_TMDS_CONTROL0_FEEDBACK                                           0x4b6d
+#define mmDIG2_TMDS_CONTROL0_FEEDBACK                                           0x4c6d
+#define mmDIG3_TMDS_CONTROL0_FEEDBACK                                           0x4d6d
+#define mmDIG4_TMDS_CONTROL0_FEEDBACK                                           0x4e6d
+#define mmDIG5_TMDS_CONTROL0_FEEDBACK                                           0x4f6d
+#define mmDIG6_TMDS_CONTROL0_FEEDBACK                                           0x546d
+#define mmDIG7_TMDS_CONTROL0_FEEDBACK                                           0x566d
+#define mmDIG8_TMDS_CONTROL0_FEEDBACK                                           0x576d
+#define mmTMDS_STEREOSYNC_CTL_SEL                                               0x4a6e
+#define mmDIG0_TMDS_STEREOSYNC_CTL_SEL                                          0x4a6e
+#define mmDIG1_TMDS_STEREOSYNC_CTL_SEL                                          0x4b6e
+#define mmDIG2_TMDS_STEREOSYNC_CTL_SEL                                          0x4c6e
+#define mmDIG3_TMDS_STEREOSYNC_CTL_SEL                                          0x4d6e
+#define mmDIG4_TMDS_STEREOSYNC_CTL_SEL                                          0x4e6e
+#define mmDIG5_TMDS_STEREOSYNC_CTL_SEL                                          0x4f6e
+#define mmDIG6_TMDS_STEREOSYNC_CTL_SEL                                          0x546e
+#define mmDIG7_TMDS_STEREOSYNC_CTL_SEL                                          0x566e
+#define mmDIG8_TMDS_STEREOSYNC_CTL_SEL                                          0x576e
+#define mmTMDS_SYNC_CHAR_PATTERN_0_1                                            0x4a6f
+#define mmDIG0_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4a6f
+#define mmDIG1_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4b6f
+#define mmDIG2_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4c6f
+#define mmDIG3_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4d6f
+#define mmDIG4_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4e6f
+#define mmDIG5_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x4f6f
+#define mmDIG6_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x546f
+#define mmDIG7_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x566f
+#define mmDIG8_TMDS_SYNC_CHAR_PATTERN_0_1                                       0x576f
+#define mmTMDS_SYNC_CHAR_PATTERN_2_3                                            0x4a70
+#define mmDIG0_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4a70
+#define mmDIG1_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4b70
+#define mmDIG2_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4c70
+#define mmDIG3_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4d70
+#define mmDIG4_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4e70
+#define mmDIG5_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x4f70
+#define mmDIG6_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x5470
+#define mmDIG7_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x5670
+#define mmDIG8_TMDS_SYNC_CHAR_PATTERN_2_3                                       0x5770
+#define mmTMDS_DEBUG                                                            0x4a71
+#define mmDIG0_TMDS_DEBUG                                                       0x4a71
+#define mmDIG1_TMDS_DEBUG                                                       0x4b71
+#define mmDIG2_TMDS_DEBUG                                                       0x4c71
+#define mmDIG3_TMDS_DEBUG                                                       0x4d71
+#define mmDIG4_TMDS_DEBUG                                                       0x4e71
+#define mmDIG5_TMDS_DEBUG                                                       0x4f71
+#define mmDIG6_TMDS_DEBUG                                                       0x5471
+#define mmDIG7_TMDS_DEBUG                                                       0x5671
+#define mmDIG8_TMDS_DEBUG                                                       0x5771
+#define mmTMDS_CTL_BITS                                                         0x4a72
+#define mmDIG0_TMDS_CTL_BITS                                                    0x4a72
+#define mmDIG1_TMDS_CTL_BITS                                                    0x4b72
+#define mmDIG2_TMDS_CTL_BITS                                                    0x4c72
+#define mmDIG3_TMDS_CTL_BITS                                                    0x4d72
+#define mmDIG4_TMDS_CTL_BITS                                                    0x4e72
+#define mmDIG5_TMDS_CTL_BITS                                                    0x4f72
+#define mmDIG6_TMDS_CTL_BITS                                                    0x5472
+#define mmDIG7_TMDS_CTL_BITS                                                    0x5672
+#define mmDIG8_TMDS_CTL_BITS                                                    0x5772
+#define mmTMDS_DCBALANCER_CONTROL                                               0x4a73
+#define mmDIG0_TMDS_DCBALANCER_CONTROL                                          0x4a73
+#define mmDIG1_TMDS_DCBALANCER_CONTROL                                          0x4b73
+#define mmDIG2_TMDS_DCBALANCER_CONTROL                                          0x4c73
+#define mmDIG3_TMDS_DCBALANCER_CONTROL                                          0x4d73
+#define mmDIG4_TMDS_DCBALANCER_CONTROL                                          0x4e73
+#define mmDIG5_TMDS_DCBALANCER_CONTROL                                          0x4f73
+#define mmDIG6_TMDS_DCBALANCER_CONTROL                                          0x5473
+#define mmDIG7_TMDS_DCBALANCER_CONTROL                                          0x5673
+#define mmDIG8_TMDS_DCBALANCER_CONTROL                                          0x5773
+#define mmTMDS_CTL0_1_GEN_CNTL                                                  0x4a75
+#define mmDIG0_TMDS_CTL0_1_GEN_CNTL                                             0x4a75
+#define mmDIG1_TMDS_CTL0_1_GEN_CNTL                                             0x4b75
+#define mmDIG2_TMDS_CTL0_1_GEN_CNTL                                             0x4c75
+#define mmDIG3_TMDS_CTL0_1_GEN_CNTL                                             0x4d75
+#define mmDIG4_TMDS_CTL0_1_GEN_CNTL                                             0x4e75
+#define mmDIG5_TMDS_CTL0_1_GEN_CNTL                                             0x4f75
+#define mmDIG6_TMDS_CTL0_1_GEN_CNTL                                             0x5475
+#define mmDIG7_TMDS_CTL0_1_GEN_CNTL                                             0x5675
+#define mmDIG8_TMDS_CTL0_1_GEN_CNTL                                             0x5775
+#define mmTMDS_CTL2_3_GEN_CNTL                                                  0x4a76
+#define mmDIG0_TMDS_CTL2_3_GEN_CNTL                                             0x4a76
+#define mmDIG1_TMDS_CTL2_3_GEN_CNTL                                             0x4b76
+#define mmDIG2_TMDS_CTL2_3_GEN_CNTL                                             0x4c76
+#define mmDIG3_TMDS_CTL2_3_GEN_CNTL                                             0x4d76
+#define mmDIG4_TMDS_CTL2_3_GEN_CNTL                                             0x4e76
+#define mmDIG5_TMDS_CTL2_3_GEN_CNTL                                             0x4f76
+#define mmDIG6_TMDS_CTL2_3_GEN_CNTL                                             0x5476
+#define mmDIG7_TMDS_CTL2_3_GEN_CNTL                                             0x5676
+#define mmDIG8_TMDS_CTL2_3_GEN_CNTL                                             0x5776
+#define mmDIG_VERSION                                                           0x4a78
+#define mmDIG0_DIG_VERSION                                                      0x4a78
+#define mmDIG1_DIG_VERSION                                                      0x4b78
+#define mmDIG2_DIG_VERSION                                                      0x4c78
+#define mmDIG3_DIG_VERSION                                                      0x4d78
+#define mmDIG4_DIG_VERSION                                                      0x4e78
+#define mmDIG5_DIG_VERSION                                                      0x4f78
+#define mmDIG6_DIG_VERSION                                                      0x5478
+#define mmDIG7_DIG_VERSION                                                      0x5678
+#define mmDIG8_DIG_VERSION                                                      0x5778
+#define mmDIG_LANE_ENABLE                                                       0x4a79
+#define mmDIG0_DIG_LANE_ENABLE                                                  0x4a79
+#define mmDIG1_DIG_LANE_ENABLE                                                  0x4b79
+#define mmDIG2_DIG_LANE_ENABLE                                                  0x4c79
+#define mmDIG3_DIG_LANE_ENABLE                                                  0x4d79
+#define mmDIG4_DIG_LANE_ENABLE                                                  0x4e79
+#define mmDIG5_DIG_LANE_ENABLE                                                  0x4f79
+#define mmDIG6_DIG_LANE_ENABLE                                                  0x5479
+#define mmDIG7_DIG_LANE_ENABLE                                                  0x5679
+#define mmDIG8_DIG_LANE_ENABLE                                                  0x5779
+#define mmDIG_TEST_DEBUG_INDEX                                                  0x4a7a
+#define mmDIG0_DIG_TEST_DEBUG_INDEX                                             0x4a7a
+#define mmDIG1_DIG_TEST_DEBUG_INDEX                                             0x4b7a
+#define mmDIG2_DIG_TEST_DEBUG_INDEX                                             0x4c7a
+#define mmDIG3_DIG_TEST_DEBUG_INDEX                                             0x4d7a
+#define mmDIG4_DIG_TEST_DEBUG_INDEX                                             0x4e7a
+#define mmDIG5_DIG_TEST_DEBUG_INDEX                                             0x4f7a
+#define mmDIG6_DIG_TEST_DEBUG_INDEX                                             0x547a
+#define mmDIG7_DIG_TEST_DEBUG_INDEX                                             0x567a
+#define mmDIG8_DIG_TEST_DEBUG_INDEX                                             0x577a
+#define mmDIG_TEST_DEBUG_DATA                                                   0x4a7b
+#define mmDIG0_DIG_TEST_DEBUG_DATA                                              0x4a7b
+#define mmDIG1_DIG_TEST_DEBUG_DATA                                              0x4b7b
+#define mmDIG2_DIG_TEST_DEBUG_DATA                                              0x4c7b
+#define mmDIG3_DIG_TEST_DEBUG_DATA                                              0x4d7b
+#define mmDIG4_DIG_TEST_DEBUG_DATA                                              0x4e7b
+#define mmDIG5_DIG_TEST_DEBUG_DATA                                              0x4f7b
+#define mmDIG6_DIG_TEST_DEBUG_DATA                                              0x547b
+#define mmDIG7_DIG_TEST_DEBUG_DATA                                              0x567b
+#define mmDIG8_DIG_TEST_DEBUG_DATA                                              0x577b
+#define mmDIG_FE_TEST_DEBUG_INDEX                                               0x4a7c
+#define mmDIG0_DIG_FE_TEST_DEBUG_INDEX                                          0x4a7c
+#define mmDIG1_DIG_FE_TEST_DEBUG_INDEX                                          0x4b7c
+#define mmDIG2_DIG_FE_TEST_DEBUG_INDEX                                          0x4c7c
+#define mmDIG3_DIG_FE_TEST_DEBUG_INDEX                                          0x4d7c
+#define mmDIG4_DIG_FE_TEST_DEBUG_INDEX                                          0x4e7c
+#define mmDIG5_DIG_FE_TEST_DEBUG_INDEX                                          0x4f7c
+#define mmDIG6_DIG_FE_TEST_DEBUG_INDEX                                          0x547c
+#define mmDIG7_DIG_FE_TEST_DEBUG_INDEX                                          0x567c
+#define mmDIG8_DIG_FE_TEST_DEBUG_INDEX                                          0x577c
+#define mmDIG_FE_TEST_DEBUG_DATA                                                0x4a7d
+#define mmDIG0_DIG_FE_TEST_DEBUG_DATA                                           0x4a7d
+#define mmDIG1_DIG_FE_TEST_DEBUG_DATA                                           0x4b7d
+#define mmDIG2_DIG_FE_TEST_DEBUG_DATA                                           0x4c7d
+#define mmDIG3_DIG_FE_TEST_DEBUG_DATA                                           0x4d7d
+#define mmDIG4_DIG_FE_TEST_DEBUG_DATA                                           0x4e7d
+#define mmDIG5_DIG_FE_TEST_DEBUG_DATA                                           0x4f7d
+#define mmDIG6_DIG_FE_TEST_DEBUG_DATA                                           0x547d
+#define mmDIG7_DIG_FE_TEST_DEBUG_DATA                                           0x567d
+#define mmDIG8_DIG_FE_TEST_DEBUG_DATA                                           0x577d
+#define mmDMCU_CTRL                                                             0x1600
+#define mmDMCU_STATUS                                                           0x1601
+#define mmDMCU_PC_START_ADDR                                                    0x1602
+#define mmDMCU_FW_START_ADDR                                                    0x1603
+#define mmDMCU_FW_END_ADDR                                                      0x1604
+#define mmDMCU_FW_ISR_START_ADDR                                                0x1605
+#define mmDMCU_FW_CS_HI                                                         0x1606
+#define mmDMCU_FW_CS_LO                                                         0x1607
+#define mmDMCU_RAM_ACCESS_CTRL                                                  0x1608
+#define mmDMCU_ERAM_WR_CTRL                                                     0x1609
+#define mmDMCU_ERAM_WR_DATA                                                     0x160a
+#define mmDMCU_ERAM_RD_CTRL                                                     0x160b
+#define mmDMCU_ERAM_RD_DATA                                                     0x160c
+#define mmDMCU_IRAM_WR_CTRL                                                     0x160d
+#define mmDMCU_IRAM_WR_DATA                                                     0x160e
+#define mmDMCU_IRAM_RD_CTRL                                                     0x160f
+#define mmDMCU_IRAM_RD_DATA                                                     0x1610
+#define mmDMCU_EVENT_TRIGGER                                                    0x1611
+#define mmDMCU_UC_INTERNAL_INT_STATUS                                           0x1612
+#define mmDMCU_SS_INTERRUPT_CNTL_STATUS                                         0x1613
+#define mmDMCU_INTERRUPT_STATUS                                                 0x1614
+#define mmDMCU_INTERRUPT_STATUS_1                                               0x1633
+#define mmDMCU_INTERRUPT_TO_HOST_EN_MASK                                        0x1615
+#define mmDMCU_INTERRUPT_TO_UC_EN_MASK                                          0x1616
+#define mmDMCU_INTERRUPT_TO_UC_EN_MASK_1                                        0x1631
+#define mmDMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL                                     0x1617
+#define mmDMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1                                   0x1632
+#define mmDC_DMCU_SCRATCH                                                       0x1618
+#define mmDMCU_INT_CNT                                                          0x1619
+#define mmDMCU_FW_CHECKSUM_SMPL_BYTE_POS                                        0x161a
+#define mmDMCU_UC_CLK_GATING_CNTL                                               0x161b
+#define mmMASTER_COMM_DATA_REG1                                                 0x161c
+#define mmMASTER_COMM_DATA_REG2                                                 0x161d
+#define mmMASTER_COMM_DATA_REG3                                                 0x161e
+#define mmMASTER_COMM_CMD_REG                                                   0x161f
+#define mmMASTER_COMM_CNTL_REG                                                  0x1620
+#define mmSLAVE_COMM_DATA_REG1                                                  0x1621
+#define mmSLAVE_COMM_DATA_REG2                                                  0x1622
+#define mmSLAVE_COMM_DATA_REG3                                                  0x1623
+#define mmSLAVE_COMM_CMD_REG                                                    0x1624
+#define mmSLAVE_COMM_CNTL_REG                                                   0x1625
+#define mmDMCU_TEST_DEBUG_INDEX                                                 0x1626
+#define mmDMCU_TEST_DEBUG_DATA                                                  0x1627
+#define mmDMCU_PERFMON_INTERRUPT_STATUS1                                        0x1644
+#define mmDMCU_PERFMON_INTERRUPT_STATUS2                                        0x1645
+#define mmDMCU_PERFMON_INTERRUPT_STATUS3                                        0x1646
+#define mmDMCU_PERFMON_INTERRUPT_STATUS4                                        0x1647
+#define mmDMCU_PERFMON_INTERRUPT_STATUS5                                        0x1642
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1                                 0x1674
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2                                 0x1675
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3                                 0x1676
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4                                 0x1677
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5                                 0x1643
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1                            0x1678
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2                            0x1679
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3                            0x167a
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4                            0x167b
+#define mmDMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5                            0x1673
+#define mmDMCU_DPRX_INTERRUPT_STATUS1                                           0x1634
+#define mmDMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1                                    0x1635
+#define mmDMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1                               0x1636
+#define mmDP_LINK_CNTL                                                          0x4aa0
+#define mmDP0_DP_LINK_CNTL                                                      0x4aa0
+#define mmDP1_DP_LINK_CNTL                                                      0x4ba0
+#define mmDP2_DP_LINK_CNTL                                                      0x4ca0
+#define mmDP3_DP_LINK_CNTL                                                      0x4da0
+#define mmDP4_DP_LINK_CNTL                                                      0x4ea0
+#define mmDP5_DP_LINK_CNTL                                                      0x4fa0
+#define mmDP6_DP_LINK_CNTL                                                      0x54a0
+#define mmDP7_DP_LINK_CNTL                                                      0x56a0
+#define mmDP8_DP_LINK_CNTL                                                      0x57a0
+#define mmDP_PIXEL_FORMAT                                                       0x4aa1
+#define mmDP0_DP_PIXEL_FORMAT                                                   0x4aa1
+#define mmDP1_DP_PIXEL_FORMAT                                                   0x4ba1
+#define mmDP2_DP_PIXEL_FORMAT                                                   0x4ca1
+#define mmDP3_DP_PIXEL_FORMAT                                                   0x4da1
+#define mmDP4_DP_PIXEL_FORMAT                                                   0x4ea1
+#define mmDP5_DP_PIXEL_FORMAT                                                   0x4fa1
+#define mmDP6_DP_PIXEL_FORMAT                                                   0x54a1
+#define mmDP7_DP_PIXEL_FORMAT                                                   0x56a1
+#define mmDP8_DP_PIXEL_FORMAT                                                   0x57a1
+#define mmDP_MSA_COLORIMETRY                                                    0x4aa2
+#define mmDP0_DP_MSA_COLORIMETRY                                                0x4aa2
+#define mmDP1_DP_MSA_COLORIMETRY                                                0x4ba2
+#define mmDP2_DP_MSA_COLORIMETRY                                                0x4ca2
+#define mmDP3_DP_MSA_COLORIMETRY                                                0x4da2
+#define mmDP4_DP_MSA_COLORIMETRY                                                0x4ea2
+#define mmDP5_DP_MSA_COLORIMETRY                                                0x4fa2
+#define mmDP6_DP_MSA_COLORIMETRY                                                0x54a2
+#define mmDP7_DP_MSA_COLORIMETRY                                                0x56a2
+#define mmDP8_DP_MSA_COLORIMETRY                                                0x57a2
+#define mmDP_CONFIG                                                             0x4aa3
+#define mmDP0_DP_CONFIG                                                         0x4aa3
+#define mmDP1_DP_CONFIG                                                         0x4ba3
+#define mmDP2_DP_CONFIG                                                         0x4ca3
+#define mmDP3_DP_CONFIG                                                         0x4da3
+#define mmDP4_DP_CONFIG                                                         0x4ea3
+#define mmDP5_DP_CONFIG                                                         0x4fa3
+#define mmDP6_DP_CONFIG                                                         0x54a3
+#define mmDP7_DP_CONFIG                                                         0x56a3
+#define mmDP8_DP_CONFIG                                                         0x57a3
+#define mmDP_VID_STREAM_CNTL                                                    0x4aa4
+#define mmDP0_DP_VID_STREAM_CNTL                                                0x4aa4
+#define mmDP1_DP_VID_STREAM_CNTL                                                0x4ba4
+#define mmDP2_DP_VID_STREAM_CNTL                                                0x4ca4
+#define mmDP3_DP_VID_STREAM_CNTL                                                0x4da4
+#define mmDP4_DP_VID_STREAM_CNTL                                                0x4ea4
+#define mmDP5_DP_VID_STREAM_CNTL                                                0x4fa4
+#define mmDP6_DP_VID_STREAM_CNTL                                                0x54a4
+#define mmDP7_DP_VID_STREAM_CNTL                                                0x56a4
+#define mmDP8_DP_VID_STREAM_CNTL                                                0x57a4
+#define mmDP_STEER_FIFO                                                         0x4aa5
+#define mmDP0_DP_STEER_FIFO                                                     0x4aa5
+#define mmDP1_DP_STEER_FIFO                                                     0x4ba5
+#define mmDP2_DP_STEER_FIFO                                                     0x4ca5
+#define mmDP3_DP_STEER_FIFO                                                     0x4da5
+#define mmDP4_DP_STEER_FIFO                                                     0x4ea5
+#define mmDP5_DP_STEER_FIFO                                                     0x4fa5
+#define mmDP6_DP_STEER_FIFO                                                     0x54a5
+#define mmDP7_DP_STEER_FIFO                                                     0x56a5
+#define mmDP8_DP_STEER_FIFO                                                     0x57a5
+#define mmDP_MSA_MISC                                                           0x4aa6
+#define mmDP0_DP_MSA_MISC                                                       0x4aa6
+#define mmDP1_DP_MSA_MISC                                                       0x4ba6
+#define mmDP2_DP_MSA_MISC                                                       0x4ca6
+#define mmDP3_DP_MSA_MISC                                                       0x4da6
+#define mmDP4_DP_MSA_MISC                                                       0x4ea6
+#define mmDP5_DP_MSA_MISC                                                       0x4fa6
+#define mmDP6_DP_MSA_MISC                                                       0x54a6
+#define mmDP7_DP_MSA_MISC                                                       0x56a6
+#define mmDP8_DP_MSA_MISC                                                       0x57a6
+#define mmDP_VID_TIMING                                                         0x4aa8
+#define mmDP0_DP_VID_TIMING                                                     0x4aa8
+#define mmDP1_DP_VID_TIMING                                                     0x4ba8
+#define mmDP2_DP_VID_TIMING                                                     0x4ca8
+#define mmDP3_DP_VID_TIMING                                                     0x4da8
+#define mmDP4_DP_VID_TIMING                                                     0x4ea8
+#define mmDP5_DP_VID_TIMING                                                     0x4fa8
+#define mmDP6_DP_VID_TIMING                                                     0x54a8
+#define mmDP7_DP_VID_TIMING                                                     0x56a8
+#define mmDP8_DP_VID_TIMING                                                     0x57a8
+#define mmDP_VID_N                                                              0x4aa9
+#define mmDP0_DP_VID_N                                                          0x4aa9
+#define mmDP1_DP_VID_N                                                          0x4ba9
+#define mmDP2_DP_VID_N                                                          0x4ca9
+#define mmDP3_DP_VID_N                                                          0x4da9
+#define mmDP4_DP_VID_N                                                          0x4ea9
+#define mmDP5_DP_VID_N                                                          0x4fa9
+#define mmDP6_DP_VID_N                                                          0x54a9
+#define mmDP7_DP_VID_N                                                          0x56a9
+#define mmDP8_DP_VID_N                                                          0x57a9
+#define mmDP_VID_M                                                              0x4aaa
+#define mmDP0_DP_VID_M                                                          0x4aaa
+#define mmDP1_DP_VID_M                                                          0x4baa
+#define mmDP2_DP_VID_M                                                          0x4caa
+#define mmDP3_DP_VID_M                                                          0x4daa
+#define mmDP4_DP_VID_M                                                          0x4eaa
+#define mmDP5_DP_VID_M                                                          0x4faa
+#define mmDP6_DP_VID_M                                                          0x54aa
+#define mmDP7_DP_VID_M                                                          0x56aa
+#define mmDP8_DP_VID_M                                                          0x57aa
+#define mmDP_LINK_FRAMING_CNTL                                                  0x4aab
+#define mmDP0_DP_LINK_FRAMING_CNTL                                              0x4aab
+#define mmDP1_DP_LINK_FRAMING_CNTL                                              0x4bab
+#define mmDP2_DP_LINK_FRAMING_CNTL                                              0x4cab
+#define mmDP3_DP_LINK_FRAMING_CNTL                                              0x4dab
+#define mmDP4_DP_LINK_FRAMING_CNTL                                              0x4eab
+#define mmDP5_DP_LINK_FRAMING_CNTL                                              0x4fab
+#define mmDP6_DP_LINK_FRAMING_CNTL                                              0x54ab
+#define mmDP7_DP_LINK_FRAMING_CNTL                                              0x56ab
+#define mmDP8_DP_LINK_FRAMING_CNTL                                              0x57ab
+#define mmDP_HBR2_EYE_PATTERN                                                   0x4aac
+#define mmDP0_DP_HBR2_EYE_PATTERN                                               0x4aac
+#define mmDP1_DP_HBR2_EYE_PATTERN                                               0x4bac
+#define mmDP2_DP_HBR2_EYE_PATTERN                                               0x4cac
+#define mmDP3_DP_HBR2_EYE_PATTERN                                               0x4dac
+#define mmDP4_DP_HBR2_EYE_PATTERN                                               0x4eac
+#define mmDP5_DP_HBR2_EYE_PATTERN                                               0x4fac
+#define mmDP6_DP_HBR2_EYE_PATTERN                                               0x54ac
+#define mmDP7_DP_HBR2_EYE_PATTERN                                               0x56ac
+#define mmDP8_DP_HBR2_EYE_PATTERN                                               0x57ac
+#define mmDP_VID_MSA_VBID                                                       0x4aad
+#define mmDP0_DP_VID_MSA_VBID                                                   0x4aad
+#define mmDP1_DP_VID_MSA_VBID                                                   0x4bad
+#define mmDP2_DP_VID_MSA_VBID                                                   0x4cad
+#define mmDP3_DP_VID_MSA_VBID                                                   0x4dad
+#define mmDP4_DP_VID_MSA_VBID                                                   0x4ead
+#define mmDP5_DP_VID_MSA_VBID                                                   0x4fad
+#define mmDP6_DP_VID_MSA_VBID                                                   0x54ad
+#define mmDP7_DP_VID_MSA_VBID                                                   0x56ad
+#define mmDP8_DP_VID_MSA_VBID                                                   0x57ad
+#define mmDP_VID_INTERRUPT_CNTL                                                 0x4aae
+#define mmDP0_DP_VID_INTERRUPT_CNTL                                             0x4aae
+#define mmDP1_DP_VID_INTERRUPT_CNTL                                             0x4bae
+#define mmDP2_DP_VID_INTERRUPT_CNTL                                             0x4cae
+#define mmDP3_DP_VID_INTERRUPT_CNTL                                             0x4dae
+#define mmDP4_DP_VID_INTERRUPT_CNTL                                             0x4eae
+#define mmDP5_DP_VID_INTERRUPT_CNTL                                             0x4fae
+#define mmDP6_DP_VID_INTERRUPT_CNTL                                             0x54ae
+#define mmDP7_DP_VID_INTERRUPT_CNTL                                             0x56ae
+#define mmDP8_DP_VID_INTERRUPT_CNTL                                             0x57ae
+#define mmDP_DPHY_CNTL                                                          0x4aaf
+#define mmDP0_DP_DPHY_CNTL                                                      0x4aaf
+#define mmDP1_DP_DPHY_CNTL                                                      0x4baf
+#define mmDP2_DP_DPHY_CNTL                                                      0x4caf
+#define mmDP3_DP_DPHY_CNTL                                                      0x4daf
+#define mmDP4_DP_DPHY_CNTL                                                      0x4eaf
+#define mmDP5_DP_DPHY_CNTL                                                      0x4faf
+#define mmDP6_DP_DPHY_CNTL                                                      0x54af
+#define mmDP7_DP_DPHY_CNTL                                                      0x56af
+#define mmDP8_DP_DPHY_CNTL                                                      0x57af
+#define mmDP_DPHY_TRAINING_PATTERN_SEL                                          0x4ab0
+#define mmDP0_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4ab0
+#define mmDP1_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4bb0
+#define mmDP2_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4cb0
+#define mmDP3_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4db0
+#define mmDP4_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4eb0
+#define mmDP5_DP_DPHY_TRAINING_PATTERN_SEL                                      0x4fb0
+#define mmDP6_DP_DPHY_TRAINING_PATTERN_SEL                                      0x54b0
+#define mmDP7_DP_DPHY_TRAINING_PATTERN_SEL                                      0x56b0
+#define mmDP8_DP_DPHY_TRAINING_PATTERN_SEL                                      0x57b0
+#define mmDP_DPHY_SYM0                                                          0x4ab1
+#define mmDP0_DP_DPHY_SYM0                                                      0x4ab1
+#define mmDP1_DP_DPHY_SYM0                                                      0x4bb1
+#define mmDP2_DP_DPHY_SYM0                                                      0x4cb1
+#define mmDP3_DP_DPHY_SYM0                                                      0x4db1
+#define mmDP4_DP_DPHY_SYM0                                                      0x4eb1
+#define mmDP5_DP_DPHY_SYM0                                                      0x4fb1
+#define mmDP6_DP_DPHY_SYM0                                                      0x54b1
+#define mmDP7_DP_DPHY_SYM0                                                      0x56b1
+#define mmDP8_DP_DPHY_SYM0                                                      0x57b1
+#define mmDP_DPHY_SYM1                                                          0x4ab2
+#define mmDP0_DP_DPHY_SYM1                                                      0x4ab2
+#define mmDP1_DP_DPHY_SYM1                                                      0x4bb2
+#define mmDP2_DP_DPHY_SYM1                                                      0x4cb2
+#define mmDP3_DP_DPHY_SYM1                                                      0x4db2
+#define mmDP4_DP_DPHY_SYM1                                                      0x4eb2
+#define mmDP5_DP_DPHY_SYM1                                                      0x4fb2
+#define mmDP6_DP_DPHY_SYM1                                                      0x54b2
+#define mmDP7_DP_DPHY_SYM1                                                      0x56b2
+#define mmDP8_DP_DPHY_SYM1                                                      0x57b2
+#define mmDP_DPHY_SYM2                                                          0x4ab3
+#define mmDP0_DP_DPHY_SYM2                                                      0x4ab3
+#define mmDP1_DP_DPHY_SYM2                                                      0x4bb3
+#define mmDP2_DP_DPHY_SYM2                                                      0x4cb3
+#define mmDP3_DP_DPHY_SYM2                                                      0x4db3
+#define mmDP4_DP_DPHY_SYM2                                                      0x4eb3
+#define mmDP5_DP_DPHY_SYM2                                                      0x4fb3
+#define mmDP6_DP_DPHY_SYM2                                                      0x54b3
+#define mmDP7_DP_DPHY_SYM2                                                      0x56b3
+#define mmDP8_DP_DPHY_SYM2                                                      0x57b3
+#define mmDP_DPHY_8B10B_CNTL                                                    0x4ab4
+#define mmDP0_DP_DPHY_8B10B_CNTL                                                0x4ab4
+#define mmDP1_DP_DPHY_8B10B_CNTL                                                0x4bb4
+#define mmDP2_DP_DPHY_8B10B_CNTL                                                0x4cb4
+#define mmDP3_DP_DPHY_8B10B_CNTL                                                0x4db4
+#define mmDP4_DP_DPHY_8B10B_CNTL                                                0x4eb4
+#define mmDP5_DP_DPHY_8B10B_CNTL                                                0x4fb4
+#define mmDP6_DP_DPHY_8B10B_CNTL                                                0x54b4
+#define mmDP7_DP_DPHY_8B10B_CNTL                                                0x56b4
+#define mmDP8_DP_DPHY_8B10B_CNTL                                                0x57b4
+#define mmDP_DPHY_PRBS_CNTL                                                     0x4ab5
+#define mmDP0_DP_DPHY_PRBS_CNTL                                                 0x4ab5
+#define mmDP1_DP_DPHY_PRBS_CNTL                                                 0x4bb5
+#define mmDP2_DP_DPHY_PRBS_CNTL                                                 0x4cb5
+#define mmDP3_DP_DPHY_PRBS_CNTL                                                 0x4db5
+#define mmDP4_DP_DPHY_PRBS_CNTL                                                 0x4eb5
+#define mmDP5_DP_DPHY_PRBS_CNTL                                                 0x4fb5
+#define mmDP6_DP_DPHY_PRBS_CNTL                                                 0x54b5
+#define mmDP7_DP_DPHY_PRBS_CNTL                                                 0x56b5
+#define mmDP8_DP_DPHY_PRBS_CNTL                                                 0x57b5
+#define mmDP_DPHY_BS_SR_SWAP_CNTL                                               0x4adc
+#define mmDP0_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4adc
+#define mmDP1_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4bdc
+#define mmDP2_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4cdc
+#define mmDP3_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4ddc
+#define mmDP4_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4edc
+#define mmDP5_DP_DPHY_BS_SR_SWAP_CNTL                                           0x4fdc
+#define mmDP6_DP_DPHY_BS_SR_SWAP_CNTL                                           0x54dc
+#define mmDP7_DP_DPHY_BS_SR_SWAP_CNTL                                           0x56dc
+#define mmDP8_DP_DPHY_BS_SR_SWAP_CNTL                                           0x57dc
+#define mmDP_DPHY_CRC_EN                                                        0x4ab7
+#define mmDP0_DP_DPHY_CRC_EN                                                    0x4ab7
+#define mmDP1_DP_DPHY_CRC_EN                                                    0x4bb7
+#define mmDP2_DP_DPHY_CRC_EN                                                    0x4cb7
+#define mmDP3_DP_DPHY_CRC_EN                                                    0x4db7
+#define mmDP4_DP_DPHY_CRC_EN                                                    0x4eb7
+#define mmDP5_DP_DPHY_CRC_EN                                                    0x4fb7
+#define mmDP6_DP_DPHY_CRC_EN                                                    0x54b7
+#define mmDP7_DP_DPHY_CRC_EN                                                    0x56b7
+#define mmDP8_DP_DPHY_CRC_EN                                                    0x57b7
+#define mmDP_DPHY_CRC_CNTL                                                      0x4ab8
+#define mmDP0_DP_DPHY_CRC_CNTL                                                  0x4ab8
+#define mmDP1_DP_DPHY_CRC_CNTL                                                  0x4bb8
+#define mmDP2_DP_DPHY_CRC_CNTL                                                  0x4cb8
+#define mmDP3_DP_DPHY_CRC_CNTL                                                  0x4db8
+#define mmDP4_DP_DPHY_CRC_CNTL                                                  0x4eb8
+#define mmDP5_DP_DPHY_CRC_CNTL                                                  0x4fb8
+#define mmDP6_DP_DPHY_CRC_CNTL                                                  0x54b8
+#define mmDP7_DP_DPHY_CRC_CNTL                                                  0x56b8
+#define mmDP8_DP_DPHY_CRC_CNTL                                                  0x57b8
+#define mmDP_DPHY_CRC_RESULT                                                    0x4ab9
+#define mmDP0_DP_DPHY_CRC_RESULT                                                0x4ab9
+#define mmDP1_DP_DPHY_CRC_RESULT                                                0x4bb9
+#define mmDP2_DP_DPHY_CRC_RESULT                                                0x4cb9
+#define mmDP3_DP_DPHY_CRC_RESULT                                                0x4db9
+#define mmDP4_DP_DPHY_CRC_RESULT                                                0x4eb9
+#define mmDP5_DP_DPHY_CRC_RESULT                                                0x4fb9
+#define mmDP6_DP_DPHY_CRC_RESULT                                                0x54b9
+#define mmDP7_DP_DPHY_CRC_RESULT                                                0x56b9
+#define mmDP8_DP_DPHY_CRC_RESULT                                                0x57b9
+#define mmDP_DPHY_CRC_MST_CNTL                                                  0x4aba
+#define mmDP0_DP_DPHY_CRC_MST_CNTL                                              0x4aba
+#define mmDP1_DP_DPHY_CRC_MST_CNTL                                              0x4bba
+#define mmDP2_DP_DPHY_CRC_MST_CNTL                                              0x4cba
+#define mmDP3_DP_DPHY_CRC_MST_CNTL                                              0x4dba
+#define mmDP4_DP_DPHY_CRC_MST_CNTL                                              0x4eba
+#define mmDP5_DP_DPHY_CRC_MST_CNTL                                              0x4fba
+#define mmDP6_DP_DPHY_CRC_MST_CNTL                                              0x54ba
+#define mmDP7_DP_DPHY_CRC_MST_CNTL                                              0x56ba
+#define mmDP8_DP_DPHY_CRC_MST_CNTL                                              0x57ba
+#define mmDP_DPHY_CRC_MST_STATUS                                                0x4abb
+#define mmDP0_DP_DPHY_CRC_MST_STATUS                                            0x4abb
+#define mmDP1_DP_DPHY_CRC_MST_STATUS                                            0x4bbb
+#define mmDP2_DP_DPHY_CRC_MST_STATUS                                            0x4cbb
+#define mmDP3_DP_DPHY_CRC_MST_STATUS                                            0x4dbb
+#define mmDP4_DP_DPHY_CRC_MST_STATUS                                            0x4ebb
+#define mmDP5_DP_DPHY_CRC_MST_STATUS                                            0x4fbb
+#define mmDP6_DP_DPHY_CRC_MST_STATUS                                            0x54bb
+#define mmDP7_DP_DPHY_CRC_MST_STATUS                                            0x56bb
+#define mmDP8_DP_DPHY_CRC_MST_STATUS                                            0x57bb
+#define mmDP_DPHY_FAST_TRAINING                                                 0x4abc
+#define mmDP0_DP_DPHY_FAST_TRAINING                                             0x4abc
+#define mmDP1_DP_DPHY_FAST_TRAINING                                             0x4bbc
+#define mmDP2_DP_DPHY_FAST_TRAINING                                             0x4cbc
+#define mmDP3_DP_DPHY_FAST_TRAINING                                             0x4dbc
+#define mmDP4_DP_DPHY_FAST_TRAINING                                             0x4ebc
+#define mmDP5_DP_DPHY_FAST_TRAINING                                             0x4fbc
+#define mmDP6_DP_DPHY_FAST_TRAINING                                             0x54bc
+#define mmDP7_DP_DPHY_FAST_TRAINING                                             0x56bc
+#define mmDP8_DP_DPHY_FAST_TRAINING                                             0x57bc
+#define mmDP_DPHY_FAST_TRAINING_STATUS                                          0x4abd
+#define mmDP0_DP_DPHY_FAST_TRAINING_STATUS                                      0x4abd
+#define mmDP1_DP_DPHY_FAST_TRAINING_STATUS                                      0x4bbd
+#define mmDP2_DP_DPHY_FAST_TRAINING_STATUS                                      0x4cbd
+#define mmDP3_DP_DPHY_FAST_TRAINING_STATUS                                      0x4dbd
+#define mmDP4_DP_DPHY_FAST_TRAINING_STATUS                                      0x4ebd
+#define mmDP5_DP_DPHY_FAST_TRAINING_STATUS                                      0x4fbd
+#define mmDP6_DP_DPHY_FAST_TRAINING_STATUS                                      0x54bd
+#define mmDP7_DP_DPHY_FAST_TRAINING_STATUS                                      0x56bd
+#define mmDP8_DP_DPHY_FAST_TRAINING_STATUS                                      0x57bd
+#define mmDP_DPHY_HBR2_PATTERN_CONTROL                                          0x4add
+#define mmDP0_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4add
+#define mmDP1_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4bdd
+#define mmDP2_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4cdd
+#define mmDP3_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4ddd
+#define mmDP4_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4edd
+#define mmDP5_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x4fdd
+#define mmDP6_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x54dd
+#define mmDP7_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x56dd
+#define mmDP8_DP_DPHY_HBR2_PATTERN_CONTROL                                      0x57dd
+#define mmDP_MSA_V_TIMING_OVERRIDE1                                             0x4abe
+#define mmDP0_DP_MSA_V_TIMING_OVERRIDE1                                         0x4abe
+#define mmDP1_DP_MSA_V_TIMING_OVERRIDE1                                         0x4bbe
+#define mmDP2_DP_MSA_V_TIMING_OVERRIDE1                                         0x4cbe
+#define mmDP3_DP_MSA_V_TIMING_OVERRIDE1                                         0x4dbe
+#define mmDP4_DP_MSA_V_TIMING_OVERRIDE1                                         0x4ebe
+#define mmDP5_DP_MSA_V_TIMING_OVERRIDE1                                         0x4fbe
+#define mmDP6_DP_MSA_V_TIMING_OVERRIDE1                                         0x54be
+#define mmDP7_DP_MSA_V_TIMING_OVERRIDE1                                         0x56be
+#define mmDP8_DP_MSA_V_TIMING_OVERRIDE1                                         0x57be
+#define mmDP_MSA_V_TIMING_OVERRIDE2                                             0x4abf
+#define mmDP0_DP_MSA_V_TIMING_OVERRIDE2                                         0x4abf
+#define mmDP1_DP_MSA_V_TIMING_OVERRIDE2                                         0x4bbf
+#define mmDP2_DP_MSA_V_TIMING_OVERRIDE2                                         0x4cbf
+#define mmDP3_DP_MSA_V_TIMING_OVERRIDE2                                         0x4dbf
+#define mmDP4_DP_MSA_V_TIMING_OVERRIDE2                                         0x4ebf
+#define mmDP5_DP_MSA_V_TIMING_OVERRIDE2                                         0x4fbf
+#define mmDP6_DP_MSA_V_TIMING_OVERRIDE2                                         0x54bf
+#define mmDP7_DP_MSA_V_TIMING_OVERRIDE2                                         0x56bf
+#define mmDP8_DP_MSA_V_TIMING_OVERRIDE2                                         0x57bf
+#define mmDP_SEC_CNTL                                                           0x4ac3
+#define mmDP0_DP_SEC_CNTL                                                       0x4ac3
+#define mmDP1_DP_SEC_CNTL                                                       0x4bc3
+#define mmDP2_DP_SEC_CNTL                                                       0x4cc3
+#define mmDP3_DP_SEC_CNTL                                                       0x4dc3
+#define mmDP4_DP_SEC_CNTL                                                       0x4ec3
+#define mmDP5_DP_SEC_CNTL                                                       0x4fc3
+#define mmDP6_DP_SEC_CNTL                                                       0x54c3
+#define mmDP7_DP_SEC_CNTL                                                       0x56c3
+#define mmDP8_DP_SEC_CNTL                                                       0x57c3
+#define mmDP_SEC_CNTL1                                                          0x4ac4
+#define mmDP0_DP_SEC_CNTL1                                                      0x4ac4
+#define mmDP1_DP_SEC_CNTL1                                                      0x4bc4
+#define mmDP2_DP_SEC_CNTL1                                                      0x4cc4
+#define mmDP3_DP_SEC_CNTL1                                                      0x4dc4
+#define mmDP4_DP_SEC_CNTL1                                                      0x4ec4
+#define mmDP5_DP_SEC_CNTL1                                                      0x4fc4
+#define mmDP6_DP_SEC_CNTL1                                                      0x54c4
+#define mmDP7_DP_SEC_CNTL1                                                      0x56c4
+#define mmDP8_DP_SEC_CNTL1                                                      0x57c4
+#define mmDP_SEC_FRAMING1                                                       0x4ac5
+#define mmDP0_DP_SEC_FRAMING1                                                   0x4ac5
+#define mmDP1_DP_SEC_FRAMING1                                                   0x4bc5
+#define mmDP2_DP_SEC_FRAMING1                                                   0x4cc5
+#define mmDP3_DP_SEC_FRAMING1                                                   0x4dc5
+#define mmDP4_DP_SEC_FRAMING1                                                   0x4ec5
+#define mmDP5_DP_SEC_FRAMING1                                                   0x4fc5
+#define mmDP6_DP_SEC_FRAMING1                                                   0x54c5
+#define mmDP7_DP_SEC_FRAMING1                                                   0x56c5
+#define mmDP8_DP_SEC_FRAMING1                                                   0x57c5
+#define mmDP_SEC_FRAMING2                                                       0x4ac6
+#define mmDP0_DP_SEC_FRAMING2                                                   0x4ac6
+#define mmDP1_DP_SEC_FRAMING2                                                   0x4bc6
+#define mmDP2_DP_SEC_FRAMING2                                                   0x4cc6
+#define mmDP3_DP_SEC_FRAMING2                                                   0x4dc6
+#define mmDP4_DP_SEC_FRAMING2                                                   0x4ec6
+#define mmDP5_DP_SEC_FRAMING2                                                   0x4fc6
+#define mmDP6_DP_SEC_FRAMING2                                                   0x54c6
+#define mmDP7_DP_SEC_FRAMING2                                                   0x56c6
+#define mmDP8_DP_SEC_FRAMING2                                                   0x57c6
+#define mmDP_SEC_FRAMING3                                                       0x4ac7
+#define mmDP0_DP_SEC_FRAMING3                                                   0x4ac7
+#define mmDP1_DP_SEC_FRAMING3                                                   0x4bc7
+#define mmDP2_DP_SEC_FRAMING3                                                   0x4cc7
+#define mmDP3_DP_SEC_FRAMING3                                                   0x4dc7
+#define mmDP4_DP_SEC_FRAMING3                                                   0x4ec7
+#define mmDP5_DP_SEC_FRAMING3                                                   0x4fc7
+#define mmDP6_DP_SEC_FRAMING3                                                   0x54c7
+#define mmDP7_DP_SEC_FRAMING3                                                   0x56c7
+#define mmDP8_DP_SEC_FRAMING3                                                   0x57c7
+#define mmDP_SEC_FRAMING4                                                       0x4ac8
+#define mmDP0_DP_SEC_FRAMING4                                                   0x4ac8
+#define mmDP1_DP_SEC_FRAMING4                                                   0x4bc8
+#define mmDP2_DP_SEC_FRAMING4                                                   0x4cc8
+#define mmDP3_DP_SEC_FRAMING4                                                   0x4dc8
+#define mmDP4_DP_SEC_FRAMING4                                                   0x4ec8
+#define mmDP5_DP_SEC_FRAMING4                                                   0x4fc8
+#define mmDP6_DP_SEC_FRAMING4                                                   0x54c8
+#define mmDP7_DP_SEC_FRAMING4                                                   0x56c8
+#define mmDP8_DP_SEC_FRAMING4                                                   0x57c8
+#define mmDP_SEC_AUD_N                                                          0x4ac9
+#define mmDP0_DP_SEC_AUD_N                                                      0x4ac9
+#define mmDP1_DP_SEC_AUD_N                                                      0x4bc9
+#define mmDP2_DP_SEC_AUD_N                                                      0x4cc9
+#define mmDP3_DP_SEC_AUD_N                                                      0x4dc9
+#define mmDP4_DP_SEC_AUD_N                                                      0x4ec9
+#define mmDP5_DP_SEC_AUD_N                                                      0x4fc9
+#define mmDP6_DP_SEC_AUD_N                                                      0x54c9
+#define mmDP7_DP_SEC_AUD_N                                                      0x56c9
+#define mmDP8_DP_SEC_AUD_N                                                      0x57c9
+#define mmDP_SEC_AUD_N_READBACK                                                 0x4aca
+#define mmDP0_DP_SEC_AUD_N_READBACK                                             0x4aca
+#define mmDP1_DP_SEC_AUD_N_READBACK                                             0x4bca
+#define mmDP2_DP_SEC_AUD_N_READBACK                                             0x4cca
+#define mmDP3_DP_SEC_AUD_N_READBACK                                             0x4dca
+#define mmDP4_DP_SEC_AUD_N_READBACK                                             0x4eca
+#define mmDP5_DP_SEC_AUD_N_READBACK                                             0x4fca
+#define mmDP6_DP_SEC_AUD_N_READBACK                                             0x54ca
+#define mmDP7_DP_SEC_AUD_N_READBACK                                             0x56ca
+#define mmDP8_DP_SEC_AUD_N_READBACK                                             0x57ca
+#define mmDP_SEC_AUD_M                                                          0x4acb
+#define mmDP0_DP_SEC_AUD_M                                                      0x4acb
+#define mmDP1_DP_SEC_AUD_M                                                      0x4bcb
+#define mmDP2_DP_SEC_AUD_M                                                      0x4ccb
+#define mmDP3_DP_SEC_AUD_M                                                      0x4dcb
+#define mmDP4_DP_SEC_AUD_M                                                      0x4ecb
+#define mmDP5_DP_SEC_AUD_M                                                      0x4fcb
+#define mmDP6_DP_SEC_AUD_M                                                      0x54cb
+#define mmDP7_DP_SEC_AUD_M                                                      0x56cb
+#define mmDP8_DP_SEC_AUD_M                                                      0x57cb
+#define mmDP_SEC_AUD_M_READBACK                                                 0x4acc
+#define mmDP0_DP_SEC_AUD_M_READBACK                                             0x4acc
+#define mmDP1_DP_SEC_AUD_M_READBACK                                             0x4bcc
+#define mmDP2_DP_SEC_AUD_M_READBACK                                             0x4ccc
+#define mmDP3_DP_SEC_AUD_M_READBACK                                             0x4dcc
+#define mmDP4_DP_SEC_AUD_M_READBACK                                             0x4ecc
+#define mmDP5_DP_SEC_AUD_M_READBACK                                             0x4fcc
+#define mmDP6_DP_SEC_AUD_M_READBACK                                             0x54cc
+#define mmDP7_DP_SEC_AUD_M_READBACK                                             0x56cc
+#define mmDP8_DP_SEC_AUD_M_READBACK                                             0x57cc
+#define mmDP_SEC_TIMESTAMP                                                      0x4acd
+#define mmDP0_DP_SEC_TIMESTAMP                                                  0x4acd
+#define mmDP1_DP_SEC_TIMESTAMP                                                  0x4bcd
+#define mmDP2_DP_SEC_TIMESTAMP                                                  0x4ccd
+#define mmDP3_DP_SEC_TIMESTAMP                                                  0x4dcd
+#define mmDP4_DP_SEC_TIMESTAMP                                                  0x4ecd
+#define mmDP5_DP_SEC_TIMESTAMP                                                  0x4fcd
+#define mmDP6_DP_SEC_TIMESTAMP                                                  0x54cd
+#define mmDP7_DP_SEC_TIMESTAMP                                                  0x56cd
+#define mmDP8_DP_SEC_TIMESTAMP                                                  0x57cd
+#define mmDP_SEC_PACKET_CNTL                                                    0x4ace
+#define mmDP0_DP_SEC_PACKET_CNTL                                                0x4ace
+#define mmDP1_DP_SEC_PACKET_CNTL                                                0x4bce
+#define mmDP2_DP_SEC_PACKET_CNTL                                                0x4cce
+#define mmDP3_DP_SEC_PACKET_CNTL                                                0x4dce
+#define mmDP4_DP_SEC_PACKET_CNTL                                                0x4ece
+#define mmDP5_DP_SEC_PACKET_CNTL                                                0x4fce
+#define mmDP6_DP_SEC_PACKET_CNTL                                                0x54ce
+#define mmDP7_DP_SEC_PACKET_CNTL                                                0x56ce
+#define mmDP8_DP_SEC_PACKET_CNTL                                                0x57ce
+#define mmDP_MSE_RATE_CNTL                                                      0x4acf
+#define mmDP0_DP_MSE_RATE_CNTL                                                  0x4acf
+#define mmDP1_DP_MSE_RATE_CNTL                                                  0x4bcf
+#define mmDP2_DP_MSE_RATE_CNTL                                                  0x4ccf
+#define mmDP3_DP_MSE_RATE_CNTL                                                  0x4dcf
+#define mmDP4_DP_MSE_RATE_CNTL                                                  0x4ecf
+#define mmDP5_DP_MSE_RATE_CNTL                                                  0x4fcf
+#define mmDP6_DP_MSE_RATE_CNTL                                                  0x54cf
+#define mmDP7_DP_MSE_RATE_CNTL                                                  0x56cf
+#define mmDP8_DP_MSE_RATE_CNTL                                                  0x57cf
+#define mmDP_MSE_RATE_UPDATE                                                    0x4ad1
+#define mmDP0_DP_MSE_RATE_UPDATE                                                0x4ad1
+#define mmDP1_DP_MSE_RATE_UPDATE                                                0x4bd1
+#define mmDP2_DP_MSE_RATE_UPDATE                                                0x4cd1
+#define mmDP3_DP_MSE_RATE_UPDATE                                                0x4dd1
+#define mmDP4_DP_MSE_RATE_UPDATE                                                0x4ed1
+#define mmDP5_DP_MSE_RATE_UPDATE                                                0x4fd1
+#define mmDP6_DP_MSE_RATE_UPDATE                                                0x54d1
+#define mmDP7_DP_MSE_RATE_UPDATE                                                0x56d1
+#define mmDP8_DP_MSE_RATE_UPDATE                                                0x57d1
+#define mmDP_MSE_SAT0                                                           0x4ad2
+#define mmDP0_DP_MSE_SAT0                                                       0x4ad2
+#define mmDP1_DP_MSE_SAT0                                                       0x4bd2
+#define mmDP2_DP_MSE_SAT0                                                       0x4cd2
+#define mmDP3_DP_MSE_SAT0                                                       0x4dd2
+#define mmDP4_DP_MSE_SAT0                                                       0x4ed2
+#define mmDP5_DP_MSE_SAT0                                                       0x4fd2
+#define mmDP6_DP_MSE_SAT0                                                       0x54d2
+#define mmDP7_DP_MSE_SAT0                                                       0x56d2
+#define mmDP8_DP_MSE_SAT0                                                       0x57d2
+#define mmDP_MSE_SAT1                                                           0x4ad3
+#define mmDP0_DP_MSE_SAT1                                                       0x4ad3
+#define mmDP1_DP_MSE_SAT1                                                       0x4bd3
+#define mmDP2_DP_MSE_SAT1                                                       0x4cd3
+#define mmDP3_DP_MSE_SAT1                                                       0x4dd3
+#define mmDP4_DP_MSE_SAT1                                                       0x4ed3
+#define mmDP5_DP_MSE_SAT1                                                       0x4fd3
+#define mmDP6_DP_MSE_SAT1                                                       0x54d3
+#define mmDP7_DP_MSE_SAT1                                                       0x56d3
+#define mmDP8_DP_MSE_SAT1                                                       0x57d3
+#define mmDP_MSE_SAT2                                                           0x4ad4
+#define mmDP0_DP_MSE_SAT2                                                       0x4ad4
+#define mmDP1_DP_MSE_SAT2                                                       0x4bd4
+#define mmDP2_DP_MSE_SAT2                                                       0x4cd4
+#define mmDP3_DP_MSE_SAT2                                                       0x4dd4
+#define mmDP4_DP_MSE_SAT2                                                       0x4ed4
+#define mmDP5_DP_MSE_SAT2                                                       0x4fd4
+#define mmDP6_DP_MSE_SAT2                                                       0x54d4
+#define mmDP7_DP_MSE_SAT2                                                       0x56d4
+#define mmDP8_DP_MSE_SAT2                                                       0x57d4
+#define mmDP_MSE_SAT_UPDATE                                                     0x4ad5
+#define mmDP0_DP_MSE_SAT_UPDATE                                                 0x4ad5
+#define mmDP1_DP_MSE_SAT_UPDATE                                                 0x4bd5
+#define mmDP2_DP_MSE_SAT_UPDATE                                                 0x4cd5
+#define mmDP3_DP_MSE_SAT_UPDATE                                                 0x4dd5
+#define mmDP4_DP_MSE_SAT_UPDATE                                                 0x4ed5
+#define mmDP5_DP_MSE_SAT_UPDATE                                                 0x4fd5
+#define mmDP6_DP_MSE_SAT_UPDATE                                                 0x54d5
+#define mmDP7_DP_MSE_SAT_UPDATE                                                 0x56d5
+#define mmDP8_DP_MSE_SAT_UPDATE                                                 0x57d5
+#define mmDP_MSE_LINK_TIMING                                                    0x4ad6
+#define mmDP0_DP_MSE_LINK_TIMING                                                0x4ad6
+#define mmDP1_DP_MSE_LINK_TIMING                                                0x4bd6
+#define mmDP2_DP_MSE_LINK_TIMING                                                0x4cd6
+#define mmDP3_DP_MSE_LINK_TIMING                                                0x4dd6
+#define mmDP4_DP_MSE_LINK_TIMING                                                0x4ed6
+#define mmDP5_DP_MSE_LINK_TIMING                                                0x4fd6
+#define mmDP6_DP_MSE_LINK_TIMING                                                0x54d6
+#define mmDP7_DP_MSE_LINK_TIMING                                                0x56d6
+#define mmDP8_DP_MSE_LINK_TIMING                                                0x57d6
+#define mmDP_MSE_MISC_CNTL                                                      0x4ad7
+#define mmDP0_DP_MSE_MISC_CNTL                                                  0x4ad7
+#define mmDP1_DP_MSE_MISC_CNTL                                                  0x4bd7
+#define mmDP2_DP_MSE_MISC_CNTL                                                  0x4cd7
+#define mmDP3_DP_MSE_MISC_CNTL                                                  0x4dd7
+#define mmDP4_DP_MSE_MISC_CNTL                                                  0x4ed7
+#define mmDP5_DP_MSE_MISC_CNTL                                                  0x4fd7
+#define mmDP6_DP_MSE_MISC_CNTL                                                  0x54d7
+#define mmDP7_DP_MSE_MISC_CNTL                                                  0x56d7
+#define mmDP8_DP_MSE_MISC_CNTL                                                  0x57d7
+#define mmDP_MSE_SAT0_STATUS                                                    0x4adf
+#define mmDP0_DP_MSE_SAT0_STATUS                                                0x4adf
+#define mmDP1_DP_MSE_SAT0_STATUS                                                0x4bdf
+#define mmDP2_DP_MSE_SAT0_STATUS                                                0x4cdf
+#define mmDP3_DP_MSE_SAT0_STATUS                                                0x4ddf
+#define mmDP4_DP_MSE_SAT0_STATUS                                                0x4edf
+#define mmDP5_DP_MSE_SAT0_STATUS                                                0x4fdf
+#define mmDP6_DP_MSE_SAT0_STATUS                                                0x54df
+#define mmDP7_DP_MSE_SAT0_STATUS                                                0x56df
+#define mmDP8_DP_MSE_SAT0_STATUS                                                0x57df
+#define mmDP_MSE_SAT1_STATUS                                                    0x4ae0
+#define mmDP0_DP_MSE_SAT1_STATUS                                                0x4ae0
+#define mmDP1_DP_MSE_SAT1_STATUS                                                0x4be0
+#define mmDP2_DP_MSE_SAT1_STATUS                                                0x4ce0
+#define mmDP3_DP_MSE_SAT1_STATUS                                                0x4de0
+#define mmDP4_DP_MSE_SAT1_STATUS                                                0x4ee0
+#define mmDP5_DP_MSE_SAT1_STATUS                                                0x4fe0
+#define mmDP6_DP_MSE_SAT1_STATUS                                                0x54e0
+#define mmDP7_DP_MSE_SAT1_STATUS                                                0x56e0
+#define mmDP8_DP_MSE_SAT1_STATUS                                                0x57e0
+#define mmDP_MSE_SAT2_STATUS                                                    0x4ae1
+#define mmDP0_DP_MSE_SAT2_STATUS                                                0x4ae1
+#define mmDP1_DP_MSE_SAT2_STATUS                                                0x4be1
+#define mmDP2_DP_MSE_SAT2_STATUS                                                0x4ce1
+#define mmDP3_DP_MSE_SAT2_STATUS                                                0x4de1
+#define mmDP4_DP_MSE_SAT2_STATUS                                                0x4ee1
+#define mmDP5_DP_MSE_SAT2_STATUS                                                0x4fe1
+#define mmDP6_DP_MSE_SAT2_STATUS                                                0x54e1
+#define mmDP7_DP_MSE_SAT2_STATUS                                                0x56e1
+#define mmDP8_DP_MSE_SAT2_STATUS                                                0x57e1
+#define mmDP_TEST_DEBUG_INDEX                                                   0x4ad8
+#define mmDP0_DP_TEST_DEBUG_INDEX                                               0x4ad8
+#define mmDP1_DP_TEST_DEBUG_INDEX                                               0x4bd8
+#define mmDP2_DP_TEST_DEBUG_INDEX                                               0x4cd8
+#define mmDP3_DP_TEST_DEBUG_INDEX                                               0x4dd8
+#define mmDP4_DP_TEST_DEBUG_INDEX                                               0x4ed8
+#define mmDP5_DP_TEST_DEBUG_INDEX                                               0x4fd8
+#define mmDP6_DP_TEST_DEBUG_INDEX                                               0x54d8
+#define mmDP7_DP_TEST_DEBUG_INDEX                                               0x56d8
+#define mmDP8_DP_TEST_DEBUG_INDEX                                               0x57d8
+#define mmDP_TEST_DEBUG_DATA                                                    0x4ad9
+#define mmDP0_DP_TEST_DEBUG_DATA                                                0x4ad9
+#define mmDP1_DP_TEST_DEBUG_DATA                                                0x4bd9
+#define mmDP2_DP_TEST_DEBUG_DATA                                                0x4cd9
+#define mmDP3_DP_TEST_DEBUG_DATA                                                0x4dd9
+#define mmDP4_DP_TEST_DEBUG_DATA                                                0x4ed9
+#define mmDP5_DP_TEST_DEBUG_DATA                                                0x4fd9
+#define mmDP6_DP_TEST_DEBUG_DATA                                                0x54d9
+#define mmDP7_DP_TEST_DEBUG_DATA                                                0x56d9
+#define mmDP8_DP_TEST_DEBUG_DATA                                                0x57d9
+#define mmDP_FE_TEST_DEBUG_INDEX                                                0x4ada
+#define mmDP0_DP_FE_TEST_DEBUG_INDEX                                            0x4ada
+#define mmDP1_DP_FE_TEST_DEBUG_INDEX                                            0x4bda
+#define mmDP2_DP_FE_TEST_DEBUG_INDEX                                            0x4cda
+#define mmDP3_DP_FE_TEST_DEBUG_INDEX                                            0x4dda
+#define mmDP4_DP_FE_TEST_DEBUG_INDEX                                            0x4eda
+#define mmDP5_DP_FE_TEST_DEBUG_INDEX                                            0x4fda
+#define mmDP6_DP_FE_TEST_DEBUG_INDEX                                            0x54da
+#define mmDP7_DP_FE_TEST_DEBUG_INDEX                                            0x56da
+#define mmDP8_DP_FE_TEST_DEBUG_INDEX                                            0x57da
+#define mmDP_FE_TEST_DEBUG_DATA                                                 0x4adb
+#define mmDP0_DP_FE_TEST_DEBUG_DATA                                             0x4adb
+#define mmDP1_DP_FE_TEST_DEBUG_DATA                                             0x4bdb
+#define mmDP2_DP_FE_TEST_DEBUG_DATA                                             0x4cdb
+#define mmDP3_DP_FE_TEST_DEBUG_DATA                                             0x4ddb
+#define mmDP4_DP_FE_TEST_DEBUG_DATA                                             0x4edb
+#define mmDP5_DP_FE_TEST_DEBUG_DATA                                             0x4fdb
+#define mmDP6_DP_FE_TEST_DEBUG_DATA                                             0x54db
+#define mmDP7_DP_FE_TEST_DEBUG_DATA                                             0x56db
+#define mmDP8_DP_FE_TEST_DEBUG_DATA                                             0x57db
+#define mmAUX_CONTROL                                                           0x5c00
+#define mmDP_AUX0_AUX_CONTROL                                                   0x5c00
+#define mmDP_AUX1_AUX_CONTROL                                                   0x5c1c
+#define mmDP_AUX2_AUX_CONTROL                                                   0x5c38
+#define mmDP_AUX3_AUX_CONTROL                                                   0x5c54
+#define mmDP_AUX4_AUX_CONTROL                                                   0x5c70
+#define mmDP_AUX5_AUX_CONTROL                                                   0x5c8c
+#define mmAUX_SW_CONTROL                                                        0x5c01
+#define mmDP_AUX0_AUX_SW_CONTROL                                                0x5c01
+#define mmDP_AUX1_AUX_SW_CONTROL                                                0x5c1d
+#define mmDP_AUX2_AUX_SW_CONTROL                                                0x5c39
+#define mmDP_AUX3_AUX_SW_CONTROL                                                0x5c55
+#define mmDP_AUX4_AUX_SW_CONTROL                                                0x5c71
+#define mmDP_AUX5_AUX_SW_CONTROL                                                0x5c8d
+#define mmAUX_ARB_CONTROL                                                       0x5c02
+#define mmDP_AUX0_AUX_ARB_CONTROL                                               0x5c02
+#define mmDP_AUX1_AUX_ARB_CONTROL                                               0x5c1e
+#define mmDP_AUX2_AUX_ARB_CONTROL                                               0x5c3a
+#define mmDP_AUX3_AUX_ARB_CONTROL                                               0x5c56
+#define mmDP_AUX4_AUX_ARB_CONTROL                                               0x5c72
+#define mmDP_AUX5_AUX_ARB_CONTROL                                               0x5c8e
+#define mmAUX_INTERRUPT_CONTROL                                                 0x5c03
+#define mmDP_AUX0_AUX_INTERRUPT_CONTROL                                         0x5c03
+#define mmDP_AUX1_AUX_INTERRUPT_CONTROL                                         0x5c1f
+#define mmDP_AUX2_AUX_INTERRUPT_CONTROL                                         0x5c3b
+#define mmDP_AUX3_AUX_INTERRUPT_CONTROL                                         0x5c57
+#define mmDP_AUX4_AUX_INTERRUPT_CONTROL                                         0x5c73
+#define mmDP_AUX5_AUX_INTERRUPT_CONTROL                                         0x5c8f
+#define mmAUX_SW_STATUS                                                         0x5c04
+#define mmDP_AUX0_AUX_SW_STATUS                                                 0x5c04
+#define mmDP_AUX1_AUX_SW_STATUS                                                 0x5c20
+#define mmDP_AUX2_AUX_SW_STATUS                                                 0x5c3c
+#define mmDP_AUX3_AUX_SW_STATUS                                                 0x5c58
+#define mmDP_AUX4_AUX_SW_STATUS                                                 0x5c74
+#define mmDP_AUX5_AUX_SW_STATUS                                                 0x5c90
+#define mmAUX_LS_STATUS                                                         0x5c05
+#define mmDP_AUX0_AUX_LS_STATUS                                                 0x5c05
+#define mmDP_AUX1_AUX_LS_STATUS                                                 0x5c21
+#define mmDP_AUX2_AUX_LS_STATUS                                                 0x5c3d
+#define mmDP_AUX3_AUX_LS_STATUS                                                 0x5c59
+#define mmDP_AUX4_AUX_LS_STATUS                                                 0x5c75
+#define mmDP_AUX5_AUX_LS_STATUS                                                 0x5c91
+#define mmAUX_SW_DATA                                                           0x5c06
+#define mmDP_AUX0_AUX_SW_DATA                                                   0x5c06
+#define mmDP_AUX1_AUX_SW_DATA                                                   0x5c22
+#define mmDP_AUX2_AUX_SW_DATA                                                   0x5c3e
+#define mmDP_AUX3_AUX_SW_DATA                                                   0x5c5a
+#define mmDP_AUX4_AUX_SW_DATA                                                   0x5c76
+#define mmDP_AUX5_AUX_SW_DATA                                                   0x5c92
+#define mmAUX_LS_DATA                                                           0x5c07
+#define mmDP_AUX0_AUX_LS_DATA                                                   0x5c07
+#define mmDP_AUX1_AUX_LS_DATA                                                   0x5c23
+#define mmDP_AUX2_AUX_LS_DATA                                                   0x5c3f
+#define mmDP_AUX3_AUX_LS_DATA                                                   0x5c5b
+#define mmDP_AUX4_AUX_LS_DATA                                                   0x5c77
+#define mmDP_AUX5_AUX_LS_DATA                                                   0x5c93
+#define mmAUX_DPHY_TX_REF_CONTROL                                               0x5c08
+#define mmDP_AUX0_AUX_DPHY_TX_REF_CONTROL                                       0x5c08
+#define mmDP_AUX1_AUX_DPHY_TX_REF_CONTROL                                       0x5c24
+#define mmDP_AUX2_AUX_DPHY_TX_REF_CONTROL                                       0x5c40
+#define mmDP_AUX3_AUX_DPHY_TX_REF_CONTROL                                       0x5c5c
+#define mmDP_AUX4_AUX_DPHY_TX_REF_CONTROL                                       0x5c78
+#define mmDP_AUX5_AUX_DPHY_TX_REF_CONTROL                                       0x5c94
+#define mmAUX_DPHY_TX_CONTROL                                                   0x5c09
+#define mmDP_AUX0_AUX_DPHY_TX_CONTROL                                           0x5c09
+#define mmDP_AUX1_AUX_DPHY_TX_CONTROL                                           0x5c25
+#define mmDP_AUX2_AUX_DPHY_TX_CONTROL                                           0x5c41
+#define mmDP_AUX3_AUX_DPHY_TX_CONTROL                                           0x5c5d
+#define mmDP_AUX4_AUX_DPHY_TX_CONTROL                                           0x5c79
+#define mmDP_AUX5_AUX_DPHY_TX_CONTROL                                           0x5c95
+#define mmAUX_DPHY_RX_CONTROL0                                                  0x5c0a
+#define mmDP_AUX0_AUX_DPHY_RX_CONTROL0                                          0x5c0a
+#define mmDP_AUX1_AUX_DPHY_RX_CONTROL0                                          0x5c26
+#define mmDP_AUX2_AUX_DPHY_RX_CONTROL0                                          0x5c42
+#define mmDP_AUX3_AUX_DPHY_RX_CONTROL0                                          0x5c5e
+#define mmDP_AUX4_AUX_DPHY_RX_CONTROL0                                          0x5c7a
+#define mmDP_AUX5_AUX_DPHY_RX_CONTROL0                                          0x5c96
+#define mmAUX_DPHY_RX_CONTROL1                                                  0x5c0b
+#define mmDP_AUX0_AUX_DPHY_RX_CONTROL1                                          0x5c0b
+#define mmDP_AUX1_AUX_DPHY_RX_CONTROL1                                          0x5c27
+#define mmDP_AUX2_AUX_DPHY_RX_CONTROL1                                          0x5c43
+#define mmDP_AUX3_AUX_DPHY_RX_CONTROL1                                          0x5c5f
+#define mmDP_AUX4_AUX_DPHY_RX_CONTROL1                                          0x5c7b
+#define mmDP_AUX5_AUX_DPHY_RX_CONTROL1                                          0x5c97
+#define mmAUX_DPHY_TX_STATUS                                                    0x5c0c
+#define mmDP_AUX0_AUX_DPHY_TX_STATUS                                            0x5c0c
+#define mmDP_AUX1_AUX_DPHY_TX_STATUS                                            0x5c28
+#define mmDP_AUX2_AUX_DPHY_TX_STATUS                                            0x5c44
+#define mmDP_AUX3_AUX_DPHY_TX_STATUS                                            0x5c60
+#define mmDP_AUX4_AUX_DPHY_TX_STATUS                                            0x5c7c
+#define mmDP_AUX5_AUX_DPHY_TX_STATUS                                            0x5c98
+#define mmAUX_DPHY_RX_STATUS                                                    0x5c0d
+#define mmDP_AUX0_AUX_DPHY_RX_STATUS                                            0x5c0d
+#define mmDP_AUX1_AUX_DPHY_RX_STATUS                                            0x5c29
+#define mmDP_AUX2_AUX_DPHY_RX_STATUS                                            0x5c45
+#define mmDP_AUX3_AUX_DPHY_RX_STATUS                                            0x5c61
+#define mmDP_AUX4_AUX_DPHY_RX_STATUS                                            0x5c7d
+#define mmDP_AUX5_AUX_DPHY_RX_STATUS                                            0x5c99
+#define mmAUX_GTC_SYNC_ERROR_CONTROL                                            0x5c0f
+#define mmDP_AUX0_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c0f
+#define mmDP_AUX1_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c2b
+#define mmDP_AUX2_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c47
+#define mmDP_AUX3_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c63
+#define mmDP_AUX4_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c7f
+#define mmDP_AUX5_AUX_GTC_SYNC_ERROR_CONTROL                                    0x5c9b
+#define mmAUX_GTC_SYNC_CONTROLLER_STATUS                                        0x5c10
+#define mmDP_AUX0_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c10
+#define mmDP_AUX1_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c2c
+#define mmDP_AUX2_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c48
+#define mmDP_AUX3_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c64
+#define mmDP_AUX4_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c80
+#define mmDP_AUX5_AUX_GTC_SYNC_CONTROLLER_STATUS                                0x5c9c
+#define mmAUX_GTC_SYNC_STATUS                                                   0x5c11
+#define mmDP_AUX0_AUX_GTC_SYNC_STATUS                                           0x5c11
+#define mmDP_AUX1_AUX_GTC_SYNC_STATUS                                           0x5c2d
+#define mmDP_AUX2_AUX_GTC_SYNC_STATUS                                           0x5c49
+#define mmDP_AUX3_AUX_GTC_SYNC_STATUS                                           0x5c65
+#define mmDP_AUX4_AUX_GTC_SYNC_STATUS                                           0x5c81
+#define mmDP_AUX5_AUX_GTC_SYNC_STATUS                                           0x5c9d
+#define mmAUX_TEST_DEBUG_INDEX                                                  0x5c14
+#define mmDP_AUX0_AUX_TEST_DEBUG_INDEX                                          0x5c14
+#define mmDP_AUX1_AUX_TEST_DEBUG_INDEX                                          0x5c30
+#define mmDP_AUX2_AUX_TEST_DEBUG_INDEX                                          0x5c4c
+#define mmDP_AUX3_AUX_TEST_DEBUG_INDEX                                          0x5c68
+#define mmDP_AUX4_AUX_TEST_DEBUG_INDEX                                          0x5c84
+#define mmDP_AUX5_AUX_TEST_DEBUG_INDEX                                          0x5ca0
+#define mmAUX_TEST_DEBUG_DATA                                                   0x5c15
+#define mmDP_AUX0_AUX_TEST_DEBUG_DATA                                           0x5c15
+#define mmDP_AUX1_AUX_TEST_DEBUG_DATA                                           0x5c31
+#define mmDP_AUX2_AUX_TEST_DEBUG_DATA                                           0x5c4d
+#define mmDP_AUX3_AUX_TEST_DEBUG_DATA                                           0x5c69
+#define mmDP_AUX4_AUX_TEST_DEBUG_DATA                                           0x5c85
+#define mmDP_AUX5_AUX_TEST_DEBUG_DATA                                           0x5ca1
+#define ixDP_AUX_DEBUG_A                                                        0x10
+#define ixDP_AUX_DEBUG_B                                                        0x11
+#define ixDP_AUX_DEBUG_C                                                        0x12
+#define ixDP_AUX_DEBUG_D                                                        0x13
+#define ixDP_AUX_DEBUG_E                                                        0x14
+#define ixDP_AUX_DEBUG_F                                                        0x15
+#define ixDP_AUX_DEBUG_G                                                        0x16
+#define ixDP_AUX_DEBUG_H                                                        0x17
+#define ixDP_AUX_DEBUG_I                                                        0x18
+#define ixDP_AUX_DEBUG_J                                                        0x19
+#define ixDP_AUX_DEBUG_K                                                        0x1a
+#define ixDP_AUX_DEBUG_L                                                        0x1b
+#define ixDP_AUX_DEBUG_M                                                        0x1c
+#define ixDP_AUX_DEBUG_N                                                        0x1d
+#define ixDP_AUX_DEBUG_O                                                        0x1e
+#define ixDP_AUX_DEBUG_P                                                        0x1f
+#define ixDP_AUX_DEBUG_Q                                                        0x20
+#define mmDVO_ENABLE                                                            0x16a0
+#define mmDVO_SOURCE_SELECT                                                     0x16a1
+#define mmDVO_OUTPUT                                                            0x16a2
+#define mmDVO_CONTROL                                                           0x16a3
+#define mmDVO_CRC_EN                                                            0x16a4
+#define mmDVO_CRC2_SIG_MASK                                                     0x16a5
+#define mmDVO_CRC2_SIG_RESULT                                                   0x16a6
+#define mmDVO_FIFO_ERROR_STATUS                                                 0x16a7
+#define mmDVO_TEST_DEBUG_INDEX                                                  0x16a8
+#define mmDVO_TEST_DEBUG_DATA                                                   0x16a9
+#define mmFBC_CNTL                                                              0x280
+#define mmFBC_IDLE_FORCE_CLEAR_MASK                                             0x282
+#define mmFBC_START_STOP_DELAY                                                  0x283
+#define mmFBC_COMP_CNTL                                                         0x284
+#define mmFBC_COMP_MODE                                                         0x285
+#define mmFBC_DEBUG0                                                            0x286
+#define mmFBC_DEBUG1                                                            0x287
+#define mmFBC_DEBUG2                                                            0x288
+#define mmFBC_IND_LUT0                                                          0x289
+#define mmFBC_IND_LUT1                                                          0x28a
+#define mmFBC_IND_LUT2                                                          0x28b
+#define mmFBC_IND_LUT3                                                          0x28c
+#define mmFBC_IND_LUT4                                                          0x28d
+#define mmFBC_IND_LUT5                                                          0x28e
+#define mmFBC_IND_LUT6                                                          0x28f
+#define mmFBC_IND_LUT7                                                          0x290
+#define mmFBC_IND_LUT8                                                          0x291
+#define mmFBC_IND_LUT9                                                          0x292
+#define mmFBC_IND_LUT10                                                         0x293
+#define mmFBC_IND_LUT11                                                         0x294
+#define mmFBC_IND_LUT12                                                         0x295
+#define mmFBC_IND_LUT13                                                         0x296
+#define mmFBC_IND_LUT14                                                         0x297
+#define mmFBC_IND_LUT15                                                         0x298
+#define mmFBC_CSM_REGION_OFFSET_01                                              0x299
+#define mmFBC_CSM_REGION_OFFSET_23                                              0x29a
+#define mmFBC_CLIENT_REGION_MASK                                                0x29b
+#define mmFBC_DEBUG_COMP                                                        0x29c
+#define mmFBC_DEBUG_CSR                                                         0x29d
+#define mmFBC_DEBUG_CSR_RDATA                                                   0x29e
+#define mmFBC_DEBUG_CSR_WDATA                                                   0x29f
+#define mmFBC_DEBUG_CSR_RDATA_HI                                                0x2a0
+#define mmFBC_DEBUG_CSR_WDATA_HI                                                0x2a1
+#define mmFBC_MISC                                                              0x2a2
+#define mmFBC_STATUS                                                            0x2a3
+#define mmFBC_ALPHA_CNTL                                                        0x2a6
+#define mmFBC_ALPHA_RGB_OVERRIDE                                                0x2a7
+#define mmFBC_TEST_DEBUG_INDEX                                                  0x2a4
+#define mmFBC_TEST_DEBUG_DATA                                                   0x2a5
+#define mmFMT_CLAMP_COMPONENT_R                                                 0x1be8
+#define mmFMT0_FMT_CLAMP_COMPONENT_R                                            0x1be8
+#define mmFMT1_FMT_CLAMP_COMPONENT_R                                            0x1de8
+#define mmFMT2_FMT_CLAMP_COMPONENT_R                                            0x1fe8
+#define mmFMT3_FMT_CLAMP_COMPONENT_R                                            0x41e8
+#define mmFMT4_FMT_CLAMP_COMPONENT_R                                            0x43e8
+#define mmFMT5_FMT_CLAMP_COMPONENT_R                                            0x45e8
+#define mmFMT_CLAMP_COMPONENT_G                                                 0x1be9
+#define mmFMT0_FMT_CLAMP_COMPONENT_G                                            0x1be9
+#define mmFMT1_FMT_CLAMP_COMPONENT_G                                            0x1de9
+#define mmFMT2_FMT_CLAMP_COMPONENT_G                                            0x1fe9
+#define mmFMT3_FMT_CLAMP_COMPONENT_G                                            0x41e9
+#define mmFMT4_FMT_CLAMP_COMPONENT_G                                            0x43e9
+#define mmFMT5_FMT_CLAMP_COMPONENT_G                                            0x45e9
+#define mmFMT_CLAMP_COMPONENT_B                                                 0x1bea
+#define mmFMT0_FMT_CLAMP_COMPONENT_B                                            0x1bea
+#define mmFMT1_FMT_CLAMP_COMPONENT_B                                            0x1dea
+#define mmFMT2_FMT_CLAMP_COMPONENT_B                                            0x1fea
+#define mmFMT3_FMT_CLAMP_COMPONENT_B                                            0x41ea
+#define mmFMT4_FMT_CLAMP_COMPONENT_B                                            0x43ea
+#define mmFMT5_FMT_CLAMP_COMPONENT_B                                            0x45ea
+#define mmFMT_DYNAMIC_EXP_CNTL                                                  0x1bed
+#define mmFMT0_FMT_DYNAMIC_EXP_CNTL                                             0x1bed
+#define mmFMT1_FMT_DYNAMIC_EXP_CNTL                                             0x1ded
+#define mmFMT2_FMT_DYNAMIC_EXP_CNTL                                             0x1fed
+#define mmFMT3_FMT_DYNAMIC_EXP_CNTL                                             0x41ed
+#define mmFMT4_FMT_DYNAMIC_EXP_CNTL                                             0x43ed
+#define mmFMT5_FMT_DYNAMIC_EXP_CNTL                                             0x45ed
+#define mmFMT_CONTROL                                                           0x1bee
+#define mmFMT0_FMT_CONTROL                                                      0x1bee
+#define mmFMT1_FMT_CONTROL                                                      0x1dee
+#define mmFMT2_FMT_CONTROL                                                      0x1fee
+#define mmFMT3_FMT_CONTROL                                                      0x41ee
+#define mmFMT4_FMT_CONTROL                                                      0x43ee
+#define mmFMT5_FMT_CONTROL                                                      0x45ee
+#define mmFMT_BIT_DEPTH_CONTROL                                                 0x1bf2
+#define mmFMT0_FMT_BIT_DEPTH_CONTROL                                            0x1bf2
+#define mmFMT1_FMT_BIT_DEPTH_CONTROL                                            0x1df2
+#define mmFMT2_FMT_BIT_DEPTH_CONTROL                                            0x1ff2
+#define mmFMT3_FMT_BIT_DEPTH_CONTROL                                            0x41f2
+#define mmFMT4_FMT_BIT_DEPTH_CONTROL                                            0x43f2
+#define mmFMT5_FMT_BIT_DEPTH_CONTROL                                            0x45f2
+#define mmFMT_DITHER_RAND_R_SEED                                                0x1bf3
+#define mmFMT0_FMT_DITHER_RAND_R_SEED                                           0x1bf3
+#define mmFMT1_FMT_DITHER_RAND_R_SEED                                           0x1df3
+#define mmFMT2_FMT_DITHER_RAND_R_SEED                                           0x1ff3
+#define mmFMT3_FMT_DITHER_RAND_R_SEED                                           0x41f3
+#define mmFMT4_FMT_DITHER_RAND_R_SEED                                           0x43f3
+#define mmFMT5_FMT_DITHER_RAND_R_SEED                                           0x45f3
+#define mmFMT_DITHER_RAND_G_SEED                                                0x1bf4
+#define mmFMT0_FMT_DITHER_RAND_G_SEED                                           0x1bf4
+#define mmFMT1_FMT_DITHER_RAND_G_SEED                                           0x1df4
+#define mmFMT2_FMT_DITHER_RAND_G_SEED                                           0x1ff4
+#define mmFMT3_FMT_DITHER_RAND_G_SEED                                           0x41f4
+#define mmFMT4_FMT_DITHER_RAND_G_SEED                                           0x43f4
+#define mmFMT5_FMT_DITHER_RAND_G_SEED                                           0x45f4
+#define mmFMT_DITHER_RAND_B_SEED                                                0x1bf5
+#define mmFMT0_FMT_DITHER_RAND_B_SEED                                           0x1bf5
+#define mmFMT1_FMT_DITHER_RAND_B_SEED                                           0x1df5
+#define mmFMT2_FMT_DITHER_RAND_B_SEED                                           0x1ff5
+#define mmFMT3_FMT_DITHER_RAND_B_SEED                                           0x41f5
+#define mmFMT4_FMT_DITHER_RAND_B_SEED                                           0x43f5
+#define mmFMT5_FMT_DITHER_RAND_B_SEED                                           0x45f5
+#define mmFMT_TEMPORAL_DITHER_PATTERN_CONTROL                                   0x1bf6
+#define mmFMT0_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x1bf6
+#define mmFMT1_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x1df6
+#define mmFMT2_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x1ff6
+#define mmFMT3_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x41f6
+#define mmFMT4_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x43f6
+#define mmFMT5_FMT_TEMPORAL_DITHER_PATTERN_CONTROL                              0x45f6
+#define mmFMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                     0x1bf7
+#define mmFMT0_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x1bf7
+#define mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x1df7
+#define mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x1ff7
+#define mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x41f7
+#define mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x43f7
+#define mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_S_MATRIX                0x45f7
+#define mmFMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                     0x1bf8
+#define mmFMT0_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x1bf8
+#define mmFMT1_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x1df8
+#define mmFMT2_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x1ff8
+#define mmFMT3_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x41f8
+#define mmFMT4_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x43f8
+#define mmFMT5_FMT_TEMPORAL_DITHER_PROGRAMMABLE_PATTERN_T_MATRIX                0x45f8
+#define mmFMT_CLAMP_CNTL                                                        0x1bf9
+#define mmFMT0_FMT_CLAMP_CNTL                                                   0x1bf9
+#define mmFMT1_FMT_CLAMP_CNTL                                                   0x1df9
+#define mmFMT2_FMT_CLAMP_CNTL                                                   0x1ff9
+#define mmFMT3_FMT_CLAMP_CNTL                                                   0x41f9
+#define mmFMT4_FMT_CLAMP_CNTL                                                   0x43f9
+#define mmFMT5_FMT_CLAMP_CNTL                                                   0x45f9
+#define mmFMT_CRC_CNTL                                                          0x1bfa
+#define mmFMT0_FMT_CRC_CNTL                                                     0x1bfa
+#define mmFMT1_FMT_CRC_CNTL                                                     0x1dfa
+#define mmFMT2_FMT_CRC_CNTL                                                     0x1ffa
+#define mmFMT3_FMT_CRC_CNTL                                                     0x41fa
+#define mmFMT4_FMT_CRC_CNTL                                                     0x43fa
+#define mmFMT5_FMT_CRC_CNTL                                                     0x45fa
+#define mmFMT_CRC_SIG_RED_GREEN_MASK                                            0x1bfb
+#define mmFMT0_FMT_CRC_SIG_RED_GREEN_MASK                                       0x1bfb
+#define mmFMT1_FMT_CRC_SIG_RED_GREEN_MASK                                       0x1dfb
+#define mmFMT2_FMT_CRC_SIG_RED_GREEN_MASK                                       0x1ffb
+#define mmFMT3_FMT_CRC_SIG_RED_GREEN_MASK                                       0x41fb
+#define mmFMT4_FMT_CRC_SIG_RED_GREEN_MASK                                       0x43fb
+#define mmFMT5_FMT_CRC_SIG_RED_GREEN_MASK                                       0x45fb
+#define mmFMT_CRC_SIG_BLUE_CONTROL_MASK                                         0x1bfc
+#define mmFMT0_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x1bfc
+#define mmFMT1_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x1dfc
+#define mmFMT2_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x1ffc
+#define mmFMT3_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x41fc
+#define mmFMT4_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x43fc
+#define mmFMT5_FMT_CRC_SIG_BLUE_CONTROL_MASK                                    0x45fc
+#define mmFMT_CRC_SIG_RED_GREEN                                                 0x1bfd
+#define mmFMT0_FMT_CRC_SIG_RED_GREEN                                            0x1bfd
+#define mmFMT1_FMT_CRC_SIG_RED_GREEN                                            0x1dfd
+#define mmFMT2_FMT_CRC_SIG_RED_GREEN                                            0x1ffd
+#define mmFMT3_FMT_CRC_SIG_RED_GREEN                                            0x41fd
+#define mmFMT4_FMT_CRC_SIG_RED_GREEN                                            0x43fd
+#define mmFMT5_FMT_CRC_SIG_RED_GREEN                                            0x45fd
+#define mmFMT_CRC_SIG_BLUE_CONTROL                                              0x1bfe
+#define mmFMT0_FMT_CRC_SIG_BLUE_CONTROL                                         0x1bfe
+#define mmFMT1_FMT_CRC_SIG_BLUE_CONTROL                                         0x1dfe
+#define mmFMT2_FMT_CRC_SIG_BLUE_CONTROL                                         0x1ffe
+#define mmFMT3_FMT_CRC_SIG_BLUE_CONTROL                                         0x41fe
+#define mmFMT4_FMT_CRC_SIG_BLUE_CONTROL                                         0x43fe
+#define mmFMT5_FMT_CRC_SIG_BLUE_CONTROL                                         0x45fe
+#define mmFMT_DEBUG_CNTL                                                        0x1bff
+#define mmFMT0_FMT_DEBUG_CNTL                                                   0x1bff
+#define mmFMT1_FMT_DEBUG_CNTL                                                   0x1dff
+#define mmFMT2_FMT_DEBUG_CNTL                                                   0x1fff
+#define mmFMT3_FMT_DEBUG_CNTL                                                   0x41ff
+#define mmFMT4_FMT_DEBUG_CNTL                                                   0x43ff
+#define mmFMT5_FMT_DEBUG_CNTL                                                   0x45ff
+#define mmFMT_SIDE_BY_SIDE_STEREO_CONTROL                                       0x1bf0
+#define mmFMT0_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x1bf0
+#define mmFMT1_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x1df0
+#define mmFMT2_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x1ff0
+#define mmFMT3_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x41f0
+#define mmFMT4_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x43f0
+#define mmFMT5_FMT_SIDE_BY_SIDE_STEREO_CONTROL                                  0x45f0
+#define mmFMT_420_HBLANK_EARLY_START                                            0x1bf1
+#define mmFMT0_FMT_420_HBLANK_EARLY_START                                       0x1bf1
+#define mmFMT1_FMT_420_HBLANK_EARLY_START                                       0x1df1
+#define mmFMT2_FMT_420_HBLANK_EARLY_START                                       0x1ff1
+#define mmFMT3_FMT_420_HBLANK_EARLY_START                                       0x41f1
+#define mmFMT4_FMT_420_HBLANK_EARLY_START                                       0x43f1
+#define mmFMT5_FMT_420_HBLANK_EARLY_START                                       0x45f1
+#define mmFMT_TEST_DEBUG_INDEX                                                  0x1beb
+#define mmFMT0_FMT_TEST_DEBUG_INDEX                                             0x1beb
+#define mmFMT1_FMT_TEST_DEBUG_INDEX                                             0x1deb
+#define mmFMT2_FMT_TEST_DEBUG_INDEX                                             0x1feb
+#define mmFMT3_FMT_TEST_DEBUG_INDEX                                             0x41eb
+#define mmFMT4_FMT_TEST_DEBUG_INDEX                                             0x43eb
+#define mmFMT5_FMT_TEST_DEBUG_INDEX                                             0x45eb
+#define mmFMT_TEST_DEBUG_DATA                                                   0x1bec
+#define mmFMT0_FMT_TEST_DEBUG_DATA                                              0x1bec
+#define mmFMT1_FMT_TEST_DEBUG_DATA                                              0x1dec
+#define mmFMT2_FMT_TEST_DEBUG_DATA                                              0x1fec
+#define mmFMT3_FMT_TEST_DEBUG_DATA                                              0x41ec
+#define mmFMT4_FMT_TEST_DEBUG_DATA                                              0x43ec
+#define mmFMT5_FMT_TEST_DEBUG_DATA                                              0x45ec
+#define ixFMT_DEBUG0                                                            0x1
+#define ixFMT_DEBUG1                                                            0x2
+#define ixFMT_DEBUG2                                                            0x3
+#define ixFMT_DEBUG3                                                            0x4
+#define ixFMT_DEBUG_ID                                                          0x0
+#define mmLB_DATA_FORMAT                                                        0x1ac0
+#define mmLB0_LB_DATA_FORMAT                                                    0x1ac0
+#define mmLB1_LB_DATA_FORMAT                                                    0x1cc0
+#define mmLB2_LB_DATA_FORMAT                                                    0x1ec0
+#define mmLB3_LB_DATA_FORMAT                                                    0x40c0
+#define mmLB4_LB_DATA_FORMAT                                                    0x42c0
+#define mmLB5_LB_DATA_FORMAT                                                    0x44c0
+#define mmLB_MEMORY_CTRL                                                        0x1ac1
+#define mmLB0_LB_MEMORY_CTRL                                                    0x1ac1
+#define mmLB1_LB_MEMORY_CTRL                                                    0x1cc1
+#define mmLB2_LB_MEMORY_CTRL                                                    0x1ec1
+#define mmLB3_LB_MEMORY_CTRL                                                    0x40c1
+#define mmLB4_LB_MEMORY_CTRL                                                    0x42c1
+#define mmLB5_LB_MEMORY_CTRL                                                    0x44c1
+#define mmLB_MEMORY_SIZE_STATUS                                                 0x1ac2
+#define mmLB0_LB_MEMORY_SIZE_STATUS                                             0x1ac2
+#define mmLB1_LB_MEMORY_SIZE_STATUS                                             0x1cc2
+#define mmLB2_LB_MEMORY_SIZE_STATUS                                             0x1ec2
+#define mmLB3_LB_MEMORY_SIZE_STATUS                                             0x40c2
+#define mmLB4_LB_MEMORY_SIZE_STATUS                                             0x42c2
+#define mmLB5_LB_MEMORY_SIZE_STATUS                                             0x44c2
+#define mmLB_DESKTOP_HEIGHT                                                     0x1ac3
+#define mmLB0_LB_DESKTOP_HEIGHT                                                 0x1ac3
+#define mmLB1_LB_DESKTOP_HEIGHT                                                 0x1cc3
+#define mmLB2_LB_DESKTOP_HEIGHT                                                 0x1ec3
+#define mmLB3_LB_DESKTOP_HEIGHT                                                 0x40c3
+#define mmLB4_LB_DESKTOP_HEIGHT                                                 0x42c3
+#define mmLB5_LB_DESKTOP_HEIGHT                                                 0x44c3
+#define mmLB_VLINE_START_END                                                    0x1ac4
+#define mmLB0_LB_VLINE_START_END                                                0x1ac4
+#define mmLB1_LB_VLINE_START_END                                                0x1cc4
+#define mmLB2_LB_VLINE_START_END                                                0x1ec4
+#define mmLB3_LB_VLINE_START_END                                                0x40c4
+#define mmLB4_LB_VLINE_START_END                                                0x42c4
+#define mmLB5_LB_VLINE_START_END                                                0x44c4
+#define mmLB_VLINE2_START_END                                                   0x1ac5
+#define mmLB0_LB_VLINE2_START_END                                               0x1ac5
+#define mmLB1_LB_VLINE2_START_END                                               0x1cc5
+#define mmLB2_LB_VLINE2_START_END                                               0x1ec5
+#define mmLB3_LB_VLINE2_START_END                                               0x40c5
+#define mmLB4_LB_VLINE2_START_END                                               0x42c5
+#define mmLB5_LB_VLINE2_START_END                                               0x44c5
+#define mmLB_V_COUNTER                                                          0x1ac6
+#define mmLB0_LB_V_COUNTER                                                      0x1ac6
+#define mmLB1_LB_V_COUNTER                                                      0x1cc6
+#define mmLB2_LB_V_COUNTER                                                      0x1ec6
+#define mmLB3_LB_V_COUNTER                                                      0x40c6
+#define mmLB4_LB_V_COUNTER                                                      0x42c6
+#define mmLB5_LB_V_COUNTER                                                      0x44c6
+#define mmLB_SNAPSHOT_V_COUNTER                                                 0x1ac7
+#define mmLB0_LB_SNAPSHOT_V_COUNTER                                             0x1ac7
+#define mmLB1_LB_SNAPSHOT_V_COUNTER                                             0x1cc7
+#define mmLB2_LB_SNAPSHOT_V_COUNTER                                             0x1ec7
+#define mmLB3_LB_SNAPSHOT_V_COUNTER                                             0x40c7
+#define mmLB4_LB_SNAPSHOT_V_COUNTER                                             0x42c7
+#define mmLB5_LB_SNAPSHOT_V_COUNTER                                             0x44c7
+#define mmLB_INTERRUPT_MASK                                                     0x1ac8
+#define mmLB0_LB_INTERRUPT_MASK                                                 0x1ac8
+#define mmLB1_LB_INTERRUPT_MASK                                                 0x1cc8
+#define mmLB2_LB_INTERRUPT_MASK                                                 0x1ec8
+#define mmLB3_LB_INTERRUPT_MASK                                                 0x40c8
+#define mmLB4_LB_INTERRUPT_MASK                                                 0x42c8
+#define mmLB5_LB_INTERRUPT_MASK                                                 0x44c8
+#define mmLB_VLINE_STATUS                                                       0x1ac9
+#define mmLB0_LB_VLINE_STATUS                                                   0x1ac9
+#define mmLB1_LB_VLINE_STATUS                                                   0x1cc9
+#define mmLB2_LB_VLINE_STATUS                                                   0x1ec9
+#define mmLB3_LB_VLINE_STATUS                                                   0x40c9
+#define mmLB4_LB_VLINE_STATUS                                                   0x42c9
+#define mmLB5_LB_VLINE_STATUS                                                   0x44c9
+#define mmLB_VLINE2_STATUS                                                      0x1aca
+#define mmLB0_LB_VLINE2_STATUS                                                  0x1aca
+#define mmLB1_LB_VLINE2_STATUS                                                  0x1cca
+#define mmLB2_LB_VLINE2_STATUS                                                  0x1eca
+#define mmLB3_LB_VLINE2_STATUS                                                  0x40ca
+#define mmLB4_LB_VLINE2_STATUS                                                  0x42ca
+#define mmLB5_LB_VLINE2_STATUS                                                  0x44ca
+#define mmLB_VBLANK_STATUS                                                      0x1acb
+#define mmLB0_LB_VBLANK_STATUS                                                  0x1acb
+#define mmLB1_LB_VBLANK_STATUS                                                  0x1ccb
+#define mmLB2_LB_VBLANK_STATUS                                                  0x1ecb
+#define mmLB3_LB_VBLANK_STATUS                                                  0x40cb
+#define mmLB4_LB_VBLANK_STATUS                                                  0x42cb
+#define mmLB5_LB_VBLANK_STATUS                                                  0x44cb
+#define mmLB_SYNC_RESET_SEL                                                     0x1acc
+#define mmLB0_LB_SYNC_RESET_SEL                                                 0x1acc
+#define mmLB1_LB_SYNC_RESET_SEL                                                 0x1ccc
+#define mmLB2_LB_SYNC_RESET_SEL                                                 0x1ecc
+#define mmLB3_LB_SYNC_RESET_SEL                                                 0x40cc
+#define mmLB4_LB_SYNC_RESET_SEL                                                 0x42cc
+#define mmLB5_LB_SYNC_RESET_SEL                                                 0x44cc
+#define mmLB_BLACK_KEYER_R_CR                                                   0x1acd
+#define mmLB0_LB_BLACK_KEYER_R_CR                                               0x1acd
+#define mmLB1_LB_BLACK_KEYER_R_CR                                               0x1ccd
+#define mmLB2_LB_BLACK_KEYER_R_CR                                               0x1ecd
+#define mmLB3_LB_BLACK_KEYER_R_CR                                               0x40cd
+#define mmLB4_LB_BLACK_KEYER_R_CR                                               0x42cd
+#define mmLB5_LB_BLACK_KEYER_R_CR                                               0x44cd
+#define mmLB_BLACK_KEYER_G_Y                                                    0x1ace
+#define mmLB0_LB_BLACK_KEYER_G_Y                                                0x1ace
+#define mmLB1_LB_BLACK_KEYER_G_Y                                                0x1cce
+#define mmLB2_LB_BLACK_KEYER_G_Y                                                0x1ece
+#define mmLB3_LB_BLACK_KEYER_G_Y                                                0x40ce
+#define mmLB4_LB_BLACK_KEYER_G_Y                                                0x42ce
+#define mmLB5_LB_BLACK_KEYER_G_Y                                                0x44ce
+#define mmLB_BLACK_KEYER_B_CB                                                   0x1acf
+#define mmLB0_LB_BLACK_KEYER_B_CB                                               0x1acf
+#define mmLB1_LB_BLACK_KEYER_B_CB                                               0x1ccf
+#define mmLB2_LB_BLACK_KEYER_B_CB                                               0x1ecf
+#define mmLB3_LB_BLACK_KEYER_B_CB                                               0x40cf
+#define mmLB4_LB_BLACK_KEYER_B_CB                                               0x42cf
+#define mmLB5_LB_BLACK_KEYER_B_CB                                               0x44cf
+#define mmLB_KEYER_COLOR_CTRL                                                   0x1ad0
+#define mmLB0_LB_KEYER_COLOR_CTRL                                               0x1ad0
+#define mmLB1_LB_KEYER_COLOR_CTRL                                               0x1cd0
+#define mmLB2_LB_KEYER_COLOR_CTRL                                               0x1ed0
+#define mmLB3_LB_KEYER_COLOR_CTRL                                               0x40d0
+#define mmLB4_LB_KEYER_COLOR_CTRL                                               0x42d0
+#define mmLB5_LB_KEYER_COLOR_CTRL                                               0x44d0
+#define mmLB_KEYER_COLOR_R_CR                                                   0x1ad1
+#define mmLB0_LB_KEYER_COLOR_R_CR                                               0x1ad1
+#define mmLB1_LB_KEYER_COLOR_R_CR                                               0x1cd1
+#define mmLB2_LB_KEYER_COLOR_R_CR                                               0x1ed1
+#define mmLB3_LB_KEYER_COLOR_R_CR                                               0x40d1
+#define mmLB4_LB_KEYER_COLOR_R_CR                                               0x42d1
+#define mmLB5_LB_KEYER_COLOR_R_CR                                               0x44d1
+#define mmLB_KEYER_COLOR_G_Y                                                    0x1ad2
+#define mmLB0_LB_KEYER_COLOR_G_Y                                                0x1ad2
+#define mmLB1_LB_KEYER_COLOR_G_Y                                                0x1cd2
+#define mmLB2_LB_KEYER_COLOR_G_Y                                                0x1ed2
+#define mmLB3_LB_KEYER_COLOR_G_Y                                                0x40d2
+#define mmLB4_LB_KEYER_COLOR_G_Y                                                0x42d2
+#define mmLB5_LB_KEYER_COLOR_G_Y                                                0x44d2
+#define mmLB_KEYER_COLOR_B_CB                                                   0x1ad3
+#define mmLB0_LB_KEYER_COLOR_B_CB                                               0x1ad3
+#define mmLB1_LB_KEYER_COLOR_B_CB                                               0x1cd3
+#define mmLB2_LB_KEYER_COLOR_B_CB                                               0x1ed3
+#define mmLB3_LB_KEYER_COLOR_B_CB                                               0x40d3
+#define mmLB4_LB_KEYER_COLOR_B_CB                                               0x42d3
+#define mmLB5_LB_KEYER_COLOR_B_CB                                               0x44d3
+#define mmLB_KEYER_COLOR_REP_R_CR                                               0x1ad4
+#define mmLB0_LB_KEYER_COLOR_REP_R_CR                                           0x1ad4
+#define mmLB1_LB_KEYER_COLOR_REP_R_CR                                           0x1cd4
+#define mmLB2_LB_KEYER_COLOR_REP_R_CR                                           0x1ed4
+#define mmLB3_LB_KEYER_COLOR_REP_R_CR                                           0x40d4
+#define mmLB4_LB_KEYER_COLOR_REP_R_CR                                           0x42d4
+#define mmLB5_LB_KEYER_COLOR_REP_R_CR                                           0x44d4
+#define mmLB_KEYER_COLOR_REP_G_Y                                                0x1ad5
+#define mmLB0_LB_KEYER_COLOR_REP_G_Y                                            0x1ad5
+#define mmLB1_LB_KEYER_COLOR_REP_G_Y                                            0x1cd5
+#define mmLB2_LB_KEYER_COLOR_REP_G_Y                                            0x1ed5
+#define mmLB3_LB_KEYER_COLOR_REP_G_Y                                            0x40d5
+#define mmLB4_LB_KEYER_COLOR_REP_G_Y                                            0x42d5
+#define mmLB5_LB_KEYER_COLOR_REP_G_Y                                            0x44d5
+#define mmLB_KEYER_COLOR_REP_B_CB                                               0x1ad6
+#define mmLB0_LB_KEYER_COLOR_REP_B_CB                                           0x1ad6
+#define mmLB1_LB_KEYER_COLOR_REP_B_CB                                           0x1cd6
+#define mmLB2_LB_KEYER_COLOR_REP_B_CB                                           0x1ed6
+#define mmLB3_LB_KEYER_COLOR_REP_B_CB                                           0x40d6
+#define mmLB4_LB_KEYER_COLOR_REP_B_CB                                           0x42d6
+#define mmLB5_LB_KEYER_COLOR_REP_B_CB                                           0x44d6
+#define mmLB_BUFFER_LEVEL_STATUS                                                0x1ad7
+#define mmLB0_LB_BUFFER_LEVEL_STATUS                                            0x1ad7
+#define mmLB1_LB_BUFFER_LEVEL_STATUS                                            0x1cd7
+#define mmLB2_LB_BUFFER_LEVEL_STATUS                                            0x1ed7
+#define mmLB3_LB_BUFFER_LEVEL_STATUS                                            0x40d7
+#define mmLB4_LB_BUFFER_LEVEL_STATUS                                            0x42d7
+#define mmLB5_LB_BUFFER_LEVEL_STATUS                                            0x44d7
+#define mmLB_BUFFER_URGENCY_CTRL                                                0x1ad8
+#define mmLB0_LB_BUFFER_URGENCY_CTRL                                            0x1ad8
+#define mmLB1_LB_BUFFER_URGENCY_CTRL                                            0x1cd8
+#define mmLB2_LB_BUFFER_URGENCY_CTRL                                            0x1ed8
+#define mmLB3_LB_BUFFER_URGENCY_CTRL                                            0x40d8
+#define mmLB4_LB_BUFFER_URGENCY_CTRL                                            0x42d8
+#define mmLB5_LB_BUFFER_URGENCY_CTRL                                            0x44d8
+#define mmLB_BUFFER_URGENCY_STATUS                                              0x1ad9
+#define mmLB0_LB_BUFFER_URGENCY_STATUS                                          0x1ad9
+#define mmLB1_LB_BUFFER_URGENCY_STATUS                                          0x1cd9
+#define mmLB2_LB_BUFFER_URGENCY_STATUS                                          0x1ed9
+#define mmLB3_LB_BUFFER_URGENCY_STATUS                                          0x40d9
+#define mmLB4_LB_BUFFER_URGENCY_STATUS                                          0x42d9
+#define mmLB5_LB_BUFFER_URGENCY_STATUS                                          0x44d9
+#define mmLB_BUFFER_STATUS                                                      0x1ada
+#define mmLB0_LB_BUFFER_STATUS                                                  0x1ada
+#define mmLB1_LB_BUFFER_STATUS                                                  0x1cda
+#define mmLB2_LB_BUFFER_STATUS                                                  0x1eda
+#define mmLB3_LB_BUFFER_STATUS                                                  0x40da
+#define mmLB4_LB_BUFFER_STATUS                                                  0x42da
+#define mmLB5_LB_BUFFER_STATUS                                                  0x44da
+#define mmLB_NO_OUTSTANDING_REQ_STATUS                                          0x1adc
+#define mmLB0_LB_NO_OUTSTANDING_REQ_STATUS                                      0x1adc
+#define mmLB1_LB_NO_OUTSTANDING_REQ_STATUS                                      0x1cdc
+#define mmLB2_LB_NO_OUTSTANDING_REQ_STATUS                                      0x1edc
+#define mmLB3_LB_NO_OUTSTANDING_REQ_STATUS                                      0x40dc
+#define mmLB4_LB_NO_OUTSTANDING_REQ_STATUS                                      0x42dc
+#define mmLB5_LB_NO_OUTSTANDING_REQ_STATUS                                      0x44dc
+#define mmMVP_AFR_FLIP_MODE                                                     0x1ae0
+#define mmLB0_MVP_AFR_FLIP_MODE                                                 0x1ae0
+#define mmLB1_MVP_AFR_FLIP_MODE                                                 0x1ce0
+#define mmLB2_MVP_AFR_FLIP_MODE                                                 0x1ee0
+#define mmLB3_MVP_AFR_FLIP_MODE                                                 0x40e0
+#define mmLB4_MVP_AFR_FLIP_MODE                                                 0x42e0
+#define mmLB5_MVP_AFR_FLIP_MODE                                                 0x44e0
+#define mmMVP_AFR_FLIP_FIFO_CNTL                                                0x1ae1
+#define mmLB0_MVP_AFR_FLIP_FIFO_CNTL                                            0x1ae1
+#define mmLB1_MVP_AFR_FLIP_FIFO_CNTL                                            0x1ce1
+#define mmLB2_MVP_AFR_FLIP_FIFO_CNTL                                            0x1ee1
+#define mmLB3_MVP_AFR_FLIP_FIFO_CNTL                                            0x40e1
+#define mmLB4_MVP_AFR_FLIP_FIFO_CNTL                                            0x42e1
+#define mmLB5_MVP_AFR_FLIP_FIFO_CNTL                                            0x44e1
+#define mmMVP_FLIP_LINE_NUM_INSERT                                              0x1ae2
+#define mmLB0_MVP_FLIP_LINE_NUM_INSERT                                          0x1ae2
+#define mmLB1_MVP_FLIP_LINE_NUM_INSERT                                          0x1ce2
+#define mmLB2_MVP_FLIP_LINE_NUM_INSERT                                          0x1ee2
+#define mmLB3_MVP_FLIP_LINE_NUM_INSERT                                          0x40e2
+#define mmLB4_MVP_FLIP_LINE_NUM_INSERT                                          0x42e2
+#define mmLB5_MVP_FLIP_LINE_NUM_INSERT                                          0x44e2
+#define mmDC_MVP_LB_CONTROL                                                     0x1ae3
+#define mmLB0_DC_MVP_LB_CONTROL                                                 0x1ae3
+#define mmLB1_DC_MVP_LB_CONTROL                                                 0x1ce3
+#define mmLB2_DC_MVP_LB_CONTROL                                                 0x1ee3
+#define mmLB3_DC_MVP_LB_CONTROL                                                 0x40e3
+#define mmLB4_DC_MVP_LB_CONTROL                                                 0x42e3
+#define mmLB5_DC_MVP_LB_CONTROL                                                 0x44e3
+#define mmLB_DEBUG                                                              0x1ae4
+#define mmLB0_LB_DEBUG                                                          0x1ae4
+#define mmLB1_LB_DEBUG                                                          0x1ce4
+#define mmLB2_LB_DEBUG                                                          0x1ee4
+#define mmLB3_LB_DEBUG                                                          0x40e4
+#define mmLB4_LB_DEBUG                                                          0x42e4
+#define mmLB5_LB_DEBUG                                                          0x44e4
+#define mmLB_DEBUG2                                                             0x1ae5
+#define mmLB0_LB_DEBUG2                                                         0x1ae5
+#define mmLB1_LB_DEBUG2                                                         0x1ce5
+#define mmLB2_LB_DEBUG2                                                         0x1ee5
+#define mmLB3_LB_DEBUG2                                                         0x40e5
+#define mmLB4_LB_DEBUG2                                                         0x42e5
+#define mmLB5_LB_DEBUG2                                                         0x44e5
+#define mmLB_DEBUG3                                                             0x1ae6
+#define mmLB0_LB_DEBUG3                                                         0x1ae6
+#define mmLB1_LB_DEBUG3                                                         0x1ce6
+#define mmLB2_LB_DEBUG3                                                         0x1ee6
+#define mmLB3_LB_DEBUG3                                                         0x40e6
+#define mmLB4_LB_DEBUG3                                                         0x42e6
+#define mmLB5_LB_DEBUG3                                                         0x44e6
+#define mmLB_TEST_DEBUG_INDEX                                                   0x1afe
+#define mmLB0_LB_TEST_DEBUG_INDEX                                               0x1afe
+#define mmLB1_LB_TEST_DEBUG_INDEX                                               0x1cfe
+#define mmLB2_LB_TEST_DEBUG_INDEX                                               0x1efe
+#define mmLB3_LB_TEST_DEBUG_INDEX                                               0x40fe
+#define mmLB4_LB_TEST_DEBUG_INDEX                                               0x42fe
+#define mmLB5_LB_TEST_DEBUG_INDEX                                               0x44fe
+#define mmLB_TEST_DEBUG_DATA                                                    0x1aff
+#define mmLB0_LB_TEST_DEBUG_DATA                                                0x1aff
+#define mmLB1_LB_TEST_DEBUG_DATA                                                0x1cff
+#define mmLB2_LB_TEST_DEBUG_DATA                                                0x1eff
+#define mmLB3_LB_TEST_DEBUG_DATA                                                0x40ff
+#define mmLB4_LB_TEST_DEBUG_DATA                                                0x42ff
+#define mmLB5_LB_TEST_DEBUG_DATA                                                0x44ff
+#define mmLBV_DATA_FORMAT                                                       0x463c
+#define mmLBV0_LBV_DATA_FORMAT                                                  0x463c
+#define mmLBV1_LBV_DATA_FORMAT                                                  0x983c
+#define mmLBV_MEMORY_CTRL                                                       0x463d
+#define mmLBV0_LBV_MEMORY_CTRL                                                  0x463d
+#define mmLBV1_LBV_MEMORY_CTRL                                                  0x983d
+#define mmLBV_MEMORY_SIZE_STATUS                                                0x463e
+#define mmLBV0_LBV_MEMORY_SIZE_STATUS                                           0x463e
+#define mmLBV1_LBV_MEMORY_SIZE_STATUS                                           0x983e
+#define mmLBV_DESKTOP_HEIGHT                                                    0x463f
+#define mmLBV0_LBV_DESKTOP_HEIGHT                                               0x463f
+#define mmLBV1_LBV_DESKTOP_HEIGHT                                               0x983f
+#define mmLBV_VLINE_START_END                                                   0x4640
+#define mmLBV0_LBV_VLINE_START_END                                              0x4640
+#define mmLBV1_LBV_VLINE_START_END                                              0x9840
+#define mmLBV_VLINE2_START_END                                                  0x4641
+#define mmLBV0_LBV_VLINE2_START_END                                             0x4641
+#define mmLBV1_LBV_VLINE2_START_END                                             0x9841
+#define mmLBV_V_COUNTER                                                         0x4642
+#define mmLBV0_LBV_V_COUNTER                                                    0x4642
+#define mmLBV1_LBV_V_COUNTER                                                    0x9842
+#define mmLBV_SNAPSHOT_V_COUNTER                                                0x4643
+#define mmLBV0_LBV_SNAPSHOT_V_COUNTER                                           0x4643
+#define mmLBV1_LBV_SNAPSHOT_V_COUNTER                                           0x9843
+#define mmLBV_V_COUNTER_CHROMA                                                  0x4644
+#define mmLBV0_LBV_V_COUNTER_CHROMA                                             0x4644
+#define mmLBV1_LBV_V_COUNTER_CHROMA                                             0x9844
+#define mmLBV_SNAPSHOT_V_COUNTER_CHROMA                                         0x4645
+#define mmLBV0_LBV_SNAPSHOT_V_COUNTER_CHROMA                                    0x4645
+#define mmLBV1_LBV_SNAPSHOT_V_COUNTER_CHROMA                                    0x9845
+#define mmLBV_INTERRUPT_MASK                                                    0x4646
+#define mmLBV0_LBV_INTERRUPT_MASK                                               0x4646
+#define mmLBV1_LBV_INTERRUPT_MASK                                               0x9846
+#define mmLBV_VLINE_STATUS                                                      0x4647
+#define mmLBV0_LBV_VLINE_STATUS                                                 0x4647
+#define mmLBV1_LBV_VLINE_STATUS                                                 0x9847
+#define mmLBV_VLINE2_STATUS                                                     0x4648
+#define mmLBV0_LBV_VLINE2_STATUS                                                0x4648
+#define mmLBV1_LBV_VLINE2_STATUS                                                0x9848
+#define mmLBV_VBLANK_STATUS                                                     0x4649
+#define mmLBV0_LBV_VBLANK_STATUS                                                0x4649
+#define mmLBV1_LBV_VBLANK_STATUS                                                0x9849
+#define mmLBV_SYNC_RESET_SEL                                                    0x464a
+#define mmLBV0_LBV_SYNC_RESET_SEL                                               0x464a
+#define mmLBV1_LBV_SYNC_RESET_SEL                                               0x984a
+#define mmLBV_BLACK_KEYER_R_CR                                                  0x464b
+#define mmLBV0_LBV_BLACK_KEYER_R_CR                                             0x464b
+#define mmLBV1_LBV_BLACK_KEYER_R_CR                                             0x984b
+#define mmLBV_BLACK_KEYER_G_Y                                                   0x464c
+#define mmLBV0_LBV_BLACK_KEYER_G_Y                                              0x464c
+#define mmLBV1_LBV_BLACK_KEYER_G_Y                                              0x984c
+#define mmLBV_BLACK_KEYER_B_CB                                                  0x464d
+#define mmLBV0_LBV_BLACK_KEYER_B_CB                                             0x464d
+#define mmLBV1_LBV_BLACK_KEYER_B_CB                                             0x984d
+#define mmLBV_KEYER_COLOR_CTRL                                                  0x464e
+#define mmLBV0_LBV_KEYER_COLOR_CTRL                                             0x464e
+#define mmLBV1_LBV_KEYER_COLOR_CTRL                                             0x984e
+#define mmLBV_KEYER_COLOR_R_CR                                                  0x464f
+#define mmLBV0_LBV_KEYER_COLOR_R_CR                                             0x464f
+#define mmLBV1_LBV_KEYER_COLOR_R_CR                                             0x984f
+#define mmLBV_KEYER_COLOR_G_Y                                                   0x4650
+#define mmLBV0_LBV_KEYER_COLOR_G_Y                                              0x4650
+#define mmLBV1_LBV_KEYER_COLOR_G_Y                                              0x9850
+#define mmLBV_KEYER_COLOR_B_CB                                                  0x4651
+#define mmLBV0_LBV_KEYER_COLOR_B_CB                                             0x4651
+#define mmLBV1_LBV_KEYER_COLOR_B_CB                                             0x9851
+#define mmLBV_KEYER_COLOR_REP_R_CR                                              0x4652
+#define mmLBV0_LBV_KEYER_COLOR_REP_R_CR                                         0x4652
+#define mmLBV1_LBV_KEYER_COLOR_REP_R_CR                                         0x9852
+#define mmLBV_KEYER_COLOR_REP_G_Y                                               0x4653
+#define mmLBV0_LBV_KEYER_COLOR_REP_G_Y                                          0x4653
+#define mmLBV1_LBV_KEYER_COLOR_REP_G_Y                                          0x9853
+#define mmLBV_KEYER_COLOR_REP_B_CB                                              0x4654
+#define mmLBV0_LBV_KEYER_COLOR_REP_B_CB                                         0x4654
+#define mmLBV1_LBV_KEYER_COLOR_REP_B_CB                                         0x9854
+#define mmLBV_BUFFER_LEVEL_STATUS                                               0x4655
+#define mmLBV0_LBV_BUFFER_LEVEL_STATUS                                          0x4655
+#define mmLBV1_LBV_BUFFER_LEVEL_STATUS                                          0x9855
+#define mmLBV_BUFFER_URGENCY_CTRL                                               0x4656
+#define mmLBV0_LBV_BUFFER_URGENCY_CTRL                                          0x4656
+#define mmLBV1_LBV_BUFFER_URGENCY_CTRL                                          0x9856
+#define mmLBV_BUFFER_URGENCY_STATUS                                             0x4657
+#define mmLBV0_LBV_BUFFER_URGENCY_STATUS                                        0x4657
+#define mmLBV1_LBV_BUFFER_URGENCY_STATUS                                        0x9857
+#define mmLBV_BUFFER_STATUS                                                     0x4658
+#define mmLBV0_LBV_BUFFER_STATUS                                                0x4658
+#define mmLBV1_LBV_BUFFER_STATUS                                                0x9858
+#define mmLBV_NO_OUTSTANDING_REQ_STATUS                                         0x4659
+#define mmLBV0_LBV_NO_OUTSTANDING_REQ_STATUS                                    0x4659
+#define mmLBV1_LBV_NO_OUTSTANDING_REQ_STATUS                                    0x9859
+#define mmLBV_DEBUG                                                             0x465a
+#define mmLBV0_LBV_DEBUG                                                        0x465a
+#define mmLBV1_LBV_DEBUG                                                        0x985a
+#define mmLBV_DEBUG2                                                            0x465b
+#define mmLBV0_LBV_DEBUG2                                                       0x465b
+#define mmLBV1_LBV_DEBUG2                                                       0x985b
+#define mmLBV_DEBUG3                                                            0x465c
+#define mmLBV0_LBV_DEBUG3                                                       0x465c
+#define mmLBV1_LBV_DEBUG3                                                       0x985c
+#define mmLBV_TEST_DEBUG_INDEX                                                  0x4666
+#define mmLBV0_LBV_TEST_DEBUG_INDEX                                             0x4666
+#define mmLBV1_LBV_TEST_DEBUG_INDEX                                             0x9866
+#define mmLBV_TEST_DEBUG_DATA                                                   0x4667
+#define mmLBV0_LBV_TEST_DEBUG_DATA                                              0x4667
+#define mmLBV1_LBV_TEST_DEBUG_DATA                                              0x9867
+#define mmMVP_CONTROL1                                                          0x2ac
+#define mmMVP_CONTROL2                                                          0x2ad
+#define mmMVP_FIFO_CONTROL                                                      0x2ae
+#define mmMVP_FIFO_STATUS                                                       0x2af
+#define mmMVP_SLAVE_STATUS                                                      0x2b0
+#define mmMVP_INBAND_CNTL_CAP                                                   0x2b1
+#define mmMVP_BLACK_KEYER                                                       0x2b2
+#define mmMVP_CRC_CNTL                                                          0x2b3
+#define mmMVP_CRC_RESULT_BLUE_GREEN                                             0x2b4
+#define mmMVP_CRC_RESULT_RED                                                    0x2b5
+#define mmMVP_CONTROL3                                                          0x2b6
+#define mmMVP_RECEIVE_CNT_CNTL1                                                 0x2b7
+#define mmMVP_RECEIVE_CNT_CNTL2                                                 0x2b8
+#define mmMVP_DEBUG                                                             0x2bb
+#define mmMVP_TEST_DEBUG_INDEX                                                  0x2b9
+#define mmMVP_TEST_DEBUG_DATA                                                   0x2ba
+#define ixMVP_DEBUG_12                                                          0xc
+#define ixMVP_DEBUG_13                                                          0xd
+#define ixMVP_DEBUG_14                                                          0xe
+#define ixMVP_DEBUG_15                                                          0xf
+#define ixMVP_DEBUG_16                                                          0x10
+#define ixMVP_DEBUG_17                                                          0x11
+#define mmSCL_COEF_RAM_SELECT                                                   0x1b40
+#define mmSCL0_SCL_COEF_RAM_SELECT                                              0x1b40
+#define mmSCL1_SCL_COEF_RAM_SELECT                                              0x1d40
+#define mmSCL2_SCL_COEF_RAM_SELECT                                              0x1f40
+#define mmSCL3_SCL_COEF_RAM_SELECT                                              0x4140
+#define mmSCL4_SCL_COEF_RAM_SELECT                                              0x4340
+#define mmSCL5_SCL_COEF_RAM_SELECT                                              0x4540
+#define mmSCL_COEF_RAM_TAP_DATA                                                 0x1b41
+#define mmSCL0_SCL_COEF_RAM_TAP_DATA                                            0x1b41
+#define mmSCL1_SCL_COEF_RAM_TAP_DATA                                            0x1d41
+#define mmSCL2_SCL_COEF_RAM_TAP_DATA                                            0x1f41
+#define mmSCL3_SCL_COEF_RAM_TAP_DATA                                            0x4141
+#define mmSCL4_SCL_COEF_RAM_TAP_DATA                                            0x4341
+#define mmSCL5_SCL_COEF_RAM_TAP_DATA                                            0x4541
+#define mmSCL_MODE                                                              0x1b42
+#define mmSCL0_SCL_MODE                                                         0x1b42
+#define mmSCL1_SCL_MODE                                                         0x1d42
+#define mmSCL2_SCL_MODE                                                         0x1f42
+#define mmSCL3_SCL_MODE                                                         0x4142
+#define mmSCL4_SCL_MODE                                                         0x4342
+#define mmSCL5_SCL_MODE                                                         0x4542
+#define mmSCL_TAP_CONTROL                                                       0x1b43
+#define mmSCL0_SCL_TAP_CONTROL                                                  0x1b43
+#define mmSCL1_SCL_TAP_CONTROL                                                  0x1d43
+#define mmSCL2_SCL_TAP_CONTROL                                                  0x1f43
+#define mmSCL3_SCL_TAP_CONTROL                                                  0x4143
+#define mmSCL4_SCL_TAP_CONTROL                                                  0x4343
+#define mmSCL5_SCL_TAP_CONTROL                                                  0x4543
+#define mmSCL_CONTROL                                                           0x1b44
+#define mmSCL0_SCL_CONTROL                                                      0x1b44
+#define mmSCL1_SCL_CONTROL                                                      0x1d44
+#define mmSCL2_SCL_CONTROL                                                      0x1f44
+#define mmSCL3_SCL_CONTROL                                                      0x4144
+#define mmSCL4_SCL_CONTROL                                                      0x4344
+#define mmSCL5_SCL_CONTROL                                                      0x4544
+#define mmSCL_BYPASS_CONTROL                                                    0x1b45
+#define mmSCL0_SCL_BYPASS_CONTROL                                               0x1b45
+#define mmSCL1_SCL_BYPASS_CONTROL                                               0x1d45
+#define mmSCL2_SCL_BYPASS_CONTROL                                               0x1f45
+#define mmSCL3_SCL_BYPASS_CONTROL                                               0x4145
+#define mmSCL4_SCL_BYPASS_CONTROL                                               0x4345
+#define mmSCL5_SCL_BYPASS_CONTROL                                               0x4545
+#define mmSCL_MANUAL_REPLICATE_CONTROL                                          0x1b46
+#define mmSCL0_SCL_MANUAL_REPLICATE_CONTROL                                     0x1b46
+#define mmSCL1_SCL_MANUAL_REPLICATE_CONTROL                                     0x1d46
+#define mmSCL2_SCL_MANUAL_REPLICATE_CONTROL                                     0x1f46
+#define mmSCL3_SCL_MANUAL_REPLICATE_CONTROL                                     0x4146
+#define mmSCL4_SCL_MANUAL_REPLICATE_CONTROL                                     0x4346
+#define mmSCL5_SCL_MANUAL_REPLICATE_CONTROL                                     0x4546
+#define mmSCL_AUTOMATIC_MODE_CONTROL                                            0x1b47
+#define mmSCL0_SCL_AUTOMATIC_MODE_CONTROL                                       0x1b47
+#define mmSCL1_SCL_AUTOMATIC_MODE_CONTROL                                       0x1d47
+#define mmSCL2_SCL_AUTOMATIC_MODE_CONTROL                                       0x1f47
+#define mmSCL3_SCL_AUTOMATIC_MODE_CONTROL                                       0x4147
+#define mmSCL4_SCL_AUTOMATIC_MODE_CONTROL                                       0x4347
+#define mmSCL5_SCL_AUTOMATIC_MODE_CONTROL                                       0x4547
+#define mmSCL_HORZ_FILTER_CONTROL                                               0x1b48
+#define mmSCL0_SCL_HORZ_FILTER_CONTROL                                          0x1b48
+#define mmSCL1_SCL_HORZ_FILTER_CONTROL                                          0x1d48
+#define mmSCL2_SCL_HORZ_FILTER_CONTROL                                          0x1f48
+#define mmSCL3_SCL_HORZ_FILTER_CONTROL                                          0x4148
+#define mmSCL4_SCL_HORZ_FILTER_CONTROL                                          0x4348
+#define mmSCL5_SCL_HORZ_FILTER_CONTROL                                          0x4548
+#define mmSCL_HORZ_FILTER_SCALE_RATIO                                           0x1b49
+#define mmSCL0_SCL_HORZ_FILTER_SCALE_RATIO                                      0x1b49
+#define mmSCL1_SCL_HORZ_FILTER_SCALE_RATIO                                      0x1d49
+#define mmSCL2_SCL_HORZ_FILTER_SCALE_RATIO                                      0x1f49
+#define mmSCL3_SCL_HORZ_FILTER_SCALE_RATIO                                      0x4149
+#define mmSCL4_SCL_HORZ_FILTER_SCALE_RATIO                                      0x4349
+#define mmSCL5_SCL_HORZ_FILTER_SCALE_RATIO                                      0x4549
+#define mmSCL_HORZ_FILTER_INIT                                                  0x1b4a
+#define mmSCL0_SCL_HORZ_FILTER_INIT                                             0x1b4a
+#define mmSCL1_SCL_HORZ_FILTER_INIT                                             0x1d4a
+#define mmSCL2_SCL_HORZ_FILTER_INIT                                             0x1f4a
+#define mmSCL3_SCL_HORZ_FILTER_INIT                                             0x414a
+#define mmSCL4_SCL_HORZ_FILTER_INIT                                             0x434a
+#define mmSCL5_SCL_HORZ_FILTER_INIT                                             0x454a
+#define mmSCL_VERT_FILTER_CONTROL                                               0x1b4b
+#define mmSCL0_SCL_VERT_FILTER_CONTROL                                          0x1b4b
+#define mmSCL1_SCL_VERT_FILTER_CONTROL                                          0x1d4b
+#define mmSCL2_SCL_VERT_FILTER_CONTROL                                          0x1f4b
+#define mmSCL3_SCL_VERT_FILTER_CONTROL                                          0x414b
+#define mmSCL4_SCL_VERT_FILTER_CONTROL                                          0x434b
+#define mmSCL5_SCL_VERT_FILTER_CONTROL                                          0x454b
+#define mmSCL_VERT_FILTER_SCALE_RATIO                                           0x1b4c
+#define mmSCL0_SCL_VERT_FILTER_SCALE_RATIO                                      0x1b4c
+#define mmSCL1_SCL_VERT_FILTER_SCALE_RATIO                                      0x1d4c
+#define mmSCL2_SCL_VERT_FILTER_SCALE_RATIO                                      0x1f4c
+#define mmSCL3_SCL_VERT_FILTER_SCALE_RATIO                                      0x414c
+#define mmSCL4_SCL_VERT_FILTER_SCALE_RATIO                                      0x434c
+#define mmSCL5_SCL_VERT_FILTER_SCALE_RATIO                                      0x454c
+#define mmSCL_VERT_FILTER_INIT                                                  0x1b4d
+#define mmSCL0_SCL_VERT_FILTER_INIT                                             0x1b4d
+#define mmSCL1_SCL_VERT_FILTER_INIT                                             0x1d4d
+#define mmSCL2_SCL_VERT_FILTER_INIT                                             0x1f4d
+#define mmSCL3_SCL_VERT_FILTER_INIT                                             0x414d
+#define mmSCL4_SCL_VERT_FILTER_INIT                                             0x434d
+#define mmSCL5_SCL_VERT_FILTER_INIT                                             0x454d
+#define mmSCL_VERT_FILTER_INIT_BOT                                              0x1b4e
+#define mmSCL0_SCL_VERT_FILTER_INIT_BOT                                         0x1b4e
+#define mmSCL1_SCL_VERT_FILTER_INIT_BOT                                         0x1d4e
+#define mmSCL2_SCL_VERT_FILTER_INIT_BOT                                         0x1f4e
+#define mmSCL3_SCL_VERT_FILTER_INIT_BOT                                         0x414e
+#define mmSCL4_SCL_VERT_FILTER_INIT_BOT                                         0x434e
+#define mmSCL5_SCL_VERT_FILTER_INIT_BOT                                         0x454e
+#define mmSCL_ROUND_OFFSET                                                      0x1b4f
+#define mmSCL0_SCL_ROUND_OFFSET                                                 0x1b4f
+#define mmSCL1_SCL_ROUND_OFFSET                                                 0x1d4f
+#define mmSCL2_SCL_ROUND_OFFSET                                                 0x1f4f
+#define mmSCL3_SCL_ROUND_OFFSET                                                 0x414f
+#define mmSCL4_SCL_ROUND_OFFSET                                                 0x434f
+#define mmSCL5_SCL_ROUND_OFFSET                                                 0x454f
+#define mmSCL_UPDATE                                                            0x1b51
+#define mmSCL0_SCL_UPDATE                                                       0x1b51
+#define mmSCL1_SCL_UPDATE                                                       0x1d51
+#define mmSCL2_SCL_UPDATE                                                       0x1f51
+#define mmSCL3_SCL_UPDATE                                                       0x4151
+#define mmSCL4_SCL_UPDATE                                                       0x4351
+#define mmSCL5_SCL_UPDATE                                                       0x4551
+#define mmSCL_F_SHARP_CONTROL                                                   0x1b53
+#define mmSCL0_SCL_F_SHARP_CONTROL                                              0x1b53
+#define mmSCL1_SCL_F_SHARP_CONTROL                                              0x1d53
+#define mmSCL2_SCL_F_SHARP_CONTROL                                              0x1f53
+#define mmSCL3_SCL_F_SHARP_CONTROL                                              0x4153
+#define mmSCL4_SCL_F_SHARP_CONTROL                                              0x4353
+#define mmSCL5_SCL_F_SHARP_CONTROL                                              0x4553
+#define mmSCL_ALU_CONTROL                                                       0x1b54
+#define mmSCL0_SCL_ALU_CONTROL                                                  0x1b54
+#define mmSCL1_SCL_ALU_CONTROL                                                  0x1d54
+#define mmSCL2_SCL_ALU_CONTROL                                                  0x1f54
+#define mmSCL3_SCL_ALU_CONTROL                                                  0x4154
+#define mmSCL4_SCL_ALU_CONTROL                                                  0x4354
+#define mmSCL5_SCL_ALU_CONTROL                                                  0x4554
+#define mmSCL_COEF_RAM_CONFLICT_STATUS                                          0x1b55
+#define mmSCL0_SCL_COEF_RAM_CONFLICT_STATUS                                     0x1b55
+#define mmSCL1_SCL_COEF_RAM_CONFLICT_STATUS                                     0x1d55
+#define mmSCL2_SCL_COEF_RAM_CONFLICT_STATUS                                     0x1f55
+#define mmSCL3_SCL_COEF_RAM_CONFLICT_STATUS                                     0x4155
+#define mmSCL4_SCL_COEF_RAM_CONFLICT_STATUS                                     0x4355
+#define mmSCL5_SCL_COEF_RAM_CONFLICT_STATUS                                     0x4555
+#define mmVIEWPORT_START_SECONDARY                                              0x1b5b
+#define mmSCL0_VIEWPORT_START_SECONDARY                                         0x1b5b
+#define mmSCL1_VIEWPORT_START_SECONDARY                                         0x1d5b
+#define mmSCL2_VIEWPORT_START_SECONDARY                                         0x1f5b
+#define mmSCL3_VIEWPORT_START_SECONDARY                                         0x415b
+#define mmSCL4_VIEWPORT_START_SECONDARY                                         0x435b
+#define mmSCL5_VIEWPORT_START_SECONDARY                                         0x455b
+#define mmVIEWPORT_START                                                        0x1b5c
+#define mmSCL0_VIEWPORT_START                                                   0x1b5c
+#define mmSCL1_VIEWPORT_START                                                   0x1d5c
+#define mmSCL2_VIEWPORT_START                                                   0x1f5c
+#define mmSCL3_VIEWPORT_START                                                   0x415c
+#define mmSCL4_VIEWPORT_START                                                   0x435c
+#define mmSCL5_VIEWPORT_START                                                   0x455c
+#define mmVIEWPORT_SIZE                                                         0x1b5d
+#define mmSCL0_VIEWPORT_SIZE                                                    0x1b5d
+#define mmSCL1_VIEWPORT_SIZE                                                    0x1d5d
+#define mmSCL2_VIEWPORT_SIZE                                                    0x1f5d
+#define mmSCL3_VIEWPORT_SIZE                                                    0x415d
+#define mmSCL4_VIEWPORT_SIZE                                                    0x435d
+#define mmSCL5_VIEWPORT_SIZE                                                    0x455d
+#define mmEXT_OVERSCAN_LEFT_RIGHT                                               0x1b5e
+#define mmSCL0_EXT_OVERSCAN_LEFT_RIGHT                                          0x1b5e
+#define mmSCL1_EXT_OVERSCAN_LEFT_RIGHT                                          0x1d5e
+#define mmSCL2_EXT_OVERSCAN_LEFT_RIGHT                                          0x1f5e
+#define mmSCL3_EXT_OVERSCAN_LEFT_RIGHT                                          0x415e
+#define mmSCL4_EXT_OVERSCAN_LEFT_RIGHT                                          0x435e
+#define mmSCL5_EXT_OVERSCAN_LEFT_RIGHT                                          0x455e
+#define mmEXT_OVERSCAN_TOP_BOTTOM                                               0x1b5f
+#define mmSCL0_EXT_OVERSCAN_TOP_BOTTOM                                          0x1b5f
+#define mmSCL1_EXT_OVERSCAN_TOP_BOTTOM                                          0x1d5f
+#define mmSCL2_EXT_OVERSCAN_TOP_BOTTOM                                          0x1f5f
+#define mmSCL3_EXT_OVERSCAN_TOP_BOTTOM                                          0x415f
+#define mmSCL4_EXT_OVERSCAN_TOP_BOTTOM                                          0x435f
+#define mmSCL5_EXT_OVERSCAN_TOP_BOTTOM                                          0x455f
+#define mmSCL_MODE_CHANGE_DET1                                                  0x1b60
+#define mmSCL0_SCL_MODE_CHANGE_DET1                                             0x1b60
+#define mmSCL1_SCL_MODE_CHANGE_DET1                                             0x1d60
+#define mmSCL2_SCL_MODE_CHANGE_DET1                                             0x1f60
+#define mmSCL3_SCL_MODE_CHANGE_DET1                                             0x4160
+#define mmSCL4_SCL_MODE_CHANGE_DET1                                             0x4360
+#define mmSCL5_SCL_MODE_CHANGE_DET1                                             0x4560
+#define mmSCL_MODE_CHANGE_DET2                                                  0x1b61
+#define mmSCL0_SCL_MODE_CHANGE_DET2                                             0x1b61
+#define mmSCL1_SCL_MODE_CHANGE_DET2                                             0x1d61
+#define mmSCL2_SCL_MODE_CHANGE_DET2                                             0x1f61
+#define mmSCL3_SCL_MODE_CHANGE_DET2                                             0x4161
+#define mmSCL4_SCL_MODE_CHANGE_DET2                                             0x4361
+#define mmSCL5_SCL_MODE_CHANGE_DET2                                             0x4561
+#define mmSCL_MODE_CHANGE_DET3                                                  0x1b62
+#define mmSCL0_SCL_MODE_CHANGE_DET3                                             0x1b62
+#define mmSCL1_SCL_MODE_CHANGE_DET3                                             0x1d62
+#define mmSCL2_SCL_MODE_CHANGE_DET3                                             0x1f62
+#define mmSCL3_SCL_MODE_CHANGE_DET3                                             0x4162
+#define mmSCL4_SCL_MODE_CHANGE_DET3                                             0x4362
+#define mmSCL5_SCL_MODE_CHANGE_DET3                                             0x4562
+#define mmSCL_MODE_CHANGE_MASK                                                  0x1b63
+#define mmSCL0_SCL_MODE_CHANGE_MASK                                             0x1b63
+#define mmSCL1_SCL_MODE_CHANGE_MASK                                             0x1d63
+#define mmSCL2_SCL_MODE_CHANGE_MASK                                             0x1f63
+#define mmSCL3_SCL_MODE_CHANGE_MASK                                             0x4163
+#define mmSCL4_SCL_MODE_CHANGE_MASK                                             0x4363
+#define mmSCL5_SCL_MODE_CHANGE_MASK                                             0x4563
+#define mmSCL_DEBUG2                                                            0x1b69
+#define mmSCL0_SCL_DEBUG2                                                       0x1b69
+#define mmSCL1_SCL_DEBUG2                                                       0x1d69
+#define mmSCL2_SCL_DEBUG2                                                       0x1f69
+#define mmSCL3_SCL_DEBUG2                                                       0x4169
+#define mmSCL4_SCL_DEBUG2                                                       0x4369
+#define mmSCL5_SCL_DEBUG2                                                       0x4569
+#define mmSCL_DEBUG                                                             0x1b6a
+#define mmSCL0_SCL_DEBUG                                                        0x1b6a
+#define mmSCL1_SCL_DEBUG                                                        0x1d6a
+#define mmSCL2_SCL_DEBUG                                                        0x1f6a
+#define mmSCL3_SCL_DEBUG                                                        0x416a
+#define mmSCL4_SCL_DEBUG                                                        0x436a
+#define mmSCL5_SCL_DEBUG                                                        0x456a
+#define mmSCL_TEST_DEBUG_INDEX                                                  0x1b6b
+#define mmSCL0_SCL_TEST_DEBUG_INDEX                                             0x1b6b
+#define mmSCL1_SCL_TEST_DEBUG_INDEX                                             0x1d6b
+#define mmSCL2_SCL_TEST_DEBUG_INDEX                                             0x1f6b
+#define mmSCL3_SCL_TEST_DEBUG_INDEX                                             0x416b
+#define mmSCL4_SCL_TEST_DEBUG_INDEX                                             0x436b
+#define mmSCL5_SCL_TEST_DEBUG_INDEX                                             0x456b
+#define mmSCL_TEST_DEBUG_DATA                                                   0x1b6c
+#define mmSCL0_SCL_TEST_DEBUG_DATA                                              0x1b6c
+#define mmSCL1_SCL_TEST_DEBUG_DATA                                              0x1d6c
+#define mmSCL2_SCL_TEST_DEBUG_DATA                                              0x1f6c
+#define mmSCL3_SCL_TEST_DEBUG_DATA                                              0x416c
+#define mmSCL4_SCL_TEST_DEBUG_DATA                                              0x436c
+#define mmSCL5_SCL_TEST_DEBUG_DATA                                              0x456c
+#define mmSCLV_COEF_RAM_SELECT                                                  0x4670
+#define mmSCLV0_SCLV_COEF_RAM_SELECT                                            0x4670
+#define mmSCLV1_SCLV_COEF_RAM_SELECT                                            0x9870
+#define mmSCLV_COEF_RAM_TAP_DATA                                                0x4671
+#define mmSCLV0_SCLV_COEF_RAM_TAP_DATA                                          0x4671
+#define mmSCLV1_SCLV_COEF_RAM_TAP_DATA                                          0x9871
+#define mmSCLV_MODE                                                             0x4672
+#define mmSCLV0_SCLV_MODE                                                       0x4672
+#define mmSCLV1_SCLV_MODE                                                       0x9872
+#define mmSCLV_TAP_CONTROL                                                      0x4673
+#define mmSCLV0_SCLV_TAP_CONTROL                                                0x4673
+#define mmSCLV1_SCLV_TAP_CONTROL                                                0x9873
+#define mmSCLV_CONTROL                                                          0x4674
+#define mmSCLV0_SCLV_CONTROL                                                    0x4674
+#define mmSCLV1_SCLV_CONTROL                                                    0x9874
+#define mmSCLV_MANUAL_REPLICATE_CONTROL                                         0x4675
+#define mmSCLV0_SCLV_MANUAL_REPLICATE_CONTROL                                   0x4675
+#define mmSCLV1_SCLV_MANUAL_REPLICATE_CONTROL                                   0x9875
+#define mmSCLV_AUTOMATIC_MODE_CONTROL                                           0x4676
+#define mmSCLV0_SCLV_AUTOMATIC_MODE_CONTROL                                     0x4676
+#define mmSCLV1_SCLV_AUTOMATIC_MODE_CONTROL                                     0x9876
+#define mmSCLV_HORZ_FILTER_CONTROL                                              0x4677
+#define mmSCLV0_SCLV_HORZ_FILTER_CONTROL                                        0x4677
+#define mmSCLV1_SCLV_HORZ_FILTER_CONTROL                                        0x9877
+#define mmSCLV_HORZ_FILTER_SCALE_RATIO                                          0x4678
+#define mmSCLV0_SCLV_HORZ_FILTER_SCALE_RATIO                                    0x4678
+#define mmSCLV1_SCLV_HORZ_FILTER_SCALE_RATIO                                    0x9878
+#define mmSCLV_HORZ_FILTER_INIT                                                 0x4679
+#define mmSCLV0_SCLV_HORZ_FILTER_INIT                                           0x4679
+#define mmSCLV1_SCLV_HORZ_FILTER_INIT                                           0x9879
+#define mmSCLV_HORZ_FILTER_SCALE_RATIO_C                                        0x467a
+#define mmSCLV0_SCLV_HORZ_FILTER_SCALE_RATIO_C                                  0x467a
+#define mmSCLV1_SCLV_HORZ_FILTER_SCALE_RATIO_C                                  0x987a
+#define mmSCLV_HORZ_FILTER_INIT_C                                               0x467b
+#define mmSCLV0_SCLV_HORZ_FILTER_INIT_C                                         0x467b
+#define mmSCLV1_SCLV_HORZ_FILTER_INIT_C                                         0x987b
+#define mmSCLV_VERT_FILTER_CONTROL                                              0x467c
+#define mmSCLV0_SCLV_VERT_FILTER_CONTROL                                        0x467c
+#define mmSCLV1_SCLV_VERT_FILTER_CONTROL                                        0x987c
+#define mmSCLV_VERT_FILTER_SCALE_RATIO                                          0x467d
+#define mmSCLV0_SCLV_VERT_FILTER_SCALE_RATIO                                    0x467d
+#define mmSCLV1_SCLV_VERT_FILTER_SCALE_RATIO                                    0x987d
+#define mmSCLV_VERT_FILTER_INIT                                                 0x467e
+#define mmSCLV0_SCLV_VERT_FILTER_INIT                                           0x467e
+#define mmSCLV1_SCLV_VERT_FILTER_INIT                                           0x987e
+#define mmSCLV_VERT_FILTER_INIT_BOT                                             0x467f
+#define mmSCLV0_SCLV_VERT_FILTER_INIT_BOT                                       0x467f
+#define mmSCLV1_SCLV_VERT_FILTER_INIT_BOT                                       0x987f
+#define mmSCLV_VERT_FILTER_SCALE_RATIO_C                                        0x4680
+#define mmSCLV0_SCLV_VERT_FILTER_SCALE_RATIO_C                                  0x4680
+#define mmSCLV1_SCLV_VERT_FILTER_SCALE_RATIO_C                                  0x9880
+#define mmSCLV_VERT_FILTER_INIT_C                                               0x4681
+#define mmSCLV0_SCLV_VERT_FILTER_INIT_C                                         0x4681
+#define mmSCLV1_SCLV_VERT_FILTER_INIT_C                                         0x9881
+#define mmSCLV_VERT_FILTER_INIT_BOT_C                                           0x4682
+#define mmSCLV0_SCLV_VERT_FILTER_INIT_BOT_C                                     0x4682
+#define mmSCLV1_SCLV_VERT_FILTER_INIT_BOT_C                                     0x9882
+#define mmSCLV_ROUND_OFFSET                                                     0x4683
+#define mmSCLV0_SCLV_ROUND_OFFSET                                               0x4683
+#define mmSCLV1_SCLV_ROUND_OFFSET                                               0x9883
+#define mmSCLV_UPDATE                                                           0x4684
+#define mmSCLV0_SCLV_UPDATE                                                     0x4684
+#define mmSCLV1_SCLV_UPDATE                                                     0x9884
+#define mmSCLV_ALU_CONTROL                                                      0x4685
+#define mmSCLV0_SCLV_ALU_CONTROL                                                0x4685
+#define mmSCLV1_SCLV_ALU_CONTROL                                                0x9885
+#define mmSCLV_VIEWPORT_START                                                   0x4686
+#define mmSCLV0_SCLV_VIEWPORT_START                                             0x4686
+#define mmSCLV1_SCLV_VIEWPORT_START                                             0x9886
+#define mmSCLV_VIEWPORT_START_SECONDARY                                         0x4687
+#define mmSCLV0_SCLV_VIEWPORT_START_SECONDARY                                   0x4687
+#define mmSCLV1_SCLV_VIEWPORT_START_SECONDARY                                   0x9887
+#define mmSCLV_VIEWPORT_SIZE                                                    0x4688
+#define mmSCLV0_SCLV_VIEWPORT_SIZE                                              0x4688
+#define mmSCLV1_SCLV_VIEWPORT_SIZE                                              0x9888
+#define mmSCLV_VIEWPORT_START_C                                                 0x4689
+#define mmSCLV0_SCLV_VIEWPORT_START_C                                           0x4689
+#define mmSCLV1_SCLV_VIEWPORT_START_C                                           0x9889
+#define mmSCLV_VIEWPORT_START_SECONDARY_C                                       0x468a
+#define mmSCLV0_SCLV_VIEWPORT_START_SECONDARY_C                                 0x468a
+#define mmSCLV1_SCLV_VIEWPORT_START_SECONDARY_C                                 0x988a
+#define mmSCLV_VIEWPORT_SIZE_C                                                  0x468b
+#define mmSCLV0_SCLV_VIEWPORT_SIZE_C                                            0x468b
+#define mmSCLV1_SCLV_VIEWPORT_SIZE_C                                            0x988b
+#define mmSCLV_EXT_OVERSCAN_LEFT_RIGHT                                          0x468c
+#define mmSCLV0_SCLV_EXT_OVERSCAN_LEFT_RIGHT                                    0x468c
+#define mmSCLV1_SCLV_EXT_OVERSCAN_LEFT_RIGHT                                    0x988c
+#define mmSCLV_EXT_OVERSCAN_TOP_BOTTOM                                          0x468d
+#define mmSCLV0_SCLV_EXT_OVERSCAN_TOP_BOTTOM                                    0x468d
+#define mmSCLV1_SCLV_EXT_OVERSCAN_TOP_BOTTOM                                    0x988d
+#define mmSCLV_MODE_CHANGE_DET1                                                 0x468e
+#define mmSCLV0_SCLV_MODE_CHANGE_DET1                                           0x468e
+#define mmSCLV1_SCLV_MODE_CHANGE_DET1                                           0x988e
+#define mmSCLV_MODE_CHANGE_DET2                                                 0x468f
+#define mmSCLV0_SCLV_MODE_CHANGE_DET2                                           0x468f
+#define mmSCLV1_SCLV_MODE_CHANGE_DET2                                           0x988f
+#define mmSCLV_MODE_CHANGE_DET3                                                 0x4690
+#define mmSCLV0_SCLV_MODE_CHANGE_DET3                                           0x4690
+#define mmSCLV1_SCLV_MODE_CHANGE_DET3                                           0x9890
+#define mmSCLV_MODE_CHANGE_MASK                                                 0x4691
+#define mmSCLV0_SCLV_MODE_CHANGE_MASK                                           0x4691
+#define mmSCLV1_SCLV_MODE_CHANGE_MASK                                           0x9891
+#define mmSCLV_HORZ_FILTER_INIT_BOT                                             0x4692
+#define mmSCLV0_SCLV_HORZ_FILTER_INIT_BOT                                       0x4692
+#define mmSCLV1_SCLV_HORZ_FILTER_INIT_BOT                                       0x9892
+#define mmSCLV_HORZ_FILTER_INIT_BOT_C                                           0x4693
+#define mmSCLV0_SCLV_HORZ_FILTER_INIT_BOT_C                                     0x4693
+#define mmSCLV1_SCLV_HORZ_FILTER_INIT_BOT_C                                     0x9893
+#define mmSCLV_DEBUG2                                                           0x4694
+#define mmSCLV0_SCLV_DEBUG2                                                     0x4694
+#define mmSCLV1_SCLV_DEBUG2                                                     0x9894
+#define mmSCLV_DEBUG                                                            0x4695
+#define mmSCLV0_SCLV_DEBUG                                                      0x4695
+#define mmSCLV1_SCLV_DEBUG                                                      0x9895
+#define mmSCLV_TEST_DEBUG_INDEX                                                 0x4696
+#define mmSCLV0_SCLV_TEST_DEBUG_INDEX                                           0x4696
+#define mmSCLV1_SCLV_TEST_DEBUG_INDEX                                           0x9896
+#define mmSCLV_TEST_DEBUG_DATA                                                  0x4697
+#define mmSCLV0_SCLV_TEST_DEBUG_DATA                                            0x4697
+#define mmSCLV1_SCLV_TEST_DEBUG_DATA                                            0x9897
+#define mmCOL_MAN_UPDATE                                                        0x46a4
+#define mmCOL_MAN0_COL_MAN_UPDATE                                               0x46a4
+#define mmCOL_MAN1_COL_MAN_UPDATE                                               0x98a4
+#define mmCOL_MAN_INPUT_CSC_CONTROL                                             0x46a5
+#define mmCOL_MAN0_COL_MAN_INPUT_CSC_CONTROL                                    0x46a5
+#define mmCOL_MAN1_COL_MAN_INPUT_CSC_CONTROL                                    0x98a5
+#define mmINPUT_CSC_C11_C12_A                                                   0x46a6
+#define mmCOL_MAN0_INPUT_CSC_C11_C12_A                                          0x46a6
+#define mmCOL_MAN1_INPUT_CSC_C11_C12_A                                          0x98a6
+#define mmINPUT_CSC_C13_C14_A                                                   0x46a7
+#define mmCOL_MAN0_INPUT_CSC_C13_C14_A                                          0x46a7
+#define mmCOL_MAN1_INPUT_CSC_C13_C14_A                                          0x98a7
+#define mmINPUT_CSC_C21_C22_A                                                   0x46a8
+#define mmCOL_MAN0_INPUT_CSC_C21_C22_A                                          0x46a8
+#define mmCOL_MAN1_INPUT_CSC_C21_C22_A                                          0x98a8
+#define mmINPUT_CSC_C23_C24_A                                                   0x46a9
+#define mmCOL_MAN0_INPUT_CSC_C23_C24_A                                          0x46a9
+#define mmCOL_MAN1_INPUT_CSC_C23_C24_A                                          0x98a9
+#define mmINPUT_CSC_C31_C32_A                                                   0x46aa
+#define mmCOL_MAN0_INPUT_CSC_C31_C32_A                                          0x46aa
+#define mmCOL_MAN1_INPUT_CSC_C31_C32_A                                          0x98aa
+#define mmINPUT_CSC_C33_C34_A                                                   0x46ab
+#define mmCOL_MAN0_INPUT_CSC_C33_C34_A                                          0x46ab
+#define mmCOL_MAN1_INPUT_CSC_C33_C34_A                                          0x98ab
+#define mmINPUT_CSC_C11_C12_B                                                   0x46ac
+#define mmCOL_MAN0_INPUT_CSC_C11_C12_B                                          0x46ac
+#define mmCOL_MAN1_INPUT_CSC_C11_C12_B                                          0x98ac
+#define mmINPUT_CSC_C13_C14_B                                                   0x46ad
+#define mmCOL_MAN0_INPUT_CSC_C13_C14_B                                          0x46ad
+#define mmCOL_MAN1_INPUT_CSC_C13_C14_B                                          0x98ad
+#define mmINPUT_CSC_C21_C22_B                                                   0x46ae
+#define mmCOL_MAN0_INPUT_CSC_C21_C22_B                                          0x46ae
+#define mmCOL_MAN1_INPUT_CSC_C21_C22_B                                          0x98ae
+#define mmINPUT_CSC_C23_C24_B                                                   0x46af
+#define mmCOL_MAN0_INPUT_CSC_C23_C24_B                                          0x46af
+#define mmCOL_MAN1_INPUT_CSC_C23_C24_B                                          0x98af
+#define mmINPUT_CSC_C31_C32_B                                                   0x46b0
+#define mmCOL_MAN0_INPUT_CSC_C31_C32_B                                          0x46b0
+#define mmCOL_MAN1_INPUT_CSC_C31_C32_B                                          0x98b0
+#define mmINPUT_CSC_C33_C34_B                                                   0x46b1
+#define mmCOL_MAN0_INPUT_CSC_C33_C34_B                                          0x46b1
+#define mmCOL_MAN1_INPUT_CSC_C33_C34_B                                          0x98b1
+#define mmPRESCALE_CONTROL                                                      0x46b2
+#define mmCOL_MAN0_PRESCALE_CONTROL                                             0x46b2
+#define mmCOL_MAN1_PRESCALE_CONTROL                                             0x98b2
+#define mmPRESCALE_VALUES_R                                                     0x46b3
+#define mmCOL_MAN0_PRESCALE_VALUES_R                                            0x46b3
+#define mmCOL_MAN1_PRESCALE_VALUES_R                                            0x98b3
+#define mmPRESCALE_VALUES_G                                                     0x46b4
+#define mmCOL_MAN0_PRESCALE_VALUES_G                                            0x46b4
+#define mmCOL_MAN1_PRESCALE_VALUES_G                                            0x98b4
+#define mmPRESCALE_VALUES_B                                                     0x46b5
+#define mmCOL_MAN0_PRESCALE_VALUES_B                                            0x46b5
+#define mmCOL_MAN1_PRESCALE_VALUES_B                                            0x98b5
+#define mmCOL_MAN_OUTPUT_CSC_CONTROL                                            0x46b6
+#define mmCOL_MAN0_COL_MAN_OUTPUT_CSC_CONTROL                                   0x46b6
+#define mmCOL_MAN1_COL_MAN_OUTPUT_CSC_CONTROL                                   0x98b6
+#define mmOUTPUT_CSC_C11_C12_A                                                  0x46b7
+#define mmCOL_MAN0_OUTPUT_CSC_C11_C12_A                                         0x46b7
+#define mmCOL_MAN1_OUTPUT_CSC_C11_C12_A                                         0x98b7
+#define mmOUTPUT_CSC_C13_C14_A                                                  0x46b8
+#define mmCOL_MAN0_OUTPUT_CSC_C13_C14_A                                         0x46b8
+#define mmCOL_MAN1_OUTPUT_CSC_C13_C14_A                                         0x98b8
+#define mmOUTPUT_CSC_C21_C22_A                                                  0x46b9
+#define mmCOL_MAN0_OUTPUT_CSC_C21_C22_A                                         0x46b9
+#define mmCOL_MAN1_OUTPUT_CSC_C21_C22_A                                         0x98b9
+#define mmOUTPUT_CSC_C23_C24_A                                                  0x46ba
+#define mmCOL_MAN0_OUTPUT_CSC_C23_C24_A                                         0x46ba
+#define mmCOL_MAN1_OUTPUT_CSC_C23_C24_A                                         0x98ba
+#define mmOUTPUT_CSC_C31_C32_A                                                  0x46bb
+#define mmCOL_MAN0_OUTPUT_CSC_C31_C32_A                                         0x46bb
+#define mmCOL_MAN1_OUTPUT_CSC_C31_C32_A                                         0x98bb
+#define mmOUTPUT_CSC_C33_C34_A                                                  0x46bc
+#define mmCOL_MAN0_OUTPUT_CSC_C33_C34_A                                         0x46bc
+#define mmCOL_MAN1_OUTPUT_CSC_C33_C34_A                                         0x98bc
+#define mmOUTPUT_CSC_C11_C12_B                                                  0x46bd
+#define mmCOL_MAN0_OUTPUT_CSC_C11_C12_B                                         0x46bd
+#define mmCOL_MAN1_OUTPUT_CSC_C11_C12_B                                         0x98bd
+#define mmOUTPUT_CSC_C13_C14_B                                                  0x46be
+#define mmCOL_MAN0_OUTPUT_CSC_C13_C14_B                                         0x46be
+#define mmCOL_MAN1_OUTPUT_CSC_C13_C14_B                                         0x98be
+#define mmOUTPUT_CSC_C21_C22_B                                                  0x46bf
+#define mmCOL_MAN0_OUTPUT_CSC_C21_C22_B                                         0x46bf
+#define mmCOL_MAN1_OUTPUT_CSC_C21_C22_B                                         0x98bf
+#define mmOUTPUT_CSC_C23_C24_B                                                  0x46c0
+#define mmCOL_MAN0_OUTPUT_CSC_C23_C24_B                                         0x46c0
+#define mmCOL_MAN1_OUTPUT_CSC_C23_C24_B                                         0x98c0
+#define mmOUTPUT_CSC_C31_C32_B                                                  0x46c1
+#define mmCOL_MAN0_OUTPUT_CSC_C31_C32_B                                         0x46c1
+#define mmCOL_MAN1_OUTPUT_CSC_C31_C32_B                                         0x98c1
+#define mmOUTPUT_CSC_C33_C34_B                                                  0x46c2
+#define mmCOL_MAN0_OUTPUT_CSC_C33_C34_B                                         0x46c2
+#define mmCOL_MAN1_OUTPUT_CSC_C33_C34_B                                         0x98c2
+#define mmDENORM_CLAMP_CONTROL                                                  0x46c3
+#define mmCOL_MAN0_DENORM_CLAMP_CONTROL                                         0x46c3
+#define mmCOL_MAN1_DENORM_CLAMP_CONTROL                                         0x98c3
+#define mmDENORM_CLAMP_RANGE_R_CR                                               0x46c4
+#define mmCOL_MAN0_DENORM_CLAMP_RANGE_R_CR                                      0x46c4
+#define mmCOL_MAN1_DENORM_CLAMP_RANGE_R_CR                                      0x98c4
+#define mmDENORM_CLAMP_RANGE_G_Y                                                0x46c5
+#define mmCOL_MAN0_DENORM_CLAMP_RANGE_G_Y                                       0x46c5
+#define mmCOL_MAN1_DENORM_CLAMP_RANGE_G_Y                                       0x98c5
+#define mmDENORM_CLAMP_RANGE_B_CB                                               0x46c6
+#define mmCOL_MAN0_DENORM_CLAMP_RANGE_B_CB                                      0x46c6
+#define mmCOL_MAN1_DENORM_CLAMP_RANGE_B_CB                                      0x98c6
+#define mmCOL_MAN_FP_CONVERTED_FIELD                                            0x46c7
+#define mmCOL_MAN0_COL_MAN_FP_CONVERTED_FIELD                                   0x46c7
+#define mmCOL_MAN1_COL_MAN_FP_CONVERTED_FIELD                                   0x98c7
+#define mmGAMMA_CORR_CONTROL                                                    0x46c8
+#define mmCOL_MAN0_GAMMA_CORR_CONTROL                                           0x46c8
+#define mmCOL_MAN1_GAMMA_CORR_CONTROL                                           0x98c8
+#define mmGAMMA_CORR_LUT_INDEX                                                  0x46c9
+#define mmCOL_MAN0_GAMMA_CORR_LUT_INDEX                                         0x46c9
+#define mmCOL_MAN1_GAMMA_CORR_LUT_INDEX                                         0x98c9
+#define mmGAMMA_CORR_LUT_DATA                                                   0x46ca
+#define mmCOL_MAN0_GAMMA_CORR_LUT_DATA                                          0x46ca
+#define mmCOL_MAN1_GAMMA_CORR_LUT_DATA                                          0x98ca
+#define mmGAMMA_CORR_LUT_WRITE_EN_MASK                                          0x46cb
+#define mmCOL_MAN0_GAMMA_CORR_LUT_WRITE_EN_MASK                                 0x46cb
+#define mmCOL_MAN1_GAMMA_CORR_LUT_WRITE_EN_MASK                                 0x98cb
+#define mmGAMMA_CORR_CNTLA_START_CNTL                                           0x46cc
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_START_CNTL                                  0x46cc
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_START_CNTL                                  0x98cc
+#define mmGAMMA_CORR_CNTLA_SLOPE_CNTL                                           0x46cd
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_SLOPE_CNTL                                  0x46cd
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_SLOPE_CNTL                                  0x98cd
+#define mmGAMMA_CORR_CNTLA_END_CNTL1                                            0x46ce
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_END_CNTL1                                   0x46ce
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_END_CNTL1                                   0x98ce
+#define mmGAMMA_CORR_CNTLA_END_CNTL2                                            0x46cf
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_END_CNTL2                                   0x46cf
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_END_CNTL2                                   0x98cf
+#define mmGAMMA_CORR_CNTLA_REGION_0_1                                           0x46d0
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_0_1                                  0x46d0
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_0_1                                  0x98d0
+#define mmGAMMA_CORR_CNTLA_REGION_2_3                                           0x46d1
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_2_3                                  0x46d1
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_2_3                                  0x98d1
+#define mmGAMMA_CORR_CNTLA_REGION_4_5                                           0x46d2
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_4_5                                  0x46d2
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_4_5                                  0x98d2
+#define mmGAMMA_CORR_CNTLA_REGION_6_7                                           0x46d3
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_6_7                                  0x46d3
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_6_7                                  0x98d3
+#define mmGAMMA_CORR_CNTLA_REGION_8_9                                           0x46d4
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_8_9                                  0x46d4
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_8_9                                  0x98d4
+#define mmGAMMA_CORR_CNTLA_REGION_10_11                                         0x46d5
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_10_11                                0x46d5
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_10_11                                0x98d5
+#define mmGAMMA_CORR_CNTLA_REGION_12_13                                         0x46d6
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_12_13                                0x46d6
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_12_13                                0x98d6
+#define mmGAMMA_CORR_CNTLA_REGION_14_15                                         0x46d7
+#define mmCOL_MAN0_GAMMA_CORR_CNTLA_REGION_14_15                                0x46d7
+#define mmCOL_MAN1_GAMMA_CORR_CNTLA_REGION_14_15                                0x98d7
+#define mmGAMMA_CORR_CNTLB_START_CNTL                                           0x46d8
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_START_CNTL                                  0x46d8
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_START_CNTL                                  0x98d8
+#define mmGAMMA_CORR_CNTLB_SLOPE_CNTL                                           0x46d9
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_SLOPE_CNTL                                  0x46d9
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_SLOPE_CNTL                                  0x98d9
+#define mmGAMMA_CORR_CNTLB_END_CNTL1                                            0x46da
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_END_CNTL1                                   0x46da
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_END_CNTL1                                   0x98da
+#define mmGAMMA_CORR_CNTLB_END_CNTL2                                            0x46db
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_END_CNTL2                                   0x46db
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_END_CNTL2                                   0x98db
+#define mmGAMMA_CORR_CNTLB_REGION_0_1                                           0x46dc
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_0_1                                  0x46dc
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_0_1                                  0x98dc
+#define mmGAMMA_CORR_CNTLB_REGION_2_3                                           0x46dd
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_2_3                                  0x46dd
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_2_3                                  0x98dd
+#define mmGAMMA_CORR_CNTLB_REGION_4_5                                           0x46de
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_4_5                                  0x46de
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_4_5                                  0x98de
+#define mmGAMMA_CORR_CNTLB_REGION_6_7                                           0x46df
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_6_7                                  0x46df
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_6_7                                  0x98df
+#define mmGAMMA_CORR_CNTLB_REGION_8_9                                           0x46e0
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_8_9                                  0x46e0
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_8_9                                  0x98e0
+#define mmGAMMA_CORR_CNTLB_REGION_10_11                                         0x46e1
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_10_11                                0x46e1
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_10_11                                0x98e1
+#define mmGAMMA_CORR_CNTLB_REGION_12_13                                         0x46e2
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_12_13                                0x46e2
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_12_13                                0x98e2
+#define mmGAMMA_CORR_CNTLB_REGION_14_15                                         0x46e3
+#define mmCOL_MAN0_GAMMA_CORR_CNTLB_REGION_14_15                                0x46e3
+#define mmCOL_MAN1_GAMMA_CORR_CNTLB_REGION_14_15                                0x98e3
+#define mmPACK_FIFO_ERROR                                                       0x46e4
+#define mmCOL_MAN0_PACK_FIFO_ERROR                                              0x46e4
+#define mmCOL_MAN1_PACK_FIFO_ERROR                                              0x98e4
+#define mmOUTPUT_FIFO_ERROR                                                     0x46e5
+#define mmCOL_MAN0_OUTPUT_FIFO_ERROR                                            0x46e5
+#define mmCOL_MAN1_OUTPUT_FIFO_ERROR                                            0x98e5
+#define mmINPUT_GAMMA_LUT_AUTOFILL                                              0x46e6
+#define mmCOL_MAN0_INPUT_GAMMA_LUT_AUTOFILL                                     0x46e6
+#define mmCOL_MAN1_INPUT_GAMMA_LUT_AUTOFILL                                     0x98e6
+#define mmINPUT_GAMMA_LUT_RW_INDEX                                              0x46e7
+#define mmCOL_MAN0_INPUT_GAMMA_LUT_RW_INDEX                                     0x46e7
+#define mmCOL_MAN1_INPUT_GAMMA_LUT_RW_INDEX                                     0x98e7
+#define mmINPUT_GAMMA_LUT_SEQ_COLOR                                             0x46e8
+#define mmCOL_MAN0_INPUT_GAMMA_LUT_SEQ_COLOR                                    0x46e8
+#define mmCOL_MAN1_INPUT_GAMMA_LUT_SEQ_COLOR                                    0x98e8
+#define mmINPUT_GAMMA_LUT_PWL_DATA                                              0x46e9
+#define mmCOL_MAN0_INPUT_GAMMA_LUT_PWL_DATA                                     0x46e9
+#define mmCOL_MAN1_INPUT_GAMMA_LUT_PWL_DATA                                     0x98e9
+#define mmINPUT_GAMMA_LUT_30_COLOR                                              0x46ea
+#define mmCOL_MAN0_INPUT_GAMMA_LUT_30_COLOR                                     0x46ea
+#define mmCOL_MAN1_INPUT_GAMMA_LUT_30_COLOR                                     0x98ea
+#define mmCOL_MAN_INPUT_GAMMA_CONTROL1                                          0x46eb
+#define mmCOL_MAN0_COL_MAN_INPUT_GAMMA_CONTROL1                                 0x46eb
+#define mmCOL_MAN1_COL_MAN_INPUT_GAMMA_CONTROL1                                 0x98eb
+#define mmCOL_MAN_INPUT_GAMMA_CONTROL2                                          0x46ec
+#define mmCOL_MAN0_COL_MAN_INPUT_GAMMA_CONTROL2                                 0x46ec
+#define mmCOL_MAN1_COL_MAN_INPUT_GAMMA_CONTROL2                                 0x98ec
+#define mmINPUT_GAMMA_BW_OFFSETS_B                                              0x46ed
+#define mmCOL_MAN0_INPUT_GAMMA_BW_OFFSETS_B                                     0x46ed
+#define mmCOL_MAN1_INPUT_GAMMA_BW_OFFSETS_B                                     0x98ed
+#define mmINPUT_GAMMA_BW_OFFSETS_G                                              0x46ee
+#define mmCOL_MAN0_INPUT_GAMMA_BW_OFFSETS_G                                     0x46ee
+#define mmCOL_MAN1_INPUT_GAMMA_BW_OFFSETS_G                                     0x98ee
+#define mmINPUT_GAMMA_BW_OFFSETS_R                                              0x46ef
+#define mmCOL_MAN0_INPUT_GAMMA_BW_OFFSETS_R                                     0x46ef
+#define mmCOL_MAN1_INPUT_GAMMA_BW_OFFSETS_R                                     0x98ef
+#define mmCOL_MAN_DEBUG_CONTROL                                                 0x46f0
+#define mmCOL_MAN0_COL_MAN_DEBUG_CONTROL                                        0x46f0
+#define mmCOL_MAN1_COL_MAN_DEBUG_CONTROL                                        0x98f0
+#define mmCOL_MAN_TEST_DEBUG_INDEX                                              0x46f1
+#define mmCOL_MAN0_COL_MAN_TEST_DEBUG_INDEX                                     0x46f1
+#define mmCOL_MAN1_COL_MAN_TEST_DEBUG_INDEX                                     0x98f1
+#define mmCOL_MAN_TEST_DEBUG_DATA                                               0x46f3
+#define mmCOL_MAN0_COL_MAN_TEST_DEBUG_DATA                                      0x46f3
+#define mmCOL_MAN1_COL_MAN_TEST_DEBUG_DATA                                      0x98f3
+#define mmUNP_GRPH_ENABLE                                                       0x4600
+#define mmUNP0_UNP_GRPH_ENABLE                                                  0x4600
+#define mmUNP1_UNP_GRPH_ENABLE                                                  0x9800
+#define mmUNP_GRPH_CONTROL                                                      0x4601
+#define mmUNP0_UNP_GRPH_CONTROL                                                 0x4601
+#define mmUNP1_UNP_GRPH_CONTROL                                                 0x9801
+#define mmUNP_GRPH_CONTROL_C                                                    0x4602
+#define mmUNP0_UNP_GRPH_CONTROL_C                                               0x4602
+#define mmUNP1_UNP_GRPH_CONTROL_C                                               0x9802
+#define mmUNP_GRPH_CONTROL_EXP                                                  0x4603
+#define mmUNP0_UNP_GRPH_CONTROL_EXP                                             0x4603
+#define mmUNP1_UNP_GRPH_CONTROL_EXP                                             0x9803
+#define mmUNP_GRPH_SWAP_CNTL                                                    0x4605
+#define mmUNP0_UNP_GRPH_SWAP_CNTL                                               0x4605
+#define mmUNP1_UNP_GRPH_SWAP_CNTL                                               0x9805
+#define mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_L                                    0x4606
+#define mmUNP0_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L                               0x4606
+#define mmUNP1_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L                               0x9806
+#define mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_C                                    0x4607
+#define mmUNP0_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C                               0x4607
+#define mmUNP1_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C                               0x9807
+#define mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L                               0x4608
+#define mmUNP0_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L                          0x4608
+#define mmUNP1_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L                          0x9808
+#define mmUNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C                               0x4609
+#define mmUNP0_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C                          0x4609
+#define mmUNP1_UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C                          0x9809
+#define mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L                             0x460a
+#define mmUNP0_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L                        0x460a
+#define mmUNP1_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L                        0x980a
+#define mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C                             0x460b
+#define mmUNP0_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C                        0x460b
+#define mmUNP1_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C                        0x980b
+#define mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                        0x460c
+#define mmUNP0_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                   0x460c
+#define mmUNP1_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                   0x980c
+#define mmUNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                        0x460d
+#define mmUNP0_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                   0x460d
+#define mmUNP1_UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                   0x980d
+#define mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_L                                  0x460e
+#define mmUNP0_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_L                             0x460e
+#define mmUNP1_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_L                             0x980e
+#define mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_C                                  0x460f
+#define mmUNP0_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_C                             0x460f
+#define mmUNP1_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_C                             0x980f
+#define mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L                             0x4610
+#define mmUNP0_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L                        0x4610
+#define mmUNP1_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L                        0x9810
+#define mmUNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C                             0x4611
+#define mmUNP0_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C                        0x4611
+#define mmUNP1_UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C                        0x9811
+#define mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L                           0x4612
+#define mmUNP0_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L                      0x4612
+#define mmUNP1_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L                      0x9812
+#define mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C                           0x4613
+#define mmUNP0_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C                      0x4613
+#define mmUNP1_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C                      0x9813
+#define mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                      0x4614
+#define mmUNP0_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                 0x4614
+#define mmUNP1_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L                 0x9814
+#define mmUNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                      0x4615
+#define mmUNP0_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                 0x4615
+#define mmUNP1_UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C                 0x9815
+#define mmUNP_GRPH_PITCH_L                                                      0x4616
+#define mmUNP0_UNP_GRPH_PITCH_L                                                 0x4616
+#define mmUNP1_UNP_GRPH_PITCH_L                                                 0x9816
+#define mmUNP_GRPH_PITCH_C                                                      0x4617
+#define mmUNP0_UNP_GRPH_PITCH_C                                                 0x4617
+#define mmUNP1_UNP_GRPH_PITCH_C                                                 0x9817
+#define mmUNP_GRPH_SURFACE_OFFSET_X_L                                           0x4618
+#define mmUNP0_UNP_GRPH_SURFACE_OFFSET_X_L                                      0x4618
+#define mmUNP1_UNP_GRPH_SURFACE_OFFSET_X_L                                      0x9818
+#define mmUNP_GRPH_SURFACE_OFFSET_X_C                                           0x4619
+#define mmUNP0_UNP_GRPH_SURFACE_OFFSET_X_C                                      0x4619
+#define mmUNP1_UNP_GRPH_SURFACE_OFFSET_X_C                                      0x9819
+#define mmUNP_GRPH_SURFACE_OFFSET_Y_L                                           0x461a
+#define mmUNP0_UNP_GRPH_SURFACE_OFFSET_Y_L                                      0x461a
+#define mmUNP1_UNP_GRPH_SURFACE_OFFSET_Y_L                                      0x981a
+#define mmUNP_GRPH_SURFACE_OFFSET_Y_C                                           0x461b
+#define mmUNP0_UNP_GRPH_SURFACE_OFFSET_Y_C                                      0x461b
+#define mmUNP1_UNP_GRPH_SURFACE_OFFSET_Y_C                                      0x981b
+#define mmUNP_GRPH_X_START_L                                                    0x461c
+#define mmUNP0_UNP_GRPH_X_START_L                                               0x461c
+#define mmUNP1_UNP_GRPH_X_START_L                                               0x981c
+#define mmUNP_GRPH_X_START_C                                                    0x461d
+#define mmUNP0_UNP_GRPH_X_START_C                                               0x461d
+#define mmUNP1_UNP_GRPH_X_START_C                                               0x981d
+#define mmUNP_GRPH_Y_START_L                                                    0x461e
+#define mmUNP0_UNP_GRPH_Y_START_L                                               0x461e
+#define mmUNP1_UNP_GRPH_Y_START_L                                               0x981e
+#define mmUNP_GRPH_Y_START_C                                                    0x461f
+#define mmUNP0_UNP_GRPH_Y_START_C                                               0x461f
+#define mmUNP1_UNP_GRPH_Y_START_C                                               0x981f
+#define mmUNP_GRPH_X_END_L                                                      0x4620
+#define mmUNP0_UNP_GRPH_X_END_L                                                 0x4620
+#define mmUNP1_UNP_GRPH_X_END_L                                                 0x9820
+#define mmUNP_GRPH_X_END_C                                                      0x4621
+#define mmUNP0_UNP_GRPH_X_END_C                                                 0x4621
+#define mmUNP1_UNP_GRPH_X_END_C                                                 0x9821
+#define mmUNP_GRPH_Y_END_L                                                      0x4622
+#define mmUNP0_UNP_GRPH_Y_END_L                                                 0x4622
+#define mmUNP1_UNP_GRPH_Y_END_L                                                 0x9822
+#define mmUNP_GRPH_Y_END_C                                                      0x4623
+#define mmUNP0_UNP_GRPH_Y_END_C                                                 0x4623
+#define mmUNP1_UNP_GRPH_Y_END_C                                                 0x9823
+#define mmUNP_GRPH_UPDATE                                                       0x4624
+#define mmUNP0_UNP_GRPH_UPDATE                                                  0x4624
+#define mmUNP1_UNP_GRPH_UPDATE                                                  0x9824
+#define mmUNP_PIPE_OUTSTANDING_REQUEST_LIMIT                                    0x463a
+#define mmUNP0_UNP_PIPE_OUTSTANDING_REQUEST_LIMIT                               0x463a
+#define mmUNP1_UNP_PIPE_OUTSTANDING_REQUEST_LIMIT                               0x983a
+#define mmUNP_GRPH_SURFACE_ADDRESS_INUSE_L                                      0x4625
+#define mmUNP0_UNP_GRPH_SURFACE_ADDRESS_INUSE_L                                 0x4625
+#define mmUNP1_UNP_GRPH_SURFACE_ADDRESS_INUSE_L                                 0x9825
+#define mmUNP_GRPH_SURFACE_ADDRESS_INUSE_C                                      0x4626
+#define mmUNP0_UNP_GRPH_SURFACE_ADDRESS_INUSE_C                                 0x4626
+#define mmUNP1_UNP_GRPH_SURFACE_ADDRESS_INUSE_C                                 0x9826
+#define mmUNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L                                 0x4627
+#define mmUNP0_UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L                            0x4627
+#define mmUNP1_UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L                            0x9827
+#define mmUNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C                                 0x4628
+#define mmUNP0_UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C                            0x4628
+#define mmUNP1_UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C                            0x9828
+#define mmUNP_DVMM_PTE_CONTROL                                                  0x4629
+#define mmUNP_GRPH_INTERRUPT_STATUS                                             0x462b
+#define mmUNP0_UNP_GRPH_INTERRUPT_STATUS                                        0x462b
+#define mmUNP1_UNP_GRPH_INTERRUPT_STATUS                                        0x982b
+#define mmUNP_GRPH_INTERRUPT_CONTROL                                            0x462c
+#define mmUNP0_UNP_GRPH_INTERRUPT_CONTROL                                       0x462c
+#define mmUNP1_UNP_GRPH_INTERRUPT_CONTROL                                       0x982c
+#define mmUNP_GRPH_STEREOSYNC_FLIP                                              0x462e
+#define mmUNP0_UNP_GRPH_STEREOSYNC_FLIP                                         0x462e
+#define mmUNP1_UNP_GRPH_STEREOSYNC_FLIP                                         0x982e
+#define mmUNP_FLIP_CONTROL                                                      0x462f
+#define mmUNP0_UNP_FLIP_CONTROL                                                 0x462f
+#define mmUNP1_UNP_FLIP_CONTROL                                                 0x982f
+#define mmUNP_CRC_CONTROL                                                       0x4630
+#define mmUNP0_UNP_CRC_CONTROL                                                  0x4630
+#define mmUNP1_UNP_CRC_CONTROL                                                  0x9830
+#define mmUNP_CRC_MASK                                                          0x4631
+#define mmUNP0_UNP_CRC_MASK                                                     0x4631
+#define mmUNP1_UNP_CRC_MASK                                                     0x9831
+#define mmUNP_CRC_CURRENT                                                       0x4632
+#define mmUNP0_UNP_CRC_CURRENT                                                  0x4632
+#define mmUNP1_UNP_CRC_CURRENT                                                  0x9832
+#define mmUNP_CRC_LAST                                                          0x4633
+#define mmUNP0_UNP_CRC_LAST                                                     0x4633
+#define mmUNP1_UNP_CRC_LAST                                                     0x9833
+#define mmUNP_LB_DATA_GAP_BETWEEN_CHUNK                                         0x4634
+#define mmUNP0_UNP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x4634
+#define mmUNP1_UNP_LB_DATA_GAP_BETWEEN_CHUNK                                    0x9834
+#define mmUNP_HW_ROTATION                                                       0x4635
+#define mmUNP0_UNP_HW_ROTATION                                                  0x4635
+#define mmUNP1_UNP_HW_ROTATION                                                  0x9835
+#define mmUNP_DEBUG                                                             0x4636
+#define mmUNP0_UNP_DEBUG                                                        0x4636
+#define mmUNP1_UNP_DEBUG                                                        0x9836
+#define mmUNP_DEBUG2                                                            0x4637
+#define mmUNP0_UNP_DEBUG2                                                       0x4637
+#define mmUNP1_UNP_DEBUG2                                                       0x9837
+#define mmUNP_DVMM_DEBUG                                                        0x463b
+#define mmUNP0_UNP_DVMM_DEBUG                                                   0x463b
+#define mmUNP1_UNP_DVMM_DEBUG                                                   0x983b
+#define mmUNP_TEST_DEBUG_INDEX                                                  0x4638
+#define mmUNP0_UNP_TEST_DEBUG_INDEX                                             0x4638
+#define mmUNP1_UNP_TEST_DEBUG_INDEX                                             0x9838
+#define mmUNP_TEST_DEBUG_DATA                                                   0x4639
+#define mmUNP0_UNP_TEST_DEBUG_DATA                                              0x4639
+#define mmUNP1_UNP_TEST_DEBUG_DATA                                              0x9839
+#define mmGENMO_WT                                                              0xf0
+#define mmGENMO_RD                                                              0xf3
+#define mmGENENB                                                                0xf0
+#define mmGENFC_WT                                                              0xee
+#define mmVGA0_GENFC_WT                                                         0xee
+#define mmVGA1_GENFC_WT                                                         0xf6
+#define mmGENFC_RD                                                              0xf2
+#define mmGENS0                                                                 0xf0
+#define mmGENS1                                                                 0xee
+#define mmVGA0_GENS1                                                            0xee
+#define mmVGA1_GENS1                                                            0xf6
+#define mmDAC_DATA                                                              0xf2
+#define mmDAC_MASK                                                              0xf1
+#define mmDAC_R_INDEX                                                           0xf1
+#define mmDAC_W_INDEX                                                           0xf2
+#define mmSEQ8_IDX                                                              0xf1
+#define mmSEQ8_DATA                                                             0xf1
+#define ixSEQ00                                                                 0x0
+#define ixSEQ01                                                                 0x1
+#define ixSEQ02                                                                 0x2
+#define ixSEQ03                                                                 0x3
+#define ixSEQ04                                                                 0x4
+#define mmCRTC8_IDX                                                             0xed
+#define mmVGA0_CRTC8_IDX                                                        0xed
+#define mmVGA1_CRTC8_IDX                                                        0xf5
+#define mmCRTC8_DATA                                                            0xed
+#define mmVGA0_CRTC8_DATA                                                       0xed
+#define mmVGA1_CRTC8_DATA                                                       0xf5
+#define ixCRT00                                                                 0x0
+#define ixCRT01                                                                 0x1
+#define ixCRT02                                                                 0x2
+#define ixCRT03                                                                 0x3
+#define ixCRT04                                                                 0x4
+#define ixCRT05                                                                 0x5
+#define ixCRT06                                                                 0x6
+#define ixCRT07                                                                 0x7
+#define ixCRT08                                                                 0x8
+#define ixCRT09                                                                 0x9
+#define ixCRT0A                                                                 0xa
+#define ixCRT0B                                                                 0xb
+#define ixCRT0C                                                                 0xc
+#define ixCRT0D                                                                 0xd
+#define ixCRT0E                                                                 0xe
+#define ixCRT0F                                                                 0xf
+#define ixCRT10                                                                 0x10
+#define ixCRT11                                                                 0x11
+#define ixCRT12                                                                 0x12
+#define ixCRT13                                                                 0x13
+#define ixCRT14                                                                 0x14
+#define ixCRT15                                                                 0x15
+#define ixCRT16                                                                 0x16
+#define ixCRT17                                                                 0x17
+#define ixCRT18                                                                 0x18
+#define ixCRT1E                                                                 0x1e
+#define ixCRT1F                                                                 0x1f
+#define ixCRT22                                                                 0x22
+#define mmGRPH8_IDX                                                             0xf3
+#define mmGRPH8_DATA                                                            0xf3
+#define ixGRA00                                                                 0x0
+#define ixGRA01                                                                 0x1
+#define ixGRA02                                                                 0x2
+#define ixGRA03                                                                 0x3
+#define ixGRA04                                                                 0x4
+#define ixGRA05                                                                 0x5
+#define ixGRA06                                                                 0x6
+#define ixGRA07                                                                 0x7
+#define ixGRA08                                                                 0x8
+#define mmATTRX                                                                 0xf0
+#define mmATTRDW                                                                0xf0
+#define mmATTRDR                                                                0xf0
+#define ixATTR00                                                                0x0
+#define ixATTR01                                                                0x1
+#define ixATTR02                                                                0x2
+#define ixATTR03                                                                0x3
+#define ixATTR04                                                                0x4
+#define ixATTR05                                                                0x5
+#define ixATTR06                                                                0x6
+#define ixATTR07                                                                0x7
+#define ixATTR08                                                                0x8
+#define ixATTR09                                                                0x9
+#define ixATTR0A                                                                0xa
+#define ixATTR0B                                                                0xb
+#define ixATTR0C                                                                0xc
+#define ixATTR0D                                                                0xd
+#define ixATTR0E                                                                0xe
+#define ixATTR0F                                                                0xf
+#define ixATTR10                                                                0x10
+#define ixATTR11                                                                0x11
+#define ixATTR12                                                                0x12
+#define ixATTR13                                                                0x13
+#define ixATTR14                                                                0x14
+#define mmVGA_RENDER_CONTROL                                                    0xc0
+#define mmVGA_SOURCE_SELECT                                                     0xfc
+#define mmVGA_SEQUENCER_RESET_CONTROL                                           0xc1
+#define mmVGA_MODE_CONTROL                                                      0xc2
+#define mmVGA_SURFACE_PITCH_SELECT                                              0xc3
+#define mmVGA_MEMORY_BASE_ADDRESS                                               0xc4
+#define mmVGA_MEMORY_BASE_ADDRESS_HIGH                                          0xc9
+#define mmVGA_DISPBUF1_SURFACE_ADDR                                             0xc6
+#define mmVGA_DISPBUF2_SURFACE_ADDR                                             0xc8
+#define mmVGA_HDP_CONTROL                                                       0xca
+#define mmVGA_CACHE_CONTROL                                                     0xcb
+#define mmD1VGA_CONTROL                                                         0xcc
+#define mmD2VGA_CONTROL                                                         0xce
+#define mmD3VGA_CONTROL                                                         0xf8
+#define mmD4VGA_CONTROL                                                         0xf9
+#define mmD5VGA_CONTROL                                                         0xfa
+#define mmD6VGA_CONTROL                                                         0xfb
+#define mmVGA_HW_DEBUG                                                          0xcf
+#define mmVGA_STATUS                                                            0xd0
+#define mmVGA_INTERRUPT_CONTROL                                                 0xd1
+#define mmVGA_STATUS_CLEAR                                                      0xd2
+#define mmVGA_INTERRUPT_STATUS                                                  0xd3
+#define mmVGA_MAIN_CONTROL                                                      0xd4
+#define mmVGA_TEST_CONTROL                                                      0xd5
+#define mmVGA_DEBUG_READBACK_INDEX                                              0xd6
+#define mmVGA_DEBUG_READBACK_DATA                                               0xd7
+#define mmVGA_MEM_WRITE_PAGE_ADDR                                               0x12
+#define mmVGA_MEM_READ_PAGE_ADDR                                                0x13
+#define mmVGA_TEST_DEBUG_INDEX                                                  0xc5
+#define mmVGA_TEST_DEBUG_DATA                                                   0xc7
+#define ixVGADCC_DBG_DCCIF_C                                                    0x7e
+#define mmBPHYC_DAC_MACRO_CNTL                                                  0x48b9
+#define mmBPHYC_DAC_AUTO_CALIB_CONTROL                                          0x48ba
+#define mmDPG_PIPE_ARBITRATION_CONTROL1                                         0x1b30
+#define mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL1                                0x1b30
+#define mmDMIF_PG1_DPG_PIPE_ARBITRATION_CONTROL1                                0x1d30
+#define mmDMIF_PG2_DPG_PIPE_ARBITRATION_CONTROL1                                0x1f30
+#define mmDMIF_PG3_DPG_PIPE_ARBITRATION_CONTROL1                                0x4130
+#define mmDMIF_PG4_DPG_PIPE_ARBITRATION_CONTROL1                                0x4330
+#define mmDMIF_PG5_DPG_PIPE_ARBITRATION_CONTROL1                                0x4530
+#define mmDPG_PIPE_ARBITRATION_CONTROL2                                         0x1b31
+#define mmDMIF_PG0_DPG_PIPE_ARBITRATION_CONTROL2                                0x1b31
+#define mmDMIF_PG1_DPG_PIPE_ARBITRATION_CONTROL2                                0x1d31
+#define mmDMIF_PG2_DPG_PIPE_ARBITRATION_CONTROL2                                0x1f31
+#define mmDMIF_PG3_DPG_PIPE_ARBITRATION_CONTROL2                                0x4131
+#define mmDMIF_PG4_DPG_PIPE_ARBITRATION_CONTROL2                                0x4331
+#define mmDMIF_PG5_DPG_PIPE_ARBITRATION_CONTROL2                                0x4531
+#define mmDPG_WATERMARK_MASK_CONTROL                                            0x1b32
+#define mmDMIF_PG0_DPG_WATERMARK_MASK_CONTROL                                   0x1b32
+#define mmDMIF_PG1_DPG_WATERMARK_MASK_CONTROL                                   0x1d32
+#define mmDMIF_PG2_DPG_WATERMARK_MASK_CONTROL                                   0x1f32
+#define mmDMIF_PG3_DPG_WATERMARK_MASK_CONTROL                                   0x4132
+#define mmDMIF_PG4_DPG_WATERMARK_MASK_CONTROL                                   0x4332
+#define mmDMIF_PG5_DPG_WATERMARK_MASK_CONTROL                                   0x4532
+#define mmDPG_PIPE_URGENCY_CONTROL                                              0x1b33
+#define mmDMIF_PG0_DPG_PIPE_URGENCY_CONTROL                                     0x1b33
+#define mmDMIF_PG1_DPG_PIPE_URGENCY_CONTROL                                     0x1d33
+#define mmDMIF_PG2_DPG_PIPE_URGENCY_CONTROL                                     0x1f33
+#define mmDMIF_PG3_DPG_PIPE_URGENCY_CONTROL                                     0x4133
+#define mmDMIF_PG4_DPG_PIPE_URGENCY_CONTROL                                     0x4333
+#define mmDMIF_PG5_DPG_PIPE_URGENCY_CONTROL                                     0x4533
+#define mmDPG_PIPE_DPM_CONTROL                                                  0x1b34
+#define mmDMIF_PG0_DPG_PIPE_DPM_CONTROL                                         0x1b34
+#define mmDMIF_PG1_DPG_PIPE_DPM_CONTROL                                         0x1d34
+#define mmDMIF_PG2_DPG_PIPE_DPM_CONTROL                                         0x1f34
+#define mmDMIF_PG3_DPG_PIPE_DPM_CONTROL                                         0x4134
+#define mmDMIF_PG4_DPG_PIPE_DPM_CONTROL                                         0x4334
+#define mmDMIF_PG5_DPG_PIPE_DPM_CONTROL                                         0x4534
+#define mmDPG_PIPE_STUTTER_CONTROL                                              0x1b35
+#define mmDMIF_PG0_DPG_PIPE_STUTTER_CONTROL                                     0x1b35
+#define mmDMIF_PG1_DPG_PIPE_STUTTER_CONTROL                                     0x1d35
+#define mmDMIF_PG2_DPG_PIPE_STUTTER_CONTROL                                     0x1f35
+#define mmDMIF_PG3_DPG_PIPE_STUTTER_CONTROL                                     0x4135
+#define mmDMIF_PG4_DPG_PIPE_STUTTER_CONTROL                                     0x4335
+#define mmDMIF_PG5_DPG_PIPE_STUTTER_CONTROL                                     0x4535
+#define mmDPG_PIPE_NB_PSTATE_CHANGE_CONTROL                                     0x1b36
+#define mmDMIF_PG0_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x1b36
+#define mmDMIF_PG1_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x1d36
+#define mmDMIF_PG2_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x1f36
+#define mmDMIF_PG3_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x4136
+#define mmDMIF_PG4_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x4336
+#define mmDMIF_PG5_DPG_PIPE_NB_PSTATE_CHANGE_CONTROL                            0x4536
+#define mmDPG_PIPE_STUTTER_CONTROL_NONLPTCH                                     0x1b37
+#define mmDMIF_PG0_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x1b37
+#define mmDMIF_PG1_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x1d37
+#define mmDMIF_PG2_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x1f37
+#define mmDMIF_PG3_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x4137
+#define mmDMIF_PG4_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x4337
+#define mmDMIF_PG5_DPG_PIPE_STUTTER_CONTROL_NONLPTCH                            0x4537
+#define mmDPG_REPEATER_PROGRAM                                                  0x1b3a
+#define mmDMIF_PG0_DPG_REPEATER_PROGRAM                                         0x1b3a
+#define mmDMIF_PG1_DPG_REPEATER_PROGRAM                                         0x1d3a
+#define mmDMIF_PG2_DPG_REPEATER_PROGRAM                                         0x1f3a
+#define mmDMIF_PG3_DPG_REPEATER_PROGRAM                                         0x413a
+#define mmDMIF_PG4_DPG_REPEATER_PROGRAM                                         0x433a
+#define mmDMIF_PG5_DPG_REPEATER_PROGRAM                                         0x453a
+#define mmDPG_HW_DEBUG_A                                                        0x1b3b
+#define mmDMIF_PG0_DPG_HW_DEBUG_A                                               0x1b3b
+#define mmDMIF_PG1_DPG_HW_DEBUG_A                                               0x1d3b
+#define mmDMIF_PG2_DPG_HW_DEBUG_A                                               0x1f3b
+#define mmDMIF_PG3_DPG_HW_DEBUG_A                                               0x413b
+#define mmDMIF_PG4_DPG_HW_DEBUG_A                                               0x433b
+#define mmDMIF_PG5_DPG_HW_DEBUG_A                                               0x453b
+#define mmDPG_HW_DEBUG_B                                                        0x1b3c
+#define mmDMIF_PG0_DPG_HW_DEBUG_B                                               0x1b3c
+#define mmDMIF_PG1_DPG_HW_DEBUG_B                                               0x1d3c
+#define mmDMIF_PG2_DPG_HW_DEBUG_B                                               0x1f3c
+#define mmDMIF_PG3_DPG_HW_DEBUG_B                                               0x413c
+#define mmDMIF_PG4_DPG_HW_DEBUG_B                                               0x433c
+#define mmDMIF_PG5_DPG_HW_DEBUG_B                                               0x453c
+#define mmDPG_HW_DEBUG_11                                                       0x1b3d
+#define mmDMIF_PG0_DPG_HW_DEBUG_11                                              0x1b3d
+#define mmDMIF_PG1_DPG_HW_DEBUG_11                                              0x1d3d
+#define mmDMIF_PG2_DPG_HW_DEBUG_11                                              0x1f3d
+#define mmDMIF_PG3_DPG_HW_DEBUG_11                                              0x413d
+#define mmDMIF_PG4_DPG_HW_DEBUG_11                                              0x433d
+#define mmDMIF_PG5_DPG_HW_DEBUG_11                                              0x453d
+#define mmDPG_CHK_PRE_PROC_CNTL                                                 0x1b3e
+#define mmDMIF_PG0_DPG_CHK_PRE_PROC_CNTL                                        0x1b3e
+#define mmDMIF_PG1_DPG_CHK_PRE_PROC_CNTL                                        0x1d3e
+#define mmDMIF_PG2_DPG_CHK_PRE_PROC_CNTL                                        0x1f3e
+#define mmDMIF_PG3_DPG_CHK_PRE_PROC_CNTL                                        0x413e
+#define mmDMIF_PG4_DPG_CHK_PRE_PROC_CNTL                                        0x433e
+#define mmDMIF_PG5_DPG_CHK_PRE_PROC_CNTL                                        0x453e
+#define mmDPG_DVMM_STATUS                                                       0x1b3f
+#define mmDMIF_PG0_DPG_DVMM_STATUS                                              0x1b3f
+#define mmDMIF_PG1_DPG_DVMM_STATUS                                              0x1d3f
+#define mmDMIF_PG2_DPG_DVMM_STATUS                                              0x1f3f
+#define mmDMIF_PG3_DPG_DVMM_STATUS                                              0x413f
+#define mmDMIF_PG4_DPG_DVMM_STATUS                                              0x433f
+#define mmDMIF_PG5_DPG_DVMM_STATUS                                              0x453f
+#define mmDPG_TEST_DEBUG_INDEX                                                  0x1b38
+#define mmDMIF_PG0_DPG_TEST_DEBUG_INDEX                                         0x1b38
+#define mmDMIF_PG1_DPG_TEST_DEBUG_INDEX                                         0x1d38
+#define mmDMIF_PG2_DPG_TEST_DEBUG_INDEX                                         0x1f38
+#define mmDMIF_PG3_DPG_TEST_DEBUG_INDEX                                         0x4138
+#define mmDMIF_PG4_DPG_TEST_DEBUG_INDEX                                         0x4338
+#define mmDMIF_PG5_DPG_TEST_DEBUG_INDEX                                         0x4538
+#define mmDPG_TEST_DEBUG_DATA                                                   0x1b39
+#define mmDMIF_PG0_DPG_TEST_DEBUG_DATA                                          0x1b39
+#define mmDMIF_PG1_DPG_TEST_DEBUG_DATA                                          0x1d39
+#define mmDMIF_PG2_DPG_TEST_DEBUG_DATA                                          0x1f39
+#define mmDMIF_PG3_DPG_TEST_DEBUG_DATA                                          0x4139
+#define mmDMIF_PG4_DPG_TEST_DEBUG_DATA                                          0x4339
+#define mmDMIF_PG5_DPG_TEST_DEBUG_DATA                                          0x4539
+#define mmDPGV0_PIPE_ARBITRATION_CONTROL1                                       0x4730
+#define mmDMIFV_PG0_DPGV0_PIPE_ARBITRATION_CONTROL1                             0x4730
+#define mmDMIFV_PG1_DPGV0_PIPE_ARBITRATION_CONTROL1                             0x9930
+#define mmDPGV1_PIPE_ARBITRATION_CONTROL1                                       0x473d
+#define mmDMIFV_PG0_DPGV1_PIPE_ARBITRATION_CONTROL1                             0x473d
+#define mmDMIFV_PG1_DPGV1_PIPE_ARBITRATION_CONTROL1                             0x993d
+#define mmDPGV0_PIPE_ARBITRATION_CONTROL2                                       0x4731
+#define mmDMIFV_PG0_DPGV0_PIPE_ARBITRATION_CONTROL2                             0x4731
+#define mmDMIFV_PG1_DPGV0_PIPE_ARBITRATION_CONTROL2                             0x9931
+#define mmDPGV1_PIPE_ARBITRATION_CONTROL2                                       0x473e
+#define mmDMIFV_PG0_DPGV1_PIPE_ARBITRATION_CONTROL2                             0x473e
+#define mmDMIFV_PG1_DPGV1_PIPE_ARBITRATION_CONTROL2                             0x993e
+#define mmDPGV0_WATERMARK_MASK_CONTROL                                          0x4732
+#define mmDMIFV_PG0_DPGV0_WATERMARK_MASK_CONTROL                                0x4732
+#define mmDMIFV_PG1_DPGV0_WATERMARK_MASK_CONTROL                                0x9932
+#define mmDPGV1_WATERMARK_MASK_CONTROL                                          0x473f
+#define mmDMIFV_PG0_DPGV1_WATERMARK_MASK_CONTROL                                0x473f
+#define mmDMIFV_PG1_DPGV1_WATERMARK_MASK_CONTROL                                0x993f
+#define mmDPGV0_PIPE_URGENCY_CONTROL                                            0x4733
+#define mmDMIFV_PG0_DPGV0_PIPE_URGENCY_CONTROL                                  0x4733
+#define mmDMIFV_PG1_DPGV0_PIPE_URGENCY_CONTROL                                  0x9933
+#define mmDPGV1_PIPE_URGENCY_CONTROL                                            0x4740
+#define mmDMIFV_PG0_DPGV1_PIPE_URGENCY_CONTROL                                  0x4740
+#define mmDMIFV_PG1_DPGV1_PIPE_URGENCY_CONTROL                                  0x9940
+#define mmDPGV0_PIPE_DPM_CONTROL                                                0x4734
+#define mmDMIFV_PG0_DPGV0_PIPE_DPM_CONTROL                                      0x4734
+#define mmDMIFV_PG1_DPGV0_PIPE_DPM_CONTROL                                      0x9934
+#define mmDPGV1_PIPE_DPM_CONTROL                                                0x4741
+#define mmDMIFV_PG0_DPGV1_PIPE_DPM_CONTROL                                      0x4741
+#define mmDMIFV_PG1_DPGV1_PIPE_DPM_CONTROL                                      0x9941
+#define mmDPGV0_PIPE_STUTTER_CONTROL                                            0x4735
+#define mmDMIFV_PG0_DPGV0_PIPE_STUTTER_CONTROL                                  0x4735
+#define mmDMIFV_PG1_DPGV0_PIPE_STUTTER_CONTROL                                  0x9935
+#define mmDPGV1_PIPE_STUTTER_CONTROL                                            0x4742
+#define mmDMIFV_PG0_DPGV1_PIPE_STUTTER_CONTROL                                  0x4742
+#define mmDMIFV_PG1_DPGV1_PIPE_STUTTER_CONTROL                                  0x9942
+#define mmDPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL                                   0x4736
+#define mmDMIFV_PG0_DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL                         0x4736
+#define mmDMIFV_PG1_DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL                         0x9936
+#define mmDPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL                                   0x4743
+#define mmDMIFV_PG0_DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL                         0x4743
+#define mmDMIFV_PG1_DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL                         0x9943
+#define mmDPGV0_PIPE_STUTTER_CONTROL_NONLPTCH                                   0x4737
+#define mmDMIFV_PG0_DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH                         0x4737
+#define mmDMIFV_PG1_DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH                         0x9937
+#define mmDPGV1_PIPE_STUTTER_CONTROL_NONLPTCH                                   0x4744
+#define mmDMIFV_PG0_DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH                         0x4744
+#define mmDMIFV_PG1_DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH                         0x9944
+#define mmDPGV0_REPEATER_PROGRAM                                                0x4738
+#define mmDMIFV_PG0_DPGV0_REPEATER_PROGRAM                                      0x4738
+#define mmDMIFV_PG1_DPGV0_REPEATER_PROGRAM                                      0x9938
+#define mmDPGV1_REPEATER_PROGRAM                                                0x4745
+#define mmDMIFV_PG0_DPGV1_REPEATER_PROGRAM                                      0x4745
+#define mmDMIFV_PG1_DPGV1_REPEATER_PROGRAM                                      0x9945
+#define mmDPGV0_HW_DEBUG_A                                                      0x4739
+#define mmDMIFV_PG0_DPGV0_HW_DEBUG_A                                            0x4739
+#define mmDMIFV_PG1_DPGV0_HW_DEBUG_A                                            0x9939
+#define mmDPGV1_HW_DEBUG_A                                                      0x4746
+#define mmDMIFV_PG0_DPGV1_HW_DEBUG_A                                            0x4746
+#define mmDMIFV_PG1_DPGV1_HW_DEBUG_A                                            0x9946
+#define mmDPGV0_HW_DEBUG_B                                                      0x473a
+#define mmDMIFV_PG0_DPGV0_HW_DEBUG_B                                            0x473a
+#define mmDMIFV_PG1_DPGV0_HW_DEBUG_B                                            0x993a
+#define mmDPGV1_HW_DEBUG_B                                                      0x4747
+#define mmDMIFV_PG0_DPGV1_HW_DEBUG_B                                            0x4747
+#define mmDMIFV_PG1_DPGV1_HW_DEBUG_B                                            0x9947
+#define mmDPGV0_HW_DEBUG_11                                                     0x473b
+#define mmDMIFV_PG0_DPGV0_HW_DEBUG_11                                           0x473b
+#define mmDMIFV_PG1_DPGV0_HW_DEBUG_11                                           0x993b
+#define mmDPGV1_HW_DEBUG_11                                                     0x4748
+#define mmDMIFV_PG0_DPGV1_HW_DEBUG_11                                           0x4748
+#define mmDMIFV_PG1_DPGV1_HW_DEBUG_11                                           0x9948
+#define mmDPGV0_CHK_PRE_PROC_CNTL                                               0x473c
+#define mmDMIFV_PG0_DPGV0_CHK_PRE_PROC_CNTL                                     0x473c
+#define mmDMIFV_PG1_DPGV0_CHK_PRE_PROC_CNTL                                     0x993c
+#define mmDPGV1_CHK_PRE_PROC_CNTL                                               0x4749
+#define mmDMIFV_PG0_DPGV1_CHK_PRE_PROC_CNTL                                     0x4749
+#define mmDMIFV_PG1_DPGV1_CHK_PRE_PROC_CNTL                                     0x9949
+#define mmDPGV_TEST_DEBUG_INDEX                                                 0x474e
+#define mmDMIFV_PG0_DPGV_TEST_DEBUG_INDEX                                       0x474e
+#define mmDMIFV_PG1_DPGV_TEST_DEBUG_INDEX                                       0x994e
+#define mmDPGV_TEST_DEBUG_DATA                                                  0x474f
+#define mmDMIFV_PG0_DPGV_TEST_DEBUG_DATA                                        0x474f
+#define mmDMIFV_PG1_DPGV_TEST_DEBUG_DATA                                        0x994f
+#define mmAZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX                       0x18
+#define mmAZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA                        0x18
+#define ixAZALIA_F2_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID                   0xf00
+#define ixAZALIA_F2_CODEC_ROOT_PARAMETER_REVISION_ID                            0xf02
+#define ixAZALIA_F2_CODEC_ROOT_PARAMETER_SUBORDINATE_NODE_COUNT                 0xf04
+#define ixAZALIA_F2_CODEC_FUNCTION_PARAMETER_SUBORDINATE_NODE_COUNT             0x1f04
+#define ixAZALIA_F2_CODEC_FUNCTION_PARAMETER_GROUP_TYPE                         0x1f05
+#define ixAZALIA_F2_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES               0x1f0a
+#define ixAZALIA_F2_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS                     0x1f0b
+#define ixAZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES                       0x1f0f
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE                          0x1705
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_RESET                                0x17ff
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID                0x1720
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_2              0x1721
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_3              0x1722
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_4              0x1723
+#define ixAZALIA_F2_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION            0x1770
+#define mmAZALIA_F0_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID                   0x1828
+#define mmAZALIA_F0_CODEC_ROOT_PARAMETER_REVISION_ID                            0x1829
+#define mmAZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL                                 0x182a
+#define mmAZALIA_F0_CODEC_RESYNC_FIFO_CONTROL                                   0x182b
+#define mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_GROUP_TYPE                         0x182c
+#define mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES               0x182d
+#define mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS                     0x182e
+#define mmAZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES                       0x182f
+#define mmAZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE                          0x1830
+#define mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESET                                0x1831
+#define mmAZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID                0x1832
+#define mmAZALIA_F0_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION            0x1833
+#define mmCC_RCU_DC_AUDIO_PORT_CONNECTIVITY                                     0x1834
+#define mmCC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY                               0x1835
+#define mmAZALIA_F0_CODEC_DEBUG                                                 0x1836
+#define mmAZALIA_F0_GTC_GROUP_OFFSET0                                           0x1837
+#define mmAZALIA_F0_GTC_GROUP_OFFSET1                                           0x1838
+#define mmAZALIA_F0_GTC_GROUP_OFFSET2                                           0x1839
+#define mmAZALIA_F0_GTC_GROUP_OFFSET3                                           0x183a
+#define mmAZALIA_F0_GTC_GROUP_OFFSET4                                           0x183b
+#define mmAZALIA_F0_GTC_GROUP_OFFSET5                                           0x183c
+#define mmAZALIA_F0_GTC_GROUP_OFFSET6                                           0x183d
+#define mmGLOBAL_CAPABILITIES                                                   0x0
+#define mmMINOR_VERSION                                                         0x0
+#define mmMAJOR_VERSION                                                         0x0
+#define mmOUTPUT_PAYLOAD_CAPABILITY                                             0x1
+#define mmINPUT_PAYLOAD_CAPABILITY                                              0x1
+#define mmGLOBAL_CONTROL                                                        0x2
+#define mmWAKE_ENABLE                                                           0x3
+#define mmSTATE_CHANGE_STATUS                                                   0x3
+#define mmGLOBAL_STATUS                                                         0x4
+#define mmOUTPUT_STREAM_PAYLOAD_CAPABILITY                                      0x6
+#define mmINPUT_STREAM_PAYLOAD_CAPABILITY                                       0x6
+#define mmINTERRUPT_CONTROL                                                     0x8
+#define mmINTERRUPT_STATUS                                                      0x9
+#define mmWALL_CLOCK_COUNTER                                                    0xc
+#define mmSTREAM_SYNCHRONIZATION                                                0xe
+#define mmCORB_LOWER_BASE_ADDRESS                                               0x10
+#define mmCORB_UPPER_BASE_ADDRESS                                               0x11
+#define mmCORB_WRITE_POINTER                                                    0x12
+#define mmCORB_READ_POINTER                                                     0x12
+#define mmCORB_CONTROL                                                          0x13
+#define mmCORB_STATUS                                                           0x13
+#define mmCORB_SIZE                                                             0x13
+#define mmRIRB_LOWER_BASE_ADDRESS                                               0x14
+#define mmRIRB_UPPER_BASE_ADDRESS                                               0x15
+#define mmRIRB_WRITE_POINTER                                                    0x16
+#define mmRESPONSE_INTERRUPT_COUNT                                              0x16
+#define mmRIRB_CONTROL                                                          0x17
+#define mmRIRB_STATUS                                                           0x17
+#define mmRIRB_SIZE                                                             0x17
+#define mmIMMEDIATE_COMMAND_OUTPUT_INTERFACE                                    0x18
+#define mmIMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX                              0x18
+#define mmIMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA                               0x18
+#define mmIMMEDIATE_RESPONSE_INPUT_INTERFACE                                    0x19
+#define mmIMMEDIATE_COMMAND_STATUS                                              0x1a
+#define mmDMA_POSITION_LOWER_BASE_ADDRESS                                       0x1c
+#define mmDMA_POSITION_UPPER_BASE_ADDRESS                                       0x1d
+#define mmWALL_CLOCK_COUNTER_ALIAS                                              0x80c
+#define mmOUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS                           0x20
+#define mmOUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER              0x21
+#define mmOUTPUT_STREAM_DESCRIPTOR_CYCLIC_BUFFER_LENGTH                         0x22
+#define mmOUTPUT_STREAM_DESCRIPTOR_LAST_VALID_INDEX                             0x23
+#define mmOUTPUT_STREAM_DESCRIPTOR_FIFO_SIZE                                    0x24
+#define mmOUTPUT_STREAM_DESCRIPTOR_FORMAT                                       0x24
+#define mmOUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_LOWER_BASE_ADDRESS               0x26
+#define mmOUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_UPPER_BASE_ADDRESS               0x27
+#define mmOUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER_ALIAS        0x821
+#define mmAZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX                   0x18
+#define mmAZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA                    0x18
+#define ixAZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES         0x2f09
+#define ixAZALIA_F2_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES              0x2f0a
+#define ixAZALIA_F2_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS                    0x2f0b
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT                    0x2200
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID                   0x2706
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER                   0x270d
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_2                 0x270e
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3                 0x273e
+#define ixAZALIA_F2_CODEC_CONVERTER_STRIPE_CONTROL                              0x2724
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_RAMP_RATE                           0x2770
+#define ixAZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING                       0x2771
+#define ixAZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES               0x3f09
+#define ixAZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES                            0x3f0c
+#define ixAZALIA_F2_CODEC_PIN_PARAMETER_CONNECTION_LIST_LENGTH                  0x3f0e
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONNECTION_LIST_ENTRY            0x3702
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL                            0x3707
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE                      0x3708
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE                        0x3709
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT            0x371c
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2          0x371d
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3          0x371e
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4          0x371f
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION               0x3770
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_CHANNEL_ALLOCATION                        0x3771
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO                             0x3772
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR                          0x3776
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR_DATA                     0x3776
+#define ixAUDIO_DESCRIPTOR0                                                     0x1
+#define ixAUDIO_DESCRIPTOR1                                                     0x2
+#define ixAUDIO_DESCRIPTOR2                                                     0x3
+#define ixAUDIO_DESCRIPTOR3                                                     0x4
+#define ixAUDIO_DESCRIPTOR4                                                     0x5
+#define ixAUDIO_DESCRIPTOR5                                                     0x6
+#define ixAUDIO_DESCRIPTOR6                                                     0x7
+#define ixAUDIO_DESCRIPTOR7                                                     0x8
+#define ixAUDIO_DESCRIPTOR8                                                     0x9
+#define ixAUDIO_DESCRIPTOR9                                                     0xa
+#define ixAUDIO_DESCRIPTOR10                                                    0xb
+#define ixAUDIO_DESCRIPTOR11                                                    0xc
+#define ixAUDIO_DESCRIPTOR12                                                    0xd
+#define ixAUDIO_DESCRIPTOR13                                                    0xe
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE                     0x3777
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE                     0x3778
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE                     0x3779
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE                     0x377a
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_LIPSYNC                                   0x377b
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_HBR                                       0x377c
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_INDEX                     0x3780
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_DATA                      0x3781
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MANUFACTURER_ID                           0x0
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_PRODUCT_ID                                0x1
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_SINK_DESCRIPTION_LEN                      0x2
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_PORTID0                                   0x3
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_PORTID1                                   0x4
+#define ixSINK_DESCRIPTION0                                                     0x5
+#define ixSINK_DESCRIPTION1                                                     0x6
+#define ixSINK_DESCRIPTION2                                                     0x7
+#define ixSINK_DESCRIPTION3                                                     0x8
+#define ixSINK_DESCRIPTION4                                                     0x9
+#define ixSINK_DESCRIPTION5                                                     0xa
+#define ixSINK_DESCRIPTION6                                                     0xb
+#define ixSINK_DESCRIPTION7                                                     0xc
+#define ixSINK_DESCRIPTION8                                                     0xd
+#define ixSINK_DESCRIPTION9                                                     0xe
+#define ixSINK_DESCRIPTION10                                                    0xf
+#define ixSINK_DESCRIPTION11                                                    0x10
+#define ixSINK_DESCRIPTION12                                                    0x11
+#define ixSINK_DESCRIPTION13                                                    0x12
+#define ixSINK_DESCRIPTION14                                                    0x13
+#define ixSINK_DESCRIPTION15                                                    0x14
+#define ixSINK_DESCRIPTION16                                                    0x15
+#define ixSINK_DESCRIPTION17                                                    0x16
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE                      0x3785
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE                      0x3786
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE                      0x3787
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE                      0x3788
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE                         0x3789
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_0                             0x378a
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1                             0x378b
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_2                             0x378c
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_3                             0x378d
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4                             0x378e
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_5                             0x378f
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_6                             0x3790
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_7                             0x3791
+#define ixAZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_8                             0x3792
+#define ixAZALIA_F2_CODEC_PIN_ASSOCIATION_INFO                                  0x3793
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS                     0x3797
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL                     0x3798
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_LPIB                                      0x3799
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT                       0x379a
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_CODING_TYPE                               0x379b
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED                            0x379c
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION           0x379d
+#define ixAZALIA_F2_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE                          0x379e
+#define mmAZALIA_CONTROLLER_CLOCK_GATING                                        0x17e4
+#define mmAZALIA_AUDIO_DTO                                                      0x17e5
+#define mmAZALIA_AUDIO_DTO_CONTROL                                              0x17e6
+#define mmAZALIA_SCLK_CONTROL                                                   0x17e7
+#define mmAZALIA_UNDERFLOW_FILLER_SAMPLE                                        0x17e8
+#define mmAZALIA_DATA_DMA_CONTROL                                               0x17e9
+#define mmAZALIA_BDL_DMA_CONTROL                                                0x17ea
+#define mmAZALIA_RIRB_AND_DP_CONTROL                                            0x17eb
+#define mmAZALIA_CORB_DMA_CONTROL                                               0x17ec
+#define mmAZALIA_APPLICATION_POSITION_IN_CYCLIC_BUFFER                          0x17f3
+#define mmAZALIA_CYCLIC_BUFFER_SYNC                                             0x17f4
+#define mmAZALIA_GLOBAL_CAPABILITIES                                            0x17f5
+#define mmAZALIA_OUTPUT_PAYLOAD_CAPABILITY                                      0x17f6
+#define mmAZALIA_OUTPUT_STREAM_ARBITER_CONTROL                                  0x17f7
+#define mmAZALIA_INPUT_PAYLOAD_CAPABILITY                                       0x17f8
+#define mmAZALIA_CONTROLLER_DEBUG                                               0x17f9
+#define mmAZALIA_MEM_PWR_CTRL                                                   0x1810
+#define mmAZALIA_MEM_PWR_STATUS                                                 0x1811
+#define mmDCI_PG_DEBUG_CONFIG                                                   0x1812
+#define mmAZALIA_INPUT_CRC0_CONTROL0                                            0x17fb
+#define mmAZALIA_INPUT_CRC0_CONTROL1                                            0x17fc
+#define mmAZALIA_INPUT_CRC0_CONTROL2                                            0x17fd
+#define mmAZALIA_INPUT_CRC0_CONTROL3                                            0x17fe
+#define mmAZALIA_INPUT_CRC0_RESULT                                              0x17ff
+#define ixAZALIA_INPUT_CRC0_CHANNEL0                                            0x0
+#define ixAZALIA_INPUT_CRC0_CHANNEL1                                            0x1
+#define ixAZALIA_INPUT_CRC0_CHANNEL2                                            0x2
+#define ixAZALIA_INPUT_CRC0_CHANNEL3                                            0x3
+#define ixAZALIA_INPUT_CRC0_CHANNEL4                                            0x4
+#define ixAZALIA_INPUT_CRC0_CHANNEL5                                            0x5
+#define ixAZALIA_INPUT_CRC0_CHANNEL6                                            0x6
+#define ixAZALIA_INPUT_CRC0_CHANNEL7                                            0x7
+#define mmAZALIA_INPUT_CRC1_CONTROL0                                            0x1800
+#define mmAZALIA_INPUT_CRC1_CONTROL1                                            0x1801
+#define mmAZALIA_INPUT_CRC1_CONTROL2                                            0x1802
+#define mmAZALIA_INPUT_CRC1_CONTROL3                                            0x1803
+#define mmAZALIA_INPUT_CRC1_RESULT                                              0x1804
+#define ixAZALIA_INPUT_CRC1_CHANNEL0                                            0x0
+#define ixAZALIA_INPUT_CRC1_CHANNEL1                                            0x1
+#define ixAZALIA_INPUT_CRC1_CHANNEL2                                            0x2
+#define ixAZALIA_INPUT_CRC1_CHANNEL3                                            0x3
+#define ixAZALIA_INPUT_CRC1_CHANNEL4                                            0x4
+#define ixAZALIA_INPUT_CRC1_CHANNEL5                                            0x5
+#define ixAZALIA_INPUT_CRC1_CHANNEL6                                            0x6
+#define ixAZALIA_INPUT_CRC1_CHANNEL7                                            0x7
+#define mmAZALIA_CRC0_CONTROL0                                                  0x1805
+#define mmAZALIA_CRC0_CONTROL1                                                  0x1806
+#define mmAZALIA_CRC0_CONTROL2                                                  0x1807
+#define mmAZALIA_CRC0_CONTROL3                                                  0x1808
+#define mmAZALIA_CRC0_RESULT                                                    0x1809
+#define ixAZALIA_CRC0_CHANNEL0                                                  0x0
+#define ixAZALIA_CRC0_CHANNEL1                                                  0x1
+#define ixAZALIA_CRC0_CHANNEL2                                                  0x2
+#define ixAZALIA_CRC0_CHANNEL3                                                  0x3
+#define ixAZALIA_CRC0_CHANNEL4                                                  0x4
+#define ixAZALIA_CRC0_CHANNEL5                                                  0x5
+#define ixAZALIA_CRC0_CHANNEL6                                                  0x6
+#define ixAZALIA_CRC0_CHANNEL7                                                  0x7
+#define mmAZALIA_CRC1_CONTROL0                                                  0x180a
+#define mmAZALIA_CRC1_CONTROL1                                                  0x180b
+#define mmAZALIA_CRC1_CONTROL2                                                  0x180c
+#define mmAZALIA_CRC1_CONTROL3                                                  0x180d
+#define mmAZALIA_CRC1_RESULT                                                    0x180e
+#define ixAZALIA_CRC1_CHANNEL0                                                  0x0
+#define ixAZALIA_CRC1_CHANNEL1                                                  0x1
+#define ixAZALIA_CRC1_CHANNEL2                                                  0x2
+#define ixAZALIA_CRC1_CHANNEL3                                                  0x3
+#define ixAZALIA_CRC1_CHANNEL4                                                  0x4
+#define ixAZALIA_CRC1_CHANNEL5                                                  0x5
+#define ixAZALIA_CRC1_CHANNEL6                                                  0x6
+#define ixAZALIA_CRC1_CHANNEL7                                                  0x7
+#define mmAZ_TEST_DEBUG_INDEX                                                   0x181f
+#define mmAZ_TEST_DEBUG_DATA                                                    0x1820
+#define mmAZALIA_STREAM_INDEX                                                   0x1780
+#define mmAZF0STREAM0_AZALIA_STREAM_INDEX                                       0x1780
+#define mmAZF0STREAM1_AZALIA_STREAM_INDEX                                       0x1782
+#define mmAZF0STREAM2_AZALIA_STREAM_INDEX                                       0x1784
+#define mmAZF0STREAM3_AZALIA_STREAM_INDEX                                       0x1786
+#define mmAZF0STREAM4_AZALIA_STREAM_INDEX                                       0x1788
+#define mmAZF0STREAM5_AZALIA_STREAM_INDEX                                       0x178a
+#define mmAZF0STREAM6_AZALIA_STREAM_INDEX                                       0x178c
+#define mmAZF0STREAM7_AZALIA_STREAM_INDEX                                       0x178e
+#define mmAZF0STREAM8_AZALIA_STREAM_INDEX                                       0x59c0
+#define mmAZF0STREAM9_AZALIA_STREAM_INDEX                                       0x59c2
+#define mmAZF0STREAM10_AZALIA_STREAM_INDEX                                      0x59c4
+#define mmAZF0STREAM11_AZALIA_STREAM_INDEX                                      0x59c6
+#define mmAZF0STREAM12_AZALIA_STREAM_INDEX                                      0x59c8
+#define mmAZF0STREAM13_AZALIA_STREAM_INDEX                                      0x59ca
+#define mmAZF0STREAM14_AZALIA_STREAM_INDEX                                      0x59cc
+#define mmAZF0STREAM15_AZALIA_STREAM_INDEX                                      0x59ce
+#define mmAZALIA_STREAM_DATA                                                    0x1781
+#define mmAZF0STREAM0_AZALIA_STREAM_DATA                                        0x1781
+#define mmAZF0STREAM1_AZALIA_STREAM_DATA                                        0x1783
+#define mmAZF0STREAM2_AZALIA_STREAM_DATA                                        0x1785
+#define mmAZF0STREAM3_AZALIA_STREAM_DATA                                        0x1787
+#define mmAZF0STREAM4_AZALIA_STREAM_DATA                                        0x1789
+#define mmAZF0STREAM5_AZALIA_STREAM_DATA                                        0x178b
+#define mmAZF0STREAM6_AZALIA_STREAM_DATA                                        0x178d
+#define mmAZF0STREAM7_AZALIA_STREAM_DATA                                        0x178f
+#define mmAZF0STREAM8_AZALIA_STREAM_DATA                                        0x59c1
+#define mmAZF0STREAM9_AZALIA_STREAM_DATA                                        0x59c3
+#define mmAZF0STREAM10_AZALIA_STREAM_DATA                                       0x59c5
+#define mmAZF0STREAM11_AZALIA_STREAM_DATA                                       0x59c7
+#define mmAZF0STREAM12_AZALIA_STREAM_DATA                                       0x59c9
+#define mmAZF0STREAM13_AZALIA_STREAM_DATA                                       0x59cb
+#define mmAZF0STREAM14_AZALIA_STREAM_DATA                                       0x59cd
+#define mmAZF0STREAM15_AZALIA_STREAM_DATA                                       0x59cf
+#define ixAZALIA_FIFO_SIZE_CONTROL                                              0x0
+#define ixAZALIA_LATENCY_COUNTER_CONTROL                                        0x1
+#define ixAZALIA_WORSTCASE_LATENCY_COUNT                                        0x2
+#define ixAZALIA_CUMULATIVE_LATENCY_COUNT                                       0x3
+#define ixAZALIA_CUMULATIVE_REQUEST_COUNT                                       0x4
+#define ixAZALIA_STREAM_DEBUG                                                   0x5
+#define mmAZALIA_F0_CODEC_ENDPOINT_INDEX                                        0x17a8
+#define mmAZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17a8
+#define mmAZF0ENDPOINT1_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17ac
+#define mmAZF0ENDPOINT2_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17b0
+#define mmAZF0ENDPOINT3_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17b4
+#define mmAZF0ENDPOINT4_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17b8
+#define mmAZF0ENDPOINT5_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17bc
+#define mmAZF0ENDPOINT6_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17c0
+#define mmAZF0ENDPOINT7_AZALIA_F0_CODEC_ENDPOINT_INDEX                          0x17c4
+#define mmAZALIA_F0_CODEC_ENDPOINT_DATA                                         0x17a9
+#define mmAZF0ENDPOINT0_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17a9
+#define mmAZF0ENDPOINT1_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17ad
+#define mmAZF0ENDPOINT2_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17b1
+#define mmAZF0ENDPOINT3_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17b5
+#define mmAZF0ENDPOINT4_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17b9
+#define mmAZF0ENDPOINT5_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17bd
+#define mmAZF0ENDPOINT6_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17c1
+#define mmAZF0ENDPOINT7_AZALIA_F0_CODEC_ENDPOINT_DATA                           0x17c5
+#define ixAZALIA_F0_CODEC_CONVERTER_PIN_DEBUG                                   0x0
+#define ixAZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES         0x1
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT                    0x2
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID                   0x3
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER                   0x4
+#define ixAZALIA_F0_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS                    0x5
+#define ixAZALIA_F0_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES              0x6
+#define ixAZALIA_F0_CODEC_CONVERTER_STRIPE_CONTROL                              0x7
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_RAMP_RATE                           0x8
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING                       0x9
+#define ixAZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_OFFSET_DEBUG                    0xa
+#define ixAZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA                           0xc
+#define ixAZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MIN                       0xd
+#define ixAZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MAX                       0xe
+#define ixAZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES               0x20
+#define ixAZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES                            0x21
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE                      0x22
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE                        0x23
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_WIDGET_CONTROL                            0x24
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER                           0x25
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0                         0x28
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1                         0x29
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2                         0x2a
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3                         0x2b
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4                         0x2c
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5                         0x2d
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6                         0x2e
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7                         0x2f
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8                         0x30
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9                         0x31
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10                        0x32
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11                        0x33
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12                        0x34
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13                        0x35
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE                       0x36
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2                      0x57
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE                         0x58
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC                          0x37
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR                              0x38
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0                                0x3a
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1                                0x3b
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2                                0x3c
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3                                0x3d
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4                                0x3e
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5                                0x3f
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6                                0x40
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7                                0x41
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8                                0x42
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL                          0x54
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE                0x55
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT            0x56
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_0                             0x59
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1                             0x5a
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_2                             0x5b
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_3                             0x5c
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4                             0x5d
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_5                             0x5e
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_6                             0x5f
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_7                             0x60
+#define ixAZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_8                             0x61
+#define ixAZALIA_F0_CODEC_PIN_ASSOCIATION_INFO                                  0x62
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS                     0x63
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL                     0x64
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_LPIB                                      0x65
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT                       0x66
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_CODING_TYPE                               0x67
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED                            0x68
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION           0x69
+#define ixAZALIA_F0_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE                          0x6a
+#define ixAZALIA_F0_AUDIO_ENABLE_STATUS                                         0x6b
+#define ixAZALIA_F0_AUDIO_ENABLED_INT_STATUS                                    0x6c
+#define ixAZALIA_F0_AUDIO_DISABLED_INT_STATUS                                   0x6d
+#define ixAZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS                             0x6e
+#define mmAZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX                                  0x59d4
+#define mmAZF0INPUTENDPOINT0_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59d4
+#define mmAZF0INPUTENDPOINT1_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59d8
+#define mmAZF0INPUTENDPOINT2_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59dc
+#define mmAZF0INPUTENDPOINT3_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59e0
+#define mmAZF0INPUTENDPOINT4_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59e4
+#define mmAZF0INPUTENDPOINT5_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59e8
+#define mmAZF0INPUTENDPOINT6_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59ec
+#define mmAZF0INPUTENDPOINT7_AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX               0x59f0
+#define mmAZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                                   0x59d5
+#define mmAZF0INPUTENDPOINT0_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59d5
+#define mmAZF0INPUTENDPOINT1_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59d9
+#define mmAZF0INPUTENDPOINT2_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59dd
+#define mmAZF0INPUTENDPOINT3_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59e1
+#define mmAZF0INPUTENDPOINT4_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59e5
+#define mmAZF0INPUTENDPOINT5_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59e9
+#define mmAZF0INPUTENDPOINT6_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59ed
+#define mmAZF0INPUTENDPOINT7_AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA                0x59f1
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_PIN_DEBUG                             0x0
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES   0x1
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT              0x2
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID             0x3
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER             0x4
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS              0x5
+#define ixAZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES        0x6
+#define ixAZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES         0x20
+#define ixAZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES                      0x21
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE                0x22
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_INPUT_PIN_SENSE            0x23
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL                      0x24
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE                 0x36
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2                0x37
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR                        0x38
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION                  0x53
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL                    0x54
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE          0x55
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT      0x56
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL                0x67
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME                           0x68
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL               0x64
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB                                0x65
+#define ixAZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT                 0x66
+#define mmAZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_INDEX                    0x18
+#define mmAZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_DATA                     0x18
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES   0x6f09
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES        0x6f0a
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS              0x6f0b
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT              0x6200
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID             0x6706
+#define ixAZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER             0x670d
+#define ixAZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES         0x7f09
+#define ixAZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES                      0x7f0c
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL                      0x7707
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE                0x7708
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_PIN_SENSE                  0x7709
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT      0x771c
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2    0x771d
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3    0x771e
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4    0x771f
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE                0x7777
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE                0x7785
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE                0x7778
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE                0x7786
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_HBR                                 0x777c
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE                0x7779
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE                0x7787
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE                0x777a
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE                0x7788
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION                  0x7771
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL                0x779b
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME                           0x779c
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_L                    0x779d
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_H                    0x779e
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL               0x7798
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB                                0x7799
+#define ixAZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT                 0x779a
+#define mmBLND_CONTROL                                                          0x1b6d
+#define mmBLND0_BLND_CONTROL                                                    0x1b6d
+#define mmBLND1_BLND_CONTROL                                                    0x1d6d
+#define mmBLND2_BLND_CONTROL                                                    0x1f6d
+#define mmBLND3_BLND_CONTROL                                                    0x416d
+#define mmBLND4_BLND_CONTROL                                                    0x436d
+#define mmBLND5_BLND_CONTROL                                                    0x456d
+#define mmBLND_SM_CONTROL2                                                      0x1b6e
+#define mmBLND0_BLND_SM_CONTROL2                                                0x1b6e
+#define mmBLND1_BLND_SM_CONTROL2                                                0x1d6e
+#define mmBLND2_BLND_SM_CONTROL2                                                0x1f6e
+#define mmBLND3_BLND_SM_CONTROL2                                                0x416e
+#define mmBLND4_BLND_SM_CONTROL2                                                0x436e
+#define mmBLND5_BLND_SM_CONTROL2                                                0x456e
+#define mmBLND_CONTROL2                                                         0x1b6f
+#define mmBLND0_BLND_CONTROL2                                                   0x1b6f
+#define mmBLND1_BLND_CONTROL2                                                   0x1d6f
+#define mmBLND2_BLND_CONTROL2                                                   0x1f6f
+#define mmBLND3_BLND_CONTROL2                                                   0x416f
+#define mmBLND4_BLND_CONTROL2                                                   0x436f
+#define mmBLND5_BLND_CONTROL2                                                   0x456f
+#define mmBLND_UPDATE                                                           0x1b70
+#define mmBLND0_BLND_UPDATE                                                     0x1b70
+#define mmBLND1_BLND_UPDATE                                                     0x1d70
+#define mmBLND2_BLND_UPDATE                                                     0x1f70
+#define mmBLND3_BLND_UPDATE                                                     0x4170
+#define mmBLND4_BLND_UPDATE                                                     0x4370
+#define mmBLND5_BLND_UPDATE                                                     0x4570
+#define mmBLND_UNDERFLOW_INTERRUPT                                              0x1b71
+#define mmBLND0_BLND_UNDERFLOW_INTERRUPT                                        0x1b71
+#define mmBLND1_BLND_UNDERFLOW_INTERRUPT                                        0x1d71
+#define mmBLND2_BLND_UNDERFLOW_INTERRUPT                                        0x1f71
+#define mmBLND3_BLND_UNDERFLOW_INTERRUPT                                        0x4171
+#define mmBLND4_BLND_UNDERFLOW_INTERRUPT                                        0x4371
+#define mmBLND5_BLND_UNDERFLOW_INTERRUPT                                        0x4571
+#define mmBLND_V_UPDATE_LOCK                                                    0x1b73
+#define mmBLND0_BLND_V_UPDATE_LOCK                                              0x1b73
+#define mmBLND1_BLND_V_UPDATE_LOCK                                              0x1d73
+#define mmBLND2_BLND_V_UPDATE_LOCK                                              0x1f73
+#define mmBLND3_BLND_V_UPDATE_LOCK                                              0x4173
+#define mmBLND4_BLND_V_UPDATE_LOCK                                              0x4373
+#define mmBLND5_BLND_V_UPDATE_LOCK                                              0x4573
+#define mmBLND_REG_UPDATE_STATUS                                                0x1b77
+#define mmBLND0_BLND_REG_UPDATE_STATUS                                          0x1b77
+#define mmBLND1_BLND_REG_UPDATE_STATUS                                          0x1d77
+#define mmBLND2_BLND_REG_UPDATE_STATUS                                          0x1f77
+#define mmBLND3_BLND_REG_UPDATE_STATUS                                          0x4177
+#define mmBLND4_BLND_REG_UPDATE_STATUS                                          0x4377
+#define mmBLND5_BLND_REG_UPDATE_STATUS                                          0x4577
+#define mmBLND_DEBUG                                                            0x1b74
+#define mmBLND0_BLND_DEBUG                                                      0x1b74
+#define mmBLND1_BLND_DEBUG                                                      0x1d74
+#define mmBLND2_BLND_DEBUG                                                      0x1f74
+#define mmBLND3_BLND_DEBUG                                                      0x4174
+#define mmBLND4_BLND_DEBUG                                                      0x4374
+#define mmBLND5_BLND_DEBUG                                                      0x4574
+#define mmBLND_TEST_DEBUG_INDEX                                                 0x1b75
+#define mmBLND0_BLND_TEST_DEBUG_INDEX                                           0x1b75
+#define mmBLND1_BLND_TEST_DEBUG_INDEX                                           0x1d75
+#define mmBLND2_BLND_TEST_DEBUG_INDEX                                           0x1f75
+#define mmBLND3_BLND_TEST_DEBUG_INDEX                                           0x4175
+#define mmBLND4_BLND_TEST_DEBUG_INDEX                                           0x4375
+#define mmBLND5_BLND_TEST_DEBUG_INDEX                                           0x4575
+#define mmBLND_TEST_DEBUG_DATA                                                  0x1b76
+#define mmBLND0_BLND_TEST_DEBUG_DATA                                            0x1b76
+#define mmBLND1_BLND_TEST_DEBUG_DATA                                            0x1d76
+#define mmBLND2_BLND_TEST_DEBUG_DATA                                            0x1f76
+#define mmBLND3_BLND_TEST_DEBUG_DATA                                            0x4176
+#define mmBLND4_BLND_TEST_DEBUG_DATA                                            0x4376
+#define mmBLND5_BLND_TEST_DEBUG_DATA                                            0x4576
+#define mmWB_ENABLE                                                             0x5e18
+#define mmWB_EC_CONFIG                                                          0x5e19
+#define mmCNV_MODE                                                              0x5e1a
+#define mmCNV_WINDOW_START                                                      0x5e1b
+#define mmCNV_WINDOW_SIZE                                                       0x5e1c
+#define mmCNV_UPDATE                                                            0x5e1d
+#define mmCNV_SOURCE_SIZE                                                       0x5e1e
+#define mmCNV_CSC_CONTROL                                                       0x5e1f
+#define mmCNV_CSC_C11_C12                                                       0x5e20
+#define mmCNV_CSC_C13_C14                                                       0x5e21
+#define mmCNV_CSC_C21_C22                                                       0x5e22
+#define mmCNV_CSC_C23_C24                                                       0x5e23
+#define mmCNV_CSC_C31_C32                                                       0x5e24
+#define mmCNV_CSC_C33_C34                                                       0x5e25
+#define mmCNV_CSC_ROUND_OFFSET_R                                                0x5e26
+#define mmCNV_CSC_ROUND_OFFSET_G                                                0x5e27
+#define mmCNV_CSC_ROUND_OFFSET_B                                                0x5e28
+#define mmCNV_CSC_CLAMP_R                                                       0x5e29
+#define mmCNV_CSC_CLAMP_G                                                       0x5e2a
+#define mmCNV_CSC_CLAMP_B                                                       0x5e2b
+#define mmCNV_TEST_CNTL                                                         0x5e2c
+#define mmCNV_TEST_CRC_RED                                                      0x5e2d
+#define mmCNV_TEST_CRC_GREEN                                                    0x5e2e
+#define mmCNV_TEST_CRC_BLUE                                                     0x5e2f
+#define mmWB_DEBUG_CTRL                                                         0x5e30
+#define mmWB_DBG_MODE                                                           0x5e31
+#define mmWB_HW_DEBUG                                                           0x5e32
+#define mmCNV_INPUT_SELECT                                                      0x5e33
+#define mmWB_SOFT_RESET                                                         0x5e36
+#define mmWB_WARM_UP_MODE_CTL1                                                  0x5e37
+#define mmWB_WARM_UP_MODE_CTL2                                                  0x5e38
+#define mmCNV_TEST_DEBUG_INDEX                                                  0x5e34
+#define mmCNV_TEST_DEBUG_DATA                                                   0x5e35
+#define mmDCFE_CLOCK_CONTROL                                                    0x1b00
+#define mmDCFE0_DCFE_CLOCK_CONTROL                                              0x1b00
+#define mmDCFE1_DCFE_CLOCK_CONTROL                                              0x1d00
+#define mmDCFE2_DCFE_CLOCK_CONTROL                                              0x1f00
+#define mmDCFE3_DCFE_CLOCK_CONTROL                                              0x4100
+#define mmDCFE4_DCFE_CLOCK_CONTROL                                              0x4300
+#define mmDCFE5_DCFE_CLOCK_CONTROL                                              0x4500
+#define mmDCFE_SOFT_RESET                                                       0x1b01
+#define mmDCFE0_DCFE_SOFT_RESET                                                 0x1b01
+#define mmDCFE1_DCFE_SOFT_RESET                                                 0x1d01
+#define mmDCFE2_DCFE_SOFT_RESET                                                 0x1f01
+#define mmDCFE3_DCFE_SOFT_RESET                                                 0x4101
+#define mmDCFE4_DCFE_SOFT_RESET                                                 0x4301
+#define mmDCFE5_DCFE_SOFT_RESET                                                 0x4501
+#define mmDCFE_DBG_CONFIG                                                       0x1b02
+#define mmDCFE0_DCFE_DBG_CONFIG                                                 0x1b02
+#define mmDCFE1_DCFE_DBG_CONFIG                                                 0x1d02
+#define mmDCFE2_DCFE_DBG_CONFIG                                                 0x1f02
+#define mmDCFE3_DCFE_DBG_CONFIG                                                 0x4102
+#define mmDCFE4_DCFE_DBG_CONFIG                                                 0x4302
+#define mmDCFE5_DCFE_DBG_CONFIG                                                 0x4502
+#define mmDCFE_MEM_PWR_CTRL                                                     0x1b03
+#define mmDCFE0_DCFE_MEM_PWR_CTRL                                               0x1b03
+#define mmDCFE1_DCFE_MEM_PWR_CTRL                                               0x1d03
+#define mmDCFE2_DCFE_MEM_PWR_CTRL                                               0x1f03
+#define mmDCFE3_DCFE_MEM_PWR_CTRL                                               0x4103
+#define mmDCFE4_DCFE_MEM_PWR_CTRL                                               0x4303
+#define mmDCFE5_DCFE_MEM_PWR_CTRL                                               0x4503
+#define mmDCFE_MEM_PWR_CTRL2                                                    0x1b04
+#define mmDCFE0_DCFE_MEM_PWR_CTRL2                                              0x1b04
+#define mmDCFE1_DCFE_MEM_PWR_CTRL2                                              0x1d04
+#define mmDCFE2_DCFE_MEM_PWR_CTRL2                                              0x1f04
+#define mmDCFE3_DCFE_MEM_PWR_CTRL2                                              0x4104
+#define mmDCFE4_DCFE_MEM_PWR_CTRL2                                              0x4304
+#define mmDCFE5_DCFE_MEM_PWR_CTRL2                                              0x4504
+#define mmDCFE_MEM_PWR_STATUS                                                   0x1b05
+#define mmDCFE0_DCFE_MEM_PWR_STATUS                                             0x1b05
+#define mmDCFE1_DCFE_MEM_PWR_STATUS                                             0x1d05
+#define mmDCFE2_DCFE_MEM_PWR_STATUS                                             0x1f05
+#define mmDCFE3_DCFE_MEM_PWR_STATUS                                             0x4105
+#define mmDCFE4_DCFE_MEM_PWR_STATUS                                             0x4305
+#define mmDCFE5_DCFE_MEM_PWR_STATUS                                             0x4505
+#define mmDCFE_MISC                                                             0x1b06
+#define mmDCFE0_DCFE_MISC                                                       0x1b06
+#define mmDCFE1_DCFE_MISC                                                       0x1d06
+#define mmDCFE2_DCFE_MISC                                                       0x1f06
+#define mmDCFE3_DCFE_MISC                                                       0x4106
+#define mmDCFE4_DCFE_MISC                                                       0x4306
+#define mmDCFE5_DCFE_MISC                                                       0x4506
+#define mmDCFE_FLUSH                                                            0x1b07
+#define mmDCFE0_DCFE_FLUSH                                                      0x1b07
+#define mmDCFE1_DCFE_FLUSH                                                      0x1d07
+#define mmDCFE2_DCFE_FLUSH                                                      0x1f07
+#define mmDCFE3_DCFE_FLUSH                                                      0x4107
+#define mmDCFE4_DCFE_FLUSH                                                      0x4307
+#define mmDCFE5_DCFE_FLUSH                                                      0x4507
+#define mmDCFEV_CLOCK_CONTROL                                                   0x46f4
+#define mmDCFEV0_DCFEV_CLOCK_CONTROL                                            0x46f4
+#define mmDCFEV1_DCFEV_CLOCK_CONTROL                                            0x98f4
+#define mmDCFEV_SOFT_RESET                                                      0x46f5
+#define mmDCFEV0_DCFEV_SOFT_RESET                                               0x46f5
+#define mmDCFEV1_DCFEV_SOFT_RESET                                               0x98f5
+#define mmDCFEV_DMIFV_CLOCK_CONTROL                                             0x46f6
+#define mmDCFEV0_DCFEV_DMIFV_CLOCK_CONTROL                                      0x46f6
+#define mmDCFEV1_DCFEV_DMIFV_CLOCK_CONTROL                                      0x98f6
+#define mmDCFEV_DBG_CONFIG                                                      0x46f7
+#define mmDCFEV0_DCFEV_DBG_CONFIG                                               0x46f7
+#define mmDCFEV1_DCFEV_DBG_CONFIG                                               0x98f7
+#define mmDCFEV_DMIFV_MEM_PWR_CTRL                                              0x46f8
+#define mmDCFEV0_DCFEV_DMIFV_MEM_PWR_CTRL                                       0x46f8
+#define mmDCFEV1_DCFEV_DMIFV_MEM_PWR_CTRL                                       0x98f8
+#define mmDCFEV_DMIFV_MEM_PWR_STATUS                                            0x46f9
+#define mmDCFEV0_DCFEV_DMIFV_MEM_PWR_STATUS                                     0x46f9
+#define mmDCFEV1_DCFEV_DMIFV_MEM_PWR_STATUS                                     0x98f9
+#define mmDCFEV_MEM_PWR_CTRL                                                    0x46fa
+#define mmDCFEV0_DCFEV_MEM_PWR_CTRL                                             0x46fa
+#define mmDCFEV1_DCFEV_MEM_PWR_CTRL                                             0x98fa
+#define mmDCFEV_MEM_PWR_CTRL2                                                   0x46fb
+#define mmDCFEV0_DCFEV_MEM_PWR_CTRL2                                            0x46fb
+#define mmDCFEV1_DCFEV_MEM_PWR_CTRL2                                            0x98fb
+#define mmDCFEV_MEM_PWR_STATUS                                                  0x46fc
+#define mmDCFEV0_DCFEV_MEM_PWR_STATUS                                           0x46fc
+#define mmDCFEV1_DCFEV_MEM_PWR_STATUS                                           0x98fc
+#define mmDCFEV_L_FLUSH                                                         0x46ff
+#define mmDCFEV0_DCFEV_L_FLUSH                                                  0x46ff
+#define mmDCFEV1_DCFEV_L_FLUSH                                                  0x98ff
+#define mmDCFEV_C_FLUSH                                                         0x4700
+#define mmDCFEV0_DCFEV_C_FLUSH                                                  0x4700
+#define mmDCFEV1_DCFEV_C_FLUSH                                                  0x9900
+#define mmDCFEV_DMIFV_DEBUG                                                     0x46fd
+#define mmDCFEV0_DCFEV_DMIFV_DEBUG                                              0x46fd
+#define mmDCFEV1_DCFEV_DMIFV_DEBUG                                              0x98fd
+#define mmDCFEV_MISC                                                            0x46fe
+#define mmDCFEV0_DCFEV_MISC                                                     0x46fe
+#define mmDCFEV1_DCFEV_MISC                                                     0x98fe
+#define mmDC_HPD_INT_STATUS                                                     0x1898
+#define mmHPD0_DC_HPD_INT_STATUS                                                0x1898
+#define mmHPD1_DC_HPD_INT_STATUS                                                0x18a0
+#define mmHPD2_DC_HPD_INT_STATUS                                                0x18a8
+#define mmHPD3_DC_HPD_INT_STATUS                                                0x18b0
+#define mmHPD4_DC_HPD_INT_STATUS                                                0x18b8
+#define mmHPD5_DC_HPD_INT_STATUS                                                0x18c0
+#define mmDC_HPD_INT_CONTROL                                                    0x1899
+#define mmHPD0_DC_HPD_INT_CONTROL                                               0x1899
+#define mmHPD1_DC_HPD_INT_CONTROL                                               0x18a1
+#define mmHPD2_DC_HPD_INT_CONTROL                                               0x18a9
+#define mmHPD3_DC_HPD_INT_CONTROL                                               0x18b1
+#define mmHPD4_DC_HPD_INT_CONTROL                                               0x18b9
+#define mmHPD5_DC_HPD_INT_CONTROL                                               0x18c1
+#define mmDC_HPD_CONTROL                                                        0x189a
+#define mmHPD0_DC_HPD_CONTROL                                                   0x189a
+#define mmHPD1_DC_HPD_CONTROL                                                   0x18a2
+#define mmHPD2_DC_HPD_CONTROL                                                   0x18aa
+#define mmHPD3_DC_HPD_CONTROL                                                   0x18b2
+#define mmHPD4_DC_HPD_CONTROL                                                   0x18ba
+#define mmHPD5_DC_HPD_CONTROL                                                   0x18c2
+#define mmDC_HPD_FAST_TRAIN_CNTL                                                0x189b
+#define mmHPD0_DC_HPD_FAST_TRAIN_CNTL                                           0x189b
+#define mmHPD1_DC_HPD_FAST_TRAIN_CNTL                                           0x18a3
+#define mmHPD2_DC_HPD_FAST_TRAIN_CNTL                                           0x18ab
+#define mmHPD3_DC_HPD_FAST_TRAIN_CNTL                                           0x18b3
+#define mmHPD4_DC_HPD_FAST_TRAIN_CNTL                                           0x18bb
+#define mmHPD5_DC_HPD_FAST_TRAIN_CNTL                                           0x18c3
+#define mmDC_HPD_TOGGLE_FILT_CNTL                                               0x189c
+#define mmHPD0_DC_HPD_TOGGLE_FILT_CNTL                                          0x189c
+#define mmHPD1_DC_HPD_TOGGLE_FILT_CNTL                                          0x18a4
+#define mmHPD2_DC_HPD_TOGGLE_FILT_CNTL                                          0x18ac
+#define mmHPD3_DC_HPD_TOGGLE_FILT_CNTL                                          0x18b4
+#define mmHPD4_DC_HPD_TOGGLE_FILT_CNTL                                          0x18bc
+#define mmHPD5_DC_HPD_TOGGLE_FILT_CNTL                                          0x18c4
+#define mmDCO_SCRATCH0                                                          0x184e
+#define mmDCO_SCRATCH1                                                          0x184f
+#define mmDCO_SCRATCH2                                                          0x1850
+#define mmDCO_SCRATCH3                                                          0x1851
+#define mmDCO_SCRATCH4                                                          0x1852
+#define mmDCO_SCRATCH5                                                          0x1853
+#define mmDCO_SCRATCH6                                                          0x1854
+#define mmDCO_SCRATCH7                                                          0x1855
+#define mmDCE_VCE_CONTROL                                                       0x1856
+#define mmDISP_INTERRUPT_STATUS                                                 0x1857
+#define mmDISP_INTERRUPT_STATUS_CONTINUE                                        0x1858
+#define mmDISP_INTERRUPT_STATUS_CONTINUE2                                       0x1859
+#define mmDISP_INTERRUPT_STATUS_CONTINUE3                                       0x185a
+#define mmDISP_INTERRUPT_STATUS_CONTINUE4                                       0x185b
+#define mmDISP_INTERRUPT_STATUS_CONTINUE5                                       0x185c
+#define mmDISP_INTERRUPT_STATUS_CONTINUE6                                       0x185d
+#define mmDISP_INTERRUPT_STATUS_CONTINUE7                                       0x185e
+#define mmDISP_INTERRUPT_STATUS_CONTINUE8                                       0x185f
+#define mmDISP_INTERRUPT_STATUS_CONTINUE9                                       0x1860
+#define mmDISP_INTERRUPT_STATUS_CONTINUE10                                      0x1875
+#define mmDCO_MEM_PWR_STATUS                                                    0x1861
+#define mmDCO_MEM_PWR_STATUS1                                                   0x1874
+#define mmDCO_MEM_PWR_CTRL                                                      0x1862
+#define mmDCO_MEM_PWR_CTRL2                                                     0x1863
+#define mmFMT_MEMORY0_CONTROL                                                   0x1888
+#define mmFMT_MEMORY1_CONTROL                                                   0x1889
+#define mmFMT_MEMORY2_CONTROL                                                   0x188a
+#define mmFMT_MEMORY3_CONTROL                                                   0x188b
+#define mmFMT_MEMORY4_CONTROL                                                   0x188c
+#define mmFMT_MEMORY5_CONTROL                                                   0x188d
+#define mmDCO_CLK_CNTL                                                          0x1864
+#define mmDCO_CLK_CNTL2                                                         0x1876
+#define mmDCO_CLK_CNTL3                                                         0x1877
+#define mmDPDBG_CNTL                                                            0x1866
+#define mmDPDBG_INTERRUPT                                                       0x1867
+#define mmDCO_POWER_MANAGEMENT_CNTL                                             0x1868
+#define mmDCO_SOFT_RESET                                                        0x1871
+#define mmDIG_SOFT_RESET                                                        0x1872
+#define mmDIG_SOFT_RESET_2                                                      0x186a
+#define mmDCO_STEREOSYNC_SEL                                                    0x186e
+#define mmDCO_HDMI_RXSTATUS_TIMER_CONTROL                                       0x1883
+#define mmDCO_PSP_INTERRUPT_STATUS                                              0x1884
+#define mmDCO_PSP_INTERRUPT_CLEAR                                               0x1885
+#define mmDCO_GENERIC_INTERRUPT_MESSAGE                                         0x1886
+#define mmDCO_GENERIC_INTERRUPT_CLEAR                                           0x1887
+#define mmDCO_TEST_DEBUG_INDEX                                                  0x186f
+#define mmDCO_TEST_DEBUG_DATA                                                   0x1870
+#define mmDC_I2C_CONTROL                                                        0x16d4
+#define mmDC_I2C_ARBITRATION                                                    0x16d5
+#define mmDC_I2C_INTERRUPT_CONTROL                                              0x16d6
+#define mmDC_I2C_SW_STATUS                                                      0x16d7
+#define mmDC_I2C_DDC1_HW_STATUS                                                 0x16d8
+#define mmDC_I2C_DDC2_HW_STATUS                                                 0x16d9
+#define mmDC_I2C_DDC3_HW_STATUS                                                 0x16da
+#define mmDC_I2C_DDC4_HW_STATUS                                                 0x16db
+#define mmDC_I2C_DDC5_HW_STATUS                                                 0x16dc
+#define mmDC_I2C_DDC6_HW_STATUS                                                 0x16dd
+#define mmDC_I2C_DDC1_SPEED                                                     0x16de
+#define mmDC_I2C_DDC1_SETUP                                                     0x16df
+#define mmDC_I2C_DDC2_SPEED                                                     0x16e0
+#define mmDC_I2C_DDC2_SETUP                                                     0x16e1
+#define mmDC_I2C_DDC3_SPEED                                                     0x16e2
+#define mmDC_I2C_DDC3_SETUP                                                     0x16e3
+#define mmDC_I2C_DDC4_SPEED                                                     0x16e4
+#define mmDC_I2C_DDC4_SETUP                                                     0x16e5
+#define mmDC_I2C_DDC5_SPEED                                                     0x16e6
+#define mmDC_I2C_DDC5_SETUP                                                     0x16e7
+#define mmDC_I2C_DDC6_SPEED                                                     0x16e8
+#define mmDC_I2C_DDC6_SETUP                                                     0x16e9
+#define mmDC_I2C_TRANSACTION0                                                   0x16ea
+#define mmDC_I2C_TRANSACTION1                                                   0x16eb
+#define mmDC_I2C_TRANSACTION2                                                   0x16ec
+#define mmDC_I2C_TRANSACTION3                                                   0x16ed
+#define mmDC_I2C_DATA                                                           0x16ee
+#define mmDC_I2C_DDCVGA_HW_STATUS                                               0x16ef
+#define mmDC_I2C_DDCVGA_SPEED                                                   0x16f0
+#define mmDC_I2C_DDCVGA_SETUP                                                   0x16f1
+#define mmDC_I2C_EDID_DETECT_CTRL                                               0x16f2
+#define mmDC_I2C_READ_REQUEST_INTERRUPT                                         0x16f3
+#define mmGENERIC_I2C_CONTROL                                                   0x16f4
+#define mmGENERIC_I2C_INTERRUPT_CONTROL                                         0x16f5
+#define mmGENERIC_I2C_STATUS                                                    0x16f6
+#define mmGENERIC_I2C_SPEED                                                     0x16f7
+#define mmGENERIC_I2C_SETUP                                                     0x16f8
+#define mmGENERIC_I2C_TRANSACTION                                               0x16f9
+#define mmGENERIC_I2C_DATA                                                      0x16fa
+#define mmGENERIC_I2C_PIN_SELECTION                                             0x16fb
+#define mmGENERIC_I2C_PIN_DEBUG                                                 0x16fc
+#define mmBLNDV_CONTROL                                                         0x476d
+#define mmBLNDV0_BLNDV_CONTROL                                                  0x476d
+#define mmBLNDV1_BLNDV_CONTROL                                                  0x996d
+#define mmBLNDV_SM_CONTROL2                                                     0x476e
+#define mmBLNDV0_BLNDV_SM_CONTROL2                                              0x476e
+#define mmBLNDV1_BLNDV_SM_CONTROL2                                              0x996e
+#define mmBLNDV_CONTROL2                                                        0x476f
+#define mmBLNDV0_BLNDV_CONTROL2                                                 0x476f
+#define mmBLNDV1_BLNDV_CONTROL2                                                 0x996f
+#define mmBLNDV_UPDATE                                                          0x4770
+#define mmBLNDV0_BLNDV_UPDATE                                                   0x4770
+#define mmBLNDV1_BLNDV_UPDATE                                                   0x9970
+#define mmBLNDV_UNDERFLOW_INTERRUPT                                             0x4771
+#define mmBLNDV0_BLNDV_UNDERFLOW_INTERRUPT                                      0x4771
+#define mmBLNDV1_BLNDV_UNDERFLOW_INTERRUPT                                      0x9971
+#define mmBLNDV_V_UPDATE_LOCK                                                   0x4773
+#define mmBLNDV0_BLNDV_V_UPDATE_LOCK                                            0x4773
+#define mmBLNDV1_BLNDV_V_UPDATE_LOCK                                            0x9973
+#define mmBLNDV_REG_UPDATE_STATUS                                               0x4777
+#define mmBLNDV0_BLNDV_REG_UPDATE_STATUS                                        0x4777
+#define mmBLNDV1_BLNDV_REG_UPDATE_STATUS                                        0x9977
+#define mmBLNDV_DEBUG                                                           0x4774
+#define mmBLNDV0_BLNDV_DEBUG                                                    0x4774
+#define mmBLNDV1_BLNDV_DEBUG                                                    0x9974
+#define mmBLNDV_TEST_DEBUG_INDEX                                                0x4775
+#define mmBLNDV0_BLNDV_TEST_DEBUG_INDEX                                         0x4775
+#define mmBLNDV1_BLNDV_TEST_DEBUG_INDEX                                         0x9975
+#define mmBLNDV_TEST_DEBUG_DATA                                                 0x4776
+#define mmBLNDV0_BLNDV_TEST_DEBUG_DATA                                          0x4776
+#define mmBLNDV1_BLNDV_TEST_DEBUG_DATA                                          0x9976
+#define mmCRTCV_H_TOTAL                                                         0x4780
+#define mmCRTCV0_CRTCV_H_TOTAL                                                  0x4780
+#define mmCRTCV1_CRTCV_H_TOTAL                                                  0x9980
+#define mmCRTCV_H_BLANK_START_END                                               0x4781
+#define mmCRTCV0_CRTCV_H_BLANK_START_END                                        0x4781
+#define mmCRTCV1_CRTCV_H_BLANK_START_END                                        0x9981
+#define mmCRTCV_H_SYNC_A                                                        0x4782
+#define mmCRTCV0_CRTCV_H_SYNC_A                                                 0x4782
+#define mmCRTCV1_CRTCV_H_SYNC_A                                                 0x9982
+#define mmCRTCV_V_TOTAL                                                         0x4787
+#define mmCRTCV0_CRTCV_V_TOTAL                                                  0x4787
+#define mmCRTCV1_CRTCV_V_TOTAL                                                  0x9987
+#define mmCRTCV_V_BLANK_START_END                                               0x478d
+#define mmCRTCV0_CRTCV_V_BLANK_START_END                                        0x478d
+#define mmCRTCV1_CRTCV_V_BLANK_START_END                                        0x998d
+#define mmCRTCV_V_SYNC_A                                                        0x478e
+#define mmCRTCV0_CRTCV_V_SYNC_A                                                 0x478e
+#define mmCRTCV1_CRTCV_V_SYNC_A                                                 0x998e
+#define mmCRTCV_CONTROL                                                         0x479c
+#define mmCRTCV0_CRTCV_CONTROL                                                  0x479c
+#define mmCRTCV1_CRTCV_CONTROL                                                  0x999c
+#define mmCRTCV_START_LINE_CONTROL                                              0x47b3
+#define mmCRTCV0_CRTCV_START_LINE_CONTROL                                       0x47b3
+#define mmCRTCV1_CRTCV_START_LINE_CONTROL                                       0x99b3
+#define mmCRTCV_OVERSCAN_COLOR                                                  0x47c8
+#define mmCRTCV0_CRTCV_OVERSCAN_COLOR                                           0x47c8
+#define mmCRTCV1_CRTCV_OVERSCAN_COLOR                                           0x99c8
+#define mmCRTCV_OVERSCAN_COLOR_EXT                                              0x47c9
+#define mmCRTCV0_CRTCV_OVERSCAN_COLOR_EXT                                       0x47c9
+#define mmCRTCV1_CRTCV_OVERSCAN_COLOR_EXT                                       0x99c9
+#define mmCRTCV_BLACK_COLOR                                                     0x47cc
+#define mmCRTCV0_CRTCV_BLACK_COLOR                                              0x47cc
+#define mmCRTCV1_CRTCV_BLACK_COLOR                                              0x99cc
+#define mmCRTCV_BLACK_COLOR_EXT                                                 0x47cd
+#define mmCRTCV0_CRTCV_BLACK_COLOR_EXT                                          0x47cd
+#define mmCRTCV1_CRTCV_BLACK_COLOR_EXT                                          0x99cd
+#define mmCRTCV_CRC_CNTL                                                        0x47d4
+#define mmCRTCV0_CRTCV_CRC_CNTL                                                 0x47d4
+#define mmCRTCV1_CRTCV_CRC_CNTL                                                 0x99d4
+#define mmCRTCV_CRC0_WINDOWA_X_CONTROL                                          0x47d5
+#define mmCRTCV0_CRTCV_CRC0_WINDOWA_X_CONTROL                                   0x47d5
+#define mmCRTCV1_CRTCV_CRC0_WINDOWA_X_CONTROL                                   0x99d5
+#define mmCRTCV_CRC0_WINDOWA_Y_CONTROL                                          0x47d6
+#define mmCRTCV0_CRTCV_CRC0_WINDOWA_Y_CONTROL                                   0x47d6
+#define mmCRTCV1_CRTCV_CRC0_WINDOWA_Y_CONTROL                                   0x99d6
+#define mmCRTCV_CRC0_WINDOWB_X_CONTROL                                          0x47d7
+#define mmCRTCV0_CRTCV_CRC0_WINDOWB_X_CONTROL                                   0x47d7
+#define mmCRTCV1_CRTCV_CRC0_WINDOWB_X_CONTROL                                   0x99d7
+#define mmCRTCV_CRC0_WINDOWB_Y_CONTROL                                          0x47d8
+#define mmCRTCV0_CRTCV_CRC0_WINDOWB_Y_CONTROL                                   0x47d8
+#define mmCRTCV1_CRTCV_CRC0_WINDOWB_Y_CONTROL                                   0x99d8
+#define mmCRTCV_CRC0_DATA_RG                                                    0x47d9
+#define mmCRTCV0_CRTCV_CRC0_DATA_RG                                             0x47d9
+#define mmCRTCV1_CRTCV_CRC0_DATA_RG                                             0x99d9
+#define mmCRTCV_CRC0_DATA_B                                                     0x47da
+#define mmCRTCV0_CRTCV_CRC0_DATA_B                                              0x47da
+#define mmCRTCV1_CRTCV_CRC0_DATA_B                                              0x99da
+#define mmCRTCV_CRC1_WINDOWA_X_CONTROL                                          0x47db
+#define mmCRTCV0_CRTCV_CRC1_WINDOWA_X_CONTROL                                   0x47db
+#define mmCRTCV1_CRTCV_CRC1_WINDOWA_X_CONTROL                                   0x99db
+#define mmCRTCV_CRC1_WINDOWA_Y_CONTROL                                          0x47dc
+#define mmCRTCV0_CRTCV_CRC1_WINDOWA_Y_CONTROL                                   0x47dc
+#define mmCRTCV1_CRTCV_CRC1_WINDOWA_Y_CONTROL                                   0x99dc
+#define mmCRTCV_CRC1_WINDOWB_X_CONTROL                                          0x47dd
+#define mmCRTCV0_CRTCV_CRC1_WINDOWB_X_CONTROL                                   0x47dd
+#define mmCRTCV1_CRTCV_CRC1_WINDOWB_X_CONTROL                                   0x99dd
+#define mmCRTCV_CRC1_WINDOWB_Y_CONTROL                                          0x47de
+#define mmCRTCV0_CRTCV_CRC1_WINDOWB_Y_CONTROL                                   0x47de
+#define mmCRTCV1_CRTCV_CRC1_WINDOWB_Y_CONTROL                                   0x99de
+#define mmCRTCV_CRC1_DATA_RG                                                    0x47df
+#define mmCRTCV0_CRTCV_CRC1_DATA_RG                                             0x47df
+#define mmCRTCV1_CRTCV_CRC1_DATA_RG                                             0x99df
+#define mmCRTCV_CRC1_DATA_B                                                     0x47e0
+#define mmCRTCV0_CRTCV_CRC1_DATA_B                                              0x47e0
+#define mmCRTCV1_CRTCV_CRC1_DATA_B                                              0x99e0
+#define mmCRTCV_TEST_DEBUG_INDEX                                                0x47c6
+#define mmCRTCV0_CRTCV_TEST_DEBUG_INDEX                                         0x47c6
+#define mmCRTCV1_CRTCV_TEST_DEBUG_INDEX                                         0x99c6
+#define mmCRTCV_TEST_DEBUG_DATA                                                 0x47c7
+#define mmCRTCV0_CRTCV_TEST_DEBUG_DATA                                          0x47c7
+#define mmCRTCV1_CRTCV_TEST_DEBUG_DATA                                          0x99c7
+#define mmXDMA_MC_PCIE_CLIENT_CONFIG                                            0x3e0
+#define mmXDMA_LOCAL_SURFACE_TILING1                                            0x3e1
+#define mmXDMA_LOCAL_SURFACE_TILING2                                            0x3e2
+#define mmXDMA_INTERRUPT                                                        0x3e3
+#define mmXDMA_CLOCK_GATING_CNTL                                                0x3e4
+#define mmXDMA_MEM_POWER_CNTL                                                   0x3e6
+#define mmXDMA_IF_BIF_STATUS                                                    0x3e7
+#define mmXDMA_PERF_MEAS_STATUS                                                 0x3e8
+#define mmXDMA_IF_STATUS                                                        0x3e9
+#define mmXDMA_TEST_DEBUG_INDEX                                                 0x3ea
+#define mmXDMA_TEST_DEBUG_DATA                                                  0x3eb
+#define mmXDMA_RBBMIF_RDWR_CNTL                                                 0x3f8
+#define mmXDMA_PG_CONTROL                                                       0x3f9
+#define mmXDMA_PG_WDATA                                                         0x3fa
+#define mmXDMA_PG_STATUS                                                        0x3fb
+#define mmXDMA_AON_TEST_DEBUG_INDEX                                             0x3fc
+#define mmXDMA_AON_TEST_DEBUG_DATA                                              0x3fd
+#define mmXDMA_MSTR_CNTL                                                        0x3ec
+#define mmXDMA_MSTR_STATUS                                                      0x3ed
+#define mmXDMA_MSTR_MEM_CLIENT_CONFIG                                           0x3ee
+#define mmXDMA_MSTR_LOCAL_SURFACE_BASE_ADDR                                     0x3ef
+#define mmXDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH                                0x3f0
+#define mmXDMA_MSTR_LOCAL_SURFACE_PITCH                                         0x3f1
+#define mmXDMA_MSTR_CMD_URGENT_CNTL                                             0x3f2
+#define mmXDMA_MSTR_MEM_URGENT_CNTL                                             0x3f3
+#define mmXDMA_MSTR_PCIE_NACK_STATUS                                            0x3f5
+#define mmXDMA_MSTR_MEM_NACK_STATUS                                             0x3f6
+#define mmXDMA_MSTR_VSYNC_GSL_CHECK                                             0x3f7
+#define mmXDMA_MSTR_PIPE_CNTL                                                   0x400
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_PIPE_CNTL                                   0x400
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_PIPE_CNTL                                   0x410
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_PIPE_CNTL                                   0x420
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_PIPE_CNTL                                   0x430
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_PIPE_CNTL                                   0x440
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_PIPE_CNTL                                   0x450
+#define mmXDMA_MSTR_READ_COMMAND                                                0x401
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_READ_COMMAND                                0x401
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_READ_COMMAND                                0x411
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_READ_COMMAND                                0x421
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_READ_COMMAND                                0x431
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_READ_COMMAND                                0x441
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_READ_COMMAND                                0x451
+#define mmXDMA_MSTR_CHANNEL_DIM                                                 0x402
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_CHANNEL_DIM                                 0x402
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_CHANNEL_DIM                                 0x412
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_CHANNEL_DIM                                 0x422
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_CHANNEL_DIM                                 0x432
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_CHANNEL_DIM                                 0x442
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_CHANNEL_DIM                                 0x452
+#define mmXDMA_MSTR_HEIGHT                                                      0x403
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_HEIGHT                                      0x403
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_HEIGHT                                      0x413
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_HEIGHT                                      0x423
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_HEIGHT                                      0x433
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_HEIGHT                                      0x443
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_HEIGHT                                      0x453
+#define mmXDMA_MSTR_REMOTE_SURFACE_BASE                                         0x404
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x404
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x414
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x424
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x434
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x444
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_SURFACE_BASE                         0x454
+#define mmXDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                                    0x405
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x405
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x415
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x425
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x435
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x445
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH                    0x455
+#define mmXDMA_MSTR_REMOTE_GPU_ADDRESS                                          0x406
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x406
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x416
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x426
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x436
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x446
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_GPU_ADDRESS                          0x456
+#define mmXDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                                     0x407
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x407
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x417
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x427
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x437
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x447
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH                     0x457
+#define mmXDMA_MSTR_CACHE_BASE_ADDR                                             0x408
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE_BASE_ADDR                             0x408
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE_BASE_ADDR                             0x418
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE_BASE_ADDR                             0x428
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE_BASE_ADDR                             0x438
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE_BASE_ADDR                             0x448
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE_BASE_ADDR                             0x458
+#define mmXDMA_MSTR_CACHE_BASE_ADDR_HIGH                                        0x409
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x409
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x419
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x429
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x439
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x449
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE_BASE_ADDR_HIGH                        0x459
+#define mmXDMA_MSTR_CACHE                                                       0x40a
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_CACHE                                       0x40a
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_CACHE                                       0x41a
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_CACHE                                       0x42a
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_CACHE                                       0x43a
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_CACHE                                       0x44a
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_CACHE                                       0x45a
+#define mmXDMA_MSTR_CHANNEL_START                                               0x40b
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_CHANNEL_START                               0x40b
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_CHANNEL_START                               0x41b
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_CHANNEL_START                               0x42b
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_CHANNEL_START                               0x43b
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_CHANNEL_START                               0x44b
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_CHANNEL_START                               0x45b
+#define mmXDMA_MSTR_PERFMEAS_STATUS                                             0x40e
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_PERFMEAS_STATUS                             0x40e
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_PERFMEAS_STATUS                             0x41e
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_PERFMEAS_STATUS                             0x42e
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_PERFMEAS_STATUS                             0x43e
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_PERFMEAS_STATUS                             0x44e
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_PERFMEAS_STATUS                             0x45e
+#define mmXDMA_MSTR_PERFMEAS_CNTL                                               0x40f
+#define mmXDMA_MSTR_PIPE0_XDMA_MSTR_PERFMEAS_CNTL                               0x40f
+#define mmXDMA_MSTR_PIPE1_XDMA_MSTR_PERFMEAS_CNTL                               0x41f
+#define mmXDMA_MSTR_PIPE2_XDMA_MSTR_PERFMEAS_CNTL                               0x42f
+#define mmXDMA_MSTR_PIPE3_XDMA_MSTR_PERFMEAS_CNTL                               0x43f
+#define mmXDMA_MSTR_PIPE4_XDMA_MSTR_PERFMEAS_CNTL                               0x44f
+#define mmXDMA_MSTR_PIPE5_XDMA_MSTR_PERFMEAS_CNTL                               0x45f
+#define mmXDMA_SLV_CNTL                                                         0x460
+#define mmXDMA_SLV_MEM_CLIENT_CONFIG                                            0x461
+#define mmXDMA_SLV_SLS_PITCH                                                    0x462
+#define mmXDMA_SLV_READ_URGENT_CNTL                                             0x463
+#define mmXDMA_SLV_WRITE_URGENT_CNTL                                            0x464
+#define mmXDMA_SLV_WB_RATE_CNTL                                                 0x465
+#define mmXDMA_SLV_READ_LATENCY_MINMAX                                          0x466
+#define mmXDMA_SLV_READ_LATENCY_AVE                                             0x467
+#define mmXDMA_SLV_PCIE_NACK_STATUS                                             0x468
+#define mmXDMA_SLV_MEM_NACK_STATUS                                              0x469
+#define mmXDMA_SLV_RDRET_BUF_STATUS                                             0x46a
+#define mmXDMA_SLV_READ_LATENCY_TIMER                                           0x46b
+#define mmXDMA_SLV_FLIP_PENDING                                                 0x46c
+#define mmXDMA_SLV_CHANNEL_CNTL                                                 0x470
+#define mmXDMA_SLV_CHANNEL0_XDMA_SLV_CHANNEL_CNTL                               0x470
+#define mmXDMA_SLV_CHANNEL1_XDMA_SLV_CHANNEL_CNTL                               0x478
+#define mmXDMA_SLV_CHANNEL2_XDMA_SLV_CHANNEL_CNTL                               0x480
+#define mmXDMA_SLV_CHANNEL3_XDMA_SLV_CHANNEL_CNTL                               0x488
+#define mmXDMA_SLV_CHANNEL4_XDMA_SLV_CHANNEL_CNTL                               0x490
+#define mmXDMA_SLV_CHANNEL5_XDMA_SLV_CHANNEL_CNTL                               0x498
+#define mmXDMA_SLV_REMOTE_GPU_ADDRESS                                           0x471
+#define mmXDMA_SLV_CHANNEL0_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x471
+#define mmXDMA_SLV_CHANNEL1_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x479
+#define mmXDMA_SLV_CHANNEL2_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x481
+#define mmXDMA_SLV_CHANNEL3_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x489
+#define mmXDMA_SLV_CHANNEL4_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x491
+#define mmXDMA_SLV_CHANNEL5_XDMA_SLV_REMOTE_GPU_ADDRESS                         0x499
+#define mmXDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                                      0x472
+#define mmXDMA_SLV_CHANNEL0_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x472
+#define mmXDMA_SLV_CHANNEL1_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x47a
+#define mmXDMA_SLV_CHANNEL2_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x482
+#define mmXDMA_SLV_CHANNEL3_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x48a
+#define mmXDMA_SLV_CHANNEL4_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x492
+#define mmXDMA_SLV_CHANNEL5_XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH                    0x49a
+#define mmCMD_BUS_TX_CONTROL_LANE0                                              0x48e0
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_TX_CONTROL_LANE0                           0x48e0
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_TX_CONTROL_LANE0                           0x4980
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_TX_CONTROL_LANE0                           0x9a20
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_TX_CONTROL_LANE0                           0x9ac0
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_TX_CONTROL_LANE0                           0x9b60
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_TX_CONTROL_LANE0                           0x9c00
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_TX_CONTROL_LANE0                           0x9ca0
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_TX_CONTROL_LANE0                           0x9d40
+#define mmCMD_BUS_TX_CONTROL_LANE1                                              0x48f0
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_TX_CONTROL_LANE1                           0x48f0
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_TX_CONTROL_LANE1                           0x4990
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_TX_CONTROL_LANE1                           0x9a30
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_TX_CONTROL_LANE1                           0x9ad0
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_TX_CONTROL_LANE1                           0x9b70
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_TX_CONTROL_LANE1                           0x9c10
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_TX_CONTROL_LANE1                           0x9cb0
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_TX_CONTROL_LANE1                           0x9d50
+#define mmCMD_BUS_TX_CONTROL_LANE2                                              0x4900
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_TX_CONTROL_LANE2                           0x4900
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_TX_CONTROL_LANE2                           0x49a0
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_TX_CONTROL_LANE2                           0x9a40
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_TX_CONTROL_LANE2                           0x9ae0
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_TX_CONTROL_LANE2                           0x9b80
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_TX_CONTROL_LANE2                           0x9c20
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_TX_CONTROL_LANE2                           0x9cc0
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_TX_CONTROL_LANE2                           0x9d60
+#define mmCMD_BUS_TX_CONTROL_LANE3                                              0x4910
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_TX_CONTROL_LANE3                           0x4910
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_TX_CONTROL_LANE3                           0x49b0
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_TX_CONTROL_LANE3                           0x9a50
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_TX_CONTROL_LANE3                           0x9af0
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_TX_CONTROL_LANE3                           0x9b90
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_TX_CONTROL_LANE3                           0x9c30
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_TX_CONTROL_LANE3                           0x9cd0
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_TX_CONTROL_LANE3                           0x9d70
+#define mmMARGIN_DEEMPH_LANE0                                                   0x48e1
+#define mmDC_COMBOPHYTXREGS0_MARGIN_DEEMPH_LANE0                                0x48e1
+#define mmDC_COMBOPHYTXREGS1_MARGIN_DEEMPH_LANE0                                0x4981
+#define mmDC_COMBOPHYTXREGS2_MARGIN_DEEMPH_LANE0                                0x9a21
+#define mmDC_COMBOPHYTXREGS3_MARGIN_DEEMPH_LANE0                                0x9ac1
+#define mmDC_COMBOPHYTXREGS4_MARGIN_DEEMPH_LANE0                                0x9b61
+#define mmDC_COMBOPHYTXREGS5_MARGIN_DEEMPH_LANE0                                0x9c01
+#define mmDC_COMBOPHYTXREGS6_MARGIN_DEEMPH_LANE0                                0x9ca1
+#define mmDC_COMBOPHYTXREGS7_MARGIN_DEEMPH_LANE0                                0x9d41
+#define mmMARGIN_DEEMPH_LANE1                                                   0x48f1
+#define mmDC_COMBOPHYTXREGS0_MARGIN_DEEMPH_LANE1                                0x48f1
+#define mmDC_COMBOPHYTXREGS1_MARGIN_DEEMPH_LANE1                                0x4991
+#define mmDC_COMBOPHYTXREGS2_MARGIN_DEEMPH_LANE1                                0x9a31
+#define mmDC_COMBOPHYTXREGS3_MARGIN_DEEMPH_LANE1                                0x9ad1
+#define mmDC_COMBOPHYTXREGS4_MARGIN_DEEMPH_LANE1                                0x9b71
+#define mmDC_COMBOPHYTXREGS5_MARGIN_DEEMPH_LANE1                                0x9c11
+#define mmDC_COMBOPHYTXREGS6_MARGIN_DEEMPH_LANE1                                0x9cb1
+#define mmDC_COMBOPHYTXREGS7_MARGIN_DEEMPH_LANE1                                0x9d51
+#define mmMARGIN_DEEMPH_LANE2                                                   0x4901
+#define mmDC_COMBOPHYTXREGS0_MARGIN_DEEMPH_LANE2                                0x4901
+#define mmDC_COMBOPHYTXREGS1_MARGIN_DEEMPH_LANE2                                0x49a1
+#define mmDC_COMBOPHYTXREGS2_MARGIN_DEEMPH_LANE2                                0x9a41
+#define mmDC_COMBOPHYTXREGS3_MARGIN_DEEMPH_LANE2                                0x9ae1
+#define mmDC_COMBOPHYTXREGS4_MARGIN_DEEMPH_LANE2                                0x9b81
+#define mmDC_COMBOPHYTXREGS5_MARGIN_DEEMPH_LANE2                                0x9c21
+#define mmDC_COMBOPHYTXREGS6_MARGIN_DEEMPH_LANE2                                0x9cc1
+#define mmDC_COMBOPHYTXREGS7_MARGIN_DEEMPH_LANE2                                0x9d61
+#define mmMARGIN_DEEMPH_LANE3                                                   0x4911
+#define mmDC_COMBOPHYTXREGS0_MARGIN_DEEMPH_LANE3                                0x4911
+#define mmDC_COMBOPHYTXREGS1_MARGIN_DEEMPH_LANE3                                0x49b1
+#define mmDC_COMBOPHYTXREGS2_MARGIN_DEEMPH_LANE3                                0x9a51
+#define mmDC_COMBOPHYTXREGS3_MARGIN_DEEMPH_LANE3                                0x9af1
+#define mmDC_COMBOPHYTXREGS4_MARGIN_DEEMPH_LANE3                                0x9b91
+#define mmDC_COMBOPHYTXREGS5_MARGIN_DEEMPH_LANE3                                0x9c31
+#define mmDC_COMBOPHYTXREGS6_MARGIN_DEEMPH_LANE3                                0x9cd1
+#define mmDC_COMBOPHYTXREGS7_MARGIN_DEEMPH_LANE3                                0x9d71
+#define mmCMD_BUS_GLOBAL_FOR_TX_LANE0                                           0x48e2
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x48e2
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x4982
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9a22
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9ac2
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9b62
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9c02
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9ca2
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_GLOBAL_FOR_TX_LANE0                        0x9d42
+#define mmCMD_BUS_GLOBAL_FOR_TX_LANE1                                           0x48f2
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x48f2
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x4992
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9a32
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9ad2
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9b72
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9c12
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9cb2
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_GLOBAL_FOR_TX_LANE1                        0x9d52
+#define mmCMD_BUS_GLOBAL_FOR_TX_LANE2                                           0x4902
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x4902
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x49a2
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9a42
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9ae2
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9b82
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9c22
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9cc2
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_GLOBAL_FOR_TX_LANE2                        0x9d62
+#define mmCMD_BUS_GLOBAL_FOR_TX_LANE3                                           0x4912
+#define mmDC_COMBOPHYTXREGS0_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x4912
+#define mmDC_COMBOPHYTXREGS1_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x49b2
+#define mmDC_COMBOPHYTXREGS2_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9a52
+#define mmDC_COMBOPHYTXREGS3_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9af2
+#define mmDC_COMBOPHYTXREGS4_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9b92
+#define mmDC_COMBOPHYTXREGS5_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9c32
+#define mmDC_COMBOPHYTXREGS6_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9cd2
+#define mmDC_COMBOPHYTXREGS7_CMD_BUS_GLOBAL_FOR_TX_LANE3                        0x9d72
+#define mmTX_DISP_RFU0_LANE0                                                    0x48e3
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU0_LANE0                                 0x48e3
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU0_LANE0                                 0x4983
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU0_LANE0                                 0x9a23
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU0_LANE0                                 0x9ac3
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU0_LANE0                                 0x9b63
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU0_LANE0                                 0x9c03
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU0_LANE0                                 0x9ca3
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU0_LANE0                                 0x9d43
+#define mmTX_DISP_RFU0_LANE1                                                    0x48f3
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU0_LANE1                                 0x48f3
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU0_LANE1                                 0x4993
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU0_LANE1                                 0x9a33
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU0_LANE1                                 0x9ad3
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU0_LANE1                                 0x9b73
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU0_LANE1                                 0x9c13
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU0_LANE1                                 0x9cb3
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU0_LANE1                                 0x9d53
+#define mmTX_DISP_RFU0_LANE2                                                    0x4903
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU0_LANE2                                 0x4903
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU0_LANE2                                 0x49a3
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU0_LANE2                                 0x9a43
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU0_LANE2                                 0x9ae3
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU0_LANE2                                 0x9b83
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU0_LANE2                                 0x9c23
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU0_LANE2                                 0x9cc3
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU0_LANE2                                 0x9d63
+#define mmTX_DISP_RFU0_LANE3                                                    0x4913
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU0_LANE3                                 0x4913
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU0_LANE3                                 0x49b3
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU0_LANE3                                 0x9a53
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU0_LANE3                                 0x9af3
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU0_LANE3                                 0x9b93
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU0_LANE3                                 0x9c33
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU0_LANE3                                 0x9cd3
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU0_LANE3                                 0x9d73
+#define mmTX_DISP_RFU1_LANE0                                                    0x48e4
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU1_LANE0                                 0x48e4
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU1_LANE0                                 0x4984
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU1_LANE0                                 0x9a24
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU1_LANE0                                 0x9ac4
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU1_LANE0                                 0x9b64
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU1_LANE0                                 0x9c04
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU1_LANE0                                 0x9ca4
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU1_LANE0                                 0x9d44
+#define mmTX_DISP_RFU1_LANE1                                                    0x48f4
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU1_LANE1                                 0x48f4
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU1_LANE1                                 0x4994
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU1_LANE1                                 0x9a34
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU1_LANE1                                 0x9ad4
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU1_LANE1                                 0x9b74
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU1_LANE1                                 0x9c14
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU1_LANE1                                 0x9cb4
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU1_LANE1                                 0x9d54
+#define mmTX_DISP_RFU1_LANE2                                                    0x4904
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU1_LANE2                                 0x4904
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU1_LANE2                                 0x49a4
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU1_LANE2                                 0x9a44
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU1_LANE2                                 0x9ae4
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU1_LANE2                                 0x9b84
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU1_LANE2                                 0x9c24
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU1_LANE2                                 0x9cc4
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU1_LANE2                                 0x9d64
+#define mmTX_DISP_RFU1_LANE3                                                    0x4914
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU1_LANE3                                 0x4914
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU1_LANE3                                 0x49b4
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU1_LANE3                                 0x9a54
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU1_LANE3                                 0x9af4
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU1_LANE3                                 0x9b94
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU1_LANE3                                 0x9c34
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU1_LANE3                                 0x9cd4
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU1_LANE3                                 0x9d74
+#define mmTX_DISP_RFU2_LANE0                                                    0x48e5
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU2_LANE0                                 0x48e5
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU2_LANE0                                 0x4985
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU2_LANE0                                 0x9a25
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU2_LANE0                                 0x9ac5
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU2_LANE0                                 0x9b65
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU2_LANE0                                 0x9c05
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU2_LANE0                                 0x9ca5
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU2_LANE0                                 0x9d45
+#define mmTX_DISP_RFU2_LANE1                                                    0x48f5
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU2_LANE1                                 0x48f5
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU2_LANE1                                 0x4995
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU2_LANE1                                 0x9a35
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU2_LANE1                                 0x9ad5
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU2_LANE1                                 0x9b75
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU2_LANE1                                 0x9c15
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU2_LANE1                                 0x9cb5
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU2_LANE1                                 0x9d55
+#define mmTX_DISP_RFU2_LANE2                                                    0x4905
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU2_LANE2                                 0x4905
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU2_LANE2                                 0x49a5
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU2_LANE2                                 0x9a45
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU2_LANE2                                 0x9ae5
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU2_LANE2                                 0x9b85
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU2_LANE2                                 0x9c25
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU2_LANE2                                 0x9cc5
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU2_LANE2                                 0x9d65
+#define mmTX_DISP_RFU2_LANE3                                                    0x4915
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU2_LANE3                                 0x4915
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU2_LANE3                                 0x49b5
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU2_LANE3                                 0x9a55
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU2_LANE3                                 0x9af5
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU2_LANE3                                 0x9b95
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU2_LANE3                                 0x9c35
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU2_LANE3                                 0x9cd5
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU2_LANE3                                 0x9d75
+#define mmTX_DISP_RFU3_LANE0                                                    0x48e6
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU3_LANE0                                 0x48e6
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU3_LANE0                                 0x4986
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU3_LANE0                                 0x9a26
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU3_LANE0                                 0x9ac6
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU3_LANE0                                 0x9b66
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU3_LANE0                                 0x9c06
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU3_LANE0                                 0x9ca6
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU3_LANE0                                 0x9d46
+#define mmTX_DISP_RFU3_LANE1                                                    0x48f6
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU3_LANE1                                 0x48f6
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU3_LANE1                                 0x4996
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU3_LANE1                                 0x9a36
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU3_LANE1                                 0x9ad6
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU3_LANE1                                 0x9b76
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU3_LANE1                                 0x9c16
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU3_LANE1                                 0x9cb6
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU3_LANE1                                 0x9d56
+#define mmTX_DISP_RFU3_LANE2                                                    0x4906
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU3_LANE2                                 0x4906
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU3_LANE2                                 0x49a6
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU3_LANE2                                 0x9a46
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU3_LANE2                                 0x9ae6
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU3_LANE2                                 0x9b86
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU3_LANE2                                 0x9c26
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU3_LANE2                                 0x9cc6
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU3_LANE2                                 0x9d66
+#define mmTX_DISP_RFU3_LANE3                                                    0x4916
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU3_LANE3                                 0x4916
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU3_LANE3                                 0x49b6
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU3_LANE3                                 0x9a56
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU3_LANE3                                 0x9af6
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU3_LANE3                                 0x9b96
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU3_LANE3                                 0x9c36
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU3_LANE3                                 0x9cd6
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU3_LANE3                                 0x9d76
+#define mmTX_DISP_RFU4_LANE0                                                    0x48e7
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU4_LANE0                                 0x48e7
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU4_LANE0                                 0x4987
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU4_LANE0                                 0x9a27
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU4_LANE0                                 0x9ac7
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU4_LANE0                                 0x9b67
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU4_LANE0                                 0x9c07
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU4_LANE0                                 0x9ca7
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU4_LANE0                                 0x9d47
+#define mmTX_DISP_RFU4_LANE1                                                    0x48f7
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU4_LANE1                                 0x48f7
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU4_LANE1                                 0x4997
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU4_LANE1                                 0x9a37
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU4_LANE1                                 0x9ad7
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU4_LANE1                                 0x9b77
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU4_LANE1                                 0x9c17
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU4_LANE1                                 0x9cb7
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU4_LANE1                                 0x9d57
+#define mmTX_DISP_RFU4_LANE2                                                    0x4907
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU4_LANE2                                 0x4907
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU4_LANE2                                 0x49a7
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU4_LANE2                                 0x9a47
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU4_LANE2                                 0x9ae7
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU4_LANE2                                 0x9b87
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU4_LANE2                                 0x9c27
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU4_LANE2                                 0x9cc7
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU4_LANE2                                 0x9d67
+#define mmTX_DISP_RFU4_LANE3                                                    0x4917
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU4_LANE3                                 0x4917
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU4_LANE3                                 0x49b7
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU4_LANE3                                 0x9a57
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU4_LANE3                                 0x9af7
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU4_LANE3                                 0x9b97
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU4_LANE3                                 0x9c37
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU4_LANE3                                 0x9cd7
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU4_LANE3                                 0x9d77
+#define mmTX_DISP_RFU5_LANE0                                                    0x48e8
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU5_LANE0                                 0x48e8
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU5_LANE0                                 0x4988
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU5_LANE0                                 0x9a28
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU5_LANE0                                 0x9ac8
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU5_LANE0                                 0x9b68
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU5_LANE0                                 0x9c08
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU5_LANE0                                 0x9ca8
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU5_LANE0                                 0x9d48
+#define mmTX_DISP_RFU5_LANE1                                                    0x48f8
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU5_LANE1                                 0x48f8
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU5_LANE1                                 0x4998
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU5_LANE1                                 0x9a38
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU5_LANE1                                 0x9ad8
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU5_LANE1                                 0x9b78
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU5_LANE1                                 0x9c18
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU5_LANE1                                 0x9cb8
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU5_LANE1                                 0x9d58
+#define mmTX_DISP_RFU5_LANE2                                                    0x4908
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU5_LANE2                                 0x4908
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU5_LANE2                                 0x49a8
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU5_LANE2                                 0x9a48
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU5_LANE2                                 0x9ae8
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU5_LANE2                                 0x9b88
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU5_LANE2                                 0x9c28
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU5_LANE2                                 0x9cc8
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU5_LANE2                                 0x9d68
+#define mmTX_DISP_RFU5_LANE3                                                    0x4918
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU5_LANE3                                 0x4918
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU5_LANE3                                 0x49b8
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU5_LANE3                                 0x9a58
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU5_LANE3                                 0x9af8
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU5_LANE3                                 0x9b98
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU5_LANE3                                 0x9c38
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU5_LANE3                                 0x9cd8
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU5_LANE3                                 0x9d78
+#define mmTX_DISP_RFU6_LANE0                                                    0x48e9
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU6_LANE0                                 0x48e9
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU6_LANE0                                 0x4989
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU6_LANE0                                 0x9a29
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU6_LANE0                                 0x9ac9
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU6_LANE0                                 0x9b69
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU6_LANE0                                 0x9c09
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU6_LANE0                                 0x9ca9
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU6_LANE0                                 0x9d49
+#define mmTX_DISP_RFU6_LANE1                                                    0x48f9
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU6_LANE1                                 0x48f9
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU6_LANE1                                 0x4999
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU6_LANE1                                 0x9a39
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU6_LANE1                                 0x9ad9
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU6_LANE1                                 0x9b79
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU6_LANE1                                 0x9c19
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU6_LANE1                                 0x9cb9
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU6_LANE1                                 0x9d59
+#define mmTX_DISP_RFU6_LANE2                                                    0x4909
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU6_LANE2                                 0x4909
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU6_LANE2                                 0x49a9
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU6_LANE2                                 0x9a49
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU6_LANE2                                 0x9ae9
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU6_LANE2                                 0x9b89
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU6_LANE2                                 0x9c29
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU6_LANE2                                 0x9cc9
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU6_LANE2                                 0x9d69
+#define mmTX_DISP_RFU6_LANE3                                                    0x4919
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU6_LANE3                                 0x4919
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU6_LANE3                                 0x49b9
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU6_LANE3                                 0x9a59
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU6_LANE3                                 0x9af9
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU6_LANE3                                 0x9b99
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU6_LANE3                                 0x9c39
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU6_LANE3                                 0x9cd9
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU6_LANE3                                 0x9d79
+#define mmTX_DISP_RFU7_LANE0                                                    0x48ea
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU7_LANE0                                 0x48ea
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU7_LANE0                                 0x498a
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU7_LANE0                                 0x9a2a
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU7_LANE0                                 0x9aca
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU7_LANE0                                 0x9b6a
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU7_LANE0                                 0x9c0a
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU7_LANE0                                 0x9caa
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU7_LANE0                                 0x9d4a
+#define mmTX_DISP_RFU7_LANE1                                                    0x48fa
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU7_LANE1                                 0x48fa
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU7_LANE1                                 0x499a
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU7_LANE1                                 0x9a3a
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU7_LANE1                                 0x9ada
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU7_LANE1                                 0x9b7a
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU7_LANE1                                 0x9c1a
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU7_LANE1                                 0x9cba
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU7_LANE1                                 0x9d5a
+#define mmTX_DISP_RFU7_LANE2                                                    0x490a
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU7_LANE2                                 0x490a
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU7_LANE2                                 0x49aa
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU7_LANE2                                 0x9a4a
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU7_LANE2                                 0x9aea
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU7_LANE2                                 0x9b8a
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU7_LANE2                                 0x9c2a
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU7_LANE2                                 0x9cca
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU7_LANE2                                 0x9d6a
+#define mmTX_DISP_RFU7_LANE3                                                    0x491a
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU7_LANE3                                 0x491a
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU7_LANE3                                 0x49ba
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU7_LANE3                                 0x9a5a
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU7_LANE3                                 0x9afa
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU7_LANE3                                 0x9b9a
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU7_LANE3                                 0x9c3a
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU7_LANE3                                 0x9cda
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU7_LANE3                                 0x9d7a
+#define mmTX_DISP_RFU8_LANE0                                                    0x48eb
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU8_LANE0                                 0x48eb
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU8_LANE0                                 0x498b
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU8_LANE0                                 0x9a2b
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU8_LANE0                                 0x9acb
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU8_LANE0                                 0x9b6b
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU8_LANE0                                 0x9c0b
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU8_LANE0                                 0x9cab
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU8_LANE0                                 0x9d4b
+#define mmTX_DISP_RFU8_LANE1                                                    0x48fb
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU8_LANE1                                 0x48fb
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU8_LANE1                                 0x499b
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU8_LANE1                                 0x9a3b
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU8_LANE1                                 0x9adb
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU8_LANE1                                 0x9b7b
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU8_LANE1                                 0x9c1b
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU8_LANE1                                 0x9cbb
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU8_LANE1                                 0x9d5b
+#define mmTX_DISP_RFU8_LANE2                                                    0x490b
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU8_LANE2                                 0x490b
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU8_LANE2                                 0x49ab
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU8_LANE2                                 0x9a4b
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU8_LANE2                                 0x9aeb
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU8_LANE2                                 0x9b8b
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU8_LANE2                                 0x9c2b
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU8_LANE2                                 0x9ccb
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU8_LANE2                                 0x9d6b
+#define mmTX_DISP_RFU8_LANE3                                                    0x491b
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU8_LANE3                                 0x491b
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU8_LANE3                                 0x49bb
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU8_LANE3                                 0x9a5b
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU8_LANE3                                 0x9afb
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU8_LANE3                                 0x9b9b
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU8_LANE3                                 0x9c3b
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU8_LANE3                                 0x9cdb
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU8_LANE3                                 0x9d7b
+#define mmTX_DISP_RFU9_LANE0                                                    0x48ec
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU9_LANE0                                 0x48ec
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU9_LANE0                                 0x498c
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU9_LANE0                                 0x9a2c
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU9_LANE0                                 0x9acc
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU9_LANE0                                 0x9b6c
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU9_LANE0                                 0x9c0c
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU9_LANE0                                 0x9cac
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU9_LANE0                                 0x9d4c
+#define mmTX_DISP_RFU9_LANE1                                                    0x48fc
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU9_LANE1                                 0x48fc
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU9_LANE1                                 0x499c
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU9_LANE1                                 0x9a3c
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU9_LANE1                                 0x9adc
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU9_LANE1                                 0x9b7c
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU9_LANE1                                 0x9c1c
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU9_LANE1                                 0x9cbc
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU9_LANE1                                 0x9d5c
+#define mmTX_DISP_RFU9_LANE2                                                    0x490c
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU9_LANE2                                 0x490c
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU9_LANE2                                 0x49ac
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU9_LANE2                                 0x9a4c
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU9_LANE2                                 0x9aec
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU9_LANE2                                 0x9b8c
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU9_LANE2                                 0x9c2c
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU9_LANE2                                 0x9ccc
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU9_LANE2                                 0x9d6c
+#define mmTX_DISP_RFU9_LANE3                                                    0x491c
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU9_LANE3                                 0x491c
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU9_LANE3                                 0x49bc
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU9_LANE3                                 0x9a5c
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU9_LANE3                                 0x9afc
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU9_LANE3                                 0x9b9c
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU9_LANE3                                 0x9c3c
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU9_LANE3                                 0x9cdc
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU9_LANE3                                 0x9d7c
+#define mmTX_DISP_RFU10_LANE0                                                   0x48ed
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU10_LANE0                                0x48ed
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU10_LANE0                                0x498d
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU10_LANE0                                0x9a2d
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU10_LANE0                                0x9acd
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU10_LANE0                                0x9b6d
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU10_LANE0                                0x9c0d
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU10_LANE0                                0x9cad
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU10_LANE0                                0x9d4d
+#define mmTX_DISP_RFU10_LANE1                                                   0x48fd
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU10_LANE1                                0x48fd
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU10_LANE1                                0x499d
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU10_LANE1                                0x9a3d
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU10_LANE1                                0x9add
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU10_LANE1                                0x9b7d
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU10_LANE1                                0x9c1d
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU10_LANE1                                0x9cbd
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU10_LANE1                                0x9d5d
+#define mmTX_DISP_RFU10_LANE2                                                   0x490d
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU10_LANE2                                0x490d
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU10_LANE2                                0x49ad
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU10_LANE2                                0x9a4d
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU10_LANE2                                0x9aed
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU10_LANE2                                0x9b8d
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU10_LANE2                                0x9c2d
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU10_LANE2                                0x9ccd
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU10_LANE2                                0x9d6d
+#define mmTX_DISP_RFU10_LANE3                                                   0x491d
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU10_LANE3                                0x491d
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU10_LANE3                                0x49bd
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU10_LANE3                                0x9a5d
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU10_LANE3                                0x9afd
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU10_LANE3                                0x9b9d
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU10_LANE3                                0x9c3d
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU10_LANE3                                0x9cdd
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU10_LANE3                                0x9d7d
+#define mmTX_DISP_RFU11_LANE0                                                   0x48ee
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU11_LANE0                                0x48ee
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU11_LANE0                                0x498e
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU11_LANE0                                0x9a2e
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU11_LANE0                                0x9ace
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU11_LANE0                                0x9b6e
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU11_LANE0                                0x9c0e
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU11_LANE0                                0x9cae
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU11_LANE0                                0x9d4e
+#define mmTX_DISP_RFU11_LANE1                                                   0x48fe
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU11_LANE1                                0x48fe
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU11_LANE1                                0x499e
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU11_LANE1                                0x9a3e
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU11_LANE1                                0x9ade
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU11_LANE1                                0x9b7e
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU11_LANE1                                0x9c1e
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU11_LANE1                                0x9cbe
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU11_LANE1                                0x9d5e
+#define mmTX_DISP_RFU11_LANE2                                                   0x490e
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU11_LANE2                                0x490e
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU11_LANE2                                0x49ae
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU11_LANE2                                0x9a4e
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU11_LANE2                                0x9aee
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU11_LANE2                                0x9b8e
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU11_LANE2                                0x9c2e
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU11_LANE2                                0x9cce
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU11_LANE2                                0x9d6e
+#define mmTX_DISP_RFU11_LANE3                                                   0x491e
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU11_LANE3                                0x491e
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU11_LANE3                                0x49be
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU11_LANE3                                0x9a5e
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU11_LANE3                                0x9afe
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU11_LANE3                                0x9b9e
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU11_LANE3                                0x9c3e
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU11_LANE3                                0x9cde
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU11_LANE3                                0x9d7e
+#define mmTX_DISP_RFU12_LANE0                                                   0x48ef
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU12_LANE0                                0x48ef
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU12_LANE0                                0x498f
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU12_LANE0                                0x9a2f
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU12_LANE0                                0x9acf
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU12_LANE0                                0x9b6f
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU12_LANE0                                0x9c0f
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU12_LANE0                                0x9caf
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU12_LANE0                                0x9d4f
+#define mmTX_DISP_RFU12_LANE1                                                   0x48ff
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU12_LANE1                                0x48ff
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU12_LANE1                                0x499f
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU12_LANE1                                0x9a3f
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU12_LANE1                                0x9adf
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU12_LANE1                                0x9b7f
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU12_LANE1                                0x9c1f
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU12_LANE1                                0x9cbf
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU12_LANE1                                0x9d5f
+#define mmTX_DISP_RFU12_LANE2                                                   0x490f
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU12_LANE2                                0x490f
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU12_LANE2                                0x49af
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU12_LANE2                                0x9a4f
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU12_LANE2                                0x9aef
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU12_LANE2                                0x9b8f
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU12_LANE2                                0x9c2f
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU12_LANE2                                0x9ccf
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU12_LANE2                                0x9d6f
+#define mmTX_DISP_RFU12_LANE3                                                   0x491f
+#define mmDC_COMBOPHYTXREGS0_TX_DISP_RFU12_LANE3                                0x491f
+#define mmDC_COMBOPHYTXREGS1_TX_DISP_RFU12_LANE3                                0x49bf
+#define mmDC_COMBOPHYTXREGS2_TX_DISP_RFU12_LANE3                                0x9a5f
+#define mmDC_COMBOPHYTXREGS3_TX_DISP_RFU12_LANE3                                0x9aff
+#define mmDC_COMBOPHYTXREGS4_TX_DISP_RFU12_LANE3                                0x9b9f
+#define mmDC_COMBOPHYTXREGS5_TX_DISP_RFU12_LANE3                                0x9c3f
+#define mmDC_COMBOPHYTXREGS6_TX_DISP_RFU12_LANE3                                0x9cdf
+#define mmDC_COMBOPHYTXREGS7_TX_DISP_RFU12_LANE3                                0x9d7f
+#define mmCOMMON_MAR_DEEMPH_NOM                                                 0x48c3
+#define mmDC_COMBOPHYCMREGS0_COMMON_MAR_DEEMPH_NOM                              0x48c3
+#define mmDC_COMBOPHYCMREGS1_COMMON_MAR_DEEMPH_NOM                              0x4963
+#define mmDC_COMBOPHYCMREGS2_COMMON_MAR_DEEMPH_NOM                              0x9a03
+#define mmDC_COMBOPHYCMREGS3_COMMON_MAR_DEEMPH_NOM                              0x9aa3
+#define mmDC_COMBOPHYCMREGS4_COMMON_MAR_DEEMPH_NOM                              0x9b43
+#define mmDC_COMBOPHYCMREGS5_COMMON_MAR_DEEMPH_NOM                              0x9be3
+#define mmDC_COMBOPHYCMREGS6_COMMON_MAR_DEEMPH_NOM                              0x9c83
+#define mmDC_COMBOPHYCMREGS7_COMMON_MAR_DEEMPH_NOM                              0x9d23
+#define mmCOMMON_LANE_PWRMGMT                                                   0x48c4
+#define mmDC_COMBOPHYCMREGS0_COMMON_LANE_PWRMGMT                                0x48c4
+#define mmDC_COMBOPHYCMREGS1_COMMON_LANE_PWRMGMT                                0x4964
+#define mmDC_COMBOPHYCMREGS2_COMMON_LANE_PWRMGMT                                0x9a04
+#define mmDC_COMBOPHYCMREGS3_COMMON_LANE_PWRMGMT                                0x9aa4
+#define mmDC_COMBOPHYCMREGS4_COMMON_LANE_PWRMGMT                                0x9b44
+#define mmDC_COMBOPHYCMREGS5_COMMON_LANE_PWRMGMT                                0x9be4
+#define mmDC_COMBOPHYCMREGS6_COMMON_LANE_PWRMGMT                                0x9c84
+#define mmDC_COMBOPHYCMREGS7_COMMON_LANE_PWRMGMT                                0x9d24
+#define mmCOMMON_TXCNTRL                                                        0x48c5
+#define mmDC_COMBOPHYCMREGS0_COMMON_TXCNTRL                                     0x48c5
+#define mmDC_COMBOPHYCMREGS1_COMMON_TXCNTRL                                     0x4965
+#define mmDC_COMBOPHYCMREGS2_COMMON_TXCNTRL                                     0x9a05
+#define mmDC_COMBOPHYCMREGS3_COMMON_TXCNTRL                                     0x9aa5
+#define mmDC_COMBOPHYCMREGS4_COMMON_TXCNTRL                                     0x9b45
+#define mmDC_COMBOPHYCMREGS5_COMMON_TXCNTRL                                     0x9be5
+#define mmDC_COMBOPHYCMREGS6_COMMON_TXCNTRL                                     0x9c85
+#define mmDC_COMBOPHYCMREGS7_COMMON_TXCNTRL                                     0x9d25
+#define mmCOMMON_TMDP                                                           0x48c6
+#define mmDC_COMBOPHYCMREGS0_COMMON_TMDP                                        0x48c6
+#define mmDC_COMBOPHYCMREGS1_COMMON_TMDP                                        0x4966
+#define mmDC_COMBOPHYCMREGS2_COMMON_TMDP                                        0x9a06
+#define mmDC_COMBOPHYCMREGS3_COMMON_TMDP                                        0x9aa6
+#define mmDC_COMBOPHYCMREGS4_COMMON_TMDP                                        0x9b46
+#define mmDC_COMBOPHYCMREGS5_COMMON_TMDP                                        0x9be6
+#define mmDC_COMBOPHYCMREGS6_COMMON_TMDP                                        0x9c86
+#define mmDC_COMBOPHYCMREGS7_COMMON_TMDP                                        0x9d26
+#define mmCOMMON_LANE_RESETS                                                    0x48c7
+#define mmDC_COMBOPHYCMREGS0_COMMON_LANE_RESETS                                 0x48c7
+#define mmDC_COMBOPHYCMREGS1_COMMON_LANE_RESETS                                 0x4967
+#define mmDC_COMBOPHYCMREGS2_COMMON_LANE_RESETS                                 0x9a07
+#define mmDC_COMBOPHYCMREGS3_COMMON_LANE_RESETS                                 0x9aa7
+#define mmDC_COMBOPHYCMREGS4_COMMON_LANE_RESETS                                 0x9b47
+#define mmDC_COMBOPHYCMREGS5_COMMON_LANE_RESETS                                 0x9be7
+#define mmDC_COMBOPHYCMREGS6_COMMON_LANE_RESETS                                 0x9c87
+#define mmDC_COMBOPHYCMREGS7_COMMON_LANE_RESETS                                 0x9d27
+#define mmCOMMON_ZCALCODE_CTRL                                                  0x48c8
+#define mmDC_COMBOPHYCMREGS0_COMMON_ZCALCODE_CTRL                               0x48c8
+#define mmDC_COMBOPHYCMREGS1_COMMON_ZCALCODE_CTRL                               0x4968
+#define mmDC_COMBOPHYCMREGS2_COMMON_ZCALCODE_CTRL                               0x9a08
+#define mmDC_COMBOPHYCMREGS3_COMMON_ZCALCODE_CTRL                               0x9aa8
+#define mmDC_COMBOPHYCMREGS4_COMMON_ZCALCODE_CTRL                               0x9b48
+#define mmDC_COMBOPHYCMREGS5_COMMON_ZCALCODE_CTRL                               0x9be8
+#define mmDC_COMBOPHYCMREGS6_COMMON_ZCALCODE_CTRL                               0x9c88
+#define mmDC_COMBOPHYCMREGS7_COMMON_ZCALCODE_CTRL                               0x9d28
+#define mmCOMMON_DISP_RFU1                                                      0x48c9
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU1                                   0x48c9
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU1                                   0x4969
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU1                                   0x9a09
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU1                                   0x9aa9
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU1                                   0x9b49
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU1                                   0x9be9
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU1                                   0x9c89
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU1                                   0x9d29
+#define mmCOMMON_DISP_RFU2                                                      0x48ca
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU2                                   0x48ca
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU2                                   0x496a
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU2                                   0x9a0a
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU2                                   0x9aaa
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU2                                   0x9b4a
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU2                                   0x9bea
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU2                                   0x9c8a
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU2                                   0x9d2a
+#define mmCOMMON_DISP_RFU3                                                      0x48cb
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU3                                   0x48cb
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU3                                   0x496b
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU3                                   0x9a0b
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU3                                   0x9aab
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU3                                   0x9b4b
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU3                                   0x9beb
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU3                                   0x9c8b
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU3                                   0x9d2b
+#define mmCOMMON_DISP_RFU4                                                      0x48cc
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU4                                   0x48cc
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU4                                   0x496c
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU4                                   0x9a0c
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU4                                   0x9aac
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU4                                   0x9b4c
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU4                                   0x9bec
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU4                                   0x9c8c
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU4                                   0x9d2c
+#define mmCOMMON_DISP_RFU5                                                      0x48cd
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU5                                   0x48cd
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU5                                   0x496d
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU5                                   0x9a0d
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU5                                   0x9aad
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU5                                   0x9b4d
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU5                                   0x9bed
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU5                                   0x9c8d
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU5                                   0x9d2d
+#define mmCOMMON_DISP_RFU6                                                      0x48ce
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU6                                   0x48ce
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU6                                   0x496e
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU6                                   0x9a0e
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU6                                   0x9aae
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU6                                   0x9b4e
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU6                                   0x9bee
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU6                                   0x9c8e
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU6                                   0x9d2e
+#define mmCOMMON_DISP_RFU7                                                      0x48cf
+#define mmDC_COMBOPHYCMREGS0_COMMON_DISP_RFU7                                   0x48cf
+#define mmDC_COMBOPHYCMREGS1_COMMON_DISP_RFU7                                   0x496f
+#define mmDC_COMBOPHYCMREGS2_COMMON_DISP_RFU7                                   0x9a0f
+#define mmDC_COMBOPHYCMREGS3_COMMON_DISP_RFU7                                   0x9aaf
+#define mmDC_COMBOPHYCMREGS4_COMMON_DISP_RFU7                                   0x9b4f
+#define mmDC_COMBOPHYCMREGS5_COMMON_DISP_RFU7                                   0x9bef
+#define mmDC_COMBOPHYCMREGS6_COMMON_DISP_RFU7                                   0x9c8f
+#define mmDC_COMBOPHYCMREGS7_COMMON_DISP_RFU7                                   0x9d2f
+#define mmFREQ_CTRL0                                                            0x4920
+#define mmDC_COMBOPHYPLLREGS0_FREQ_CTRL0                                        0x4920
+#define mmDC_COMBOPHYPLLREGS1_FREQ_CTRL0                                        0x49c0
+#define mmDC_COMBOPHYPLLREGS2_FREQ_CTRL0                                        0x9a60
+#define mmDC_COMBOPHYPLLREGS3_FREQ_CTRL0                                        0x9b00
+#define mmDC_COMBOPHYPLLREGS4_FREQ_CTRL0                                        0x9ba0
+#define mmDC_COMBOPHYPLLREGS5_FREQ_CTRL0                                        0x9c40
+#define mmDC_COMBOPHYPLLREGS6_FREQ_CTRL0                                        0x9ce0
+#define mmDC_COMBOPHYPLLREGS7_FREQ_CTRL0                                        0x9d80
+#define mmFREQ_CTRL1                                                            0x4921
+#define mmDC_COMBOPHYPLLREGS0_FREQ_CTRL1                                        0x4921
+#define mmDC_COMBOPHYPLLREGS1_FREQ_CTRL1                                        0x49c1
+#define mmDC_COMBOPHYPLLREGS2_FREQ_CTRL1                                        0x9a61
+#define mmDC_COMBOPHYPLLREGS3_FREQ_CTRL1                                        0x9b01
+#define mmDC_COMBOPHYPLLREGS4_FREQ_CTRL1                                        0x9ba1
+#define mmDC_COMBOPHYPLLREGS5_FREQ_CTRL1                                        0x9c41
+#define mmDC_COMBOPHYPLLREGS6_FREQ_CTRL1                                        0x9ce1
+#define mmDC_COMBOPHYPLLREGS7_FREQ_CTRL1                                        0x9d81
+#define mmFREQ_CTRL2                                                            0x4922
+#define mmDC_COMBOPHYPLLREGS0_FREQ_CTRL2                                        0x4922
+#define mmDC_COMBOPHYPLLREGS1_FREQ_CTRL2                                        0x49c2
+#define mmDC_COMBOPHYPLLREGS2_FREQ_CTRL2                                        0x9a62
+#define mmDC_COMBOPHYPLLREGS3_FREQ_CTRL2                                        0x9b02
+#define mmDC_COMBOPHYPLLREGS4_FREQ_CTRL2                                        0x9ba2
+#define mmDC_COMBOPHYPLLREGS5_FREQ_CTRL2                                        0x9c42
+#define mmDC_COMBOPHYPLLREGS6_FREQ_CTRL2                                        0x9ce2
+#define mmDC_COMBOPHYPLLREGS7_FREQ_CTRL2                                        0x9d82
+#define mmFREQ_CTRL3                                                            0x4923
+#define mmDC_COMBOPHYPLLREGS0_FREQ_CTRL3                                        0x4923
+#define mmDC_COMBOPHYPLLREGS1_FREQ_CTRL3                                        0x49c3
+#define mmDC_COMBOPHYPLLREGS2_FREQ_CTRL3                                        0x9a63
+#define mmDC_COMBOPHYPLLREGS3_FREQ_CTRL3                                        0x9b03
+#define mmDC_COMBOPHYPLLREGS4_FREQ_CTRL3                                        0x9ba3
+#define mmDC_COMBOPHYPLLREGS5_FREQ_CTRL3                                        0x9c43
+#define mmDC_COMBOPHYPLLREGS6_FREQ_CTRL3                                        0x9ce3
+#define mmDC_COMBOPHYPLLREGS7_FREQ_CTRL3                                        0x9d83
+#define mmBW_CTRL_COARSE                                                        0x4924
+#define mmDC_COMBOPHYPLLREGS0_BW_CTRL_COARSE                                    0x4924
+#define mmDC_COMBOPHYPLLREGS1_BW_CTRL_COARSE                                    0x49c4
+#define mmDC_COMBOPHYPLLREGS2_BW_CTRL_COARSE                                    0x9a64
+#define mmDC_COMBOPHYPLLREGS3_BW_CTRL_COARSE                                    0x9b04
+#define mmDC_COMBOPHYPLLREGS4_BW_CTRL_COARSE                                    0x9ba4
+#define mmDC_COMBOPHYPLLREGS5_BW_CTRL_COARSE                                    0x9c44
+#define mmDC_COMBOPHYPLLREGS6_BW_CTRL_COARSE                                    0x9ce4
+#define mmDC_COMBOPHYPLLREGS7_BW_CTRL_COARSE                                    0x9d84
+#define mmBW_CTRL_FINE                                                          0x4925
+#define mmDC_COMBOPHYPLLREGS0_BW_CTRL_FINE                                      0x4925
+#define mmDC_COMBOPHYPLLREGS1_BW_CTRL_FINE                                      0x49c5
+#define mmDC_COMBOPHYPLLREGS2_BW_CTRL_FINE                                      0x9a65
+#define mmDC_COMBOPHYPLLREGS3_BW_CTRL_FINE                                      0x9b05
+#define mmDC_COMBOPHYPLLREGS4_BW_CTRL_FINE                                      0x9ba5
+#define mmDC_COMBOPHYPLLREGS5_BW_CTRL_FINE                                      0x9c45
+#define mmDC_COMBOPHYPLLREGS6_BW_CTRL_FINE                                      0x9ce5
+#define mmDC_COMBOPHYPLLREGS7_BW_CTRL_FINE                                      0x9d85
+#define mmCAL_CTRL                                                              0x4926
+#define mmDC_COMBOPHYPLLREGS0_CAL_CTRL                                          0x4926
+#define mmDC_COMBOPHYPLLREGS1_CAL_CTRL                                          0x49c6
+#define mmDC_COMBOPHYPLLREGS2_CAL_CTRL                                          0x9a66
+#define mmDC_COMBOPHYPLLREGS3_CAL_CTRL                                          0x9b06
+#define mmDC_COMBOPHYPLLREGS4_CAL_CTRL                                          0x9ba6
+#define mmDC_COMBOPHYPLLREGS5_CAL_CTRL                                          0x9c46
+#define mmDC_COMBOPHYPLLREGS6_CAL_CTRL                                          0x9ce6
+#define mmDC_COMBOPHYPLLREGS7_CAL_CTRL                                          0x9d86
+#define mmLOOP_CTRL                                                             0x4927
+#define mmDC_COMBOPHYPLLREGS0_LOOP_CTRL                                         0x4927
+#define mmDC_COMBOPHYPLLREGS1_LOOP_CTRL                                         0x49c7
+#define mmDC_COMBOPHYPLLREGS2_LOOP_CTRL                                         0x9a67
+#define mmDC_COMBOPHYPLLREGS3_LOOP_CTRL                                         0x9b07
+#define mmDC_COMBOPHYPLLREGS4_LOOP_CTRL                                         0x9ba7
+#define mmDC_COMBOPHYPLLREGS5_LOOP_CTRL                                         0x9c47
+#define mmDC_COMBOPHYPLLREGS6_LOOP_CTRL                                         0x9ce7
+#define mmDC_COMBOPHYPLLREGS7_LOOP_CTRL                                         0x9d87
+#define mmDEBUG0                                                                0x4928
+#define mmDC_COMBOPHYPLLREGS0_DEBUG0                                            0x4928
+#define mmDC_COMBOPHYPLLREGS1_DEBUG0                                            0x49c8
+#define mmDC_COMBOPHYPLLREGS2_DEBUG0                                            0x9a68
+#define mmDC_COMBOPHYPLLREGS3_DEBUG0                                            0x9b08
+#define mmDC_COMBOPHYPLLREGS4_DEBUG0                                            0x9ba8
+#define mmDC_COMBOPHYPLLREGS5_DEBUG0                                            0x9c48
+#define mmDC_COMBOPHYPLLREGS6_DEBUG0                                            0x9ce8
+#define mmDC_COMBOPHYPLLREGS7_DEBUG0                                            0x9d88
+#define mmVREG_CFG                                                              0x4929
+#define mmDC_COMBOPHYPLLREGS0_VREG_CFG                                          0x4929
+#define mmDC_COMBOPHYPLLREGS1_VREG_CFG                                          0x49c9
+#define mmDC_COMBOPHYPLLREGS2_VREG_CFG                                          0x9a69
+#define mmDC_COMBOPHYPLLREGS3_VREG_CFG                                          0x9b09
+#define mmDC_COMBOPHYPLLREGS4_VREG_CFG                                          0x9ba9
+#define mmDC_COMBOPHYPLLREGS5_VREG_CFG                                          0x9c49
+#define mmDC_COMBOPHYPLLREGS6_VREG_CFG                                          0x9ce9
+#define mmDC_COMBOPHYPLLREGS7_VREG_CFG                                          0x9d89
+#define mmOBSERVE0                                                              0x492a
+#define mmDC_COMBOPHYPLLREGS0_OBSERVE0                                          0x492a
+#define mmDC_COMBOPHYPLLREGS1_OBSERVE0                                          0x49ca
+#define mmDC_COMBOPHYPLLREGS2_OBSERVE0                                          0x9a6a
+#define mmDC_COMBOPHYPLLREGS3_OBSERVE0                                          0x9b0a
+#define mmDC_COMBOPHYPLLREGS4_OBSERVE0                                          0x9baa
+#define mmDC_COMBOPHYPLLREGS5_OBSERVE0                                          0x9c4a
+#define mmDC_COMBOPHYPLLREGS6_OBSERVE0                                          0x9cea
+#define mmDC_COMBOPHYPLLREGS7_OBSERVE0                                          0x9d8a
+#define mmOBSERVE1                                                              0x492b
+#define mmDC_COMBOPHYPLLREGS0_OBSERVE1                                          0x492b
+#define mmDC_COMBOPHYPLLREGS1_OBSERVE1                                          0x49cb
+#define mmDC_COMBOPHYPLLREGS2_OBSERVE1                                          0x9a6b
+#define mmDC_COMBOPHYPLLREGS3_OBSERVE1                                          0x9b0b
+#define mmDC_COMBOPHYPLLREGS4_OBSERVE1                                          0x9bab
+#define mmDC_COMBOPHYPLLREGS5_OBSERVE1                                          0x9c4b
+#define mmDC_COMBOPHYPLLREGS6_OBSERVE1                                          0x9ceb
+#define mmDC_COMBOPHYPLLREGS7_OBSERVE1                                          0x9d8b
+#define mmDFT_OUT                                                               0x492c
+#define mmDC_COMBOPHYPLLREGS0_DFT_OUT                                           0x492c
+#define mmDC_COMBOPHYPLLREGS1_DFT_OUT                                           0x49cc
+#define mmDC_COMBOPHYPLLREGS2_DFT_OUT                                           0x9a6c
+#define mmDC_COMBOPHYPLLREGS3_DFT_OUT                                           0x9b0c
+#define mmDC_COMBOPHYPLLREGS4_DFT_OUT                                           0x9bac
+#define mmDC_COMBOPHYPLLREGS5_DFT_OUT                                           0x9c4c
+#define mmDC_COMBOPHYPLLREGS6_DFT_OUT                                           0x9cec
+#define mmDC_COMBOPHYPLLREGS7_DFT_OUT                                           0x9d8c
+#define mmPLL_WRAP_CNTRL1                                                       0x495e
+#define mmDC_COMBOPHYPLLREGS0_PLL_WRAP_CNTRL1                                   0x495e
+#define mmDC_COMBOPHYPLLREGS1_PLL_WRAP_CNTRL1                                   0x49fe
+#define mmDC_COMBOPHYPLLREGS2_PLL_WRAP_CNTRL1                                   0x9a9e
+#define mmDC_COMBOPHYPLLREGS3_PLL_WRAP_CNTRL1                                   0x9b3e
+#define mmDC_COMBOPHYPLLREGS4_PLL_WRAP_CNTRL1                                   0x9bde
+#define mmDC_COMBOPHYPLLREGS5_PLL_WRAP_CNTRL1                                   0x9c7e
+#define mmDC_COMBOPHYPLLREGS6_PLL_WRAP_CNTRL1                                   0x9d1e
+#define mmDC_COMBOPHYPLLREGS7_PLL_WRAP_CNTRL1                                   0x9dbe
+#define mmPLL_WRAP_CNTRL                                                        0x495f
+#define mmDC_COMBOPHYPLLREGS0_PLL_WRAP_CNTRL                                    0x495f
+#define mmDC_COMBOPHYPLLREGS1_PLL_WRAP_CNTRL                                    0x49ff
+#define mmDC_COMBOPHYPLLREGS2_PLL_WRAP_CNTRL                                    0x9a9f
+#define mmDC_COMBOPHYPLLREGS3_PLL_WRAP_CNTRL                                    0x9b3f
+#define mmDC_COMBOPHYPLLREGS4_PLL_WRAP_CNTRL                                    0x9bdf
+#define mmDC_COMBOPHYPLLREGS5_PLL_WRAP_CNTRL                                    0x9c7f
+#define mmDC_COMBOPHYPLLREGS6_PLL_WRAP_CNTRL                                    0x9d1f
+#define mmDC_COMBOPHYPLLREGS7_PLL_WRAP_CNTRL                                    0x9dbf
+#define mmPPLL_VREG_CFG                                                         0x1700
+#define mmDC_DISPLAYPLLREGS0_PPLL_VREG_CFG                                      0x1700
+#define mmDC_DISPLAYPLLREGS1_PPLL_VREG_CFG                                      0x172a
+#define mmDC_DISPLAYPLLREGS2_PPLL_VREG_CFG                                      0x1754
+#define mmPPLL_MODE_CNTL                                                        0x1701
+#define mmDC_DISPLAYPLLREGS0_PPLL_MODE_CNTL                                     0x1701
+#define mmDC_DISPLAYPLLREGS1_PPLL_MODE_CNTL                                     0x172b
+#define mmDC_DISPLAYPLLREGS2_PPLL_MODE_CNTL                                     0x1755
+#define mmPPLL_FREQ_CTRL0                                                       0x1702
+#define mmDC_DISPLAYPLLREGS0_PPLL_FREQ_CTRL0                                    0x1702
+#define mmDC_DISPLAYPLLREGS1_PPLL_FREQ_CTRL0                                    0x172c
+#define mmDC_DISPLAYPLLREGS2_PPLL_FREQ_CTRL0                                    0x1756
+#define mmPPLL_FREQ_CTRL1                                                       0x1703
+#define mmDC_DISPLAYPLLREGS0_PPLL_FREQ_CTRL1                                    0x1703
+#define mmDC_DISPLAYPLLREGS1_PPLL_FREQ_CTRL1                                    0x172d
+#define mmDC_DISPLAYPLLREGS2_PPLL_FREQ_CTRL1                                    0x1757
+#define mmPPLL_FREQ_CTRL2                                                       0x1704
+#define mmDC_DISPLAYPLLREGS0_PPLL_FREQ_CTRL2                                    0x1704
+#define mmDC_DISPLAYPLLREGS1_PPLL_FREQ_CTRL2                                    0x172e
+#define mmDC_DISPLAYPLLREGS2_PPLL_FREQ_CTRL2                                    0x1758
+#define mmPPLL_FREQ_CTRL3                                                       0x1705
+#define mmDC_DISPLAYPLLREGS0_PPLL_FREQ_CTRL3                                    0x1705
+#define mmDC_DISPLAYPLLREGS1_PPLL_FREQ_CTRL3                                    0x172f
+#define mmDC_DISPLAYPLLREGS2_PPLL_FREQ_CTRL3                                    0x1759
+#define mmPPLL_BW_CTRL_COARSE                                                   0x1706
+#define mmDC_DISPLAYPLLREGS0_PPLL_BW_CTRL_COARSE                                0x1706
+#define mmDC_DISPLAYPLLREGS1_PPLL_BW_CTRL_COARSE                                0x1730
+#define mmDC_DISPLAYPLLREGS2_PPLL_BW_CTRL_COARSE                                0x175a
+#define mmPPLL_BW_CTRL_FINE                                                     0x1708
+#define mmDC_DISPLAYPLLREGS0_PPLL_BW_CTRL_FINE                                  0x1708
+#define mmDC_DISPLAYPLLREGS1_PPLL_BW_CTRL_FINE                                  0x1732
+#define mmDC_DISPLAYPLLREGS2_PPLL_BW_CTRL_FINE                                  0x175c
+#define mmPPLL_CAL_CTRL                                                         0x1709
+#define mmDC_DISPLAYPLLREGS0_PPLL_CAL_CTRL                                      0x1709
+#define mmDC_DISPLAYPLLREGS1_PPLL_CAL_CTRL                                      0x1733
+#define mmDC_DISPLAYPLLREGS2_PPLL_CAL_CTRL                                      0x175d
+#define mmPPLL_LOOP_CTRL                                                        0x170a
+#define mmDC_DISPLAYPLLREGS0_PPLL_LOOP_CTRL                                     0x170a
+#define mmDC_DISPLAYPLLREGS1_PPLL_LOOP_CTRL                                     0x1734
+#define mmDC_DISPLAYPLLREGS2_PPLL_LOOP_CTRL                                     0x175e
+#define mmPPLL_REFCLK_CNTL                                                      0x1718
+#define mmDC_DISPLAYPLLREGS0_PPLL_REFCLK_CNTL                                   0x1718
+#define mmDC_DISPLAYPLLREGS1_PPLL_REFCLK_CNTL                                   0x1742
+#define mmDC_DISPLAYPLLREGS2_PPLL_REFCLK_CNTL                                   0x176c
+#define mmPPLL_CLKOUT_CNTL                                                      0x1719
+#define mmDC_DISPLAYPLLREGS0_PPLL_CLKOUT_CNTL                                   0x1719
+#define mmDC_DISPLAYPLLREGS1_PPLL_CLKOUT_CNTL                                   0x1743
+#define mmDC_DISPLAYPLLREGS2_PPLL_CLKOUT_CNTL                                   0x176d
+#define mmPPLL_DFT_CNTL                                                         0x171a
+#define mmDC_DISPLAYPLLREGS0_PPLL_DFT_CNTL                                      0x171a
+#define mmDC_DISPLAYPLLREGS1_PPLL_DFT_CNTL                                      0x1744
+#define mmDC_DISPLAYPLLREGS2_PPLL_DFT_CNTL                                      0x176e
+#define mmPPLL_ANALOG_CNTL                                                      0x171b
+#define mmDC_DISPLAYPLLREGS0_PPLL_ANALOG_CNTL                                   0x171b
+#define mmDC_DISPLAYPLLREGS1_PPLL_ANALOG_CNTL                                   0x1745
+#define mmDC_DISPLAYPLLREGS2_PPLL_ANALOG_CNTL                                   0x176f
+#define mmPPLL_POSTDIV                                                          0x171c
+#define mmDC_DISPLAYPLLREGS0_PPLL_POSTDIV                                       0x171c
+#define mmDC_DISPLAYPLLREGS1_PPLL_POSTDIV                                       0x1746
+#define mmDC_DISPLAYPLLREGS2_PPLL_POSTDIV                                       0x1770
+#define mmPPLL_DEBUG0                                                           0x1720
+#define mmDC_DISPLAYPLLREGS0_PPLL_DEBUG0                                        0x1720
+#define mmDC_DISPLAYPLLREGS1_PPLL_DEBUG0                                        0x174a
+#define mmDC_DISPLAYPLLREGS2_PPLL_DEBUG0                                        0x1774
+#define mmPPLL_OBSERVE0                                                         0x1721
+#define mmDC_DISPLAYPLLREGS0_PPLL_OBSERVE0                                      0x1721
+#define mmDC_DISPLAYPLLREGS1_PPLL_OBSERVE0                                      0x174b
+#define mmDC_DISPLAYPLLREGS2_PPLL_OBSERVE0                                      0x1775
+#define mmPPLL_OBSERVE1                                                         0x1722
+#define mmDC_DISPLAYPLLREGS0_PPLL_OBSERVE1                                      0x1722
+#define mmDC_DISPLAYPLLREGS1_PPLL_OBSERVE1                                      0x174c
+#define mmDC_DISPLAYPLLREGS2_PPLL_OBSERVE1                                      0x1776
+#define mmPPLL_UPDATE_CNTL                                                      0x1724
+#define mmDC_DISPLAYPLLREGS0_PPLL_UPDATE_CNTL                                   0x1724
+#define mmDC_DISPLAYPLLREGS1_PPLL_UPDATE_CNTL                                   0x174e
+#define mmDC_DISPLAYPLLREGS2_PPLL_UPDATE_CNTL                                   0x1778
+#define mmPPLL_OBSERVE0_OUT                                                     0x1725
+#define mmDC_DISPLAYPLLREGS0_PPLL_OBSERVE0_OUT                                  0x1725
+#define mmDC_DISPLAYPLLREGS1_PPLL_OBSERVE0_OUT                                  0x174f
+#define mmDC_DISPLAYPLLREGS2_PPLL_OBSERVE0_OUT                                  0x1779
+#define mmPPLL_STATUS_DEBUG1                                                    0x1726
+#define mmDC_DISPLAYPLLREGS0_PPLL_STATUS_DEBUG1                                 0x1726
+#define mmDC_DISPLAYPLLREGS1_PPLL_STATUS_DEBUG1                                 0x1750
+#define mmDC_DISPLAYPLLREGS2_PPLL_STATUS_DEBUG1                                 0x177a
+#define mmPPLL_DEBUG_MUX_CNTL                                                   0x1727
+#define mmDC_DISPLAYPLLREGS0_PPLL_DEBUG_MUX_CNTL                                0x1727
+#define mmDC_DISPLAYPLLREGS1_PPLL_DEBUG_MUX_CNTL                                0x1751
+#define mmDC_DISPLAYPLLREGS2_PPLL_DEBUG_MUX_CNTL                                0x177b
+#define mmPPLL_DIV_UPDATE_DEBUG                                                 0x1728
+#define mmDC_DISPLAYPLLREGS0_PPLL_DIV_UPDATE_DEBUG                              0x1728
+#define mmDC_DISPLAYPLLREGS1_PPLL_DIV_UPDATE_DEBUG                              0x1752
+#define mmDC_DISPLAYPLLREGS2_PPLL_DIV_UPDATE_DEBUG                              0x177c
+#define mmPPLL_STATUS_DEBUG0                                                    0x1729
+#define mmDC_DISPLAYPLLREGS0_PPLL_STATUS_DEBUG0                                 0x1729
+#define mmDC_DISPLAYPLLREGS1_PPLL_STATUS_DEBUG0                                 0x1753
+#define mmDC_DISPLAYPLLREGS2_PPLL_STATUS_DEBUG0                                 0x177d
+#define mmCOMP_EN_CTL                                                           0x9dc0
+#define mmDPCSTX_PHY_CNTL                                                       0x48d0
+#define mmDPCSTX0_DPCSTX_PHY_CNTL                                               0x48d0
+#define mmDPCSTX1_DPCSTX_PHY_CNTL                                               0x4970
+#define mmDPCSTX2_DPCSTX_PHY_CNTL                                               0x9a10
+#define mmDPCSTX3_DPCSTX_PHY_CNTL                                               0x9ab0
+#define mmDPCSTX4_DPCSTX_PHY_CNTL                                               0x9b50
+#define mmDPCSTX5_DPCSTX_PHY_CNTL                                               0x9bf0
+#define mmDPCSTX6_DPCSTX_PHY_CNTL                                               0x9c90
+#define mmDPCSTX7_DPCSTX_PHY_CNTL                                               0x9d30
+#define mmDPCSTX_TX_CLOCK_CNTL                                                  0x48d1
+#define mmDPCSTX0_DPCSTX_TX_CLOCK_CNTL                                          0x48d1
+#define mmDPCSTX1_DPCSTX_TX_CLOCK_CNTL                                          0x4971
+#define mmDPCSTX2_DPCSTX_TX_CLOCK_CNTL                                          0x9a11
+#define mmDPCSTX3_DPCSTX_TX_CLOCK_CNTL                                          0x9ab1
+#define mmDPCSTX4_DPCSTX_TX_CLOCK_CNTL                                          0x9b51
+#define mmDPCSTX5_DPCSTX_TX_CLOCK_CNTL                                          0x9bf1
+#define mmDPCSTX6_DPCSTX_TX_CLOCK_CNTL                                          0x9c91
+#define mmDPCSTX7_DPCSTX_TX_CLOCK_CNTL                                          0x9d31
+#define mmDPCSTX_TX_CNTL                                                        0x48d3
+#define mmDPCSTX0_DPCSTX_TX_CNTL                                                0x48d3
+#define mmDPCSTX1_DPCSTX_TX_CNTL                                                0x4973
+#define mmDPCSTX2_DPCSTX_TX_CNTL                                                0x9a13
+#define mmDPCSTX3_DPCSTX_TX_CNTL                                                0x9ab3
+#define mmDPCSTX4_DPCSTX_TX_CNTL                                                0x9b53
+#define mmDPCSTX5_DPCSTX_TX_CNTL                                                0x9bf3
+#define mmDPCSTX6_DPCSTX_TX_CNTL                                                0x9c93
+#define mmDPCSTX7_DPCSTX_TX_CNTL                                                0x9d33
+#define mmDPCSTX_CBUS_CNTL                                                      0x48d5
+#define mmDPCSTX0_DPCSTX_CBUS_CNTL                                              0x48d5
+#define mmDPCSTX1_DPCSTX_CBUS_CNTL                                              0x4975
+#define mmDPCSTX2_DPCSTX_CBUS_CNTL                                              0x9a15
+#define mmDPCSTX3_DPCSTX_CBUS_CNTL                                              0x9ab5
+#define mmDPCSTX4_DPCSTX_CBUS_CNTL                                              0x9b55
+#define mmDPCSTX5_DPCSTX_CBUS_CNTL                                              0x9bf5
+#define mmDPCSTX6_DPCSTX_CBUS_CNTL                                              0x9c95
+#define mmDPCSTX7_DPCSTX_CBUS_CNTL                                              0x9d35
+#define mmDPCSTX_REG_ERROR_STATUS                                               0x48d6
+#define mmDPCSTX0_DPCSTX_REG_ERROR_STATUS                                       0x48d6
+#define mmDPCSTX1_DPCSTX_REG_ERROR_STATUS                                       0x4976
+#define mmDPCSTX2_DPCSTX_REG_ERROR_STATUS                                       0x9a16
+#define mmDPCSTX3_DPCSTX_REG_ERROR_STATUS                                       0x9ab6
+#define mmDPCSTX4_DPCSTX_REG_ERROR_STATUS                                       0x9b56
+#define mmDPCSTX5_DPCSTX_REG_ERROR_STATUS                                       0x9bf6
+#define mmDPCSTX6_DPCSTX_REG_ERROR_STATUS                                       0x9c96
+#define mmDPCSTX7_DPCSTX_REG_ERROR_STATUS                                       0x9d36
+#define mmDPCSTX_TX_ERROR_STATUS                                                0x48d7
+#define mmDPCSTX0_DPCSTX_TX_ERROR_STATUS                                        0x48d7
+#define mmDPCSTX1_DPCSTX_TX_ERROR_STATUS                                        0x4977
+#define mmDPCSTX2_DPCSTX_TX_ERROR_STATUS                                        0x9a17
+#define mmDPCSTX3_DPCSTX_TX_ERROR_STATUS                                        0x9ab7
+#define mmDPCSTX4_DPCSTX_TX_ERROR_STATUS                                        0x9b57
+#define mmDPCSTX5_DPCSTX_TX_ERROR_STATUS                                        0x9bf7
+#define mmDPCSTX6_DPCSTX_TX_ERROR_STATUS                                        0x9c97
+#define mmDPCSTX7_DPCSTX_TX_ERROR_STATUS                                        0x9d37
+#define mmDPCSTX_PLL_UPDATE_ADDR                                                0x48d8
+#define mmDPCSTX0_DPCSTX_PLL_UPDATE_ADDR                                        0x48d8
+#define mmDPCSTX1_DPCSTX_PLL_UPDATE_ADDR                                        0x4978
+#define mmDPCSTX2_DPCSTX_PLL_UPDATE_ADDR                                        0x9a18
+#define mmDPCSTX3_DPCSTX_PLL_UPDATE_ADDR                                        0x9ab8
+#define mmDPCSTX4_DPCSTX_PLL_UPDATE_ADDR                                        0x9b58
+#define mmDPCSTX5_DPCSTX_PLL_UPDATE_ADDR                                        0x9bf8
+#define mmDPCSTX6_DPCSTX_PLL_UPDATE_ADDR                                        0x9c98
+#define mmDPCSTX7_DPCSTX_PLL_UPDATE_ADDR                                        0x9d38
+#define mmDPCSTX_PLL_UPDATE_DATA                                                0x48d9
+#define mmDPCSTX0_DPCSTX_PLL_UPDATE_DATA                                        0x48d9
+#define mmDPCSTX1_DPCSTX_PLL_UPDATE_DATA                                        0x4979
+#define mmDPCSTX2_DPCSTX_PLL_UPDATE_DATA                                        0x9a19
+#define mmDPCSTX3_DPCSTX_PLL_UPDATE_DATA                                        0x9ab9
+#define mmDPCSTX4_DPCSTX_PLL_UPDATE_DATA                                        0x9b59
+#define mmDPCSTX5_DPCSTX_PLL_UPDATE_DATA                                        0x9bf9
+#define mmDPCSTX6_DPCSTX_PLL_UPDATE_DATA                                        0x9c99
+#define mmDPCSTX7_DPCSTX_PLL_UPDATE_DATA                                        0x9d39
+#define mmDPCSTX_INDEX_MODE_ADDR                                                0x48da
+#define mmDPCSTX0_DPCSTX_INDEX_MODE_ADDR                                        0x48da
+#define mmDPCSTX1_DPCSTX_INDEX_MODE_ADDR                                        0x497a
+#define mmDPCSTX2_DPCSTX_INDEX_MODE_ADDR                                        0x9a1a
+#define mmDPCSTX3_DPCSTX_INDEX_MODE_ADDR                                        0x9aba
+#define mmDPCSTX4_DPCSTX_INDEX_MODE_ADDR                                        0x9b5a
+#define mmDPCSTX5_DPCSTX_INDEX_MODE_ADDR                                        0x9bfa
+#define mmDPCSTX6_DPCSTX_INDEX_MODE_ADDR                                        0x9c9a
+#define mmDPCSTX7_DPCSTX_INDEX_MODE_ADDR                                        0x9d3a
+#define mmDPCSTX_INDEX_MODE_DATA                                                0x48db
+#define mmDPCSTX0_DPCSTX_INDEX_MODE_DATA                                        0x48db
+#define mmDPCSTX1_DPCSTX_INDEX_MODE_DATA                                        0x497b
+#define mmDPCSTX2_DPCSTX_INDEX_MODE_DATA                                        0x9a1b
+#define mmDPCSTX3_DPCSTX_INDEX_MODE_DATA                                        0x9abb
+#define mmDPCSTX4_DPCSTX_INDEX_MODE_DATA                                        0x9b5b
+#define mmDPCSTX5_DPCSTX_INDEX_MODE_DATA                                        0x9bfb
+#define mmDPCSTX6_DPCSTX_INDEX_MODE_DATA                                        0x9c9b
+#define mmDPCSTX7_DPCSTX_INDEX_MODE_DATA                                        0x9d3b
+#define mmDPCSTX_DEBUG_CONFIG                                                   0x48dc
+#define mmDPCSTX0_DPCSTX_DEBUG_CONFIG                                           0x48dc
+#define mmDPCSTX1_DPCSTX_DEBUG_CONFIG                                           0x497c
+#define mmDPCSTX2_DPCSTX_DEBUG_CONFIG                                           0x9a1c
+#define mmDPCSTX3_DPCSTX_DEBUG_CONFIG                                           0x9abc
+#define mmDPCSTX4_DPCSTX_DEBUG_CONFIG                                           0x9b5c
+#define mmDPCSTX5_DPCSTX_DEBUG_CONFIG                                           0x9bfc
+#define mmDPCSTX6_DPCSTX_DEBUG_CONFIG                                           0x9c9c
+#define mmDPCSTX7_DPCSTX_DEBUG_CONFIG                                           0x9d3c
+#define mmDPCSTX_TEST_DEBUG_DATA                                                0x48dd
+#define mmDPCSTX0_DPCSTX_TEST_DEBUG_DATA                                        0x48dd
+#define mmDPCSTX1_DPCSTX_TEST_DEBUG_DATA                                        0x497d
+#define mmDPCSTX2_DPCSTX_TEST_DEBUG_DATA                                        0x9a1d
+#define mmDPCSTX3_DPCSTX_TEST_DEBUG_DATA                                        0x9abd
+#define mmDPCSTX4_DPCSTX_TEST_DEBUG_DATA                                        0x9b5d
+#define mmDPCSTX5_DPCSTX_TEST_DEBUG_DATA                                        0x9bfd
+#define mmDPCSTX6_DPCSTX_TEST_DEBUG_DATA                                        0x9c9d
+#define mmDPCSTX7_DPCSTX_TEST_DEBUG_DATA                                        0x9d3d
+
+#endif /* DCE_11_2_D_H */
diff --git a/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_enum.h b/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_enum.h
new file mode 100644 (file)
index 0000000..b2ea420
--- /dev/null
@@ -0,0 +1,6813 @@
+/*
+ * DCE_11_2 Register documentation
+ *
+ * Copyright (C) 2016  Advanced Micro Devices, 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) 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 DCE_11_2_ENUM_H
+#define DCE_11_2_ENUM_H
+
+typedef enum CRTC_CONTROL_CRTC_START_POINT_CNTL {
+       CRTC_CONTROL_CRTC_START_POINT_CNTL_NORMAL        = 0x0,
+       CRTC_CONTROL_CRTC_START_POINT_CNTL_DP            = 0x1,
+} CRTC_CONTROL_CRTC_START_POINT_CNTL;
+typedef enum CRTC_CONTROL_CRTC_FIELD_NUMBER_CNTL {
+       CRTC_CONTROL_CRTC_FIELD_NUMBER_CNTL_NORMAL       = 0x0,
+       CRTC_CONTROL_CRTC_FIELD_NUMBER_CNTL_DP           = 0x1,
+} CRTC_CONTROL_CRTC_FIELD_NUMBER_CNTL;
+typedef enum CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL {
+       CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL_DISABLE     = 0x0,
+       CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL_DISABLE_CURRENT= 0x1,
+       CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL_RESERVED    = 0x2,
+       CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL_DISABLE_FIRST= 0x3,
+} CRTC_CONTROL_CRTC_DISABLE_POINT_CNTL;
+typedef enum CRTC_CONTROL_CRTC_FIELD_NUMBER_POLARITY {
+       CRTC_CONTROL_CRTC_FIELD_NUMBER_POLARITY_FALSE    = 0x0,
+       CRTC_CONTROL_CRTC_FIELD_NUMBER_POLARITY_TRUE     = 0x1,
+} CRTC_CONTROL_CRTC_FIELD_NUMBER_POLARITY;
+typedef enum CRTC_CONTROL_CRTC_DISP_READ_REQUEST_DISABLE {
+       CRTC_CONTROL_CRTC_DISP_READ_REQUEST_DISABLE_FALSE= 0x0,
+       CRTC_CONTROL_CRTC_DISP_READ_REQUEST_DISABLE_TRUE = 0x1,
+} CRTC_CONTROL_CRTC_DISP_READ_REQUEST_DISABLE;
+typedef enum CRTC_CONTROL_CRTC_SOF_PULL_EN {
+       CRTC_CONTROL_CRTC_SOF_PULL_EN_FALSE              = 0x0,
+       CRTC_CONTROL_CRTC_SOF_PULL_EN_TRUE               = 0x1,
+} CRTC_CONTROL_CRTC_SOF_PULL_EN;
+typedef enum CRTC_H_SYNC_B_CNTL_CRTC_H_SYNC_B_POL {
+       CRTC_H_SYNC_B_CNTL_CRTC_H_SYNC_B_POL_FALSE       = 0x0,
+       CRTC_H_SYNC_B_CNTL_CRTC_H_SYNC_B_POL_TRUE        = 0x1,
+} CRTC_H_SYNC_B_CNTL_CRTC_H_SYNC_B_POL;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MAX_SEL {
+       CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MAX_SEL_FALSE  = 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MAX_SEL_TRUE   = 0x1,
+} CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MAX_SEL;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MIN_SEL {
+       CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MIN_SEL_FALSE  = 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MIN_SEL_TRUE   = 0x1,
+} CRTC_V_TOTAL_CONTROL_CRTC_V_TOTAL_MIN_SEL;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_EN {
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_EN_FALSE= 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_EN_TRUE= 0x1,
+} CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_EN;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_TO_MASTER_VSYNC {
+       CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_TO_MASTER_VSYNC_DISABLE= 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_TO_MASTER_VSYNC_ENABLE= 0x1,
+} CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_TO_MASTER_VSYNC;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_ON_EVENT {
+       CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_ON_EVENT_DISABLE= 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_ON_EVENT_ENABLE= 0x1,
+} CRTC_V_TOTAL_CONTROL_CRTC_FORCE_LOCK_ON_EVENT;
+typedef enum CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK {
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_FRAME_START= 0x0,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_CRTC_TRIG_A= 0x1,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_CRTC_TRIG_B= 0x2,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_CURSOR_CHANGE= 0x3,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_OTHER_CLIENT= 0x4,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_MC_DC_REGION0= 0x5,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_MC_DC_REGION1= 0x6,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_MC_DC_REGION2= 0x7,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_MC_DC_REGION3= 0x8,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_GRAPHIC_UPDATE_PENDING= 0x9,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_RESERVED2= 0xa,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_INVALID= 0xb,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_DOUBLE_BUFFER= 0xc,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_D1CRTC_VERT_COUNT_NOM= 0xd,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_D1CRTC_VERT_COUNT= 0xe,
+       CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK_RESERVED= 0xf,
+} CRTC_V_TOTAL_CONTROL_CRTC_SET_V_TOTAL_MIN_MASK;
+typedef enum CRTC_V_TOTAL_INT_STATUS_CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK {
+       CRTC_V_TOTAL_INT_STATUS_CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK_FALSE= 0x0,
+       CRTC_V_TOTAL_INT_STATUS_CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK_TRUE= 0x1,
+} CRTC_V_TOTAL_INT_STATUS_CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK;
+typedef enum CRTC_VSYNC_NOM_INT_STATUS_CRTC_VSYNC_NOM_INT_CLEAR {
+       CRTC_VSYNC_NOM_INT_STATUS_CRTC_VSYNC_NOM_INT_CLEAR_FALSE= 0x0,
+       CRTC_VSYNC_NOM_INT_STATUS_CRTC_VSYNC_NOM_INT_CLEAR_TRUE= 0x1,
+} CRTC_VSYNC_NOM_INT_STATUS_CRTC_VSYNC_NOM_INT_CLEAR;
+typedef enum CRTC_V_SYNC_B_CNTL_CRTC_V_SYNC_B_POL {
+       CRTC_V_SYNC_B_CNTL_CRTC_V_SYNC_B_POL_FALSE       = 0x0,
+       CRTC_V_SYNC_B_CNTL_CRTC_V_SYNC_B_POL_TRUE        = 0x1,
+} CRTC_V_SYNC_B_CNTL_CRTC_V_SYNC_B_POL;
+typedef enum CRTC_DTMTEST_CNTL_CRTC_DTMTEST_CRTC_EN {
+       CRTC_DTMTEST_CNTL_CRTC_DTMTEST_CRTC_EN_FALSE     = 0x0,
+       CRTC_DTMTEST_CNTL_CRTC_DTMTEST_CRTC_EN_TRUE      = 0x1,
+} CRTC_DTMTEST_CNTL_CRTC_DTMTEST_CRTC_EN;
+typedef enum CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT {
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_VSYNCA_OTHER= 0x1,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_HSYNCA_OTHER= 0x2,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICF= 0x5,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICE= 0x6,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_VSYNCA  = 0x7,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_HSYNCA  = 0x8,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_VSYNCB  = 0x9,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_HSYNCB  = 0xa,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_HPD1    = 0xb,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_HPD2    = 0xc,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICD= 0xd,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICC= 0xe,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_IGSL0   = 0x10,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_IGSL1   = 0x11,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_IGSL2   = 0x12,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_IBLON   = 0x13,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICA= 0x14,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_GENERICB= 0x15,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_IGSL_ALLOW= 0x16,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT_MANUAL_FLOW= 0x17,
+} CRTC_TRIGA_CNTL_CRTC_TRIGA_SOURCE_SELECT;
+typedef enum CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT {
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_INTERLACE= 0x1,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_GENERICA= 0x2,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_GENERICB= 0x3,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_HSYNCA= 0x4,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_HSYNCB= 0x5,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_VIDEO = 0x6,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT_GENERICC= 0x7,
+} CRTC_TRIGA_CNTL_CRTC_TRIGA_POLARITY_SELECT;
+typedef enum CRTC_TRIGA_CNTL_CRTC_TRIGA_RESYNC_BYPASS_EN {
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_RESYNC_BYPASS_EN_FALSE= 0x0,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_RESYNC_BYPASS_EN_TRUE = 0x1,
+} CRTC_TRIGA_CNTL_CRTC_TRIGA_RESYNC_BYPASS_EN;
+typedef enum CRTC_TRIGA_CNTL_CRTC_TRIGA_CLEAR {
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_CLEAR_FALSE           = 0x0,
+       CRTC_TRIGA_CNTL_CRTC_TRIGA_CLEAR_TRUE            = 0x1,
+} CRTC_TRIGA_CNTL_CRTC_TRIGA_CLEAR;
+typedef enum CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT {
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_VSYNCA_OTHER= 0x1,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_HSYNCA_OTHER= 0x2,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICF= 0x5,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICE= 0x6,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_VSYNCA  = 0x7,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_HSYNCA  = 0x8,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_VSYNCB  = 0x9,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_HSYNCB  = 0xa,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_HPD1    = 0xb,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_HPD2    = 0xc,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICD= 0xd,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICC= 0xe,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_IGSL0   = 0x10,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_IGSL1   = 0x11,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_IGSL2   = 0x12,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_IBLON   = 0x13,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICA= 0x14,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_GENERICB= 0x15,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_IGSL_ALLOW= 0x16,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT_MANUAL_FLOW= 0x17,
+} CRTC_TRIGB_CNTL_CRTC_TRIGB_SOURCE_SELECT;
+typedef enum CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT {
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_INTERLACE= 0x1,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_GENERICA= 0x2,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_GENERICB= 0x3,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_HSYNCA= 0x4,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_HSYNCB= 0x5,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_VIDEO = 0x6,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT_GENERICC= 0x7,
+} CRTC_TRIGB_CNTL_CRTC_TRIGB_POLARITY_SELECT;
+typedef enum CRTC_TRIGB_CNTL_CRTC_TRIGB_RESYNC_BYPASS_EN {
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_RESYNC_BYPASS_EN_FALSE= 0x0,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_RESYNC_BYPASS_EN_TRUE = 0x1,
+} CRTC_TRIGB_CNTL_CRTC_TRIGB_RESYNC_BYPASS_EN;
+typedef enum CRTC_TRIGB_CNTL_CRTC_TRIGB_CLEAR {
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_CLEAR_FALSE           = 0x0,
+       CRTC_TRIGB_CNTL_CRTC_TRIGB_CLEAR_TRUE            = 0x1,
+} CRTC_TRIGB_CNTL_CRTC_TRIGB_CLEAR;
+typedef enum CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE {
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE_DISABLE= 0x0,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE_HCOUNT= 0x1,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE_HCOUNT_VCOUNT= 0x2,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE_RESERVED= 0x3,
+} CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_MODE;
+typedef enum CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CHECK {
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CHECK_FALSE= 0x0,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CHECK_TRUE= 0x1,
+} CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CHECK;
+typedef enum CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_TRIG_SEL {
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_TRIG_SEL_FALSE= 0x0,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_TRIG_SEL_TRUE= 0x1,
+} CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_TRIG_SEL;
+typedef enum CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CLEAR {
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CLEAR_FALSE= 0x0,
+       CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CLEAR_TRUE= 0x1,
+} CRTC_FORCE_COUNT_NOW_CNTL_CRTC_FORCE_COUNT_NOW_CLEAR;
+typedef enum CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT {
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_LOGIC0= 0x0,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICF= 0x1,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICE= 0x2,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_HPD1= 0x3,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_HPD2= 0x4,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_DDC1DATA= 0x5,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_DDC1CLK= 0x6,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_DDC2DATA= 0x7,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_DDC2CLK= 0x8,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_DVOCLK= 0x9,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_MANUAL= 0xa,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_LOGIC1= 0xb,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICB= 0xc,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICA= 0xd,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICD= 0xe,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT_GENERICC= 0xf,
+} CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_SOURCE_SELECT;
+typedef enum CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_POLARITY {
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_POLARITY_FALSE= 0x0,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_POLARITY_TRUE= 0x1,
+} CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_POLARITY;
+typedef enum CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_GRANULARITY {
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_GRANULARITY_FALSE= 0x0,
+       CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_GRANULARITY_TRUE= 0x1,
+} CRTC_FLOW_CONTROL_CRTC_FLOW_CONTROL_GRANULARITY;
+typedef enum CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE {
+       CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE_NO= 0x0,
+       CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE_RIGHT= 0x1,
+       CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE_LEFT= 0x2,
+       CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE_RESERVED= 0x3,
+} CRTC_STEREO_FORCE_NEXT_EYE_CRTC_STEREO_FORCE_NEXT_EYE;
+typedef enum CRTC_CONTROL_CRTC_MASTER_EN {
+       CRTC_CONTROL_CRTC_MASTER_EN_FALSE                = 0x0,
+       CRTC_CONTROL_CRTC_MASTER_EN_TRUE                 = 0x1,
+} CRTC_CONTROL_CRTC_MASTER_EN;
+typedef enum CRTC_BLANK_CONTROL_CRTC_BLANK_DATA_EN {
+       CRTC_BLANK_CONTROL_CRTC_BLANK_DATA_EN_FALSE      = 0x0,
+       CRTC_BLANK_CONTROL_CRTC_BLANK_DATA_EN_TRUE       = 0x1,
+} CRTC_BLANK_CONTROL_CRTC_BLANK_DATA_EN;
+typedef enum CRTC_BLANK_CONTROL_CRTC_BLANK_DE_MODE {
+       CRTC_BLANK_CONTROL_CRTC_BLANK_DE_MODE_FALSE      = 0x0,
+       CRTC_BLANK_CONTROL_CRTC_BLANK_DE_MODE_TRUE       = 0x1,
+} CRTC_BLANK_CONTROL_CRTC_BLANK_DE_MODE;
+typedef enum CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_ENABLE {
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_ENABLE_FALSE= 0x0,
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_ENABLE_TRUE= 0x1,
+} CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_ENABLE;
+typedef enum CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD {
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD_NOT= 0x0,
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD_ODD= 0x1,
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD_EVEN= 0x2,
+       CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD_NOT2= 0x3,
+} CRTC_INTERLACE_CONTROL_CRTC_INTERLACE_FORCE_NEXT_FIELD;
+typedef enum CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_INDICATION_OUTPUT_POLARITY {
+       CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_INDICATION_OUTPUT_POLARITY_FALSE= 0x0,
+       CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_INDICATION_OUTPUT_POLARITY_TRUE= 0x1,
+} CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_INDICATION_OUTPUT_POLARITY;
+typedef enum CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_ALIGNMENT {
+       CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_ALIGNMENT_FALSE= 0x0,
+       CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_ALIGNMENT_TRUE= 0x1,
+} CRTC_FIELD_INDICATION_CONTROL_CRTC_FIELD_ALIGNMENT;
+typedef enum CRTC_COUNT_CONTROL_CRTC_HORZ_COUNT_BY2_EN {
+       CRTC_COUNT_CONTROL_CRTC_HORZ_COUNT_BY2_EN_FALSE  = 0x0,
+       CRTC_COUNT_CONTROL_CRTC_HORZ_COUNT_BY2_EN_TRUE   = 0x1,
+} CRTC_COUNT_CONTROL_CRTC_HORZ_COUNT_BY2_EN;
+typedef enum CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE {
+       CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_FALSE= 0x0,
+       CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_TRUE= 0x1,
+} CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE;
+typedef enum CRTC_VERT_SYNC_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR {
+       CRTC_VERT_SYNC_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR_FALSE= 0x0,
+       CRTC_VERT_SYNC_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR_TRUE= 0x1,
+} CRTC_VERT_SYNC_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR;
+typedef enum CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE {
+       CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE_DISABLE= 0x0,
+       CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE_TRIGGERA= 0x1,
+       CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE_TRIGGERB= 0x2,
+       CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE_RESERVED= 0x3,
+} CRTC_VERT_SYNC_CONTROL_CRTC_AUTO_FORCE_VSYNC_MODE;
+typedef enum CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_OUTPUT_POLARITY {
+       CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_OUTPUT_POLARITY_FALSE= 0x0,
+       CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_OUTPUT_POLARITY_TRUE= 0x1,
+} CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_OUTPUT_POLARITY;
+typedef enum CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_SELECT_POLARITY {
+       CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_SELECT_POLARITY_FALSE= 0x0,
+       CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_SELECT_POLARITY_TRUE= 0x1,
+} CRTC_STEREO_CONTROL_CRTC_STEREO_SYNC_SELECT_POLARITY;
+typedef enum CRTC_STEREO_CONTROL_CRTC_STEREO_EYE_FLAG_POLARITY {
+       CRTC_STEREO_CONTROL_CRTC_STEREO_EYE_FLAG_POLARITY_FALSE= 0x0,
+       CRTC_STEREO_CONTROL_CRTC_STEREO_EYE_FLAG_POLARITY_TRUE= 0x1,
+} CRTC_STEREO_CONTROL_CRTC_STEREO_EYE_FLAG_POLARITY;
+typedef enum CRTC_STEREO_CONTROL_CRTC_STEREO_EN {
+       CRTC_STEREO_CONTROL_CRTC_STEREO_EN_FALSE         = 0x0,
+       CRTC_STEREO_CONTROL_CRTC_STEREO_EN_TRUE          = 0x1,
+} CRTC_STEREO_CONTROL_CRTC_STEREO_EN;
+typedef enum CRTC_SNAPSHOT_STATUS_CRTC_SNAPSHOT_CLEAR {
+       CRTC_SNAPSHOT_STATUS_CRTC_SNAPSHOT_CLEAR_FALSE   = 0x0,
+       CRTC_SNAPSHOT_STATUS_CRTC_SNAPSHOT_CLEAR_TRUE    = 0x1,
+} CRTC_SNAPSHOT_STATUS_CRTC_SNAPSHOT_CLEAR;
+typedef enum CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL {
+       CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL_DISABLE= 0x0,
+       CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL_TRIGGERA= 0x1,
+       CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL_TRIGGERB= 0x2,
+       CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL_RESERVED= 0x3,
+} CRTC_SNAPSHOT_CONTROL_CRTC_AUTO_SNAPSHOT_TRIG_SEL;
+typedef enum CRTC_START_LINE_CONTROL_CRTC_PROGRESSIVE_START_LINE_EARLY {
+       CRTC_START_LINE_CONTROL_CRTC_PROGRESSIVE_START_LINE_EARLY_FALSE= 0x0,
+       CRTC_START_LINE_CONTROL_CRTC_PROGRESSIVE_START_LINE_EARLY_TRUE= 0x1,
+} CRTC_START_LINE_CONTROL_CRTC_PROGRESSIVE_START_LINE_EARLY;
+typedef enum CRTC_START_LINE_CONTROL_CRTC_INTERLACE_START_LINE_EARLY {
+       CRTC_START_LINE_CONTROL_CRTC_INTERLACE_START_LINE_EARLY_FALSE= 0x0,
+       CRTC_START_LINE_CONTROL_CRTC_INTERLACE_START_LINE_EARLY_TRUE= 0x1,
+} CRTC_START_LINE_CONTROL_CRTC_INTERLACE_START_LINE_EARLY;
+typedef enum CRTC_START_LINE_CONTROL_CRTC_LEGACY_REQUESTOR_EN {
+       CRTC_START_LINE_CONTROL_CRTC_LEGACY_REQUESTOR_EN_FALSE= 0x0,
+       CRTC_START_LINE_CONTROL_CRTC_LEGACY_REQUESTOR_EN_TRUE= 0x1,
+} CRTC_START_LINE_CONTROL_CRTC_LEGACY_REQUESTOR_EN;
+typedef enum CRTC_START_LINE_CONTROL_CRTC_PREFETCH_EN {
+       CRTC_START_LINE_CONTROL_CRTC_PREFETCH_EN_FALSE   = 0x0,
+       CRTC_START_LINE_CONTROL_CRTC_PREFETCH_EN_TRUE    = 0x1,
+} CRTC_START_LINE_CONTROL_CRTC_PREFETCH_EN;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_SNAPSHOT_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_V_UPDATE_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_FORCE_COUNT_NOW_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_MSK_FALSE  = 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_MSK_TRUE   = 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_TYPE_FALSE = 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_TYPE_TRUE  = 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_TRIGA_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_MSK_FALSE  = 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_MSK_TRUE   = 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_TYPE_FALSE = 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_TYPE_TRUE  = 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_TRIGB_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_VSYNC_NOM_INT_TYPE;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_MSK {
+       CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_MSK_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_MSK_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_MSK;
+typedef enum CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_TYPE {
+       CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_TYPE_FALSE= 0x0,
+       CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_TYPE_TRUE= 0x1,
+} CRTC_INTERRUPT_CONTROL_CRTC_GSL_VSYNC_GAP_INT_TYPE;
+typedef enum CRTC_UPDATE_LOCK_CRTC_UPDATE_LOCK {
+       CRTC_UPDATE_LOCK_CRTC_UPDATE_LOCK_FALSE          = 0x0,
+       CRTC_UPDATE_LOCK_CRTC_UPDATE_LOCK_TRUE           = 0x1,
+} CRTC_UPDATE_LOCK_CRTC_UPDATE_LOCK;
+typedef enum CRTC_DOUBLE_BUFFER_CONTROL_CRTC_UPDATE_INSTANTLY {
+       CRTC_DOUBLE_BUFFER_CONTROL_CRTC_UPDATE_INSTANTLY_FALSE= 0x0,
+       CRTC_DOUBLE_BUFFER_CONTROL_CRTC_UPDATE_INSTANTLY_TRUE= 0x1,
+} CRTC_DOUBLE_BUFFER_CONTROL_CRTC_UPDATE_INSTANTLY;
+typedef enum CRTC_DOUBLE_BUFFER_CONTROL_CRTC_BLANK_DATA_DOUBLE_BUFFER_EN {
+       CRTC_DOUBLE_BUFFER_CONTROL_CRTC_BLANK_DATA_DOUBLE_BUFFER_EN_FALSE= 0x0,
+       CRTC_DOUBLE_BUFFER_CONTROL_CRTC_BLANK_DATA_DOUBLE_BUFFER_EN_TRUE= 0x1,
+} CRTC_DOUBLE_BUFFER_CONTROL_CRTC_BLANK_DATA_DOUBLE_BUFFER_EN;
+typedef enum CRTC_VGA_PARAMETER_CAPTURE_MODE_CRTC_VGA_PARAMETER_CAPTURE_MODE {
+       CRTC_VGA_PARAMETER_CAPTURE_MODE_CRTC_VGA_PARAMETER_CAPTURE_MODE_FALSE= 0x0,
+       CRTC_VGA_PARAMETER_CAPTURE_MODE_CRTC_VGA_PARAMETER_CAPTURE_MODE_TRUE= 0x1,
+} CRTC_VGA_PARAMETER_CAPTURE_MODE_CRTC_VGA_PARAMETER_CAPTURE_MODE;
+typedef enum CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_EN {
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_EN_FALSE= 0x0,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_EN_TRUE= 0x1,
+} CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_EN;
+typedef enum CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE {
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_RGB= 0x0,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_YCBCR601= 0x1,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_YCBCR709= 0x2,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_VBARS= 0x3,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_HBARS= 0x4,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_SRRGB= 0x5,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_DRRGB= 0x6,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE_XRBIAS= 0x7,
+} CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_MODE;
+typedef enum CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_DYNAMIC_RANGE {
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_DYNAMIC_RANGE_FALSE= 0x0,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_DYNAMIC_RANGE_TRUE= 0x1,
+} CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_DYNAMIC_RANGE;
+typedef enum CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT {
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT_6BPC= 0x0,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT_8BPC= 0x1,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT_10BPC= 0x2,
+       CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT_RESERVED= 0x3,
+} CRTC_TEST_PATTERN_CONTROL_CRTC_TEST_PATTERN_COLOR_FORMAT;
+typedef enum MASTER_UPDATE_LOCK_MASTER_UPDATE_LOCK {
+       MASTER_UPDATE_LOCK_MASTER_UPDATE_LOCK_FALSE      = 0x0,
+       MASTER_UPDATE_LOCK_MASTER_UPDATE_LOCK_TRUE       = 0x1,
+} MASTER_UPDATE_LOCK_MASTER_UPDATE_LOCK;
+typedef enum MASTER_UPDATE_LOCK_GSL_CONTROL_MASTER_UPDATE_LOCK {
+       MASTER_UPDATE_LOCK_GSL_CONTROL_MASTER_UPDATE_LOCK_FALSE= 0x0,
+       MASTER_UPDATE_LOCK_GSL_CONTROL_MASTER_UPDATE_LOCK_TRUE= 0x1,
+} MASTER_UPDATE_LOCK_GSL_CONTROL_MASTER_UPDATE_LOCK;
+typedef enum MASTER_UPDATE_LOCK_UNDERFLOW_UPDATE_LOCK {
+       MASTER_UPDATE_LOCK_UNDERFLOW_UPDATE_LOCK_FALSE   = 0x0,
+       MASTER_UPDATE_LOCK_UNDERFLOW_UPDATE_LOCK_TRUE    = 0x1,
+} MASTER_UPDATE_LOCK_UNDERFLOW_UPDATE_LOCK;
+typedef enum MASTER_UPDATE_MODE_MASTER_UPDATE_MODE {
+       MASTER_UPDATE_MODE_MASTER_UPDATE_MODE_BETWEEN    = 0x0,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_MODE_HSYNCA     = 0x1,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_MODE_VSYNCA     = 0x2,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_MODE_BEFORE     = 0x3,
+} MASTER_UPDATE_MODE_MASTER_UPDATE_MODE;
+typedef enum MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE {
+       MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE_BOTH= 0x0,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE_EVEN= 0x1,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE_ODD= 0x2,
+       MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE_RESERVED= 0x3,
+} MASTER_UPDATE_MODE_MASTER_UPDATE_INTERLACED_MODE;
+typedef enum CRTC_MVP_INBAND_CNTL_INSERT_CRTC_MVP_INBAND_OUT_MODE {
+       CRTC_MVP_INBAND_CNTL_INSERT_CRTC_MVP_INBAND_OUT_MODE_DISABLE= 0x0,
+       CRTC_MVP_INBAND_CNTL_INSERT_CRTC_MVP_INBAND_OUT_MODE_DEBUG= 0x1,
+       CRTC_MVP_INBAND_CNTL_INSERT_CRTC_MVP_INBAND_OUT_MODE_NORMAL= 0x2,
+} CRTC_MVP_INBAND_CNTL_INSERT_CRTC_MVP_INBAND_OUT_MODE;
+typedef enum CRTC_MVP_STATUS_CRTC_FLIP_NOW_CLEAR {
+       CRTC_MVP_STATUS_CRTC_FLIP_NOW_CLEAR_FALSE        = 0x0,
+       CRTC_MVP_STATUS_CRTC_FLIP_NOW_CLEAR_TRUE         = 0x1,
+} CRTC_MVP_STATUS_CRTC_FLIP_NOW_CLEAR;
+typedef enum CRTC_MVP_STATUS_CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR {
+       CRTC_MVP_STATUS_CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR_FALSE= 0x0,
+       CRTC_MVP_STATUS_CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR_TRUE= 0x1,
+} CRTC_MVP_STATUS_CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR;
+typedef enum CRTC_V_UPDATE_INT_STATUS_CRTC_V_UPDATE_INT_CLEAR {
+       CRTC_V_UPDATE_INT_STATUS_CRTC_V_UPDATE_INT_CLEAR_FALSE= 0x0,
+       CRTC_V_UPDATE_INT_STATUS_CRTC_V_UPDATE_INT_CLEAR_TRUE= 0x1,
+} CRTC_V_UPDATE_INT_STATUS_CRTC_V_UPDATE_INT_CLEAR;
+typedef enum CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY {
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY;
+typedef enum CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_ENABLE {
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_ENABLE;
+typedef enum CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_CLEAR {
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_CLEAR_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_CLEAR_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_CLEAR;
+typedef enum CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_TYPE {
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_TYPE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_TYPE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT0_CONTROL_CRTC_VERTICAL_INTERRUPT0_INT_TYPE;
+typedef enum CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_CLEAR {
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_CLEAR_CLEAR_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_CLEAR_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_CLEAR;
+typedef enum CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_ENABLE {
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_ENABLE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_ENABLE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_ENABLE;
+typedef enum CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_TYPE {
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_TYPE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_TYPE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT1_CONTROL_CRTC_VERTICAL_INTERRUPT1_INT_TYPE;
+typedef enum CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_CLEAR {
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_CLEAR_CLEAR_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_CLEAR_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_CLEAR;
+typedef enum CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_ENABLE {
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_ENABLE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_ENABLE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_ENABLE;
+typedef enum CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_TYPE {
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_TYPE_FALSE= 0x0,
+       CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_TYPE_TRUE= 0x1,
+} CRTC_VERTICAL_INTERRUPT2_CONTROL_CRTC_VERTICAL_INTERRUPT2_INT_TYPE;
+typedef enum CRTC_CRC_CNTL_CRTC_CRC_EN {
+       CRTC_CRC_CNTL_CRTC_CRC_EN_FALSE                  = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRC_EN_TRUE                   = 0x1,
+} CRTC_CRC_CNTL_CRTC_CRC_EN;
+typedef enum CRTC_CRC_CNTL_CRTC_CRC_CONT_EN {
+       CRTC_CRC_CNTL_CRTC_CRC_CONT_EN_FALSE             = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRC_CONT_EN_TRUE              = 0x1,
+} CRTC_CRC_CNTL_CRTC_CRC_CONT_EN;
+typedef enum CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE {
+       CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE_LEFT          = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE_RIGHT         = 0x1,
+       CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE_BOTH_EYES     = 0x2,
+       CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE_BOTH_FIELDS   = 0x3,
+} CRTC_CRC_CNTL_CRTC_CRC_STEREO_MODE;
+typedef enum CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE {
+       CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE_TOP        = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE_BOTTOM     = 0x1,
+       CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE_BOTH_BOTTOM= 0x2,
+       CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE_BOTH_FIELD = 0x3,
+} CRTC_CRC_CNTL_CRTC_CRC_INTERLACE_MODE;
+typedef enum CRTC_CRC_CNTL_CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS {
+       CRTC_CRC_CNTL_CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS_FALSE= 0x0,
+       CRTC_CRC_CNTL_CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS_TRUE= 0x1,
+} CRTC_CRC_CNTL_CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS;
+typedef enum CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT {
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_UAB          = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_UA_B         = 0x1,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_U_AB         = 0x2,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_U_A_B        = 0x3,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_IAB          = 0x4,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_IA_B         = 0x5,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_I_AB         = 0x6,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT_I_A_B        = 0x7,
+} CRTC_CRC_CNTL_CRTC_CRTC_CRC0_SELECT;
+typedef enum CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT {
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_UAB          = 0x0,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_UA_B         = 0x1,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_U_AB         = 0x2,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_U_A_B        = 0x3,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_IAB          = 0x4,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_IA_B         = 0x5,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_I_AB         = 0x6,
+       CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT_I_A_B        = 0x7,
+} CRTC_CRC_CNTL_CRTC_CRTC_CRC1_SELECT;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE_DISABLE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE_ONESHOT= 0x1,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE_CONTINUOUS= 0x2,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE_RESERVED= 0x3,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW_1pixel= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW_2pixel= 0x1,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW_3pixel= 0x2,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW_4pixel= 0x3,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY;
+typedef enum CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_INTERLACE_MODE {
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_INTERLACE_MODE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_INTERLACE_MODE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_CONTROL_CRTC_EXT_TIMING_SYNC_INTERLACE_MODE;
+typedef enum CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE {
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_CLEAR {
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_CLEAR_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_CLEAR_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_CLEAR;
+typedef enum CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE {
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE;
+typedef enum CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT {
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_1FRAME= 0x0,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_2FRAME= 0x1,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_4FRAME= 0x2,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_8FRAME= 0x3,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_16FRAME= 0x4,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_32FRAME= 0x5,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_64FRAME= 0x6,
+       CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_128FRAME= 0x7,
+} CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT;
+typedef enum CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_ENABLE {
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_CLEAR {
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_CLEAR_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_CLEAR_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_CLEAR;
+typedef enum CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_TYPE {
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_TYPE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_TYPE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_INT_TYPE;
+typedef enum CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE {
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE;
+typedef enum CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR {
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR;
+typedef enum CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE {
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE_FALSE= 0x0,
+       CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE_TRUE= 0x1,
+} CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL_CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE;
+typedef enum CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_ENABLE {
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_ENABLE_FALSE= 0x0,
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_ENABLE_TRUE= 0x1,
+} CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_ENABLE;
+typedef enum CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_CLEAR {
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_CLEAR_FALSE= 0x0,
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_CLEAR_TRUE= 0x1,
+} CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_CLEAR;
+typedef enum CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_TYPE {
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_TYPE_FALSE= 0x0,
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_TYPE_TRUE= 0x1,
+} CRTC_STATIC_SCREEN_CONTROL_CRTC_CPU_SS_INT_TYPE;
+typedef enum CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE {
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_FALSE= 0x0,
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_TRUE= 0x1,
+} CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE;
+typedef enum CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_VALUE {
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_VALUE_OFF= 0x0,
+       CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_VALUE_ON= 0x1,
+} CRTC_STATIC_SCREEN_CONTROL_CRTC_STATIC_SCREEN_OVERRIDE_VALUE;
+typedef enum CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN {
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_FALSE= 0x0,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_TRUE= 0x1,
+} CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN;
+typedef enum CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_DB {
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_DB_FALSE= 0x0,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_DB_TRUE= 0x1,
+} CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_EN_DB;
+typedef enum CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE {
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE_BLOCK_BOTH= 0x0,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE_BLOCK_INTERLACE= 0x1,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE_BLOCK_PROGRASSIVE= 0x2,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE_RESERVED= 0x3,
+} CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_V_UPDATE_MODE;
+typedef enum CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_STEREO_SEL_OVR {
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_STEREO_SEL_OVR_FALSE= 0x0,
+       CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_STEREO_SEL_OVR_TRUE= 0x1,
+} CRTC_3D_STRUCTURE_CONTROL_CRTC_3D_STRUCTURE_STEREO_SEL_OVR;
+typedef enum CRTC_V_SYNC_A_POL {
+       CRTC_V_SYNC_A_POL_HIGH                           = 0x0,
+       CRTC_V_SYNC_A_POL_LOW                            = 0x1,
+} CRTC_V_SYNC_A_POL;
+typedef enum CRTC_H_SYNC_A_POL {
+       CRTC_H_SYNC_A_POL_HIGH                           = 0x0,
+       CRTC_H_SYNC_A_POL_LOW                            = 0x1,
+} CRTC_H_SYNC_A_POL;
+typedef enum CRTC_HORZ_REPETITION_COUNT {
+       CRTC_HORZ_REPETITION_COUNT_0                     = 0x0,
+       CRTC_HORZ_REPETITION_COUNT_1                     = 0x1,
+       CRTC_HORZ_REPETITION_COUNT_2                     = 0x2,
+       CRTC_HORZ_REPETITION_COUNT_3                     = 0x3,
+       CRTC_HORZ_REPETITION_COUNT_4                     = 0x4,
+       CRTC_HORZ_REPETITION_COUNT_5                     = 0x5,
+       CRTC_HORZ_REPETITION_COUNT_6                     = 0x6,
+       CRTC_HORZ_REPETITION_COUNT_7                     = 0x7,
+       CRTC_HORZ_REPETITION_COUNT_8                     = 0x8,
+       CRTC_HORZ_REPETITION_COUNT_9                     = 0x9,
+       CRTC_HORZ_REPETITION_COUNT_10                    = 0xa,
+       CRTC_HORZ_REPETITION_COUNT_11                    = 0xb,
+       CRTC_HORZ_REPETITION_COUNT_12                    = 0xc,
+       CRTC_HORZ_REPETITION_COUNT_13                    = 0xd,
+       CRTC_HORZ_REPETITION_COUNT_14                    = 0xe,
+       CRTC_HORZ_REPETITION_COUNT_15                    = 0xf,
+} CRTC_HORZ_REPETITION_COUNT;
+typedef enum PERFCOUNTER_CVALUE_SEL {
+       PERFCOUNTER_CVALUE_SEL_47_0                      = 0x0,
+       PERFCOUNTER_CVALUE_SEL_15_0                      = 0x1,
+       PERFCOUNTER_CVALUE_SEL_31_16                     = 0x2,
+       PERFCOUNTER_CVALUE_SEL_47_32                     = 0x3,
+       PERFCOUNTER_CVALUE_SEL_11_0                      = 0x4,
+       PERFCOUNTER_CVALUE_SEL_23_12                     = 0x5,
+       PERFCOUNTER_CVALUE_SEL_35_24                     = 0x6,
+       PERFCOUNTER_CVALUE_SEL_47_36                     = 0x7,
+} PERFCOUNTER_CVALUE_SEL;
+typedef enum PERFCOUNTER_INC_MODE {
+       PERFCOUNTER_INC_MODE_MULTI_BIT                   = 0x0,
+       PERFCOUNTER_INC_MODE_BOTH_EDGE                   = 0x1,
+       PERFCOUNTER_INC_MODE_LSB                         = 0x2,
+       PERFCOUNTER_INC_MODE_POS_EDGE                    = 0x3,
+} PERFCOUNTER_INC_MODE;
+typedef enum PERFCOUNTER_HW_CNTL_SEL {
+       PERFCOUNTER_HW_CNTL_SEL_RUNEN                    = 0x0,
+       PERFCOUNTER_HW_CNTL_SEL_CNTOFF                   = 0x1,
+} PERFCOUNTER_HW_CNTL_SEL;
+typedef enum PERFCOUNTER_RUNEN_MODE {
+       PERFCOUNTER_RUNEN_MODE_LEVEL                     = 0x0,
+       PERFCOUNTER_RUNEN_MODE_EDGE                      = 0x1,
+} PERFCOUNTER_RUNEN_MODE;
+typedef enum PERFCOUNTER_CNTOFF_START_DIS {
+       PERFCOUNTER_CNTOFF_START_ENABLE                  = 0x0,
+       PERFCOUNTER_CNTOFF_START_DISABLE                 = 0x1,
+} PERFCOUNTER_CNTOFF_START_DIS;
+typedef enum PERFCOUNTER_RESTART_EN {
+       PERFCOUNTER_RESTART_DISABLE                      = 0x0,
+       PERFCOUNTER_RESTART_ENABLE                       = 0x1,
+} PERFCOUNTER_RESTART_EN;
+typedef enum PERFCOUNTER_INT_EN {
+       PERFCOUNTER_INT_DISABLE                          = 0x0,
+       PERFCOUNTER_INT_ENABLE                           = 0x1,
+} PERFCOUNTER_INT_EN;
+typedef enum PERFCOUNTER_OFF_MASK {
+       PERFCOUNTER_OFF_MASK_DISABLE                     = 0x0,
+       PERFCOUNTER_OFF_MASK_ENABLE                      = 0x1,
+} PERFCOUNTER_OFF_MASK;
+typedef enum PERFCOUNTER_ACTIVE {
+       PERFCOUNTER_IS_IDLE                              = 0x0,
+       PERFCOUNTER_IS_ACTIVE                            = 0x1,
+} PERFCOUNTER_ACTIVE;
+typedef enum PERFCOUNTER_INT_TYPE {
+       PERFCOUNTER_INT_TYPE_LEVEL                       = 0x0,
+       PERFCOUNTER_INT_TYPE_PULSE                       = 0x1,
+} PERFCOUNTER_INT_TYPE;
+typedef enum PERFCOUNTER_COUNTED_VALUE_TYPE {
+       PERFCOUNTER_COUNTED_VALUE_TYPE_ACC               = 0x0,
+       PERFCOUNTER_COUNTED_VALUE_TYPE_MAX               = 0x1,
+} PERFCOUNTER_COUNTED_VALUE_TYPE;
+typedef enum PERFCOUNTER_CNTL_SEL {
+       PERFCOUNTER_CNTL_SEL_0                           = 0x0,
+       PERFCOUNTER_CNTL_SEL_1                           = 0x1,
+       PERFCOUNTER_CNTL_SEL_2                           = 0x2,
+       PERFCOUNTER_CNTL_SEL_3                           = 0x3,
+       PERFCOUNTER_CNTL_SEL_4                           = 0x4,
+       PERFCOUNTER_CNTL_SEL_5                           = 0x5,
+       PERFCOUNTER_CNTL_SEL_6                           = 0x6,
+       PERFCOUNTER_CNTL_SEL_7                           = 0x7,
+} PERFCOUNTER_CNTL_SEL;
+typedef enum PERFCOUNTER_CNT0_STATE {
+       PERFCOUNTER_CNT0_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT0_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT0_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT0_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT0_STATE;
+typedef enum PERFCOUNTER_STATE_SEL0 {
+       PERFCOUNTER_STATE_SEL0_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL0_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL0;
+typedef enum PERFCOUNTER_CNT1_STATE {
+       PERFCOUNTER_CNT1_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT1_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT1_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT1_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT1_STATE;
+typedef enum PERFCOUNTER_STATE_SEL1 {
+       PERFCOUNTER_STATE_SEL1_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL1_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL1;
+typedef enum PERFCOUNTER_CNT2_STATE {
+       PERFCOUNTER_CNT2_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT2_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT2_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT2_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT2_STATE;
+typedef enum PERFCOUNTER_STATE_SEL2 {
+       PERFCOUNTER_STATE_SEL2_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL2_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL2;
+typedef enum PERFCOUNTER_CNT3_STATE {
+       PERFCOUNTER_CNT3_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT3_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT3_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT3_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT3_STATE;
+typedef enum PERFCOUNTER_STATE_SEL3 {
+       PERFCOUNTER_STATE_SEL3_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL3_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL3;
+typedef enum PERFCOUNTER_CNT4_STATE {
+       PERFCOUNTER_CNT4_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT4_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT4_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT4_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT4_STATE;
+typedef enum PERFCOUNTER_STATE_SEL4 {
+       PERFCOUNTER_STATE_SEL4_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL4_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL4;
+typedef enum PERFCOUNTER_CNT5_STATE {
+       PERFCOUNTER_CNT5_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT5_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT5_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT5_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT5_STATE;
+typedef enum PERFCOUNTER_STATE_SEL5 {
+       PERFCOUNTER_STATE_SEL5_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL5_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL5;
+typedef enum PERFCOUNTER_CNT6_STATE {
+       PERFCOUNTER_CNT6_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT6_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT6_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT6_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT6_STATE;
+typedef enum PERFCOUNTER_STATE_SEL6 {
+       PERFCOUNTER_STATE_SEL6_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL6_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL6;
+typedef enum PERFCOUNTER_CNT7_STATE {
+       PERFCOUNTER_CNT7_STATE_RESET                     = 0x0,
+       PERFCOUNTER_CNT7_STATE_START                     = 0x1,
+       PERFCOUNTER_CNT7_STATE_FREEZE                    = 0x2,
+       PERFCOUNTER_CNT7_STATE_HW                        = 0x3,
+} PERFCOUNTER_CNT7_STATE;
+typedef enum PERFCOUNTER_STATE_SEL7 {
+       PERFCOUNTER_STATE_SEL7_GLOBAL                    = 0x0,
+       PERFCOUNTER_STATE_SEL7_LOCAL                     = 0x1,
+} PERFCOUNTER_STATE_SEL7;
+typedef enum PERFMON_STATE {
+       PERFMON_STATE_RESET                              = 0x0,
+       PERFMON_STATE_START                              = 0x1,
+       PERFMON_STATE_FREEZE                             = 0x2,
+       PERFMON_STATE_HW                                 = 0x3,
+} PERFMON_STATE;
+typedef enum PERFMON_CNTOFF_AND_OR {
+       PERFMON_CNTOFF_OR                                = 0x0,
+       PERFMON_CNTOFF_AND                               = 0x1,
+} PERFMON_CNTOFF_AND_OR;
+typedef enum PERFMON_CNTOFF_INT_EN {
+       PERFMON_CNTOFF_INT_DISABLE                       = 0x0,
+       PERFMON_CNTOFF_INT_ENABLE                        = 0x1,
+} PERFMON_CNTOFF_INT_EN;
+typedef enum PERFMON_CNTOFF_INT_TYPE {
+       PERFMON_CNTOFF_INT_TYPE_LEVEL                    = 0x0,
+       PERFMON_CNTOFF_INT_TYPE_PULSE                    = 0x1,
+} PERFMON_CNTOFF_INT_TYPE;
+typedef enum ENABLE {
+       DISABLE_THE_FEATURE                              = 0x0,
+       ENABLE_THE_FEATURE                               = 0x1,
+} ENABLE;
+typedef enum ENABLE_CLOCK {
+       DISABLE_THE_CLOCK                                = 0x0,
+       ENABLE_THE_CLOCK                                 = 0x1,
+} ENABLE_CLOCK;
+typedef enum FORCE_VBI {
+       FORCE_VBI_LOW                                    = 0x0,
+       FORCE_VBI_HIGH                                   = 0x1,
+} FORCE_VBI;
+typedef enum OVERRIDE_CGTT_SCLK {
+       OVERRIDE_CGTT_SCLK_NOOP                          = 0x0,
+       SET_OVERRIDE_CGTT_SCLK                           = 0x1,
+} OVERRIDE_CGTT_SCLK;
+typedef enum CLEAR_SMU_INTR {
+       SMU_INTR_STATUS_NOOP                             = 0x0,
+       SMU_INTR_STATUS_CLEAR                            = 0x1,
+} CLEAR_SMU_INTR;
+typedef enum STATIC_SCREEN_SMU_INTR {
+       STATIC_SCREEN_SMU_INTR_NOOP                      = 0x0,
+       SET_STATIC_SCREEN_SMU_INTR                       = 0x1,
+} STATIC_SCREEN_SMU_INTR;
+typedef enum JITTER_REMOVE_DISABLE {
+       ENABLE_JITTER_REMOVAL                            = 0x0,
+       DISABLE_JITTER_REMOVAL                           = 0x1,
+} JITTER_REMOVE_DISABLE;
+typedef enum DISABLE_CLOCK_GATING {
+       CLOCK_GATING_ENABLED                             = 0x0,
+       CLOCK_GATING_DISABLED                            = 0x1,
+} DISABLE_CLOCK_GATING;
+typedef enum DISABLE_CLOCK_GATING_IN_DCO {
+       CLOCK_GATING_ENABLED_IN_DCO                      = 0x0,
+       CLOCK_GATING_DISABLED_IN_DCO                     = 0x1,
+} DISABLE_CLOCK_GATING_IN_DCO;
+typedef enum DCCG_DEEP_COLOR_CNTL {
+       DCCG_DEEP_COLOR_DTO_DISABLE                      = 0x0,
+       DCCG_DEEP_COLOR_DTO_5_4_RATIO                    = 0x1,
+       DCCG_DEEP_COLOR_DTO_3_2_RATIO                    = 0x2,
+       DCCG_DEEP_COLOR_DTO_2_1_RATIO                    = 0x3,
+} DCCG_DEEP_COLOR_CNTL;
+typedef enum REFCLK_CLOCK_EN {
+       REFCLK_CLOCK_EN_PCIE_REFCLK                      = 0x0,
+       REFCLK_CLOCK_EN_ALLOW_SRC                        = 0x1,
+} REFCLK_CLOCK_EN;
+typedef enum REFCLK_SRC_SEL {
+       REFCLK_SRC_SEL_XTALIN                            = 0x0,
+       REFCLK_SRC_SEL_DISPPLL                           = 0x1,
+} REFCLK_SRC_SEL;
+typedef enum DPREFCLK_SRC_SEL {
+       DPREFCLK_SRC_SEL_CK                              = 0x0,
+       DPREFCLK_SRC_SEL_P0PLL                           = 0x1,
+       DPREFCLK_SRC_SEL_P1PLL                           = 0x2,
+       DPREFCLK_SRC_SEL_P2PLL                           = 0x3,
+       DPREFCLK_SRC_SEL_P3PLL                           = 0x4,
+} DPREFCLK_SRC_SEL;
+typedef enum XTAL_REF_SEL {
+       XTAL_REF_SEL_1X                                  = 0x0,
+       XTAL_REF_SEL_2X                                  = 0x1,
+} XTAL_REF_SEL;
+typedef enum XTAL_REF_CLOCK_SOURCE_SEL {
+       XTAL_REF_CLOCK_SOURCE_SEL_XTALIN                 = 0x0,
+       XTAL_REF_CLOCK_SOURCE_SEL_PPLL                   = 0x1,
+} XTAL_REF_CLOCK_SOURCE_SEL;
+typedef enum MICROSECOND_TIME_BASE_CLOCK_SOURCE_SEL {
+       MICROSECOND_TIME_BASE_CLOCK_IS_XTALIN            = 0x0,
+       MICROSECOND_TIME_BASE_CLOCK_IS_PPLL_REFCLK       = 0x1,
+} MICROSECOND_TIME_BASE_CLOCK_SOURCE_SEL;
+typedef enum ALLOW_SR_ON_TRANS_REQ {
+       ALLOW_SR_ON_TRANS_REQ_ENABLE                     = 0x0,
+       ALLOW_SR_ON_TRANS_REQ_DISABLE                    = 0x1,
+} ALLOW_SR_ON_TRANS_REQ;
+typedef enum MILLISECOND_TIME_BASE_CLOCK_SOURCE_SEL {
+       MILLISECOND_TIME_BASE_CLOCK_IS_XTALIN            = 0x0,
+       MILLISECOND_TIME_BASE_CLOCK_IS_PPLL_REFCLK       = 0x1,
+} MILLISECOND_TIME_BASE_CLOCK_SOURCE_SEL;
+typedef enum PIPE_PIXEL_RATE_SOURCE {
+       PIPE_PIXEL_RATE_SOURCE_P0PLL                     = 0x0,
+       PIPE_PIXEL_RATE_SOURCE_P1PLL                     = 0x1,
+       PIPE_PIXEL_RATE_SOURCE_P2PLL                     = 0x2,
+} PIPE_PIXEL_RATE_SOURCE;
+typedef enum PIPE_PHYPLL_PIXEL_RATE_SOURCE {
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYA            = 0x0,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYB            = 0x1,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYC            = 0x2,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYD            = 0x3,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYE            = 0x4,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYF            = 0x5,
+       PIPE_PHYPLL_PIXEL_RATE_SOURCE_UNIPHYG            = 0x6,
+} PIPE_PHYPLL_PIXEL_RATE_SOURCE;
+typedef enum PIPE_PIXEL_RATE_PLL_SOURCE {
+       PIPE_PIXEL_RATE_PLL_SOURCE_PHYPLL                = 0x0,
+       PIPE_PIXEL_RATE_PLL_SOURCE_DISPPLL               = 0x1,
+} PIPE_PIXEL_RATE_PLL_SOURCE;
+typedef enum DP_DTO_DS_DISABLE {
+       DP_DTO_DESPREAD_DISABLE                          = 0x0,
+       DP_DTO_DESPREAD_ENABLE                           = 0x1,
+} DP_DTO_DS_DISABLE;
+typedef enum CRTC_ADD_PIXEL {
+       CRTC_ADD_PIXEL_NOOP                              = 0x0,
+       CRTC_ADD_PIXEL_FORCE                             = 0x1,
+} CRTC_ADD_PIXEL;
+typedef enum CRTC_DROP_PIXEL {
+       CRTC_DROP_PIXEL_NOOP                             = 0x0,
+       CRTC_DROP_PIXEL_FORCE                            = 0x1,
+} CRTC_DROP_PIXEL;
+typedef enum SYMCLK_FE_FORCE_EN {
+       SYMCLK_FE_FORCE_EN_DISABLE                       = 0x0,
+       SYMCLK_FE_FORCE_EN_ENABLE                        = 0x1,
+} SYMCLK_FE_FORCE_EN;
+typedef enum SYMCLK_FE_FORCE_SRC {
+       SYMCLK_FE_FORCE_SRC_UNIPHYA                      = 0x0,
+       SYMCLK_FE_FORCE_SRC_UNIPHYB                      = 0x1,
+       SYMCLK_FE_FORCE_SRC_UNIPHYC                      = 0x2,
+       SYMCLK_FE_FORCE_SRC_UNIPHYD                      = 0x3,
+       SYMCLK_FE_FORCE_SRC_UNIPHYE                      = 0x4,
+       SYMCLK_FE_FORCE_SRC_UNIPHYF                      = 0x5,
+       SYMCLK_FE_FORCE_SRC_UNIPHYG                      = 0x6,
+} SYMCLK_FE_FORCE_SRC;
+typedef enum DPDBG_CLK_FORCE_EN {
+       DPDBG_CLK_FORCE_EN_DISABLE                       = 0x0,
+       DPDBG_CLK_FORCE_EN_ENABLE                        = 0x1,
+} DPDBG_CLK_FORCE_EN;
+typedef enum DVOACLK_COARSE_SKEW_CNTL {
+       DVOACLK_COARSE_SKEW_CNTL_NO_ADJUSTMENT           = 0x0,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_1_STEP            = 0x1,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_2_STEPS           = 0x2,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_3_STEPS           = 0x3,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_4_STEPS           = 0x4,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_5_STEPS           = 0x5,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_6_STEPS           = 0x6,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_7_STEPS           = 0x7,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_8_STEPS           = 0x8,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_9_STEPS           = 0x9,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_10_STEPS          = 0xa,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_11_STEPS          = 0xb,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_12_STEPS          = 0xc,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_13_STEPS          = 0xd,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_14_STEPS          = 0xe,
+       DVOACLK_COARSE_SKEW_CNTL_DELAY_15_STEPS          = 0xf,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_1_STEP            = 0x10,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_2_STEPS           = 0x11,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_3_STEPS           = 0x12,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_4_STEPS           = 0x13,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_5_STEPS           = 0x14,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_6_STEPS           = 0x15,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_7_STEPS           = 0x16,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_8_STEPS           = 0x17,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_9_STEPS           = 0x18,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_10_STEPS          = 0x19,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_11_STEPS          = 0x1a,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_12_STEPS          = 0x1b,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_13_STEPS          = 0x1c,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_14_STEPS          = 0x1d,
+       DVOACLK_COARSE_SKEW_CNTL_EARLY_15_STEPS          = 0x1e,
+} DVOACLK_COARSE_SKEW_CNTL;
+typedef enum DVOACLK_FINE_SKEW_CNTL {
+       DVOACLK_FINE_SKEW_CNTL_NO_ADJUSTMENT             = 0x0,
+       DVOACLK_FINE_SKEW_CNTL_DELAY_1_STEP              = 0x1,
+       DVOACLK_FINE_SKEW_CNTL_DELAY_2_STEPS             = 0x2,
+       DVOACLK_FINE_SKEW_CNTL_DELAY_3_STEPS             = 0x3,
+       DVOACLK_FINE_SKEW_CNTL_EARLY_1_STEP              = 0x4,
+       DVOACLK_FINE_SKEW_CNTL_EARLY_2_STEPS             = 0x5,
+       DVOACLK_FINE_SKEW_CNTL_EARLY_3_STEPS             = 0x6,
+       DVOACLK_FINE_SKEW_CNTL_EARLY_4_STEPS             = 0x7,
+} DVOACLK_FINE_SKEW_CNTL;
+typedef enum DVOACLKD_IN_PHASE {
+       DVOACLKD_IN_OPPOSITE_PHASE_WITH_PCLK_DVO         = 0x0,
+       DVOACLKD_IN_PHASE_WITH_PCLK_DVO                  = 0x1,
+} DVOACLKD_IN_PHASE;
+typedef enum DVOACLKC_IN_PHASE {
+       DVOACLKC_IN_OPPOSITE_PHASE_WITH_PCLK_DVO         = 0x0,
+       DVOACLKC_IN_PHASE_WITH_PCLK_DVO                  = 0x1,
+} DVOACLKC_IN_PHASE;
+typedef enum DVOACLKC_MVP_IN_PHASE {
+       DVOACLKC_MVP_IN_OPPOSITE_PHASE_WITH_PCLK_DVO     = 0x0,
+       DVOACLKC_MVP_IN_PHASE_WITH_PCLK_DVO              = 0x1,
+} DVOACLKC_MVP_IN_PHASE;
+typedef enum DVOACLKC_MVP_SKEW_PHASE_OVERRIDE {
+       DVOACLKC_MVP_SKEW_PHASE_OVERRIDE_DISABLE         = 0x0,
+       DVOACLKC_MVP_SKEW_PHASE_OVERRIDE_ENABLE          = 0x1,
+} DVOACLKC_MVP_SKEW_PHASE_OVERRIDE;
+typedef enum MVP_CLK_SRC_SEL {
+       MVP_CLK_SRC_SEL_RSRV                             = 0x0,
+       MVP_CLK_SRC_SEL_IO_1                             = 0x1,
+       MVP_CLK_SRC_SEL_IO_2                             = 0x2,
+       MVP_CLK_SRC_SEL_REFCLK                           = 0x3,
+} MVP_CLK_SRC_SEL;
+typedef enum DCCG_AUDIO_DTO0_SOURCE_SEL {
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC0                 = 0x0,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC1                 = 0x1,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC2                 = 0x2,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC3                 = 0x3,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC4                 = 0x4,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_CRTC5                 = 0x5,
+       DCCG_AUDIO_DTO0_SOURCE_SEL_RESERVED              = 0x6,
+} DCCG_AUDIO_DTO0_SOURCE_SEL;
+typedef enum DCCG_AUDIO_DTO_SEL {
+       DCCG_AUDIO_DTO_SEL_AUDIO_DTO0                    = 0x0,
+       DCCG_AUDIO_DTO_SEL_AUDIO_DTO1                    = 0x1,
+       DCCG_AUDIO_DTO_SEL_NO_AUDIO_DTO                  = 0x2,
+} DCCG_AUDIO_DTO_SEL;
+typedef enum DCCG_AUDIO_DTO2_SOURCE_SEL {
+       DCCG_AUDIO_DTO2_SOURCE_SEL_AMCLK0                = 0x0,
+       DCCG_AUDIO_DTO2_SOURCE_SEL_AMCLK1                = 0x1,
+} DCCG_AUDIO_DTO2_SOURCE_SEL;
+typedef enum DCCG_AUDIO_DTO_USE_512FBR_DTO {
+       DCCG_AUDIO_DTO_USE_128FBR_FOR_DP                 = 0x0,
+       DCCG_AUDIO_DTO_USE_512FBR_FOR_DP                 = 0x1,
+} DCCG_AUDIO_DTO_USE_512FBR_DTO;
+typedef enum DCCG_DBG_EN {
+       DCCG_DBG_EN_DISABLE                              = 0x0,
+       DCCG_DBG_EN_ENABLE                               = 0x1,
+} DCCG_DBG_EN;
+typedef enum DCCG_DBG_BLOCK_SEL {
+       DCCG_DBG_BLOCK_SEL_DCCG                          = 0x0,
+       DCCG_DBG_BLOCK_SEL_PMON                          = 0x1,
+       DCCG_DBG_BLOCK_SEL_PMON2                         = 0x2,
+} DCCG_DBG_BLOCK_SEL;
+typedef enum DCCG_DBG_CLOCK_SEL {
+       DCCG_DBG_CLOCK_SEL_DISPCLK                       = 0x0,
+       DCCG_DBG_CLOCK_SEL_SCLK                          = 0x1,
+       DCCG_DBG_CLOCK_SEL_MVPCLK                        = 0x2,
+       DCCG_DBG_CLOCK_SEL_DVOCLK                        = 0x3,
+       DCCG_DBG_CLOCK_SEL_DACCLK                        = 0x4,
+       DCCG_DBG_CLOCK_SEL_REFCLK                        = 0x5,
+       DCCG_DBG_CLOCK_SEL_SYMCLKA                       = 0x6,
+       DCCG_DBG_CLOCK_SEL_SYMCLKB                       = 0x7,
+       DCCG_DBG_CLOCK_SEL_SYMCLKC                       = 0x8,
+       DCCG_DBG_CLOCK_SEL_SYMCLKD                       = 0x9,
+       DCCG_DBG_CLOCK_SEL_SYMCLKE                       = 0xa,
+       DCCG_DBG_CLOCK_SEL_SYMCLKG                       = 0xb,
+       DCCG_DBG_CLOCK_SEL_SYMCLKF                       = 0xc,
+       DCCG_DBG_CLOCK_SEL_RSRV                          = 0xd,
+       DCCG_DBG_CLOCK_SEL_AOMCLK0                       = 0xe,
+       DCCG_DBG_CLOCK_SEL_AOMCLK1                       = 0xf,
+       DCCG_DBG_CLOCK_SEL_AOMCLK2                       = 0x10,
+       DCCG_DBG_CLOCK_SEL_DPREFCLK                      = 0x11,
+       DCCG_DBG_CLOCK_SEL_UNB_DB_CLK                    = 0x12,
+       DCCG_DBG_CLOCK_SEL_DSICLK                        = 0x13,
+       DCCG_DBG_CLOCK_SEL_BYTECLK                       = 0x14,
+       DCCG_DBG_CLOCK_SEL_ESCCLK                        = 0x15,
+       DCCG_DBG_CLOCK_SEL_SYMCLKLPA                     = 0x16,
+       DCCG_DBG_CLOCK_SEL_SYMCLKLPB                     = 0x17,
+} DCCG_DBG_CLOCK_SEL;
+typedef enum DCCG_DBG_OUT_BLOCK_SEL {
+       DCCG_DBG_OUT_BLOCK_SEL_DCCG                      = 0x0,
+       DCCG_DBG_OUT_BLOCK_SEL_DCO                       = 0x1,
+       DCCG_DBG_OUT_BLOCK_SEL_DCIO                      = 0x2,
+       DCCG_DBG_OUT_BLOCK_SEL_DSI                       = 0x3,
+} DCCG_DBG_OUT_BLOCK_SEL;
+typedef enum DISPCLK_FREQ_RAMP_DONE {
+       DISPCLK_FREQ_RAMP_IN_PROGRESS                    = 0x0,
+       DISPCLK_FREQ_RAMP_COMPLETED                      = 0x1,
+} DISPCLK_FREQ_RAMP_DONE;
+typedef enum DCCG_FIFO_ERRDET_RESET {
+       DCCG_FIFO_ERRDET_RESET_NOOP                      = 0x0,
+       DCCG_FIFO_ERRDET_RESET_FORCE                     = 0x1,
+} DCCG_FIFO_ERRDET_RESET;
+typedef enum DCCG_FIFO_ERRDET_STATE {
+       DCCG_FIFO_ERRDET_STATE_DETECTION                 = 0x0,
+       DCCG_FIFO_ERRDET_STATE_CALIBRATION               = 0x1,
+} DCCG_FIFO_ERRDET_STATE;
+typedef enum DCCG_FIFO_ERRDET_OVR_EN {
+       DCCG_FIFO_ERRDET_OVR_DISABLE                     = 0x0,
+       DCCG_FIFO_ERRDET_OVR_ENABLE                      = 0x1,
+} DCCG_FIFO_ERRDET_OVR_EN;
+typedef enum DISPCLK_CHG_FWD_CORR_DISABLE {
+       DISPCLK_CHG_FWD_CORR_ENABLE_AT_BEGINNING         = 0x0,
+       DISPCLK_CHG_FWD_CORR_DISABLE_AT_BEGINNING        = 0x1,
+} DISPCLK_CHG_FWD_CORR_DISABLE;
+typedef enum DC_MEM_GLOBAL_PWR_REQ_DIS {
+       DC_MEM_GLOBAL_PWR_REQ_ENABLE                     = 0x0,
+       DC_MEM_GLOBAL_PWR_REQ_DISABLE                    = 0x1,
+} DC_MEM_GLOBAL_PWR_REQ_DIS;
+typedef enum DCCG_PERF_RUN {
+       DCCG_PERF_RUN_NOOP                               = 0x0,
+       DCCG_PERF_RUN_START                              = 0x1,
+} DCCG_PERF_RUN;
+typedef enum DCCG_PERF_MODE_VSYNC {
+       DCCG_PERF_MODE_VSYNC_NOOP                        = 0x0,
+       DCCG_PERF_MODE_VSYNC_START                       = 0x1,
+} DCCG_PERF_MODE_VSYNC;
+typedef enum DCCG_PERF_MODE_HSYNC {
+       DCCG_PERF_MODE_HSYNC_NOOP                        = 0x0,
+       DCCG_PERF_MODE_HSYNC_START                       = 0x1,
+} DCCG_PERF_MODE_HSYNC;
+typedef enum DCCG_PERF_CRTC_SELECT {
+       DCCG_PERF_SEL_CRTC0                              = 0x0,
+       DCCG_PERF_SEL_CRTC1                              = 0x1,
+       DCCG_PERF_SEL_CRTC2                              = 0x2,
+       DCCG_PERF_SEL_CRTC3                              = 0x3,
+       DCCG_PERF_SEL_CRTC4                              = 0x4,
+       DCCG_PERF_SEL_CRTC5                              = 0x5,
+} DCCG_PERF_CRTC_SELECT;
+typedef enum CLOCK_BRANCH_SOFT_RESET {
+       CLOCK_BRANCH_SOFT_RESET_NOOP                     = 0x0,
+       CLOCK_BRANCH_SOFT_RESET_FORCE                    = 0x1,
+} CLOCK_BRANCH_SOFT_RESET;
+typedef enum PLL_CFG_IF_SOFT_RESET {
+       PLL_CFG_IF_SOFT_RESET_NOOP                       = 0x0,
+       PLL_CFG_IF_SOFT_RESET_FORCE                      = 0x1,
+} PLL_CFG_IF_SOFT_RESET;
+typedef enum DVO_ENABLE_RST {
+       DVO_ENABLE_RST_DISABLE                           = 0x0,
+       DVO_ENABLE_RST_ENABLE                            = 0x1,
+} DVO_ENABLE_RST;
+typedef enum LptNumBanks {
+       LPT_NUM_BANKS_2BANK                              = 0x0,
+       LPT_NUM_BANKS_4BANK                              = 0x1,
+       LPT_NUM_BANKS_8BANK                              = 0x2,
+       LPT_NUM_BANKS_16BANK                             = 0x3,
+       LPT_NUM_BANKS_32BANK                             = 0x4,
+} LptNumBanks;
+typedef enum DCIO_DC_GENERICA_SEL {
+       DCIO_GENERICA_SEL_DACA_STEREOSYNC                = 0x0,
+       DCIO_GENERICA_SEL_STEREOSYNC                     = 0x1,
+       DCIO_GENERICA_SEL_DACA_PIXCLK                    = 0x2,
+       DCIO_GENERICA_SEL_DACB_PIXCLK                    = 0x3,
+       DCIO_GENERICA_SEL_DVOA_CTL3                      = 0x4,
+       DCIO_GENERICA_SEL_P1_PLLCLK                      = 0x5,
+       DCIO_GENERICA_SEL_P2_PLLCLK                      = 0x6,
+       DCIO_GENERICA_SEL_DVOA_STEREOSYNC                = 0x7,
+       DCIO_GENERICA_SEL_DACA_FIELD_NUMBER              = 0x8,
+       DCIO_GENERICA_SEL_DACB_FIELD_NUMBER              = 0x9,
+       DCIO_GENERICA_SEL_GENERICA_DCCG                  = 0xa,
+       DCIO_GENERICA_SEL_SYNCEN                         = 0xb,
+       DCIO_GENERICA_SEL_GENERICA_SCG                   = 0xc,
+       DCIO_GENERICA_SEL_RESERVED_VALUE13               = 0xd,
+       DCIO_GENERICA_SEL_RESERVED_VALUE14               = 0xe,
+       DCIO_GENERICA_SEL_RESERVED_VALUE15               = 0xf,
+       DCIO_GENERICA_SEL_GENERICA_DPRX                  = 0x10,
+       DCIO_GENERICA_SEL_GENERICB_DPRX                  = 0x11,
+} DCIO_DC_GENERICA_SEL;
+typedef enum DCIO_DC_GENERIC_UNIPHY_REFDIV_CLK_SEL {
+       DCIO_UNIPHYA_TEST_REFDIV_CLK                     = 0x0,
+       DCIO_UNIPHYB_TEST_REFDIV_CLK                     = 0x1,
+       DCIO_UNIPHYC_TEST_REFDIV_CLK                     = 0x2,
+       DCIO_UNIPHYD_TEST_REFDIV_CLK                     = 0x3,
+       DCIO_UNIPHYE_TEST_REFDIV_CLK                     = 0x4,
+       DCIO_UNIPHYF_TEST_REFDIV_CLK                     = 0x5,
+       DCIO_UNIPHYG_TEST_REFDIV_CLK                     = 0x6,
+       DCIO_UNIPHYLPA_TEST_REFDIV_CLK                   = 0x7,
+       DCIO_UNIPHYLPB_TEST_REFDIV_CLK                   = 0x8,
+} DCIO_DC_GENERIC_UNIPHY_REFDIV_CLK_SEL;
+typedef enum DCIO_DC_GENERIC_UNIPHY_FBDIV_CLK_SEL {
+       DCIO_UNIPHYA_FBDIV_CLK                           = 0x0,
+       DCIO_UNIPHYB_FBDIV_CLK                           = 0x1,
+       DCIO_UNIPHYC_FBDIV_CLK                           = 0x2,
+       DCIO_UNIPHYD_FBDIV_CLK                           = 0x3,
+       DCIO_UNIPHYE_FBDIV_CLK                           = 0x4,
+       DCIO_UNIPHYF_FBDIV_CLK                           = 0x5,
+       DCIO_UNIPHYG_FBDIV_CLK                           = 0x6,
+       DCIO_UNIPHYLPA_FBDIV_CLK                         = 0x7,
+       DCIO_UNIPHYLPB_FBDIV_CLK                         = 0x8,
+} DCIO_DC_GENERIC_UNIPHY_FBDIV_CLK_SEL;
+typedef enum DCIO_DC_GENERIC_UNIPHY_FBDIV_SSC_CLK_SEL {
+       DCIO_UNIPHYA_FBDIV_SSC_CLK                       = 0x0,
+       DCIO_UNIPHYB_FBDIV_SSC_CLK                       = 0x1,
+       DCIO_UNIPHYC_FBDIV_SSC_CLK                       = 0x2,
+       DCIO_UNIPHYD_FBDIV_SSC_CLK                       = 0x3,
+       DCIO_UNIPHYE_FBDIV_SSC_CLK                       = 0x4,
+       DCIO_UNIPHYF_FBDIV_SSC_CLK                       = 0x5,
+       DCIO_UNIPHYG_FBDIV_SSC_CLK                       = 0x6,
+       DCIO_UNIPHYLPA_FBDIV_SSC_CLK                     = 0x7,
+       DCIO_UNIPHYLPB_FBDIV_SSC_CLK                     = 0x8,
+} DCIO_DC_GENERIC_UNIPHY_FBDIV_SSC_CLK_SEL;
+typedef enum DCIO_DC_GENERIC_UNIPHY_FBDIV_CLK_DIV2_SEL {
+       DCIO_UNIPHYA_TEST_FBDIV_CLK_DIV2                 = 0x0,
+       DCIO_UNIPHYB_TEST_FBDIV_CLK_DIV2                 = 0x1,
+       DCIO_UNIPHYC_TEST_FBDIV_CLK_DIV2                 = 0x2,
+       DCIO_UNIPHYD_TEST_FBDIV_CLK_DIV2                 = 0x3,
+       DCIO_UNIPHYE_TEST_FBDIV_CLK_DIV2                 = 0x4,
+       DCIO_UNIPHYF_TEST_FBDIV_CLK_DIV2                 = 0x5,
+       DCIO_UNIPHYG_TEST_FBDIV_CLK_DIV2                 = 0x6,
+       DCIO_UNIPHYLPA_TEST_FBDIV_CLK_DIV2               = 0x7,
+       DCIO_UNIPHYLPB_TEST_FBDIV_CLK_DIV2               = 0x8,
+} DCIO_DC_GENERIC_UNIPHY_FBDIV_CLK_DIV2_SEL;
+typedef enum DCIO_DC_GENERICB_SEL {
+       DCIO_GENERICB_SEL_DACA_STEREOSYNC                = 0x0,
+       DCIO_GENERICB_SEL_STEREOSYNC                     = 0x1,
+       DCIO_GENERICB_SEL_DACA_PIXCLK                    = 0x2,
+       DCIO_GENERICB_SEL_DACB_PIXCLK                    = 0x3,
+       DCIO_GENERICB_SEL_DVOA_CTL3                      = 0x4,
+       DCIO_GENERICB_SEL_P1_PLLCLK                      = 0x5,
+       DCIO_GENERICB_SEL_P2_PLLCLK                      = 0x6,
+       DCIO_GENERICB_SEL_DVOA_STEREOSYNC                = 0x7,
+       DCIO_GENERICB_SEL_DACA_FIELD_NUMBER              = 0x8,
+       DCIO_GENERICB_SEL_DACB_FIELD_NUMBER              = 0x9,
+       DCIO_GENERICB_SEL_GENERICB_DCCG                  = 0xa,
+       DCIO_GENERICB_SEL_SYNCEN                         = 0xb,
+       DCIO_GENERICB_SEL_GENERICA_SCG                   = 0xc,
+       DCIO_GENERICB_SEL_RESERVED_VALUE13               = 0xd,
+       DCIO_GENERICB_SEL_RESERVED_VALUE14               = 0xe,
+       DCIO_GENERICB_SEL_RESERVED_VALUE15               = 0xf,
+} DCIO_DC_GENERICB_SEL;
+typedef enum DCIO_DC_PAD_EXTERN_SIG_SEL {
+       DCIO_DC_PAD_EXTERN_SIG_SEL_MVP                   = 0x0,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_VSYNCA                = 0x1,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_GENLK_CLK             = 0x2,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_GENLK_VSYNC           = 0x3,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_GENERICA              = 0x4,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_GENERICB              = 0x5,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_GENERICC              = 0x6,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_HPD1                  = 0x7,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_HPD2                  = 0x8,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_DDC1CLK               = 0x9,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_DDC1DATA              = 0xa,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_DDC2CLK               = 0xb,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_DDC2DATA              = 0xc,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_VHAD1                 = 0xd,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_VHAD0                 = 0xe,
+       DCIO_DC_PAD_EXTERN_SIG_SEL_VPHCTL                = 0xf,
+} DCIO_DC_PAD_EXTERN_SIG_SEL;
+typedef enum DCIO_DC_PAD_EXTERN_SIG_MVP_PIXEL_SRC_STATUS {
+       DCIO_MVP_PIXEL_SRC_STATUS_HSYNCA                 = 0x0,
+       DCIO_MVP_PIXEL_SRC_STATUS_HSYNCA_DUPLICATE       = 0x1,
+       DCIO_MVP_PIXEL_SRC_STATUS_CRTC                   = 0x2,
+       DCIO_MVP_PIXEL_SRC_STATUS_LB                     = 0x3,
+} DCIO_DC_PAD_EXTERN_SIG_MVP_PIXEL_SRC_STATUS;
+typedef enum DCIO_DC_REF_CLK_CNTL_HSYNCA_OUTPUT_SEL {
+       DCIO_HSYNCA_OUTPUT_SEL_DISABLE                   = 0x0,
+       DCIO_HSYNCA_OUTPUT_SEL_PPLL1                     = 0x1,
+       DCIO_HSYNCA_OUTPUT_SEL_PPLL2                     = 0x2,
+       DCIO_HSYNCA_OUTPUT_SEL_RESERVED                  = 0x3,
+} DCIO_DC_REF_CLK_CNTL_HSYNCA_OUTPUT_SEL;
+typedef enum DCIO_DC_REF_CLK_CNTL_GENLK_CLK_OUTPUT_SEL {
+       DCIO_GENLK_CLK_OUTPUT_SEL_DISABLE                = 0x0,
+       DCIO_GENLK_CLK_OUTPUT_SEL_PPLL1                  = 0x1,
+       DCIO_GENLK_CLK_OUTPUT_SEL_PPLL2                  = 0x2,
+       DCIO_GENLK_CLK_OUTPUT_SEL_RESERVED_VALUE3        = 0x3,
+} DCIO_DC_REF_CLK_CNTL_GENLK_CLK_OUTPUT_SEL;
+typedef enum DCIO_DC_GPIO_VIP_DEBUG {
+       DCIO_DC_GPIO_VIP_DEBUG_NORMAL                    = 0x0,
+       DCIO_DC_GPIO_VIP_DEBUG_CG_BIG                    = 0x1,
+} DCIO_DC_GPIO_VIP_DEBUG;
+typedef enum DCIO_DC_GPIO_MACRO_DEBUG {
+       DCIO_DC_GPIO_MACRO_DEBUG_NORMAL                  = 0x0,
+       DCIO_DC_GPIO_MACRO_DEBUG_CHIP_BIF                = 0x1,
+       DCIO_DC_GPIO_MACRO_DEBUG_RESERVED_VALUE2         = 0x2,
+       DCIO_DC_GPIO_MACRO_DEBUG_RESERVED_VALUE3         = 0x3,
+} DCIO_DC_GPIO_MACRO_DEBUG;
+typedef enum DCIO_DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL {
+       DCIO_DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL_NORMAL       = 0x0,
+       DCIO_DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL_SWAP         = 0x1,
+} DCIO_DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL;
+typedef enum DCIO_DC_GPIO_DEBUG_BUS_FLOP_EN {
+       DCIO_DC_GPIO_DEBUG_BUS_FLOP_EN_BYPASS            = 0x0,
+       DCIO_DC_GPIO_DEBUG_BUS_FLOP_EN_ENABLE            = 0x1,
+} DCIO_DC_GPIO_DEBUG_BUS_FLOP_EN;
+typedef enum DCIO_DC_GPIO_DEBUG_DPRX_LOOPBACK_ENABLE {
+       DCIO_DPRX_LOOPBACK_ENABLE_NORMAL                 = 0x0,
+       DCIO_DPRX_LOOPBACK_ENABLE_LOOP                   = 0x1,
+} DCIO_DC_GPIO_DEBUG_DPRX_LOOPBACK_ENABLE;
+typedef enum DCIO_UNIPHY_LINK_CNTL_MINIMUM_PIXVLD_LOW_DURATION {
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_3_CLOCKS = 0x0,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_7_CLOCKS = 0x1,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_11_CLOCKS= 0x2,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_15_CLOCKS= 0x3,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_19_CLOCKS= 0x4,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_23_CLOCKS= 0x5,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_27_CLOCKS= 0x6,
+       DCIO_UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_31_CLOCKS= 0x7,
+} DCIO_UNIPHY_LINK_CNTL_MINIMUM_PIXVLD_LOW_DURATION;
+typedef enum DCIO_UNIPHY_LINK_CNTL_CHANNEL_INVERT {
+       DCIO_UNIPHY_CHANNEL_NO_INVERSION                 = 0x0,
+       DCIO_UNIPHY_CHANNEL_INVERTED                     = 0x1,
+} DCIO_UNIPHY_LINK_CNTL_CHANNEL_INVERT;
+typedef enum DCIO_UNIPHY_LINK_CNTL_ENABLE_HPD_MASK {
+       DCIO_UNIPHY_LINK_ENABLE_HPD_MASK_DISALLOW        = 0x0,
+       DCIO_UNIPHY_LINK_ENABLE_HPD_MASK_ALLOW           = 0x1,
+       DCIO_UNIPHY_LINK_ENABLE_HPD_MASK_ALLOW_DEBOUNCED = 0x2,
+       DCIO_UNIPHY_LINK_ENABLE_HPD_MASK_ALLOW_TOGGLE_FILTERED= 0x3,
+} DCIO_UNIPHY_LINK_CNTL_ENABLE_HPD_MASK;
+typedef enum DCIO_UNIPHY_CHANNEL_XBAR_SOURCE {
+       DCIO_UNIPHY_CHANNEL_XBAR_SOURCE_CH0              = 0x0,
+       DCIO_UNIPHY_CHANNEL_XBAR_SOURCE_CH1              = 0x1,
+       DCIO_UNIPHY_CHANNEL_XBAR_SOURCE_CH2              = 0x2,
+       DCIO_UNIPHY_CHANNEL_XBAR_SOURCE_CH3              = 0x3,
+} DCIO_UNIPHY_CHANNEL_XBAR_SOURCE;
+typedef enum DCIO_DC_DVODATA_CONFIG_VIP_MUX_EN {
+       DCIO_VIP_MUX_EN_DVO                              = 0x0,
+       DCIO_VIP_MUX_EN_VIP                              = 0x1,
+} DCIO_DC_DVODATA_CONFIG_VIP_MUX_EN;
+typedef enum DCIO_DC_DVODATA_CONFIG_VIP_ALTER_MAPPING_EN {
+       DCIO_VIP_ALTER_MAPPING_EN_DEFAULT                = 0x0,
+       DCIO_VIP_ALTER_MAPPING_EN_ALTERNATIVE            = 0x1,
+} DCIO_DC_DVODATA_CONFIG_VIP_ALTER_MAPPING_EN;
+typedef enum DCIO_DC_DVODATA_CONFIG_DVO_ALTER_MAPPING_EN {
+       DCIO_DVO_ALTER_MAPPING_EN_DEFAULT                = 0x0,
+       DCIO_DVO_ALTER_MAPPING_EN_ALTERNATIVE            = 0x1,
+} DCIO_DC_DVODATA_CONFIG_DVO_ALTER_MAPPING_EN;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_DISABLE_SYNCEN_CONTROL_OF_TX_EN {
+       DCIO_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_ENABLE= 0x0,
+       DCIO_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_DISABLE= 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_DISABLE_SYNCEN_CONTROL_OF_TX_EN;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_TARGET_STATE {
+       DCIO_LVTMA_PWRSEQ_TARGET_STATE_LCD_OFF           = 0x0,
+       DCIO_LVTMA_PWRSEQ_TARGET_STATE_LCD_ON            = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_TARGET_STATE;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_SYNCEN_POL {
+       DCIO_LVTMA_SYNCEN_POL_NON_INVERT                 = 0x0,
+       DCIO_LVTMA_SYNCEN_POL_INVERT                     = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_SYNCEN_POL;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_DIGON {
+       DCIO_LVTMA_DIGON_OFF                             = 0x0,
+       DCIO_LVTMA_DIGON_ON                              = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_DIGON;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_DIGON_POL {
+       DCIO_LVTMA_DIGON_POL_NON_INVERT                  = 0x0,
+       DCIO_LVTMA_DIGON_POL_INVERT                      = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_DIGON_POL;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_BLON {
+       DCIO_LVTMA_BLON_OFF                              = 0x0,
+       DCIO_LVTMA_BLON_ON                               = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_BLON;
+typedef enum DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_BLON_POL {
+       DCIO_LVTMA_BLON_POL_NON_INVERT                   = 0x0,
+       DCIO_LVTMA_BLON_POL_INVERT                       = 0x1,
+} DCIO_LVTMA_PWRSEQ_CNTL_LVTMA_BLON_POL;
+typedef enum DCIO_LVTMA_PWRSEQ_DELAY2_LVTMA_VARY_BL_OVERRIDE_EN {
+       DCIO_LVTMA_VARY_BL_OVERRIDE_EN_BLON              = 0x0,
+       DCIO_LVTMA_VARY_BL_OVERRIDE_EN_SEPARATE          = 0x1,
+} DCIO_LVTMA_PWRSEQ_DELAY2_LVTMA_VARY_BL_OVERRIDE_EN;
+typedef enum DCIO_BL_PWM_CNTL_BL_PWM_FRACTIONAL_EN {
+       DCIO_BL_PWM_FRACTIONAL_DISABLE                   = 0x0,
+       DCIO_BL_PWM_FRACTIONAL_ENABLE                    = 0x1,
+} DCIO_BL_PWM_CNTL_BL_PWM_FRACTIONAL_EN;
+typedef enum DCIO_BL_PWM_CNTL_BL_PWM_EN {
+       DCIO_BL_PWM_DISABLE                              = 0x0,
+       DCIO_BL_PWM_ENABLE                               = 0x1,
+} DCIO_BL_PWM_CNTL_BL_PWM_EN;
+typedef enum DCIO_BL_PWM_CNTL2_DBG_BL_PWM_INPUT_REFCLK_SELECT {
+       DCIO_DBG_BL_PWM_INPUT_REFCLK_SELECT_NORMAL       = 0x0,
+       DCIO_DBG_BL_PWM_INPUT_REFCLK_SELECT_DEBUG1       = 0x1,
+       DCIO_DBG_BL_PWM_INPUT_REFCLK_SELECT_DEBUG2       = 0x2,
+       DCIO_DBG_BL_PWM_INPUT_REFCLK_SELECT_DEBUG3       = 0x3,
+} DCIO_BL_PWM_CNTL2_DBG_BL_PWM_INPUT_REFCLK_SELECT;
+typedef enum DCIO_BL_PWM_CNTL2_BL_PWM_OVERRIDE_BL_OUT_ENABLE {
+       DCIO_BL_PWM_OVERRIDE_BL_OUT_DISABLE              = 0x0,
+       DCIO_BL_PWM_OVERRIDE_BL_OUT_ENABLE               = 0x1,
+} DCIO_BL_PWM_CNTL2_BL_PWM_OVERRIDE_BL_OUT_ENABLE;
+typedef enum DCIO_BL_PWM_CNTL2_BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN {
+       DCIO_BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN_NORMAL      = 0x0,
+       DCIO_BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN_PWM         = 0x1,
+} DCIO_BL_PWM_CNTL2_BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN;
+typedef enum DCIO_BL_PWM_GRP1_REG_LOCK {
+       DCIO_BL_PWM_GRP1_REG_LOCK_DISABLE                = 0x0,
+       DCIO_BL_PWM_GRP1_REG_LOCK_ENABLE                 = 0x1,
+} DCIO_BL_PWM_GRP1_REG_LOCK;
+typedef enum DCIO_BL_PWM_GRP1_UPDATE_AT_FRAME_START {
+       DCIO_BL_PWM_GRP1_UPDATE_AT_FRAME_START_DISABLE   = 0x0,
+       DCIO_BL_PWM_GRP1_UPDATE_AT_FRAME_START_ENABLE    = 0x1,
+} DCIO_BL_PWM_GRP1_UPDATE_AT_FRAME_START;
+typedef enum DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL {
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER1= 0x0,
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER2= 0x1,
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER3= 0x2,
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER4= 0x3,
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER5= 0x4,
+       DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL_CONTROLLER6= 0x5,
+} DCIO_BL_PWM_GRP1_FRAME_START_DISP_SEL;
+typedef enum DCIO_BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN {
+       DCIO_BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN_BL_PWM = 0x0,
+       DCIO_BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN_BL1_PWM= 0x1,
+} DCIO_BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN;
+typedef enum DCIO_BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN {
+       DCIO_BL_PWM_GRP1_IGNORE_MASTER_LOCK_ENABLE       = 0x0,
+       DCIO_BL_PWM_GRP1_IGNORE_MASTER_LOCK_DISABLE      = 0x1,
+} DCIO_BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN;
+typedef enum DCIO_GSL_SEL {
+       DCIO_GSL_SEL_GROUP_0                             = 0x0,
+       DCIO_GSL_SEL_GROUP_1                             = 0x1,
+       DCIO_GSL_SEL_GROUP_2                             = 0x2,
+} DCIO_GSL_SEL;
+typedef enum DCIO_GENLK_CLK_GSL_MASK {
+       DCIO_GENLK_CLK_GSL_MASK_NO                       = 0x0,
+       DCIO_GENLK_CLK_GSL_MASK_TIMING                   = 0x1,
+       DCIO_GENLK_CLK_GSL_MASK_STEREO                   = 0x2,
+} DCIO_GENLK_CLK_GSL_MASK;
+typedef enum DCIO_GENLK_VSYNC_GSL_MASK {
+       DCIO_GENLK_VSYNC_GSL_MASK_NO                     = 0x0,
+       DCIO_GENLK_VSYNC_GSL_MASK_TIMING                 = 0x1,
+       DCIO_GENLK_VSYNC_GSL_MASK_STEREO                 = 0x2,
+} DCIO_GENLK_VSYNC_GSL_MASK;
+typedef enum DCIO_SWAPLOCK_A_GSL_MASK {
+       DCIO_SWAPLOCK_A_GSL_MASK_NO                      = 0x0,
+       DCIO_SWAPLOCK_A_GSL_MASK_TIMING                  = 0x1,
+       DCIO_SWAPLOCK_A_GSL_MASK_STEREO                  = 0x2,
+} DCIO_SWAPLOCK_A_GSL_MASK;
+typedef enum DCIO_SWAPLOCK_B_GSL_MASK {
+       DCIO_SWAPLOCK_B_GSL_MASK_NO                      = 0x0,
+       DCIO_SWAPLOCK_B_GSL_MASK_TIMING                  = 0x1,
+       DCIO_SWAPLOCK_B_GSL_MASK_STEREO                  = 0x2,
+} DCIO_SWAPLOCK_B_GSL_MASK;
+typedef enum DCIO_GSL_VSYNC_SEL {
+       DCIO_GSL_VSYNC_SEL_PIPE0                         = 0x0,
+       DCIO_GSL_VSYNC_SEL_PIPE1                         = 0x1,
+       DCIO_GSL_VSYNC_SEL_PIPE2                         = 0x2,
+       DCIO_GSL_VSYNC_SEL_PIPE3                         = 0x3,
+       DCIO_GSL_VSYNC_SEL_PIPE4                         = 0x4,
+       DCIO_GSL_VSYNC_SEL_PIPE5                         = 0x5,
+} DCIO_GSL_VSYNC_SEL;
+typedef enum DCIO_GSL0_TIMING_SYNC_SEL {
+       DCIO_GSL0_TIMING_SYNC_SEL_PIPE                   = 0x0,
+       DCIO_GSL0_TIMING_SYNC_SEL_GENCLK_VSYNC           = 0x1,
+       DCIO_GSL0_TIMING_SYNC_SEL_GENCLK_CLK             = 0x2,
+       DCIO_GSL0_TIMING_SYNC_SEL_SWAPLOCK_A             = 0x3,
+       DCIO_GSL0_TIMING_SYNC_SEL_SWAPLOCK_B             = 0x4,
+} DCIO_GSL0_TIMING_SYNC_SEL;
+typedef enum DCIO_GSL0_GLOBAL_UNLOCK_SEL {
+       DCIO_GSL0_GLOBAL_UNLOCK_SEL_INVERSION            = 0x0,
+       DCIO_GSL0_GLOBAL_UNLOCK_SEL_GENCLK_VSYNC         = 0x1,
+       DCIO_GSL0_GLOBAL_UNLOCK_SEL_GENLK_CLK            = 0x2,
+       DCIO_GSL0_GLOBAL_UNLOCK_SEL_SWAPLOCK_A           = 0x3,
+       DCIO_GSL0_GLOBAL_UNLOCK_SEL_SWAPLOCK_B           = 0x4,
+} DCIO_GSL0_GLOBAL_UNLOCK_SEL;
+typedef enum DCIO_GSL1_TIMING_SYNC_SEL {
+       DCIO_GSL1_TIMING_SYNC_SEL_PIPE                   = 0x0,
+       DCIO_GSL1_TIMING_SYNC_SEL_GENCLK_VSYNC           = 0x1,
+       DCIO_GSL1_TIMING_SYNC_SEL_GENCLK_CLK             = 0x2,
+       DCIO_GSL1_TIMING_SYNC_SEL_SWAPLOCK_A             = 0x3,
+       DCIO_GSL1_TIMING_SYNC_SEL_SWAPLOCK_B             = 0x4,
+} DCIO_GSL1_TIMING_SYNC_SEL;
+typedef enum DCIO_GSL1_GLOBAL_UNLOCK_SEL {
+       DCIO_GSL1_GLOBAL_UNLOCK_SEL_INVERSION            = 0x0,
+       DCIO_GSL1_GLOBAL_UNLOCK_SEL_GENCLK_VSYNC         = 0x1,
+       DCIO_GSL1_GLOBAL_UNLOCK_SEL_GENLK_CLK            = 0x2,
+       DCIO_GSL1_GLOBAL_UNLOCK_SEL_SWAPLOCK_A           = 0x3,
+       DCIO_GSL1_GLOBAL_UNLOCK_SEL_SWAPLOCK_B           = 0x4,
+} DCIO_GSL1_GLOBAL_UNLOCK_SEL;
+typedef enum DCIO_GSL2_TIMING_SYNC_SEL {
+       DCIO_GSL2_TIMING_SYNC_SEL_PIPE                   = 0x0,
+       DCIO_GSL2_TIMING_SYNC_SEL_GENCLK_VSYNC           = 0x1,
+       DCIO_GSL2_TIMING_SYNC_SEL_GENCLK_CLK             = 0x2,
+       DCIO_GSL2_TIMING_SYNC_SEL_SWAPLOCK_A             = 0x3,
+       DCIO_GSL2_TIMING_SYNC_SEL_SWAPLOCK_B             = 0x4,
+} DCIO_GSL2_TIMING_SYNC_SEL;
+typedef enum DCIO_GSL2_GLOBAL_UNLOCK_SEL {
+       DCIO_GSL2_GLOBAL_UNLOCK_SEL_INVERSION            = 0x0,
+       DCIO_GSL2_GLOBAL_UNLOCK_SEL_GENCLK_VSYNC         = 0x1,
+       DCIO_GSL2_GLOBAL_UNLOCK_SEL_GENLK_CLK            = 0x2,
+       DCIO_GSL2_GLOBAL_UNLOCK_SEL_SWAPLOCK_A           = 0x3,
+       DCIO_GSL2_GLOBAL_UNLOCK_SEL_SWAPLOCK_B           = 0x4,
+} DCIO_GSL2_GLOBAL_UNLOCK_SEL;
+typedef enum DCIO_DC_GPU_TIMER_START_POSITION {
+       DCIO_GPU_TIMER_START_0_END_27                    = 0x0,
+       DCIO_GPU_TIMER_START_1_END_28                    = 0x1,
+       DCIO_GPU_TIMER_START_2_END_29                    = 0x2,
+       DCIO_GPU_TIMER_START_3_END_30                    = 0x3,
+       DCIO_GPU_TIMER_START_4_END_31                    = 0x4,
+       DCIO_GPU_TIMER_START_6_END_33                    = 0x5,
+       DCIO_GPU_TIMER_START_8_END_35                    = 0x6,
+       DCIO_GPU_TIMER_START_10_END_37                   = 0x7,
+} DCIO_DC_GPU_TIMER_START_POSITION;
+typedef enum DCIO_CLOCK_CNTL_DCIO_TEST_CLK_SEL {
+       DCIO_TEST_CLK_SEL_DISPCLK                        = 0x0,
+       DCIO_TEST_CLK_SEL_GATED_DISPCLK                  = 0x1,
+       DCIO_TEST_CLK_SEL_SCLK                           = 0x2,
+} DCIO_CLOCK_CNTL_DCIO_TEST_CLK_SEL;
+typedef enum DCIO_CLOCK_CNTL_DISPCLK_R_DCIO_GATE_DIS {
+       DCIO_DISPCLK_R_DCIO_GATE_DISABLE                 = 0x0,
+       DCIO_DISPCLK_R_DCIO_GATE_ENABLE                  = 0x1,
+} DCIO_CLOCK_CNTL_DISPCLK_R_DCIO_GATE_DIS;
+typedef enum DCIO_DCO_DCFE_EXT_VSYNC_MUX {
+       DCIO_EXT_VSYNC_MUX_SWAPLOCKB                     = 0x0,
+       DCIO_EXT_VSYNC_MUX_CRTC0                         = 0x1,
+       DCIO_EXT_VSYNC_MUX_CRTC1                         = 0x2,
+       DCIO_EXT_VSYNC_MUX_CRTC2                         = 0x3,
+       DCIO_EXT_VSYNC_MUX_CRTC3                         = 0x4,
+       DCIO_EXT_VSYNC_MUX_CRTC4                         = 0x5,
+       DCIO_EXT_VSYNC_MUX_CRTC5                         = 0x6,
+       DCIO_EXT_VSYNC_MUX_GENERICB                      = 0x7,
+} DCIO_DCO_DCFE_EXT_VSYNC_MUX;
+typedef enum DCIO_DCO_EXT_VSYNC_MASK {
+       DCIO_EXT_VSYNC_MASK_NONE                         = 0x0,
+       DCIO_EXT_VSYNC_MASK_PIPE0                        = 0x1,
+       DCIO_EXT_VSYNC_MASK_PIPE1                        = 0x2,
+       DCIO_EXT_VSYNC_MASK_PIPE2                        = 0x3,
+       DCIO_EXT_VSYNC_MASK_PIPE3                        = 0x4,
+       DCIO_EXT_VSYNC_MASK_PIPE4                        = 0x5,
+       DCIO_EXT_VSYNC_MASK_PIPE5                        = 0x6,
+       DCIO_EXT_VSYNC_MASK_NONE_DUPLICATE               = 0x7,
+} DCIO_DCO_EXT_VSYNC_MASK;
+typedef enum DCIO_DBG_OUT_PIN_SEL {
+       DCIO_DBG_OUT_PIN_SEL_LOW_12BIT                   = 0x0,
+       DCIO_DBG_OUT_PIN_SEL_HIGH_12BIT                  = 0x1,
+} DCIO_DBG_OUT_PIN_SEL;
+typedef enum DCIO_DBG_OUT_12BIT_SEL {
+       DCIO_DBG_OUT_12BIT_SEL_LOW_12BIT                 = 0x0,
+       DCIO_DBG_OUT_12BIT_SEL_MID_12BIT                 = 0x1,
+       DCIO_DBG_OUT_12BIT_SEL_HIGH_12BIT                = 0x2,
+       DCIO_DBG_OUT_12BIT_SEL_OVERRIDE                  = 0x3,
+} DCIO_DBG_OUT_12BIT_SEL;
+typedef enum DCIO_DSYNC_SOFT_RESET {
+       DCIO_DSYNC_SOFT_RESET_DEASSERT                   = 0x0,
+       DCIO_DSYNC_SOFT_RESET_ASSERT                     = 0x1,
+} DCIO_DSYNC_SOFT_RESET;
+typedef enum DCIO_DACA_SOFT_RESET {
+       DCIO_DACA_SOFT_RESET_DEASSERT                    = 0x0,
+       DCIO_DACA_SOFT_RESET_ASSERT                      = 0x1,
+} DCIO_DACA_SOFT_RESET;
+typedef enum DCIO_DCRXPHY_SOFT_RESET {
+       DCIO_DCRXPHY_SOFT_RESET_DEASSERT                 = 0x0,
+       DCIO_DCRXPHY_SOFT_RESET_ASSERT                   = 0x1,
+} DCIO_DCRXPHY_SOFT_RESET;
+typedef enum DCIO_DPHY_LANE_SEL {
+       DCIO_DPHY_LANE_SEL_LANE0                         = 0x0,
+       DCIO_DPHY_LANE_SEL_LANE1                         = 0x1,
+       DCIO_DPHY_LANE_SEL_LANE2                         = 0x2,
+       DCIO_DPHY_LANE_SEL_LANE3                         = 0x3,
+} DCIO_DPHY_LANE_SEL;
+typedef enum DCIO_DPCS_INTERRUPT_TYPE {
+       DCIO_DPCS_INTERRUPT_TYPE_LEVEL_BASED             = 0x0,
+       DCIO_DPCS_INTERRUPT_TYPE_PULSE_BASED             = 0x1,
+} DCIO_DPCS_INTERRUPT_TYPE;
+typedef enum DCIO_DPCS_INTERRUPT_MASK {
+       DCIO_DPCS_INTERRUPT_DISABLE                      = 0x0,
+       DCIO_DPCS_INTERRUPT_ENABLE                       = 0x1,
+} DCIO_DPCS_INTERRUPT_MASK;
+typedef enum DCIO_DC_GPU_TIMER_READ_SELECT {
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D1_V_UPDATE     = 0x0,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D1_V_UPDATE     = 0x1,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D2_V_UPDATE     = 0x2,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D2_V_UPDATE     = 0x3,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D3_V_UPDATE     = 0x4,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D3_V_UPDATE     = 0x5,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D4_V_UPDATE     = 0x6,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D4_V_UPDATE     = 0x7,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D5_V_UPDATE     = 0x8,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D5_V_UPDATE     = 0x9,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D6_V_UPDATE     = 0xa,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D6_V_UPDATE     = 0xb,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D1_P_FLIP       = 0xc,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D1_P_FLIP       = 0xd,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D2_P_FLIP       = 0xe,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D2_P_FLIP       = 0xf,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D3_P_FLIP       = 0x10,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D3_P_FLIP       = 0x11,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D4_P_FLIP       = 0x12,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D4_P_FLIP       = 0x13,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D5_P_FLIP       = 0x14,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D5_P_FLIP       = 0x15,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D6_P_FLIP       = 0x16,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D6_P_FLIP       = 0x17,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D1_VSYNC_NOM    = 0x18,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D1_VSYNC_NOM    = 0x19,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D2_VSYNC_NOM    = 0x1a,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D2_VSYNC_NOM    = 0x1b,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D3_VSYNC_NOM    = 0x1c,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D3_VSYNC_NOM    = 0x1d,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D4_VSYNC_NOM    = 0x1e,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D4_VSYNC_NOM    = 0x1f,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D5_VSYNC_NOM    = 0x20,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D5_VSYNC_NOM    = 0x21,
+       DCIO_GPU_TIMER_READ_SELECT_LOWER_D6_VSYNC_NOM    = 0x22,
+       DCIO_GPU_TIMER_READ_SELECT_UPPER_D6_VSYNC_NOM    = 0x23,
+} DCIO_DC_GPU_TIMER_READ_SELECT;
+typedef enum DCIO_IMPCAL_STEP_DELAY {
+       DCIO_IMPCAL_STEP_DELAY_1us                       = 0x0,
+       DCIO_IMPCAL_STEP_DELAY_2us                       = 0x1,
+       DCIO_IMPCAL_STEP_DELAY_3us                       = 0x2,
+       DCIO_IMPCAL_STEP_DELAY_4us                       = 0x3,
+       DCIO_IMPCAL_STEP_DELAY_5us                       = 0x4,
+       DCIO_IMPCAL_STEP_DELAY_6us                       = 0x5,
+       DCIO_IMPCAL_STEP_DELAY_7us                       = 0x6,
+       DCIO_IMPCAL_STEP_DELAY_8us                       = 0x7,
+       DCIO_IMPCAL_STEP_DELAY_9us                       = 0x8,
+       DCIO_IMPCAL_STEP_DELAY_10us                      = 0x9,
+       DCIO_IMPCAL_STEP_DELAY_11us                      = 0xa,
+       DCIO_IMPCAL_STEP_DELAY_12us                      = 0xb,
+       DCIO_IMPCAL_STEP_DELAY_13us                      = 0xc,
+       DCIO_IMPCAL_STEP_DELAY_14us                      = 0xd,
+       DCIO_IMPCAL_STEP_DELAY_15us                      = 0xe,
+       DCIO_IMPCAL_STEP_DELAY_16us                      = 0xf,
+} DCIO_IMPCAL_STEP_DELAY;
+typedef enum DCIO_UNIPHY_IMPCAL_SEL {
+       DCIO_UNIPHY_IMPCAL_SEL_TEMPERATURE               = 0x0,
+       DCIO_UNIPHY_IMPCAL_SEL_BINARY                    = 0x1,
+} DCIO_UNIPHY_IMPCAL_SEL;
+typedef enum DCIO_DBG_CLOCK_SEL {
+       DCIO_DBG_CLOCK_SEL_DISPCLK                       = 0x0,
+       DCIO_DBG_CLOCK_SEL_SYMCLKA                       = 0x1,
+       DCIO_DBG_CLOCK_SEL_SYMCLKB                       = 0x2,
+       DCIO_DBG_CLOCK_SEL_SYMCLKC                       = 0x3,
+       DCIO_DBG_CLOCK_SEL_SYMCLKD                       = 0x4,
+       DCIO_DBG_CLOCK_SEL_SYMCLKE                       = 0x5,
+       DCIO_DBG_CLOCK_SEL_SYMCLKF                       = 0x6,
+       DCIO_DBG_CLOCK_SEL_REFCLK                        = 0xb,
+} DCIO_DBG_CLOCK_SEL;
+typedef enum DCIOCHIP_HPD_SEL {
+       DCIOCHIP_HPD_SEL_ASYNC                           = 0x0,
+       DCIOCHIP_HPD_SEL_CLOCKED                         = 0x1,
+} DCIOCHIP_HPD_SEL;
+typedef enum DCIOCHIP_PAD_MODE {
+       DCIOCHIP_PAD_MODE_DDC                            = 0x0,
+       DCIOCHIP_PAD_MODE_DP                             = 0x1,
+} DCIOCHIP_PAD_MODE;
+typedef enum DCIOCHIP_AUXSLAVE_PAD_MODE {
+       DCIOCHIP_AUXSLAVE_PAD_MODE_I2C                   = 0x0,
+       DCIOCHIP_AUXSLAVE_PAD_MODE_AUX                   = 0x1,
+} DCIOCHIP_AUXSLAVE_PAD_MODE;
+typedef enum DCIOCHIP_INVERT {
+       DCIOCHIP_POL_NON_INVERT                          = 0x0,
+       DCIOCHIP_POL_INVERT                              = 0x1,
+} DCIOCHIP_INVERT;
+typedef enum DCIOCHIP_PD_EN {
+       DCIOCHIP_PD_EN_NOTALLOW                          = 0x0,
+       DCIOCHIP_PD_EN_ALLOW                             = 0x1,
+} DCIOCHIP_PD_EN;
+typedef enum DCIOCHIP_GPIO_MASK_EN {
+       DCIOCHIP_GPIO_MASK_EN_HARDWARE                   = 0x0,
+       DCIOCHIP_GPIO_MASK_EN_SOFTWARE                   = 0x1,
+} DCIOCHIP_GPIO_MASK_EN;
+typedef enum DCIOCHIP_MASK {
+       DCIOCHIP_MASK_DISABLE                            = 0x0,
+       DCIOCHIP_MASK_ENABLE                             = 0x1,
+} DCIOCHIP_MASK;
+typedef enum DCIOCHIP_GPIO_I2C_MASK {
+       DCIOCHIP_GPIO_I2C_MASK_DISABLE                   = 0x0,
+       DCIOCHIP_GPIO_I2C_MASK_ENABLE                    = 0x1,
+} DCIOCHIP_GPIO_I2C_MASK;
+typedef enum DCIOCHIP_GPIO_I2C_DRIVE {
+       DCIOCHIP_GPIO_I2C_DRIVE_LOW                      = 0x0,
+       DCIOCHIP_GPIO_I2C_DRIVE_HIGH                     = 0x1,
+} DCIOCHIP_GPIO_I2C_DRIVE;
+typedef enum DCIOCHIP_GPIO_I2C_EN {
+       DCIOCHIP_GPIO_I2C_DISABLE                        = 0x0,
+       DCIOCHIP_GPIO_I2C_ENABLE                         = 0x1,
+} DCIOCHIP_GPIO_I2C_EN;
+typedef enum DCIOCHIP_MASK_4BIT {
+       DCIOCHIP_MASK_4BIT_DISABLE                       = 0x0,
+       DCIOCHIP_MASK_4BIT_ENABLE                        = 0xf,
+} DCIOCHIP_MASK_4BIT;
+typedef enum DCIOCHIP_ENABLE_4BIT {
+       DCIOCHIP_4BIT_DISABLE                            = 0x0,
+       DCIOCHIP_4BIT_ENABLE                             = 0xf,
+} DCIOCHIP_ENABLE_4BIT;
+typedef enum DCIOCHIP_MASK_5BIT {
+       DCIOCHIP_MASIK_5BIT_DISABLE                      = 0x0,
+       DCIOCHIP_MASIK_5BIT_ENABLE                       = 0x1f,
+} DCIOCHIP_MASK_5BIT;
+typedef enum DCIOCHIP_ENABLE_5BIT {
+       DCIOCHIP_5BIT_DISABLE                            = 0x0,
+       DCIOCHIP_5BIT_ENABLE                             = 0x1f,
+} DCIOCHIP_ENABLE_5BIT;
+typedef enum DCIOCHIP_MASK_2BIT {
+       DCIOCHIP_MASK_2BIT_DISABLE                       = 0x0,
+       DCIOCHIP_MASK_2BIT_ENABLE                        = 0x3,
+} DCIOCHIP_MASK_2BIT;
+typedef enum DCIOCHIP_ENABLE_2BIT {
+       DCIOCHIP_2BIT_DISABLE                            = 0x0,
+       DCIOCHIP_2BIT_ENABLE                             = 0x3,
+} DCIOCHIP_ENABLE_2BIT;
+typedef enum DCIOCHIP_REF_27_SRC_SEL {
+       DCIOCHIP_REF_27_SRC_SEL_XTAL_DIVIDER             = 0x0,
+       DCIOCHIP_REF_27_SRC_SEL_DISP_CLKIN2_DIVIDER      = 0x1,
+       DCIOCHIP_REF_27_SRC_SEL_XTAL_BYPASS              = 0x2,
+       DCIOCHIP_REF_27_SRC_SEL_DISP_CLKIN2_BYPASS       = 0x3,
+} DCIOCHIP_REF_27_SRC_SEL;
+typedef enum DCIOCHIP_DVO_VREFPON {
+       DCIOCHIP_DVO_VREFPON_DISABLE                     = 0x0,
+       DCIOCHIP_DVO_VREFPON_ENABLE                      = 0x1,
+} DCIOCHIP_DVO_VREFPON;
+typedef enum DCIOCHIP_DVO_VREFSEL {
+       DCIOCHIP_DVO_VREFSEL_ONCHIP                      = 0x0,
+       DCIOCHIP_DVO_VREFSEL_EXTERNAL                    = 0x1,
+} DCIOCHIP_DVO_VREFSEL;
+typedef enum DCIOCHIP_SPDIF1_IMODE {
+       DCIOCHIP_SPDIF1_IMODE_OE_A                       = 0x0,
+       DCIOCHIP_SPDIF1_IMODE_TSTE_TSTO                  = 0x1,
+} DCIOCHIP_SPDIF1_IMODE;
+typedef enum DCIOCHIP_AUX_FALLSLEWSEL {
+       DCIOCHIP_AUX_FALLSLEWSEL_LOW                     = 0x0,
+       DCIOCHIP_AUX_FALLSLEWSEL_HIGH0                   = 0x1,
+       DCIOCHIP_AUX_FALLSLEWSEL_HIGH1                   = 0x2,
+       DCIOCHIP_AUX_FALLSLEWSEL_ULTRAHIGH               = 0x3,
+} DCIOCHIP_AUX_FALLSLEWSEL;
+typedef enum DCIOCHIP_AUX_SPIKESEL {
+       DCIOCHIP_AUX_SPIKESEL_50NS                       = 0x0,
+       DCIOCHIP_AUX_SPIKESEL_10NS                       = 0x1,
+} DCIOCHIP_AUX_SPIKESEL;
+typedef enum DCIOCHIP_AUX_CSEL0P9 {
+       DCIOCHIP_AUX_CSEL_DEC1P0                         = 0x0,
+       DCIOCHIP_AUX_CSEL_DEC0P9                         = 0x1,
+} DCIOCHIP_AUX_CSEL0P9;
+typedef enum DCIOCHIP_AUX_CSEL1P1 {
+       DCIOCHIP_AUX_CSEL_INC1P0                         = 0x0,
+       DCIOCHIP_AUX_CSEL_INC1P1                         = 0x1,
+} DCIOCHIP_AUX_CSEL1P1;
+typedef enum DCIOCHIP_AUX_RSEL0P9 {
+       DCIOCHIP_AUX_RSEL_DEC1P0                         = 0x0,
+       DCIOCHIP_AUX_RSEL_DEC0P9                         = 0x1,
+} DCIOCHIP_AUX_RSEL0P9;
+typedef enum DCIOCHIP_AUX_RSEL1P1 {
+       DCIOCHIP_AUX_RSEL_INC1P0                         = 0x0,
+       DCIOCHIP_AUX_RSEL_INC1P1                         = 0x1,
+} DCIOCHIP_AUX_RSEL1P1;
+typedef enum DCP_GRPH_ENABLE {
+       DCP_GRPH_ENABLE_FALSE                            = 0x0,
+       DCP_GRPH_ENABLE_TRUE                             = 0x1,
+} DCP_GRPH_ENABLE;
+typedef enum DCP_GRPH_KEYER_ALPHA_SEL {
+       DCP_GRPH_KEYER_ALPHA_SEL_FALSE                   = 0x0,
+       DCP_GRPH_KEYER_ALPHA_SEL_TRUE                    = 0x1,
+} DCP_GRPH_KEYER_ALPHA_SEL;
+typedef enum DCP_GRPH_DEPTH {
+       DCP_GRPH_DEPTH_8BPP                              = 0x0,
+       DCP_GRPH_DEPTH_16BPP                             = 0x1,
+       DCP_GRPH_DEPTH_32BPP                             = 0x2,
+       DCP_GRPH_DEPTH_64BPP                             = 0x3,
+} DCP_GRPH_DEPTH;
+typedef enum DCP_GRPH_NUM_BANKS {
+       DCP_GRPH_NUM_BANKS_2BANK                         = 0x0,
+       DCP_GRPH_NUM_BANKS_4BANK                         = 0x1,
+       DCP_GRPH_NUM_BANKS_8BANK                         = 0x2,
+       DCP_GRPH_NUM_BANKS_16BANK                        = 0x3,
+} DCP_GRPH_NUM_BANKS;
+typedef enum DCP_GRPH_BANK_WIDTH {
+       DCP_GRPH_BANK_WIDTH_1                            = 0x0,
+       DCP_GRPH_BANK_WIDTH_2                            = 0x1,
+       DCP_GRPH_BANK_WIDTH_4                            = 0x2,
+       DCP_GRPH_BANK_WIDTH_8                            = 0x3,
+} DCP_GRPH_BANK_WIDTH;
+typedef enum DCP_GRPH_FORMAT {
+       DCP_GRPH_FORMAT_8BPP                             = 0x0,
+       DCP_GRPH_FORMAT_16BPP                            = 0x1,
+       DCP_GRPH_FORMAT_32BPP                            = 0x2,
+       DCP_GRPH_FORMAT_64BPP                            = 0x3,
+} DCP_GRPH_FORMAT;
+typedef enum DCP_GRPH_BANK_HEIGHT {
+       DCP_GRPH_BANK_HEIGHT_1                           = 0x0,
+       DCP_GRPH_BANK_HEIGHT_2                           = 0x1,
+       DCP_GRPH_BANK_HEIGHT_4                           = 0x2,
+       DCP_GRPH_BANK_HEIGHT_8                           = 0x3,
+} DCP_GRPH_BANK_HEIGHT;
+typedef enum DCP_GRPH_TILE_SPLIT {
+       DCP_GRPH_TILE_SPLIT_64B                          = 0x0,
+       DCP_GRPH_TILE_SPLIT_128B                         = 0x1,
+       DCP_GRPH_TILE_SPLIT_256B                         = 0x2,
+       DCP_GRPH_TILE_SPLIT_512B                         = 0x3,
+       DCP_GRPH_TILE_SPLIT_1B                           = 0x4,
+       DCP_GRPH_TILE_SPLIT_2B                           = 0x5,
+       DCP_GRPH_TILE_SPLIT_4B                           = 0x6,
+} DCP_GRPH_TILE_SPLIT;
+typedef enum DCP_GRPH_ADDRESS_TRANSLATION_ENABLE {
+       DCP_GRPH_ADDRESS_TRANSLATION_ENABLE_FALSE        = 0x0,
+       DCP_GRPH_ADDRESS_TRANSLATION_ENABLE_TRUE         = 0x1,
+} DCP_GRPH_ADDRESS_TRANSLATION_ENABLE;
+typedef enum DCP_GRPH_PRIVILEGED_ACCESS_ENABLE {
+       DCP_GRPH_PRIVILEGED_ACCESS_ENABLE_FALSE          = 0x0,
+       DCP_GRPH_PRIVILEGED_ACCESS_ENABLE_TRUE           = 0x1,
+} DCP_GRPH_PRIVILEGED_ACCESS_ENABLE;
+typedef enum DCP_GRPH_MACRO_TILE_ASPECT {
+       DCP_GRPH_MACRO_TILE_ASPECT_1                     = 0x0,
+       DCP_GRPH_MACRO_TILE_ASPECT_2                     = 0x1,
+       DCP_GRPH_MACRO_TILE_ASPECT_4                     = 0x2,
+       DCP_GRPH_MACRO_TILE_ASPECT_8                     = 0x3,
+} DCP_GRPH_MACRO_TILE_ASPECT;
+typedef enum DCP_GRPH_ARRAY_MODE {
+       DCP_GRPH_ARRAY_MODE_0                            = 0x0,
+       DCP_GRPH_ARRAY_MODE_1                            = 0x1,
+       DCP_GRPH_ARRAY_MODE_2                            = 0x2,
+       DCP_GRPH_ARRAY_MODE_3                            = 0x3,
+       DCP_GRPH_ARRAY_MODE_4                            = 0x4,
+       DCP_GRPH_ARRAY_MODE_7                            = 0x7,
+       DCP_GRPH_ARRAY_MODE_12                           = 0xc,
+       DCP_GRPH_ARRAY_MODE_13                           = 0xd,
+} DCP_GRPH_ARRAY_MODE;
+typedef enum DCP_GRPH_MICRO_TILE_MODE {
+       DCP_GRPH_MICRO_TILE_MODE_0                       = 0x0,
+       DCP_GRPH_MICRO_TILE_MODE_1                       = 0x1,
+       DCP_GRPH_MICRO_TILE_MODE_2                       = 0x2,
+       DCP_GRPH_MICRO_TILE_MODE_3                       = 0x3,
+} DCP_GRPH_MICRO_TILE_MODE;
+typedef enum DCP_GRPH_COLOR_EXPANSION_MODE {
+       DCP_GRPH_COLOR_EXPANSION_MODE_DEXP               = 0x0,
+       DCP_GRPH_COLOR_EXPANSION_MODE_ZEXP               = 0x1,
+} DCP_GRPH_COLOR_EXPANSION_MODE;
+typedef enum DCP_GRPH_LUT_10BIT_BYPASS_EN {
+       DCP_GRPH_LUT_10BIT_BYPASS_EN_FALSE               = 0x0,
+       DCP_GRPH_LUT_10BIT_BYPASS_EN_TRUE                = 0x1,
+} DCP_GRPH_LUT_10BIT_BYPASS_EN;
+typedef enum DCP_GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN {
+       DCP_GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN_FALSE       = 0x0,
+       DCP_GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN_TRUE        = 0x1,
+} DCP_GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN;
+typedef enum DCP_GRPH_ENDIAN_SWAP {
+       DCP_GRPH_ENDIAN_SWAP_NONE                        = 0x0,
+       DCP_GRPH_ENDIAN_SWAP_8IN16                       = 0x1,
+       DCP_GRPH_ENDIAN_SWAP_8IN32                       = 0x2,
+       DCP_GRPH_ENDIAN_SWAP_8IN64                       = 0x3,
+} DCP_GRPH_ENDIAN_SWAP;
+typedef enum DCP_GRPH_RED_CROSSBAR {
+       DCP_GRPH_RED_CROSSBAR_FROM_R                     = 0x0,
+       DCP_GRPH_RED_CROSSBAR_FROM_G                     = 0x1,
+       DCP_GRPH_RED_CROSSBAR_FROM_B                     = 0x2,
+       DCP_GRPH_RED_CROSSBAR_FROM_A                     = 0x3,
+} DCP_GRPH_RED_CROSSBAR;
+typedef enum DCP_GRPH_GREEN_CROSSBAR {
+       DCP_GRPH_GREEN_CROSSBAR_FROM_G                   = 0x0,
+       DCP_GRPH_GREEN_CROSSBAR_FROM_B                   = 0x1,
+       DCP_GRPH_GREEN_CROSSBAR_FROM_A                   = 0x2,
+       DCP_GRPH_GREEN_CROSSBAR_FROM_R                   = 0x3,
+} DCP_GRPH_GREEN_CROSSBAR;
+typedef enum DCP_GRPH_BLUE_CROSSBAR {
+       DCP_GRPH_BLUE_CROSSBAR_FROM_B                    = 0x0,
+       DCP_GRPH_BLUE_CROSSBAR_FROM_A                    = 0x1,
+       DCP_GRPH_BLUE_CROSSBAR_FROM_R                    = 0x2,
+       DCP_GRPH_BLUE_CROSSBAR_FROM_G                    = 0x3,
+} DCP_GRPH_BLUE_CROSSBAR;
+typedef enum DCP_GRPH_ALPHA_CROSSBAR {
+       DCP_GRPH_ALPHA_CROSSBAR_FROM_A                   = 0x0,
+       DCP_GRPH_ALPHA_CROSSBAR_FROM_R                   = 0x1,
+       DCP_GRPH_ALPHA_CROSSBAR_FROM_G                   = 0x2,
+       DCP_GRPH_ALPHA_CROSSBAR_FROM_B                   = 0x3,
+} DCP_GRPH_ALPHA_CROSSBAR;
+typedef enum DCP_GRPH_PRIMARY_DFQ_ENABLE {
+       DCP_GRPH_PRIMARY_DFQ_ENABLE_FALSE                = 0x0,
+       DCP_GRPH_PRIMARY_DFQ_ENABLE_TRUE                 = 0x1,
+} DCP_GRPH_PRIMARY_DFQ_ENABLE;
+typedef enum DCP_GRPH_SECONDARY_DFQ_ENABLE {
+       DCP_GRPH_SECONDARY_DFQ_ENABLE_FALSE              = 0x0,
+       DCP_GRPH_SECONDARY_DFQ_ENABLE_TRUE               = 0x1,
+} DCP_GRPH_SECONDARY_DFQ_ENABLE;
+typedef enum DCP_GRPH_INPUT_GAMMA_MODE {
+       DCP_GRPH_INPUT_GAMMA_MODE_LUT                    = 0x0,
+       DCP_GRPH_INPUT_GAMMA_MODE_BYPASS                 = 0x1,
+} DCP_GRPH_INPUT_GAMMA_MODE;
+typedef enum DCP_GRPH_MODE_UPDATE_PENDING {
+       DCP_GRPH_MODE_UPDATE_PENDING_FALSE               = 0x0,
+       DCP_GRPH_MODE_UPDATE_PENDING_TRUE                = 0x1,
+} DCP_GRPH_MODE_UPDATE_PENDING;
+typedef enum DCP_GRPH_MODE_UPDATE_TAKEN {
+       DCP_GRPH_MODE_UPDATE_TAKEN_FALSE                 = 0x0,
+       DCP_GRPH_MODE_UPDATE_TAKEN_TRUE                  = 0x1,
+} DCP_GRPH_MODE_UPDATE_TAKEN;
+typedef enum DCP_GRPH_SURFACE_UPDATE_PENDING {
+       DCP_GRPH_SURFACE_UPDATE_PENDING_FALSE            = 0x0,
+       DCP_GRPH_SURFACE_UPDATE_PENDING_TRUE             = 0x1,
+} DCP_GRPH_SURFACE_UPDATE_PENDING;
+typedef enum DCP_GRPH_SURFACE_UPDATE_TAKEN {
+       DCP_GRPH_SURFACE_UPDATE_TAKEN_FALSE              = 0x0,
+       DCP_GRPH_SURFACE_UPDATE_TAKEN_TRUE               = 0x1,
+} DCP_GRPH_SURFACE_UPDATE_TAKEN;
+typedef enum DCP_GRPH_SURFACE_XDMA_PENDING_ENABLE {
+       DCP_GRPH_SURFACE_XDMA_PENDING_ENABLE_FALSE       = 0x0,
+       DCP_GRPH_SURFACE_XDMA_PENDING_ENABLE_TRUE        = 0x1,
+} DCP_GRPH_SURFACE_XDMA_PENDING_ENABLE;
+typedef enum DCP_GRPH_UPDATE_LOCK {
+       DCP_GRPH_UPDATE_LOCK_FALSE                       = 0x0,
+       DCP_GRPH_UPDATE_LOCK_TRUE                        = 0x1,
+} DCP_GRPH_UPDATE_LOCK;
+typedef enum DCP_GRPH_SURFACE_IGNORE_UPDATE_LOCK {
+       DCP_GRPH_SURFACE_IGNORE_UPDATE_LOCK_FALSE        = 0x0,
+       DCP_GRPH_SURFACE_IGNORE_UPDATE_LOCK_TRUE         = 0x1,
+} DCP_GRPH_SURFACE_IGNORE_UPDATE_LOCK;
+typedef enum DCP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE {
+       DCP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE_FALSE      = 0x0,
+       DCP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE_TRUE       = 0x1,
+} DCP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE;
+typedef enum DCP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE {
+       DCP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_FALSE   = 0x0,
+       DCP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_TRUE    = 0x1,
+} DCP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE;
+typedef enum DCP_GRPH_SURFACE_UPDATE_H_RETRACE_EN {
+       DCP_GRPH_SURFACE_UPDATE_H_RETRACE_EN_FALSE       = 0x0,
+       DCP_GRPH_SURFACE_UPDATE_H_RETRACE_EN_TRUE        = 0x1,
+} DCP_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
+typedef enum DCP_GRPH_XDMA_SUPER_AA_EN {
+       DCP_GRPH_XDMA_SUPER_AA_EN_FALSE                  = 0x0,
+       DCP_GRPH_XDMA_SUPER_AA_EN_TRUE                   = 0x1,
+} DCP_GRPH_XDMA_SUPER_AA_EN;
+typedef enum DCP_GRPH_DFQ_RESET {
+       DCP_GRPH_DFQ_RESET_FALSE                         = 0x0,
+       DCP_GRPH_DFQ_RESET_TRUE                          = 0x1,
+} DCP_GRPH_DFQ_RESET;
+typedef enum DCP_GRPH_DFQ_SIZE {
+       DCP_GRPH_DFQ_SIZE_DEEP1                          = 0x0,
+       DCP_GRPH_DFQ_SIZE_DEEP2                          = 0x1,
+       DCP_GRPH_DFQ_SIZE_DEEP3                          = 0x2,
+       DCP_GRPH_DFQ_SIZE_DEEP4                          = 0x3,
+       DCP_GRPH_DFQ_SIZE_DEEP5                          = 0x4,
+       DCP_GRPH_DFQ_SIZE_DEEP6                          = 0x5,
+       DCP_GRPH_DFQ_SIZE_DEEP7                          = 0x6,
+       DCP_GRPH_DFQ_SIZE_DEEP8                          = 0x7,
+} DCP_GRPH_DFQ_SIZE;
+typedef enum DCP_GRPH_DFQ_MIN_FREE_ENTRIES {
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_1                  = 0x0,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_2                  = 0x1,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_3                  = 0x2,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_4                  = 0x3,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_5                  = 0x4,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_6                  = 0x5,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_7                  = 0x6,
+       DCP_GRPH_DFQ_MIN_FREE_ENTRIES_8                  = 0x7,
+} DCP_GRPH_DFQ_MIN_FREE_ENTRIES;
+typedef enum DCP_GRPH_DFQ_RESET_ACK {
+       DCP_GRPH_DFQ_RESET_ACK_FALSE                     = 0x0,
+       DCP_GRPH_DFQ_RESET_ACK_TRUE                      = 0x1,
+} DCP_GRPH_DFQ_RESET_ACK;
+typedef enum DCP_GRPH_PFLIP_INT_CLEAR {
+       DCP_GRPH_PFLIP_INT_CLEAR_FALSE                   = 0x0,
+       DCP_GRPH_PFLIP_INT_CLEAR_TRUE                    = 0x1,
+} DCP_GRPH_PFLIP_INT_CLEAR;
+typedef enum DCP_GRPH_PFLIP_INT_MASK {
+       DCP_GRPH_PFLIP_INT_MASK_FALSE                    = 0x0,
+       DCP_GRPH_PFLIP_INT_MASK_TRUE                     = 0x1,
+} DCP_GRPH_PFLIP_INT_MASK;
+typedef enum DCP_GRPH_PFLIP_INT_TYPE {
+       DCP_GRPH_PFLIP_INT_TYPE_LEGACY_LEVEL             = 0x0,
+       DCP_GRPH_PFLIP_INT_TYPE_PULSE                    = 0x1,
+} DCP_GRPH_PFLIP_INT_TYPE;
+typedef enum DCP_GRPH_PRESCALE_SELECT {
+       DCP_GRPH_PRESCALE_SELECT_FIXED                   = 0x0,
+       DCP_GRPH_PRESCALE_SELECT_FLOATING                = 0x1,
+} DCP_GRPH_PRESCALE_SELECT;
+typedef enum DCP_GRPH_PRESCALE_R_SIGN {
+       DCP_GRPH_PRESCALE_R_SIGN_UNSIGNED                = 0x0,
+       DCP_GRPH_PRESCALE_R_SIGN_SIGNED                  = 0x1,
+} DCP_GRPH_PRESCALE_R_SIGN;
+typedef enum DCP_GRPH_PRESCALE_G_SIGN {
+       DCP_GRPH_PRESCALE_G_SIGN_UNSIGNED                = 0x0,
+       DCP_GRPH_PRESCALE_G_SIGN_SIGNED                  = 0x1,
+} DCP_GRPH_PRESCALE_G_SIGN;
+typedef enum DCP_GRPH_PRESCALE_B_SIGN {
+       DCP_GRPH_PRESCALE_B_SIGN_UNSIGNED                = 0x0,
+       DCP_GRPH_PRESCALE_B_SIGN_SIGNED                  = 0x1,
+} DCP_GRPH_PRESCALE_B_SIGN;
+typedef enum DCP_GRPH_PRESCALE_BYPASS {
+       DCP_GRPH_PRESCALE_BYPASS_FALSE                   = 0x0,
+       DCP_GRPH_PRESCALE_BYPASS_TRUE                    = 0x1,
+} DCP_GRPH_PRESCALE_BYPASS;
+typedef enum DCP_INPUT_CSC_GRPH_MODE {
+       DCP_INPUT_CSC_GRPH_MODE_BYPASS                   = 0x0,
+       DCP_INPUT_CSC_GRPH_MODE_INPUT_CSC_COEF           = 0x1,
+       DCP_INPUT_CSC_GRPH_MODE_SHARED_COEF              = 0x2,
+       DCP_INPUT_CSC_GRPH_MODE_RESERVED                 = 0x3,
+} DCP_INPUT_CSC_GRPH_MODE;
+typedef enum DCP_OUTPUT_CSC_GRPH_MODE {
+       DCP_OUTPUT_CSC_GRPH_MODE_BYPASS                  = 0x0,
+       DCP_OUTPUT_CSC_GRPH_MODE_RGB                     = 0x1,
+       DCP_OUTPUT_CSC_GRPH_MODE_YCBCR601                = 0x2,
+       DCP_OUTPUT_CSC_GRPH_MODE_YCBCR709                = 0x3,
+       DCP_OUTPUT_CSC_GRPH_MODE_OUTPUT_CSC_COEF         = 0x4,
+       DCP_OUTPUT_CSC_GRPH_MODE_SHARED_COEF             = 0x5,
+       DCP_OUTPUT_CSC_GRPH_MODE_RESERVED0               = 0x6,
+       DCP_OUTPUT_CSC_GRPH_MODE_RESERVED1               = 0x7,
+} DCP_OUTPUT_CSC_GRPH_MODE;
+typedef enum DCP_DENORM_MODE {
+       DCP_DENORM_MODE_UNITY                            = 0x0,
+       DCP_DENORM_MODE_6BIT                             = 0x1,
+       DCP_DENORM_MODE_8BIT                             = 0x2,
+       DCP_DENORM_MODE_10BIT                            = 0x3,
+       DCP_DENORM_MODE_11BIT                            = 0x4,
+       DCP_DENORM_MODE_12BIT                            = 0x5,
+       DCP_DENORM_MODE_RESERVED0                        = 0x6,
+       DCP_DENORM_MODE_RESERVED1                        = 0x7,
+} DCP_DENORM_MODE;
+typedef enum DCP_DENORM_14BIT_OUT {
+       DCP_DENORM_14BIT_OUT_FALSE                       = 0x0,
+       DCP_DENORM_14BIT_OUT_TRUE                        = 0x1,
+} DCP_DENORM_14BIT_OUT;
+typedef enum DCP_OUT_ROUND_TRUNC_MODE {
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_12             = 0x0,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_11             = 0x1,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_10             = 0x2,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_9              = 0x3,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_8              = 0x4,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_RESERVED       = 0x5,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_14             = 0x6,
+       DCP_OUT_ROUND_TRUNC_MODE_TRUNCATE_13             = 0x7,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_12                = 0x8,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_11                = 0x9,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_10                = 0xa,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_9                 = 0xb,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_8                 = 0xc,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_RESERVED          = 0xd,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_14                = 0xe,
+       DCP_OUT_ROUND_TRUNC_MODE_ROUND_13                = 0xf,
+} DCP_OUT_ROUND_TRUNC_MODE;
+typedef enum DCP_KEY_MODE {
+       DCP_KEY_MODE_ALPHA0                              = 0x0,
+       DCP_KEY_MODE_ALPHA1                              = 0x1,
+       DCP_KEY_MODE_IN_RANGE_ALPHA1                     = 0x2,
+       DCP_KEY_MODE_IN_RANGE_ALPHA0                     = 0x3,
+} DCP_KEY_MODE;
+typedef enum DCP_GRPH_DEGAMMA_MODE {
+       DCP_GRPH_DEGAMMA_MODE_BYPASS                     = 0x0,
+       DCP_GRPH_DEGAMMA_MODE_ROMA                       = 0x1,
+       DCP_GRPH_DEGAMMA_MODE_ROMB                       = 0x2,
+       DCP_GRPH_DEGAMMA_MODE_RESERVED                   = 0x3,
+} DCP_GRPH_DEGAMMA_MODE;
+typedef enum DCP_CURSOR2_DEGAMMA_MODE {
+       DCP_CURSOR2_DEGAMMA_MODE_BYPASS                  = 0x0,
+       DCP_CURSOR2_DEGAMMA_MODE_ROMA                    = 0x1,
+       DCP_CURSOR2_DEGAMMA_MODE_ROMB                    = 0x2,
+       DCP_CURSOR2_DEGAMMA_MODE_RESERVED                = 0x3,
+} DCP_CURSOR2_DEGAMMA_MODE;
+typedef enum DCP_CURSOR_DEGAMMA_MODE {
+       DCP_CURSOR_DEGAMMA_MODE_BYPASS                   = 0x0,
+       DCP_CURSOR_DEGAMMA_MODE_ROMA                     = 0x1,
+       DCP_CURSOR_DEGAMMA_MODE_ROMB                     = 0x2,
+       DCP_CURSOR_DEGAMMA_MODE_RESERVED                 = 0x3,
+} DCP_CURSOR_DEGAMMA_MODE;
+typedef enum DCP_GRPH_GAMUT_REMAP_MODE {
+       DCP_GRPH_GAMUT_REMAP_MODE_BYPASS                 = 0x0,
+       DCP_GRPH_GAMUT_REMAP_MODE_ROMA                   = 0x1,
+       DCP_GRPH_GAMUT_REMAP_MODE_ROMB                   = 0x2,
+       DCP_GRPH_GAMUT_REMAP_MODE_RESERVED               = 0x3,
+} DCP_GRPH_GAMUT_REMAP_MODE;
+typedef enum DCP_SPATIAL_DITHER_EN {
+       DCP_SPATIAL_DITHER_EN_FALSE                      = 0x0,
+       DCP_SPATIAL_DITHER_EN_TRUE                       = 0x1,
+} DCP_SPATIAL_DITHER_EN;
+typedef enum DCP_SPATIAL_DITHER_MODE {
+       DCP_SPATIAL_DITHER_MODE_BYPASS                   = 0x0,
+       DCP_SPATIAL_DITHER_MODE_ROMA                     = 0x1,
+       DCP_SPATIAL_DITHER_MODE_ROMB                     = 0x2,
+       DCP_SPATIAL_DITHER_MODE_RESERVED                 = 0x3,
+} DCP_SPATIAL_DITHER_MODE;
+typedef enum DCP_SPATIAL_DITHER_DEPTH {
+       DCP_SPATIAL_DITHER_DEPTH_30BPP                   = 0x0,
+       DCP_SPATIAL_DITHER_DEPTH_24BPP                   = 0x1,
+       DCP_SPATIAL_DITHER_DEPTH_36BPP                   = 0x2,
+       DCP_SPATIAL_DITHER_DEPTH_UNDEFINED               = 0x3,
+} DCP_SPATIAL_DITHER_DEPTH;
+typedef enum DCP_FRAME_RANDOM_ENABLE {
+       DCP_FRAME_RANDOM_ENABLE_FALSE                    = 0x0,
+       DCP_FRAME_RANDOM_ENABLE_TRUE                     = 0x1,
+} DCP_FRAME_RANDOM_ENABLE;
+typedef enum DCP_RGB_RANDOM_ENABLE {
+       DCP_RGB_RANDOM_ENABLE_FALSE                      = 0x0,
+       DCP_RGB_RANDOM_ENABLE_TRUE                       = 0x1,
+} DCP_RGB_RANDOM_ENABLE;
+typedef enum DCP_HIGHPASS_RANDOM_ENABLE {
+       DCP_HIGHPASS_RANDOM_ENABLE_FALSE                 = 0x0,
+       DCP_HIGHPASS_RANDOM_ENABLE_TRUE                  = 0x1,
+} DCP_HIGHPASS_RANDOM_ENABLE;
+typedef enum DCP_CURSOR_EN {
+       DCP_CURSOR_EN_FALSE                              = 0x0,
+       DCP_CURSOR_EN_TRUE                               = 0x1,
+} DCP_CURSOR_EN;
+typedef enum DCP_CUR_INV_TRANS_CLAMP {
+       DCP_CUR_INV_TRANS_CLAMP_FALSE                    = 0x0,
+       DCP_CUR_INV_TRANS_CLAMP_TRUE                     = 0x1,
+} DCP_CUR_INV_TRANS_CLAMP;
+typedef enum DCP_CURSOR_MODE {
+       DCP_CURSOR_MODE_MONO_2BPP                        = 0x0,
+       DCP_CURSOR_MODE_24BPP_1BIT                       = 0x1,
+       DCP_CURSOR_MODE_24BPP_8BIT_PREMULTI              = 0x2,
+       DCP_CURSOR_MODE_24BPP_8BIT_UNPREMULTI            = 0x3,
+} DCP_CURSOR_MODE;
+typedef enum DCP_CURSOR_2X_MAGNIFY {
+       DCP_CURSOR_2X_MAGNIFY_FALSE                      = 0x0,
+       DCP_CURSOR_2X_MAGNIFY_TRUE                       = 0x1,
+} DCP_CURSOR_2X_MAGNIFY;
+typedef enum DCP_CURSOR_FORCE_MC_ON {
+       DCP_CURSOR_FORCE_MC_ON_FALSE                     = 0x0,
+       DCP_CURSOR_FORCE_MC_ON_TRUE                      = 0x1,
+} DCP_CURSOR_FORCE_MC_ON;
+typedef enum DCP_CURSOR_URGENT_CONTROL {
+       DCP_CURSOR_URGENT_CONTROL_MODE_0                 = 0x0,
+       DCP_CURSOR_URGENT_CONTROL_MODE_1                 = 0x1,
+       DCP_CURSOR_URGENT_CONTROL_MODE_2                 = 0x2,
+       DCP_CURSOR_URGENT_CONTROL_MODE_3                 = 0x3,
+       DCP_CURSOR_URGENT_CONTROL_MODE_4                 = 0x4,
+} DCP_CURSOR_URGENT_CONTROL;
+typedef enum DCP_CURSOR_UPDATE_PENDING {
+       DCP_CURSOR_UPDATE_PENDING_FALSE                  = 0x0,
+       DCP_CURSOR_UPDATE_PENDING_TRUE                   = 0x1,
+} DCP_CURSOR_UPDATE_PENDING;
+typedef enum DCP_CURSOR_UPDATE_TAKEN {
+       DCP_CURSOR_UPDATE_TAKEN_FALSE                    = 0x0,
+       DCP_CURSOR_UPDATE_TAKEN_TRUE                     = 0x1,
+} DCP_CURSOR_UPDATE_TAKEN;
+typedef enum DCP_CURSOR_UPDATE_LOCK {
+       DCP_CURSOR_UPDATE_LOCK_FALSE                     = 0x0,
+       DCP_CURSOR_UPDATE_LOCK_TRUE                      = 0x1,
+} DCP_CURSOR_UPDATE_LOCK;
+typedef enum DCP_CURSOR_DISABLE_MULTIPLE_UPDATE {
+       DCP_CURSOR_DISABLE_MULTIPLE_UPDATE_FALSE         = 0x0,
+       DCP_CURSOR_DISABLE_MULTIPLE_UPDATE_TRUE          = 0x1,
+} DCP_CURSOR_DISABLE_MULTIPLE_UPDATE;
+typedef enum DCP_CURSOR_UPDATE_STEREO_MODE {
+       DCP_CURSOR_UPDATE_STEREO_MODE_BOTH               = 0x0,
+       DCP_CURSOR_UPDATE_STEREO_MODE_SECONDARY_ONLY     = 0x1,
+       DCP_CURSOR_UPDATE_STEREO_MODE_UNDEFINED          = 0x2,
+       DCP_CURSOR_UPDATE_STEREO_MODE_PRIMARY_ONLY       = 0x3,
+} DCP_CURSOR_UPDATE_STEREO_MODE;
+typedef enum DCP_CURSOR2_EN {
+       DCP_CURSOR2_EN_FALSE                             = 0x0,
+       DCP_CURSOR2_EN_TRUE                              = 0x1,
+} DCP_CURSOR2_EN;
+typedef enum DCP_CUR2_INV_TRANS_CLAMP {
+       DCP_CUR2_INV_TRANS_CLAMP_FALSE                   = 0x0,
+       DCP_CUR2_INV_TRANS_CLAMP_TRUE                    = 0x1,
+} DCP_CUR2_INV_TRANS_CLAMP;
+typedef enum DCP_CURSOR2_MODE {
+       DCP_CURSOR2_MODE_MONO_2BPP                       = 0x0,
+       DCP_CURSOR2_MODE_24BPP_1BIT                      = 0x1,
+       DCP_CURSOR2_MODE_24BPP_8BIT_PREMULTI             = 0x2,
+       DCP_CURSOR2_MODE_24BPP_8BIT_UNPREMULTI           = 0x3,
+} DCP_CURSOR2_MODE;
+typedef enum DCP_CURSOR2_2X_MAGNIFY {
+       DCP_CURSOR2_2X_MAGNIFY_FALSE                     = 0x0,
+       DCP_CURSOR2_2X_MAGNIFY_TRUE                      = 0x1,
+} DCP_CURSOR2_2X_MAGNIFY;
+typedef enum DCP_CURSOR2_FORCE_MC_ON {
+       DCP_CURSOR2_FORCE_MC_ON_FALSE                    = 0x0,
+       DCP_CURSOR2_FORCE_MC_ON_TRUE                     = 0x1,
+} DCP_CURSOR2_FORCE_MC_ON;
+typedef enum DCP_CURSOR2_URGENT_CONTROL {
+       DCP_CURSOR2_URGENT_CONTROL_MODE_0                = 0x0,
+       DCP_CURSOR2_URGENT_CONTROL_MODE_1                = 0x1,
+       DCP_CURSOR2_URGENT_CONTROL_MODE_2                = 0x2,
+       DCP_CURSOR2_URGENT_CONTROL_MODE_3                = 0x3,
+       DCP_CURSOR2_URGENT_CONTROL_MODE_4                = 0x4,
+} DCP_CURSOR2_URGENT_CONTROL;
+typedef enum DCP_CURSOR2_UPDATE_PENDING {
+       DCP_CURSOR2_UPDATE_PENDING_FALSE                 = 0x0,
+       DCP_CURSOR2_UPDATE_PENDING_TRUE                  = 0x1,
+} DCP_CURSOR2_UPDATE_PENDING;
+typedef enum DCP_CURSOR2_UPDATE_TAKEN {
+       DCP_CURSOR2_UPDATE_TAKEN_FALSE                   = 0x0,
+       DCP_CURSOR2_UPDATE_TAKEN_TRUE                    = 0x1,
+} DCP_CURSOR2_UPDATE_TAKEN;
+typedef enum DCP_CURSOR2_UPDATE_LOCK {
+       DCP_CURSOR2_UPDATE_LOCK_FALSE                    = 0x0,
+       DCP_CURSOR2_UPDATE_LOCK_TRUE                     = 0x1,
+} DCP_CURSOR2_UPDATE_LOCK;
+typedef enum DCP_CURSOR2_DISABLE_MULTIPLE_UPDATE {
+       DCP_CURSOR2_DISABLE_MULTIPLE_UPDATE_FALSE        = 0x0,
+       DCP_CURSOR2_DISABLE_MULTIPLE_UPDATE_TRUE         = 0x1,
+} DCP_CURSOR2_DISABLE_MULTIPLE_UPDATE;
+typedef enum DCP_CURSOR2_UPDATE_STEREO_MODE {
+       DCP_CURSOR2_UPDATE_STEREO_MODE_BOTH              = 0x0,
+       DCP_CURSOR2_UPDATE_STEREO_MODE_SECONDARY_ONLY    = 0x1,
+       DCP_CURSOR2_UPDATE_STEREO_MODE_UNDEFINED         = 0x2,
+       DCP_CURSOR2_UPDATE_STEREO_MODE_PRIMARY_ONLY      = 0x3,
+} DCP_CURSOR2_UPDATE_STEREO_MODE;
+typedef enum DCP_CUR_REQUEST_FILTER_DIS {
+       DCP_CUR_REQUEST_FILTER_DIS_FALSE                 = 0x0,
+       DCP_CUR_REQUEST_FILTER_DIS_TRUE                  = 0x1,
+} DCP_CUR_REQUEST_FILTER_DIS;
+typedef enum DCP_CURSOR_STEREO_EN {
+       DCP_CURSOR_STEREO_EN_FALSE                       = 0x0,
+       DCP_CURSOR_STEREO_EN_TRUE                        = 0x1,
+} DCP_CURSOR_STEREO_EN;
+typedef enum DCP_CURSOR_STEREO_OFFSET_YNX {
+       DCP_CURSOR_STEREO_OFFSET_YNX_X_POSITION          = 0x0,
+       DCP_CURSOR_STEREO_OFFSET_YNX_Y_POSITION          = 0x1,
+} DCP_CURSOR_STEREO_OFFSET_YNX;
+typedef enum DCP_CURSOR2_STEREO_EN {
+       DCP_CURSOR2_STEREO_EN_FALSE                      = 0x0,
+       DCP_CURSOR2_STEREO_EN_TRUE                       = 0x1,
+} DCP_CURSOR2_STEREO_EN;
+typedef enum DCP_CURSOR2_STEREO_OFFSET_YNX {
+       DCP_CURSOR2_STEREO_OFFSET_YNX_X_POSITION         = 0x0,
+       DCP_CURSOR2_STEREO_OFFSET_YNX_Y_POSITION         = 0x1,
+} DCP_CURSOR2_STEREO_OFFSET_YNX;
+typedef enum DCP_DC_LUT_RW_MODE {
+       DCP_DC_LUT_RW_MODE_256_ENTRY                     = 0x0,
+       DCP_DC_LUT_RW_MODE_PWL                           = 0x1,
+} DCP_DC_LUT_RW_MODE;
+typedef enum DCP_DC_LUT_VGA_ACCESS_ENABLE {
+       DCP_DC_LUT_VGA_ACCESS_ENABLE_FALSE               = 0x0,
+       DCP_DC_LUT_VGA_ACCESS_ENABLE_TRUE                = 0x1,
+} DCP_DC_LUT_VGA_ACCESS_ENABLE;
+typedef enum DCP_DC_LUT_AUTOFILL {
+       DCP_DC_LUT_AUTOFILL_FALSE                        = 0x0,
+       DCP_DC_LUT_AUTOFILL_TRUE                         = 0x1,
+} DCP_DC_LUT_AUTOFILL;
+typedef enum DCP_DC_LUT_AUTOFILL_DONE {
+       DCP_DC_LUT_AUTOFILL_DONE_FALSE                   = 0x0,
+       DCP_DC_LUT_AUTOFILL_DONE_TRUE                    = 0x1,
+} DCP_DC_LUT_AUTOFILL_DONE;
+typedef enum DCP_DC_LUT_INC_B {
+       DCP_DC_LUT_INC_B_NA                              = 0x0,
+       DCP_DC_LUT_INC_B_2                               = 0x1,
+       DCP_DC_LUT_INC_B_4                               = 0x2,
+       DCP_DC_LUT_INC_B_8                               = 0x3,
+       DCP_DC_LUT_INC_B_16                              = 0x4,
+       DCP_DC_LUT_INC_B_32                              = 0x5,
+       DCP_DC_LUT_INC_B_64                              = 0x6,
+       DCP_DC_LUT_INC_B_128                             = 0x7,
+       DCP_DC_LUT_INC_B_256                             = 0x8,
+       DCP_DC_LUT_INC_B_512                             = 0x9,
+} DCP_DC_LUT_INC_B;
+typedef enum DCP_DC_LUT_DATA_B_SIGNED_EN {
+       DCP_DC_LUT_DATA_B_SIGNED_EN_FALSE                = 0x0,
+       DCP_DC_LUT_DATA_B_SIGNED_EN_TRUE                 = 0x1,
+} DCP_DC_LUT_DATA_B_SIGNED_EN;
+typedef enum DCP_DC_LUT_DATA_B_FLOAT_POINT_EN {
+       DCP_DC_LUT_DATA_B_FLOAT_POINT_EN_FALSE           = 0x0,
+       DCP_DC_LUT_DATA_B_FLOAT_POINT_EN_TRUE            = 0x1,
+} DCP_DC_LUT_DATA_B_FLOAT_POINT_EN;
+typedef enum DCP_DC_LUT_DATA_B_FORMAT {
+       DCP_DC_LUT_DATA_B_FORMAT_U0P10                   = 0x0,
+       DCP_DC_LUT_DATA_B_FORMAT_S1P10                   = 0x1,
+       DCP_DC_LUT_DATA_B_FORMAT_U1P11                   = 0x2,
+       DCP_DC_LUT_DATA_B_FORMAT_U0P12                   = 0x3,
+} DCP_DC_LUT_DATA_B_FORMAT;
+typedef enum DCP_DC_LUT_INC_G {
+       DCP_DC_LUT_INC_G_NA                              = 0x0,
+       DCP_DC_LUT_INC_G_2                               = 0x1,
+       DCP_DC_LUT_INC_G_4                               = 0x2,
+       DCP_DC_LUT_INC_G_8                               = 0x3,
+       DCP_DC_LUT_INC_G_16                              = 0x4,
+       DCP_DC_LUT_INC_G_32                              = 0x5,
+       DCP_DC_LUT_INC_G_64                              = 0x6,
+       DCP_DC_LUT_INC_G_128                             = 0x7,
+       DCP_DC_LUT_INC_G_256                             = 0x8,
+       DCP_DC_LUT_INC_G_512                             = 0x9,
+} DCP_DC_LUT_INC_G;
+typedef enum DCP_DC_LUT_DATA_G_SIGNED_EN {
+       DCP_DC_LUT_DATA_G_SIGNED_EN_FALSE                = 0x0,
+       DCP_DC_LUT_DATA_G_SIGNED_EN_TRUE                 = 0x1,
+} DCP_DC_LUT_DATA_G_SIGNED_EN;
+typedef enum DCP_DC_LUT_DATA_G_FLOAT_POINT_EN {
+       DCP_DC_LUT_DATA_G_FLOAT_POINT_EN_FALSE           = 0x0,
+       DCP_DC_LUT_DATA_G_FLOAT_POINT_EN_TRUE            = 0x1,
+} DCP_DC_LUT_DATA_G_FLOAT_POINT_EN;
+typedef enum DCP_DC_LUT_DATA_G_FORMAT {
+       DCP_DC_LUT_DATA_G_FORMAT_U0P10                   = 0x0,
+       DCP_DC_LUT_DATA_G_FORMAT_S1P10                   = 0x1,
+       DCP_DC_LUT_DATA_G_FORMAT_U1P11                   = 0x2,
+       DCP_DC_LUT_DATA_G_FORMAT_U0P12                   = 0x3,
+} DCP_DC_LUT_DATA_G_FORMAT;
+typedef enum DCP_DC_LUT_INC_R {
+       DCP_DC_LUT_INC_R_NA                              = 0x0,
+       DCP_DC_LUT_INC_R_2                               = 0x1,
+       DCP_DC_LUT_INC_R_4                               = 0x2,
+       DCP_DC_LUT_INC_R_8                               = 0x3,
+       DCP_DC_LUT_INC_R_16                              = 0x4,
+       DCP_DC_LUT_INC_R_32                              = 0x5,
+       DCP_DC_LUT_INC_R_64                              = 0x6,
+       DCP_DC_LUT_INC_R_128                             = 0x7,
+       DCP_DC_LUT_INC_R_256                             = 0x8,
+       DCP_DC_LUT_INC_R_512                             = 0x9,
+} DCP_DC_LUT_INC_R;
+typedef enum DCP_DC_LUT_DATA_R_SIGNED_EN {
+       DCP_DC_LUT_DATA_R_SIGNED_EN_FALSE                = 0x0,
+       DCP_DC_LUT_DATA_R_SIGNED_EN_TRUE                 = 0x1,
+} DCP_DC_LUT_DATA_R_SIGNED_EN;
+typedef enum DCP_DC_LUT_DATA_R_FLOAT_POINT_EN {
+       DCP_DC_LUT_DATA_R_FLOAT_POINT_EN_FALSE           = 0x0,
+       DCP_DC_LUT_DATA_R_FLOAT_POINT_EN_TRUE            = 0x1,
+} DCP_DC_LUT_DATA_R_FLOAT_POINT_EN;
+typedef enum DCP_DC_LUT_DATA_R_FORMAT {
+       DCP_DC_LUT_DATA_R_FORMAT_U0P10                   = 0x0,
+       DCP_DC_LUT_DATA_R_FORMAT_S1P10                   = 0x1,
+       DCP_DC_LUT_DATA_R_FORMAT_U1P11                   = 0x2,
+       DCP_DC_LUT_DATA_R_FORMAT_U0P12                   = 0x3,
+} DCP_DC_LUT_DATA_R_FORMAT;
+typedef enum DCP_CRC_ENABLE {
+       DCP_CRC_ENABLE_FALSE                             = 0x0,
+       DCP_CRC_ENABLE_TRUE                              = 0x1,
+} DCP_CRC_ENABLE;
+typedef enum DCP_CRC_SOURCE_SEL {
+       DCP_CRC_SOURCE_SEL_OUTPUT_PIX                    = 0x0,
+       DCP_CRC_SOURCE_SEL_INPUT_L32                     = 0x1,
+       DCP_CRC_SOURCE_SEL_INPUT_H32                     = 0x2,
+       DCP_CRC_SOURCE_SEL_OUTPUT_CNTL                   = 0x4,
+} DCP_CRC_SOURCE_SEL;
+typedef enum DCP_CRC_LINE_SEL {
+       DCP_CRC_LINE_SEL_RESERVED                        = 0x0,
+       DCP_CRC_LINE_SEL_EVEN                            = 0x1,
+       DCP_CRC_LINE_SEL_ODD                             = 0x2,
+       DCP_CRC_LINE_SEL_BOTH                            = 0x3,
+} DCP_CRC_LINE_SEL;
+typedef enum DCP_GRPH_FLIP_RATE {
+       DCP_GRPH_FLIP_RATE_1FRAME                        = 0x0,
+       DCP_GRPH_FLIP_RATE_2FRAME                        = 0x1,
+       DCP_GRPH_FLIP_RATE_3FRAME                        = 0x2,
+       DCP_GRPH_FLIP_RATE_4FRAME                        = 0x3,
+       DCP_GRPH_FLIP_RATE_5FRAME                        = 0x4,
+       DCP_GRPH_FLIP_RATE_6FRAME                        = 0x5,
+       DCP_GRPH_FLIP_RATE_7FRAME                        = 0x6,
+       DCP_GRPH_FLIP_RATE_8FRAME                        = 0x7,
+} DCP_GRPH_FLIP_RATE;
+typedef enum DCP_GRPH_FLIP_RATE_ENABLE {
+       DCP_GRPH_FLIP_RATE_ENABLE_FALSE                  = 0x0,
+       DCP_GRPH_FLIP_RATE_ENABLE_TRUE                   = 0x1,
+} DCP_GRPH_FLIP_RATE_ENABLE;
+typedef enum DCP_GSL0_EN {
+       DCP_GSL0_EN_FALSE                                = 0x0,
+       DCP_GSL0_EN_TRUE                                 = 0x1,
+} DCP_GSL0_EN;
+typedef enum DCP_GSL1_EN {
+       DCP_GSL1_EN_FALSE                                = 0x0,
+       DCP_GSL1_EN_TRUE                                 = 0x1,
+} DCP_GSL1_EN;
+typedef enum DCP_GSL2_EN {
+       DCP_GSL2_EN_FALSE                                = 0x0,
+       DCP_GSL2_EN_TRUE                                 = 0x1,
+} DCP_GSL2_EN;
+typedef enum DCP_GSL_MASTER_EN {
+       DCP_GSL_MASTER_EN_FALSE                          = 0x0,
+       DCP_GSL_MASTER_EN_TRUE                           = 0x1,
+} DCP_GSL_MASTER_EN;
+typedef enum DCP_GSL_XDMA_GROUP {
+       DCP_GSL_XDMA_GROUP_VSYNC                         = 0x0,
+       DCP_GSL_XDMA_GROUP_HSYNC0                        = 0x1,
+       DCP_GSL_XDMA_GROUP_HSYNC1                        = 0x2,
+       DCP_GSL_XDMA_GROUP_HSYNC2                        = 0x3,
+} DCP_GSL_XDMA_GROUP;
+typedef enum DCP_GSL_XDMA_GROUP_UNDERFLOW_EN {
+       DCP_GSL_XDMA_GROUP_UNDERFLOW_EN_FALSE            = 0x0,
+       DCP_GSL_XDMA_GROUP_UNDERFLOW_EN_TRUE             = 0x1,
+} DCP_GSL_XDMA_GROUP_UNDERFLOW_EN;
+typedef enum DCP_GSL_SYNC_SOURCE {
+       DCP_GSL_SYNC_SOURCE_FLIP                         = 0x0,
+       DCP_GSL_SYNC_SOURCE_PHASE0                       = 0x1,
+       DCP_GSL_SYNC_SOURCE_RESET                        = 0x2,
+       DCP_GSL_SYNC_SOURCE_PHASE1                       = 0x3,
+} DCP_GSL_SYNC_SOURCE;
+typedef enum DCP_GSL_DELAY_SURFACE_UPDATE_PENDING {
+       DCP_GSL_DELAY_SURFACE_UPDATE_PENDING_FALSE       = 0x0,
+       DCP_GSL_DELAY_SURFACE_UPDATE_PENDING_TRUE        = 0x1,
+} DCP_GSL_DELAY_SURFACE_UPDATE_PENDING;
+typedef enum DCP_TEST_DEBUG_WRITE_EN {
+       DCP_TEST_DEBUG_WRITE_EN_FALSE                    = 0x0,
+       DCP_TEST_DEBUG_WRITE_EN_TRUE                     = 0x1,
+} DCP_TEST_DEBUG_WRITE_EN;
+typedef enum DCP_GRPH_STEREOSYNC_FLIP_EN {
+       DCP_GRPH_STEREOSYNC_FLIP_EN_FALSE                = 0x0,
+       DCP_GRPH_STEREOSYNC_FLIP_EN_TRUE                 = 0x1,
+} DCP_GRPH_STEREOSYNC_FLIP_EN;
+typedef enum DCP_GRPH_STEREOSYNC_FLIP_MODE {
+       DCP_GRPH_STEREOSYNC_FLIP_MODE_FLIP               = 0x0,
+       DCP_GRPH_STEREOSYNC_FLIP_MODE_PHASE0             = 0x1,
+       DCP_GRPH_STEREOSYNC_FLIP_MODE_RESET              = 0x2,
+       DCP_GRPH_STEREOSYNC_FLIP_MODE_PHASE1             = 0x3,
+} DCP_GRPH_STEREOSYNC_FLIP_MODE;
+typedef enum DCP_GRPH_STEREOSYNC_SELECT_DISABLE {
+       DCP_GRPH_STEREOSYNC_SELECT_DISABLE_FALSE         = 0x0,
+       DCP_GRPH_STEREOSYNC_SELECT_DISABLE_TRUE          = 0x1,
+} DCP_GRPH_STEREOSYNC_SELECT_DISABLE;
+typedef enum DCP_GRPH_ROTATION_ANGLE {
+       DCP_GRPH_ROTATION_ANGLE_0                        = 0x0,
+       DCP_GRPH_ROTATION_ANGLE_90                       = 0x1,
+       DCP_GRPH_ROTATION_ANGLE_180                      = 0x2,
+       DCP_GRPH_ROTATION_ANGLE_270                      = 0x3,
+} DCP_GRPH_ROTATION_ANGLE;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN_FALSE       = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN_TRUE        = 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE_RELY_NUM  = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE_RELY_ENABLE= 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE;
+typedef enum DCP_GRPH_REGAMMA_MODE {
+       DCP_GRPH_REGAMMA_MODE_BYPASS                     = 0x0,
+       DCP_GRPH_REGAMMA_MODE_SRGB                       = 0x1,
+       DCP_GRPH_REGAMMA_MODE_XVYCC                      = 0x2,
+       DCP_GRPH_REGAMMA_MODE_PROGA                      = 0x3,
+       DCP_GRPH_REGAMMA_MODE_PROGB                      = 0x4,
+} DCP_GRPH_REGAMMA_MODE;
+typedef enum DCP_ALPHA_ROUND_TRUNC_MODE {
+       DCP_ALPHA_ROUND_TRUNC_MODE_ROUND                 = 0x0,
+       DCP_ALPHA_ROUND_TRUNC_MODE_TRUNC                 = 0x1,
+} DCP_ALPHA_ROUND_TRUNC_MODE;
+typedef enum DCP_CURSOR_ALPHA_BLND_ENA {
+       DCP_CURSOR_ALPHA_BLND_ENA_FALSE                  = 0x0,
+       DCP_CURSOR_ALPHA_BLND_ENA_TRUE                   = 0x1,
+} DCP_CURSOR_ALPHA_BLND_ENA;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK_FALSE   = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK_TRUE    = 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK_FALSE    = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK_TRUE     = 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK_FALSE     = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK_TRUE      = 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK;
+typedef enum DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK {
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK_FALSE      = 0x0,
+       DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK_TRUE       = 0x1,
+} DCP_GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK;
+typedef enum DCP_GRPH_SURFACE_COUNTER_EN {
+       DCP_GRPH_SURFACE_COUNTER_EN_DISABLE              = 0x0,
+       DCP_GRPH_SURFACE_COUNTER_EN_ENABLE               = 0x1,
+} DCP_GRPH_SURFACE_COUNTER_EN;
+typedef enum DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT {
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_0          = 0x0,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_1          = 0x1,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_2          = 0x2,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_3          = 0x3,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_4          = 0x4,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_5          = 0x5,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_6          = 0x6,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_7          = 0x7,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_8          = 0x8,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_9          = 0x9,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_10         = 0xa,
+       DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT_11         = 0xb,
+} DCP_GRPH_SURFACE_COUNTER_EVENT_SELECT;
+typedef enum DCP_GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED {
+       DCP_GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED_NO     = 0x0,
+       DCP_GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED_YES    = 0x1,
+} DCP_GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED;
+typedef enum HDMI_KEEPOUT_MODE {
+       HDMI_KEEPOUT_0_650PIX_AFTER_VSYNC                = 0x0,
+       HDMI_KEEPOUT_509_650PIX_AFTER_VSYNC              = 0x1,
+} HDMI_KEEPOUT_MODE;
+typedef enum HDMI_CLOCK_CHANNEL_RATE {
+       HDMI_CLOCK_CHANNEL_FREQ_EQUAL_TO_CHAR_RATE       = 0x0,
+       HDMI_CLOCK_CHANNEL_FREQ_QUARTER_TO_CHAR_RATE     = 0x1,
+} HDMI_CLOCK_CHANNEL_RATE;
+typedef enum HDMI_NO_EXTRA_NULL_PACKET_FILLED {
+       HDMI_EXTRA_NULL_PACKET_FILLED_ENABLE             = 0x0,
+       HDMI_EXTRA_NULL_PACKET_FILLED_DISABLE            = 0x1,
+} HDMI_NO_EXTRA_NULL_PACKET_FILLED;
+typedef enum HDMI_PACKET_GEN_VERSION {
+       HDMI_PACKET_GEN_VERSION_OLD                      = 0x0,
+       HDMI_PACKET_GEN_VERSION_NEW                      = 0x1,
+} HDMI_PACKET_GEN_VERSION;
+typedef enum HDMI_ERROR_ACK {
+       HDMI_ERROR_ACK_INT                               = 0x0,
+       HDMI_ERROR_NOT_ACK                               = 0x1,
+} HDMI_ERROR_ACK;
+typedef enum HDMI_ERROR_MASK {
+       HDMI_ERROR_MASK_INT                              = 0x0,
+       HDMI_ERROR_NOT_MASK                              = 0x1,
+} HDMI_ERROR_MASK;
+typedef enum HDMI_DEEP_COLOR_DEPTH {
+       HDMI_DEEP_COLOR_DEPTH_24BPP                      = 0x0,
+       HDMI_DEEP_COLOR_DEPTH_30BPP                      = 0x1,
+       HDMI_DEEP_COLOR_DEPTH_36BPP                      = 0x2,
+       HDMI_DEEP_COLOR_DEPTH_RESERVED                   = 0x3,
+} HDMI_DEEP_COLOR_DEPTH;
+typedef enum HDMI_AUDIO_DELAY_EN {
+       HDMI_AUDIO_DELAY_DISABLE                         = 0x0,
+       HDMI_AUDIO_DELAY_58CLK                           = 0x1,
+       HDMI_AUDIO_DELAY_56CLK                           = 0x2,
+       HDMI_AUDIO_DELAY_RESERVED                        = 0x3,
+} HDMI_AUDIO_DELAY_EN;
+typedef enum HDMI_AUDIO_SEND_MAX_PACKETS {
+       HDMI_NOT_SEND_MAX_AUDIO_PACKETS                  = 0x0,
+       HDMI_SEND_MAX_AUDIO_PACKETS                      = 0x1,
+} HDMI_AUDIO_SEND_MAX_PACKETS;
+typedef enum HDMI_ACR_SEND {
+       HDMI_ACR_NOT_SEND                                = 0x0,
+       HDMI_ACR_PKT_SEND                                = 0x1,
+} HDMI_ACR_SEND;
+typedef enum HDMI_ACR_CONT {
+       HDMI_ACR_CONT_DISABLE                            = 0x0,
+       HDMI_ACR_CONT_ENABLE                             = 0x1,
+} HDMI_ACR_CONT;
+typedef enum HDMI_ACR_SELECT {
+       HDMI_ACR_SELECT_HW                               = 0x0,
+       HDMI_ACR_SELECT_32K                              = 0x1,
+       HDMI_ACR_SELECT_44K                              = 0x2,
+       HDMI_ACR_SELECT_48K                              = 0x3,
+} HDMI_ACR_SELECT;
+typedef enum HDMI_ACR_SOURCE {
+       HDMI_ACR_SOURCE_HW                               = 0x0,
+       HDMI_ACR_SOURCE_SW                               = 0x1,
+} HDMI_ACR_SOURCE;
+typedef enum HDMI_ACR_N_MULTIPLE {
+       HDMI_ACR_0_MULTIPLE_RESERVED                     = 0x0,
+       HDMI_ACR_1_MULTIPLE                              = 0x1,
+       HDMI_ACR_2_MULTIPLE                              = 0x2,
+       HDMI_ACR_3_MULTIPLE_RESERVED                     = 0x3,
+       HDMI_ACR_4_MULTIPLE                              = 0x4,
+       HDMI_ACR_5_MULTIPLE_RESERVED                     = 0x5,
+       HDMI_ACR_6_MULTIPLE_RESERVED                     = 0x6,
+       HDMI_ACR_7_MULTIPLE_RESERVED                     = 0x7,
+} HDMI_ACR_N_MULTIPLE;
+typedef enum HDMI_ACR_AUDIO_PRIORITY {
+       HDMI_ACR_PKT_HIGH_PRIORITY_THAN_AUDIO_SAMPLE     = 0x0,
+       HDMI_AUDIO_SAMPLE_HIGH_PRIORITY_THAN_ACR_PKT     = 0x1,
+} HDMI_ACR_AUDIO_PRIORITY;
+typedef enum HDMI_NULL_SEND {
+       HDMI_NULL_NOT_SEND                               = 0x0,
+       HDMI_NULL_PKT_SEND                               = 0x1,
+} HDMI_NULL_SEND;
+typedef enum HDMI_GC_SEND {
+       HDMI_GC_NOT_SEND                                 = 0x0,
+       HDMI_GC_PKT_SEND                                 = 0x1,
+} HDMI_GC_SEND;
+typedef enum HDMI_GC_CONT {
+       HDMI_GC_CONT_DISABLE                             = 0x0,
+       HDMI_GC_CONT_ENABLE                              = 0x1,
+} HDMI_GC_CONT;
+typedef enum HDMI_ISRC_SEND {
+       HDMI_ISRC_NOT_SEND                               = 0x0,
+       HDMI_ISRC_PKT_SEND                               = 0x1,
+} HDMI_ISRC_SEND;
+typedef enum HDMI_ISRC_CONT {
+       HDMI_ISRC_CONT_DISABLE                           = 0x0,
+       HDMI_ISRC_CONT_ENABLE                            = 0x1,
+} HDMI_ISRC_CONT;
+typedef enum HDMI_AVI_INFO_SEND {
+       HDMI_AVI_INFO_NOT_SEND                           = 0x0,
+       HDMI_AVI_INFO_PKT_SEND                           = 0x1,
+} HDMI_AVI_INFO_SEND;
+typedef enum HDMI_AVI_INFO_CONT {
+       HDMI_AVI_INFO_CONT_DISABLE                       = 0x0,
+       HDMI_AVI_INFO_CONT_ENABLE                        = 0x1,
+} HDMI_AVI_INFO_CONT;
+typedef enum HDMI_AUDIO_INFO_SEND {
+       HDMI_AUDIO_INFO_NOT_SEND                         = 0x0,
+       HDMI_AUDIO_INFO_PKT_SEND                         = 0x1,
+} HDMI_AUDIO_INFO_SEND;
+typedef enum HDMI_AUDIO_INFO_CONT {
+       HDMI_AUDIO_INFO_CONT_DISABLE                     = 0x0,
+       HDMI_AUDIO_INFO_CONT_ENABLE                      = 0x1,
+} HDMI_AUDIO_INFO_CONT;
+typedef enum HDMI_MPEG_INFO_SEND {
+       HDMI_MPEG_INFO_NOT_SEND                          = 0x0,
+       HDMI_MPEG_INFO_PKT_SEND                          = 0x1,
+} HDMI_MPEG_INFO_SEND;
+typedef enum HDMI_MPEG_INFO_CONT {
+       HDMI_MPEG_INFO_CONT_DISABLE                      = 0x0,
+       HDMI_MPEG_INFO_CONT_ENABLE                       = 0x1,
+} HDMI_MPEG_INFO_CONT;
+typedef enum HDMI_GENERIC0_SEND {
+       HDMI_GENERIC0_NOT_SEND                           = 0x0,
+       HDMI_GENERIC0_PKT_SEND                           = 0x1,
+} HDMI_GENERIC0_SEND;
+typedef enum HDMI_GENERIC0_CONT {
+       HDMI_GENERIC0_CONT_DISABLE                       = 0x0,
+       HDMI_GENERIC0_CONT_ENABLE                        = 0x1,
+} HDMI_GENERIC0_CONT;
+typedef enum HDMI_GENERIC1_SEND {
+       HDMI_GENERIC1_NOT_SEND                           = 0x0,
+       HDMI_GENERIC1_PKT_SEND                           = 0x1,
+} HDMI_GENERIC1_SEND;
+typedef enum HDMI_GENERIC1_CONT {
+       HDMI_GENERIC1_CONT_DISABLE                       = 0x0,
+       HDMI_GENERIC1_CONT_ENABLE                        = 0x1,
+} HDMI_GENERIC1_CONT;
+typedef enum HDMI_GC_AVMUTE_CONT {
+       HDMI_GC_AVMUTE_CONT_DISABLE                      = 0x0,
+       HDMI_GC_AVMUTE_CONT_ENABLE                       = 0x1,
+} HDMI_GC_AVMUTE_CONT;
+typedef enum HDMI_PACKING_PHASE_OVERRIDE {
+       HDMI_PACKING_PHASE_SET_BY_HW                     = 0x0,
+       HDMI_PACKING_PHASE_SET_BY_SW                     = 0x1,
+} HDMI_PACKING_PHASE_OVERRIDE;
+typedef enum HDMI_GENERIC2_SEND {
+       HDMI_GENERIC2_NOT_SEND                           = 0x0,
+       HDMI_GENERIC2_PKT_SEND                           = 0x1,
+} HDMI_GENERIC2_SEND;
+typedef enum HDMI_GENERIC2_CONT {
+       HDMI_GENERIC2_CONT_DISABLE                       = 0x0,
+       HDMI_GENERIC2_CONT_ENABLE                        = 0x1,
+} HDMI_GENERIC2_CONT;
+typedef enum HDMI_GENERIC3_SEND {
+       HDMI_GENERIC3_NOT_SEND                           = 0x0,
+       HDMI_GENERIC3_PKT_SEND                           = 0x1,
+} HDMI_GENERIC3_SEND;
+typedef enum HDMI_GENERIC3_CONT {
+       HDMI_GENERIC3_CONT_DISABLE                       = 0x0,
+       HDMI_GENERIC3_CONT_ENABLE                        = 0x1,
+} HDMI_GENERIC3_CONT;
+typedef enum TMDS_PIXEL_ENCODING {
+       TMDS_PIXEL_ENCODING_444_OR_420                   = 0x0,
+       TMDS_PIXEL_ENCODING_422                          = 0x1,
+} TMDS_PIXEL_ENCODING;
+typedef enum TMDS_COLOR_FORMAT {
+       TMDS_COLOR_FORMAT__24BPP__TWIN30BPP_MSB__DUAL48BPP= 0x0,
+       TMDS_COLOR_FORMAT_TWIN30BPP_LSB                  = 0x1,
+       TMDS_COLOR_FORMAT_DUAL30BPP                      = 0x2,
+       TMDS_COLOR_FORMAT_RESERVED                       = 0x3,
+} TMDS_COLOR_FORMAT;
+typedef enum TMDS_STEREOSYNC_CTL_SEL_REG {
+       TMDS_STEREOSYNC_CTL0                             = 0x0,
+       TMDS_STEREOSYNC_CTL1                             = 0x1,
+       TMDS_STEREOSYNC_CTL2                             = 0x2,
+       TMDS_STEREOSYNC_CTL3                             = 0x3,
+} TMDS_STEREOSYNC_CTL_SEL_REG;
+typedef enum TMDS_CTL0_DATA_SEL {
+       TMDS_CTL0_DATA_SEL0_RESERVED                     = 0x0,
+       TMDS_CTL0_DATA_SEL1_DISPLAY_ENABLE               = 0x1,
+       TMDS_CTL0_DATA_SEL2_VSYNC                        = 0x2,
+       TMDS_CTL0_DATA_SEL3_RESERVED                     = 0x3,
+       TMDS_CTL0_DATA_SEL4_HSYNC                        = 0x4,
+       TMDS_CTL0_DATA_SEL5_SEL7_RESERVED                = 0x5,
+       TMDS_CTL0_DATA_SEL8_RANDOM_DATA                  = 0x6,
+       TMDS_CTL0_DATA_SEL9_SEL15_RANDOM_DATA            = 0x7,
+} TMDS_CTL0_DATA_SEL;
+typedef enum TMDS_CTL0_DATA_INVERT {
+       TMDS_CTL0_DATA_NORMAL                            = 0x0,
+       TMDS_CTL0_DATA_INVERT_EN                         = 0x1,
+} TMDS_CTL0_DATA_INVERT;
+typedef enum TMDS_CTL0_DATA_MODULATION {
+       TMDS_CTL0_DATA_MODULATION_DISABLE                = 0x0,
+       TMDS_CTL0_DATA_MODULATION_BIT0                   = 0x1,
+       TMDS_CTL0_DATA_MODULATION_BIT1                   = 0x2,
+       TMDS_CTL0_DATA_MODULATION_BIT2                   = 0x3,
+} TMDS_CTL0_DATA_MODULATION;
+typedef enum TMDS_CTL0_PATTERN_OUT_EN {
+       TMDS_CTL0_PATTERN_OUT_DISABLE                    = 0x0,
+       TMDS_CTL0_PATTERN_OUT_ENABLE                     = 0x1,
+} TMDS_CTL0_PATTERN_OUT_EN;
+typedef enum TMDS_CTL1_DATA_SEL {
+       TMDS_CTL1_DATA_SEL0_RESERVED                     = 0x0,
+       TMDS_CTL1_DATA_SEL1_DISPLAY_ENABLE               = 0x1,
+       TMDS_CTL1_DATA_SEL2_VSYNC                        = 0x2,
+       TMDS_CTL1_DATA_SEL3_RESERVED                     = 0x3,
+       TMDS_CTL1_DATA_SEL4_HSYNC                        = 0x4,
+       TMDS_CTL1_DATA_SEL5_SEL7_RESERVED                = 0x5,
+       TMDS_CTL1_DATA_SEL8_BLANK_TIME                   = 0x6,
+       TMDS_CTL1_DATA_SEL9_SEL15_RESERVED               = 0x7,
+} TMDS_CTL1_DATA_SEL;
+typedef enum TMDS_CTL1_DATA_INVERT {
+       TMDS_CTL1_DATA_NORMAL                            = 0x0,
+       TMDS_CTL1_DATA_INVERT_EN                         = 0x1,
+} TMDS_CTL1_DATA_INVERT;
+typedef enum TMDS_CTL1_DATA_MODULATION {
+       TMDS_CTL1_DATA_MODULATION_DISABLE                = 0x0,
+       TMDS_CTL1_DATA_MODULATION_BIT0                   = 0x1,
+       TMDS_CTL1_DATA_MODULATION_BIT1                   = 0x2,
+       TMDS_CTL1_DATA_MODULATION_BIT2                   = 0x3,
+} TMDS_CTL1_DATA_MODULATION;
+typedef enum TMDS_CTL1_PATTERN_OUT_EN {
+       TMDS_CTL1_PATTERN_OUT_DISABLE                    = 0x0,
+       TMDS_CTL1_PATTERN_OUT_ENABLE                     = 0x1,
+} TMDS_CTL1_PATTERN_OUT_EN;
+typedef enum TMDS_CTL2_DATA_SEL {
+       TMDS_CTL2_DATA_SEL0_RESERVED                     = 0x0,
+       TMDS_CTL2_DATA_SEL1_DISPLAY_ENABLE               = 0x1,
+       TMDS_CTL2_DATA_SEL2_VSYNC                        = 0x2,
+       TMDS_CTL2_DATA_SEL3_RESERVED                     = 0x3,
+       TMDS_CTL2_DATA_SEL4_HSYNC                        = 0x4,
+       TMDS_CTL2_DATA_SEL5_SEL7_RESERVED                = 0x5,
+       TMDS_CTL2_DATA_SEL8_BLANK_TIME                   = 0x6,
+       TMDS_CTL2_DATA_SEL9_SEL15_RESERVED               = 0x7,
+} TMDS_CTL2_DATA_SEL;
+typedef enum TMDS_CTL2_DATA_INVERT {
+       TMDS_CTL2_DATA_NORMAL                            = 0x0,
+       TMDS_CTL2_DATA_INVERT_EN                         = 0x1,
+} TMDS_CTL2_DATA_INVERT;
+typedef enum TMDS_CTL2_DATA_MODULATION {
+       TMDS_CTL2_DATA_MODULATION_DISABLE                = 0x0,
+       TMDS_CTL2_DATA_MODULATION_BIT0                   = 0x1,
+       TMDS_CTL2_DATA_MODULATION_BIT1                   = 0x2,
+       TMDS_CTL2_DATA_MODULATION_BIT2                   = 0x3,
+} TMDS_CTL2_DATA_MODULATION;
+typedef enum TMDS_CTL2_PATTERN_OUT_EN {
+       TMDS_CTL2_PATTERN_OUT_DISABLE                    = 0x0,
+       TMDS_CTL2_PATTERN_OUT_ENABLE                     = 0x1,
+} TMDS_CTL2_PATTERN_OUT_EN;
+typedef enum TMDS_CTL3_DATA_INVERT {
+       TMDS_CTL3_DATA_NORMAL                            = 0x0,
+       TMDS_CTL3_DATA_INVERT_EN                         = 0x1,
+} TMDS_CTL3_DATA_INVERT;
+typedef enum TMDS_CTL3_DATA_MODULATION {
+       TMDS_CTL3_DATA_MODULATION_DISABLE                = 0x0,
+       TMDS_CTL3_DATA_MODULATION_BIT0                   = 0x1,
+       TMDS_CTL3_DATA_MODULATION_BIT1                   = 0x2,
+       TMDS_CTL3_DATA_MODULATION_BIT2                   = 0x3,
+} TMDS_CTL3_DATA_MODULATION;
+typedef enum TMDS_CTL3_PATTERN_OUT_EN {
+       TMDS_CTL3_PATTERN_OUT_DISABLE                    = 0x0,
+       TMDS_CTL3_PATTERN_OUT_ENABLE                     = 0x1,
+} TMDS_CTL3_PATTERN_OUT_EN;
+typedef enum TMDS_CTL3_DATA_SEL {
+       TMDS_CTL3_DATA_SEL0_RESERVED                     = 0x0,
+       TMDS_CTL3_DATA_SEL1_DISPLAY_ENABLE               = 0x1,
+       TMDS_CTL3_DATA_SEL2_VSYNC                        = 0x2,
+       TMDS_CTL3_DATA_SEL3_RESERVED                     = 0x3,
+       TMDS_CTL3_DATA_SEL4_HSYNC                        = 0x4,
+       TMDS_CTL3_DATA_SEL5_SEL7_RESERVED                = 0x5,
+       TMDS_CTL3_DATA_SEL8_BLANK_TIME                   = 0x6,
+       TMDS_CTL3_DATA_SEL9_SEL15_RESERVED               = 0x7,
+} TMDS_CTL3_DATA_SEL;
+typedef enum DIG_FE_CNTL_SOURCE_SELECT {
+       DIG_FE_SOURCE_FROM_FMT0                          = 0x0,
+       DIG_FE_SOURCE_FROM_FMT1                          = 0x1,
+       DIG_FE_SOURCE_FROM_FMT2                          = 0x2,
+       DIG_FE_SOURCE_FROM_FMT3                          = 0x3,
+       DIG_FE_SOURCE_FROM_FMT4                          = 0x4,
+       DIG_FE_SOURCE_FROM_FMT5                          = 0x5,
+} DIG_FE_CNTL_SOURCE_SELECT;
+typedef enum DIG_FE_CNTL_STEREOSYNC_SELECT {
+       DIG_FE_STEREOSYNC_FROM_FMT0                      = 0x0,
+       DIG_FE_STEREOSYNC_FROM_FMT1                      = 0x1,
+       DIG_FE_STEREOSYNC_FROM_FMT2                      = 0x2,
+       DIG_FE_STEREOSYNC_FROM_FMT3                      = 0x3,
+       DIG_FE_STEREOSYNC_FROM_FMT4                      = 0x4,
+       DIG_FE_STEREOSYNC_FROM_FMT5                      = 0x5,
+} DIG_FE_CNTL_STEREOSYNC_SELECT;
+typedef enum DIG_FIFO_READ_CLOCK_SRC {
+       DIG_FIFO_READ_CLOCK_SRC_FROM_DCCG                = 0x0,
+       DIG_FIFO_READ_CLOCK_SRC_FROM_DISPLAY_PIPE        = 0x1,
+} DIG_FIFO_READ_CLOCK_SRC;
+typedef enum DIG_OUTPUT_CRC_CNTL_LINK_SEL {
+       DIG_OUTPUT_CRC_ON_LINK0                          = 0x0,
+       DIG_OUTPUT_CRC_ON_LINK1                          = 0x1,
+} DIG_OUTPUT_CRC_CNTL_LINK_SEL;
+typedef enum DIG_OUTPUT_CRC_DATA_SEL {
+       DIG_OUTPUT_CRC_FOR_FULLFRAME                     = 0x0,
+       DIG_OUTPUT_CRC_FOR_ACTIVEONLY                    = 0x1,
+       DIG_OUTPUT_CRC_FOR_VBI                           = 0x2,
+       DIG_OUTPUT_CRC_FOR_AUDIO                         = 0x3,
+} DIG_OUTPUT_CRC_DATA_SEL;
+typedef enum DIG_TEST_PATTERN_TEST_PATTERN_OUT_EN {
+       DIG_IN_NORMAL_OPERATION                          = 0x0,
+       DIG_IN_DEBUG_MODE                                = 0x1,
+} DIG_TEST_PATTERN_TEST_PATTERN_OUT_EN;
+typedef enum DIG_TEST_PATTERN_HALF_CLOCK_PATTERN_SEL {
+       DIG_10BIT_TEST_PATTERN                           = 0x0,
+       DIG_ALTERNATING_TEST_PATTERN                     = 0x1,
+} DIG_TEST_PATTERN_HALF_CLOCK_PATTERN_SEL;
+typedef enum DIG_TEST_PATTERN_RANDOM_PATTERN_OUT_EN {
+       DIG_TEST_PATTERN_NORMAL                          = 0x0,
+       DIG_TEST_PATTERN_RANDOM                          = 0x1,
+} DIG_TEST_PATTERN_RANDOM_PATTERN_OUT_EN;
+typedef enum DIG_TEST_PATTERN_RANDOM_PATTERN_RESET {
+       DIG_RANDOM_PATTERN_ENABLED                       = 0x0,
+       DIG_RANDOM_PATTERN_RESETED                       = 0x1,
+} DIG_TEST_PATTERN_RANDOM_PATTERN_RESET;
+typedef enum DIG_TEST_PATTERN_EXTERNAL_RESET_EN {
+       DIG_TEST_PATTERN_EXTERNAL_RESET_ENABLE           = 0x0,
+       DIG_TEST_PATTERN_EXTERNAL_RESET_BY_EXT_SIG       = 0x1,
+} DIG_TEST_PATTERN_EXTERNAL_RESET_EN;
+typedef enum DIG_RANDOM_PATTERN_SEED_RAN_PAT {
+       DIG_RANDOM_PATTERN_SEED_RAN_PAT_ALL_PIXELS       = 0x0,
+       DIG_RANDOM_PATTERN_SEED_RAN_PAT_DE_HIGH          = 0x1,
+} DIG_RANDOM_PATTERN_SEED_RAN_PAT;
+typedef enum DIG_FIFO_STATUS_USE_OVERWRITE_LEVEL {
+       DIG_FIFO_USE_OVERWRITE_LEVEL                     = 0x0,
+       DIG_FIFO_USE_CAL_AVERAGE_LEVEL                   = 0x1,
+} DIG_FIFO_STATUS_USE_OVERWRITE_LEVEL;
+typedef enum DIG_FIFO_ERROR_ACK {
+       DIG_FIFO_ERROR_ACK_INT                           = 0x0,
+       DIG_FIFO_ERROR_NOT_ACK                           = 0x1,
+} DIG_FIFO_ERROR_ACK;
+typedef enum DIG_FIFO_STATUS_FORCE_RECAL_AVERAGE {
+       DIG_FIFO_NOT_FORCE_RECAL_AVERAGE                 = 0x0,
+       DIG_FIFO_FORCE_RECAL_AVERAGE_LEVEL               = 0x1,
+} DIG_FIFO_STATUS_FORCE_RECAL_AVERAGE;
+typedef enum DIG_FIFO_STATUS_FORCE_RECOMP_MINMAX {
+       DIG_FIFO_NOT_FORCE_RECOMP_MINMAX                 = 0x0,
+       DIG_FIFO_FORCE_RECOMP_MINMAX                     = 0x1,
+} DIG_FIFO_STATUS_FORCE_RECOMP_MINMAX;
+typedef enum DIG_DISPCLK_SWITCH_CNTL_SWITCH_POINT {
+       DIG_DISPCLK_SWITCH_AT_EARLY_VBLANK               = 0x0,
+       DIG_DISPCLK_SWITCH_AT_FIRST_HSYNC                = 0x1,
+} DIG_DISPCLK_SWITCH_CNTL_SWITCH_POINT;
+typedef enum DIG_DISPCLK_SWITCH_ALLOWED_INT_ACK {
+       DIG_DISPCLK_SWITCH_ALLOWED_ACK_INT               = 0x0,
+       DIG_DISPCLK_SWITCH_ALLOWED_INT_NOT_ACK           = 0x1,
+} DIG_DISPCLK_SWITCH_ALLOWED_INT_ACK;
+typedef enum DIG_DISPCLK_SWITCH_ALLOWED_INT_MASK {
+       DIG_DISPCLK_SWITCH_ALLOWED_MASK_INT              = 0x0,
+       DIG_DISPCLK_SWITCH_ALLOWED_INT_UNMASK            = 0x1,
+} DIG_DISPCLK_SWITCH_ALLOWED_INT_MASK;
+typedef enum AFMT_INTERRUPT_STATUS_CHG_MASK {
+       AFMT_INTERRUPT_DISABLE                           = 0x0,
+       AFMT_INTERRUPT_ENABLE                            = 0x1,
+} AFMT_INTERRUPT_STATUS_CHG_MASK;
+typedef enum HDMI_GC_AVMUTE {
+       HDMI_GC_AVMUTE_SET                               = 0x0,
+       HDMI_GC_AVMUTE_UNSET                             = 0x1,
+} HDMI_GC_AVMUTE;
+typedef enum HDMI_DEFAULT_PAHSE {
+       HDMI_DEFAULT_PHASE_IS_0                          = 0x0,
+       HDMI_DEFAULT_PHASE_IS_1                          = 0x1,
+} HDMI_DEFAULT_PAHSE;
+typedef enum AFMT_AUDIO_PACKET_CONTROL2_AUDIO_LAYOUT_OVRD {
+       AFMT_AUDIO_LAYOUT_DETERMINED_BY_AZ_AUDIO_CHANNEL_STATUS= 0x0,
+       AFMT_AUDIO_LAYOUT_OVRD_BY_REGISTER               = 0x1,
+} AFMT_AUDIO_PACKET_CONTROL2_AUDIO_LAYOUT_OVRD;
+typedef enum AUDIO_LAYOUT_SELECT {
+       AUDIO_LAYOUT_0                                   = 0x0,
+       AUDIO_LAYOUT_1                                   = 0x1,
+} AUDIO_LAYOUT_SELECT;
+typedef enum AFMT_AUDIO_CRC_CONTROL_CONT {
+       AFMT_AUDIO_CRC_ONESHOT                           = 0x0,
+       AFMT_AUDIO_CRC_AUTO_RESTART                      = 0x1,
+} AFMT_AUDIO_CRC_CONTROL_CONT;
+typedef enum AFMT_AUDIO_CRC_CONTROL_SOURCE {
+       AFMT_AUDIO_CRC_SOURCE_FROM_FIFO_INPUT            = 0x0,
+       AFMT_AUDIO_CRC_SOURCE_FROM_FIFO_OUTPUT           = 0x1,
+} AFMT_AUDIO_CRC_CONTROL_SOURCE;
+typedef enum AFMT_AUDIO_CRC_CONTROL_CH_SEL {
+       AFMT_AUDIO_CRC_CH0_SIG                           = 0x0,
+       AFMT_AUDIO_CRC_CH1_SIG                           = 0x1,
+       AFMT_AUDIO_CRC_CH2_SIG                           = 0x2,
+       AFMT_AUDIO_CRC_CH3_SIG                           = 0x3,
+       AFMT_AUDIO_CRC_CH4_SIG                           = 0x4,
+       AFMT_AUDIO_CRC_CH5_SIG                           = 0x5,
+       AFMT_AUDIO_CRC_CH6_SIG                           = 0x6,
+       AFMT_AUDIO_CRC_CH7_SIG                           = 0x7,
+       AFMT_AUDIO_CRC_RESERVED                          = 0x8,
+       AFMT_AUDIO_CRC_AUDIO_SAMPLE_COUNT                = 0x9,
+} AFMT_AUDIO_CRC_CONTROL_CH_SEL;
+typedef enum AFMT_RAMP_CONTROL0_SIGN {
+       AFMT_RAMP_SIGNED                                 = 0x0,
+       AFMT_RAMP_UNSIGNED                               = 0x1,
+} AFMT_RAMP_CONTROL0_SIGN;
+typedef enum AFMT_AUDIO_PACKET_CONTROL_AUDIO_SAMPLE_SEND {
+       AFMT_AUDIO_PACKET_SENT_DISABLED                  = 0x0,
+       AFMT_AUDIO_PACKET_SENT_ENABLED                   = 0x1,
+} AFMT_AUDIO_PACKET_CONTROL_AUDIO_SAMPLE_SEND;
+typedef enum AFMT_AUDIO_PACKET_CONTROL_RESET_FIFO_WHEN_AUDIO_DIS {
+       AFMT_NOT_RESET_AUDIO_FIFO_WHEN_AUDIO_DISABLED_RESERVED= 0x0,
+       AFMT_RESET_AUDIO_FIFO_WHEN_AUDIO_DISABLED        = 0x1,
+} AFMT_AUDIO_PACKET_CONTROL_RESET_FIFO_WHEN_AUDIO_DIS;
+typedef enum AFMT_INFOFRAME_CONTROL0_AUDIO_INFO_SOURCE {
+       AFMT_INFOFRAME_SOURCE_FROM_AZALIA_BLOCK          = 0x0,
+       AFMT_INFOFRAME_SOURCE_FROM_AFMT_REGISTERS        = 0x1,
+} AFMT_INFOFRAME_CONTROL0_AUDIO_INFO_SOURCE;
+typedef enum AFMT_AUDIO_SRC_CONTROL_SELECT {
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM0                   = 0x0,
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM1                   = 0x1,
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM2                   = 0x2,
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM3                   = 0x3,
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM4                   = 0x4,
+       AFMT_AUDIO_SRC_FROM_AZ_STREAM5                   = 0x5,
+       AFMT_AUDIO_SRC_RESERVED                          = 0x6,
+} AFMT_AUDIO_SRC_CONTROL_SELECT;
+typedef enum DIG_BE_CNTL_MODE {
+       DIG_BE_DP_SST_MODE                               = 0x0,
+       DIG_BE_RESERVED1                                 = 0x1,
+       DIG_BE_TMDS_DVI_MODE                             = 0x2,
+       DIG_BE_TMDS_HDMI_MODE                            = 0x3,
+       DIG_BE_SDVO_RESERVED                             = 0x4,
+       DIG_BE_DP_MST_MODE                               = 0x5,
+       DIG_BE_RESERVED2                                 = 0x6,
+       DIG_BE_RESERVED3                                 = 0x7,
+} DIG_BE_CNTL_MODE;
+typedef enum DIG_BE_CNTL_HPD_SELECT {
+       DIG_BE_CNTL_HPD1                                 = 0x0,
+       DIG_BE_CNTL_HPD2                                 = 0x1,
+       DIG_BE_CNTL_HPD3                                 = 0x2,
+       DIG_BE_CNTL_HPD4                                 = 0x3,
+       DIG_BE_CNTL_HPD5                                 = 0x4,
+       DIG_BE_CNTL_HPD6                                 = 0x5,
+} DIG_BE_CNTL_HPD_SELECT;
+typedef enum LVTMA_RANDOM_PATTERN_SEED_RAN_PAT {
+       LVTMA_RANDOM_PATTERN_SEED_ALL_PIXELS             = 0x0,
+       LVTMA_RANDOM_PATTERN_SEED_ONLY_DE_HIGH           = 0x1,
+} LVTMA_RANDOM_PATTERN_SEED_RAN_PAT;
+typedef enum TMDS_SYNC_PHASE {
+       TMDS_NOT_SYNC_PHASE_ON_FRAME_START               = 0x0,
+       TMDS_SYNC_PHASE_ON_FRAME_START                   = 0x1,
+} TMDS_SYNC_PHASE;
+typedef enum TMDS_DATA_SYNCHRONIZATION_DSINTSEL {
+       TMDS_DATA_SYNCHRONIZATION_DSINTSEL_PCLK_TMDS     = 0x0,
+       TMDS_DATA_SYNCHRONIZATION_DSINTSEL_TMDS_PLL      = 0x1,
+} TMDS_DATA_SYNCHRONIZATION_DSINTSEL;
+typedef enum TMDS_TRANSMITTER_ENABLE_HPD_MASK {
+       TMDS_TRANSMITTER_HPD_MASK_NOT_OVERRIDE           = 0x0,
+       TMDS_TRANSMITTER_HPD_MASK_OVERRIDE               = 0x1,
+} TMDS_TRANSMITTER_ENABLE_HPD_MASK;
+typedef enum TMDS_TRANSMITTER_ENABLE_LNKCEN_HPD_MASK {
+       TMDS_TRANSMITTER_LNKCEN_HPD_MASK_NOT_OVERRIDE    = 0x0,
+       TMDS_TRANSMITTER_LNKCEN_HPD_MASK_OVERRIDE        = 0x1,
+} TMDS_TRANSMITTER_ENABLE_LNKCEN_HPD_MASK;
+typedef enum TMDS_TRANSMITTER_ENABLE_LNKDEN_HPD_MASK {
+       TMDS_TRANSMITTER_LNKDEN_HPD_MASK_NOT_OVERRIDE    = 0x0,
+       TMDS_TRANSMITTER_LNKDEN_HPD_MASK_OVERRIDE        = 0x1,
+} TMDS_TRANSMITTER_ENABLE_LNKDEN_HPD_MASK;
+typedef enum TMDS_TRANSMITTER_CONTROL_PLL_ENABLE_HPD_MASK {
+       TMDS_TRANSMITTER_HPD_NOT_OVERRIDE_PLL_ENABLE     = 0x0,
+       TMDS_TRANSMITTER_HPD_OVERRIDE_PLL_ENABLE_ON_DISCON= 0x1,
+       TMDS_TRANSMITTER_HPD_OVERRIDE_PLL_ENABLE_ON_CON  = 0x2,
+       TMDS_TRANSMITTER_HPD_OVERRIDE_PLL_ENABLE         = 0x3,
+} TMDS_TRANSMITTER_CONTROL_PLL_ENABLE_HPD_MASK;
+typedef enum TMDS_TRANSMITTER_CONTROL_IDSCKSELA {
+       TMDS_TRANSMITTER_IDSCKSELA_USE_IPIXCLK           = 0x0,
+       TMDS_TRANSMITTER_IDSCKSELA_USE_IDCLK             = 0x1,
+} TMDS_TRANSMITTER_CONTROL_IDSCKSELA;
+typedef enum TMDS_TRANSMITTER_CONTROL_IDSCKSELB {
+       TMDS_TRANSMITTER_IDSCKSELB_USE_IPIXCLK           = 0x0,
+       TMDS_TRANSMITTER_IDSCKSELB_USE_IDCLK             = 0x1,
+} TMDS_TRANSMITTER_CONTROL_IDSCKSELB;
+typedef enum TMDS_TRANSMITTER_CONTROL_PLL_PWRUP_SEQ_EN {
+       TMDS_TRANSMITTER_PLL_PWRUP_SEQ_DISABLE           = 0x0,
+       TMDS_TRANSMITTER_PLL_PWRUP_SEQ_ENABLE            = 0x1,
+} TMDS_TRANSMITTER_CONTROL_PLL_PWRUP_SEQ_EN;
+typedef enum TMDS_TRANSMITTER_CONTROL_PLL_RESET_HPD_MASK {
+       TMDS_TRANSMITTER_PLL_NOT_RST_ON_HPD              = 0x0,
+       TMDS_TRANSMITTER_PLL_RST_ON_HPD                  = 0x1,
+} TMDS_TRANSMITTER_CONTROL_PLL_RESET_HPD_MASK;
+typedef enum TMDS_TRANSMITTER_CONTROL_TMCLK_FROM_PADS {
+       TMDS_TRANSMITTER_TMCLK_FROM_TMDS_TMCLK           = 0x0,
+       TMDS_TRANSMITTER_TMCLK_FROM_PADS                 = 0x1,
+} TMDS_TRANSMITTER_CONTROL_TMCLK_FROM_PADS;
+typedef enum TMDS_TRANSMITTER_CONTROL_TDCLK_FROM_PADS {
+       TMDS_TRANSMITTER_TDCLK_FROM_TMDS_TDCLK           = 0x0,
+       TMDS_TRANSMITTER_TDCLK_FROM_PADS                 = 0x1,
+} TMDS_TRANSMITTER_CONTROL_TDCLK_FROM_PADS;
+typedef enum TMDS_TRANSMITTER_CONTROL_PLLSEL_OVERWRITE_EN {
+       TMDS_TRANSMITTER_PLLSEL_BY_HW                    = 0x0,
+       TMDS_TRANSMITTER_PLLSEL_OVERWRITE_BY_SW          = 0x1,
+} TMDS_TRANSMITTER_CONTROL_PLLSEL_OVERWRITE_EN;
+typedef enum TMDS_TRANSMITTER_CONTROL_BYPASS_PLLA {
+       TMDS_TRANSMITTER_BYPASS_PLLA_COHERENT            = 0x0,
+       TMDS_TRANSMITTER_BYPASS_PLLA_INCOHERENT          = 0x1,
+} TMDS_TRANSMITTER_CONTROL_BYPASS_PLLA;
+typedef enum TMDS_TRANSMITTER_CONTROL_BYPASS_PLLB {
+       TMDS_TRANSMITTER_BYPASS_PLLB_COHERENT            = 0x0,
+       TMDS_TRANSMITTER_BYPASS_PLLB_INCOHERENT          = 0x1,
+} TMDS_TRANSMITTER_CONTROL_BYPASS_PLLB;
+typedef enum TMDS_REG_TEST_OUTPUTA_CNTLA {
+       TMDS_REG_TEST_OUTPUTA_CNTLA_OTDATA0              = 0x0,
+       TMDS_REG_TEST_OUTPUTA_CNTLA_OTDATA1              = 0x1,
+       TMDS_REG_TEST_OUTPUTA_CNTLA_OTDATA2              = 0x2,
+       TMDS_REG_TEST_OUTPUTA_CNTLA_NA                   = 0x3,
+} TMDS_REG_TEST_OUTPUTA_CNTLA;
+typedef enum TMDS_REG_TEST_OUTPUTB_CNTLB {
+       TMDS_REG_TEST_OUTPUTB_CNTLB_OTDATB0              = 0x0,
+       TMDS_REG_TEST_OUTPUTB_CNTLB_OTDATB1              = 0x1,
+       TMDS_REG_TEST_OUTPUTB_CNTLB_OTDATB2              = 0x2,
+       TMDS_REG_TEST_OUTPUTB_CNTLB_NA                   = 0x3,
+} TMDS_REG_TEST_OUTPUTB_CNTLB;
+typedef enum DP_LINK_TRAINING_COMPLETE {
+       DP_LINK_TRAINING_NOT_COMPLETE                    = 0x0,
+       DP_LINK_TRAINING_ALREADY_COMPLETE                = 0x1,
+} DP_LINK_TRAINING_COMPLETE;
+typedef enum DP_EMBEDDED_PANEL_MODE {
+       DP_EXTERNAL_PANEL                                = 0x0,
+       DP_EMBEDDED_PANEL                                = 0x1,
+} DP_EMBEDDED_PANEL_MODE;
+typedef enum DP_PIXEL_ENCODING {
+       DP_PIXEL_ENCODING_RGB444                         = 0x0,
+       DP_PIXEL_ENCODING_YCBCR422                       = 0x1,
+       DP_PIXEL_ENCODING_YCBCR444                       = 0x2,
+       DP_PIXEL_ENCODING_RGB_WIDE_GAMUT                 = 0x3,
+       DP_PIXEL_ENCODING_Y_ONLY                         = 0x4,
+       DP_PIXEL_ENCODING_YCBCR420                       = 0x5,
+       DP_PIXEL_ENCODING_RESERVED                       = 0x6,
+} DP_PIXEL_ENCODING;
+typedef enum DP_DYN_RANGE {
+       DP_DYN_VESA_RANGE                                = 0x0,
+       DP_DYN_CEA_RANGE                                 = 0x1,
+} DP_DYN_RANGE;
+typedef enum DP_YCBCR_RANGE {
+       DP_YCBCR_RANGE_BT601_5                           = 0x0,
+       DP_YCBCR_RANGE_BT709_5                           = 0x1,
+} DP_YCBCR_RANGE;
+typedef enum DP_COMPONENT_DEPTH {
+       DP_COMPONENT_DEPTH_6BPC                          = 0x0,
+       DP_COMPONENT_DEPTH_8BPC                          = 0x1,
+       DP_COMPONENT_DEPTH_10BPC                         = 0x2,
+       DP_COMPONENT_DEPTH_12BPC                         = 0x3,
+       DP_COMPONENT_DEPTH_16BPC                         = 0x4,
+       DP_COMPONENT_DEPTH_RESERVED                      = 0x5,
+} DP_COMPONENT_DEPTH;
+typedef enum DP_MSA_MISC0_OVERRIDE_ENABLE {
+       MSA_MISC0_OVERRIDE_DISABLE                       = 0x0,
+       MSA_MISC0_OVERRIDE_ENABLE                        = 0x1,
+} DP_MSA_MISC0_OVERRIDE_ENABLE;
+typedef enum DP_MSA_MISC1_BIT7_OVERRIDE_ENABLE {
+       MSA_MISC1_BIT7_OVERRIDE_DISABLE                  = 0x0,
+       MSA_MISC1_BIT7_OVERRIDE_ENABLE                   = 0x1,
+} DP_MSA_MISC1_BIT7_OVERRIDE_ENABLE;
+typedef enum DP_UDI_LANES {
+       DP_UDI_1_LANE                                    = 0x0,
+       DP_UDI_2_LANES                                   = 0x1,
+       DP_UDI_LANES_RESERVED                            = 0x2,
+       DP_UDI_4_LANES                                   = 0x3,
+} DP_UDI_LANES;
+typedef enum DP_VID_STREAM_DIS_DEFER {
+       DP_VID_STREAM_DIS_NO_DEFER                       = 0x0,
+       DP_VID_STREAM_DIS_DEFER_TO_HBLANK                = 0x1,
+       DP_VID_STREAM_DIS_DEFER_TO_VBLANK                = 0x2,
+} DP_VID_STREAM_DIS_DEFER;
+typedef enum DP_STEER_OVERFLOW_ACK {
+       DP_STEER_OVERFLOW_ACK_NO_EFFECT                  = 0x0,
+       DP_STEER_OVERFLOW_ACK_CLR_INTERRUPT              = 0x1,
+} DP_STEER_OVERFLOW_ACK;
+typedef enum DP_STEER_OVERFLOW_MASK {
+       DP_STEER_OVERFLOW_MASKED                         = 0x0,
+       DP_STEER_OVERFLOW_UNMASK                         = 0x1,
+} DP_STEER_OVERFLOW_MASK;
+typedef enum DP_TU_OVERFLOW_ACK {
+       DP_TU_OVERFLOW_ACK_NO_EFFECT                     = 0x0,
+       DP_TU_OVERFLOW_ACK_CLR_INTERRUPT                 = 0x1,
+} DP_TU_OVERFLOW_ACK;
+typedef enum DP_VID_TIMING_MODE {
+       DP_VID_TIMING_MODE_ASYNC                         = 0x0,
+       DP_VID_TIMING_MODE_SYNC                          = 0x1,
+} DP_VID_TIMING_MODE;
+typedef enum DP_VID_M_N_DOUBLE_BUFFER_MODE {
+       DP_VID_M_N_DOUBLE_BUFFER_AFTER_VID_M_UPDATE      = 0x0,
+       DP_VID_M_N_DOUBLE_BUFFER_AT_FRAME_START          = 0x1,
+} DP_VID_M_N_DOUBLE_BUFFER_MODE;
+typedef enum DP_VID_M_N_GEN_EN {
+       DP_VID_M_N_PROGRAMMED_VIA_REG                    = 0x0,
+       DP_VID_M_N_CALC_AUTO                             = 0x1,
+} DP_VID_M_N_GEN_EN;
+typedef enum DP_VID_M_DOUBLE_VALUE_EN {
+       DP_VID_M_INPUT_PIXEL_RATE                        = 0x0,
+       DP_VID_M_DOUBLE_INPUT_PIXEL_RATE                 = 0x1,
+} DP_VID_M_DOUBLE_VALUE_EN;
+typedef enum DP_VID_ENHANCED_FRAME_MODE {
+       VID_NORMAL_FRAME_MODE                            = 0x0,
+       VID_ENHANCED_MODE                                = 0x1,
+} DP_VID_ENHANCED_FRAME_MODE;
+typedef enum DP_VID_MSA_TOP_FIELD_MODE {
+       DP_TOP_FIELD_ONLY                                = 0x0,
+       DP_TOP_PLUS_BOTTOM_FIELD                         = 0x1,
+} DP_VID_MSA_TOP_FIELD_MODE;
+typedef enum DP_VID_VBID_FIELD_POL {
+       DP_VID_VBID_FIELD_POL_NORMAL                     = 0x0,
+       DP_VID_VBID_FIELD_POL_INV                        = 0x1,
+} DP_VID_VBID_FIELD_POL;
+typedef enum DP_VID_STREAM_DISABLE_ACK {
+       ID_STREAM_DISABLE_NO_ACK                         = 0x0,
+       ID_STREAM_DISABLE_ACKED                          = 0x1,
+} DP_VID_STREAM_DISABLE_ACK;
+typedef enum DP_VID_STREAM_DISABLE_MASK {
+       VID_STREAM_DISABLE_MASKED                        = 0x0,
+       VID_STREAM_DISABLE_UNMASK                        = 0x1,
+} DP_VID_STREAM_DISABLE_MASK;
+typedef enum DPHY_ATEST_SEL_LANE0 {
+       DPHY_ATEST_LANE0_PRBS_PATTERN                    = 0x0,
+       DPHY_ATEST_LANE0_REG_PATTERN                     = 0x1,
+} DPHY_ATEST_SEL_LANE0;
+typedef enum DPHY_ATEST_SEL_LANE1 {
+       DPHY_ATEST_LANE1_PRBS_PATTERN                    = 0x0,
+       DPHY_ATEST_LANE1_REG_PATTERN                     = 0x1,
+} DPHY_ATEST_SEL_LANE1;
+typedef enum DPHY_ATEST_SEL_LANE2 {
+       DPHY_ATEST_LANE2_PRBS_PATTERN                    = 0x0,
+       DPHY_ATEST_LANE2_REG_PATTERN                     = 0x1,
+} DPHY_ATEST_SEL_LANE2;
+typedef enum DPHY_ATEST_SEL_LANE3 {
+       DPHY_ATEST_LANE3_PRBS_PATTERN                    = 0x0,
+       DPHY_ATEST_LANE3_REG_PATTERN                     = 0x1,
+} DPHY_ATEST_SEL_LANE3;
+typedef enum DPHY_BYPASS {
+       DPHY_8B10B_OUTPUT                                = 0x0,
+       DPHY_DBG_OUTPUT                                  = 0x1,
+} DPHY_BYPASS;
+typedef enum DPHY_SKEW_BYPASS {
+       DPHY_WITH_SKEW                                   = 0x0,
+       DPHY_NO_SKEW                                     = 0x1,
+} DPHY_SKEW_BYPASS;
+typedef enum DPHY_TRAINING_PATTERN_SEL {
+       DPHY_TRAINING_PATTERN_1                          = 0x0,
+       DPHY_TRAINING_PATTERN_2                          = 0x1,
+       DPHY_TRAINING_PATTERN_3                          = 0x2,
+       DPHY_TRAINING_PATTERN_4                          = 0x3,
+} DPHY_TRAINING_PATTERN_SEL;
+typedef enum DPHY_8B10B_RESET {
+       DPHY_8B10B_NOT_RESET                             = 0x0,
+       DPHY_8B10B_RESETET                               = 0x1,
+} DPHY_8B10B_RESET;
+typedef enum DP_DPHY_8B10B_EXT_DISP {
+       DP_DPHY_8B10B_EXT_DISP_ZERO                      = 0x0,
+       DP_DPHY_8B10B_EXT_DISP_ONE                       = 0x1,
+} DP_DPHY_8B10B_EXT_DISP;
+typedef enum DPHY_8B10B_CUR_DISP {
+       DPHY_8B10B_CUR_DISP_ZERO                         = 0x0,
+       DPHY_8B10B_CUR_DISP_ONE                          = 0x1,
+} DPHY_8B10B_CUR_DISP;
+typedef enum DPHY_PRBS_EN {
+       DPHY_PRBS_DISABLE                                = 0x0,
+       DPHY_PRBS_ENABLE                                 = 0x1,
+} DPHY_PRBS_EN;
+typedef enum DPHY_PRBS_SEL {
+       DPHY_PRBS7_SELECTED                              = 0x0,
+       DPHY_PRBS23_SELECTED                             = 0x1,
+       DPHY_PRBS11_SELECTED                             = 0x2,
+} DPHY_PRBS_SEL;
+typedef enum DPHY_LOAD_BS_COUNT_START {
+       DPHY_LOAD_BS_COUNT_STARTED                       = 0x0,
+       DPHY_LOAD_BS_COUNT_NOT_STARTED                   = 0x1,
+} DPHY_LOAD_BS_COUNT_START;
+typedef enum DPHY_CRC_EN {
+       DPHY_CRC_DISABLED                                = 0x0,
+       DPHY_CRC_ENABLED                                 = 0x1,
+} DPHY_CRC_EN;
+typedef enum DPHY_CRC_CONT_EN {
+       DPHY_CRC_ONE_SHOT                                = 0x0,
+       DPHY_CRC_CONTINUOUS                              = 0x1,
+} DPHY_CRC_CONT_EN;
+typedef enum DPHY_CRC_FIELD {
+       DPHY_CRC_START_FROM_TOP_FIELD                    = 0x0,
+       DPHY_CRC_START_FROM_BOTTOM_FIELD                 = 0x1,
+} DPHY_CRC_FIELD;
+typedef enum DPHY_CRC_SEL {
+       DPHY_CRC_LANE0_SELECTED                          = 0x0,
+       DPHY_CRC_LANE1_SELECTED                          = 0x1,
+       DPHY_CRC_LANE2_SELECTED                          = 0x2,
+       DPHY_CRC_LANE3_SELECTED                          = 0x3,
+} DPHY_CRC_SEL;
+typedef enum DPHY_RX_FAST_TRAINING_CAPABLE {
+       DPHY_FAST_TRAINING_NOT_CAPABLE_0                 = 0x0,
+       DPHY_FAST_TRAINING_CAPABLE                       = 0x1,
+} DPHY_RX_FAST_TRAINING_CAPABLE;
+typedef enum DP_SEC_COLLISION_ACK {
+       DP_SEC_COLLISION_ACK_NO_EFFECT                   = 0x0,
+       DP_SEC_COLLISION_ACK_CLR_FLAG                    = 0x1,
+} DP_SEC_COLLISION_ACK;
+typedef enum DP_SEC_AUDIO_MUTE {
+       DP_SEC_AUDIO_MUTE_HW_CTRL                        = 0x0,
+       DP_SEC_AUDIO_MUTE_SW_CTRL                        = 0x1,
+} DP_SEC_AUDIO_MUTE;
+typedef enum DP_SEC_TIMESTAMP_MODE {
+       DP_SEC_TIMESTAMP_PROGRAMMABLE_MODE               = 0x0,
+       DP_SEC_TIMESTAMP_AUTO_CALC_MODE                  = 0x1,
+} DP_SEC_TIMESTAMP_MODE;
+typedef enum DP_SEC_ASP_PRIORITY {
+       DP_SEC_ASP_LOW_PRIORITY                          = 0x0,
+       DP_SEC_ASP_HIGH_PRIORITY                         = 0x1,
+} DP_SEC_ASP_PRIORITY;
+typedef enum DP_SEC_ASP_CHANNEL_COUNT_OVERRIDE {
+       DP_SEC_ASP_CHANNEL_COUNT_FROM_AZ                 = 0x0,
+       DP_SEC_ASP_CHANNEL_COUNT_OVERRIDE_ENABLED        = 0x1,
+} DP_SEC_ASP_CHANNEL_COUNT_OVERRIDE;
+typedef enum DP_MSE_SAT_UPDATE_ACT {
+       DP_MSE_SAT_UPDATE_NO_ACTION                      = 0x0,
+       DP_MSE_SAT_UPDATE_WITH_TRIGGER                   = 0x1,
+       DP_MSE_SAT_UPDATE_WITHOUT_TRIGGER                = 0x2,
+} DP_MSE_SAT_UPDATE_ACT;
+typedef enum DP_MSE_LINK_LINE {
+       DP_MSE_LINK_LINE_32_MTP_LONG                     = 0x0,
+       DP_MSE_LINK_LINE_64_MTP_LONG                     = 0x1,
+       DP_MSE_LINK_LINE_128_MTP_LONG                    = 0x2,
+       DP_MSE_LINK_LINE_256_MTP_LONG                    = 0x3,
+} DP_MSE_LINK_LINE;
+typedef enum DP_MSE_BLANK_CODE {
+       DP_MSE_BLANK_CODE_SF_FILLED                      = 0x0,
+       DP_MSE_BLANK_CODE_ZERO_FILLED                    = 0x1,
+} DP_MSE_BLANK_CODE;
+typedef enum DP_MSE_TIMESTAMP_MODE {
+       DP_MSE_TIMESTAMP_CALC_BASED_ON_LINK_RATE         = 0x0,
+       DP_MSE_TIMESTAMP_CALC_BASED_ON_VC_RATE           = 0x1,
+} DP_MSE_TIMESTAMP_MODE;
+typedef enum DP_MSE_ZERO_ENCODER {
+       DP_MSE_NOT_ZERO_FE_ENCODER                       = 0x0,
+       DP_MSE_ZERO_FE_ENCODER                           = 0x1,
+} DP_MSE_ZERO_ENCODER;
+typedef enum DP_MSE_OUTPUT_DPDBG_DATA {
+       DP_MSE_OUTPUT_DPDBG_DATA_DIS                     = 0x0,
+       DP_MSE_OUTPUT_DPDBG_DATA_EN                      = 0x1,
+} DP_MSE_OUTPUT_DPDBG_DATA;
+typedef enum DP_DPHY_HBR2_PATTERN_CONTROL_MODE {
+       DP_DPHY_HBR2_PASS_THROUGH                        = 0x0,
+       DP_DPHY_HBR2_PATTERN_1                           = 0x1,
+       DP_DPHY_HBR2_PATTERN_2_NEG                       = 0x2,
+       DP_DPHY_HBR2_PATTERN_3                           = 0x3,
+       DP_DPHY_HBR2_PATTERN_2_POS                       = 0x6,
+} DP_DPHY_HBR2_PATTERN_CONTROL_MODE;
+typedef enum DPHY_CRC_MST_PHASE_ERROR_ACK {
+       DPHY_CRC_MST_PHASE_ERROR_NO_ACK                  = 0x0,
+       DPHY_CRC_MST_PHASE_ERROR_ACKED                   = 0x1,
+} DPHY_CRC_MST_PHASE_ERROR_ACK;
+typedef enum DPHY_SW_FAST_TRAINING_START {
+       DPHY_SW_FAST_TRAINING_NOT_STARTED                = 0x0,
+       DPHY_SW_FAST_TRAINING_STARTED                    = 0x1,
+} DPHY_SW_FAST_TRAINING_START;
+typedef enum DP_DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_EN {
+       DP_DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_DISABLED= 0x0,
+       DP_DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_ENABLED = 0x1,
+} DP_DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_EN;
+typedef enum DP_DPHY_FAST_TRAINING_COMPLETE_MASK {
+       DP_DPHY_FAST_TRAINING_COMPLETE_MASKED            = 0x0,
+       DP_DPHY_FAST_TRAINING_COMPLETE_NOT_MASKED        = 0x1,
+} DP_DPHY_FAST_TRAINING_COMPLETE_MASK;
+typedef enum DP_DPHY_FAST_TRAINING_COMPLETE_ACK {
+       DP_DPHY_FAST_TRAINING_COMPLETE_NOT_ACKED         = 0x0,
+       DP_DPHY_FAST_TRAINING_COMPLETE_ACKED             = 0x1,
+} DP_DPHY_FAST_TRAINING_COMPLETE_ACK;
+typedef enum DP_MSA_V_TIMING_OVERRIDE_EN {
+       MSA_V_TIMING_OVERRIDE_DISABLED                   = 0x0,
+       MSA_V_TIMING_OVERRIDE_ENABLED                    = 0x1,
+} DP_MSA_V_TIMING_OVERRIDE_EN;
+typedef enum DP_SEC_GSP0_PRIORITY {
+       SEC_GSP0_PRIORITY_LOW                            = 0x0,
+       SEC_GSP0_PRIORITY_HIGH                           = 0x1,
+} DP_SEC_GSP0_PRIORITY;
+typedef enum DP_SEC_GSP0_SEND {
+       NOT_SENT                                         = 0x0,
+       FORCE_SENT                                       = 0x1,
+} DP_SEC_GSP0_SEND;
+typedef enum DP_AUX_CONTROL_HPD_SEL {
+       DP_AUX_CONTROL_HPD1_SELECTED                     = 0x0,
+       DP_AUX_CONTROL_HPD2_SELECTED                     = 0x1,
+       DP_AUX_CONTROL_HPD3_SELECTED                     = 0x2,
+       DP_AUX_CONTROL_HPD4_SELECTED                     = 0x3,
+       DP_AUX_CONTROL_HPD5_SELECTED                     = 0x4,
+       DP_AUX_CONTROL_HPD6_SELECTED                     = 0x5,
+} DP_AUX_CONTROL_HPD_SEL;
+typedef enum DP_AUX_CONTROL_TEST_MODE {
+       DP_AUX_CONTROL_TEST_MODE_DISABLE                 = 0x0,
+       DP_AUX_CONTROL_TEST_MODE_ENABLE                  = 0x1,
+} DP_AUX_CONTROL_TEST_MODE;
+typedef enum DP_AUX_SW_CONTROL_SW_GO {
+       DP_AUX_SW_CONTROL_SW__NOT_GO                     = 0x0,
+       DP_AUX_SW_CONTROL_SW__GO                         = 0x1,
+} DP_AUX_SW_CONTROL_SW_GO;
+typedef enum DP_AUX_SW_CONTROL_LS_READ_TRIG {
+       DP_AUX_SW_CONTROL_LS_READ__NOT_TRIG              = 0x0,
+       DP_AUX_SW_CONTROL_LS_READ__TRIG                  = 0x1,
+} DP_AUX_SW_CONTROL_LS_READ_TRIG;
+typedef enum DP_AUX_ARB_CONTROL_ARB_PRIORITY {
+       DP_AUX_ARB_CONTROL_ARB_PRIORITY__GTC_LS_SW       = 0x0,
+       DP_AUX_ARB_CONTROL_ARB_PRIORITY__LS_GTC_SW       = 0x1,
+       DP_AUX_ARB_CONTROL_ARB_PRIORITY__SW_LS_GTC       = 0x2,
+       DP_AUX_ARB_CONTROL_ARB_PRIORITY__SW_GTC_LS       = 0x3,
+} DP_AUX_ARB_CONTROL_ARB_PRIORITY;
+typedef enum DP_AUX_ARB_CONTROL_USE_AUX_REG_REQ {
+       DP_AUX_ARB_CONTROL__NOT_USE_AUX_REG_REQ          = 0x0,
+       DP_AUX_ARB_CONTROL__USE_AUX_REG_REQ              = 0x1,
+} DP_AUX_ARB_CONTROL_USE_AUX_REG_REQ;
+typedef enum DP_AUX_ARB_CONTROL_DONE_USING_AUX_REG {
+       DP_AUX_ARB_CONTROL__DONE_NOT_USING_AUX_REG       = 0x0,
+       DP_AUX_ARB_CONTROL__DONE_USING_AUX_REG           = 0x1,
+} DP_AUX_ARB_CONTROL_DONE_USING_AUX_REG;
+typedef enum DP_AUX_INT_ACK {
+       DP_AUX_INT__NOT_ACK                              = 0x0,
+       DP_AUX_INT__ACK                                  = 0x1,
+} DP_AUX_INT_ACK;
+typedef enum DP_AUX_LS_UPDATE_ACK {
+       DP_AUX_INT_LS_UPDATE_NOT_ACK                     = 0x0,
+       DP_AUX_INT_LS_UPDATE_ACK                         = 0x1,
+} DP_AUX_LS_UPDATE_ACK;
+typedef enum DP_AUX_DPHY_TX_REF_CONTROL_TX_REF_SEL {
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_REF_SEL__DIVIDED_SYM_CLK= 0x0,
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_REF_SEL__FROM_DCCG_MICROSECOND_REF= 0x1,
+} DP_AUX_DPHY_TX_REF_CONTROL_TX_REF_SEL;
+typedef enum DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE {
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE__1MHZ         = 0x0,
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE__2MHZ         = 0x1,
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE__4MHZ         = 0x2,
+       DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE__8MHZ         = 0x3,
+} DP_AUX_DPHY_TX_REF_CONTROL_TX_RATE;
+typedef enum DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN {
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__0US        = 0x0,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__8US        = 0x1,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__16US       = 0x2,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__24US       = 0x3,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__32US       = 0x4,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__40US       = 0x5,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__48US       = 0x6,
+       DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN__56US       = 0x7,
+} DP_AUX_DPHY_TX_CONTROL_PRECHARGE_LEN;
+typedef enum DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY {
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__0   = 0x0,
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__16US= 0x1,
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__32US= 0x2,
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__64US= 0x3,
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__128US= 0x4,
+       DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY__256US= 0x5,
+} DP_AUX_DPHY_TX_CONTROL_MODE_DET_CHECK_DELAY;
+typedef enum DP_AUX_DPHY_RX_CONTROL_START_WINDOW {
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO2_PERIOD = 0x0,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO4_PERIOD = 0x1,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO8_PERIOD = 0x2,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO16_PERIOD= 0x3,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO32_PERIOD= 0x4,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO64_PERIOD= 0x5,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO128_PERIOD= 0x6,
+       DP_AUX_DPHY_RX_CONTROL_START_WINDOW__1TO256_PERIOD= 0x7,
+} DP_AUX_DPHY_RX_CONTROL_START_WINDOW;
+typedef enum DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW {
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO2_PERIOD= 0x0,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO4_PERIOD= 0x1,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO8_PERIOD= 0x2,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO16_PERIOD= 0x3,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO32_PERIOD= 0x4,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO64_PERIOD= 0x5,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO128_PERIOD= 0x6,
+       DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW__1TO256_PERIOD= 0x7,
+} DP_AUX_DPHY_RX_CONTROL_RECEIVE_WINDOW;
+typedef enum DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN {
+       DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN__6_EDGES= 0x0,
+       DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN__10_EDGES= 0x1,
+       DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN__18_EDGES= 0x2,
+       DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN__RESERVED= 0x3,
+} DP_AUX_DPHY_RX_CONTROL_HALF_SYM_DETECT_LEN;
+typedef enum DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_PHASE_DETECT {
+       DP_AUX_DPHY_RX_CONTROL__NOT_ALLOW_BELOW_THRESHOLD_PHASE_DETECT= 0x0,
+       DP_AUX_DPHY_RX_CONTROL__ALLOW_BELOW_THRESHOLD_PHASE_DETECT= 0x1,
+} DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_PHASE_DETECT;
+typedef enum DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_START {
+       DP_AUX_DPHY_RX_CONTROL__NOT_ALLOW_BELOW_THRESHOLD_START= 0x0,
+       DP_AUX_DPHY_RX_CONTROL__ALLOW_BELOW_THRESHOLD_START= 0x1,
+} DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_START;
+typedef enum DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_STOP {
+       DP_AUX_DPHY_RX_CONTROL__NOT_ALLOW_BELOW_THRESHOLD_STOP= 0x0,
+       DP_AUX_DPHY_RX_CONTROL__ALLOW_BELOW_THRESHOLD_STOP= 0x1,
+} DP_AUX_DPHY_RX_CONTROL_ALLOW_BELOW_THRESHOLD_STOP;
+typedef enum DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN {
+       DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN__2_HALF_SYMBOLS= 0x0,
+       DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN__4_HALF_SYMBOLS= 0x1,
+       DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN__6_HALF_SYMBOLS= 0x2,
+       DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN__8_HALF_SYMBOLS= 0x3,
+} DP_AUX_DPHY_RX_CONTROL_PHASE_DETECT_LEN;
+typedef enum DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN {
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_450US         = 0x0,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_500US         = 0x1,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_550US         = 0x2,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_600US         = 0x3,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_650US         = 0x4,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_700US         = 0x5,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_750US         = 0x6,
+       DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN_800US         = 0x7,
+} DP_AUX_DPHY_RX_CONTROL_TIMEOUT_LEN;
+typedef enum DP_AUX_DPHY_RX_DETECTION_THRESHOLD {
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__1to2         = 0x0,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__3to4         = 0x1,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__7to8         = 0x2,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__15to16       = 0x3,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__31to32       = 0x4,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__63to64       = 0x5,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__127to128     = 0x6,
+       DP_AUX_DPHY_RX_DETECTION_THRESHOLD__255to256     = 0x7,
+} DP_AUX_DPHY_RX_DETECTION_THRESHOLD;
+typedef enum DP_AUX_GTC_SYNC_CONTROL_GTC_SYNC_BLOCK_REQ {
+       DP_AUX_GTC_SYNC_CONTROL_GTC_SYNC_ALLOW_REQ_FROM_OTHER_AUX= 0x0,
+       DP_AUX_GTC_SYNC_CONTROL_GTC_SYNC_BLOCK_REQ_FROM_OTHER_AUX= 0x1,
+} DP_AUX_GTC_SYNC_CONTROL_GTC_SYNC_BLOCK_REQ;
+typedef enum DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW {
+       DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW__300US= 0x0,
+       DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW__400US= 0x1,
+       DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW__500US= 0x2,
+       DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW__600US= 0x3,
+} DP_AUX_GTC_SYNC_CONTROL_INTERVAL_RESET_WINDOW;
+typedef enum DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT {
+       DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT__4_ATTAMPS= 0x0,
+       DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT__8_ATTAMPS= 0x1,
+       DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT__16_ATTAMPS= 0x2,
+       DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT__RESERVED= 0x3,
+} DP_AUX_GTC_SYNC_CONTROL_OFFSET_CALC_MAX_ATTEMPT;
+typedef enum DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN {
+       DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN__0= 0x0,
+       DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN__64= 0x1,
+       DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN__128= 0x2,
+       DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN__256= 0x3,
+} DP_AUX_GTC_SYNC_ERROR_CONTROL_LOCK_ACQ_TIMEOUT_LEN;
+typedef enum DP_AUX_ERR_OCCURRED_ACK {
+       DP_AUX_ERR_OCCURRED__NOT_ACK                     = 0x0,
+       DP_AUX_ERR_OCCURRED__ACK                         = 0x1,
+} DP_AUX_ERR_OCCURRED_ACK;
+typedef enum DP_AUX_POTENTIAL_ERR_REACHED_ACK {
+       DP_AUX_POTENTIAL_ERR_REACHED__NOT_ACK            = 0x0,
+       DP_AUX_POTENTIAL_ERR_REACHED__ACK                = 0x1,
+} DP_AUX_POTENTIAL_ERR_REACHED_ACK;
+typedef enum DP_AUX_DEFINITE_ERR_REACHED_ACK {
+       ALPHA_DP_AUX_DEFINITE_ERR_REACHED_NOT_ACK        = 0x0,
+       ALPHA_DP_AUX_DEFINITE_ERR_REACHED_ACK            = 0x1,
+} DP_AUX_DEFINITE_ERR_REACHED_ACK;
+typedef enum DP_AUX_RESET {
+       DP_AUX_RESET_DEASSERTED                          = 0x0,
+       DP_AUX_RESET_ASSERTED                            = 0x1,
+} DP_AUX_RESET;
+typedef enum DP_AUX_RESET_DONE {
+       DP_AUX_RESET_SEQUENCE_NOT_DONE                   = 0x0,
+       DP_AUX_RESET_SEQUENCE_DONE                       = 0x1,
+} DP_AUX_RESET_DONE;
+typedef enum FBC_IDLE_MASK_MASK_BITS {
+       FBC_IDLE_MASK_DISP_REG_UPDATE                    = 0x0,
+       FBC_IDLE_MASK_RESERVED1                          = 0x1,
+       FBC_IDLE_MASK_FBC_GRPH_COMP_EN                   = 0x2,
+       FBC_IDLE_MASK_FBC_MIN_COMPRESSION                = 0x3,
+       FBC_IDLE_MASK_FBC_ALPHA_COMP_EN                  = 0x4,
+       FBC_IDLE_MASK_FBC_ZERO_ALPHA_CHUNK_SKIP_EN       = 0x5,
+       FBC_IDLE_MASK_FBC_FORCE_COPY_TO_COMP_BUF         = 0x6,
+       FBC_IDLE_MASK_RESERVED7                          = 0x7,
+       FBC_IDLE_MASK_RESERVED8                          = 0x8,
+       FBC_IDLE_MASK_RESERVED9                          = 0x9,
+       FBC_IDLE_MASK_RESERVED10                         = 0xa,
+       FBC_IDLE_MASK_RESERVED11                         = 0xb,
+       FBC_IDLE_MASK_RESERVED12                         = 0xc,
+       FBC_IDLE_MASK_RESERVED13                         = 0xd,
+       FBC_IDLE_MASK_RESERVED14                         = 0xe,
+       FBC_IDLE_MASK_RESERVED15                         = 0xf,
+       FBC_IDLE_MASK_RESERVED16                         = 0x10,
+       FBC_IDLE_MASK_RESERVED17                         = 0x11,
+       FBC_IDLE_MASK_RESERVED18                         = 0x12,
+       FBC_IDLE_MASK_RESERVED19                         = 0x13,
+       FBC_IDLE_MASK_RESERVED20                         = 0x14,
+       FBC_IDLE_MASK_RESERVED21                         = 0x15,
+       FBC_IDLE_MASK_RESERVED22                         = 0x16,
+       FBC_IDLE_MASK_RESERVED23                         = 0x17,
+       FBC_IDLE_MASK_MC_HIT_REGION_0                    = 0x18,
+       FBC_IDLE_MASK_MC_HIT_REGION_1                    = 0x19,
+       FBC_IDLE_MASK_MC_HIT_REGION_2                    = 0x1a,
+       FBC_IDLE_MASK_MC_HIT_REGION_3                    = 0x1b,
+       FBC_IDLE_MASK_MC_WRITE                           = 0x1c,
+       FBC_IDLE_MASK_CG_STATIC_SCREEN                   = 0x1d,
+       FBC_IDLE_MASK_RESERVED30                         = 0x1e,
+       FBC_IDLE_MASK_RESERVED31                         = 0x1f,
+} FBC_IDLE_MASK_MASK_BITS;
+typedef enum FMT_CONTROL_PIXEL_ENCODING {
+       FMT_CONTROL_PIXEL_ENCODING_RGB444_OR_YCBCR444    = 0x0,
+       FMT_CONTROL_PIXEL_ENCODING_YCBCR422              = 0x1,
+       FMT_CONTROL_PIXEL_ENCODING_YCBCR420              = 0x2,
+       FMT_CONTROL_PIXEL_ENCODING_RESERVED              = 0x3,
+} FMT_CONTROL_PIXEL_ENCODING;
+typedef enum FMT_CONTROL_SUBSAMPLING_MODE {
+       FMT_CONTROL_SUBSAMPLING_MODE_DROP                = 0x0,
+       FMT_CONTROL_SUBSAMPLING_MODE_AVERAGE             = 0x1,
+       FMT_CONTROL_SUBSAMPLING_MODE_3_TAP               = 0x2,
+       FMT_CONTROL_SUBSAMPLING_MODE_RESERVED            = 0x3,
+} FMT_CONTROL_SUBSAMPLING_MODE;
+typedef enum FMT_CONTROL_SUBSAMPLING_ORDER {
+       FMT_CONTROL_SUBSAMPLING_ORDER_CB_BEFORE_CR       = 0x0,
+       FMT_CONTROL_SUBSAMPLING_ORDER_CR_BEFORE_CB       = 0x1,
+} FMT_CONTROL_SUBSAMPLING_ORDER;
+typedef enum FMT_CONTROL_CBCR_BIT_REDUCTION_BYPASS {
+       FMT_CONTROL_CBCR_BIT_REDUCTION_BYPASS_DISABLE    = 0x0,
+       FMT_CONTROL_CBCR_BIT_REDUCTION_BYPASS_ENABLE     = 0x1,
+} FMT_CONTROL_CBCR_BIT_REDUCTION_BYPASS;
+typedef enum FMT_BIT_DEPTH_CONTROL_TRUNCATE_MODE {
+       FMT_BIT_DEPTH_CONTROL_TRUNCATE_MODE_TRUNCATION   = 0x0,
+       FMT_BIT_DEPTH_CONTROL_TRUNCATE_MODE_ROUNDING     = 0x1,
+} FMT_BIT_DEPTH_CONTROL_TRUNCATE_MODE;
+typedef enum FMT_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH {
+       FMT_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH_18BPP       = 0x0,
+       FMT_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH_24BPP       = 0x1,
+       FMT_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH_30BPP       = 0x2,
+} FMT_BIT_DEPTH_CONTROL_TRUNCATE_DEPTH;
+typedef enum FMT_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH {
+       FMT_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH_18BPP = 0x0,
+       FMT_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH_24BPP = 0x1,
+       FMT_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH_30BPP = 0x2,
+} FMT_BIT_DEPTH_CONTROL_SPATIAL_DITHER_DEPTH;
+typedef enum FMT_BIT_DEPTH_CONTROL_TEMPORAL_DITHER_DEPTH {
+       FMT_BIT_DEPTH_CONTROL_TEMPORAL_DITHER_DEPTH_18BPP= 0x0,
+       FMT_BIT_DEPTH_CONTROL_TEMPORAL_DITHER_DEPTH_24BPP= 0x1,
+       FMT_BIT_DEPTH_CONTROL_TEMPORAL_DITHER_DEPTH_30BPP= 0x2,
+} FMT_BIT_DEPTH_CONTROL_TEMPORAL_DITHER_DEPTH;
+typedef enum FMT_BIT_DEPTH_CONTROL_TEMPORAL_LEVEL {
+       FMT_BIT_DEPTH_CONTROL_TEMPORAL_LEVEL_GREY_LEVEL2 = 0x0,
+       FMT_BIT_DEPTH_CONTROL_TEMPORAL_LEVEL_GREY_LEVEL4 = 0x1,
+} FMT_BIT_DEPTH_CONTROL_TEMPORAL_LEVEL;
+typedef enum FMT_BIT_DEPTH_CONTROL_25FRC_SEL {
+       FMT_BIT_DEPTH_CONTROL_25FRC_SEL_Ei               = 0x0,
+       FMT_BIT_DEPTH_CONTROL_25FRC_SEL_Fi               = 0x1,
+       FMT_BIT_DEPTH_CONTROL_25FRC_SEL_Gi               = 0x2,
+       FMT_BIT_DEPTH_CONTROL_25FRC_SEL_RESERVED         = 0x3,
+} FMT_BIT_DEPTH_CONTROL_25FRC_SEL;
+typedef enum FMT_BIT_DEPTH_CONTROL_50FRC_SEL {
+       FMT_BIT_DEPTH_CONTROL_50FRC_SEL_A                = 0x0,
+       FMT_BIT_DEPTH_CONTROL_50FRC_SEL_B                = 0x1,
+       FMT_BIT_DEPTH_CONTROL_50FRC_SEL_C                = 0x2,
+       FMT_BIT_DEPTH_CONTROL_50FRC_SEL_D                = 0x3,
+} FMT_BIT_DEPTH_CONTROL_50FRC_SEL;
+typedef enum FMT_BIT_DEPTH_CONTROL_75FRC_SEL {
+       FMT_BIT_DEPTH_CONTROL_75FRC_SEL_E                = 0x0,
+       FMT_BIT_DEPTH_CONTROL_75FRC_SEL_F                = 0x1,
+       FMT_BIT_DEPTH_CONTROL_75FRC_SEL_G                = 0x2,
+       FMT_BIT_DEPTH_CONTROL_75FRC_SEL_RESERVED         = 0x3,
+} FMT_BIT_DEPTH_CONTROL_75FRC_SEL;
+typedef enum FMT_TEMPORAL_DITHER_PATTERN_CONTROL_SELECT {
+       FMT_TEMPORAL_DITHER_PATTERN_CONTROL_SELECT_LEGACY_HARDCODED_PATTERN= 0x0,
+       FMT_TEMPORAL_DITHER_PATTERN_CONTROL_SELECT_PROGRAMMABLE_PATTERN= 0x1,
+} FMT_TEMPORAL_DITHER_PATTERN_CONTROL_SELECT;
+typedef enum FMT_TEMPORAL_DITHER_PATTERN_CONTROL_RGB1_BGR0 {
+       FMT_TEMPORAL_DITHER_PATTERN_CONTROL_RGB1_BGR0_BGR= 0x0,
+       FMT_TEMPORAL_DITHER_PATTERN_CONTROL_RGB1_BGR0_RGB= 0x1,
+} FMT_TEMPORAL_DITHER_PATTERN_CONTROL_RGB1_BGR0;
+typedef enum FMT_CLAMP_CNTL_COLOR_FORMAT {
+       FMT_CLAMP_CNTL_COLOR_FORMAT_6BPC                 = 0x0,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_8BPC                 = 0x1,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_10BPC                = 0x2,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_12BPC                = 0x3,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_RESERVED1            = 0x4,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_RESERVED2            = 0x5,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_RESERVED3            = 0x6,
+       FMT_CLAMP_CNTL_COLOR_FORMAT_PROGRAMMABLE         = 0x7,
+} FMT_CLAMP_CNTL_COLOR_FORMAT;
+typedef enum FMT_CRC_CNTL_CONT_EN {
+       FMT_CRC_CNTL_CONT_EN_ONE_SHOT                    = 0x0,
+       FMT_CRC_CNTL_CONT_EN_CONT                        = 0x1,
+} FMT_CRC_CNTL_CONT_EN;
+typedef enum FMT_CRC_CNTL_INCLUDE_OVERSCAN {
+       FMT_CRC_CNTL_INCLUDE_OVERSCAN_NOT_INCLUDE        = 0x0,
+       FMT_CRC_CNTL_INCLUDE_OVERSCAN_INCLUDE            = 0x1,
+} FMT_CRC_CNTL_INCLUDE_OVERSCAN;
+typedef enum FMT_CRC_CNTL_ONLY_BLANKB {
+       FMT_CRC_CNTL_ONLY_BLANKB_ENTIRE_FIELD            = 0x0,
+       FMT_CRC_CNTL_ONLY_BLANKB_NON_BLANK               = 0x1,
+} FMT_CRC_CNTL_ONLY_BLANKB;
+typedef enum FMT_CRC_CNTL_PSR_MODE_ENABLE {
+       FMT_CRC_CNTL_PSR_MODE_ENABLE_NORMAL              = 0x0,
+       FMT_CRC_CNTL_PSR_MODE_ENABLE_EDP_PSR_CRC         = 0x1,
+} FMT_CRC_CNTL_PSR_MODE_ENABLE;
+typedef enum FMT_CRC_CNTL_INTERLACE_MODE {
+       FMT_CRC_CNTL_INTERLACE_MODE_TOP                  = 0x0,
+       FMT_CRC_CNTL_INTERLACE_MODE_BOTTOM               = 0x1,
+       FMT_CRC_CNTL_INTERLACE_MODE_BOTH_BOTTOM          = 0x2,
+       FMT_CRC_CNTL_INTERLACE_MODE_BOTH_EACH            = 0x3,
+} FMT_CRC_CNTL_INTERLACE_MODE;
+typedef enum FMT_CRC_CNTL_EVEN_ODD_PIX_ENABLE {
+       FMT_CRC_CNTL_EVEN_ODD_PIX_ENABLE_ALL             = 0x0,
+       FMT_CRC_CNTL_EVEN_ODD_PIX_ENABLE_ODD_EVEN        = 0x1,
+} FMT_CRC_CNTL_EVEN_ODD_PIX_ENABLE;
+typedef enum FMT_CRC_CNTL_EVEN_ODD_PIX_SELECT {
+       FMT_CRC_CNTL_EVEN_ODD_PIX_SELECT_EVEN            = 0x0,
+       FMT_CRC_CNTL_EVEN_ODD_PIX_SELECT_ODD             = 0x1,
+} FMT_CRC_CNTL_EVEN_ODD_PIX_SELECT;
+typedef enum FMT_DEBUG_CNTL_COLOR_SELECT {
+       FMT_DEBUG_CNTL_COLOR_SELECT_BLUE                 = 0x0,
+       FMT_DEBUG_CNTL_COLOR_SELECT_GREEN                = 0x1,
+       FMT_DEBUG_CNTL_COLOR_SELECT_RED1                 = 0x2,
+       FMT_DEBUG_CNTL_COLOR_SELECT_RED2                 = 0x3,
+} FMT_DEBUG_CNTL_COLOR_SELECT;
+typedef enum FMT_SPATIAL_DITHER_MODE {
+       FMT_SPATIAL_DITHER_MODE_0                        = 0x0,
+       FMT_SPATIAL_DITHER_MODE_1                        = 0x1,
+       FMT_SPATIAL_DITHER_MODE_2                        = 0x2,
+       FMT_SPATIAL_DITHER_MODE_3                        = 0x3,
+} FMT_SPATIAL_DITHER_MODE;
+typedef enum FMT_STEREOSYNC_OVR_POL {
+       FMT_STEREOSYNC_OVR_POL_INVERTED                  = 0x0,
+       FMT_STEREOSYNC_OVR_POL_NOT_INVERTED              = 0x1,
+} FMT_STEREOSYNC_OVR_POL;
+typedef enum FMT_DYNAMIC_EXP_MODE {
+       FMT_DYNAMIC_EXP_MODE_10to12                      = 0x0,
+       FMT_DYNAMIC_EXP_MODE_8to12                       = 0x1,
+} FMT_DYNAMIC_EXP_MODE;
+typedef enum LB_DATA_FORMAT_PIXEL_DEPTH {
+       LB_DATA_FORMAT_PIXEL_DEPTH_30BPP                 = 0x0,
+       LB_DATA_FORMAT_PIXEL_DEPTH_24BPP                 = 0x1,
+       LB_DATA_FORMAT_PIXEL_DEPTH_18BPP                 = 0x2,
+       LB_DATA_FORMAT_PIXEL_DEPTH_36BPP                 = 0x3,
+} LB_DATA_FORMAT_PIXEL_DEPTH;
+typedef enum LB_DATA_FORMAT_PIXEL_EXPAN_MODE {
+       LB_DATA_FORMAT_PIXEL_EXPAN_MODE_ZERO_PIXEL_EXPANSION= 0x0,
+       LB_DATA_FORMAT_PIXEL_EXPAN_MODE_DYNAMIC_PIXEL_EXPANSION= 0x1,
+} LB_DATA_FORMAT_PIXEL_EXPAN_MODE;
+typedef enum LB_DATA_FORMAT_PIXEL_REDUCE_MODE {
+       LB_DATA_FORMAT_PIXEL_REDUCE_MODE_TRUNCATION      = 0x0,
+       LB_DATA_FORMAT_PIXEL_REDUCE_MODE_ROUNDING        = 0x1,
+} LB_DATA_FORMAT_PIXEL_REDUCE_MODE;
+typedef enum LB_DATA_FORMAT_DYNAMIC_PIXEL_DEPTH {
+       LB_DATA_FORMAT_DYNAMIC_PIXEL_DEPTH_36BPP         = 0x0,
+       LB_DATA_FORMAT_DYNAMIC_PIXEL_DEPTH_30BPP         = 0x1,
+} LB_DATA_FORMAT_DYNAMIC_PIXEL_DEPTH;
+typedef enum LB_DATA_FORMAT_INTERLEAVE_EN {
+       LB_DATA_FORMAT_INTERLEAVE_DISABLE                = 0x0,
+       LB_DATA_FORMAT_INTERLEAVE_ENABLE                 = 0x1,
+} LB_DATA_FORMAT_INTERLEAVE_EN;
+typedef enum LB_DATA_FORMAT_PREFILL_EN {
+       LB_DATA_FORMAT_PREFILL_DISABLE                   = 0x0,
+       LB_DATA_FORMAT_PREFILL_ENABLE                    = 0x1,
+} LB_DATA_FORMAT_PREFILL_EN;
+typedef enum LB_DATA_FORMAT_REQUEST_MODE {
+       LB_DATA_FORMAT_REQUEST_MODE_NORMAL               = 0x0,
+       LB_DATA_FORMAT_REQUEST_MODE_START_OF_LINE        = 0x1,
+} LB_DATA_FORMAT_REQUEST_MODE;
+typedef enum LB_DATA_FORMAT_ALPHA_EN {
+       LB_DATA_FORMAT_ALPHA_DISABLE                     = 0x0,
+       LB_DATA_FORMAT_ALPHA_ENABLE                      = 0x1,
+} LB_DATA_FORMAT_ALPHA_EN;
+typedef enum LB_VLINE_START_END_VLINE_INV {
+       LB_VLINE_START_END_VLINE_NORMAL                  = 0x0,
+       LB_VLINE_START_END_VLINE_INVERSE                 = 0x1,
+} LB_VLINE_START_END_VLINE_INV;
+typedef enum LB_VLINE2_START_END_VLINE2_INV {
+       LB_VLINE2_START_END_VLINE2_NORMAL                = 0x0,
+       LB_VLINE2_START_END_VLINE2_INVERSE               = 0x1,
+} LB_VLINE2_START_END_VLINE2_INV;
+typedef enum LB_INTERRUPT_MASK_VBLANK_INTERRUPT_MASK {
+       LB_INTERRUPT_MASK_VBLANK_INTERRUPT_DISABLE       = 0x0,
+       LB_INTERRUPT_MASK_VBLANK_INTERRUPT_ENABLE        = 0x1,
+} LB_INTERRUPT_MASK_VBLANK_INTERRUPT_MASK;
+typedef enum LB_INTERRUPT_MASK_VLINE_INTERRUPT_MASK {
+       LB_INTERRUPT_MASK_VLINE_INTERRUPT_DISABLE        = 0x0,
+       LB_INTERRUPT_MASK_VLINE_INTERRUPT_ENABLE         = 0x1,
+} LB_INTERRUPT_MASK_VLINE_INTERRUPT_MASK;
+typedef enum LB_INTERRUPT_MASK_VLINE2_INTERRUPT_MASK {
+       LB_INTERRUPT_MASK_VLINE2_INTERRUPT_DISABLE       = 0x0,
+       LB_INTERRUPT_MASK_VLINE2_INTERRUPT_ENABLE        = 0x1,
+} LB_INTERRUPT_MASK_VLINE2_INTERRUPT_MASK;
+typedef enum LB_VLINE_STATUS_VLINE_ACK {
+       LB_VLINE_STATUS_VLINE_NORMAL                     = 0x0,
+       LB_VLINE_STATUS_VLINE_CLEAR                      = 0x1,
+} LB_VLINE_STATUS_VLINE_ACK;
+typedef enum LB_VLINE_STATUS_VLINE_INTERRUPT_TYPE {
+       LB_VLINE_STATUS_VLINE_INTERRUPT_TYPE_LEVEL_BASED = 0x0,
+       LB_VLINE_STATUS_VLINE_INTERRUPT_TYPE_PULSE_BASED = 0x1,
+} LB_VLINE_STATUS_VLINE_INTERRUPT_TYPE;
+typedef enum LB_VLINE2_STATUS_VLINE2_ACK {
+       LB_VLINE2_STATUS_VLINE2_NORMAL                   = 0x0,
+       LB_VLINE2_STATUS_VLINE2_CLEAR                    = 0x1,
+} LB_VLINE2_STATUS_VLINE2_ACK;
+typedef enum LB_VLINE2_STATUS_VLINE2_INTERRUPT_TYPE {
+       LB_VLINE2_STATUS_VLINE2_INTERRUPT_TYPE_LEVEL_BASED= 0x0,
+       LB_VLINE2_STATUS_VLINE2_INTERRUPT_TYPE_PULSE_BASED= 0x1,
+} LB_VLINE2_STATUS_VLINE2_INTERRUPT_TYPE;
+typedef enum LB_VBLANK_STATUS_VBLANK_ACK {
+       LB_VBLANK_STATUS_VBLANK_NORMAL                   = 0x0,
+       LB_VBLANK_STATUS_VBLANK_CLEAR                    = 0x1,
+} LB_VBLANK_STATUS_VBLANK_ACK;
+typedef enum LB_VBLANK_STATUS_VBLANK_INTERRUPT_TYPE {
+       LB_VBLANK_STATUS_VBLANK_INTERRUPT_TYPE_LEVEL_BASED= 0x0,
+       LB_VBLANK_STATUS_VBLANK_INTERRUPT_TYPE_PULSE_BASED= 0x1,
+} LB_VBLANK_STATUS_VBLANK_INTERRUPT_TYPE;
+typedef enum LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL {
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL_DISABLE      = 0x0,
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL_FROM_VSYNC_VBLANK= 0x1,
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL_FROM_POWERDOWN_RESET= 0x2,
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL_FROM_VSYNC_VBLANK_POWERDOWN_RESET= 0x3,
+} LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL;
+typedef enum LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL2 {
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL2_USE_VBLANK  = 0x0,
+       LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL2_USE_VSYNC   = 0x1,
+} LB_SYNC_RESET_SEL_LB_SYNC_RESET_SEL2;
+typedef enum LB_SYNC_RESET_SEL_LB_SYNC_DURATION {
+       LB_SYNC_RESET_SEL_LB_SYNC_DURATION_16_CLOCKS     = 0x0,
+       LB_SYNC_RESET_SEL_LB_SYNC_DURATION_32_CLOCKS     = 0x1,
+       LB_SYNC_RESET_SEL_LB_SYNC_DURATION_64_CLOCKS     = 0x2,
+       LB_SYNC_RESET_SEL_LB_SYNC_DURATION_128_CLOCKS    = 0x3,
+} LB_SYNC_RESET_SEL_LB_SYNC_DURATION;
+typedef enum LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_EN {
+       LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_DISABLE       = 0x0,
+       LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_ENABLE        = 0x1,
+} LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_EN;
+typedef enum LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_REP_EN {
+       LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_REPLACEMENT_DISABLE= 0x0,
+       LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_REPLACEMENT_ENABLE= 0x1,
+} LB_KEYER_COLOR_CTRL_LB_KEYER_COLOR_REP_EN;
+typedef enum LB_BUFFER_STATUS_LB_BUFFER_EMPTY_ACK {
+       LB_BUFFER_STATUS_LB_BUFFER_EMPTY_NORMAL          = 0x0,
+       LB_BUFFER_STATUS_LB_BUFFER_EMPTY_RESET           = 0x1,
+} LB_BUFFER_STATUS_LB_BUFFER_EMPTY_ACK;
+typedef enum LB_BUFFER_STATUS_LB_BUFFER_FULL_ACK {
+       LB_BUFFER_STATUS_LB_BUFFER_FULL_NORMAL           = 0x0,
+       LB_BUFFER_STATUS_LB_BUFFER_FULL_RESET            = 0x1,
+} LB_BUFFER_STATUS_LB_BUFFER_FULL_ACK;
+typedef enum LB_MVP_AFR_FLIP_MODE_MVP_AFR_FLIP_MODE {
+       LB_MVP_AFR_FLIP_MODE_MVP_AFR_FLIP_MODE_REAL_FLIP = 0x2,
+       LB_MVP_AFR_FLIP_MODE_MVP_AFR_FLIP_MODE_DUMMY_FLIP= 0x3,
+} LB_MVP_AFR_FLIP_MODE_MVP_AFR_FLIP_MODE;
+typedef enum LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET {
+       LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_NORMAL= 0x0,
+       LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET_ACTIVE= 0x1,
+} LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET;
+typedef enum LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET_ACK {
+       LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET_ACK_NOT_USED0= 0x0,
+       LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET_ACK_NOT_USED1= 0x1,
+} LB_MVP_AFR_FLIP_FIFO_CNTL_MVP_AFR_FLIP_FIFO_RESET_ACK;
+typedef enum LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_LINE_NUM_INSERT_MODE {
+       LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_LINE_NUM_INSERT_MODE_NO_INSERT= 0x0,
+       LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_LINE_NUM_INSERT_MODE_DEBUG= 0x1,
+       LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_LINE_NUM_INSERT_MODE_HSYNC_MODE= 0x2,
+} LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_LINE_NUM_INSERT_MODE;
+typedef enum LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_AUTO_ENABLE {
+       LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_AUTO_DISABLE= 0x0,
+       LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_AUTO_EN     = 0x1,
+} LB_MVP_FLIP_LINE_NUM_INSERT_MVP_FLIP_AUTO_ENABLE;
+typedef enum LB_DC_MVP_LB_CONTROL_MVP_SWAP_LOCK_IN_MODE {
+       ALPHA_LB_DC_MVP_LB_CONTROL_MVP_SWAP_LOCK_IN_MODE_MASTER= 0x1,
+       ALPHA_LB_DC_MVP_LB_CONTROL_MVP_SWAP_LOCK_IN_MODE_SLAVE= 0x2,
+} LB_DC_MVP_LB_CONTROL_MVP_SWAP_LOCK_IN_MODE;
+typedef enum LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_SEL {
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_SEL_NOT_USED0= 0x0,
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_SEL_NOT_USED1= 0x1,
+} LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_SEL;
+typedef enum LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_ONE {
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_NO_FORCE_ONE= 0x0,
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_TO_ONE= 0x1,
+} LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_ONE;
+typedef enum LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_ZERO {
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_NO_FORCE_ZERO= 0x0,
+       LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_TO_ZERO= 0x1,
+} LB_DC_MVP_LB_CONTROL_DC_MVP_SWAP_LOCK_OUT_FORCE_ZERO;
+typedef enum LB_TEST_DEBUG_INDEX_LB_TEST_DEBUG_WRITE_EN {
+       LB_TEST_DEBUG_INDEX_LB_TEST_DEBUG_WRITE_EN_NOT_USED0= 0x0,
+       LB_TEST_DEBUG_INDEX_LB_TEST_DEBUG_WRITE_EN_NOT_USED1= 0x1,
+} LB_TEST_DEBUG_INDEX_LB_TEST_DEBUG_WRITE_EN;
+typedef enum LBV_PIXEL_DEPTH {
+       PIXEL_DEPTH_30BPP                                = 0x0,
+       PIXEL_DEPTH_24BPP                                = 0x1,
+       PIXEL_DEPTH_18BPP                                = 0x2,
+       PIXEL_DEPTH_38BPP                                = 0x3,
+} LBV_PIXEL_DEPTH;
+typedef enum LBV_PIXEL_EXPAN_MODE {
+       PIXEL_EXPAN_MODE_ZERO_EXP                        = 0x0,
+       PIXEL_EXPAN_MODE_DYN_EXP                         = 0x1,
+} LBV_PIXEL_EXPAN_MODE;
+typedef enum LBV_INTERLEAVE_EN {
+       INTERLEAVE_DIS                                   = 0x0,
+       INTERLEAVE_EN                                    = 0x1,
+} LBV_INTERLEAVE_EN;
+typedef enum LBV_PIXEL_REDUCE_MODE {
+       PIXEL_REDUCE_MODE_TRUNCATION                     = 0x0,
+       PIXEL_REDUCE_MODE_ROUNDING                       = 0x1,
+} LBV_PIXEL_REDUCE_MODE;
+typedef enum LBV_DYNAMIC_PIXEL_DEPTH {
+       DYNAMIC_PIXEL_DEPTH_36BPP                        = 0x0,
+       DYNAMIC_PIXEL_DEPTH_30BPP                        = 0x1,
+} LBV_DYNAMIC_PIXEL_DEPTH;
+typedef enum LBV_DITHER_EN {
+       DITHER_DIS                                       = 0x0,
+       DITHER_EN                                        = 0x1,
+} LBV_DITHER_EN;
+typedef enum LBV_DOWNSCALE_PREFETCH_EN {
+       DOWNSCALE_PREFETCH_DIS                           = 0x0,
+       DOWNSCALE_PREFETCH_EN                            = 0x1,
+} LBV_DOWNSCALE_PREFETCH_EN;
+typedef enum LBV_MEMORY_CONFIG {
+       MEMORY_CONFIG_0                                  = 0x0,
+       MEMORY_CONFIG_1                                  = 0x1,
+       MEMORY_CONFIG_2                                  = 0x2,
+       MEMORY_CONFIG_3                                  = 0x3,
+} LBV_MEMORY_CONFIG;
+typedef enum LBV_SYNC_RESET_SEL2 {
+       SYNC_RESET_SEL2_VBLANK                           = 0x0,
+       SYNC_RESET_SEL2_VSYNC                            = 0x1,
+} LBV_SYNC_RESET_SEL2;
+typedef enum LBV_SYNC_DURATION {
+       SYNC_DURATION_16                                 = 0x0,
+       SYNC_DURATION_32                                 = 0x1,
+       SYNC_DURATION_64                                 = 0x2,
+       SYNC_DURATION_128                                = 0x3,
+} LBV_SYNC_DURATION;
+typedef enum SCL_C_RAM_TAP_PAIR_IDX {
+       SCL_C_RAM_TAP_PAIR_ID0                           = 0x0,
+       SCL_C_RAM_TAP_PAIR_ID1                           = 0x1,
+       SCL_C_RAM_TAP_PAIR_ID2                           = 0x2,
+       SCL_C_RAM_TAP_PAIR_ID3                           = 0x3,
+       SCL_C_RAM_TAP_PAIR_ID4                           = 0x4,
+} SCL_C_RAM_TAP_PAIR_IDX;
+typedef enum SCL_C_RAM_PHASE {
+       SCL_C_RAM_PHASE_0                                = 0x0,
+       SCL_C_RAM_PHASE_1                                = 0x1,
+       SCL_C_RAM_PHASE_2                                = 0x2,
+       SCL_C_RAM_PHASE_3                                = 0x3,
+       SCL_C_RAM_PHASE_4                                = 0x4,
+       SCL_C_RAM_PHASE_5                                = 0x5,
+       SCL_C_RAM_PHASE_6                                = 0x6,
+       SCL_C_RAM_PHASE_7                                = 0x7,
+       SCL_C_RAM_PHASE_8                                = 0x8,
+} SCL_C_RAM_PHASE;
+typedef enum SCL_C_RAM_FILTER_TYPE {
+       SCL_C_RAM_FILTER_TYPE_VERT_LUMA_RGB_LUT          = 0x0,
+       SCL_C_RAM_FILTER_TYPE_VERT_CHROMA_LUT            = 0x1,
+       SCL_C_RAM_FILTER_TYPE_HORI_LUMA_RGB_LUT          = 0x2,
+       SCL_C_RAM_FILTER_TYPE_HORI_CHROMA_LUT            = 0x3,
+} SCL_C_RAM_FILTER_TYPE;
+typedef enum SCL_MODE_SEL {
+       SCL_MODE_RGB_BYPASS                              = 0x0,
+       SCL_MODE_RGB_SCALING                             = 0x1,
+       SCL_MODE_YCBCR_SCALING                           = 0x2,
+       SCL_MODE_YCBCR_BYPASS                            = 0x3,
+} SCL_MODE_SEL;
+typedef enum SCL_PSCL_EN {
+       SCL_PSCL_DISABLE                                 = 0x0,
+       SCL_PSCL_ENANBLE                                 = 0x1,
+} SCL_PSCL_EN;
+typedef enum SCL_V_NUM_OF_TAPS {
+       SCL_V_NUM_OF_TAPS_1                              = 0x0,
+       SCL_V_NUM_OF_TAPS_2                              = 0x1,
+       SCL_V_NUM_OF_TAPS_3                              = 0x2,
+       SCL_V_NUM_OF_TAPS_4                              = 0x3,
+       SCL_V_NUM_OF_TAPS_5                              = 0x4,
+       SCL_V_NUM_OF_TAPS_6                              = 0x5,
+} SCL_V_NUM_OF_TAPS;
+typedef enum SCL_H_NUM_OF_TAPS {
+       SCL_H_NUM_OF_TAPS_1                              = 0x0,
+       SCL_H_NUM_OF_TAPS_2                              = 0x1,
+       SCL_H_NUM_OF_TAPS_4                              = 0x3,
+       SCL_H_NUM_OF_TAPS_6                              = 0x5,
+       SCL_H_NUM_OF_TAPS_8                              = 0x7,
+       SCL_H_NUM_OF_TAPS_10                             = 0x9,
+} SCL_H_NUM_OF_TAPS;
+typedef enum SCL_BOUNDARY_MODE {
+       SCL_BOUNDARY_MODE_BLACK                          = 0x0,
+       SCL_BOUNDARY_MODE_EDGE                           = 0x1,
+} SCL_BOUNDARY_MODE;
+typedef enum SCL_EARLY_EOL_MOD {
+       SCL_EARLY_EOL_MODE_CRTC                          = 0x0,
+       SCL_EARLY_EOL_MODE_INTERNAL                      = 0x1,
+} SCL_EARLY_EOL_MOD;
+typedef enum SCL_BYPASS_MODE {
+       SCL_BYPASS_MODE_MC_MR                            = 0x0,
+       SCL_BYPASS_MODE_AC_NR                            = 0x1,
+       SCL_BYPASS_MODE_AC_AR                            = 0x2,
+       SCL_BYPASS_MODE_RESERVED                         = 0x3,
+} SCL_BYPASS_MODE;
+typedef enum SCL_V_MANUAL_REPLICATE_FACTOR {
+       SCL_V_MANUAL_REPLICATE_FACTOR_1                  = 0x0,
+       SCL_V_MANUAL_REPLICATE_FACTOR_2                  = 0x1,
+       SCL_V_MANUAL_REPLICATE_FACTOR_3                  = 0x2,
+       SCL_V_MANUAL_REPLICATE_FACTOR_4                  = 0x3,
+       SCL_V_MANUAL_REPLICATE_FACTOR_5                  = 0x4,
+       SCL_V_MANUAL_REPLICATE_FACTOR_6                  = 0x5,
+       SCL_V_MANUAL_REPLICATE_FACTOR_7                  = 0x6,
+       SCL_V_MANUAL_REPLICATE_FACTOR_8                  = 0x7,
+       SCL_V_MANUAL_REPLICATE_FACTOR_9                  = 0x8,
+       SCL_V_MANUAL_REPLICATE_FACTOR_10                 = 0x9,
+       SCL_V_MANUAL_REPLICATE_FACTOR_11                 = 0xa,
+       SCL_V_MANUAL_REPLICATE_FACTOR_12                 = 0xb,
+       SCL_V_MANUAL_REPLICATE_FACTOR_13                 = 0xc,
+       SCL_V_MANUAL_REPLICATE_FACTOR_14                 = 0xd,
+       SCL_V_MANUAL_REPLICATE_FACTOR_15                 = 0xe,
+       SCL_V_MANUAL_REPLICATE_FACTOR_16                 = 0xf,
+} SCL_V_MANUAL_REPLICATE_FACTOR;
+typedef enum SCL_H_MANUAL_REPLICATE_FACTOR {
+       SCL_H_MANUAL_REPLICATE_FACTOR_1                  = 0x0,
+       SCL_H_MANUAL_REPLICATE_FACTOR_2                  = 0x1,
+       SCL_H_MANUAL_REPLICATE_FACTOR_3                  = 0x2,
+       SCL_H_MANUAL_REPLICATE_FACTOR_4                  = 0x3,
+       SCL_H_MANUAL_REPLICATE_FACTOR_5                  = 0x4,
+       SCL_H_MANUAL_REPLICATE_FACTOR_6                  = 0x5,
+       SCL_H_MANUAL_REPLICATE_FACTOR_7                  = 0x6,
+       SCL_H_MANUAL_REPLICATE_FACTOR_8                  = 0x7,
+       SCL_H_MANUAL_REPLICATE_FACTOR_9                  = 0x8,
+       SCL_H_MANUAL_REPLICATE_FACTOR_10                 = 0x9,
+       SCL_H_MANUAL_REPLICATE_FACTOR_11                 = 0xa,
+       SCL_H_MANUAL_REPLICATE_FACTOR_12                 = 0xb,
+       SCL_H_MANUAL_REPLICATE_FACTOR_13                 = 0xc,
+       SCL_H_MANUAL_REPLICATE_FACTOR_14                 = 0xd,
+       SCL_H_MANUAL_REPLICATE_FACTOR_15                 = 0xe,
+       SCL_H_MANUAL_REPLICATE_FACTOR_16                 = 0xf,
+} SCL_H_MANUAL_REPLICATE_FACTOR;
+typedef enum SCL_V_CALC_AUTO_RATIO_EN {
+       SCL_V_CALC_AUTO_RATIO_DISABLE                    = 0x0,
+       SCL_V_CALC_AUTO_RATIO_ENABLE                     = 0x1,
+} SCL_V_CALC_AUTO_RATIO_EN;
+typedef enum SCL_H_CALC_AUTO_RATIO_EN {
+       SCL_H_CALC_AUTO_RATIO_DISABLE                    = 0x0,
+       SCL_H_CALC_AUTO_RATIO_ENABLE                     = 0x1,
+} SCL_H_CALC_AUTO_RATIO_EN;
+typedef enum SCL_H_FILTER_PICK_NEAREST {
+       SCL_H_FILTER_PICK_NEAREST_DISABLE                = 0x0,
+       SCL_H_FILTER_PICK_NEAREST_ENABLE                 = 0x1,
+} SCL_H_FILTER_PICK_NEAREST;
+typedef enum SCL_H_2TAP_HARDCODE_COEF_EN {
+       SCL_H_2TAP_HARDCODE_COEF_DISABLE                 = 0x0,
+       SCL_H_2TAP_HARDCODE_COEF_ENABLE                  = 0x1,
+} SCL_H_2TAP_HARDCODE_COEF_EN;
+typedef enum SCL_V_FILTER_PICK_NEAREST {
+       SCL_V_FILTER_PICK_NEAREST_DISABLE                = 0x0,
+       SCL_V_FILTER_PICK_NEAREST_ENABLE                 = 0x1,
+} SCL_V_FILTER_PICK_NEAREST;
+typedef enum SCL_V_2TAP_HARDCODE_COEF_EN {
+       SCL_V_2TAP_HARDCODE_COEF_DISABLE                 = 0x0,
+       SCL_V_2TAP_HARDCODE_COEF_ENABLE                  = 0x1,
+} SCL_V_2TAP_HARDCODE_COEF_EN;
+typedef enum SCL_UPDATE_TAKEN {
+       SCL_UPDATE_TAKEN_NO                              = 0x0,
+       SCL_UPDATE_TAKEN_YES                             = 0x1,
+} SCL_UPDATE_TAKEN;
+typedef enum SCL_UPDATE_LOCK {
+       SCL_UPDATE_UNLOCKED                              = 0x0,
+       SCL_UPDATE_LOCKED                                = 0x1,
+} SCL_UPDATE_LOCK;
+typedef enum SCL_COEF_UPDATE_COMPLETE {
+       SCL_COEF_UPDATE_NOT_COMPLETED                    = 0x0,
+       SCL_COEF_UPDATE_COMPLETED                        = 0x1,
+} SCL_COEF_UPDATE_COMPLETE;
+typedef enum SCL_HF_SHARP_SCALE_FACTOR {
+       SCL_HF_SHARP_SCALE_FACTOR_0                      = 0x0,
+       SCL_HF_SHARP_SCALE_FACTOR_1                      = 0x1,
+       SCL_HF_SHARP_SCALE_FACTOR_2                      = 0x2,
+       SCL_HF_SHARP_SCALE_FACTOR_3                      = 0x3,
+       SCL_HF_SHARP_SCALE_FACTOR_4                      = 0x4,
+       SCL_HF_SHARP_SCALE_FACTOR_5                      = 0x5,
+       SCL_HF_SHARP_SCALE_FACTOR_6                      = 0x6,
+       SCL_HF_SHARP_SCALE_FACTOR_7                      = 0x7,
+} SCL_HF_SHARP_SCALE_FACTOR;
+typedef enum SCL_HF_SHARP_EN {
+       SCL_HF_SHARP_DISABLE                             = 0x0,
+       SCL_HF_SHARP_ENABLE                              = 0x1,
+} SCL_HF_SHARP_EN;
+typedef enum SCL_VF_SHARP_SCALE_FACTOR {
+       SCL_VF_SHARP_SCALE_FACTOR_0                      = 0x0,
+       SCL_VF_SHARP_SCALE_FACTOR_1                      = 0x1,
+       SCL_VF_SHARP_SCALE_FACTOR_2                      = 0x2,
+       SCL_VF_SHARP_SCALE_FACTOR_3                      = 0x3,
+       SCL_VF_SHARP_SCALE_FACTOR_4                      = 0x4,
+       SCL_VF_SHARP_SCALE_FACTOR_5                      = 0x5,
+       SCL_VF_SHARP_SCALE_FACTOR_6                      = 0x6,
+       SCL_VF_SHARP_SCALE_FACTOR_7                      = 0x7,
+} SCL_VF_SHARP_SCALE_FACTOR;
+typedef enum SCL_VF_SHARP_EN {
+       SCL_VF_SHARP_DISABLE                             = 0x0,
+       SCL_VF_SHARP_ENABLE                              = 0x1,
+} SCL_VF_SHARP_EN;
+typedef enum SCL_ALU_DISABLE {
+       SCL_ALU_ENABLED                                  = 0x0,
+       SCL_ALU_DISABLED                                 = 0x1,
+} SCL_ALU_DISABLE;
+typedef enum SCL_HOST_CONFLICT_MASK {
+       SCL_HOST_CONFLICT_DISABLE_INTERRUPT              = 0x0,
+       SCL_HOST_CONFLICT_ENABLE_INTERRUPT               = 0x1,
+} SCL_HOST_CONFLICT_MASK;
+typedef enum SCL_SCL_MODE_CHANGE_MASK {
+       SCL_MODE_CHANGE_DISABLE_INTERRUPT                = 0x0,
+       SCL_MODE_CHANGE_ENABLE_INTERRUPT                 = 0x1,
+} SCL_SCL_MODE_CHANGE_MASK;
+typedef enum SCLV_MODE_SEL {
+       SCLV_MODE_RGB_BYPASS                             = 0x0,
+       SCLV_MODE_RGB_SCALING                            = 0x1,
+       SCLV_MODE_YCBCR_SCALING                          = 0x2,
+       SCLV_MODE_YCBCR_BYPASS                           = 0x3,
+} SCLV_MODE_SEL;
+typedef enum SCLV_INTERLACE_SOURCE {
+       INTERLACE_SOURCE_PROGRESSIVE                     = 0x0,
+       INTERLACE_SOURCE_INTERLEAVE                      = 0x1,
+       INTERLACE_SOURCE_STACK                           = 0x2,
+} SCLV_INTERLACE_SOURCE;
+typedef enum SCLV_UPDATE_LOCK {
+       UPDATE_UNLOCKED                                  = 0x0,
+       UPDATE_LOCKED                                    = 0x1,
+} SCLV_UPDATE_LOCK;
+typedef enum SCLV_COEF_UPDATE_COMPLETE {
+       COEF_UPDATE_NOT_COMPLETE                         = 0x0,
+       COEF_UPDATE_COMPLETE                             = 0x1,
+} SCLV_COEF_UPDATE_COMPLETE;
+typedef enum COL_MAN_UPDATE_LOCK {
+       COL_MAN_UPDATE_UNLOCKED                          = 0x0,
+       COL_MAN_UPDATE_LOCKED                            = 0x1,
+} COL_MAN_UPDATE_LOCK;
+typedef enum COL_MAN_DISABLE_MULTIPLE_UPDATE {
+       COL_MAN_MULTIPLE_UPDATE                          = 0x0,
+       COL_MAN_MULTIPLE_UPDAT_EDISABLE                  = 0x1,
+} COL_MAN_DISABLE_MULTIPLE_UPDATE;
+typedef enum COL_MAN_INPUTCSC_MODE {
+       INPUTCSC_MODE_BYPASS                             = 0x0,
+       INPUTCSC_MODE_A                                  = 0x1,
+       INPUTCSC_MODE_B                                  = 0x2,
+       INPUTCSC_MODE_UNITY                              = 0x3,
+} COL_MAN_INPUTCSC_MODE;
+typedef enum COL_MAN_INPUTCSC_TYPE {
+       INPUTCSC_TYPE_12_0                               = 0x0,
+       INPUTCSC_TYPE_10_2                               = 0x1,
+       INPUTCSC_TYPE_8_4                                = 0x2,
+} COL_MAN_INPUTCSC_TYPE;
+typedef enum COL_MAN_INPUTCSC_CONVERT {
+       INPUTCSC_ROUND                                   = 0x0,
+       INPUTCSC_TRUNCATE                                = 0x1,
+} COL_MAN_INPUTCSC_CONVERT;
+typedef enum COL_MAN_PRESCALE_MODE {
+       PRESCALE_MODE_BYPASS                             = 0x0,
+       PRESCALE_MODE_PROGRAM                            = 0x1,
+       PRESCALE_MODE_UNITY                              = 0x2,
+} COL_MAN_PRESCALE_MODE;
+typedef enum COL_MAN_INPUT_GAMMA_MODE {
+       INGAMMA_MODE_BYPASS                              = 0x0,
+       INGAMMA_MODE_FIX                                 = 0x1,
+       INGAMMA_MODE_FLOAT                               = 0x2,
+} COL_MAN_INPUT_GAMMA_MODE;
+typedef enum COL_MAN_OUTPUT_CSC_MODE {
+       COL_MAN_OUTPUT_CSC_BYPASS                        = 0x0,
+       COL_MAN_OUTPUT_CSC_RGB                           = 0x1,
+       COL_MAN_OUTPUT_CSC_YCrCb601                      = 0x2,
+       COL_MAN_OUTPUT_CSC_YCrCb709                      = 0x3,
+       COL_MAN_OUTPUT_CSC_A                             = 0x4,
+       COL_MAN_OUTPUT_CSC_B                             = 0x5,
+       COL_MAN_OUTPUT_CSC_UNITY                         = 0x6,
+} COL_MAN_OUTPUT_CSC_MODE;
+typedef enum COL_MAN_DENORM_CLAMP_CONTROL {
+       DENORM_CLAMP_MODE_UNITY                          = 0x0,
+       DENORM_CLAMP_MODE_8                              = 0x1,
+       DENORM_CLAMP_MODE_10                             = 0x2,
+       DENORM_CLAMP_MODE_12                             = 0x3,
+} COL_MAN_DENORM_CLAMP_CONTROL;
+typedef enum COL_MAN_GAMMA_CORR_CONTROL {
+       GAMMA_CORR_MODE_BYPASS                           = 0x0,
+       GAMMA_CORR_MODE_A                                = 0x1,
+       GAMMA_CORR_MODE_B                                = 0x2,
+} COL_MAN_GAMMA_CORR_CONTROL;
+typedef enum COL_MAN_GLOBAL_PASSTHROUGH_ENABLE {
+       CM_GLOBAL_PASSTHROUGH_DISBALE                    = 0x0,
+       CM_GLOBAL_PASSTHROUGH_ENABLE                     = 0x1,
+} COL_MAN_GLOBAL_PASSTHROUGH_ENABLE;
+typedef enum UNP_GRPH_EN {
+       UNP_GRPH_DISABLED                                = 0x0,
+       UNP_GRPH_ENABLED                                 = 0x1,
+} UNP_GRPH_EN;
+typedef enum UNP_GRPH_DEPTH {
+       UNP_GRPH_8BPP                                    = 0x0,
+       UNP_GRPH_16BPP                                   = 0x1,
+       UNP_GRPH_32BPP                                   = 0x2,
+} UNP_GRPH_DEPTH;
+typedef enum UNP_GRPH_NUM_BANKS {
+       UNP_GRPH_ADDR_SURF_2_BANK                        = 0x0,
+       UNP_GRPH_ADDR_SURF_4_BANK                        = 0x1,
+       UNP_GRPH_ADDR_SURF_8_BANK                        = 0x2,
+       UNP_GRPH_ADDR_SURF_16_BANK                       = 0x3,
+} UNP_GRPH_NUM_BANKS;
+typedef enum UNP_GRPH_BANK_WIDTH {
+       UNP_GRPH_ADDR_SURF_BANK_WIDTH_1                  = 0x0,
+       UNP_GRPH_ADDR_SURF_BANK_WIDTH_2                  = 0x1,
+       UNP_GRPH_ADDR_SURF_BANK_WIDTH_4                  = 0x2,
+       UNP_GRPH_ADDR_SURF_BANK_WIDTH_8                  = 0x3,
+} UNP_GRPH_BANK_WIDTH;
+typedef enum UNP_GRPH_BANK_HEIGHT {
+       UNP_GRPH_ADDR_SURF_BANK_HEIGHT_1                 = 0x0,
+       UNP_GRPH_ADDR_SURF_BANK_HEIGHT_2                 = 0x1,
+       UNP_GRPH_ADDR_SURF_BANK_HEIGHT_4                 = 0x2,
+       UNP_GRPH_ADDR_SURF_BANK_HEIGHT_8                 = 0x3,
+} UNP_GRPH_BANK_HEIGHT;
+typedef enum UNP_GRPH_TILE_SPLIT {
+       UNP_ADDR_SURF_TILE_SPLIT_64B                     = 0x0,
+       UNP_ADDR_SURF_TILE_SPLIT_128B                    = 0x1,
+       UNP_ADDR_SURF_TILE_SPLIT_256B                    = 0x2,
+       UNP_ADDR_SURF_TILE_SPLIT_512B                    = 0x3,
+       UNP_ADDR_SURF_TILE_SPLIT_1KB                     = 0x4,
+       UNP_ADDR_SURF_TILE_SPLIT_2KB                     = 0x5,
+       UNP_ADDR_SURF_TILE_SPLIT_4KB                     = 0x6,
+} UNP_GRPH_TILE_SPLIT;
+typedef enum UNP_GRPH_ADDRESS_TRANSLATION_ENABLE {
+       UNP_GRPH_ADDRESS_TRANSLATION_ENABLE0             = 0x0,
+       UNP_GRPH_ADDRESS_TRANSLATION_ENABLE1             = 0x1,
+} UNP_GRPH_ADDRESS_TRANSLATION_ENABLE;
+typedef enum UNP_GRPH_PRIVILEGED_ACCESS_ENABLE {
+       UNP_GRPH_PRIVILEGED_ACCESS_DIS                   = 0x0,
+       UNP_GRPH_PRIVILEGED_ACCESS_EN                    = 0x1,
+} UNP_GRPH_PRIVILEGED_ACCESS_ENABLE;
+typedef enum UNP_GRPH_MACRO_TILE_ASPECT {
+       UNP_ADDR_SURF_MACRO_ASPECT_1                     = 0x0,
+       UNP_ADDR_SURF_MACRO_ASPECT_2                     = 0x1,
+       UNP_ADDR_SURF_MACRO_ASPECT_4                     = 0x2,
+       UNP_ADDR_SURF_MACRO_ASPECT_8                     = 0x3,
+} UNP_GRPH_MACRO_TILE_ASPECT;
+typedef enum UNP_GRPH_COLOR_EXPANSION_MODE {
+       UNP_GRPH_DYNAMIC_EXPANSION                       = 0x0,
+       UNP_GRPH_ZERO_EXPANSION                          = 0x1,
+} UNP_GRPH_COLOR_EXPANSION_MODE;
+typedef enum UNP_VIDEO_FORMAT {
+       UNP_VIDEO_FORMAT0                                = 0x0,
+       UNP_VIDEO_FORMAT1                                = 0x1,
+       UNP_VIDEO_FORMAT_YUV420_YCbCr                    = 0x2,
+       UNP_VIDEO_FORMAT_YUV420_YCrCb                    = 0x3,
+       UNP_VIDEO_FORMAT_YUV422_YCb                      = 0x4,
+       UNP_VIDEO_FORMAT_YUV422_YCr                      = 0x5,
+       UNP_VIDEO_FORMAT_YUV422_CbY                      = 0x6,
+       UNP_VIDEO_FORMAT_YUV422_CrY                      = 0x7,
+} UNP_VIDEO_FORMAT;
+typedef enum UNP_GRPH_ENDIAN_SWAP {
+       UNP_GRPH_ENDIAN_SWAP_NONE                        = 0x0,
+       UNP_GRPH_ENDIAN_SWAP_8IN16                       = 0x1,
+       UNP_GRPH_ENDIAN_SWAP_8IN32                       = 0x2,
+       UNP_GRPH_ENDIAN_SWAP_8IN43                       = 0x3,
+} UNP_GRPH_ENDIAN_SWAP;
+typedef enum UNP_GRPH_RED_CROSSBAR {
+       UNP_GRPH_RED_CROSSBAR_R_Cr                       = 0x0,
+       UNP_GRPH_RED_CROSSBAR_G_Y                        = 0x1,
+       UNP_GRPH_RED_CROSSBAR_B_Cb                       = 0x2,
+       UNP_GRPH_RED_CROSSBAR_A                          = 0x3,
+} UNP_GRPH_RED_CROSSBAR;
+typedef enum UNP_GRPH_GREEN_CROSSBAR {
+       UNP_UNP_GRPH_GREEN_CROSSBAR_GY_AND_Y             = 0x0,
+       UNP_UNP_GRPH_GREEN_CROSSBAR_B_Cb_AND_C           = 0x1,
+       UNP_UNP_GRPH_GREEN_CROSSBAR_A                    = 0x2,
+       UNP_UNP_GRPH_GREEN_CROSSBAR_R_Cr                 = 0x3,
+} UNP_GRPH_GREEN_CROSSBAR;
+typedef enum UNP_GRPH_BLUE_CROSSBAR {
+       UNP_GRPH_BLUE_CROSSBAR_B_Cb_AND_C                = 0x0,
+       UNP_GRPH_BLUE_CROSSBAR_A                         = 0x1,
+       UNP_GRPH_BLUE_CROSSBAR_R_Cr                      = 0x2,
+       UNP_GRPH_BLUE_CROSSBAR_GY_AND_Y                  = 0x3,
+} UNP_GRPH_BLUE_CROSSBAR;
+typedef enum UNP_GRPH_MODE_UPDATE_LOCKG {
+       UNP_GRPH_UPDATE_LOCK_0                           = 0x0,
+       UNP_GRPH_UPDATE_LOCK_1                           = 0x1,
+} UNP_GRPH_MODE_UPDATE_LOCKG;
+typedef enum UNP_GRPH_SURFACE_IGNORE_UPDATE_LOCK {
+       UNP_GRPH_SURFACE_IGNORE_UPDATE_LOCK_0            = 0x0,
+       UNP_GRPH_SURFACE_IGNORE_UPDATE_LOCK_1            = 0x1,
+} UNP_GRPH_SURFACE_IGNORE_UPDATE_LOCK;
+typedef enum UNP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE {
+       UNP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE_0          = 0x0,
+       UNP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE_1          = 0x1,
+} UNP_GRPH_MODE_DISABLE_MULTIPLE_UPDATE;
+typedef enum UNP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE {
+       UNP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_0       = 0x0,
+       UNP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_1       = 0x1,
+} UNP_GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE;
+typedef enum UNP_GRPH_STEREOSYNC_FLIP_EN {
+       UNP_GRPH_STEREOSYNC_FLIP_DISABLE                 = 0x0,
+       UNP_GRPH_STEREOSYNC_FLIP_ENABLE                  = 0x1,
+} UNP_GRPH_STEREOSYNC_FLIP_EN;
+typedef enum UNP_GRPH_STEREOSYNC_FLIP_MODE {
+       UNP_GRPH_STEREOSYNC_FLIP_MODE_0                  = 0x0,
+       UNP_GRPH_STEREOSYNC_FLIP_MODE_1                  = 0x1,
+       UNP_GRPH_STEREOSYNC_FLIP_MODE_2                  = 0x2,
+       UNP_GRPH_STEREOSYNC_FLIP_MODE_3                  = 0x3,
+} UNP_GRPH_STEREOSYNC_FLIP_MODE;
+typedef enum UNP_GRPH_STACK_INTERLACE_FLIP_EN {
+       UNP_GRPH_STACK_INTERLACE_FLIP_DISABLE            = 0x0,
+       UNP_GRPH_STACK_INTERLACE_FLIP_ENABLE             = 0x1,
+} UNP_GRPH_STACK_INTERLACE_FLIP_EN;
+typedef enum UNP_GRPH_STACK_INTERLACE_FLIP_MODE {
+       UNP_GRPH_STACK_INTERLACE_FLIP_MODE_0             = 0x0,
+       UNP_GRPH_STACK_INTERLACE_FLIP_MODE_1             = 0x1,
+       UNP_GRPH_STACK_INTERLACE_FLIP_MODE_2             = 0x2,
+       UNP_GRPH_STACK_INTERLACE_FLIP_MODE_3             = 0x3,
+} UNP_GRPH_STACK_INTERLACE_FLIP_MODE;
+typedef enum UNP_GRPH_STEREOSYNC_SELECT_DISABLE {
+       UNP_GRPH_STEREOSYNC_SELECT_EN                    = 0x0,
+       UNP_GRPH_STEREOSYNC_SELECT_DIS                   = 0x1,
+} UNP_GRPH_STEREOSYNC_SELECT_DISABLE;
+typedef enum UNP_CRC_SOURCE_SEL {
+       UNP_CRC_SOURCE_SEL_NP_TO_LBV                     = 0x0,
+       UNP_CRC_SOURCE_SEL_LOWER32                       = 0x1,
+       UNP_CRC_SOURCE_SEL_RESERVED                      = 0x2,
+       UNP_CRC_SOURCE_SEL_LOWER16                       = 0x3,
+       UNP_CRC_SOURCE_SEL_UNP_TO_LBV                    = 0x4,
+} UNP_CRC_SOURCE_SEL;
+typedef enum UNP_CRC_LINE_SEL {
+       UNP_CRC_LINE_SEL_RESERVED                        = 0x0,
+       UNP_CRC_LINE_SEL_EVEN_ONLY                       = 0x1,
+       UNP_CRC_LINE_SEL_ODD_ONLY                        = 0x2,
+       UNP_CRC_LINE_SEL_ODD_EVEN                        = 0x3,
+} UNP_CRC_LINE_SEL;
+typedef enum UNP_ROTATION_ANGLE {
+       UNP_ROTATION_ANGLE_0                             = 0x0,
+       UNP_ROTATION_ANGLE_90                            = 0x1,
+       UNP_ROTATION_ANGLE_180                           = 0x2,
+       UNP_ROTATION_ANGLE_270                           = 0x3,
+       UNP_ROTATION_ANGLE_0m                            = 0x4,
+       UNP_ROTATION_ANGLE_90m                           = 0x5,
+       UNP_ROTATION_ANGLE_180m                          = 0x6,
+       UNP_ROTATION_ANGLE_270m                          = 0x7,
+} UNP_ROTATION_ANGLE;
+typedef enum UNP_PIXEL_DROP {
+       UNP_PIXEL_NO_DROP                                = 0x0,
+       UNP_PIXEL_DROPPING                               = 0x1,
+} UNP_PIXEL_DROP;
+typedef enum UNP_BUFFER_MODE {
+       UNP_BUFFER_MODE_LUMA                             = 0x0,
+       UNP_BUFFER_MODE_LUMA_CHROMA                      = 0x1,
+} UNP_BUFFER_MODE;
+typedef enum WATERMARK_MASK_CONTROL {
+       WM_MASK_CONTROL_SET_A                            = 0x0,
+       WM_MASK_CONTROL_SET_B                            = 0x1,
+       WM_MASK_CONTROL_SET_C                            = 0x2,
+       WM_MASK_CONTROL_SET_D                            = 0x3,
+       WM_MASK_CONTROL_RESERVED1                        = 0x4,
+       WM_MASK_CONTROL_RESERVED2                        = 0x5,
+       WM_MASK_CONTROL_RESERVED3                        = 0x6,
+       WM_MASK_CONTROL_ACTIVE_SET                       = 0x7,
+} WATERMARK_MASK_CONTROL;
+typedef enum AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET_CODEC_RESET {
+       AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET_CODEC_NOT_RESET= 0x0,
+       AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET_CODEC_DO_RESET= 0x1,
+} AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET_CODEC_RESET;
+typedef enum CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY {
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_ALL= 0x0,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_6= 0x1,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_5= 0x2,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_4= 0x3,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_3= 0x4,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_2= 0x5,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_1= 0x6,
+       CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY_0= 0x7,
+} CC_RCU_DC_AUDIO_PORT_CONNECTIVITY_PORT_CONNECTIVITY;
+typedef enum CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY {
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_ALL= 0x0,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_6= 0x1,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_5= 0x2,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_4= 0x3,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_3= 0x4,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_2= 0x5,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_1= 0x6,
+       CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY_0= 0x7,
+} CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY_INPUT_PORT_CONNECTIVITY;
+typedef enum GENERIC_AZ_CONTROLLER_REGISTER_ENABLE_CONTROL {
+       GENERIC_AZ_CONTROLLER_REGISTER_DISABLE           = 0x0,
+       GENERIC_AZ_CONTROLLER_REGISTER_ENABLE            = 0x1,
+} GENERIC_AZ_CONTROLLER_REGISTER_ENABLE_CONTROL;
+typedef enum GENERIC_AZ_CONTROLLER_REGISTER_ENABLE_CONTROL_RESERVED {
+       GENERIC_AZ_CONTROLLER_REGISTER_DISABLE_RESERVED  = 0x0,
+       GENERIC_AZ_CONTROLLER_REGISTER_ENABLE_RESERVED   = 0x1,
+} GENERIC_AZ_CONTROLLER_REGISTER_ENABLE_CONTROL_RESERVED;
+typedef enum GENERIC_AZ_CONTROLLER_REGISTER_STATUS {
+       GENERIC_AZ_CONTROLLER_REGISTER_STATUS_NOT_SET    = 0x0,
+       GENERIC_AZ_CONTROLLER_REGISTER_STATUS_SET        = 0x1,
+} GENERIC_AZ_CONTROLLER_REGISTER_STATUS;
+typedef enum GENERIC_AZ_CONTROLLER_REGISTER_STATUS_RESERVED {
+       GENERIC_AZ_CONTROLLER_REGISTER_STATUS_NOT_SET_RESERVED= 0x0,
+       GENERIC_AZ_CONTROLLER_REGISTER_STATUS_SET_RESERVED= 0x1,
+} GENERIC_AZ_CONTROLLER_REGISTER_STATUS_RESERVED;
+typedef enum AZ_GLOBAL_CAPABILITIES {
+       AZ_GLOBAL_CAPABILITIES_SIXTY_FOUR_BIT_ADDRESS_NOT_SUPPORTED= 0x0,
+       AZ_GLOBAL_CAPABILITIES_SIXTY_FOUR_BIT_ADDRESS_SUPPORTED= 0x1,
+} AZ_GLOBAL_CAPABILITIES;
+typedef enum GLOBAL_CONTROL_ACCEPT_UNSOLICITED_RESPONSE {
+       ACCEPT_UNSOLICITED_RESPONSE_NOT_ENABLE           = 0x0,
+       ACCEPT_UNSOLICITED_RESPONSE_ENABLE               = 0x1,
+} GLOBAL_CONTROL_ACCEPT_UNSOLICITED_RESPONSE;
+typedef enum GLOBAL_CONTROL_FLUSH_CONTROL {
+       FLUSH_CONTROL_FLUSH_NOT_STARTED                  = 0x0,
+       FLUSH_CONTROL_FLUSH_STARTED                      = 0x1,
+} GLOBAL_CONTROL_FLUSH_CONTROL;
+typedef enum GLOBAL_CONTROL_CONTROLLER_RESET {
+       CONTROLLER_RESET_AZ_CONTROLLER_IN_RESET          = 0x0,
+       CONTROLLER_RESET_AZ_CONTROLLER_NOT_IN_RESET      = 0x1,
+} GLOBAL_CONTROL_CONTROLLER_RESET;
+typedef enum AZ_STATE_CHANGE_STATUS {
+       AZ_STATE_CHANGE_STATUS_CODEC_NOT_PRESENT         = 0x0,
+       AZ_STATE_CHANGE_STATUS_CODEC_PRESENT             = 0x1,
+} AZ_STATE_CHANGE_STATUS;
+typedef enum GLOBAL_STATUS_FLUSH_STATUS {
+       GLOBAL_STATUS_FLUSH_STATUS_FLUSH_NOT_ENDED       = 0x0,
+       GLOBAL_STATUS_FLUSH_STATUS_FLUSH_ENDED           = 0x1,
+} GLOBAL_STATUS_FLUSH_STATUS;
+typedef enum STREAM_0_SYNCHRONIZATION {
+       STREAM_0_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_0_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_0_SYNCHRONIZATION;
+typedef enum STREAM_1_SYNCHRONIZATION {
+       STREAM_1_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_1_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_1_SYNCHRONIZATION;
+typedef enum STREAM_2_SYNCHRONIZATION {
+       STREAM_2_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_2_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_2_SYNCHRONIZATION;
+typedef enum STREAM_3_SYNCHRONIZATION {
+       STREAM_3_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_3_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_3_SYNCHRONIZATION;
+typedef enum STREAM_4_SYNCHRONIZATION {
+       STREAM_4_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_4_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_4_SYNCHRONIZATION;
+typedef enum STREAM_5_SYNCHRONIZATION {
+       STREAM_5_SYNCHRONIZATION_STEAM_NOT_STOPPED       = 0x0,
+       STREAM_5_SYNCHRONIZATION_STEAM_STOPPED           = 0x1,
+} STREAM_5_SYNCHRONIZATION;
+typedef enum STREAM_6_SYNCHRONIZATION {
+       STREAM_6_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_6_SYNCHRONIZATION_STEAM_STOPPED_RESERVED  = 0x1,
+} STREAM_6_SYNCHRONIZATION;
+typedef enum STREAM_7_SYNCHRONIZATION {
+       STREAM_7_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_7_SYNCHRONIZATION_STEAM_STOPPED_RESERVED  = 0x1,
+} STREAM_7_SYNCHRONIZATION;
+typedef enum STREAM_8_SYNCHRONIZATION {
+       STREAM_8_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_8_SYNCHRONIZATION_STEAM_STOPPED_RESERVED  = 0x1,
+} STREAM_8_SYNCHRONIZATION;
+typedef enum STREAM_9_SYNCHRONIZATION {
+       STREAM_9_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_9_SYNCHRONIZATION_STEAM_STOPPED_RESERVED  = 0x1,
+} STREAM_9_SYNCHRONIZATION;
+typedef enum STREAM_10_SYNCHRONIZATION {
+       STREAM_10_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_10_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_10_SYNCHRONIZATION;
+typedef enum STREAM_11_SYNCHRONIZATION {
+       STREAM_11_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_11_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_11_SYNCHRONIZATION;
+typedef enum STREAM_12_SYNCHRONIZATION {
+       STREAM_12_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_12_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_12_SYNCHRONIZATION;
+typedef enum STREAM_13_SYNCHRONIZATION {
+       STREAM_13_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_13_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_13_SYNCHRONIZATION;
+typedef enum STREAM_14_SYNCHRONIZATION {
+       STREAM_14_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_14_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_14_SYNCHRONIZATION;
+typedef enum STREAM_15_SYNCHRONIZATION {
+       STREAM_15_SYNCHRONIZATION_STEAM_NOT_STOPPED_RESERVED= 0x0,
+       STREAM_15_SYNCHRONIZATION_STEAM_STOPPED_RESERVED = 0x1,
+} STREAM_15_SYNCHRONIZATION;
+typedef enum CORB_READ_POINTER_RESET {
+       CORB_READ_POINTER_RESET_CORB_DMA_IS_NOT_RESET    = 0x0,
+       CORB_READ_POINTER_RESET_CORB_DMA_IS_RESET        = 0x1,
+} CORB_READ_POINTER_RESET;
+typedef enum AZ_CORB_SIZE {
+       AZ_CORB_SIZE_2ENTRIES_RESERVED                   = 0x0,
+       AZ_CORB_SIZE_16ENTRIES_RESERVED                  = 0x1,
+       AZ_CORB_SIZE_256ENTRIES                          = 0x2,
+       AZ_CORB_SIZE_RESERVED                            = 0x3,
+} AZ_CORB_SIZE;
+typedef enum AZ_RIRB_WRITE_POINTER_RESET {
+       AZ_RIRB_WRITE_POINTER_NOT_RESET                  = 0x0,
+       AZ_RIRB_WRITE_POINTER_DO_RESET                   = 0x1,
+} AZ_RIRB_WRITE_POINTER_RESET;
+typedef enum RIRB_CONTROL_RESPONSE_OVERRUN_INTERRUPT_CONTROL {
+       RIRB_CONTROL_RESPONSE_OVERRUN_INTERRUPT_CONTROL_INTERRUPT_DISABLED= 0x0,
+       RIRB_CONTROL_RESPONSE_OVERRUN_INTERRUPT_CONTROL_INTERRUPT_ENABLED= 0x1,
+} RIRB_CONTROL_RESPONSE_OVERRUN_INTERRUPT_CONTROL;
+typedef enum RIRB_CONTROL_RESPONSE_INTERRUPT_CONTROL {
+       RIRB_CONTROL_RESPONSE_INTERRUPT_CONTROL_INTERRUPT_DISABLED= 0x0,
+       RIRB_CONTROL_RESPONSE_INTERRUPT_CONTROL_INTERRUPT_ENABLED= 0x1,
+} RIRB_CONTROL_RESPONSE_INTERRUPT_CONTROL;
+typedef enum AZ_RIRB_SIZE {
+       AZ_RIRB_SIZE_2ENTRIES_RESERVED                   = 0x0,
+       AZ_RIRB_SIZE_16ENTRIES_RESERVED                  = 0x1,
+       AZ_RIRB_SIZE_256ENTRIES                          = 0x2,
+       AZ_RIRB_SIZE_UNDEFINED                           = 0x3,
+} AZ_RIRB_SIZE;
+typedef enum IMMEDIATE_COMMAND_STATUS_IMMEDIATE_RESULT_VALID {
+       IMMEDIATE_COMMAND_STATUS_IMMEDIATE_RESULT_VALID_NO_IMMEDIATE_RESPONSE_VALID= 0x0,
+       IMMEDIATE_COMMAND_STATUS_IMMEDIATE_RESULT_VALID_IMMEDIATE_RESPONSE_VALID= 0x1,
+} IMMEDIATE_COMMAND_STATUS_IMMEDIATE_RESULT_VALID;
+typedef enum IMMEDIATE_COMMAND_STATUS_IMMEDIATE_COMMAND_BUSY {
+       IMMEDIATE_COMMAND_STATUS_IMMEDIATE_COMMAND_NOT_BUSY= 0x0,
+       IMMEDIATE_COMMAND_STATUS_IMMEDIATE_COMMAND_IS_BUSY= 0x1,
+} IMMEDIATE_COMMAND_STATUS_IMMEDIATE_COMMAND_BUSY;
+typedef enum DMA_POSITION_LOWER_BASE_ADDRESS_BUFFER_ENABLE {
+       DMA_POSITION_LOWER_BASE_ADDRESS_BUFFER_ENABLE_DMA_DISABLE= 0x0,
+       DMA_POSITION_LOWER_BASE_ADDRESS_BUFFER_ENABLE_DMA_ENABLE= 0x1,
+} DMA_POSITION_LOWER_BASE_ADDRESS_BUFFER_ENABLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_STATUS_NOT_SET= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_STATUS_SET= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_STATUS_NOT_SET= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_STATUS_SET= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_BUFFER_COMPLETION_INTERRUPT_STATUS {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_BUFFER_COMPLETION_INTERRUPT_STATUS_NOT_SET= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_BUFFER_COMPLETION_INTERRUPT_STATUS_SET= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_BUFFER_COMPLETION_INTERRUPT_STATUS;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_TRAFFIC_PRIORITY {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_NO_TRAFFIC_PRIORITY= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_YES_TRAFFIC_PRIORITY= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_TRAFFIC_PRIORITY;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_INTERRUPT_ENABLE {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_INTERRUPT_DISABLED= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_INTERRUPT_ENABLED= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_DESCRIPTOR_ERROR_INTERRUPT_ENABLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_INTERRUPT_ENABLE {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_INTERRUPT_DISABLED= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_INTERRUPT_ENABLED= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_FIFO_ERROR_INTERRUPT_ENABLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_INTERRUPT_ON_COMPLETION_ENABLE {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_INTERRUPT_ON_COMPLETION_ENABLE_INTERRUPT_DISABLED= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_INTERRUPT_ON_COMPLETION_ENABLE_INTERRUPT_ENABLED= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_INTERRUPT_ON_COMPLETION_ENABLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_RUN {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_NOT_RUN= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_DO_RUN= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_RUN;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_RESET {
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_NOT_RESET= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_IS_RESET= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS_STREAM_RESET;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_RATE {
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_RATE_48KHZ= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_RATE_44P1KHZ= 0x1,
+} OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_RATE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE {
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE_BY1= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE_BY2= 0x1,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE_BY3_RESERVED= 0x2,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE_BY4= 0x3,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE_RESERVED= 0x4,
+} OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_MULTIPLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR {
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY1= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY2_RESERVED= 0x1,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY3= 0x2,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY4_RESERVED= 0x3,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY5_RESERVED= 0x4,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY6_RESERVED= 0x5,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY7_RESERVED= 0x6,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR_BY8_RESERVED= 0x7,
+} OUTPUT_STREAM_DESCRIPTOR_FORMAT_SAMPLE_BASE_DIVISOR;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE {
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_8_RESERVED= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_16= 0x1,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_20= 0x2,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_24= 0x3,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_32_RESERVED= 0x4,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE_RESERVED= 0x5,
+} OUTPUT_STREAM_DESCRIPTOR_FORMAT_BITS_PER_SAMPLE;
+typedef enum OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS {
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_1= 0x0,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_2= 0x1,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_3= 0x2,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_4= 0x3,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_5= 0x4,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_6= 0x5,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_7= 0x6,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_8= 0x7,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_9_RESERVED= 0x8,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_10_RESERVED= 0x9,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_11_RESERVED= 0xa,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_12_RESERVED= 0xb,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_13_RESERVED= 0xc,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_14_RESERVED= 0xd,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_15_RESERVED= 0xe,
+       OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS_16_RESERVED= 0xf,
+} OUTPUT_STREAM_DESCRIPTOR_FORMAT_NUMBER_OF_CHANNELS;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE_PCM= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE_NOT_PCM= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE_48KHZ= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE_44P1KHZ= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY1= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY2= 0x1,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY3_RESERVED= 0x2,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY4= 0x3,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_RESERVED= 0x4,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY1= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY2_RESERVED= 0x1,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY3= 0x2,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY4_RESERVED= 0x3,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY5_RESERVED= 0x4,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY6_RESERVED= 0x5,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY7_RESERVED= 0x6,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY8_RESERVED= 0x7,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_8_RESERVED= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_16= 0x1,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_20= 0x2,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_24= 0x3,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_32_RESERVED= 0x4,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_RESERVED= 0x5,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_1= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_2= 0x1,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_3= 0x2,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_4= 0x3,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_5= 0x4,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_6= 0x5,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_7= 0x6,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_8= 0x7,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_RESERVED= 0x8,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_L {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_L_BIT7_NOT_SET= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_L_BIT7_IS_SET= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_L;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRO {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRO_BIT_A_NOT_SET= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRO_BIT_A_IS_SET= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRO;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_NON_AUDIO {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_NON_AUDIO_BIT_B_NOT_SET= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_NON_AUDIO_BIT_B_IS_SET= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_NON_AUDIO;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_COPY {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_COPY_BIT_C_IS_SET= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_COPY_BIT_C_NOT_SET= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_COPY;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRE_LSB_OF_D_NOT_SET= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRE_LSB_OF_D_IS_SET= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_PRE;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_VCFG {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_VALIDITY_CFG_NOT_ON= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_VALIDITY_CFG_ON= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_VCFG;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_V {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_V_BIT28_IS_ZERO= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_V_BIT28_IS_ONE= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_V;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN_DIGITAL_TRANSMISSION_DISABLED= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN_DIGITAL_TRANSMISSION_ENABLED= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN;
+typedef enum AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3_KEEPALIVE {
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3_KEEPALIVE_SILENT_STREAM_NOT_ENABLE= 0x0,
+       AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3_KEEPALIVE_SILENT_STREAM_ENABLE= 0x1,
+} AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3_KEEPALIVE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL_OUT_ENABLE {
+       AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL_OUT_ENABLE_PIN_SHUT_OFF= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL_OUT_ENABLE_PIN_DRIVEN= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL_OUT_ENABLE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLE {
+       AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_DISABLED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO_DOWN_MIX_INHIBIT {
+       AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_NO_INFO_OR_PERMITTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_FORBIDDEN   = 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO_DOWN_MIX_INHIBIT;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE_MULTICHANNEL01_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE_MULTICHANNEL01_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE_MULTICHANNEL01_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE_MULTICHANNEL01_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE_MULTICHANNEL23_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE_MULTICHANNEL23_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE_MULTICHANNEL23_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE_MULTICHANNEL23_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE_MULTICHANNEL45_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE_MULTICHANNEL45_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE_MULTICHANNEL45_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE_MULTICHANNEL45_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE_MULTICHANNEL67_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE_MULTICHANNEL67_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE_MULTICHANNEL67_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE_MULTICHANNEL67_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTED= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTE;
+typedef enum AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_MODE {
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_PAIR_MODE= 0x0,
+       AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_SINGLE_MODE= 0x1,
+} AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_MODE;
+typedef enum AZ_LATENCY_COUNTER_CONTROL {
+       AZ_LATENCY_COUNTER_NO_RESET                      = 0x0,
+       AZ_LATENCY_COUNTER_RESET_DONE                    = 0x1,
+} AZ_LATENCY_COUNTER_CONTROL;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_OUTPUT_CONVERTER_RESERVED= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_INPUT_CONVERTER_RESERVED= 0x1,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_MIXER_RESERVED= 0x2,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_SELECTOR_RESERVED= 0x3,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_PIN_RESERVED= 0x4,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_POWER_WIDGET_RESERVED= 0x5,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VOLUME_KNOB_RESERVED= 0x6,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_BEEP_GENERATOR_RESERVED= 0x7,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_RESERVED_RESERVED= 0x8,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VENDOR_DEFINED_RESERVED= 0x9,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_LR_SWAP_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_LR_SWAP_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_POWER_CONTROL_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_POWER_CONTROL_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_ANALOG= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_DIGITAL= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_CONNECTION_LIST= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_CONNECTION_LIST= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_UNSOLICITED_RESPONSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_UNSOLICITED_RESPONSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_NO_PROCESSING_CAPABILITIES= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_HAVE_PROCESSING_CAPABILITIES= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_SUPPORT_STRIPING= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_SUPPORT_STRIPING= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_FORMAT_OVERRIDE {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_FORMAT_OVERRIDE= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_SUPPORT_FORMAT_OVERRIDE= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_FORMAT_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_AMPLIFIER_PARAMETER= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_AMPLIFIER_PARAMETER_OVERRIDE= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_OUTPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_OUTPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_INPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_INPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES {
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES_MONOPHONIC= 0x0,
+       AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES_STEREO= 0x1,
+} AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_OUTPUT_CONVERTER_RESERVED= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_INPUT_CONVERTER_RESERVED= 0x1,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_MIXER_RESERVED= 0x2,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_SELECTOR_RESERVED= 0x3,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_PIN_RESERVED= 0x4,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_POWER_WIDGET_RESERVED= 0x5,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VOLUME_KNOB_RESERVED= 0x6,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_BEEP_GENERATOR_RESERVED= 0x7,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_RESERVED_RESERVED= 0x8,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VENDOR_DEFINED_RESERVED= 0x9,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_LR_SWAP_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_LR_SWAP_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_POWER_CONTROL_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_POWER_CONTROL_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_ANALOG= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_DIGITAL= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_CONNECTION_LIST= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_CONNECTION_LIST= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_UNSOLICITED_RESPONSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_UNSOLICITED_RESPONSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_NO_PROCESSING_CAPABILITIES= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_HAVE_PROCESSING_CAPABILITIES= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_SUPPORT_STRIPING= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_SUPPORT_STRIPING= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_AMPLIFIER_PARAMETER= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_AMPLIFIER_PARAMETER_OVERRIDE= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_OUTPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_OUTPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_INPUT_AMPLIFIER_PRESENT= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_INPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_EAPD_PIN= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_EAPD_PIN= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_BALANCED_I_O_PINS {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_I_O_PINS_ARE_NOT_BALANCED= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_I_O_PINS_ARE_BALANCED= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_BALANCED_I_O_PINS;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_INPUT_CAPABLE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_INPUT_PIN= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_INPUT_PIN= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_INPUT_CAPABLE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_OUTPUT_CAPABLE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_OUTPUT_PIN= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_OUTPUT_PIN= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_OUTPUT_CAPABLE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HEADPHONE_DRIVE_CAPABLE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_HEADPHONE_DRIVE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_HEADPHONE_DRIVE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HEADPHONE_DRIVE_CAPABLE;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_JACK_DETECTION_CAPABILITY {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_JACK_DETECTION_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_JACK_DETECTION_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_JACK_DETECTION_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_TRIGGER_REQUIRED_FOR_IMPEDANCE_MEASUREMENT= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED_FOR_IMPEDANCE_MEASUREMENT= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED;
+typedef enum AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_IMPEDANCE_SENSE_CAPABLE {
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_NO_IMPEDANCE_SENSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_HAVE_IMPEDANCE_SENSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES_IMPEDANCE_SENSE_CAPABLE;
+typedef enum AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_MODE {
+       AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_PAIR_MODE= 0x0,
+       AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_SINGLE_MODE= 0x1,
+} AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE_MULTICHANNEL_MODE;
+typedef enum AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR_HBR_CAPABLE {
+       AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR_NO_HBR_CAPABLILITY= 0x0,
+       AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR_HAVE_HBR_CAPABLILITY= 0x1,
+} AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR_HBR_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_OUTPUT_CONVERTER_RESERVED= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_INPUT_CONVERTER_RESERVED= 0x1,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_MIXER_RESERVED= 0x2,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_SELECTOR_RESERVED= 0x3,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_PIN_RESERVED= 0x4,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_POWER_WIDGET_RESERVED= 0x5,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VOLUME_KNOB_RESERVED= 0x6,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_BEEP_GENERATOR_RESERVED= 0x7,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_RESERVED= 0x8,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VENDOR_DEFINED_RESERVED= 0x9,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_LR_SWAP_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_LR_SWAP_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_POWER_CONTROL_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_POWER_CONTROL_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CODEC_CONVERTER0_IS_ANALOG= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CODEC_CONVERTER0_IS_DIGITAL= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_CONNECTION_LIST= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_CONNECTION_LIST= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_UNSOLICITED_RESPONSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_UNSOLICITED_RESPONSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_CODEC_CONVERTER0_HAVE_NO_PROCESSING_CAPABILITIES= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_CODEC_CONVERTER0_HAVE_PROCESSING_CAPABILITIES= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NOT_SUPPORT_STRIPING= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_SUPPORT_STRIPING= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_FORMAT_OVERRIDE {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_FORMAT_OVERRIDE= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_FORMAT_OVERRIDE= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_FORMAT_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_AMPLIFIER_PARAMETER= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_AMPLIFIER_PARAMETER= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_OUTPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_OUTPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_INPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_INPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES {
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES_MONOPHONIC= 0x0,
+       AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES_STEREO= 0x1,
+} AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AUDIO_CHANNEL_CAPABILITIES;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_OUTPUT_CONVERTER_RESERVED= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_INPUT_CONVERTER_RESERVED= 0x1,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_MIXER_RESERVED= 0x2,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_SELECTOR_RESERVED= 0x3,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_PIN_RESERVED= 0x4,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_POWER_WIDGET_RESERVED= 0x5,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VOLUME_KNOB_RESERVED= 0x6,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_BEEP_GENERATOR_RESERVED= 0x7,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_RESERVED= 0x8,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE_VENDOR_DEFINED_RESERVED= 0x9,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_TYPE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_LR_SWAP= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_LR_SWAP= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_LR_SWAP;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_POWER_CONTROL_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_POWER_CONTROL_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_POWER_CONTROL;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_ANALOG= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_IS_DIGITAL= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_DIGITAL;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_CONNECTION_LIST= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_CONNECTION_LIST= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_CONNECTION_LIST;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_UNSOLICITED_RESPONSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_UNSOLICITED_RESPONSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_UNSOLICITED_RESPONSE_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_NO_PROCESING_CAPABILITIES= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET_HAVE_PROCESING_CAPABILITIES= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_PROCESSING_WIDGET;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_SUPPORT_STRIPING= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_SUPPORT_STRIPING= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_STRIPE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_AMPLIFIER_PARAMETER= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_AMPLIFIER_PARAMETER_OVERRIDE= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_AMPLIFIER_PARAMETER_OVERRIDE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_OUTPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_OUTPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_OUTPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_NO_INPUT_AMPLIFIER= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_HAVE_INPUT_AMPLIFIER= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES_INPUT_AMPLIFIER_PRESENT;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_DP {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_DP_NOT_ENABLED= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_DP_ENABLED= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_DP;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE_NO_EAPD_PIN= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE_HAVE_EAPD_PIN= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_EAPD_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HDMI {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HDMI_NOT_ENABLED= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HDMI_ENABLED= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HDMI;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_BALANCED_I_O_PINS {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_I_O_PINS_NOT_BALANCED= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_I_O_PINS_ARE_BALANCED= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_BALANCED_I_O_PINS;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_INPUT_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_INPUT_PIN= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HAVE_INPUT_PIN= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_INPUT_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_OUTPUT_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_OUTPUT_PIN= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HAVE_OUTPUT_PIN= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_OUTPUT_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HEADPHONE_DRIVE_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_HEADPHONE_DRIVE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HAVE_HEADPHONE_DRIVE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HEADPHONE_DRIVE_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_JACK_DETECTION_CAPABILITY {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_JACK_PRESENCE_DETECTION_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HAVE_JACK_PRESENCE_DETECTION_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_JACK_DETECTION_CAPABILITY;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_TRIGGER_REQUIRED_FOR_IMPEDANCE_MEASUREMENT= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED_FOR_IMPEDANCE_MEASUREMENT= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_TRIGGER_REQUIRED;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_IMPEDANCE_SENSE_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_NO_IMPEDANCE_SENSE_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_HAVE_IMPEDANCE_SENSE_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES_IMPEDANCE_SENSE_CAPABLE;
+typedef enum AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR_HBR_CAPABLE {
+       AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR_NO_HBR_CAPABILITY= 0x0,
+       AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR_HAVE_HBR_CAPABILITY= 0x1,
+} AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR_HBR_CAPABLE;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE_PCM= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE_NOT_PCM= 0x1,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_STREAM_TYPE;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE_48KHZ= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE_44P1KHZ= 0x1,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_RATE;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY1= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY2= 0x1,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY3_RESERVED= 0x2,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_BY4= 0x3,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE_RESERVED= 0x4,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_MULTIPLE;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY1= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY2_RESERVED= 0x1,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY3= 0x2,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY4_RESERVED= 0x3,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY5_RESERVED= 0x4,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY6_RESERVED= 0x5,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY7_RESERVED= 0x6,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR_BY8_RESERVED= 0x7,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_SAMPLE_BASE_DIVISOR;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_8_RESERVED= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_16= 0x1,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_20= 0x2,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_24= 0x3,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_32_RESERVED= 0x4,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE_RESERVED= 0x5,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_BITS_PER_SAMPLE;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_1= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_2= 0x1,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_3= 0x2,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_4= 0x3,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_5= 0x4,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_6= 0x5,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_7= 0x6,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_8= 0x7,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS_RESERVED= 0x8,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT_NUMBER_OF_CHANNELS;
+typedef enum AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN {
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN_DIGITAL_TRANSMISSION_DISABLED= 0x0,
+       AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN_DIGITAL_TRANSMISSION_ENABLED= 0x1,
+} AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER_DIGEN;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL_IN_ENABLE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL_IN_ENABLE_PIN_SHUT_OFF= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL_IN_ENABLE_PIN_DRIVEN= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL_IN_ENABLE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_DISABLED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_ENABLE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE_MULTICHANNEL0_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE_MULTICHANNEL0_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE_MULTICHANNEL0_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE_MULTICHANNEL0_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE_MULTICHANNEL1_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE_MULTICHANNEL2_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE_MULTICHANNEL2_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE_MULTICHANNEL2_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE_MULTICHANNEL2_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE_MULTICHANNEL3_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE_MULTICHANNEL4_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE_MULTICHANNEL4_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE_MULTICHANNEL4_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE_MULTICHANNEL4_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE_MULTICHANNEL5_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE_MULTICHANNEL6_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE_MULTICHANNEL6_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE_MULTICHANNEL6_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE_MULTICHANNEL6_MUTE;
+typedef enum AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTE {
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_NOT_MUTED= 0x0,
+       AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTED= 0x1,
+} AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE_MULTICHANNEL7_MUTE;
+typedef enum BLND_CONTROL_BLND_MODE {
+       BLND_CONTROL_BLND_MODE_CURRENT_PIPE_ONLY         = 0x0,
+       BLND_CONTROL_BLND_MODE_OTHER_PIPE_ONLY           = 0x1,
+       BLND_CONTROL_BLND_MODE_ALPHA_BLENDING_MODE       = 0x2,
+       BLND_CONTROL_BLND_MODE_OTHER_STEREO_TYPE         = 0x3,
+} BLND_CONTROL_BLND_MODE;
+typedef enum BLND_CONTROL_BLND_STEREO_TYPE {
+       BLND_CONTROL_BLND_STEREO_TYPE_NON_SINGLE_PIPE_STEREO= 0x0,
+       BLND_CONTROL_BLND_STEREO_TYPE_SIDE_BY_SIDE_SINGLE_PIPE_STEREO= 0x1,
+       BLND_CONTROL_BLND_STEREO_TYPE_TOP_BOTTOM_SINGLE_PIPE_STEREO= 0x2,
+       BLND_CONTROL_BLND_STEREO_TYPE_UNUSED             = 0x3,
+} BLND_CONTROL_BLND_STEREO_TYPE;
+typedef enum BLND_CONTROL_BLND_STEREO_POLARITY {
+       BLND_CONTROL_BLND_STEREO_POLARITY_LOW            = 0x0,
+       BLND_CONTROL_BLND_STEREO_POLARITY_HIGH           = 0x1,
+} BLND_CONTROL_BLND_STEREO_POLARITY;
+typedef enum BLND_CONTROL_BLND_FEEDTHROUGH_EN {
+       BLND_CONTROL_BLND_FEEDTHROUGH_EN_FALSE           = 0x0,
+       BLND_CONTROL_BLND_FEEDTHROUGH_EN_TRUE            = 0x1,
+} BLND_CONTROL_BLND_FEEDTHROUGH_EN;
+typedef enum BLND_CONTROL_BLND_ALPHA_MODE {
+       BLND_CONTROL_BLND_ALPHA_MODE_CURRENT_PIXEL_ALPHA = 0x0,
+       BLND_CONTROL_BLND_ALPHA_MODE_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN= 0x1,
+       BLND_CONTROL_BLND_ALPHA_MODE_GLOBAL_ALPHA_ONLY   = 0x2,
+       BLND_CONTROL_BLND_ALPHA_MODE_UNUSED              = 0x3,
+} BLND_CONTROL_BLND_ALPHA_MODE;
+typedef enum BLND_CONTROL_BLND_ACTIVE_OVERLAP_ONLY {
+       BLND_CONTROL_BLND_ACTIVE_OVERLAY_ONLY_FALSE      = 0x0,
+       BLND_CONTROL_BLND_ACTIVE_OVERLAY_ONLY_TRUE       = 0x1,
+} BLND_CONTROL_BLND_ACTIVE_OVERLAP_ONLY;
+typedef enum BLND_CONTROL_BLND_MULTIPLIED_MODE {
+       BLND_CONTROL_BLND_MULTIPLIED_MODE_FALSE          = 0x0,
+       BLND_CONTROL_BLND_MULTIPLIED_MODE_TRUE           = 0x1,
+} BLND_CONTROL_BLND_MULTIPLIED_MODE;
+typedef enum BLND_SM_CONTROL2_SM_MODE {
+       BLND_SM_CONTROL2_SM_MODE_SINGLE_PLANE            = 0x0,
+       BLND_SM_CONTROL2_SM_MODE_ROW_SUBSAMPLING         = 0x2,
+       BLND_SM_CONTROL2_SM_MODE_COLUMN_SUBSAMPLING      = 0x4,
+       BLND_SM_CONTROL2_SM_MODE_CHECKERBOARD_SUBSAMPLING= 0x6,
+} BLND_SM_CONTROL2_SM_MODE;
+typedef enum BLND_SM_CONTROL2_SM_FRAME_ALTERNATE {
+       BLND_SM_CONTROL2_SM_FRAME_ALTERNATE_FALSE        = 0x0,
+       BLND_SM_CONTROL2_SM_FRAME_ALTERNATE_TRUE         = 0x1,
+} BLND_SM_CONTROL2_SM_FRAME_ALTERNATE;
+typedef enum BLND_SM_CONTROL2_SM_FIELD_ALTERNATE {
+       BLND_SM_CONTROL2_SM_FIELD_ALTERNATE_FALSE        = 0x0,
+       BLND_SM_CONTROL2_SM_FIELD_ALTERNATE_TRUE         = 0x1,
+} BLND_SM_CONTROL2_SM_FIELD_ALTERNATE;
+typedef enum BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL {
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_NO_FORCE= 0x0,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_RESERVED= 0x1,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_FORCE_LOW= 0x2,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_FORCE_HIGH= 0x3,
+} BLND_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL;
+typedef enum BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL {
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_NO_FORCE  = 0x0,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_RESERVED  = 0x1,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_FORCE_LOW = 0x2,
+       BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_FORCE_HIGH= 0x3,
+} BLND_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL;
+typedef enum BLND_CONTROL2_PTI_ENABLE {
+       BLND_CONTROL2_PTI_ENABLE_FALSE                   = 0x0,
+       BLND_CONTROL2_PTI_ENABLE_TRUE                    = 0x1,
+} BLND_CONTROL2_PTI_ENABLE;
+typedef enum BLND_CONTROL2_BLND_SUPERAA_DEGAMMA_EN {
+       BLND_CONTROL2_BLND_SUPERAA_DEGAMMA_EN_FALSE      = 0x0,
+       BLND_CONTROL2_BLND_SUPERAA_DEGAMMA_EN_TRUE       = 0x1,
+} BLND_CONTROL2_BLND_SUPERAA_DEGAMMA_EN;
+typedef enum BLND_CONTROL2_BLND_SUPERAA_REGAMMA_EN {
+       BLND_CONTROL2_BLND_SUPERAA_REGAMMA_EN_FALSE      = 0x0,
+       BLND_CONTROL2_BLND_SUPERAA_REGAMMA_EN_TRUE       = 0x1,
+} BLND_CONTROL2_BLND_SUPERAA_REGAMMA_EN;
+typedef enum BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK {
+       BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK_FALSE= 0x0,
+       BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK_TRUE= 0x1,
+} BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK;
+typedef enum BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK {
+       BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK_FALSE= 0x0,
+       BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK_TRUE= 0x1,
+} BLND_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK_FALSE= 0x0,
+       BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK_TRUE= 0x1,
+} BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_FALSE= 0x0,
+       BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_TRUE= 0x1,
+} BLND_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK_FALSE= 0x0,
+       BLND_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK_TRUE= 0x1,
+} BLND_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK_FALSE= 0x0,
+       BLND_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK_TRUE= 0x1,
+} BLND_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK_FALSE  = 0x0,
+       BLND_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK_TRUE   = 0x1,
+} BLND_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK {
+       BLND_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK_FALSE = 0x0,
+       BLND_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK_TRUE  = 0x1,
+} BLND_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK;
+typedef enum BLND_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE {
+       BLND_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE_FALSE = 0x0,
+       BLND_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE_TRUE  = 0x1,
+} BLND_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE;
+typedef enum BLND_DEBUG_BLND_CNV_MUX_SELECT {
+       BLND_DEBUG_BLND_CNV_MUX_SELECT_LOW               = 0x0,
+       BLND_DEBUG_BLND_CNV_MUX_SELECT_HIGH              = 0x1,
+} BLND_DEBUG_BLND_CNV_MUX_SELECT;
+typedef enum BLND_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN {
+       BLND_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN_FALSE= 0x0,
+       BLND_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN_TRUE= 0x1,
+} BLND_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN;
+typedef enum SurfaceEndian {
+       ENDIAN_NONE                                      = 0x0,
+       ENDIAN_8IN16                                     = 0x1,
+       ENDIAN_8IN32                                     = 0x2,
+       ENDIAN_8IN64                                     = 0x3,
+} SurfaceEndian;
+typedef enum ArrayMode {
+       ARRAY_LINEAR_GENERAL                             = 0x0,
+       ARRAY_LINEAR_ALIGNED                             = 0x1,
+       ARRAY_1D_TILED_THIN1                             = 0x2,
+       ARRAY_1D_TILED_THICK                             = 0x3,
+       ARRAY_2D_TILED_THIN1                             = 0x4,
+       ARRAY_PRT_TILED_THIN1                            = 0x5,
+       ARRAY_PRT_2D_TILED_THIN1                         = 0x6,
+       ARRAY_2D_TILED_THICK                             = 0x7,
+       ARRAY_2D_TILED_XTHICK                            = 0x8,
+       ARRAY_PRT_TILED_THICK                            = 0x9,
+       ARRAY_PRT_2D_TILED_THICK                         = 0xa,
+       ARRAY_PRT_3D_TILED_THIN1                         = 0xb,
+       ARRAY_3D_TILED_THIN1                             = 0xc,
+       ARRAY_3D_TILED_THICK                             = 0xd,
+       ARRAY_3D_TILED_XTHICK                            = 0xe,
+       ARRAY_PRT_3D_TILED_THICK                         = 0xf,
+} ArrayMode;
+typedef enum PipeTiling {
+       CONFIG_1_PIPE                                    = 0x0,
+       CONFIG_2_PIPE                                    = 0x1,
+       CONFIG_4_PIPE                                    = 0x2,
+       CONFIG_8_PIPE                                    = 0x3,
+} PipeTiling;
+typedef enum BankTiling {
+       CONFIG_4_BANK                                    = 0x0,
+       CONFIG_8_BANK                                    = 0x1,
+} BankTiling;
+typedef enum GroupInterleave {
+       CONFIG_256B_GROUP                                = 0x0,
+       CONFIG_512B_GROUP                                = 0x1,
+} GroupInterleave;
+typedef enum RowTiling {
+       CONFIG_1KB_ROW                                   = 0x0,
+       CONFIG_2KB_ROW                                   = 0x1,
+       CONFIG_4KB_ROW                                   = 0x2,
+       CONFIG_8KB_ROW                                   = 0x3,
+       CONFIG_1KB_ROW_OPT                               = 0x4,
+       CONFIG_2KB_ROW_OPT                               = 0x5,
+       CONFIG_4KB_ROW_OPT                               = 0x6,
+       CONFIG_8KB_ROW_OPT                               = 0x7,
+} RowTiling;
+typedef enum BankSwapBytes {
+       CONFIG_128B_SWAPS                                = 0x0,
+       CONFIG_256B_SWAPS                                = 0x1,
+       CONFIG_512B_SWAPS                                = 0x2,
+       CONFIG_1KB_SWAPS                                 = 0x3,
+} BankSwapBytes;
+typedef enum SampleSplitBytes {
+       CONFIG_1KB_SPLIT                                 = 0x0,
+       CONFIG_2KB_SPLIT                                 = 0x1,
+       CONFIG_4KB_SPLIT                                 = 0x2,
+       CONFIG_8KB_SPLIT                                 = 0x3,
+} SampleSplitBytes;
+typedef enum NumPipes {
+       ADDR_CONFIG_1_PIPE                               = 0x0,
+       ADDR_CONFIG_2_PIPE                               = 0x1,
+       ADDR_CONFIG_4_PIPE                               = 0x2,
+       ADDR_CONFIG_8_PIPE                               = 0x3,
+} NumPipes;
+typedef enum PipeInterleaveSize {
+       ADDR_CONFIG_PIPE_INTERLEAVE_256B                 = 0x0,
+       ADDR_CONFIG_PIPE_INTERLEAVE_512B                 = 0x1,
+} PipeInterleaveSize;
+typedef enum BankInterleaveSize {
+       ADDR_CONFIG_BANK_INTERLEAVE_1                    = 0x0,
+       ADDR_CONFIG_BANK_INTERLEAVE_2                    = 0x1,
+       ADDR_CONFIG_BANK_INTERLEAVE_4                    = 0x2,
+       ADDR_CONFIG_BANK_INTERLEAVE_8                    = 0x3,
+} BankInterleaveSize;
+typedef enum NumShaderEngines {
+       ADDR_CONFIG_1_SHADER_ENGINE                      = 0x0,
+       ADDR_CONFIG_2_SHADER_ENGINE                      = 0x1,
+} NumShaderEngines;
+typedef enum ShaderEngineTileSize {
+       ADDR_CONFIG_SE_TILE_16                           = 0x0,
+       ADDR_CONFIG_SE_TILE_32                           = 0x1,
+} ShaderEngineTileSize;
+typedef enum NumGPUs {
+       ADDR_CONFIG_1_GPU                                = 0x0,
+       ADDR_CONFIG_2_GPU                                = 0x1,
+       ADDR_CONFIG_4_GPU                                = 0x2,
+} NumGPUs;
+typedef enum MultiGPUTileSize {
+       ADDR_CONFIG_GPU_TILE_16                          = 0x0,
+       ADDR_CONFIG_GPU_TILE_32                          = 0x1,
+       ADDR_CONFIG_GPU_TILE_64                          = 0x2,
+       ADDR_CONFIG_GPU_TILE_128                         = 0x3,
+} MultiGPUTileSize;
+typedef enum RowSize {
+       ADDR_CONFIG_1KB_ROW                              = 0x0,
+       ADDR_CONFIG_2KB_ROW                              = 0x1,
+       ADDR_CONFIG_4KB_ROW                              = 0x2,
+} RowSize;
+typedef enum NumLowerPipes {
+       ADDR_CONFIG_1_LOWER_PIPES                        = 0x0,
+       ADDR_CONFIG_2_LOWER_PIPES                        = 0x1,
+} NumLowerPipes;
+typedef enum DebugBlockId {
+       DBG_CLIENT_BLKID_RESERVED                        = 0x0,
+       DBG_CLIENT_BLKID_dbg                             = 0x1,
+       DBG_CLIENT_BLKID_scf2                            = 0x2,
+       DBG_CLIENT_BLKID_mcd5                            = 0x3,
+       DBG_CLIENT_BLKID_vmc                             = 0x4,
+       DBG_CLIENT_BLKID_sx30                            = 0x5,
+       DBG_CLIENT_BLKID_mcd2                            = 0x6,
+       DBG_CLIENT_BLKID_bci1                            = 0x7,
+       DBG_CLIENT_BLKID_xdma_dbg_client_wrapper         = 0x8,
+       DBG_CLIENT_BLKID_mcc0                            = 0x9,
+       DBG_CLIENT_BLKID_uvdf_2                          = 0xa,
+       DBG_CLIENT_BLKID_uvdf_3                          = 0xb,
+       DBG_CLIENT_BLKID_uvdt_0                          = 0xc,
+       DBG_CLIENT_BLKID_uvdi_0                          = 0xd,
+       DBG_CLIENT_BLKID_bci0                            = 0xe,
+       DBG_CLIENT_BLKID_vceb0_1                         = 0xf,
+       DBG_CLIENT_BLKID_cb100                           = 0x10,
+       DBG_CLIENT_BLKID_cb001                           = 0x11,
+       DBG_CLIENT_BLKID_mcd4                            = 0x12,
+       DBG_CLIENT_BLKID_tmonw00                         = 0x13,
+       DBG_CLIENT_BLKID_cb101                           = 0x14,
+       DBG_CLIENT_BLKID_sx10                            = 0x15,
+       DBG_CLIENT_BLKID_cb301                           = 0x16,
+       DBG_CLIENT_BLKID_tmonw01                         = 0x17,
+       DBG_CLIENT_BLKID_vcea0_0                         = 0x18,
+       DBG_CLIENT_BLKID_vcea0_1                         = 0x19,
+       DBG_CLIENT_BLKID_vcea0_2                         = 0x1a,
+       DBG_CLIENT_BLKID_vcea0_3                         = 0x1b,
+       DBG_CLIENT_BLKID_scf1                            = 0x1c,
+       DBG_CLIENT_BLKID_sx20                            = 0x1d,
+       DBG_CLIENT_BLKID_spim1                           = 0x1e,
+       DBG_CLIENT_BLKID_pa10                            = 0x1f,
+       DBG_CLIENT_BLKID_pa00                            = 0x20,
+       DBG_CLIENT_BLKID_gmcon                           = 0x21,
+       DBG_CLIENT_BLKID_mcb                             = 0x22,
+       DBG_CLIENT_BLKID_vgt0                            = 0x23,
+       DBG_CLIENT_BLKID_pc0                             = 0x24,
+       DBG_CLIENT_BLKID_bci2                            = 0x25,
+       DBG_CLIENT_BLKID_uvdb_0                          = 0x26,
+       DBG_CLIENT_BLKID_spim3                           = 0x27,
+       DBG_CLIENT_BLKID_cpc_0                           = 0x28,
+       DBG_CLIENT_BLKID_cpc_1                           = 0x29,
+       DBG_CLIENT_BLKID_uvdm_0                          = 0x2a,
+       DBG_CLIENT_BLKID_uvdm_1                          = 0x2b,
+       DBG_CLIENT_BLKID_uvdm_2                          = 0x2c,
+       DBG_CLIENT_BLKID_uvdm_3                          = 0x2d,
+       DBG_CLIENT_BLKID_cb000                           = 0x2e,
+       DBG_CLIENT_BLKID_spim0                           = 0x2f,
+       DBG_CLIENT_BLKID_mcc2                            = 0x30,
+       DBG_CLIENT_BLKID_ds0                             = 0x31,
+       DBG_CLIENT_BLKID_srbm                            = 0x32,
+       DBG_CLIENT_BLKID_ih                              = 0x33,
+       DBG_CLIENT_BLKID_sem                             = 0x34,
+       DBG_CLIENT_BLKID_sdma_0                          = 0x35,
+       DBG_CLIENT_BLKID_sdma_1                          = 0x36,
+       DBG_CLIENT_BLKID_hdp                             = 0x37,
+       DBG_CLIENT_BLKID_cb200                           = 0x38,
+       DBG_CLIENT_BLKID_scf3                            = 0x39,
+       DBG_CLIENT_BLKID_vceb1_0                         = 0x3a,
+       DBG_CLIENT_BLKID_vcea1_0                         = 0x3b,
+       DBG_CLIENT_BLKID_vcea1_1                         = 0x3c,
+       DBG_CLIENT_BLKID_vcea1_2                         = 0x3d,
+       DBG_CLIENT_BLKID_vcea1_3                         = 0x3e,
+       DBG_CLIENT_BLKID_bci3                            = 0x3f,
+       DBG_CLIENT_BLKID_mcd0                            = 0x40,
+       DBG_CLIENT_BLKID_pa11                            = 0x41,
+       DBG_CLIENT_BLKID_pa01                            = 0x42,
+       DBG_CLIENT_BLKID_cb201                           = 0x43,
+       DBG_CLIENT_BLKID_spim2                           = 0x44,
+       DBG_CLIENT_BLKID_vgt2                            = 0x45,
+       DBG_CLIENT_BLKID_pc2                             = 0x46,
+       DBG_CLIENT_BLKID_smu_0                           = 0x47,
+       DBG_CLIENT_BLKID_smu_1                           = 0x48,
+       DBG_CLIENT_BLKID_smu_2                           = 0x49,
+       DBG_CLIENT_BLKID_cb1                             = 0x4a,
+       DBG_CLIENT_BLKID_ia0                             = 0x4b,
+       DBG_CLIENT_BLKID_wd                              = 0x4c,
+       DBG_CLIENT_BLKID_ia1                             = 0x4d,
+       DBG_CLIENT_BLKID_vcec1_0                         = 0x4e,
+       DBG_CLIENT_BLKID_scf0                            = 0x4f,
+       DBG_CLIENT_BLKID_vgt1                            = 0x50,
+       DBG_CLIENT_BLKID_pc1                             = 0x51,
+       DBG_CLIENT_BLKID_cb0                             = 0x52,
+       DBG_CLIENT_BLKID_gdc_one_0                       = 0x53,
+       DBG_CLIENT_BLKID_gdc_one_1                       = 0x54,
+       DBG_CLIENT_BLKID_gdc_one_2                       = 0x55,
+       DBG_CLIENT_BLKID_gdc_one_3                       = 0x56,
+       DBG_CLIENT_BLKID_gdc_one_4                       = 0x57,
+       DBG_CLIENT_BLKID_gdc_one_5                       = 0x58,
+       DBG_CLIENT_BLKID_gdc_one_6                       = 0x59,
+       DBG_CLIENT_BLKID_gdc_one_7                       = 0x5a,
+       DBG_CLIENT_BLKID_gdc_one_8                       = 0x5b,
+       DBG_CLIENT_BLKID_gdc_one_9                       = 0x5c,
+       DBG_CLIENT_BLKID_gdc_one_10                      = 0x5d,
+       DBG_CLIENT_BLKID_gdc_one_11                      = 0x5e,
+       DBG_CLIENT_BLKID_gdc_one_12                      = 0x5f,
+       DBG_CLIENT_BLKID_gdc_one_13                      = 0x60,
+       DBG_CLIENT_BLKID_gdc_one_14                      = 0x61,
+       DBG_CLIENT_BLKID_gdc_one_15                      = 0x62,
+       DBG_CLIENT_BLKID_gdc_one_16                      = 0x63,
+       DBG_CLIENT_BLKID_gdc_one_17                      = 0x64,
+       DBG_CLIENT_BLKID_gdc_one_18                      = 0x65,
+       DBG_CLIENT_BLKID_gdc_one_19                      = 0x66,
+       DBG_CLIENT_BLKID_gdc_one_20                      = 0x67,
+       DBG_CLIENT_BLKID_gdc_one_21                      = 0x68,
+       DBG_CLIENT_BLKID_gdc_one_22                      = 0x69,
+       DBG_CLIENT_BLKID_gdc_one_23                      = 0x6a,
+       DBG_CLIENT_BLKID_gdc_one_24                      = 0x6b,
+       DBG_CLIENT_BLKID_gdc_one_25                      = 0x6c,
+       DBG_CLIENT_BLKID_gdc_one_26                      = 0x6d,
+       DBG_CLIENT_BLKID_gdc_one_27                      = 0x6e,
+       DBG_CLIENT_BLKID_gdc_one_28                      = 0x6f,
+       DBG_CLIENT_BLKID_gdc_one_29                      = 0x70,
+       DBG_CLIENT_BLKID_gdc_one_30                      = 0x71,
+       DBG_CLIENT_BLKID_gdc_one_31                      = 0x72,
+       DBG_CLIENT_BLKID_gdc_one_32                      = 0x73,
+       DBG_CLIENT_BLKID_gdc_one_33                      = 0x74,
+       DBG_CLIENT_BLKID_gdc_one_34                      = 0x75,
+       DBG_CLIENT_BLKID_gdc_one_35                      = 0x76,
+       DBG_CLIENT_BLKID_vceb0_0                         = 0x77,
+       DBG_CLIENT_BLKID_vgt3                            = 0x78,
+       DBG_CLIENT_BLKID_pc3                             = 0x79,
+       DBG_CLIENT_BLKID_mcd3                            = 0x7a,
+       DBG_CLIENT_BLKID_uvdu_0                          = 0x7b,
+       DBG_CLIENT_BLKID_uvdu_1                          = 0x7c,
+       DBG_CLIENT_BLKID_uvdu_2                          = 0x7d,
+       DBG_CLIENT_BLKID_uvdu_3                          = 0x7e,
+       DBG_CLIENT_BLKID_uvdu_4                          = 0x7f,
+       DBG_CLIENT_BLKID_uvdu_5                          = 0x80,
+       DBG_CLIENT_BLKID_uvdu_6                          = 0x81,
+       DBG_CLIENT_BLKID_cb300                           = 0x82,
+       DBG_CLIENT_BLKID_mcd1                            = 0x83,
+       DBG_CLIENT_BLKID_sx00                            = 0x84,
+       DBG_CLIENT_BLKID_uvdf_0                          = 0x85,
+       DBG_CLIENT_BLKID_uvdf_1                          = 0x86,
+       DBG_CLIENT_BLKID_mcc3                            = 0x87,
+       DBG_CLIENT_BLKID_cpg_0                           = 0x88,
+       DBG_CLIENT_BLKID_cpg_1                           = 0x89,
+       DBG_CLIENT_BLKID_gck                             = 0x8a,
+       DBG_CLIENT_BLKID_mcc1                            = 0x8b,
+       DBG_CLIENT_BLKID_cpf_0                           = 0x8c,
+       DBG_CLIENT_BLKID_cpf_1                           = 0x8d,
+       DBG_CLIENT_BLKID_rlc                             = 0x8e,
+       DBG_CLIENT_BLKID_grbm                            = 0x8f,
+       DBG_CLIENT_BLKID_sammsp                          = 0x90,
+       DBG_CLIENT_BLKID_dci_pg                          = 0x91,
+       DBG_CLIENT_BLKID_dci_0                           = 0x92,
+       DBG_CLIENT_BLKID_dccg0_0                         = 0x93,
+       DBG_CLIENT_BLKID_dccg0_1                         = 0x94,
+       DBG_CLIENT_BLKID_dccg0_2                         = 0x95,
+       DBG_CLIENT_BLKID_dccg0_3                         = 0x96,
+       DBG_CLIENT_BLKID_dccg0_4                         = 0x97,
+       DBG_CLIENT_BLKID_dccg0_5                         = 0x98,
+       DBG_CLIENT_BLKID_dccg0_6                         = 0x99,
+       DBG_CLIENT_BLKID_dccg0_7                         = 0x9a,
+       DBG_CLIENT_BLKID_dccg0_8                         = 0x9b,
+       DBG_CLIENT_BLKID_dcfe01_0                        = 0x9c,
+       DBG_CLIENT_BLKID_dcfe02_0                        = 0x9d,
+       DBG_CLIENT_BLKID_dcfe03_0                        = 0x9e,
+       DBG_CLIENT_BLKID_dcfe04_0                        = 0x9f,
+       DBG_CLIENT_BLKID_dcfe05_0                        = 0xa0,
+       DBG_CLIENT_BLKID_dcfe06_0                        = 0xa1,
+       DBG_CLIENT_BLKID_uvde_0                          = 0xa2,
+       DBG_CLIENT_BLKID_RESERVED_LAST                   = 0xa3,
+} DebugBlockId;
+typedef enum DebugBlockId_OLD {
+       DBG_BLOCK_ID_RESERVED                            = 0x0,
+       DBG_BLOCK_ID_DBG                                 = 0x1,
+       DBG_BLOCK_ID_VMC                                 = 0x2,
+       DBG_BLOCK_ID_PDMA                                = 0x3,
+       DBG_BLOCK_ID_CG                                  = 0x4,
+       DBG_BLOCK_ID_SRBM                                = 0x5,
+       DBG_BLOCK_ID_GRBM                                = 0x6,
+       DBG_BLOCK_ID_RLC                                 = 0x7,
+       DBG_BLOCK_ID_CSC                                 = 0x8,
+       DBG_BLOCK_ID_SEM                                 = 0x9,
+       DBG_BLOCK_ID_IH                                  = 0xa,
+       DBG_BLOCK_ID_SC                                  = 0xb,
+       DBG_BLOCK_ID_SQ                                  = 0xc,
+       DBG_BLOCK_ID_AVP                                 = 0xd,
+       DBG_BLOCK_ID_GMCON                               = 0xe,
+       DBG_BLOCK_ID_SMU                                 = 0xf,
+       DBG_BLOCK_ID_DMA0                                = 0x10,
+       DBG_BLOCK_ID_DMA1                                = 0x11,
+       DBG_BLOCK_ID_SPIM                                = 0x12,
+       DBG_BLOCK_ID_GDS                                 = 0x13,
+       DBG_BLOCK_ID_SPIS                                = 0x14,
+       DBG_BLOCK_ID_UNUSED0                             = 0x15,
+       DBG_BLOCK_ID_PA0                                 = 0x16,
+       DBG_BLOCK_ID_PA1                                 = 0x17,
+       DBG_BLOCK_ID_CP0                                 = 0x18,
+       DBG_BLOCK_ID_CP1                                 = 0x19,
+       DBG_BLOCK_ID_CP2                                 = 0x1a,
+       DBG_BLOCK_ID_UNUSED1                             = 0x1b,
+       DBG_BLOCK_ID_UVDU                                = 0x1c,
+       DBG_BLOCK_ID_UVDM                                = 0x1d,
+       DBG_BLOCK_ID_VCE                                 = 0x1e,
+       DBG_BLOCK_ID_UNUSED2                             = 0x1f,
+       DBG_BLOCK_ID_VGT0                                = 0x20,
+       DBG_BLOCK_ID_VGT1                                = 0x21,
+       DBG_BLOCK_ID_IA                                  = 0x22,
+       DBG_BLOCK_ID_UNUSED3                             = 0x23,
+       DBG_BLOCK_ID_SCT0                                = 0x24,
+       DBG_BLOCK_ID_SCT1                                = 0x25,
+       DBG_BLOCK_ID_SPM0                                = 0x26,
+       DBG_BLOCK_ID_SPM1                                = 0x27,
+       DBG_BLOCK_ID_TCAA                                = 0x28,
+       DBG_BLOCK_ID_TCAB                                = 0x29,
+       DBG_BLOCK_ID_TCCA                                = 0x2a,
+       DBG_BLOCK_ID_TCCB                                = 0x2b,
+       DBG_BLOCK_ID_MCC0                                = 0x2c,
+       DBG_BLOCK_ID_MCC1                                = 0x2d,
+       DBG_BLOCK_ID_MCC2                                = 0x2e,
+       DBG_BLOCK_ID_MCC3                                = 0x2f,
+       DBG_BLOCK_ID_SX0                                 = 0x30,
+       DBG_BLOCK_ID_SX1                                 = 0x31,
+       DBG_BLOCK_ID_SX2                                 = 0x32,
+       DBG_BLOCK_ID_SX3                                 = 0x33,
+       DBG_BLOCK_ID_UNUSED4                             = 0x34,
+       DBG_BLOCK_ID_UNUSED5                             = 0x35,
+       DBG_BLOCK_ID_UNUSED6                             = 0x36,
+       DBG_BLOCK_ID_UNUSED7                             = 0x37,
+       DBG_BLOCK_ID_PC0                                 = 0x38,
+       DBG_BLOCK_ID_PC1                                 = 0x39,
+       DBG_BLOCK_ID_UNUSED8                             = 0x3a,
+       DBG_BLOCK_ID_UNUSED9                             = 0x3b,
+       DBG_BLOCK_ID_UNUSED10                            = 0x3c,
+       DBG_BLOCK_ID_UNUSED11                            = 0x3d,
+       DBG_BLOCK_ID_MCB                                 = 0x3e,
+       DBG_BLOCK_ID_UNUSED12                            = 0x3f,
+       DBG_BLOCK_ID_SCB0                                = 0x40,
+       DBG_BLOCK_ID_SCB1                                = 0x41,
+       DBG_BLOCK_ID_UNUSED13                            = 0x42,
+       DBG_BLOCK_ID_UNUSED14                            = 0x43,
+       DBG_BLOCK_ID_SCF0                                = 0x44,
+       DBG_BLOCK_ID_SCF1                                = 0x45,
+       DBG_BLOCK_ID_UNUSED15                            = 0x46,
+       DBG_BLOCK_ID_UNUSED16                            = 0x47,
+       DBG_BLOCK_ID_BCI0                                = 0x48,
+       DBG_BLOCK_ID_BCI1                                = 0x49,
+       DBG_BLOCK_ID_BCI2                                = 0x4a,
+       DBG_BLOCK_ID_BCI3                                = 0x4b,
+       DBG_BLOCK_ID_UNUSED17                            = 0x4c,
+       DBG_BLOCK_ID_UNUSED18                            = 0x4d,
+       DBG_BLOCK_ID_UNUSED19                            = 0x4e,
+       DBG_BLOCK_ID_UNUSED20                            = 0x4f,
+       DBG_BLOCK_ID_CB00                                = 0x50,
+       DBG_BLOCK_ID_CB01                                = 0x51,
+       DBG_BLOCK_ID_CB02                                = 0x52,
+       DBG_BLOCK_ID_CB03                                = 0x53,
+       DBG_BLOCK_ID_CB04                                = 0x54,
+       DBG_BLOCK_ID_UNUSED21                            = 0x55,
+       DBG_BLOCK_ID_UNUSED22                            = 0x56,
+       DBG_BLOCK_ID_UNUSED23                            = 0x57,
+       DBG_BLOCK_ID_CB10                                = 0x58,
+       DBG_BLOCK_ID_CB11                                = 0x59,
+       DBG_BLOCK_ID_CB12                                = 0x5a,
+       DBG_BLOCK_ID_CB13                                = 0x5b,
+       DBG_BLOCK_ID_CB14                                = 0x5c,
+       DBG_BLOCK_ID_UNUSED24                            = 0x5d,
+       DBG_BLOCK_ID_UNUSED25                            = 0x5e,
+       DBG_BLOCK_ID_UNUSED26                            = 0x5f,
+       DBG_BLOCK_ID_TCP0                                = 0x60,
+       DBG_BLOCK_ID_TCP1                                = 0x61,
+       DBG_BLOCK_ID_TCP2                                = 0x62,
+       DBG_BLOCK_ID_TCP3                                = 0x63,
+       DBG_BLOCK_ID_TCP4                                = 0x64,
+       DBG_BLOCK_ID_TCP5                                = 0x65,
+       DBG_BLOCK_ID_TCP6                                = 0x66,
+       DBG_BLOCK_ID_TCP7                                = 0x67,
+       DBG_BLOCK_ID_TCP8                                = 0x68,
+       DBG_BLOCK_ID_TCP9                                = 0x69,
+       DBG_BLOCK_ID_TCP10                               = 0x6a,
+       DBG_BLOCK_ID_TCP11                               = 0x6b,
+       DBG_BLOCK_ID_TCP12                               = 0x6c,
+       DBG_BLOCK_ID_TCP13                               = 0x6d,
+       DBG_BLOCK_ID_TCP14                               = 0x6e,
+       DBG_BLOCK_ID_TCP15                               = 0x6f,
+       DBG_BLOCK_ID_TCP16                               = 0x70,
+       DBG_BLOCK_ID_TCP17                               = 0x71,
+       DBG_BLOCK_ID_TCP18                               = 0x72,
+       DBG_BLOCK_ID_TCP19                               = 0x73,
+       DBG_BLOCK_ID_TCP20                               = 0x74,
+       DBG_BLOCK_ID_TCP21                               = 0x75,
+       DBG_BLOCK_ID_TCP22                               = 0x76,
+       DBG_BLOCK_ID_TCP23                               = 0x77,
+       DBG_BLOCK_ID_TCP_RESERVED0                       = 0x78,
+       DBG_BLOCK_ID_TCP_RESERVED1                       = 0x79,
+       DBG_BLOCK_ID_TCP_RESERVED2                       = 0x7a,
+       DBG_BLOCK_ID_TCP_RESERVED3                       = 0x7b,
+       DBG_BLOCK_ID_TCP_RESERVED4                       = 0x7c,
+       DBG_BLOCK_ID_TCP_RESERVED5                       = 0x7d,
+       DBG_BLOCK_ID_TCP_RESERVED6                       = 0x7e,
+       DBG_BLOCK_ID_TCP_RESERVED7                       = 0x7f,
+       DBG_BLOCK_ID_DB00                                = 0x80,
+       DBG_BLOCK_ID_DB01                                = 0x81,
+       DBG_BLOCK_ID_DB02                                = 0x82,
+       DBG_BLOCK_ID_DB03                                = 0x83,
+       DBG_BLOCK_ID_DB04                                = 0x84,
+       DBG_BLOCK_ID_UNUSED27                            = 0x85,
+       DBG_BLOCK_ID_UNUSED28                            = 0x86,
+       DBG_BLOCK_ID_UNUSED29                            = 0x87,
+       DBG_BLOCK_ID_DB10                                = 0x88,
+       DBG_BLOCK_ID_DB11                                = 0x89,
+       DBG_BLOCK_ID_DB12                                = 0x8a,
+       DBG_BLOCK_ID_DB13                                = 0x8b,
+       DBG_BLOCK_ID_DB14                                = 0x8c,
+       DBG_BLOCK_ID_UNUSED30                            = 0x8d,
+       DBG_BLOCK_ID_UNUSED31                            = 0x8e,
+       DBG_BLOCK_ID_UNUSED32                            = 0x8f,
+       DBG_BLOCK_ID_TCC0                                = 0x90,
+       DBG_BLOCK_ID_TCC1                                = 0x91,
+       DBG_BLOCK_ID_TCC2                                = 0x92,
+       DBG_BLOCK_ID_TCC3                                = 0x93,
+       DBG_BLOCK_ID_TCC4                                = 0x94,
+       DBG_BLOCK_ID_TCC5                                = 0x95,
+       DBG_BLOCK_ID_TCC6                                = 0x96,
+       DBG_BLOCK_ID_TCC7                                = 0x97,
+       DBG_BLOCK_ID_SPS00                               = 0x98,
+       DBG_BLOCK_ID_SPS01                               = 0x99,
+       DBG_BLOCK_ID_SPS02                               = 0x9a,
+       DBG_BLOCK_ID_SPS10                               = 0x9b,
+       DBG_BLOCK_ID_SPS11                               = 0x9c,
+       DBG_BLOCK_ID_SPS12                               = 0x9d,
+       DBG_BLOCK_ID_UNUSED33                            = 0x9e,
+       DBG_BLOCK_ID_UNUSED34                            = 0x9f,
+       DBG_BLOCK_ID_TA00                                = 0xa0,
+       DBG_BLOCK_ID_TA01                                = 0xa1,
+       DBG_BLOCK_ID_TA02                                = 0xa2,
+       DBG_BLOCK_ID_TA03                                = 0xa3,
+       DBG_BLOCK_ID_TA04                                = 0xa4,
+       DBG_BLOCK_ID_TA05                                = 0xa5,
+       DBG_BLOCK_ID_TA06                                = 0xa6,
+       DBG_BLOCK_ID_TA07                                = 0xa7,
+       DBG_BLOCK_ID_TA08                                = 0xa8,
+       DBG_BLOCK_ID_TA09                                = 0xa9,
+       DBG_BLOCK_ID_TA0A                                = 0xaa,
+       DBG_BLOCK_ID_TA0B                                = 0xab,
+       DBG_BLOCK_ID_UNUSED35                            = 0xac,
+       DBG_BLOCK_ID_UNUSED36                            = 0xad,
+       DBG_BLOCK_ID_UNUSED37                            = 0xae,
+       DBG_BLOCK_ID_UNUSED38                            = 0xaf,
+       DBG_BLOCK_ID_TA10                                = 0xb0,
+       DBG_BLOCK_ID_TA11                                = 0xb1,
+       DBG_BLOCK_ID_TA12                                = 0xb2,
+       DBG_BLOCK_ID_TA13                                = 0xb3,
+       DBG_BLOCK_ID_TA14                                = 0xb4,
+       DBG_BLOCK_ID_TA15                                = 0xb5,
+       DBG_BLOCK_ID_TA16                                = 0xb6,
+       DBG_BLOCK_ID_TA17                                = 0xb7,
+       DBG_BLOCK_ID_TA18                                = 0xb8,
+       DBG_BLOCK_ID_TA19                                = 0xb9,
+       DBG_BLOCK_ID_TA1A                                = 0xba,
+       DBG_BLOCK_ID_TA1B                                = 0xbb,
+       DBG_BLOCK_ID_UNUSED39                            = 0xbc,
+       DBG_BLOCK_ID_UNUSED40                            = 0xbd,
+       DBG_BLOCK_ID_UNUSED41                            = 0xbe,
+       DBG_BLOCK_ID_UNUSED42                            = 0xbf,
+       DBG_BLOCK_ID_TD00                                = 0xc0,
+       DBG_BLOCK_ID_TD01                                = 0xc1,
+       DBG_BLOCK_ID_TD02                                = 0xc2,
+       DBG_BLOCK_ID_TD03                                = 0xc3,
+       DBG_BLOCK_ID_TD04                                = 0xc4,
+       DBG_BLOCK_ID_TD05                                = 0xc5,
+       DBG_BLOCK_ID_TD06                                = 0xc6,
+       DBG_BLOCK_ID_TD07                                = 0xc7,
+       DBG_BLOCK_ID_TD08                                = 0xc8,
+       DBG_BLOCK_ID_TD09                                = 0xc9,
+       DBG_BLOCK_ID_TD0A                                = 0xca,
+       DBG_BLOCK_ID_TD0B                                = 0xcb,
+       DBG_BLOCK_ID_UNUSED43                            = 0xcc,
+       DBG_BLOCK_ID_UNUSED44                            = 0xcd,
+       DBG_BLOCK_ID_UNUSED45                            = 0xce,
+       DBG_BLOCK_ID_UNUSED46                            = 0xcf,
+       DBG_BLOCK_ID_TD10                                = 0xd0,
+       DBG_BLOCK_ID_TD11                                = 0xd1,
+       DBG_BLOCK_ID_TD12                                = 0xd2,
+       DBG_BLOCK_ID_TD13                                = 0xd3,
+       DBG_BLOCK_ID_TD14                                = 0xd4,
+       DBG_BLOCK_ID_TD15                                = 0xd5,
+       DBG_BLOCK_ID_TD16                                = 0xd6,
+       DBG_BLOCK_ID_TD17                                = 0xd7,
+       DBG_BLOCK_ID_TD18                                = 0xd8,
+       DBG_BLOCK_ID_TD19                                = 0xd9,
+       DBG_BLOCK_ID_TD1A                                = 0xda,
+       DBG_BLOCK_ID_TD1B                                = 0xdb,
+       DBG_BLOCK_ID_UNUSED47                            = 0xdc,
+       DBG_BLOCK_ID_UNUSED48                            = 0xdd,
+       DBG_BLOCK_ID_UNUSED49                            = 0xde,
+       DBG_BLOCK_ID_UNUSED50                            = 0xdf,
+       DBG_BLOCK_ID_MCD0                                = 0xe0,
+       DBG_BLOCK_ID_MCD1                                = 0xe1,
+       DBG_BLOCK_ID_MCD2                                = 0xe2,
+       DBG_BLOCK_ID_MCD3                                = 0xe3,
+       DBG_BLOCK_ID_MCD4                                = 0xe4,
+       DBG_BLOCK_ID_MCD5                                = 0xe5,
+       DBG_BLOCK_ID_UNUSED51                            = 0xe6,
+       DBG_BLOCK_ID_UNUSED52                            = 0xe7,
+} DebugBlockId_OLD;
+typedef enum DebugBlockId_BY2 {
+       DBG_BLOCK_ID_RESERVED_BY2                        = 0x0,
+       DBG_BLOCK_ID_VMC_BY2                             = 0x1,
+       DBG_BLOCK_ID_CG_BY2                              = 0x2,
+       DBG_BLOCK_ID_GRBM_BY2                            = 0x3,
+       DBG_BLOCK_ID_CSC_BY2                             = 0x4,
+       DBG_BLOCK_ID_IH_BY2                              = 0x5,
+       DBG_BLOCK_ID_SQ_BY2                              = 0x6,
+       DBG_BLOCK_ID_GMCON_BY2                           = 0x7,
+       DBG_BLOCK_ID_DMA0_BY2                            = 0x8,
+       DBG_BLOCK_ID_SPIM_BY2                            = 0x9,
+       DBG_BLOCK_ID_SPIS_BY2                            = 0xa,
+       DBG_BLOCK_ID_PA0_BY2                             = 0xb,
+       DBG_BLOCK_ID_CP0_BY2                             = 0xc,
+       DBG_BLOCK_ID_CP2_BY2                             = 0xd,
+       DBG_BLOCK_ID_UVDU_BY2                            = 0xe,
+       DBG_BLOCK_ID_VCE_BY2                             = 0xf,
+       DBG_BLOCK_ID_VGT0_BY2                            = 0x10,
+       DBG_BLOCK_ID_IA_BY2                              = 0x11,
+       DBG_BLOCK_ID_SCT0_BY2                            = 0x12,
+       DBG_BLOCK_ID_SPM0_BY2                            = 0x13,
+       DBG_BLOCK_ID_TCAA_BY2                            = 0x14,
+       DBG_BLOCK_ID_TCCA_BY2                            = 0x15,
+       DBG_BLOCK_ID_MCC0_BY2                            = 0x16,
+       DBG_BLOCK_ID_MCC2_BY2                            = 0x17,
+       DBG_BLOCK_ID_SX0_BY2                             = 0x18,
+       DBG_BLOCK_ID_SX2_BY2                             = 0x19,
+       DBG_BLOCK_ID_UNUSED4_BY2                         = 0x1a,
+       DBG_BLOCK_ID_UNUSED6_BY2                         = 0x1b,
+       DBG_BLOCK_ID_PC0_BY2                             = 0x1c,
+       DBG_BLOCK_ID_UNUSED8_BY2                         = 0x1d,
+       DBG_BLOCK_ID_UNUSED10_BY2                        = 0x1e,
+       DBG_BLOCK_ID_MCB_BY2                             = 0x1f,
+       DBG_BLOCK_ID_SCB0_BY2                            = 0x20,
+       DBG_BLOCK_ID_UNUSED13_BY2                        = 0x21,
+       DBG_BLOCK_ID_SCF0_BY2                            = 0x22,
+       DBG_BLOCK_ID_UNUSED15_BY2                        = 0x23,
+       DBG_BLOCK_ID_BCI0_BY2                            = 0x24,
+       DBG_BLOCK_ID_BCI2_BY2                            = 0x25,
+       DBG_BLOCK_ID_UNUSED17_BY2                        = 0x26,
+       DBG_BLOCK_ID_UNUSED19_BY2                        = 0x27,
+       DBG_BLOCK_ID_CB00_BY2                            = 0x28,
+       DBG_BLOCK_ID_CB02_BY2                            = 0x29,
+       DBG_BLOCK_ID_CB04_BY2                            = 0x2a,
+       DBG_BLOCK_ID_UNUSED22_BY2                        = 0x2b,
+       DBG_BLOCK_ID_CB10_BY2                            = 0x2c,
+       DBG_BLOCK_ID_CB12_BY2                            = 0x2d,
+       DBG_BLOCK_ID_CB14_BY2                            = 0x2e,
+       DBG_BLOCK_ID_UNUSED25_BY2                        = 0x2f,
+       DBG_BLOCK_ID_TCP0_BY2                            = 0x30,
+       DBG_BLOCK_ID_TCP2_BY2                            = 0x31,
+       DBG_BLOCK_ID_TCP4_BY2                            = 0x32,
+       DBG_BLOCK_ID_TCP6_BY2                            = 0x33,
+       DBG_BLOCK_ID_TCP8_BY2                            = 0x34,
+       DBG_BLOCK_ID_TCP10_BY2                           = 0x35,
+       DBG_BLOCK_ID_TCP12_BY2                           = 0x36,
+       DBG_BLOCK_ID_TCP14_BY2                           = 0x37,
+       DBG_BLOCK_ID_TCP16_BY2                           = 0x38,
+       DBG_BLOCK_ID_TCP18_BY2                           = 0x39,
+       DBG_BLOCK_ID_TCP20_BY2                           = 0x3a,
+       DBG_BLOCK_ID_TCP22_BY2                           = 0x3b,
+       DBG_BLOCK_ID_TCP_RESERVED0_BY2                   = 0x3c,
+       DBG_BLOCK_ID_TCP_RESERVED2_BY2                   = 0x3d,
+       DBG_BLOCK_ID_TCP_RESERVED4_BY2                   = 0x3e,
+       DBG_BLOCK_ID_TCP_RESERVED6_BY2                   = 0x3f,
+       DBG_BLOCK_ID_DB00_BY2                            = 0x40,
+       DBG_BLOCK_ID_DB02_BY2                            = 0x41,
+       DBG_BLOCK_ID_DB04_BY2                            = 0x42,
+       DBG_BLOCK_ID_UNUSED28_BY2                        = 0x43,
+       DBG_BLOCK_ID_DB10_BY2                            = 0x44,
+       DBG_BLOCK_ID_DB12_BY2                            = 0x45,
+       DBG_BLOCK_ID_DB14_BY2                            = 0x46,
+       DBG_BLOCK_ID_UNUSED31_BY2                        = 0x47,
+       DBG_BLOCK_ID_TCC0_BY2                            = 0x48,
+       DBG_BLOCK_ID_TCC2_BY2                            = 0x49,
+       DBG_BLOCK_ID_TCC4_BY2                            = 0x4a,
+       DBG_BLOCK_ID_TCC6_BY2                            = 0x4b,
+       DBG_BLOCK_ID_SPS00_BY2                           = 0x4c,
+       DBG_BLOCK_ID_SPS02_BY2                           = 0x4d,
+       DBG_BLOCK_ID_SPS11_BY2                           = 0x4e,
+       DBG_BLOCK_ID_UNUSED33_BY2                        = 0x4f,
+       DBG_BLOCK_ID_TA00_BY2                            = 0x50,
+       DBG_BLOCK_ID_TA02_BY2                            = 0x51,
+       DBG_BLOCK_ID_TA04_BY2                            = 0x52,
+       DBG_BLOCK_ID_TA06_BY2                            = 0x53,
+       DBG_BLOCK_ID_TA08_BY2                            = 0x54,
+       DBG_BLOCK_ID_TA0A_BY2                            = 0x55,
+       DBG_BLOCK_ID_UNUSED35_BY2                        = 0x56,
+       DBG_BLOCK_ID_UNUSED37_BY2                        = 0x57,
+       DBG_BLOCK_ID_TA10_BY2                            = 0x58,
+       DBG_BLOCK_ID_TA12_BY2                            = 0x59,
+       DBG_BLOCK_ID_TA14_BY2                            = 0x5a,
+       DBG_BLOCK_ID_TA16_BY2                            = 0x5b,
+       DBG_BLOCK_ID_TA18_BY2                            = 0x5c,
+       DBG_BLOCK_ID_TA1A_BY2                            = 0x5d,
+       DBG_BLOCK_ID_UNUSED39_BY2                        = 0x5e,
+       DBG_BLOCK_ID_UNUSED41_BY2                        = 0x5f,
+       DBG_BLOCK_ID_TD00_BY2                            = 0x60,
+       DBG_BLOCK_ID_TD02_BY2                            = 0x61,
+       DBG_BLOCK_ID_TD04_BY2                            = 0x62,
+       DBG_BLOCK_ID_TD06_BY2                            = 0x63,
+       DBG_BLOCK_ID_TD08_BY2                            = 0x64,
+       DBG_BLOCK_ID_TD0A_BY2                            = 0x65,
+       DBG_BLOCK_ID_UNUSED43_BY2                        = 0x66,
+       DBG_BLOCK_ID_UNUSED45_BY2                        = 0x67,
+       DBG_BLOCK_ID_TD10_BY2                            = 0x68,
+       DBG_BLOCK_ID_TD12_BY2                            = 0x69,
+       DBG_BLOCK_ID_TD14_BY2                            = 0x6a,
+       DBG_BLOCK_ID_TD16_BY2                            = 0x6b,
+       DBG_BLOCK_ID_TD18_BY2                            = 0x6c,
+       DBG_BLOCK_ID_TD1A_BY2                            = 0x6d,
+       DBG_BLOCK_ID_UNUSED47_BY2                        = 0x6e,
+       DBG_BLOCK_ID_UNUSED49_BY2                        = 0x6f,
+       DBG_BLOCK_ID_MCD0_BY2                            = 0x70,
+       DBG_BLOCK_ID_MCD2_BY2                            = 0x71,
+       DBG_BLOCK_ID_MCD4_BY2                            = 0x72,
+       DBG_BLOCK_ID_UNUSED51_BY2                        = 0x73,
+} DebugBlockId_BY2;
+typedef enum DebugBlockId_BY4 {
+       DBG_BLOCK_ID_RESERVED_BY4                        = 0x0,
+       DBG_BLOCK_ID_CG_BY4                              = 0x1,
+       DBG_BLOCK_ID_CSC_BY4                             = 0x2,
+       DBG_BLOCK_ID_SQ_BY4                              = 0x3,
+       DBG_BLOCK_ID_DMA0_BY4                            = 0x4,
+       DBG_BLOCK_ID_SPIS_BY4                            = 0x5,
+       DBG_BLOCK_ID_CP0_BY4                             = 0x6,
+       DBG_BLOCK_ID_UVDU_BY4                            = 0x7,
+       DBG_BLOCK_ID_VGT0_BY4                            = 0x8,
+       DBG_BLOCK_ID_SCT0_BY4                            = 0x9,
+       DBG_BLOCK_ID_TCAA_BY4                            = 0xa,
+       DBG_BLOCK_ID_MCC0_BY4                            = 0xb,
+       DBG_BLOCK_ID_SX0_BY4                             = 0xc,
+       DBG_BLOCK_ID_UNUSED4_BY4                         = 0xd,
+       DBG_BLOCK_ID_PC0_BY4                             = 0xe,
+       DBG_BLOCK_ID_UNUSED10_BY4                        = 0xf,
+       DBG_BLOCK_ID_SCB0_BY4                            = 0x10,
+       DBG_BLOCK_ID_SCF0_BY4                            = 0x11,
+       DBG_BLOCK_ID_BCI0_BY4                            = 0x12,
+       DBG_BLOCK_ID_UNUSED17_BY4                        = 0x13,
+       DBG_BLOCK_ID_CB00_BY4                            = 0x14,
+       DBG_BLOCK_ID_CB04_BY4                            = 0x15,
+       DBG_BLOCK_ID_CB10_BY4                            = 0x16,
+       DBG_BLOCK_ID_CB14_BY4                            = 0x17,
+       DBG_BLOCK_ID_TCP0_BY4                            = 0x18,
+       DBG_BLOCK_ID_TCP4_BY4                            = 0x19,
+       DBG_BLOCK_ID_TCP8_BY4                            = 0x1a,
+       DBG_BLOCK_ID_TCP12_BY4                           = 0x1b,
+       DBG_BLOCK_ID_TCP16_BY4                           = 0x1c,
+       DBG_BLOCK_ID_TCP20_BY4                           = 0x1d,
+       DBG_BLOCK_ID_TCP_RESERVED0_BY4                   = 0x1e,
+       DBG_BLOCK_ID_TCP_RESERVED4_BY4                   = 0x1f,
+       DBG_BLOCK_ID_DB_BY4                              = 0x20,
+       DBG_BLOCK_ID_DB04_BY4                            = 0x21,
+       DBG_BLOCK_ID_DB10_BY4                            = 0x22,
+       DBG_BLOCK_ID_DB14_BY4                            = 0x23,
+       DBG_BLOCK_ID_TCC0_BY4                            = 0x24,
+       DBG_BLOCK_ID_TCC4_BY4                            = 0x25,
+       DBG_BLOCK_ID_SPS00_BY4                           = 0x26,
+       DBG_BLOCK_ID_SPS11_BY4                           = 0x27,
+       DBG_BLOCK_ID_TA00_BY4                            = 0x28,
+       DBG_BLOCK_ID_TA04_BY4                            = 0x29,
+       DBG_BLOCK_ID_TA08_BY4                            = 0x2a,
+       DBG_BLOCK_ID_UNUSED35_BY4                        = 0x2b,
+       DBG_BLOCK_ID_TA10_BY4                            = 0x2c,
+       DBG_BLOCK_ID_TA14_BY4                            = 0x2d,
+       DBG_BLOCK_ID_TA18_BY4                            = 0x2e,
+       DBG_BLOCK_ID_UNUSED39_BY4                        = 0x2f,
+       DBG_BLOCK_ID_TD00_BY4                            = 0x30,
+       DBG_BLOCK_ID_TD04_BY4                            = 0x31,
+       DBG_BLOCK_ID_TD08_BY4                            = 0x32,
+       DBG_BLOCK_ID_UNUSED43_BY4                        = 0x33,
+       DBG_BLOCK_ID_TD10_BY4                            = 0x34,
+       DBG_BLOCK_ID_TD14_BY4                            = 0x35,
+       DBG_BLOCK_ID_TD18_BY4                            = 0x36,
+       DBG_BLOCK_ID_UNUSED47_BY4                        = 0x37,
+       DBG_BLOCK_ID_MCD0_BY4                            = 0x38,
+       DBG_BLOCK_ID_MCD4_BY4                            = 0x39,
+} DebugBlockId_BY4;
+typedef enum DebugBlockId_BY8 {
+       DBG_BLOCK_ID_RESERVED_BY8                        = 0x0,
+       DBG_BLOCK_ID_CSC_BY8                             = 0x1,
+       DBG_BLOCK_ID_DMA0_BY8                            = 0x2,
+       DBG_BLOCK_ID_CP0_BY8                             = 0x3,
+       DBG_BLOCK_ID_VGT0_BY8                            = 0x4,
+       DBG_BLOCK_ID_TCAA_BY8                            = 0x5,
+       DBG_BLOCK_ID_SX0_BY8                             = 0x6,
+       DBG_BLOCK_ID_PC0_BY8                             = 0x7,
+       DBG_BLOCK_ID_SCB0_BY8                            = 0x8,
+       DBG_BLOCK_ID_BCI0_BY8                            = 0x9,
+       DBG_BLOCK_ID_CB00_BY8                            = 0xa,
+       DBG_BLOCK_ID_CB10_BY8                            = 0xb,
+       DBG_BLOCK_ID_TCP0_BY8                            = 0xc,
+       DBG_BLOCK_ID_TCP8_BY8                            = 0xd,
+       DBG_BLOCK_ID_TCP16_BY8                           = 0xe,
+       DBG_BLOCK_ID_TCP_RESERVED0_BY8                   = 0xf,
+       DBG_BLOCK_ID_DB00_BY8                            = 0x10,
+       DBG_BLOCK_ID_DB10_BY8                            = 0x11,
+       DBG_BLOCK_ID_TCC0_BY8                            = 0x12,
+       DBG_BLOCK_ID_SPS00_BY8                           = 0x13,
+       DBG_BLOCK_ID_TA00_BY8                            = 0x14,
+       DBG_BLOCK_ID_TA08_BY8                            = 0x15,
+       DBG_BLOCK_ID_TA10_BY8                            = 0x16,
+       DBG_BLOCK_ID_TA18_BY8                            = 0x17,
+       DBG_BLOCK_ID_TD00_BY8                            = 0x18,
+       DBG_BLOCK_ID_TD08_BY8                            = 0x19,
+       DBG_BLOCK_ID_TD10_BY8                            = 0x1a,
+       DBG_BLOCK_ID_TD18_BY8                            = 0x1b,
+       DBG_BLOCK_ID_MCD0_BY8                            = 0x1c,
+} DebugBlockId_BY8;
+typedef enum DebugBlockId_BY16 {
+       DBG_BLOCK_ID_RESERVED_BY16                       = 0x0,
+       DBG_BLOCK_ID_DMA0_BY16                           = 0x1,
+       DBG_BLOCK_ID_VGT0_BY16                           = 0x2,
+       DBG_BLOCK_ID_SX0_BY16                            = 0x3,
+       DBG_BLOCK_ID_SCB0_BY16                           = 0x4,
+       DBG_BLOCK_ID_CB00_BY16                           = 0x5,
+       DBG_BLOCK_ID_TCP0_BY16                           = 0x6,
+       DBG_BLOCK_ID_TCP16_BY16                          = 0x7,
+       DBG_BLOCK_ID_DB00_BY16                           = 0x8,
+       DBG_BLOCK_ID_TCC0_BY16                           = 0x9,
+       DBG_BLOCK_ID_TA00_BY16                           = 0xa,
+       DBG_BLOCK_ID_TA10_BY16                           = 0xb,
+       DBG_BLOCK_ID_TD00_BY16                           = 0xc,
+       DBG_BLOCK_ID_TD10_BY16                           = 0xd,
+       DBG_BLOCK_ID_MCD0_BY16                           = 0xe,
+} DebugBlockId_BY16;
+typedef enum ColorTransform {
+       DCC_CT_AUTO                                      = 0x0,
+       DCC_CT_NONE                                      = 0x1,
+       ABGR_TO_A_BG_G_RB                                = 0x2,
+       BGRA_TO_BG_G_RB_A                                = 0x3,
+} ColorTransform;
+typedef enum CompareRef {
+       REF_NEVER                                        = 0x0,
+       REF_LESS                                         = 0x1,
+       REF_EQUAL                                        = 0x2,
+       REF_LEQUAL                                       = 0x3,
+       REF_GREATER                                      = 0x4,
+       REF_NOTEQUAL                                     = 0x5,
+       REF_GEQUAL                                       = 0x6,
+       REF_ALWAYS                                       = 0x7,
+} CompareRef;
+typedef enum ReadSize {
+       READ_256_BITS                                    = 0x0,
+       READ_512_BITS                                    = 0x1,
+} ReadSize;
+typedef enum DepthFormat {
+       DEPTH_INVALID                                    = 0x0,
+       DEPTH_16                                         = 0x1,
+       DEPTH_X8_24                                      = 0x2,
+       DEPTH_8_24                                       = 0x3,
+       DEPTH_X8_24_FLOAT                                = 0x4,
+       DEPTH_8_24_FLOAT                                 = 0x5,
+       DEPTH_32_FLOAT                                   = 0x6,
+       DEPTH_X24_8_32_FLOAT                             = 0x7,
+} DepthFormat;
+typedef enum ZFormat {
+       Z_INVALID                                        = 0x0,
+       Z_16                                             = 0x1,
+       Z_24                                             = 0x2,
+       Z_32_FLOAT                                       = 0x3,
+} ZFormat;
+typedef enum StencilFormat {
+       STENCIL_INVALID                                  = 0x0,
+       STENCIL_8                                        = 0x1,
+} StencilFormat;
+typedef enum CmaskMode {
+       CMASK_CLEAR_NONE                                 = 0x0,
+       CMASK_CLEAR_ONE                                  = 0x1,
+       CMASK_CLEAR_ALL                                  = 0x2,
+       CMASK_ANY_EXPANDED                               = 0x3,
+       CMASK_ALPHA0_FRAG1                               = 0x4,
+       CMASK_ALPHA0_FRAG2                               = 0x5,
+       CMASK_ALPHA0_FRAG4                               = 0x6,
+       CMASK_ALPHA0_FRAGS                               = 0x7,
+       CMASK_ALPHA1_FRAG1                               = 0x8,
+       CMASK_ALPHA1_FRAG2                               = 0x9,
+       CMASK_ALPHA1_FRAG4                               = 0xa,
+       CMASK_ALPHA1_FRAGS                               = 0xb,
+       CMASK_ALPHAX_FRAG1                               = 0xc,
+       CMASK_ALPHAX_FRAG2                               = 0xd,
+       CMASK_ALPHAX_FRAG4                               = 0xe,
+       CMASK_ALPHAX_FRAGS                               = 0xf,
+} CmaskMode;
+typedef enum QuadExportFormat {
+       EXPORT_UNUSED                                    = 0x0,
+       EXPORT_32_R                                      = 0x1,
+       EXPORT_32_GR                                     = 0x2,
+       EXPORT_32_AR                                     = 0x3,
+       EXPORT_FP16_ABGR                                 = 0x4,
+       EXPORT_UNSIGNED16_ABGR                           = 0x5,
+       EXPORT_SIGNED16_ABGR                             = 0x6,
+       EXPORT_32_ABGR                                   = 0x7,
+} QuadExportFormat;
+typedef enum QuadExportFormatOld {
+       EXPORT_4P_32BPC_ABGR                             = 0x0,
+       EXPORT_4P_16BPC_ABGR                             = 0x1,
+       EXPORT_4P_32BPC_GR                               = 0x2,
+       EXPORT_4P_32BPC_AR                               = 0x3,
+       EXPORT_2P_32BPC_ABGR                             = 0x4,
+       EXPORT_8P_32BPC_R                                = 0x5,
+} QuadExportFormatOld;
+typedef enum ColorFormat {
+       COLOR_INVALID                                    = 0x0,
+       COLOR_8                                          = 0x1,
+       COLOR_16                                         = 0x2,
+       COLOR_8_8                                        = 0x3,
+       COLOR_32                                         = 0x4,
+       COLOR_16_16                                      = 0x5,
+       COLOR_10_11_11                                   = 0x6,
+       COLOR_11_11_10                                   = 0x7,
+       COLOR_10_10_10_2                                 = 0x8,
+       COLOR_2_10_10_10                                 = 0x9,
+       COLOR_8_8_8_8                                    = 0xa,
+       COLOR_32_32                                      = 0xb,
+       COLOR_16_16_16_16                                = 0xc,
+       COLOR_RESERVED_13                                = 0xd,
+       COLOR_32_32_32_32                                = 0xe,
+       COLOR_RESERVED_15                                = 0xf,
+       COLOR_5_6_5                                      = 0x10,
+       COLOR_1_5_5_5                                    = 0x11,
+       COLOR_5_5_5_1                                    = 0x12,
+       COLOR_4_4_4_4                                    = 0x13,
+       COLOR_8_24                                       = 0x14,
+       COLOR_24_8                                       = 0x15,
+       COLOR_X24_8_32_FLOAT                             = 0x16,
+       COLOR_RESERVED_23                                = 0x17,
+} ColorFormat;
+typedef enum SurfaceFormat {
+       FMT_INVALID                                      = 0x0,
+       FMT_8                                            = 0x1,
+       FMT_16                                           = 0x2,
+       FMT_8_8                                          = 0x3,
+       FMT_32                                           = 0x4,
+       FMT_16_16                                        = 0x5,
+       FMT_10_11_11                                     = 0x6,
+       FMT_11_11_10                                     = 0x7,
+       FMT_10_10_10_2                                   = 0x8,
+       FMT_2_10_10_10                                   = 0x9,
+       FMT_8_8_8_8                                      = 0xa,
+       FMT_32_32                                        = 0xb,
+       FMT_16_16_16_16                                  = 0xc,
+       FMT_32_32_32                                     = 0xd,
+       FMT_32_32_32_32                                  = 0xe,
+       FMT_RESERVED_4                                   = 0xf,
+       FMT_5_6_5                                        = 0x10,
+       FMT_1_5_5_5                                      = 0x11,
+       FMT_5_5_5_1                                      = 0x12,
+       FMT_4_4_4_4                                      = 0x13,
+       FMT_8_24                                         = 0x14,
+       FMT_24_8                                         = 0x15,
+       FMT_X24_8_32_FLOAT                               = 0x16,
+       FMT_RESERVED_33                                  = 0x17,
+       FMT_11_11_10_FLOAT                               = 0x18,
+       FMT_16_FLOAT                                     = 0x19,
+       FMT_32_FLOAT                                     = 0x1a,
+       FMT_16_16_FLOAT                                  = 0x1b,
+       FMT_8_24_FLOAT                                   = 0x1c,
+       FMT_24_8_FLOAT                                   = 0x1d,
+       FMT_32_32_FLOAT                                  = 0x1e,
+       FMT_10_11_11_FLOAT                               = 0x1f,
+       FMT_16_16_16_16_FLOAT                            = 0x20,
+       FMT_3_3_2                                        = 0x21,
+       FMT_6_5_5                                        = 0x22,
+       FMT_32_32_32_32_FLOAT                            = 0x23,
+       FMT_RESERVED_36                                  = 0x24,
+       FMT_1                                            = 0x25,
+       FMT_1_REVERSED                                   = 0x26,
+       FMT_GB_GR                                        = 0x27,
+       FMT_BG_RG                                        = 0x28,
+       FMT_32_AS_8                                      = 0x29,
+       FMT_32_AS_8_8                                    = 0x2a,
+       FMT_5_9_9_9_SHAREDEXP                            = 0x2b,
+       FMT_8_8_8                                        = 0x2c,
+       FMT_16_16_16                                     = 0x2d,
+       FMT_16_16_16_FLOAT                               = 0x2e,
+       FMT_4_4                                          = 0x2f,
+       FMT_32_32_32_FLOAT                               = 0x30,
+       FMT_BC1                                          = 0x31,
+       FMT_BC2                                          = 0x32,
+       FMT_BC3                                          = 0x33,
+       FMT_BC4                                          = 0x34,
+       FMT_BC5                                          = 0x35,
+       FMT_BC6                                          = 0x36,
+       FMT_BC7                                          = 0x37,
+       FMT_32_AS_32_32_32_32                            = 0x38,
+       FMT_APC3                                         = 0x39,
+       FMT_APC4                                         = 0x3a,
+       FMT_APC5                                         = 0x3b,
+       FMT_APC6                                         = 0x3c,
+       FMT_APC7                                         = 0x3d,
+       FMT_CTX1                                         = 0x3e,
+       FMT_RESERVED_63                                  = 0x3f,
+} SurfaceFormat;
+typedef enum BUF_DATA_FORMAT {
+       BUF_DATA_FORMAT_INVALID                          = 0x0,
+       BUF_DATA_FORMAT_8                                = 0x1,
+       BUF_DATA_FORMAT_16                               = 0x2,
+       BUF_DATA_FORMAT_8_8                              = 0x3,
+       BUF_DATA_FORMAT_32                               = 0x4,
+       BUF_DATA_FORMAT_16_16                            = 0x5,
+       BUF_DATA_FORMAT_10_11_11                         = 0x6,
+       BUF_DATA_FORMAT_11_11_10                         = 0x7,
+       BUF_DATA_FORMAT_10_10_10_2                       = 0x8,
+       BUF_DATA_FORMAT_2_10_10_10                       = 0x9,
+       BUF_DATA_FORMAT_8_8_8_8                          = 0xa,
+       BUF_DATA_FORMAT_32_32                            = 0xb,
+       BUF_DATA_FORMAT_16_16_16_16                      = 0xc,
+       BUF_DATA_FORMAT_32_32_32                         = 0xd,
+       BUF_DATA_FORMAT_32_32_32_32                      = 0xe,
+       BUF_DATA_FORMAT_RESERVED_15                      = 0xf,
+} BUF_DATA_FORMAT;
+typedef enum IMG_DATA_FORMAT {
+       IMG_DATA_FORMAT_INVALID                          = 0x0,
+       IMG_DATA_FORMAT_8                                = 0x1,
+       IMG_DATA_FORMAT_16                               = 0x2,
+       IMG_DATA_FORMAT_8_8                              = 0x3,
+       IMG_DATA_FORMAT_32                               = 0x4,
+       IMG_DATA_FORMAT_16_16                            = 0x5,
+       IMG_DATA_FORMAT_10_11_11                         = 0x6,
+       IMG_DATA_FORMAT_11_11_10                         = 0x7,
+       IMG_DATA_FORMAT_10_10_10_2                       = 0x8,
+       IMG_DATA_FORMAT_2_10_10_10                       = 0x9,
+       IMG_DATA_FORMAT_8_8_8_8                          = 0xa,
+       IMG_DATA_FORMAT_32_32                            = 0xb,
+       IMG_DATA_FORMAT_16_16_16_16                      = 0xc,
+       IMG_DATA_FORMAT_32_32_32                         = 0xd,
+       IMG_DATA_FORMAT_32_32_32_32                      = 0xe,
+       IMG_DATA_FORMAT_RESERVED_15                      = 0xf,
+       IMG_DATA_FORMAT_5_6_5                            = 0x10,
+       IMG_DATA_FORMAT_1_5_5_5                          = 0x11,
+       IMG_DATA_FORMAT_5_5_5_1                          = 0x12,
+       IMG_DATA_FORMAT_4_4_4_4                          = 0x13,
+       IMG_DATA_FORMAT_8_24                             = 0x14,
+       IMG_DATA_FORMAT_24_8                             = 0x15,
+       IMG_DATA_FORMAT_X24_8_32                         = 0x16,
+       IMG_DATA_FORMAT_RESERVED_23                      = 0x17,
+       IMG_DATA_FORMAT_RESERVED_24                      = 0x18,
+       IMG_DATA_FORMAT_RESERVED_25                      = 0x19,
+       IMG_DATA_FORMAT_RESERVED_26                      = 0x1a,
+       IMG_DATA_FORMAT_RESERVED_27                      = 0x1b,
+       IMG_DATA_FORMAT_RESERVED_28                      = 0x1c,
+       IMG_DATA_FORMAT_RESERVED_29                      = 0x1d,
+       IMG_DATA_FORMAT_RESERVED_30                      = 0x1e,
+       IMG_DATA_FORMAT_RESERVED_31                      = 0x1f,
+       IMG_DATA_FORMAT_GB_GR                            = 0x20,
+       IMG_DATA_FORMAT_BG_RG                            = 0x21,
+       IMG_DATA_FORMAT_5_9_9_9                          = 0x22,
+       IMG_DATA_FORMAT_BC1                              = 0x23,
+       IMG_DATA_FORMAT_BC2                              = 0x24,
+       IMG_DATA_FORMAT_BC3                              = 0x25,
+       IMG_DATA_FORMAT_BC4                              = 0x26,
+       IMG_DATA_FORMAT_BC5                              = 0x27,
+       IMG_DATA_FORMAT_BC6                              = 0x28,
+       IMG_DATA_FORMAT_BC7                              = 0x29,
+       IMG_DATA_FORMAT_RESERVED_42                      = 0x2a,
+       IMG_DATA_FORMAT_RESERVED_43                      = 0x2b,
+       IMG_DATA_FORMAT_FMASK8_S2_F1                     = 0x2c,
+       IMG_DATA_FORMAT_FMASK8_S4_F1                     = 0x2d,
+       IMG_DATA_FORMAT_FMASK8_S8_F1                     = 0x2e,
+       IMG_DATA_FORMAT_FMASK8_S2_F2                     = 0x2f,
+       IMG_DATA_FORMAT_FMASK8_S4_F2                     = 0x30,
+       IMG_DATA_FORMAT_FMASK8_S4_F4                     = 0x31,
+       IMG_DATA_FORMAT_FMASK16_S16_F1                   = 0x32,
+       IMG_DATA_FORMAT_FMASK16_S8_F2                    = 0x33,
+       IMG_DATA_FORMAT_FMASK32_S16_F2                   = 0x34,
+       IMG_DATA_FORMAT_FMASK32_S8_F4                    = 0x35,
+       IMG_DATA_FORMAT_FMASK32_S8_F8                    = 0x36,
+       IMG_DATA_FORMAT_FMASK64_S16_F4                   = 0x37,
+       IMG_DATA_FORMAT_FMASK64_S16_F8                   = 0x38,
+       IMG_DATA_FORMAT_4_4                              = 0x39,
+       IMG_DATA_FORMAT_6_5_5                            = 0x3a,
+       IMG_DATA_FORMAT_1                                = 0x3b,
+       IMG_DATA_FORMAT_1_REVERSED                       = 0x3c,
+       IMG_DATA_FORMAT_32_AS_8                          = 0x3d,
+       IMG_DATA_FORMAT_32_AS_8_8                        = 0x3e,
+       IMG_DATA_FORMAT_32_AS_32_32_32_32                = 0x3f,
+} IMG_DATA_FORMAT;
+typedef enum BUF_NUM_FORMAT {
+       BUF_NUM_FORMAT_UNORM                             = 0x0,
+       BUF_NUM_FORMAT_SNORM                             = 0x1,
+       BUF_NUM_FORMAT_USCALED                           = 0x2,
+       BUF_NUM_FORMAT_SSCALED                           = 0x3,
+       BUF_NUM_FORMAT_UINT                              = 0x4,
+       BUF_NUM_FORMAT_SINT                              = 0x5,
+       BUF_NUM_FORMAT_RESERVED_6                        = 0x6,
+       BUF_NUM_FORMAT_FLOAT                             = 0x7,
+} BUF_NUM_FORMAT;
+typedef enum IMG_NUM_FORMAT {
+       IMG_NUM_FORMAT_UNORM                             = 0x0,
+       IMG_NUM_FORMAT_SNORM                             = 0x1,
+       IMG_NUM_FORMAT_USCALED                           = 0x2,
+       IMG_NUM_FORMAT_SSCALED                           = 0x3,
+       IMG_NUM_FORMAT_UINT                              = 0x4,
+       IMG_NUM_FORMAT_SINT                              = 0x5,
+       IMG_NUM_FORMAT_RESERVED_6                        = 0x6,
+       IMG_NUM_FORMAT_FLOAT                             = 0x7,
+       IMG_NUM_FORMAT_RESERVED_8                        = 0x8,
+       IMG_NUM_FORMAT_SRGB                              = 0x9,
+       IMG_NUM_FORMAT_RESERVED_10                       = 0xa,
+       IMG_NUM_FORMAT_RESERVED_11                       = 0xb,
+       IMG_NUM_FORMAT_RESERVED_12                       = 0xc,
+       IMG_NUM_FORMAT_RESERVED_13                       = 0xd,
+       IMG_NUM_FORMAT_RESERVED_14                       = 0xe,
+       IMG_NUM_FORMAT_RESERVED_15                       = 0xf,
+} IMG_NUM_FORMAT;
+typedef enum TileType {
+       ARRAY_COLOR_TILE                                 = 0x0,
+       ARRAY_DEPTH_TILE                                 = 0x1,
+} TileType;
+typedef enum NonDispTilingOrder {
+       ADDR_SURF_MICRO_TILING_DISPLAY                   = 0x0,
+       ADDR_SURF_MICRO_TILING_NON_DISPLAY               = 0x1,
+} NonDispTilingOrder;
+typedef enum MicroTileMode {
+       ADDR_SURF_DISPLAY_MICRO_TILING                   = 0x0,
+       ADDR_SURF_THIN_MICRO_TILING                      = 0x1,
+       ADDR_SURF_DEPTH_MICRO_TILING                     = 0x2,
+       ADDR_SURF_ROTATED_MICRO_TILING                   = 0x3,
+       ADDR_SURF_THICK_MICRO_TILING                     = 0x4,
+} MicroTileMode;
+typedef enum TileSplit {
+       ADDR_SURF_TILE_SPLIT_64B                         = 0x0,
+       ADDR_SURF_TILE_SPLIT_128B                        = 0x1,
+       ADDR_SURF_TILE_SPLIT_256B                        = 0x2,
+       ADDR_SURF_TILE_SPLIT_512B                        = 0x3,
+       ADDR_SURF_TILE_SPLIT_1KB                         = 0x4,
+       ADDR_SURF_TILE_SPLIT_2KB                         = 0x5,
+       ADDR_SURF_TILE_SPLIT_4KB                         = 0x6,
+} TileSplit;
+typedef enum SampleSplit {
+       ADDR_SURF_SAMPLE_SPLIT_1                         = 0x0,
+       ADDR_SURF_SAMPLE_SPLIT_2                         = 0x1,
+       ADDR_SURF_SAMPLE_SPLIT_4                         = 0x2,
+       ADDR_SURF_SAMPLE_SPLIT_8                         = 0x3,
+} SampleSplit;
+typedef enum PipeConfig {
+       ADDR_SURF_P2                                     = 0x0,
+       ADDR_SURF_P2_RESERVED0                           = 0x1,
+       ADDR_SURF_P2_RESERVED1                           = 0x2,
+       ADDR_SURF_P2_RESERVED2                           = 0x3,
+       ADDR_SURF_P4_8x16                                = 0x4,
+       ADDR_SURF_P4_16x16                               = 0x5,
+       ADDR_SURF_P4_16x32                               = 0x6,
+       ADDR_SURF_P4_32x32                               = 0x7,
+       ADDR_SURF_P8_16x16_8x16                          = 0x8,
+       ADDR_SURF_P8_16x32_8x16                          = 0x9,
+       ADDR_SURF_P8_32x32_8x16                          = 0xa,
+       ADDR_SURF_P8_16x32_16x16                         = 0xb,
+       ADDR_SURF_P8_32x32_16x16                         = 0xc,
+       ADDR_SURF_P8_32x32_16x32                         = 0xd,
+       ADDR_SURF_P8_32x64_32x32                         = 0xe,
+       ADDR_SURF_P8_RESERVED0                           = 0xf,
+       ADDR_SURF_P16_32x32_8x16                         = 0x10,
+       ADDR_SURF_P16_32x32_16x16                        = 0x11,
+} PipeConfig;
+typedef enum NumBanks {
+       ADDR_SURF_2_BANK                                 = 0x0,
+       ADDR_SURF_4_BANK                                 = 0x1,
+       ADDR_SURF_8_BANK                                 = 0x2,
+       ADDR_SURF_16_BANK                                = 0x3,
+} NumBanks;
+typedef enum BankWidth {
+       ADDR_SURF_BANK_WIDTH_1                           = 0x0,
+       ADDR_SURF_BANK_WIDTH_2                           = 0x1,
+       ADDR_SURF_BANK_WIDTH_4                           = 0x2,
+       ADDR_SURF_BANK_WIDTH_8                           = 0x3,
+} BankWidth;
+typedef enum BankHeight {
+       ADDR_SURF_BANK_HEIGHT_1                          = 0x0,
+       ADDR_SURF_BANK_HEIGHT_2                          = 0x1,
+       ADDR_SURF_BANK_HEIGHT_4                          = 0x2,
+       ADDR_SURF_BANK_HEIGHT_8                          = 0x3,
+} BankHeight;
+typedef enum BankWidthHeight {
+       ADDR_SURF_BANK_WH_1                              = 0x0,
+       ADDR_SURF_BANK_WH_2                              = 0x1,
+       ADDR_SURF_BANK_WH_4                              = 0x2,
+       ADDR_SURF_BANK_WH_8                              = 0x3,
+} BankWidthHeight;
+typedef enum MacroTileAspect {
+       ADDR_SURF_MACRO_ASPECT_1                         = 0x0,
+       ADDR_SURF_MACRO_ASPECT_2                         = 0x1,
+       ADDR_SURF_MACRO_ASPECT_4                         = 0x2,
+       ADDR_SURF_MACRO_ASPECT_8                         = 0x3,
+} MacroTileAspect;
+typedef enum GATCL1RequestType {
+       GATCL1_TYPE_NORMAL                               = 0x0,
+       GATCL1_TYPE_SHOOTDOWN                            = 0x1,
+       GATCL1_TYPE_BYPASS                               = 0x2,
+} GATCL1RequestType;
+typedef enum TCC_CACHE_POLICIES {
+       TCC_CACHE_POLICY_LRU                             = 0x0,
+       TCC_CACHE_POLICY_STREAM                          = 0x1,
+} TCC_CACHE_POLICIES;
+typedef enum MTYPE {
+       MTYPE_NC_NV                                      = 0x0,
+       MTYPE_NC                                         = 0x1,
+       MTYPE_CC                                         = 0x2,
+       MTYPE_UC                                         = 0x3,
+} MTYPE;
+typedef enum PERFMON_COUNTER_MODE {
+       PERFMON_COUNTER_MODE_ACCUM                       = 0x0,
+       PERFMON_COUNTER_MODE_ACTIVE_CYCLES               = 0x1,
+       PERFMON_COUNTER_MODE_MAX                         = 0x2,
+       PERFMON_COUNTER_MODE_DIRTY                       = 0x3,
+       PERFMON_COUNTER_MODE_SAMPLE                      = 0x4,
+       PERFMON_COUNTER_MODE_CYCLES_SINCE_FIRST_EVENT    = 0x5,
+       PERFMON_COUNTER_MODE_CYCLES_SINCE_LAST_EVENT     = 0x6,
+       PERFMON_COUNTER_MODE_CYCLES_GE_HI                = 0x7,
+       PERFMON_COUNTER_MODE_CYCLES_EQ_HI                = 0x8,
+       PERFMON_COUNTER_MODE_INACTIVE_CYCLES             = 0x9,
+       PERFMON_COUNTER_MODE_RESERVED                    = 0xf,
+} PERFMON_COUNTER_MODE;
+typedef enum PERFMON_SPM_MODE {
+       PERFMON_SPM_MODE_OFF                             = 0x0,
+       PERFMON_SPM_MODE_16BIT_CLAMP                     = 0x1,
+       PERFMON_SPM_MODE_16BIT_NO_CLAMP                  = 0x2,
+       PERFMON_SPM_MODE_32BIT_CLAMP                     = 0x3,
+       PERFMON_SPM_MODE_32BIT_NO_CLAMP                  = 0x4,
+       PERFMON_SPM_MODE_RESERVED_5                      = 0x5,
+       PERFMON_SPM_MODE_RESERVED_6                      = 0x6,
+       PERFMON_SPM_MODE_RESERVED_7                      = 0x7,
+       PERFMON_SPM_MODE_TEST_MODE_0                     = 0x8,
+       PERFMON_SPM_MODE_TEST_MODE_1                     = 0x9,
+       PERFMON_SPM_MODE_TEST_MODE_2                     = 0xa,
+} PERFMON_SPM_MODE;
+typedef enum SurfaceTiling {
+       ARRAY_LINEAR                                     = 0x0,
+       ARRAY_TILED                                      = 0x1,
+} SurfaceTiling;
+typedef enum SurfaceArray {
+       ARRAY_1D                                         = 0x0,
+       ARRAY_2D                                         = 0x1,
+       ARRAY_3D                                         = 0x2,
+       ARRAY_3D_SLICE                                   = 0x3,
+} SurfaceArray;
+typedef enum ColorArray {
+       ARRAY_2D_ALT_COLOR                               = 0x0,
+       ARRAY_2D_COLOR                                   = 0x1,
+       ARRAY_3D_SLICE_COLOR                             = 0x3,
+} ColorArray;
+typedef enum DepthArray {
+       ARRAY_2D_ALT_DEPTH                               = 0x0,
+       ARRAY_2D_DEPTH                                   = 0x1,
+} DepthArray;
+typedef enum ENUM_NUM_SIMD_PER_CU {
+       NUM_SIMD_PER_CU                                  = 0x4,
+} ENUM_NUM_SIMD_PER_CU;
+typedef enum MEM_PWR_FORCE_CTRL {
+       NO_FORCE_REQUEST                                 = 0x0,
+       FORCE_LIGHT_SLEEP_REQUEST                        = 0x1,
+       FORCE_DEEP_SLEEP_REQUEST                         = 0x2,
+       FORCE_SHUT_DOWN_REQUEST                          = 0x3,
+} MEM_PWR_FORCE_CTRL;
+typedef enum MEM_PWR_FORCE_CTRL2 {
+       NO_FORCE_REQ                                     = 0x0,
+       FORCE_LIGHT_SLEEP_REQ                            = 0x1,
+} MEM_PWR_FORCE_CTRL2;
+typedef enum MEM_PWR_DIS_CTRL {
+       ENABLE_MEM_PWR_CTRL                              = 0x0,
+       DISABLE_MEM_PWR_CTRL                             = 0x1,
+} MEM_PWR_DIS_CTRL;
+typedef enum MEM_PWR_SEL_CTRL {
+       DYNAMIC_SHUT_DOWN_ENABLE                         = 0x0,
+       DYNAMIC_DEEP_SLEEP_ENABLE                        = 0x1,
+       DYNAMIC_LIGHT_SLEEP_ENABLE                       = 0x2,
+} MEM_PWR_SEL_CTRL;
+typedef enum MEM_PWR_SEL_CTRL2 {
+       DYNAMIC_DEEP_SLEEP_EN                            = 0x0,
+       DYNAMIC_LIGHT_SLEEP_EN                           = 0x1,
+} MEM_PWR_SEL_CTRL2;
+typedef enum HPD_INT_CONTROL_ACK {
+       HPD_INT_CONTROL_ACK_0                            = 0x0,
+       HPD_INT_CONTROL_ACK_1                            = 0x1,
+} HPD_INT_CONTROL_ACK;
+typedef enum HPD_INT_CONTROL_POLARITY {
+       HPD_INT_CONTROL_GEN_INT_ON_DISCON                = 0x0,
+       HPD_INT_CONTROL_GEN_INT_ON_CON                   = 0x1,
+} HPD_INT_CONTROL_POLARITY;
+typedef enum HPD_INT_CONTROL_RX_INT_ACK {
+       HPD_INT_CONTROL_RX_INT_ACK_0                     = 0x0,
+       HPD_INT_CONTROL_RX_INT_ACK_1                     = 0x1,
+} HPD_INT_CONTROL_RX_INT_ACK;
+typedef enum DPDBG_EN {
+       DPDBG_DISABLE                                    = 0x0,
+       DPDBG_ENABLE                                     = 0x1,
+} DPDBG_EN;
+typedef enum DPDBG_INPUT_EN {
+       DPDBG_INPUT_DISABLE                              = 0x0,
+       DPDBG_INPUT_ENABLE                               = 0x1,
+} DPDBG_INPUT_EN;
+typedef enum DPDBG_ERROR_DETECTION_MODE {
+       DPDBG_ERROR_DETECTION_MODE_CSC                   = 0x0,
+       DPDBG_ERROR_DETECTION_MODE_RS_ENCODING           = 0x1,
+} DPDBG_ERROR_DETECTION_MODE;
+typedef enum DPDBG_FIFO_OVERFLOW_INTERRUPT_MASK {
+       DPDBG_FIFO_OVERFLOW_INT_DISABLE                  = 0x0,
+       DPDBG_FIFO_OVERFLOW_INT_ENABLE                   = 0x1,
+} DPDBG_FIFO_OVERFLOW_INTERRUPT_MASK;
+typedef enum DPDBG_FIFO_OVERFLOW_INTERRUPT_TYPE {
+       DPDBG_FIFO_OVERFLOW_INT_LEVEL_BASED              = 0x0,
+       DPDBG_FIFO_OVERFLOW_INT_PULSE_BASED              = 0x1,
+} DPDBG_FIFO_OVERFLOW_INTERRUPT_TYPE;
+typedef enum DPDBG_FIFO_OVERFLOW_INTERRUPT_ACK {
+       DPDBG_FIFO_OVERFLOW_INT_NO_ACK                   = 0x0,
+       DPDBG_FIFO_OVERFLOW_INT_CLEAR                    = 0x1,
+} DPDBG_FIFO_OVERFLOW_INTERRUPT_ACK;
+typedef enum PM_ASSERT_RESET {
+       PM_ASSERT_RESET_0                                = 0x0,
+       PM_ASSERT_RESET_1                                = 0x1,
+} PM_ASSERT_RESET;
+typedef enum DAC_MUX_SELECT {
+       DAC_MUX_SELECT_DACA                              = 0x0,
+       DAC_MUX_SELECT_DACB                              = 0x1,
+} DAC_MUX_SELECT;
+typedef enum TMDS_DVO_MUX_SELECT {
+       TMDS_DVO_MUX_SELECT_B                            = 0x0,
+       TMDS_DVO_MUX_SELECT_G                            = 0x1,
+       TMDS_DVO_MUX_SELECT_R                            = 0x2,
+       TMDS_DVO_MUX_SELECT_RESERVED                     = 0x3,
+} TMDS_DVO_MUX_SELECT;
+typedef enum DACA_SOFT_RESET {
+       DACA_SOFT_RESET_0                                = 0x0,
+       DACA_SOFT_RESET_1                                = 0x1,
+} DACA_SOFT_RESET;
+typedef enum I2S0_SPDIF0_SOFT_RESET {
+       I2S0_SPDIF0_SOFT_RESET_0                         = 0x0,
+       I2S0_SPDIF0_SOFT_RESET_1                         = 0x1,
+} I2S0_SPDIF0_SOFT_RESET;
+typedef enum I2S1_SOFT_RESET {
+       I2S1_SOFT_RESET_0                                = 0x0,
+       I2S1_SOFT_RESET_1                                = 0x1,
+} I2S1_SOFT_RESET;
+typedef enum SPDIF1_SOFT_RESET {
+       SPDIF1_SOFT_RESET_0                              = 0x0,
+       SPDIF1_SOFT_RESET_1                              = 0x1,
+} SPDIF1_SOFT_RESET;
+typedef enum DB_CLK_SOFT_RESET {
+       DB_CLK_SOFT_RESET_0                              = 0x0,
+       DB_CLK_SOFT_RESET_1                              = 0x1,
+} DB_CLK_SOFT_RESET;
+typedef enum FMT0_SOFT_RESET {
+       FMT0_SOFT_RESET_0                                = 0x0,
+       FMT0_SOFT_RESET_1                                = 0x1,
+} FMT0_SOFT_RESET;
+typedef enum FMT1_SOFT_RESET {
+       FMT1_SOFT_RESET_0                                = 0x0,
+       FMT1_SOFT_RESET_1                                = 0x1,
+} FMT1_SOFT_RESET;
+typedef enum FMT2_SOFT_RESET {
+       FMT2_SOFT_RESET_0                                = 0x0,
+       FMT2_SOFT_RESET_1                                = 0x1,
+} FMT2_SOFT_RESET;
+typedef enum FMT3_SOFT_RESET {
+       FMT3_SOFT_RESET_0                                = 0x0,
+       FMT3_SOFT_RESET_1                                = 0x1,
+} FMT3_SOFT_RESET;
+typedef enum FMT4_SOFT_RESET {
+       FMT4_SOFT_RESET_0                                = 0x0,
+       FMT4_SOFT_RESET_1                                = 0x1,
+} FMT4_SOFT_RESET;
+typedef enum FMT5_SOFT_RESET {
+       FMT5_SOFT_RESET_0                                = 0x0,
+       FMT5_SOFT_RESET_1                                = 0x1,
+} FMT5_SOFT_RESET;
+typedef enum MVP_SOFT_RESET {
+       MVP_SOFT_RESET_0                                 = 0x0,
+       MVP_SOFT_RESET_1                                 = 0x1,
+} MVP_SOFT_RESET;
+typedef enum ABM_SOFT_RESET {
+       ABM_SOFT_RESET_0                                 = 0x0,
+       ABM_SOFT_RESET_1                                 = 0x1,
+} ABM_SOFT_RESET;
+typedef enum DVO_SOFT_RESET {
+       DVO_SOFT_RESET_0                                 = 0x0,
+       DVO_SOFT_RESET_1                                 = 0x1,
+} DVO_SOFT_RESET;
+typedef enum DIGA_FE_SOFT_RESET {
+       DIGA_FE_SOFT_RESET_0                             = 0x0,
+       DIGA_FE_SOFT_RESET_1                             = 0x1,
+} DIGA_FE_SOFT_RESET;
+typedef enum DIGA_BE_SOFT_RESET {
+       DIGA_BE_SOFT_RESET_0                             = 0x0,
+       DIGA_BE_SOFT_RESET_1                             = 0x1,
+} DIGA_BE_SOFT_RESET;
+typedef enum DIGB_FE_SOFT_RESET {
+       DIGB_FE_SOFT_RESET_0                             = 0x0,
+       DIGB_FE_SOFT_RESET_1                             = 0x1,
+} DIGB_FE_SOFT_RESET;
+typedef enum DIGB_BE_SOFT_RESET {
+       DIGB_BE_SOFT_RESET_0                             = 0x0,
+       DIGB_BE_SOFT_RESET_1                             = 0x1,
+} DIGB_BE_SOFT_RESET;
+typedef enum DIGC_FE_SOFT_RESET {
+       DIGC_FE_SOFT_RESET_0                             = 0x0,
+       DIGC_FE_SOFT_RESET_1                             = 0x1,
+} DIGC_FE_SOFT_RESET;
+typedef enum DIGC_BE_SOFT_RESET {
+       DIGC_BE_SOFT_RESET_0                             = 0x0,
+       DIGC_BE_SOFT_RESET_1                             = 0x1,
+} DIGC_BE_SOFT_RESET;
+typedef enum DIGD_FE_SOFT_RESET {
+       DIGD_FE_SOFT_RESET_0                             = 0x0,
+       DIGD_FE_SOFT_RESET_1                             = 0x1,
+} DIGD_FE_SOFT_RESET;
+typedef enum DIGD_BE_SOFT_RESET {
+       DIGD_BE_SOFT_RESET_0                             = 0x0,
+       DIGD_BE_SOFT_RESET_1                             = 0x1,
+} DIGD_BE_SOFT_RESET;
+typedef enum DIGE_FE_SOFT_RESET {
+       DIGE_FE_SOFT_RESET_0                             = 0x0,
+       DIGE_FE_SOFT_RESET_1                             = 0x1,
+} DIGE_FE_SOFT_RESET;
+typedef enum DIGE_BE_SOFT_RESET {
+       DIGE_BE_SOFT_RESET_0                             = 0x0,
+       DIGE_BE_SOFT_RESET_1                             = 0x1,
+} DIGE_BE_SOFT_RESET;
+typedef enum DIGF_FE_SOFT_RESET {
+       DIGF_FE_SOFT_RESET_0                             = 0x0,
+       DIGF_FE_SOFT_RESET_1                             = 0x1,
+} DIGF_FE_SOFT_RESET;
+typedef enum DIGF_BE_SOFT_RESET {
+       DIGF_BE_SOFT_RESET_0                             = 0x0,
+       DIGF_BE_SOFT_RESET_1                             = 0x1,
+} DIGF_BE_SOFT_RESET;
+typedef enum DIGG_FE_SOFT_RESET {
+       DIGG_FE_SOFT_RESET_0                             = 0x0,
+       DIGG_FE_SOFT_RESET_1                             = 0x1,
+} DIGG_FE_SOFT_RESET;
+typedef enum DIGG_BE_SOFT_RESET {
+       DIGG_BE_SOFT_RESET_0                             = 0x0,
+       DIGG_BE_SOFT_RESET_1                             = 0x1,
+} DIGG_BE_SOFT_RESET;
+typedef enum DPDBG_SOFT_RESET {
+       DPDBG_SOFT_RESET_0                               = 0x0,
+       DPDBG_SOFT_RESET_1                               = 0x1,
+} DPDBG_SOFT_RESET;
+typedef enum DIGLPA_FE_SOFT_RESET {
+       DIGLPA_FE_SOFT_RESET_0                           = 0x0,
+       DIGLPA_FE_SOFT_RESET_1                           = 0x1,
+} DIGLPA_FE_SOFT_RESET;
+typedef enum DIGLPA_BE_SOFT_RESET {
+       DIGLPA_BE_SOFT_RESET_0                           = 0x0,
+       DIGLPA_BE_SOFT_RESET_1                           = 0x1,
+} DIGLPA_BE_SOFT_RESET;
+typedef enum DIGLPB_FE_SOFT_RESET {
+       DIGLPB_FE_SOFT_RESET_0                           = 0x0,
+       DIGLPB_FE_SOFT_RESET_1                           = 0x1,
+} DIGLPB_FE_SOFT_RESET;
+typedef enum DIGLPB_BE_SOFT_RESET {
+       DIGLPB_BE_SOFT_RESET_0                           = 0x0,
+       DIGLPB_BE_SOFT_RESET_1                           = 0x1,
+} DIGLPB_BE_SOFT_RESET;
+typedef enum GENERICA_STEREOSYNC_SEL {
+       GENERICA_STEREOSYNC_SEL_D1                       = 0x0,
+       GENERICA_STEREOSYNC_SEL_D2                       = 0x1,
+       GENERICA_STEREOSYNC_SEL_D3                       = 0x2,
+       GENERICA_STEREOSYNC_SEL_D4                       = 0x3,
+       GENERICA_STEREOSYNC_SEL_D5                       = 0x4,
+       GENERICA_STEREOSYNC_SEL_D6                       = 0x5,
+       GENERICA_STEREOSYNC_SEL_RESERVED                 = 0x6,
+} GENERICA_STEREOSYNC_SEL;
+typedef enum GENERICB_STEREOSYNC_SEL {
+       GENERICB_STEREOSYNC_SEL_D1                       = 0x0,
+       GENERICB_STEREOSYNC_SEL_D2                       = 0x1,
+       GENERICB_STEREOSYNC_SEL_D3                       = 0x2,
+       GENERICB_STEREOSYNC_SEL_D4                       = 0x3,
+       GENERICB_STEREOSYNC_SEL_D5                       = 0x4,
+       GENERICB_STEREOSYNC_SEL_D6                       = 0x5,
+       GENERICB_STEREOSYNC_SEL_RESERVED                 = 0x6,
+} GENERICB_STEREOSYNC_SEL;
+typedef enum DCO_DBG_BLOCK_SEL {
+       DCO_DBG_BLOCK_SEL_DCO                            = 0x0,
+       DCO_DBG_BLOCK_SEL_ABM                            = 0x1,
+       DCO_DBG_BLOCK_SEL_DVO                            = 0x2,
+       DCO_DBG_BLOCK_SEL_DAC                            = 0x3,
+       DCO_DBG_BLOCK_SEL_MVP                            = 0x4,
+       DCO_DBG_BLOCK_SEL_FMT0                           = 0x5,
+       DCO_DBG_BLOCK_SEL_FMT1                           = 0x6,
+       DCO_DBG_BLOCK_SEL_FMT2                           = 0x7,
+       DCO_DBG_BLOCK_SEL_FMT3                           = 0x8,
+       DCO_DBG_BLOCK_SEL_FMT4                           = 0x9,
+       DCO_DBG_BLOCK_SEL_FMT5                           = 0xa,
+       DCO_DBG_BLOCK_SEL_DIGFE_A                        = 0xb,
+       DCO_DBG_BLOCK_SEL_DIGFE_B                        = 0xc,
+       DCO_DBG_BLOCK_SEL_DIGFE_C                        = 0xd,
+       DCO_DBG_BLOCK_SEL_DIGFE_D                        = 0xe,
+       DCO_DBG_BLOCK_SEL_DIGFE_E                        = 0xf,
+       DCO_DBG_BLOCK_SEL_DIGFE_F                        = 0x10,
+       DCO_DBG_BLOCK_SEL_DIGFE_G                        = 0x11,
+       DCO_DBG_BLOCK_SEL_DIGA                           = 0x12,
+       DCO_DBG_BLOCK_SEL_DIGB                           = 0x13,
+       DCO_DBG_BLOCK_SEL_DIGC                           = 0x14,
+       DCO_DBG_BLOCK_SEL_DIGD                           = 0x15,
+       DCO_DBG_BLOCK_SEL_DIGE                           = 0x16,
+       DCO_DBG_BLOCK_SEL_DIGF                           = 0x17,
+       DCO_DBG_BLOCK_SEL_DIGG                           = 0x18,
+       DCO_DBG_BLOCK_SEL_DPFE_A                         = 0x19,
+       DCO_DBG_BLOCK_SEL_DPFE_B                         = 0x1a,
+       DCO_DBG_BLOCK_SEL_DPFE_C                         = 0x1b,
+       DCO_DBG_BLOCK_SEL_DPFE_D                         = 0x1c,
+       DCO_DBG_BLOCK_SEL_DPFE_E                         = 0x1d,
+       DCO_DBG_BLOCK_SEL_DPFE_F                         = 0x1e,
+       DCO_DBG_BLOCK_SEL_DPFE_G                         = 0x1f,
+       DCO_DBG_BLOCK_SEL_DPA                            = 0x20,
+       DCO_DBG_BLOCK_SEL_DPB                            = 0x21,
+       DCO_DBG_BLOCK_SEL_DPC                            = 0x22,
+       DCO_DBG_BLOCK_SEL_DPD                            = 0x23,
+       DCO_DBG_BLOCK_SEL_DPE                            = 0x24,
+       DCO_DBG_BLOCK_SEL_DPF                            = 0x25,
+       DCO_DBG_BLOCK_SEL_DPG                            = 0x26,
+       DCO_DBG_BLOCK_SEL_AUX0                           = 0x27,
+       DCO_DBG_BLOCK_SEL_AUX1                           = 0x28,
+       DCO_DBG_BLOCK_SEL_AUX2                           = 0x29,
+       DCO_DBG_BLOCK_SEL_AUX3                           = 0x2a,
+       DCO_DBG_BLOCK_SEL_AUX4                           = 0x2b,
+       DCO_DBG_BLOCK_SEL_AUX5                           = 0x2c,
+       DCO_DBG_BLOCK_SEL_PERFMON_DCO                    = 0x2d,
+       DCO_DBG_BLOCK_SEL_AUDIO_OUT                      = 0x2e,
+       DCO_DBG_BLOCK_SEL_DIGLPFEA                       = 0x2f,
+       DCO_DBG_BLOCK_SEL_DIGLPFEB                       = 0x30,
+       DCO_DBG_BLOCK_SEL_DIGLPA                         = 0x31,
+       DCO_DBG_BLOCK_SEL_DIGLPB                         = 0x32,
+       DCO_DBG_BLOCK_SEL_DPLPFEA                        = 0x33,
+       DCO_DBG_BLOCK_SEL_DPLPFEB                        = 0x34,
+       DCO_DBG_BLOCK_SEL_DPLPA                          = 0x35,
+       DCO_DBG_BLOCK_SEL_DPLPB                          = 0x36,
+} DCO_DBG_BLOCK_SEL;
+typedef enum DCO_DBG_CLOCK_SEL {
+       DCO_DBG_CLOCK_SEL_DISPCLK                        = 0x0,
+       DCO_DBG_CLOCK_SEL_SCLK                           = 0x1,
+       DCO_DBG_CLOCK_SEL_MVPCLK                         = 0x2,
+       DCO_DBG_CLOCK_SEL_DVOCLK                         = 0x3,
+       DCO_DBG_CLOCK_SEL_DACCLK                         = 0x4,
+       DCO_DBG_CLOCK_SEL_REFCLK                         = 0x5,
+       DCO_DBG_CLOCK_SEL_SYMCLKA                        = 0x6,
+       DCO_DBG_CLOCK_SEL_SYMCLKB                        = 0x7,
+       DCO_DBG_CLOCK_SEL_SYMCLKC                        = 0x8,
+       DCO_DBG_CLOCK_SEL_SYMCLKD                        = 0x9,
+       DCO_DBG_CLOCK_SEL_SYMCLKE                        = 0xa,
+       DCO_DBG_CLOCK_SEL_SYMCLKF                        = 0xb,
+       DCO_DBG_CLOCK_SEL_SYMCLKG                        = 0xc,
+       DCO_DBG_CLOCK_SEL_RESERVED                       = 0xd,
+       DCO_DBG_CLOCK_SEL_AM0CLK                         = 0xe,
+       DCO_DBG_CLOCK_SEL_AM1CLK                         = 0xf,
+       DCO_DBG_CLOCK_SEL_AM2CLK                         = 0x10,
+       DCO_DBG_CLOCK_SEL_SYMCLKLPA                      = 0x11,
+       DCO_DBG_CLOCK_SEL_SYMCLKLPB                      = 0x12,
+} DCO_DBG_CLOCK_SEL;
+typedef enum DCO_HDMI_RXSTATUS_TIMER_CONTROL_DCO_HDMI_RXSTATUS_TIMER_TYPE {
+       DCO_HDMI_RXSTATUS_TIMER_TYPE_LEVEL               = 0x0,
+       DCO_HDMI_RXSTATUS_TIMER_TYPE_PULSE               = 0x1,
+} DCO_HDMI_RXSTATUS_TIMER_CONTROL_DCO_HDMI_RXSTATUS_TIMER_TYPE;
+typedef enum FMT420_MEMORY_SOURCE_SEL {
+       FMT420_MEMORY_SOURCE_SEL_FMT0                    = 0x0,
+       FMT420_MEMORY_SOURCE_SEL_FMT1                    = 0x1,
+       FMT420_MEMORY_SOURCE_SEL_FMT2                    = 0x2,
+       FMT420_MEMORY_SOURCE_SEL_FMT3                    = 0x3,
+       FMT420_MEMORY_SOURCE_SEL_FMT4                    = 0x4,
+       FMT420_MEMORY_SOURCE_SEL_FMT5                    = 0x5,
+       FMT420_MEMORY_SOURCE_SEL_FMT_RESERVED            = 0x6,
+} FMT420_MEMORY_SOURCE_SEL;
+typedef enum DOUT_I2C_CONTROL_GO {
+       DOUT_I2C_CONTROL_STOP_TRANSFER                   = 0x0,
+       DOUT_I2C_CONTROL_START_TRANSFER                  = 0x1,
+} DOUT_I2C_CONTROL_GO;
+typedef enum DOUT_I2C_CONTROL_SOFT_RESET {
+       DOUT_I2C_CONTROL_NOT_RESET_I2C_CONTROLLER        = 0x0,
+       DOUT_I2C_CONTROL_RESET_I2C_CONTROLLER            = 0x1,
+} DOUT_I2C_CONTROL_SOFT_RESET;
+typedef enum DOUT_I2C_CONTROL_SEND_RESET {
+       DOUT_I2C_CONTROL__NOT_SEND_RESET                 = 0x0,
+       DOUT_I2C_CONTROL__SEND_RESET                     = 0x1,
+} DOUT_I2C_CONTROL_SEND_RESET;
+typedef enum DOUT_I2C_CONTROL_SW_STATUS_RESET {
+       DOUT_I2C_CONTROL_NOT_RESET_SW_STATUS             = 0x0,
+       DOUT_I2C_CONTROL_RESET_SW_STATUS                 = 0x1,
+} DOUT_I2C_CONTROL_SW_STATUS_RESET;
+typedef enum DOUT_I2C_CONTROL_DDC_SELECT {
+       DOUT_I2C_CONTROL_SELECT_DDC1                     = 0x0,
+       DOUT_I2C_CONTROL_SELECT_DDC2                     = 0x1,
+       DOUT_I2C_CONTROL_SELECT_DDC3                     = 0x2,
+       DOUT_I2C_CONTROL_SELECT_DDC4                     = 0x3,
+       DOUT_I2C_CONTROL_SELECT_DDC5                     = 0x4,
+       DOUT_I2C_CONTROL_SELECT_DDC6                     = 0x5,
+       DOUT_I2C_CONTROL_SELECT_DDCVGA                   = 0x6,
+} DOUT_I2C_CONTROL_DDC_SELECT;
+typedef enum DOUT_I2C_CONTROL_TRANSACTION_COUNT {
+       DOUT_I2C_CONTROL_TRANS0                          = 0x0,
+       DOUT_I2C_CONTROL_TRANS0_TRANS1                   = 0x1,
+       DOUT_I2C_CONTROL_TRANS0_TRANS1_TRANS2            = 0x2,
+       DOUT_I2C_CONTROL_TRANS0_TRANS1_TRANS2_TRANS3     = 0x3,
+} DOUT_I2C_CONTROL_TRANSACTION_COUNT;
+typedef enum DOUT_I2C_CONTROL_DBG_REF_SEL {
+       DOUT_I2C_CONTROL_NORMAL_DEBUG                    = 0x0,
+       DOUT_I2C_CONTROL_FAST_REFERENCE_DEBUG            = 0x1,
+} DOUT_I2C_CONTROL_DBG_REF_SEL;
+typedef enum DOUT_I2C_ARBITRATION_SW_PRIORITY {
+       DOUT_I2C_ARBITRATION_SW_PRIORITY_NORMAL          = 0x0,
+       DOUT_I2C_ARBITRATION_SW_PRIORITY_HIGH            = 0x1,
+       DOUT_I2C_ARBITRATION_SW_PRIORITY_0_RESERVED      = 0x2,
+       DOUT_I2C_ARBITRATION_SW_PRIORITY_1_RESERVED      = 0x3,
+} DOUT_I2C_ARBITRATION_SW_PRIORITY;
+typedef enum DOUT_I2C_ARBITRATION_NO_QUEUED_SW_GO {
+       DOUT_I2C_ARBITRATION_SW_QUEUE_ENABLED            = 0x0,
+       DOUT_I2C_ARBITRATION_SW_QUEUE_DISABLED           = 0x1,
+} DOUT_I2C_ARBITRATION_NO_QUEUED_SW_GO;
+typedef enum DOUT_I2C_ARBITRATION_ABORT_XFER {
+       DOUT_I2C_ARBITRATION_NOT_ABORT_CURRENT_TRANSFER  = 0x0,
+       DOUT_I2C_ARBITRATION_ABORT_CURRENT_TRANSFER      = 0x1,
+} DOUT_I2C_ARBITRATION_ABORT_XFER;
+typedef enum DOUT_I2C_ARBITRATION_USE_I2C_REG_REQ {
+       DOUT_I2C_ARBITRATION__NOT_USE_I2C_REG_REQ        = 0x0,
+       DOUT_I2C_ARBITRATION__USE_I2C_REG_REQ            = 0x1,
+} DOUT_I2C_ARBITRATION_USE_I2C_REG_REQ;
+typedef enum DOUT_I2C_ARBITRATION_DONE_USING_I2C_REG {
+       DOUT_I2C_ARBITRATION_DONE__NOT_USING_I2C_REG     = 0x0,
+       DOUT_I2C_ARBITRATION_DONE__USING_I2C_REG         = 0x1,
+} DOUT_I2C_ARBITRATION_DONE_USING_I2C_REG;
+typedef enum DOUT_I2C_ACK {
+       DOUT_I2C_NO_ACK                                  = 0x0,
+       DOUT_I2C_ACK_TO_CLEAN                            = 0x1,
+} DOUT_I2C_ACK;
+typedef enum DOUT_I2C_DDC_SPEED_THRESHOLD {
+       DOUT_I2C_DDC_SPEED_THRESHOLD_BIG_THAN_ZERO       = 0x0,
+       DOUT_I2C_DDC_SPEED_THRESHOLD_QUATER_OF_TOTAL_SAMPLE= 0x1,
+       DOUT_I2C_DDC_SPEED_THRESHOLD_HALF_OF_TOTAL_SAMPLE= 0x2,
+       DOUT_I2C_DDC_SPEED_THRESHOLD_THREE_QUATERS_OF_TOTAL_SAMPLE= 0x3,
+} DOUT_I2C_DDC_SPEED_THRESHOLD;
+typedef enum DOUT_I2C_DDC_SETUP_DATA_DRIVE_EN {
+       DOUT_I2C_DDC_SETUP_DATA_DRIVE_BY_EXTERNAL_RESISTOR= 0x0,
+       DOUT_I2C_DDC_SETUP_I2C_PAD_DRIVE_SDA             = 0x1,
+} DOUT_I2C_DDC_SETUP_DATA_DRIVE_EN;
+typedef enum DOUT_I2C_DDC_SETUP_DATA_DRIVE_SEL {
+       DOUT_I2C_DDC_SETUP_DATA_DRIVE_FOR_10MCLKS        = 0x0,
+       DOUT_I2C_DDC_SETUP_DATA_DRIVE_FOR_20MCLKS        = 0x1,
+} DOUT_I2C_DDC_SETUP_DATA_DRIVE_SEL;
+typedef enum DOUT_I2C_DDC_SETUP_EDID_DETECT_MODE {
+       DOUT_I2C_DDC_SETUP_EDID_DETECT_CONNECT           = 0x0,
+       DOUT_I2C_DDC_SETUP_EDID_DETECT_DISCONNECT        = 0x1,
+} DOUT_I2C_DDC_SETUP_EDID_DETECT_MODE;
+typedef enum DOUT_I2C_DDC_SETUP_CLK_DRIVE_EN {
+       DOUT_I2C_DDC_SETUP_CLK_DRIVE_BY_EXTERNAL_RESISTOR= 0x0,
+       DOUT_I2C_DDC_SETUP_I2C_PAD_DRIVE_SCL             = 0x1,
+} DOUT_I2C_DDC_SETUP_CLK_DRIVE_EN;
+typedef enum DOUT_I2C_TRANSACTION_STOP_ON_NACK {
+       DOUT_I2C_TRANSACTION_STOP_CURRENT_TRANS          = 0x0,
+       DOUT_I2C_TRANSACTION_STOP_ALL_TRANS              = 0x1,
+} DOUT_I2C_TRANSACTION_STOP_ON_NACK;
+typedef enum DOUT_I2C_DATA_INDEX_WRITE {
+       DOUT_I2C_DATA__NOT_INDEX_WRITE                   = 0x0,
+       DOUT_I2C_DATA__INDEX_WRITE                       = 0x1,
+} DOUT_I2C_DATA_INDEX_WRITE;
+typedef enum DOUT_I2C_EDID_DETECT_CTRL_SEND_RESET {
+       DOUT_I2C_EDID_NOT_SEND_RESET_BEFORE_EDID_READ_TRACTION= 0x0,
+       DOUT_I2C_EDID_SEND_RESET_BEFORE_EDID_READ_TRACTION= 0x1,
+} DOUT_I2C_EDID_DETECT_CTRL_SEND_RESET;
+typedef enum DOUT_I2C_READ_REQUEST_INTERRUPT_TYPE {
+       DOUT_I2C_READ_REQUEST_INTERRUPT_TYPE__LEVEL      = 0x0,
+       DOUT_I2C_READ_REQUEST_INTERRUPT_TYPE__PULSE      = 0x1,
+} DOUT_I2C_READ_REQUEST_INTERRUPT_TYPE;
+typedef enum BLNDV_CONTROL_BLND_MODE {
+       BLNDV_CONTROL_BLND_MODE_CURRENT_PIPE_ONLY        = 0x0,
+       BLNDV_CONTROL_BLND_MODE_OTHER_PIPE_ONLY          = 0x1,
+       BLNDV_CONTROL_BLND_MODE_ALPHA_BLENDING_MODE      = 0x2,
+       BLNDV_CONTROL_BLND_MODE_OTHER_STEREO_TYPE        = 0x3,
+} BLNDV_CONTROL_BLND_MODE;
+typedef enum BLNDV_CONTROL_BLND_STEREO_TYPE {
+       BLNDV_CONTROL_BLND_STEREO_TYPE_NON_SINGLE_PIPE_STEREO= 0x0,
+       BLNDV_CONTROL_BLND_STEREO_TYPE_SIDE_BY_SIDE_SINGLE_PIPE_STEREO= 0x1,
+       BLNDV_CONTROL_BLND_STEREO_TYPE_TOP_BOTTOM_SINGLE_PIPE_STEREO= 0x2,
+       BLNDV_CONTROL_BLND_STEREO_TYPE_UNUSED            = 0x3,
+} BLNDV_CONTROL_BLND_STEREO_TYPE;
+typedef enum BLNDV_CONTROL_BLND_STEREO_POLARITY {
+       BLNDV_CONTROL_BLND_STEREO_POLARITY_LOW           = 0x0,
+       BLNDV_CONTROL_BLND_STEREO_POLARITY_HIGH          = 0x1,
+} BLNDV_CONTROL_BLND_STEREO_POLARITY;
+typedef enum BLNDV_CONTROL_BLND_FEEDTHROUGH_EN {
+       BLNDV_CONTROL_BLND_FEEDTHROUGH_EN_FALSE          = 0x0,
+       BLNDV_CONTROL_BLND_FEEDTHROUGH_EN_TRUE           = 0x1,
+} BLNDV_CONTROL_BLND_FEEDTHROUGH_EN;
+typedef enum BLNDV_CONTROL_BLND_ALPHA_MODE {
+       BLNDV_CONTROL_BLND_ALPHA_MODE_CURRENT_PIXEL_ALPHA= 0x0,
+       BLNDV_CONTROL_BLND_ALPHA_MODE_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN= 0x1,
+       BLNDV_CONTROL_BLND_ALPHA_MODE_GLOBAL_ALPHA_ONLY  = 0x2,
+       BLNDV_CONTROL_BLND_ALPHA_MODE_UNUSED             = 0x3,
+} BLNDV_CONTROL_BLND_ALPHA_MODE;
+typedef enum BLNDV_CONTROL_BLND_ACTIVE_OVERLAP_ONLY {
+       BLNDV_CONTROL_BLND_ACTIVE_OVERLAP_ONLY_FALSE     = 0x0,
+       BLNDV_CONTROL_BLND_ACTIVE_OVERLAP_ONLY_TRUE      = 0x1,
+} BLNDV_CONTROL_BLND_ACTIVE_OVERLAP_ONLY;
+typedef enum BLNDV_CONTROL_BLND_MULTIPLIED_MODE {
+       BLNDV_CONTROL_BLND_MULTIPLIED_MODE_FALSE         = 0x0,
+       BLNDV_CONTROL_BLND_MULTIPLIED_MODE_TRUE          = 0x1,
+} BLNDV_CONTROL_BLND_MULTIPLIED_MODE;
+typedef enum BLNDV_SM_CONTROL2_SM_MODE {
+       BLNDV_SM_CONTROL2_SM_MODE_SINGLE_PLANE           = 0x0,
+       BLNDV_SM_CONTROL2_SM_MODE_ROW_SUBSAMPLING        = 0x2,
+       BLNDV_SM_CONTROL2_SM_MODE_COLUMN_SUBSAMPLING     = 0x4,
+       BLNDV_SM_CONTROL2_SM_MODE_CHECKERBOARD_SUBSAMPLING= 0x6,
+} BLNDV_SM_CONTROL2_SM_MODE;
+typedef enum BLNDV_SM_CONTROL2_SM_FRAME_ALTERNATE {
+       BLNDV_SM_CONTROL2_SM_FRAME_ALTERNATE_FALSE       = 0x0,
+       BLNDV_SM_CONTROL2_SM_FRAME_ALTERNATE_TRUE        = 0x1,
+} BLNDV_SM_CONTROL2_SM_FRAME_ALTERNATE;
+typedef enum BLNDV_SM_CONTROL2_SM_FIELD_ALTERNATE {
+       BLNDV_SM_CONTROL2_SM_FIELD_ALTERNATE_FALSE       = 0x0,
+       BLNDV_SM_CONTROL2_SM_FIELD_ALTERNATE_TRUE        = 0x1,
+} BLNDV_SM_CONTROL2_SM_FIELD_ALTERNATE;
+typedef enum BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL {
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_NO_FORCE= 0x0,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_RESERVED= 0x1,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_FORCE_LOW= 0x2,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL_FORCE_HIGH= 0x3,
+} BLNDV_SM_CONTROL2_SM_FORCE_NEXT_FRAME_POL;
+typedef enum BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL {
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_NO_FORCE = 0x0,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_RESERVED = 0x1,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_FORCE_LOW= 0x2,
+       BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL_FORCE_HIGH= 0x3,
+} BLNDV_SM_CONTROL2_SM_FORCE_NEXT_TOP_POL;
+typedef enum BLNDV_CONTROL2_PTI_ENABLE {
+       BLNDV_CONTROL2_PTI_ENABLE_FALSE                  = 0x0,
+       BLNDV_CONTROL2_PTI_ENABLE_TRUE                   = 0x1,
+} BLNDV_CONTROL2_PTI_ENABLE;
+typedef enum BLNDV_CONTROL2_BLND_SUPERAA_DEGAMMA_EN {
+       BLNDV_CONTROL2_BLND_SUPERAA_DEGAMMA_EN_FALSE     = 0x0,
+       BLNDV_CONTROL2_BLND_SUPERAA_DEGAMMA_EN_TRUE      = 0x1,
+} BLNDV_CONTROL2_BLND_SUPERAA_DEGAMMA_EN;
+typedef enum BLNDV_CONTROL2_BLND_SUPERAA_REGAMMA_EN {
+       BLNDV_CONTROL2_BLND_SUPERAA_REGAMMA_EN_FALSE     = 0x0,
+       BLNDV_CONTROL2_BLND_SUPERAA_REGAMMA_EN_TRUE      = 0x1,
+} BLNDV_CONTROL2_BLND_SUPERAA_REGAMMA_EN;
+typedef enum BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK {
+       BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK_FALSE= 0x0,
+       BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK_TRUE= 0x1,
+} BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_ACK;
+typedef enum BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK {
+       BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK_FALSE= 0x0,
+       BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK_TRUE= 0x1,
+} BLNDV_UNDERFLOW_INTERRUPT_BLND_UNDERFLOW_INT_MASK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK_TRUE= 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_TRUE= 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_DCP_GRPH_SURF_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK_TRUE= 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK_TRUE= 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_DCP_CUR2_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK_FALSE = 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK_TRUE  = 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_SCL_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK {
+       BLNDV_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK_TRUE = 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_BLND_V_UPDATE_LOCK;
+typedef enum BLNDV_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE {
+       BLNDV_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE_FALSE= 0x0,
+       BLNDV_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE_TRUE = 0x1,
+} BLNDV_V_UPDATE_LOCK_BLND_V_UPDATE_LOCK_MODE;
+typedef enum BLNDV_DEBUG_BLND_CNV_MUX_SELECT {
+       BLNDV_DEBUG_BLND_CNV_MUX_SELECT_LOW              = 0x0,
+       BLNDV_DEBUG_BLND_CNV_MUX_SELECT_HIGH             = 0x1,
+} BLNDV_DEBUG_BLND_CNV_MUX_SELECT;
+typedef enum BLNDV_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN {
+       BLNDV_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN_FALSE= 0x0,
+       BLNDV_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN_TRUE= 0x1,
+} BLNDV_TEST_DEBUG_INDEX_BLND_TEST_DEBUG_WRITE_EN;
+typedef enum DPCSTX_DBG_CFGCLK_SEL {
+       DPCSTX_DBG_CFGCLK_SEL_DC_DPCS_INF                = 0x0,
+       DPCSTX_DBG_CFGCLK_SEL_DPCS_BPHY_INF              = 0x1,
+       DPCSTX_DBG_CFGCLK_SEL_CBUS_SLAVE                 = 0x2,
+       DPCSTX_DBG_CFGCLK_SEL_CBUS_MASTER                = 0x3,
+} DPCSTX_DBG_CFGCLK_SEL;
+typedef enum DPCSTX_TX_SYMCLK_SEL {
+       DPCSTX_DBG_TX_SYMCLK_SEL_IN0                     = 0x0,
+       DPCSTX_DBG_TX_SYMCLK_SEL_IN1                     = 0x1,
+       DPCSTX_DBG_TX_SYMCLK_SEL_FIFO_WR                 = 0x2,
+} DPCSTX_TX_SYMCLK_SEL;
+typedef enum DPCSTX_TX_SYMCLK_DIV2_SEL {
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_OUT0               = 0x0,
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_OUT1               = 0x1,
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_OUT2               = 0x2,
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_OUT3               = 0x3,
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_FIFO_RD            = 0x4,
+       DPCSTX_DBG_TX_SYMCLK_DIV2_SEL_INT                = 0x5,
+} DPCSTX_TX_SYMCLK_DIV2_SEL;
+typedef enum DPCSTX_DBG_CLOCK_SEL {
+       DPCSTX_DBG_CLOCK_SEL_DC_CFGCLK                   = 0x0,
+       DPCSTX_DBG_CLOCK_SEL_PHY_CFGCLK                  = 0x1,
+       DPCSTX_DBG_CLOCK_SEL_TXSYMCLK                    = 0x2,
+} DPCSTX_DBG_CLOCK_SEL;
+typedef enum DPCSTX_DVI_LINK_MODE {
+       DPCSTX_DVI_LINK_MODE_NORMAL                      = 0x0,
+       DPCSTX_DVI_LINK_MODE_DUAL_LINK_MASTER            = 0x1,
+       DPCSTX_DVI_LINK_MODE_DUAL_LINK_SLAVER            = 0x2,
+} DPCSTX_DVI_LINK_MODE;
+
+#endif /* DCE_11_2_ENUM_H */
diff --git a/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_sh_mask.h b/drivers/gpu/drm/amd/include/asic_reg/dce/dce_11_2_sh_mask.h
new file mode 100755 (executable)
index 0000000..1ddc418
--- /dev/null
@@ -0,0 +1,18687 @@
+/*
+ * DCE_11_2 Register documentation
+ *
+ * Copyright (C) 2016  Advanced Micro Devices, 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) 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 DCE_11_2_SH_MASK_H
+#define DCE_11_2_SH_MASK_H
+
+#define PIPE0_PG_CONFIG__PIPE0_POWER_FORCEON_MASK 0x1
+#define PIPE0_PG_CONFIG__PIPE0_POWER_FORCEON__SHIFT 0x0
+#define PIPE0_PG_ENABLE__PIPE0_POWER_GATE_MASK 0x1
+#define PIPE0_PG_ENABLE__PIPE0_POWER_GATE__SHIFT 0x0
+#define PIPE0_PG_STATUS__PIPE0_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE0_PG_STATUS__PIPE0_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE0_PG_STATUS__PIPE0_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE0_PG_STATUS__PIPE0_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE0_PG_STATUS__PIPE0_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE0_PG_STATUS__PIPE0_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE0_PG_STATUS__PIPE0_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE0_PG_STATUS__PIPE0_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE0_PG_STATUS__PIPE0_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE0_PG_STATUS__PIPE0_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define PIPE1_PG_CONFIG__PIPE1_POWER_FORCEON_MASK 0x1
+#define PIPE1_PG_CONFIG__PIPE1_POWER_FORCEON__SHIFT 0x0
+#define PIPE1_PG_ENABLE__PIPE1_POWER_GATE_MASK 0x1
+#define PIPE1_PG_ENABLE__PIPE1_POWER_GATE__SHIFT 0x0
+#define PIPE1_PG_STATUS__PIPE1_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE1_PG_STATUS__PIPE1_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE1_PG_STATUS__PIPE1_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE1_PG_STATUS__PIPE1_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE1_PG_STATUS__PIPE1_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE1_PG_STATUS__PIPE1_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE1_PG_STATUS__PIPE1_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE1_PG_STATUS__PIPE1_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE1_PG_STATUS__PIPE1_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE1_PG_STATUS__PIPE1_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define PIPE2_PG_CONFIG__PIPE2_POWER_FORCEON_MASK 0x1
+#define PIPE2_PG_CONFIG__PIPE2_POWER_FORCEON__SHIFT 0x0
+#define PIPE2_PG_ENABLE__PIPE2_POWER_GATE_MASK 0x1
+#define PIPE2_PG_ENABLE__PIPE2_POWER_GATE__SHIFT 0x0
+#define PIPE2_PG_STATUS__PIPE2_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE2_PG_STATUS__PIPE2_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE2_PG_STATUS__PIPE2_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE2_PG_STATUS__PIPE2_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE2_PG_STATUS__PIPE2_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE2_PG_STATUS__PIPE2_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE2_PG_STATUS__PIPE2_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE2_PG_STATUS__PIPE2_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE2_PG_STATUS__PIPE2_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE2_PG_STATUS__PIPE2_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define PIPE3_PG_CONFIG__PIPE3_POWER_FORCEON_MASK 0x1
+#define PIPE3_PG_CONFIG__PIPE3_POWER_FORCEON__SHIFT 0x0
+#define PIPE3_PG_ENABLE__PIPE3_POWER_GATE_MASK 0x1
+#define PIPE3_PG_ENABLE__PIPE3_POWER_GATE__SHIFT 0x0
+#define PIPE3_PG_STATUS__PIPE3_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE3_PG_STATUS__PIPE3_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE3_PG_STATUS__PIPE3_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE3_PG_STATUS__PIPE3_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE3_PG_STATUS__PIPE3_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE3_PG_STATUS__PIPE3_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE3_PG_STATUS__PIPE3_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE3_PG_STATUS__PIPE3_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE3_PG_STATUS__PIPE3_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE3_PG_STATUS__PIPE3_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define PIPE4_PG_CONFIG__PIPE4_POWER_FORCEON_MASK 0x1
+#define PIPE4_PG_CONFIG__PIPE4_POWER_FORCEON__SHIFT 0x0
+#define PIPE4_PG_ENABLE__PIPE4_POWER_GATE_MASK 0x1
+#define PIPE4_PG_ENABLE__PIPE4_POWER_GATE__SHIFT 0x0
+#define PIPE4_PG_STATUS__PIPE4_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE4_PG_STATUS__PIPE4_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE4_PG_STATUS__PIPE4_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE4_PG_STATUS__PIPE4_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE4_PG_STATUS__PIPE4_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE4_PG_STATUS__PIPE4_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE4_PG_STATUS__PIPE4_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE4_PG_STATUS__PIPE4_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE4_PG_STATUS__PIPE4_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE4_PG_STATUS__PIPE4_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define PIPE5_PG_CONFIG__PIPE5_POWER_FORCEON_MASK 0x1
+#define PIPE5_PG_CONFIG__PIPE5_POWER_FORCEON__SHIFT 0x0
+#define PIPE5_PG_ENABLE__PIPE5_POWER_GATE_MASK 0x1
+#define PIPE5_PG_ENABLE__PIPE5_POWER_GATE__SHIFT 0x0
+#define PIPE5_PG_STATUS__PIPE5_PGFSM_READ_DATA_MASK 0xffffff
+#define PIPE5_PG_STATUS__PIPE5_PGFSM_READ_DATA__SHIFT 0x0
+#define PIPE5_PG_STATUS__PIPE5_DEBUG_PWR_STATUS_MASK 0x3000000
+#define PIPE5_PG_STATUS__PIPE5_DEBUG_PWR_STATUS__SHIFT 0x18
+#define PIPE5_PG_STATUS__PIPE5_DESIRED_PWR_STATE_MASK 0x10000000
+#define PIPE5_PG_STATUS__PIPE5_DESIRED_PWR_STATE__SHIFT 0x1c
+#define PIPE5_PG_STATUS__PIPE5_REQUESTED_PWR_STATE_MASK 0x20000000
+#define PIPE5_PG_STATUS__PIPE5_REQUESTED_PWR_STATE__SHIFT 0x1d
+#define PIPE5_PG_STATUS__PIPE5_PGFSM_PWR_STATUS_MASK 0xc0000000
+#define PIPE5_PG_STATUS__PIPE5_PGFSM_PWR_STATUS__SHIFT 0x1e
+#define DCPG_INTERRUPT_STATUS__DCFE0_POWER_UP_INT_OCCURRED_MASK 0x1
+#define DCPG_INTERRUPT_STATUS__DCFE0_POWER_UP_INT_OCCURRED__SHIFT 0x0
+#define DCPG_INTERRUPT_STATUS__DCFE0_POWER_DOWN_INT_OCCURRED_MASK 0x2
+#define DCPG_INTERRUPT_STATUS__DCFE0_POWER_DOWN_INT_OCCURRED__SHIFT 0x1
+#define DCPG_INTERRUPT_STATUS__DCFE1_POWER_UP_INT_OCCURRED_MASK 0x4
+#define DCPG_INTERRUPT_STATUS__DCFE1_POWER_UP_INT_OCCURRED__SHIFT 0x2
+#define DCPG_INTERRUPT_STATUS__DCFE1_POWER_DOWN_INT_OCCURRED_MASK 0x8
+#define DCPG_INTERRUPT_STATUS__DCFE1_POWER_DOWN_INT_OCCURRED__SHIFT 0x3
+#define DCPG_INTERRUPT_STATUS__DCFE2_POWER_UP_INT_OCCURRED_MASK 0x10
+#define DCPG_INTERRUPT_STATUS__DCFE2_POWER_UP_INT_OCCURRED__SHIFT 0x4
+#define DCPG_INTERRUPT_STATUS__DCFE2_POWER_DOWN_INT_OCCURRED_MASK 0x20
+#define DCPG_INTERRUPT_STATUS__DCFE2_POWER_DOWN_INT_OCCURRED__SHIFT 0x5
+#define DCPG_INTERRUPT_STATUS__DCFE3_POWER_UP_INT_OCCURRED_MASK 0x40
+#define DCPG_INTERRUPT_STATUS__DCFE3_POWER_UP_INT_OCCURRED__SHIFT 0x6
+#define DCPG_INTERRUPT_STATUS__DCFE3_POWER_DOWN_INT_OCCURRED_MASK 0x80
+#define DCPG_INTERRUPT_STATUS__DCFE3_POWER_DOWN_INT_OCCURRED__SHIFT 0x7
+#define DCPG_INTERRUPT_STATUS__DCFE4_POWER_UP_INT_OCCURRED_MASK 0x100
+#define DCPG_INTERRUPT_STATUS__DCFE4_POWER_UP_INT_OCCURRED__SHIFT 0x8
+#define DCPG_INTERRUPT_STATUS__DCFE4_POWER_DOWN_INT_OCCURRED_MASK 0x200
+#define DCPG_INTERRUPT_STATUS__DCFE4_POWER_DOWN_INT_OCCURRED__SHIFT 0x9
+#define DCPG_INTERRUPT_STATUS__DCFE5_POWER_UP_INT_OCCURRED_MASK 0x400
+#define DCPG_INTERRUPT_STATUS__DCFE5_POWER_UP_INT_OCCURRED__SHIFT 0xa
+#define DCPG_INTERRUPT_STATUS__DCFE5_POWER_DOWN_INT_OCCURRED_MASK 0x800
+#define DCPG_INTERRUPT_STATUS__DCFE5_POWER_DOWN_INT_OCCURRED__SHIFT 0xb
+#define DCPG_INTERRUPT_STATUS__DCFEV0_POWER_UP_INT_OCCURRED_MASK 0x1000
+#define DCPG_INTERRUPT_STATUS__DCFEV0_POWER_UP_INT_OCCURRED__SHIFT 0xc
+#define DCPG_INTERRUPT_STATUS__DCFEV0_POWER_DOWN_INT_OCCURRED_MASK 0x2000
+#define DCPG_INTERRUPT_STATUS__DCFEV0_POWER_DOWN_INT_OCCURRED__SHIFT 0xd
+#define DCPG_INTERRUPT_STATUS__DSI_POWER_UP_INT_OCCURRED_MASK 0x4000
+#define DCPG_INTERRUPT_STATUS__DSI_POWER_UP_INT_OCCURRED__SHIFT 0xe
+#define DCPG_INTERRUPT_STATUS__DSI_POWER_DOWN_INT_OCCURRED_MASK 0x8000
+#define DCPG_INTERRUPT_STATUS__DSI_POWER_DOWN_INT_OCCURRED__SHIFT 0xf
+#define DCPG_INTERRUPT_STATUS__DCFEV1_POWER_UP_INT_OCCURRED_MASK 0x10000
+#define DCPG_INTERRUPT_STATUS__DCFEV1_POWER_UP_INT_OCCURRED__SHIFT 0x10
+#define DCPG_INTERRUPT_STATUS__DCFEV1_POWER_DOWN_INT_OCCURRED_MASK 0x20000
+#define DCPG_INTERRUPT_STATUS__DCFEV1_POWER_DOWN_INT_OCCURRED__SHIFT 0x11
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_UP_INT_MASK_MASK 0x1
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_UP_INT_MASK__SHIFT 0x0
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_UP_INT_CLEAR_MASK 0x2
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_UP_INT_CLEAR__SHIFT 0x1
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_DOWN_INT_MASK_MASK 0x4
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_DOWN_INT_MASK__SHIFT 0x2
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_DOWN_INT_CLEAR_MASK 0x8
+#define DCPG_INTERRUPT_CONTROL__DCFE0_POWER_DOWN_INT_CLEAR__SHIFT 0x3
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_UP_INT_MASK_MASK 0x10
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_UP_INT_MASK__SHIFT 0x4
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_UP_INT_CLEAR_MASK 0x20
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_UP_INT_CLEAR__SHIFT 0x5
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_DOWN_INT_MASK_MASK 0x40
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_DOWN_INT_MASK__SHIFT 0x6
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_DOWN_INT_CLEAR_MASK 0x80
+#define DCPG_INTERRUPT_CONTROL__DCFE1_POWER_DOWN_INT_CLEAR__SHIFT 0x7
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_UP_INT_MASK_MASK 0x100
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_UP_INT_MASK__SHIFT 0x8
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_UP_INT_CLEAR_MASK 0x200
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_UP_INT_CLEAR__SHIFT 0x9
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_DOWN_INT_MASK_MASK 0x400
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_DOWN_INT_MASK__SHIFT 0xa
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_DOWN_INT_CLEAR_MASK 0x800
+#define DCPG_INTERRUPT_CONTROL__DCFE2_POWER_DOWN_INT_CLEAR__SHIFT 0xb
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_UP_INT_MASK_MASK 0x1000
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_UP_INT_MASK__SHIFT 0xc
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_UP_INT_CLEAR_MASK 0x2000
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_UP_INT_CLEAR__SHIFT 0xd
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_DOWN_INT_MASK_MASK 0x4000
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_DOWN_INT_MASK__SHIFT 0xe
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_DOWN_INT_CLEAR_MASK 0x8000
+#define DCPG_INTERRUPT_CONTROL__DCFE3_POWER_DOWN_INT_CLEAR__SHIFT 0xf
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_UP_INT_MASK_MASK 0x10000
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_UP_INT_MASK__SHIFT 0x10
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_UP_INT_CLEAR_MASK 0x20000
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_UP_INT_CLEAR__SHIFT 0x11
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_DOWN_INT_MASK_MASK 0x40000
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_DOWN_INT_MASK__SHIFT 0x12
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_DOWN_INT_CLEAR_MASK 0x80000
+#define DCPG_INTERRUPT_CONTROL__DCFE4_POWER_DOWN_INT_CLEAR__SHIFT 0x13
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_UP_INT_MASK_MASK 0x100000
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_UP_INT_MASK__SHIFT 0x14
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_UP_INT_CLEAR_MASK 0x200000
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_UP_INT_CLEAR__SHIFT 0x15
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_DOWN_INT_MASK_MASK 0x400000
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_DOWN_INT_MASK__SHIFT 0x16
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_DOWN_INT_CLEAR_MASK 0x800000
+#define DCPG_INTERRUPT_CONTROL__DCFE5_POWER_DOWN_INT_CLEAR__SHIFT 0x17
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_UP_INT_MASK_MASK 0x1000000
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_UP_INT_MASK__SHIFT 0x18
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_UP_INT_CLEAR_MASK 0x2000000
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_UP_INT_CLEAR__SHIFT 0x19
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_DOWN_INT_MASK_MASK 0x4000000
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_DOWN_INT_MASK__SHIFT 0x1a
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_DOWN_INT_CLEAR_MASK 0x8000000
+#define DCPG_INTERRUPT_CONTROL__DCFEV0_POWER_DOWN_INT_CLEAR__SHIFT 0x1b
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_UP_INT_MASK_MASK 0x10000000
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_UP_INT_MASK__SHIFT 0x1c
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_UP_INT_CLEAR_MASK 0x20000000
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_UP_INT_CLEAR__SHIFT 0x1d
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_DOWN_INT_MASK_MASK 0x40000000
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_DOWN_INT_MASK__SHIFT 0x1e
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_DOWN_INT_CLEAR_MASK 0x80000000
+#define DCPG_INTERRUPT_CONTROL__DSI_POWER_DOWN_INT_CLEAR__SHIFT 0x1f
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_UP_INT_MASK_MASK 0x1000000
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_UP_INT_MASK__SHIFT 0x18
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_UP_INT_CLEAR_MASK 0x2000000
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_UP_INT_CLEAR__SHIFT 0x19
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_DOWN_INT_MASK_MASK 0x4000000
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_DOWN_INT_MASK__SHIFT 0x1a
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_DOWN_INT_CLEAR_MASK 0x8000000
+#define DCPG_INTERRUPT_CONTROL2__DCFEV1_POWER_DOWN_INT_CLEAR__SHIFT 0x1b
+#define DC_IP_REQUEST_CNTL__IP_REQUEST_EN_MASK 0x1
+#define DC_IP_REQUEST_CNTL__IP_REQUEST_EN__SHIFT 0x0
+#define DC_PGFSM_CONFIG_REG__PGFSM_CONFIG_REG_MASK 0xffffffff
+#define DC_PGFSM_CONFIG_REG__PGFSM_CONFIG_REG__SHIFT 0x0
+#define DC_PGFSM_WRITE_REG__PGFSM_WRITE_REG_MASK 0xffffffff
+#define DC_PGFSM_WRITE_REG__PGFSM_WRITE_REG__SHIFT 0x0
+#define DC_PGCNTL_STATUS_REG__SWREQ_RWOP_BUSY_MASK 0x1
+#define DC_PGCNTL_STATUS_REG__SWREQ_RWOP_BUSY__SHIFT 0x0
+#define DC_PGCNTL_STATUS_REG__SWREQ_RWOP_FORCE_MASK 0x2
+#define DC_PGCNTL_STATUS_REG__SWREQ_RWOP_FORCE__SHIFT 0x1
+#define DC_PGCNTL_STATUS_REG__IPREQ_IGNORE_STATUS_MASK 0x4
+#define DC_PGCNTL_STATUS_REG__IPREQ_IGNORE_STATUS__SHIFT 0x2
+#define DC_PGCNTL_STATUS_REG__DCPG_ECO_DEBUG_MASK 0xffff0000
+#define DC_PGCNTL_STATUS_REG__DCPG_ECO_DEBUG__SHIFT 0x10
+#define DCPG_TEST_DEBUG_INDEX__DCPG_TEST_DEBUG_INDEX_MASK 0xff
+#define DCPG_TEST_DEBUG_INDEX__DCPG_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCPG_TEST_DEBUG_INDEX__DCPG_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCPG_TEST_DEBUG_INDEX__DCPG_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCPG_TEST_DEBUG_DATA__DCPG_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCPG_TEST_DEBUG_DATA__DCPG_TEST_DEBUG_DATA__SHIFT 0x0
+#define BL1_PWM_AMBIENT_LIGHT_LEVEL__BL1_PWM_AMBIENT_LIGHT_LEVEL_MASK 0x1ffff
+#define BL1_PWM_AMBIENT_LIGHT_LEVEL__BL1_PWM_AMBIENT_LIGHT_LEVEL__SHIFT 0x0
+#define BL1_PWM_USER_LEVEL__BL1_PWM_USER_LEVEL_MASK 0x1ffff
+#define BL1_PWM_USER_LEVEL__BL1_PWM_USER_LEVEL__SHIFT 0x0
+#define BL1_PWM_TARGET_ABM_LEVEL__BL1_PWM_TARGET_ABM_LEVEL_MASK 0x1ffff
+#define BL1_PWM_TARGET_ABM_LEVEL__BL1_PWM_TARGET_ABM_LEVEL__SHIFT 0x0
+#define BL1_PWM_CURRENT_ABM_LEVEL__BL1_PWM_CURRENT_ABM_LEVEL_MASK 0x1ffff
+#define BL1_PWM_CURRENT_ABM_LEVEL__BL1_PWM_CURRENT_ABM_LEVEL__SHIFT 0x0
+#define BL1_PWM_FINAL_DUTY_CYCLE__BL1_PWM_FINAL_DUTY_CYCLE_MASK 0x1ffff
+#define BL1_PWM_FINAL_DUTY_CYCLE__BL1_PWM_FINAL_DUTY_CYCLE__SHIFT 0x0
+#define BL1_PWM_MINIMUM_DUTY_CYCLE__BL1_PWM_MINIMUM_DUTY_CYCLE_MASK 0x1ffff
+#define BL1_PWM_MINIMUM_DUTY_CYCLE__BL1_PWM_MINIMUM_DUTY_CYCLE__SHIFT 0x0
+#define BL1_PWM_ABM_CNTL__BL1_PWM_USE_ABM_EN_MASK 0x1
+#define BL1_PWM_ABM_CNTL__BL1_PWM_USE_ABM_EN__SHIFT 0x0
+#define BL1_PWM_ABM_CNTL__BL1_PWM_USE_AMBIENT_LEVEL_EN_MASK 0x2
+#define BL1_PWM_ABM_CNTL__BL1_PWM_USE_AMBIENT_LEVEL_EN__SHIFT 0x1
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_UPDATE_CURRENT_ABM_LEVEL_EN_MASK 0x4
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_UPDATE_CURRENT_ABM_LEVEL_EN__SHIFT 0x2
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_CALC_FINAL_DUTY_CYCLE_EN_MASK 0x8
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_CALC_FINAL_DUTY_CYCLE_EN__SHIFT 0x3
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_UPDATE_CURRENT_ABM_STEP_SIZE_MASK 0xffff0000
+#define BL1_PWM_ABM_CNTL__BL1_PWM_AUTO_UPDATE_CURRENT_ABM_STEP_SIZE__SHIFT 0x10
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_SAMPLE_RATE_COUNT_EN_MASK 0x1
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_SAMPLE_RATE_COUNT_EN__SHIFT 0x0
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_RESET_SAMPLE_RATE_FRAME_COUNTER_MASK 0x2
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_RESET_SAMPLE_RATE_FRAME_COUNTER__SHIFT 0x1
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_SAMPLE_RATE_FRAME_COUNT_MASK 0xff00
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_SAMPLE_RATE_FRAME_COUNT__SHIFT 0x8
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET_MASK 0xff0000
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__BL1_PWM_BL_UPDATE_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET__SHIFT 0x10
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define BL1_PWM_BL_UPDATE_SAMPLE_RATE__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_REG_LOCK_MASK 0x1
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_REG_LOCK__SHIFT 0x0
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_REG_UPDATE_PENDING_MASK 0x100
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_REG_UPDATE_PENDING__SHIFT 0x8
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_UPDATE_AT_FRAME_START_MASK 0x10000
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_UPDATE_AT_FRAME_START__SHIFT 0x10
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_FRAME_START_DISP_SEL_MASK 0xe0000
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_FRAME_START_DISP_SEL__SHIFT 0x11
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_READBACK_DB_REG_VALUE_EN_MASK 0x1000000
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_READBACK_DB_REG_VALUE_EN__SHIFT 0x18
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_IGNORE_MASTER_LOCK_EN_MASK 0x80000000
+#define BL1_PWM_GRP2_REG_LOCK__BL1_PWM_GRP2_IGNORE_MASTER_LOCK_EN__SHIFT 0x1f
+#define DC_ABM1_CNTL__ABM1_EN_MASK 0x1
+#define DC_ABM1_CNTL__ABM1_EN__SHIFT 0x0
+#define DC_ABM1_CNTL__ABM1_SOURCE_SELECT_MASK 0x700
+#define DC_ABM1_CNTL__ABM1_SOURCE_SELECT__SHIFT 0x8
+#define DC_ABM1_CNTL__ABM1_BLANK_MODE_SUPPORT_ENABLE_MASK 0x80000000
+#define DC_ABM1_CNTL__ABM1_BLANK_MODE_SUPPORT_ENABLE__SHIFT 0x1f
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_B_MASK 0xf
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_B__SHIFT 0x0
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_G_MASK 0xf00
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_G__SHIFT 0x8
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_R_MASK 0xf0000
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_IPCSC_COEFF_SEL_R__SHIFT 0x10
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define DC_ABM1_IPCSC_COEFF_SEL__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_SLOPE_0_MASK 0x7fff
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_SLOPE_0__SHIFT 0x0
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_OFFSET_0_MASK 0x7ff0000
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_OFFSET_0__SHIFT 0x10
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_OFFSET_SLOPE_0__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_SLOPE_1_MASK 0x7fff
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_SLOPE_1__SHIFT 0x0
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_OFFSET_1_MASK 0x7ff0000
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_OFFSET_1__SHIFT 0x10
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_OFFSET_SLOPE_1__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_SLOPE_2_MASK 0x7fff
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_SLOPE_2__SHIFT 0x0
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_OFFSET_2_MASK 0x7ff0000
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_OFFSET_2__SHIFT 0x10
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_OFFSET_SLOPE_2__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_SLOPE_3_MASK 0x7fff
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_SLOPE_3__SHIFT 0x0
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_OFFSET_3_MASK 0x7ff0000
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_OFFSET_3__SHIFT 0x10
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_OFFSET_SLOPE_3__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_SLOPE_4_MASK 0x7fff
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_SLOPE_4__SHIFT 0x0
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_OFFSET_4_MASK 0x7ff0000
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_OFFSET_4__SHIFT 0x10
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_OFFSET_SLOPE_4__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_THRES_1_MASK 0x3ff
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_THRES_1__SHIFT 0x0
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_THRES_2_MASK 0x3ff0000
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_THRES_2__SHIFT 0x10
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_THRES_12__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_THRES_3_MASK 0x3ff
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_THRES_3__SHIFT 0x0
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_THRES_4_MASK 0x3ff0000
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_THRES_4__SHIFT 0x10
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_IGNORE_MASTER_LOCK_EN_MASK 0x10000000
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_IGNORE_MASTER_LOCK_EN__SHIFT 0x1c
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_READBACK_DB_REG_VALUE_EN_MASK 0x20000000
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_READBACK_DB_REG_VALUE_EN__SHIFT 0x1d
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_DBUF_REG_UPDATE_PENDING_MASK 0x40000000
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_DBUF_REG_UPDATE_PENDING__SHIFT 0x1e
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_LOCK_MASK 0x80000000
+#define DC_ABM1_ACE_THRES_34__ABM1_ACE_LOCK__SHIFT 0x1f
+#define DC_ABM1_ACE_CNTL_MISC__ABM1_ACE_REG_WR_MISSED_FRAME_MASK 0x1
+#define DC_ABM1_ACE_CNTL_MISC__ABM1_ACE_REG_WR_MISSED_FRAME__SHIFT 0x0
+#define DC_ABM1_ACE_CNTL_MISC__ABM1_ACE_REG_WR_MISSED_FRAME_CLEAR_MASK 0x100
+#define DC_ABM1_ACE_CNTL_MISC__ABM1_ACE_REG_WR_MISSED_FRAME_CLEAR__SHIFT 0x8
+#define DC_ABM1_DEBUG_MISC__ABM1_HG_FORCE_INTERRUPT_MASK 0x1
+#define DC_ABM1_DEBUG_MISC__ABM1_HG_FORCE_INTERRUPT__SHIFT 0x0
+#define DC_ABM1_DEBUG_MISC__ABM1_LS_FORCE_INTERRUPT_MASK 0x100
+#define DC_ABM1_DEBUG_MISC__ABM1_LS_FORCE_INTERRUPT__SHIFT 0x8
+#define DC_ABM1_DEBUG_MISC__ABM1_BL_FORCE_INTERRUPT_MASK 0x10000
+#define DC_ABM1_DEBUG_MISC__ABM1_BL_FORCE_INTERRUPT__SHIFT 0x10
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_IN_PROGRESS_MASK 0x1
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_IN_PROGRESS__SHIFT 0x0
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_IN_PROGRESS_MASK 0x2
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_IN_PROGRESS__SHIFT 0x1
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_IN_PROGRESS_MASK 0x4
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_IN_PROGRESS__SHIFT 0x2
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_MISSED_FRAME_MASK 0x100
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_MISSED_FRAME__SHIFT 0x8
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_MISSED_FRAME_MASK 0x200
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_MISSED_FRAME__SHIFT 0x9
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_MISSED_FRAME_MASK 0x400
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_MISSED_FRAME__SHIFT 0xa
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_MISSED_FRAME_CLEAR_MASK 0x10000
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_HG_REG_READ_MISSED_FRAME_CLEAR__SHIFT 0x10
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_MISSED_FRAME_CLEAR_MASK 0x1000000
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_LS_REG_READ_MISSED_FRAME_CLEAR__SHIFT 0x18
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_MISSED_FRAME_CLEAR_MASK 0x80000000
+#define DC_ABM1_HGLS_REG_READ_PROGRESS__ABM1_BL_REG_READ_MISSED_FRAME_CLEAR__SHIFT 0x1f
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_NUM_OF_BINS_SEL_MASK 0x3
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_NUM_OF_BINS_SEL__SHIFT 0x0
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_VMAX_SEL_MASK 0x100
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_VMAX_SEL__SHIFT 0x8
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_FINE_MODE_BIN_SEL_MASK 0x1000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_FINE_MODE_BIN_SEL__SHIFT 0xc
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_BIN_BITWIDTH_SIZE_SEL_MASK 0x30000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HG_BIN_BITWIDTH_SIZE_SEL__SHIFT 0x10
+#define DC_ABM1_HG_MISC_CTRL__ABM1_OVR_SCAN_PIXEL_PROCESS_EN_MASK 0x100000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_OVR_SCAN_PIXEL_PROCESS_EN__SHIFT 0x14
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_READBACK_DB_REG_VALUE_EN_MASK 0x800000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_READBACK_DB_REG_VALUE_EN__SHIFT 0x17
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_FRAME_START_DISP_SEL_MASK 0x7000000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_FRAME_START_DISP_SEL__SHIFT 0x18
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_UPDATE_AT_FRAME_START_MASK 0x10000000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_UPDATE_AT_FRAME_START__SHIFT 0x1c
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HGLS_IGNORE_MASTER_LOCK_EN_MASK 0x20000000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HGLS_IGNORE_MASTER_LOCK_EN__SHIFT 0x1d
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_UPDATE_PENDING_MASK 0x40000000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_DBUF_HGLS_REG_UPDATE_PENDING__SHIFT 0x1e
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define DC_ABM1_HG_MISC_CTRL__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define DC_ABM1_LS_SUM_OF_LUMA__ABM1_LS_SUM_OF_LUMA_MASK 0xffffffff
+#define DC_ABM1_LS_SUM_OF_LUMA__ABM1_LS_SUM_OF_LUMA__SHIFT 0x0
+#define DC_ABM1_LS_MIN_MAX_LUMA__ABM1_LS_MIN_LUMA_MASK 0x3ff
+#define DC_ABM1_LS_MIN_MAX_LUMA__ABM1_LS_MIN_LUMA__SHIFT 0x0
+#define DC_ABM1_LS_MIN_MAX_LUMA__ABM1_LS_MAX_LUMA_MASK 0x3ff0000
+#define DC_ABM1_LS_MIN_MAX_LUMA__ABM1_LS_MAX_LUMA__SHIFT 0x10
+#define DC_ABM1_LS_FILTERED_MIN_MAX_LUMA__ABM1_LS_FILTERED_MIN_LUMA_MASK 0x3ff
+#define DC_ABM1_LS_FILTERED_MIN_MAX_LUMA__ABM1_LS_FILTERED_MIN_LUMA__SHIFT 0x0
+#define DC_ABM1_LS_FILTERED_MIN_MAX_LUMA__ABM1_LS_FILTERED_MAX_LUMA_MASK 0x3ff0000
+#define DC_ABM1_LS_FILTERED_MIN_MAX_LUMA__ABM1_LS_FILTERED_MAX_LUMA__SHIFT 0x10
+#define DC_ABM1_LS_PIXEL_COUNT__ABM1_LS_PIXEL_COUNT_MASK 0xffffff
+#define DC_ABM1_LS_PIXEL_COUNT__ABM1_LS_PIXEL_COUNT__SHIFT 0x0
+#define DC_ABM1_LS_OVR_SCAN_BIN__ABM1_LS_OVR_SCAN_BIN_MASK 0xffffff
+#define DC_ABM1_LS_OVR_SCAN_BIN__ABM1_LS_OVR_SCAN_BIN__SHIFT 0x0
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_LS_MIN_PIXEL_VALUE_THRES_MASK 0x3ff
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_LS_MIN_PIXEL_VALUE_THRES__SHIFT 0x0
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_LS_MAX_PIXEL_VALUE_THRES_MASK 0x3ff0000
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_LS_MAX_PIXEL_VALUE_THRES__SHIFT 0x10
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define DC_ABM1_LS_MIN_MAX_PIXEL_VALUE_THRES__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define DC_ABM1_LS_MIN_PIXEL_VALUE_COUNT__ABM1_LS_MIN_PIXEL_VALUE_COUNT_MASK 0xffffff
+#define DC_ABM1_LS_MIN_PIXEL_VALUE_COUNT__ABM1_LS_MIN_PIXEL_VALUE_COUNT__SHIFT 0x0
+#define DC_ABM1_LS_MAX_PIXEL_VALUE_COUNT__ABM1_LS_MAX_PIXEL_VALUE_COUNT_MASK 0xffffff
+#define DC_ABM1_LS_MAX_PIXEL_VALUE_COUNT__ABM1_LS_MAX_PIXEL_VALUE_COUNT__SHIFT 0x0
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_SAMPLE_RATE_COUNT_EN_MASK 0x1
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_SAMPLE_RATE_COUNT_EN__SHIFT 0x0
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_RESET_SAMPLE_RATE_FRAME_COUNTER_MASK 0x2
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_RESET_SAMPLE_RATE_FRAME_COUNTER__SHIFT 0x1
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_SAMPLE_RATE_FRAME_COUNT_MASK 0xff00
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_SAMPLE_RATE_FRAME_COUNT__SHIFT 0x8
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET_MASK 0xff0000
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HG_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET__SHIFT 0x10
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define DC_ABM1_HG_SAMPLE_RATE__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_SAMPLE_RATE_COUNT_EN_MASK 0x1
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_SAMPLE_RATE_COUNT_EN__SHIFT 0x0
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_RESET_SAMPLE_RATE_FRAME_COUNTER_MASK 0x2
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_RESET_SAMPLE_RATE_FRAME_COUNTER__SHIFT 0x1
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_SAMPLE_RATE_FRAME_COUNT_MASK 0xff00
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_SAMPLE_RATE_FRAME_COUNT__SHIFT 0x8
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET_MASK 0xff0000
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_LS_INITIAL_SAMPLE_RATE_COUNT_VALUE_WHEN_RESET__SHIFT 0x10
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_HGLS_REG_LOCK_MASK 0x80000000
+#define DC_ABM1_LS_SAMPLE_RATE__ABM1_HGLS_REG_LOCK__SHIFT 0x1f
+#define DC_ABM1_HG_BIN_1_32_SHIFT_FLAG__ABM1_HG_BIN_1_32_SHIFT_FLAG_MASK 0xffffffff
+#define DC_ABM1_HG_BIN_1_32_SHIFT_FLAG__ABM1_HG_BIN_1_32_SHIFT_FLAG__SHIFT 0x0
+#define DC_ABM1_HG_BIN_1_8_SHIFT_INDEX__ABM1_HG_BIN_1_8_SHIFT_INDEX_MASK 0xffffffff
+#define DC_ABM1_HG_BIN_1_8_SHIFT_INDEX__ABM1_HG_BIN_1_8_SHIFT_INDEX__SHIFT 0x0
+#define DC_ABM1_HG_BIN_9_16_SHIFT_INDEX__ABM1_HG_BIN_9_16_SHIFT_INDEX_MASK 0xffffffff
+#define DC_ABM1_HG_BIN_9_16_SHIFT_INDEX__ABM1_HG_BIN_9_16_SHIFT_INDEX__SHIFT 0x0
+#define DC_ABM1_HG_BIN_17_24_SHIFT_INDEX__ABM1_HG_BIN_17_24_SHIFT_INDEX_MASK 0xffffffff
+#define DC_ABM1_HG_BIN_17_24_SHIFT_INDEX__ABM1_HG_BIN_17_24_SHIFT_INDEX__SHIFT 0x0
+#define DC_ABM1_HG_BIN_25_32_SHIFT_INDEX__ABM1_HG_BIN_25_32_SHIFT_INDEX_MASK 0xffffffff
+#define DC_ABM1_HG_BIN_25_32_SHIFT_INDEX__ABM1_HG_BIN_25_32_SHIFT_INDEX__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_1__ABM1_HG_RESULT_1_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_1__ABM1_HG_RESULT_1__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_2__ABM1_HG_RESULT_2_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_2__ABM1_HG_RESULT_2__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_3__ABM1_HG_RESULT_3_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_3__ABM1_HG_RESULT_3__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_4__ABM1_HG_RESULT_4_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_4__ABM1_HG_RESULT_4__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_5__ABM1_HG_RESULT_5_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_5__ABM1_HG_RESULT_5__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_6__ABM1_HG_RESULT_6_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_6__ABM1_HG_RESULT_6__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_7__ABM1_HG_RESULT_7_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_7__ABM1_HG_RESULT_7__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_8__ABM1_HG_RESULT_8_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_8__ABM1_HG_RESULT_8__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_9__ABM1_HG_RESULT_9_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_9__ABM1_HG_RESULT_9__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_10__ABM1_HG_RESULT_10_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_10__ABM1_HG_RESULT_10__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_11__ABM1_HG_RESULT_11_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_11__ABM1_HG_RESULT_11__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_12__ABM1_HG_RESULT_12_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_12__ABM1_HG_RESULT_12__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_13__ABM1_HG_RESULT_13_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_13__ABM1_HG_RESULT_13__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_14__ABM1_HG_RESULT_14_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_14__ABM1_HG_RESULT_14__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_15__ABM1_HG_RESULT_15_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_15__ABM1_HG_RESULT_15__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_16__ABM1_HG_RESULT_16_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_16__ABM1_HG_RESULT_16__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_17__ABM1_HG_RESULT_17_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_17__ABM1_HG_RESULT_17__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_18__ABM1_HG_RESULT_18_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_18__ABM1_HG_RESULT_18__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_19__ABM1_HG_RESULT_19_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_19__ABM1_HG_RESULT_19__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_20__ABM1_HG_RESULT_20_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_20__ABM1_HG_RESULT_20__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_21__ABM1_HG_RESULT_21_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_21__ABM1_HG_RESULT_21__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_22__ABM1_HG_RESULT_22_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_22__ABM1_HG_RESULT_22__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_23__ABM1_HG_RESULT_23_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_23__ABM1_HG_RESULT_23__SHIFT 0x0
+#define DC_ABM1_HG_RESULT_24__ABM1_HG_RESULT_24_MASK 0xffffffff
+#define DC_ABM1_HG_RESULT_24__ABM1_HG_RESULT_24__SHIFT 0x0
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_R_PIXEL_VALUE_MASK 0x3ff
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_R_PIXEL_VALUE__SHIFT 0x0
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_G_PIXEL_VALUE_MASK 0xffc00
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_G_PIXEL_VALUE__SHIFT 0xa
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_B_PIXEL_VALUE_MASK 0x3ff00000
+#define DC_ABM1_OVERSCAN_PIXEL_VALUE__ABM1_OVERSCAN_B_PIXEL_VALUE__SHIFT 0x14
+#define DC_ABM1_BL_MASTER_LOCK__ABM1_BL_MASTER_LOCK_MASK 0x80000000
+#define DC_ABM1_BL_MASTER_LOCK__ABM1_BL_MASTER_LOCK__SHIFT 0x1f
+#define ABM_TEST_DEBUG_INDEX__ABM_TEST_DEBUG_INDEX_MASK 0xff
+#define ABM_TEST_DEBUG_INDEX__ABM_TEST_DEBUG_INDEX__SHIFT 0x0
+#define ABM_TEST_DEBUG_INDEX__ABM_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define ABM_TEST_DEBUG_INDEX__ABM_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define ABM_TEST_DEBUG_DATA__ABM_TEST_DEBUG_DATA_MASK 0xffffffff
+#define ABM_TEST_DEBUG_DATA__ABM_TEST_DEBUG_DATA__SHIFT 0x0
+#define CRTC_H_BLANK_EARLY_NUM__CRTC_H_BLANK_EARLY_NUM_MASK 0x3ff
+#define CRTC_H_BLANK_EARLY_NUM__CRTC_H_BLANK_EARLY_NUM__SHIFT 0x0
+#define CRTC_H_BLANK_EARLY_NUM__CRTC_H_BLANK_EARLY_NUM_DIS_MASK 0x10000
+#define CRTC_H_BLANK_EARLY_NUM__CRTC_H_BLANK_EARLY_NUM_DIS__SHIFT 0x10
+#define CRTC_H_TOTAL__CRTC_H_TOTAL_MASK 0x3fff
+#define CRTC_H_TOTAL__CRTC_H_TOTAL__SHIFT 0x0
+#define CRTC_H_BLANK_START_END__CRTC_H_BLANK_START_MASK 0x3fff
+#define CRTC_H_BLANK_START_END__CRTC_H_BLANK_START__SHIFT 0x0
+#define CRTC_H_BLANK_START_END__CRTC_H_BLANK_END_MASK 0x3fff0000
+#define CRTC_H_BLANK_START_END__CRTC_H_BLANK_END__SHIFT 0x10
+#define CRTC_H_SYNC_A__CRTC_H_SYNC_A_START_MASK 0x3fff
+#define CRTC_H_SYNC_A__CRTC_H_SYNC_A_START__SHIFT 0x0
+#define CRTC_H_SYNC_A__CRTC_H_SYNC_A_END_MASK 0x3fff0000
+#define CRTC_H_SYNC_A__CRTC_H_SYNC_A_END__SHIFT 0x10
+#define CRTC_H_SYNC_A_CNTL__CRTC_H_SYNC_A_POL_MASK 0x1
+#define CRTC_H_SYNC_A_CNTL__CRTC_H_SYNC_A_POL__SHIFT 0x0
+#define CRTC_H_SYNC_A_CNTL__CRTC_COMP_SYNC_A_EN_MASK 0x10000
+#define CRTC_H_SYNC_A_CNTL__CRTC_COMP_SYNC_A_EN__SHIFT 0x10
+#define CRTC_H_SYNC_A_CNTL__CRTC_H_SYNC_A_CUTOFF_MASK 0x20000
+#define CRTC_H_SYNC_A_CNTL__CRTC_H_SYNC_A_CUTOFF__SHIFT 0x11
+#define CRTC_H_SYNC_B__CRTC_H_SYNC_B_START_MASK 0x3fff
+#define CRTC_H_SYNC_B__CRTC_H_SYNC_B_START__SHIFT 0x0
+#define CRTC_H_SYNC_B__CRTC_H_SYNC_B_END_MASK 0x3fff0000
+#define CRTC_H_SYNC_B__CRTC_H_SYNC_B_END__SHIFT 0x10
+#define CRTC_H_SYNC_B_CNTL__CRTC_H_SYNC_B_POL_MASK 0x1
+#define CRTC_H_SYNC_B_CNTL__CRTC_H_SYNC_B_POL__SHIFT 0x0
+#define CRTC_H_SYNC_B_CNTL__CRTC_COMP_SYNC_B_EN_MASK 0x10000
+#define CRTC_H_SYNC_B_CNTL__CRTC_COMP_SYNC_B_EN__SHIFT 0x10
+#define CRTC_H_SYNC_B_CNTL__CRTC_H_SYNC_B_CUTOFF_MASK 0x20000
+#define CRTC_H_SYNC_B_CNTL__CRTC_H_SYNC_B_CUTOFF__SHIFT 0x11
+#define CRTC_VBI_END__CRTC_VBI_V_END_MASK 0x3fff
+#define CRTC_VBI_END__CRTC_VBI_V_END__SHIFT 0x0
+#define CRTC_VBI_END__CRTC_VBI_H_END_MASK 0x3fff0000
+#define CRTC_VBI_END__CRTC_VBI_H_END__SHIFT 0x10
+#define CRTC_V_TOTAL__CRTC_V_TOTAL_MASK 0x3fff
+#define CRTC_V_TOTAL__CRTC_V_TOTAL__SHIFT 0x0
+#define CRTC_V_TOTAL_MIN__CRTC_V_TOTAL_MIN_MASK 0x3fff
+#define CRTC_V_TOTAL_MIN__CRTC_V_TOTAL_MIN__SHIFT 0x0
+#define CRTC_V_TOTAL_MAX__CRTC_V_TOTAL_MAX_MASK 0x3fff
+#define CRTC_V_TOTAL_MAX__CRTC_V_TOTAL_MAX__SHIFT 0x0
+#define CRTC_V_TOTAL_MAX__CRTC_ALLOW_VBLANK_EXTENSION_FOR_MC_TRAINING_MASK 0x10000
+#define CRTC_V_TOTAL_MAX__CRTC_ALLOW_VBLANK_EXTENSION_FOR_MC_TRAINING__SHIFT 0x10
+#define CRTC_V_TOTAL_CONTROL__CRTC_V_TOTAL_MIN_SEL_MASK 0x1
+#define CRTC_V_TOTAL_CONTROL__CRTC_V_TOTAL_MIN_SEL__SHIFT 0x0
+#define CRTC_V_TOTAL_CONTROL__CRTC_V_TOTAL_MAX_SEL_MASK 0x10
+#define CRTC_V_TOTAL_CONTROL__CRTC_V_TOTAL_MAX_SEL__SHIFT 0x4
+#define CRTC_V_TOTAL_CONTROL__CRTC_FORCE_LOCK_ON_EVENT_MASK 0x100
+#define CRTC_V_TOTAL_CONTROL__CRTC_FORCE_LOCK_ON_EVENT__SHIFT 0x8
+#define CRTC_V_TOTAL_CONTROL__CRTC_FORCE_LOCK_TO_MASTER_VSYNC_MASK 0x1000
+#define CRTC_V_TOTAL_CONTROL__CRTC_FORCE_LOCK_TO_MASTER_VSYNC__SHIFT 0xc
+#define CRTC_V_TOTAL_CONTROL__CRTC_SET_V_TOTAL_MIN_MASK_EN_MASK 0x8000
+#define CRTC_V_TOTAL_CONTROL__CRTC_SET_V_TOTAL_MIN_MASK_EN__SHIFT 0xf
+#define CRTC_V_TOTAL_CONTROL__CRTC_SET_V_TOTAL_MIN_MASK_MASK 0xffff0000
+#define CRTC_V_TOTAL_CONTROL__CRTC_SET_V_TOTAL_MIN_MASK__SHIFT 0x10
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_MASK 0x1
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED__SHIFT 0x0
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x10
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0x4
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK_MASK 0x100
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_ACK__SHIFT 0x8
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_MSK_MASK 0x1000
+#define CRTC_V_TOTAL_INT_STATUS__CRTC_SET_V_TOTAL_MIN_EVENT_OCCURED_MSK__SHIFT 0xc
+#define CRTC_VSYNC_NOM_INT_STATUS__CRTC_VSYNC_NOM_MASK 0x1
+#define CRTC_VSYNC_NOM_INT_STATUS__CRTC_VSYNC_NOM__SHIFT 0x0
+#define CRTC_VSYNC_NOM_INT_STATUS__CRTC_VSYNC_NOM_INT_CLEAR_MASK 0x10
+#define CRTC_VSYNC_NOM_INT_STATUS__CRTC_VSYNC_NOM_INT_CLEAR__SHIFT 0x4
+#define CRTC_V_BLANK_START_END__CRTC_V_BLANK_START_MASK 0x3fff
+#define CRTC_V_BLANK_START_END__CRTC_V_BLANK_START__SHIFT 0x0
+#define CRTC_V_BLANK_START_END__CRTC_V_BLANK_END_MASK 0x3fff0000
+#define CRTC_V_BLANK_START_END__CRTC_V_BLANK_END__SHIFT 0x10
+#define CRTC_V_SYNC_A__CRTC_V_SYNC_A_START_MASK 0x3fff
+#define CRTC_V_SYNC_A__CRTC_V_SYNC_A_START__SHIFT 0x0
+#define CRTC_V_SYNC_A__CRTC_V_SYNC_A_END_MASK 0x3fff0000
+#define CRTC_V_SYNC_A__CRTC_V_SYNC_A_END__SHIFT 0x10
+#define CRTC_V_SYNC_A_CNTL__CRTC_V_SYNC_A_POL_MASK 0x1
+#define CRTC_V_SYNC_A_CNTL__CRTC_V_SYNC_A_POL__SHIFT 0x0
+#define CRTC_V_SYNC_B__CRTC_V_SYNC_B_START_MASK 0x3fff
+#define CRTC_V_SYNC_B__CRTC_V_SYNC_B_START__SHIFT 0x0
+#define CRTC_V_SYNC_B__CRTC_V_SYNC_B_END_MASK 0x3fff0000
+#define CRTC_V_SYNC_B__CRTC_V_SYNC_B_END__SHIFT 0x10
+#define CRTC_V_SYNC_B_CNTL__CRTC_V_SYNC_B_POL_MASK 0x1
+#define CRTC_V_SYNC_B_CNTL__CRTC_V_SYNC_B_POL__SHIFT 0x0
+#define CRTC_DTMTEST_CNTL__CRTC_DTMTEST_CRTC_EN_MASK 0x1
+#define CRTC_DTMTEST_CNTL__CRTC_DTMTEST_CRTC_EN__SHIFT 0x0
+#define CRTC_DTMTEST_CNTL__CRTC_DTMTEST_CLK_DIV_MASK 0x1e
+#define CRTC_DTMTEST_CNTL__CRTC_DTMTEST_CLK_DIV__SHIFT 0x1
+#define CRTC_DTMTEST_STATUS_POSITION__CRTC_DTMTEST_VERT_COUNT_MASK 0x3fff
+#define CRTC_DTMTEST_STATUS_POSITION__CRTC_DTMTEST_VERT_COUNT__SHIFT 0x0
+#define CRTC_DTMTEST_STATUS_POSITION__CRTC_DTMTEST_HORZ_COUNT_MASK 0x3fff0000
+#define CRTC_DTMTEST_STATUS_POSITION__CRTC_DTMTEST_HORZ_COUNT__SHIFT 0x10
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_SOURCE_SELECT_MASK 0x1f
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_SOURCE_SELECT__SHIFT 0x0
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_POLARITY_SELECT_MASK 0xe0
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_POLARITY_SELECT__SHIFT 0x5
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_RESYNC_BYPASS_EN_MASK 0x100
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_RESYNC_BYPASS_EN__SHIFT 0x8
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_INPUT_STATUS_MASK 0x200
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_INPUT_STATUS__SHIFT 0x9
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_POLARITY_STATUS_MASK 0x400
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_POLARITY_STATUS__SHIFT 0xa
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_OCCURRED_MASK 0x800
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_OCCURRED__SHIFT 0xb
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_RISING_EDGE_DETECT_CNTL_MASK 0x3000
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_RISING_EDGE_DETECT_CNTL__SHIFT 0xc
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_FALLING_EDGE_DETECT_CNTL_MASK 0x30000
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_FALLING_EDGE_DETECT_CNTL__SHIFT 0x10
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_FREQUENCY_SELECT_MASK 0x300000
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_FREQUENCY_SELECT__SHIFT 0x14
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_DELAY_MASK 0x1f000000
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_DELAY__SHIFT 0x18
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_CLEAR_MASK 0x80000000
+#define CRTC_TRIGA_CNTL__CRTC_TRIGA_CLEAR__SHIFT 0x1f
+#define CRTC_TRIGA_MANUAL_TRIG__CRTC_TRIGA_MANUAL_TRIG_MASK 0x1
+#define CRTC_TRIGA_MANUAL_TRIG__CRTC_TRIGA_MANUAL_TRIG__SHIFT 0x0
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_SOURCE_SELECT_MASK 0x1f
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_SOURCE_SELECT__SHIFT 0x0
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_POLARITY_SELECT_MASK 0xe0
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_POLARITY_SELECT__SHIFT 0x5
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_RESYNC_BYPASS_EN_MASK 0x100
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_RESYNC_BYPASS_EN__SHIFT 0x8
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_INPUT_STATUS_MASK 0x200
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_INPUT_STATUS__SHIFT 0x9
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_POLARITY_STATUS_MASK 0x400
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_POLARITY_STATUS__SHIFT 0xa
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_OCCURRED_MASK 0x800
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_OCCURRED__SHIFT 0xb
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_RISING_EDGE_DETECT_CNTL_MASK 0x3000
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_RISING_EDGE_DETECT_CNTL__SHIFT 0xc
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_FALLING_EDGE_DETECT_CNTL_MASK 0x30000
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_FALLING_EDGE_DETECT_CNTL__SHIFT 0x10
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_FREQUENCY_SELECT_MASK 0x300000
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_FREQUENCY_SELECT__SHIFT 0x14
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_DELAY_MASK 0x1f000000
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_DELAY__SHIFT 0x18
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_CLEAR_MASK 0x80000000
+#define CRTC_TRIGB_CNTL__CRTC_TRIGB_CLEAR__SHIFT 0x1f
+#define CRTC_TRIGB_MANUAL_TRIG__CRTC_TRIGB_MANUAL_TRIG_MASK 0x1
+#define CRTC_TRIGB_MANUAL_TRIG__CRTC_TRIGB_MANUAL_TRIG__SHIFT 0x0
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_MODE_MASK 0x3
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_MODE__SHIFT 0x0
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_CHECK_MASK 0x10
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_CHECK__SHIFT 0x4
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_TRIG_SEL_MASK 0x100
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_TRIG_SEL__SHIFT 0x8
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_OCCURRED_MASK 0x10000
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_OCCURRED__SHIFT 0x10
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_CLEAR_MASK 0x1000000
+#define CRTC_FORCE_COUNT_NOW_CNTL__CRTC_FORCE_COUNT_NOW_CLEAR__SHIFT 0x18
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_SOURCE_SELECT_MASK 0x1f
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_SOURCE_SELECT__SHIFT 0x0
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_POLARITY_MASK 0x100
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_POLARITY__SHIFT 0x8
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_GRANULARITY_MASK 0x10000
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_GRANULARITY__SHIFT 0x10
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_INPUT_STATUS_MASK 0x1000000
+#define CRTC_FLOW_CONTROL__CRTC_FLOW_CONTROL_INPUT_STATUS__SHIFT 0x18
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_STEREO_FORCE_NEXT_EYE_MASK 0x3
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_STEREO_FORCE_NEXT_EYE__SHIFT 0x0
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_AVSYNC_FRAME_COUNTER_MASK 0xff00
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_AVSYNC_FRAME_COUNTER__SHIFT 0x8
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_AVSYNC_LINE_COUNTER_MASK 0x1fff0000
+#define CRTC_STEREO_FORCE_NEXT_EYE__CRTC_AVSYNC_LINE_COUNTER__SHIFT 0x10
+#define CRTC_AVSYNC_COUNTER__CRTC_AVSYNC_COUNTER_MASK 0xffffffff
+#define CRTC_AVSYNC_COUNTER__CRTC_AVSYNC_COUNTER__SHIFT 0x0
+#define CRTC_CONTROL__CRTC_MASTER_EN_MASK 0x1
+#define CRTC_CONTROL__CRTC_MASTER_EN__SHIFT 0x0
+#define CRTC_CONTROL__CRTC_SYNC_RESET_SEL_MASK 0x10
+#define CRTC_CONTROL__CRTC_SYNC_RESET_SEL__SHIFT 0x4
+#define CRTC_CONTROL__CRTC_DISABLE_POINT_CNTL_MASK 0x300
+#define CRTC_CONTROL__CRTC_DISABLE_POINT_CNTL__SHIFT 0x8
+#define CRTC_CONTROL__CRTC_START_POINT_CNTL_MASK 0x1000
+#define CRTC_CONTROL__CRTC_START_POINT_CNTL__SHIFT 0xc
+#define CRTC_CONTROL__CRTC_FIELD_NUMBER_CNTL_MASK 0x2000
+#define CRTC_CONTROL__CRTC_FIELD_NUMBER_CNTL__SHIFT 0xd
+#define CRTC_CONTROL__CRTC_FIELD_NUMBER_POLARITY_MASK 0x4000
+#define CRTC_CONTROL__CRTC_FIELD_NUMBER_POLARITY__SHIFT 0xe
+#define CRTC_CONTROL__CRTC_CURRENT_MASTER_EN_STATE_MASK 0x10000
+#define CRTC_CONTROL__CRTC_CURRENT_MASTER_EN_STATE__SHIFT 0x10
+#define CRTC_CONTROL__CRTC_HBLANK_EARLY_CONTROL_MASK 0x700000
+#define CRTC_CONTROL__CRTC_HBLANK_EARLY_CONTROL__SHIFT 0x14
+#define CRTC_CONTROL__CRTC_DISP_READ_REQUEST_DISABLE_MASK 0x1000000
+#define CRTC_CONTROL__CRTC_DISP_READ_REQUEST_DISABLE__SHIFT 0x18
+#define CRTC_CONTROL__CRTC_SOF_PULL_EN_MASK 0x20000000
+#define CRTC_CONTROL__CRTC_SOF_PULL_EN__SHIFT 0x1d
+#define CRTC_CONTROL__CRTC_AVSYNC_LOCK_SNAPSHOT_MASK 0x40000000
+#define CRTC_CONTROL__CRTC_AVSYNC_LOCK_SNAPSHOT__SHIFT 0x1e
+#define CRTC_CONTROL__CRTC_AVSYNC_VSYNC_N_HSYNC_MODE_MASK 0x80000000
+#define CRTC_CONTROL__CRTC_AVSYNC_VSYNC_N_HSYNC_MODE__SHIFT 0x1f
+#define CRTC_BLANK_CONTROL__CRTC_CURRENT_BLANK_STATE_MASK 0x1
+#define CRTC_BLANK_CONTROL__CRTC_CURRENT_BLANK_STATE__SHIFT 0x0
+#define CRTC_BLANK_CONTROL__CRTC_BLANK_DATA_EN_MASK 0x100
+#define CRTC_BLANK_CONTROL__CRTC_BLANK_DATA_EN__SHIFT 0x8
+#define CRTC_BLANK_CONTROL__CRTC_BLANK_DE_MODE_MASK 0x10000
+#define CRTC_BLANK_CONTROL__CRTC_BLANK_DE_MODE__SHIFT 0x10
+#define CRTC_INTERLACE_CONTROL__CRTC_INTERLACE_ENABLE_MASK 0x1
+#define CRTC_INTERLACE_CONTROL__CRTC_INTERLACE_ENABLE__SHIFT 0x0
+#define CRTC_INTERLACE_CONTROL__CRTC_INTERLACE_FORCE_NEXT_FIELD_MASK 0x30000
+#define CRTC_INTERLACE_CONTROL__CRTC_INTERLACE_FORCE_NEXT_FIELD__SHIFT 0x10
+#define CRTC_INTERLACE_STATUS__CRTC_INTERLACE_CURRENT_FIELD_MASK 0x1
+#define CRTC_INTERLACE_STATUS__CRTC_INTERLACE_CURRENT_FIELD__SHIFT 0x0
+#define CRTC_INTERLACE_STATUS__CRTC_INTERLACE_NEXT_FIELD_MASK 0x2
+#define CRTC_INTERLACE_STATUS__CRTC_INTERLACE_NEXT_FIELD__SHIFT 0x1
+#define CRTC_FIELD_INDICATION_CONTROL__CRTC_FIELD_INDICATION_OUTPUT_POLARITY_MASK 0x1
+#define CRTC_FIELD_INDICATION_CONTROL__CRTC_FIELD_INDICATION_OUTPUT_POLARITY__SHIFT 0x0
+#define CRTC_FIELD_INDICATION_CONTROL__CRTC_FIELD_ALIGNMENT_MASK 0x2
+#define CRTC_FIELD_INDICATION_CONTROL__CRTC_FIELD_ALIGNMENT__SHIFT 0x1
+#define CRTC_PIXEL_DATA_READBACK0__CRTC_PIXEL_DATA_BLUE_CB_MASK 0xfff
+#define CRTC_PIXEL_DATA_READBACK0__CRTC_PIXEL_DATA_BLUE_CB__SHIFT 0x0
+#define CRTC_PIXEL_DATA_READBACK0__CRTC_PIXEL_DATA_GREEN_Y_MASK 0xfff0000
+#define CRTC_PIXEL_DATA_READBACK0__CRTC_PIXEL_DATA_GREEN_Y__SHIFT 0x10
+#define CRTC_PIXEL_DATA_READBACK1__CRTC_PIXEL_DATA_RED_CR_MASK 0xfff
+#define CRTC_PIXEL_DATA_READBACK1__CRTC_PIXEL_DATA_RED_CR__SHIFT 0x0
+#define CRTC_STATUS__CRTC_V_BLANK_MASK 0x1
+#define CRTC_STATUS__CRTC_V_BLANK__SHIFT 0x0
+#define CRTC_STATUS__CRTC_V_ACTIVE_DISP_MASK 0x2
+#define CRTC_STATUS__CRTC_V_ACTIVE_DISP__SHIFT 0x1
+#define CRTC_STATUS__CRTC_V_SYNC_A_MASK 0x4
+#define CRTC_STATUS__CRTC_V_SYNC_A__SHIFT 0x2
+#define CRTC_STATUS__CRTC_V_UPDATE_MASK 0x8
+#define CRTC_STATUS__CRTC_V_UPDATE__SHIFT 0x3
+#define CRTC_STATUS__CRTC_V_START_LINE_MASK 0x10
+#define CRTC_STATUS__CRTC_V_START_LINE__SHIFT 0x4
+#define CRTC_STATUS__CRTC_V_BLANK_3D_STRUCTURE_MASK 0x20
+#define CRTC_STATUS__CRTC_V_BLANK_3D_STRUCTURE__SHIFT 0x5
+#define CRTC_STATUS__CRTC_H_BLANK_MASK 0x10000
+#define CRTC_STATUS__CRTC_H_BLANK__SHIFT 0x10
+#define CRTC_STATUS__CRTC_H_ACTIVE_DISP_MASK 0x20000
+#define CRTC_STATUS__CRTC_H_ACTIVE_DISP__SHIFT 0x11
+#define CRTC_STATUS__CRTC_H_SYNC_A_MASK 0x40000
+#define CRTC_STATUS__CRTC_H_SYNC_A__SHIFT 0x12
+#define CRTC_STATUS_POSITION__CRTC_VERT_COUNT_MASK 0x3fff
+#define CRTC_STATUS_POSITION__CRTC_VERT_COUNT__SHIFT 0x0
+#define CRTC_STATUS_POSITION__CRTC_HORZ_COUNT_MASK 0x3fff0000
+#define CRTC_STATUS_POSITION__CRTC_HORZ_COUNT__SHIFT 0x10
+#define CRTC_NOM_VERT_POSITION__CRTC_VERT_COUNT_NOM_MASK 0x3fff
+#define CRTC_NOM_VERT_POSITION__CRTC_VERT_COUNT_NOM__SHIFT 0x0
+#define CRTC_STATUS_FRAME_COUNT__CRTC_FRAME_COUNT_MASK 0xffffff
+#define CRTC_STATUS_FRAME_COUNT__CRTC_FRAME_COUNT__SHIFT 0x0
+#define CRTC_STATUS_VF_COUNT__CRTC_VF_COUNT_MASK 0x3fffffff
+#define CRTC_STATUS_VF_COUNT__CRTC_VF_COUNT__SHIFT 0x0
+#define CRTC_STATUS_HV_COUNT__CRTC_HV_COUNT_MASK 0x3fffffff
+#define CRTC_STATUS_HV_COUNT__CRTC_HV_COUNT__SHIFT 0x0
+#define CRTC_COUNT_CONTROL__CRTC_HORZ_COUNT_BY2_EN_MASK 0x1
+#define CRTC_COUNT_CONTROL__CRTC_HORZ_COUNT_BY2_EN__SHIFT 0x0
+#define CRTC_COUNT_CONTROL__CRTC_HORZ_REPETITION_COUNT_MASK 0x1e
+#define CRTC_COUNT_CONTROL__CRTC_HORZ_REPETITION_COUNT__SHIFT 0x1
+#define CRTC_COUNT_RESET__CRTC_RESET_FRAME_COUNT_MASK 0x1
+#define CRTC_COUNT_RESET__CRTC_RESET_FRAME_COUNT__SHIFT 0x0
+#define CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE_MASK 0x1
+#define CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__CRTC_MANUAL_FORCE_VSYNC_NEXT_LINE__SHIFT 0x0
+#define CRTC_VERT_SYNC_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_OCCURRED_MASK 0x1
+#define CRTC_VERT_SYNC_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_OCCURRED__SHIFT 0x0
+#define CRTC_VERT_SYNC_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR_MASK 0x100
+#define CRTC_VERT_SYNC_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_CLEAR__SHIFT 0x8
+#define CRTC_VERT_SYNC_CONTROL__CRTC_AUTO_FORCE_VSYNC_MODE_MASK 0x30000
+#define CRTC_VERT_SYNC_CONTROL__CRTC_AUTO_FORCE_VSYNC_MODE__SHIFT 0x10
+#define CRTC_STEREO_STATUS__CRTC_STEREO_CURRENT_EYE_MASK 0x1
+#define CRTC_STEREO_STATUS__CRTC_STEREO_CURRENT_EYE__SHIFT 0x0
+#define CRTC_STEREO_STATUS__CRTC_STEREO_SYNC_OUTPUT_MASK 0x100
+#define CRTC_STEREO_STATUS__CRTC_STEREO_SYNC_OUTPUT__SHIFT 0x8
+#define CRTC_STEREO_STATUS__CRTC_STEREO_SYNC_SELECT_MASK 0x10000
+#define CRTC_STEREO_STATUS__CRTC_STEREO_SYNC_SELECT__SHIFT 0x10
+#define CRTC_STEREO_STATUS__CRTC_STEREO_EYE_FLAG_MASK 0x100000
+#define CRTC_STEREO_STATUS__CRTC_STEREO_EYE_FLAG__SHIFT 0x14
+#define CRTC_STEREO_STATUS__CRTC_STEREO_FORCE_NEXT_EYE_PENDING_MASK 0x3000000
+#define CRTC_STEREO_STATUS__CRTC_STEREO_FORCE_NEXT_EYE_PENDING__SHIFT 0x18
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_OUTPUT_LINE_NUM_MASK 0x3fff
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_OUTPUT_LINE_NUM__SHIFT 0x0
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_OUTPUT_POLARITY_MASK 0x8000
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_OUTPUT_POLARITY__SHIFT 0xf
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_SELECT_POLARITY_MASK 0x10000
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_SYNC_SELECT_POLARITY__SHIFT 0x10
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_EYE_FLAG_POLARITY_MASK 0x20000
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_EYE_FLAG_POLARITY__SHIFT 0x11
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_STEREOSYNC_OUTPUT_FOR_DP_MASK 0x40000
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_STEREOSYNC_OUTPUT_FOR_DP__SHIFT 0x12
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_FIELD_NUM_MASK 0x80000
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_FIELD_NUM__SHIFT 0x13
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_V_BLANK_FOR_DP_FIX_MASK 0x100000
+#define CRTC_STEREO_CONTROL__CRTC_DISABLE_V_BLANK_FOR_DP_FIX__SHIFT 0x14
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_EN_MASK 0x1000000
+#define CRTC_STEREO_CONTROL__CRTC_STEREO_EN__SHIFT 0x18
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_OCCURRED_MASK 0x1
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_OCCURRED__SHIFT 0x0
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_CLEAR_MASK 0x2
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_CLEAR__SHIFT 0x1
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_MANUAL_TRIGGER_MASK 0x4
+#define CRTC_SNAPSHOT_STATUS__CRTC_SNAPSHOT_MANUAL_TRIGGER__SHIFT 0x2
+#define CRTC_SNAPSHOT_CONTROL__CRTC_AUTO_SNAPSHOT_TRIG_SEL_MASK 0x3
+#define CRTC_SNAPSHOT_CONTROL__CRTC_AUTO_SNAPSHOT_TRIG_SEL__SHIFT 0x0
+#define CRTC_SNAPSHOT_POSITION__CRTC_SNAPSHOT_VERT_COUNT_MASK 0x3fff
+#define CRTC_SNAPSHOT_POSITION__CRTC_SNAPSHOT_VERT_COUNT__SHIFT 0x0
+#define CRTC_SNAPSHOT_POSITION__CRTC_SNAPSHOT_HORZ_COUNT_MASK 0x3fff0000
+#define CRTC_SNAPSHOT_POSITION__CRTC_SNAPSHOT_HORZ_COUNT__SHIFT 0x10
+#define CRTC_SNAPSHOT_FRAME__CRTC_SNAPSHOT_FRAME_COUNT_MASK 0xffffff
+#define CRTC_SNAPSHOT_FRAME__CRTC_SNAPSHOT_FRAME_COUNT__SHIFT 0x0
+#define CRTC_START_LINE_CONTROL__CRTC_PROGRESSIVE_START_LINE_EARLY_MASK 0x1
+#define CRTC_START_LINE_CONTROL__CRTC_PROGRESSIVE_START_LINE_EARLY__SHIFT 0x0
+#define CRTC_START_LINE_CONTROL__CRTC_INTERLACE_START_LINE_EARLY_MASK 0x2
+#define CRTC_START_LINE_CONTROL__CRTC_INTERLACE_START_LINE_EARLY__SHIFT 0x1
+#define CRTC_START_LINE_CONTROL__CRTC_PREFETCH_EN_MASK 0x4
+#define CRTC_START_LINE_CONTROL__CRTC_PREFETCH_EN__SHIFT 0x2
+#define CRTC_START_LINE_CONTROL__CRTC_LEGACY_REQUESTOR_EN_MASK 0x100
+#define CRTC_START_LINE_CONTROL__CRTC_LEGACY_REQUESTOR_EN__SHIFT 0x8
+#define CRTC_START_LINE_CONTROL__CRTC_ADVANCED_START_LINE_POSITION_MASK 0xff000
+#define CRTC_START_LINE_CONTROL__CRTC_ADVANCED_START_LINE_POSITION__SHIFT 0xc
+#define CRTC_INTERRUPT_CONTROL__CRTC_SNAPSHOT_INT_MSK_MASK 0x1
+#define CRTC_INTERRUPT_CONTROL__CRTC_SNAPSHOT_INT_MSK__SHIFT 0x0
+#define CRTC_INTERRUPT_CONTROL__CRTC_SNAPSHOT_INT_TYPE_MASK 0x2
+#define CRTC_INTERRUPT_CONTROL__CRTC_SNAPSHOT_INT_TYPE__SHIFT 0x1
+#define CRTC_INTERRUPT_CONTROL__CRTC_V_UPDATE_INT_MSK_MASK 0x10
+#define CRTC_INTERRUPT_CONTROL__CRTC_V_UPDATE_INT_MSK__SHIFT 0x4
+#define CRTC_INTERRUPT_CONTROL__CRTC_V_UPDATE_INT_TYPE_MASK 0x20
+#define CRTC_INTERRUPT_CONTROL__CRTC_V_UPDATE_INT_TYPE__SHIFT 0x5
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_COUNT_NOW_INT_MSK_MASK 0x100
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_COUNT_NOW_INT_MSK__SHIFT 0x8
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_COUNT_NOW_INT_TYPE_MASK 0x200
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_COUNT_NOW_INT_TYPE__SHIFT 0x9
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK_MASK 0x10000
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_INT_MSK__SHIFT 0x10
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE_MASK 0x20000
+#define CRTC_INTERRUPT_CONTROL__CRTC_FORCE_VSYNC_NEXT_LINE_INT_TYPE__SHIFT 0x11
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGA_INT_MSK_MASK 0x1000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGA_INT_MSK__SHIFT 0x18
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGB_INT_MSK_MASK 0x2000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGB_INT_MSK__SHIFT 0x19
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGA_INT_TYPE_MASK 0x4000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGA_INT_TYPE__SHIFT 0x1a
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGB_INT_TYPE_MASK 0x8000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_TRIGB_INT_TYPE__SHIFT 0x1b
+#define CRTC_INTERRUPT_CONTROL__CRTC_VSYNC_NOM_INT_MSK_MASK 0x10000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_VSYNC_NOM_INT_MSK__SHIFT 0x1c
+#define CRTC_INTERRUPT_CONTROL__CRTC_VSYNC_NOM_INT_TYPE_MASK 0x20000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_VSYNC_NOM_INT_TYPE__SHIFT 0x1d
+#define CRTC_INTERRUPT_CONTROL__CRTC_GSL_VSYNC_GAP_INT_MSK_MASK 0x40000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_GSL_VSYNC_GAP_INT_MSK__SHIFT 0x1e
+#define CRTC_INTERRUPT_CONTROL__CRTC_GSL_VSYNC_GAP_INT_TYPE_MASK 0x80000000
+#define CRTC_INTERRUPT_CONTROL__CRTC_GSL_VSYNC_GAP_INT_TYPE__SHIFT 0x1f
+#define CRTC_UPDATE_LOCK__CRTC_UPDATE_LOCK_MASK 0x1
+#define CRTC_UPDATE_LOCK__CRTC_UPDATE_LOCK__SHIFT 0x0
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_UPDATE_PENDING_MASK 0x1
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_UPDATE_PENDING__SHIFT 0x0
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_UPDATE_INSTANTLY_MASK 0x100
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_UPDATE_INSTANTLY__SHIFT 0x8
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_BLANK_DATA_DOUBLE_BUFFER_EN_MASK 0x10000
+#define CRTC_DOUBLE_BUFFER_CONTROL__CRTC_BLANK_DATA_DOUBLE_BUFFER_EN__SHIFT 0x10
+#define CRTC_VGA_PARAMETER_CAPTURE_MODE__CRTC_VGA_PARAMETER_CAPTURE_MODE_MASK 0x1
+#define CRTC_VGA_PARAMETER_CAPTURE_MODE__CRTC_VGA_PARAMETER_CAPTURE_MODE__SHIFT 0x0
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_EN_MASK 0x1
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_EN__SHIFT 0x0
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_MODE_MASK 0x700
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_MODE__SHIFT 0x8
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_DYNAMIC_RANGE_MASK 0x10000
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_DYNAMIC_RANGE__SHIFT 0x10
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_COLOR_FORMAT_MASK 0xff000000
+#define CRTC_TEST_PATTERN_CONTROL__CRTC_TEST_PATTERN_COLOR_FORMAT__SHIFT 0x18
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_INC0_MASK 0xf
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_INC0__SHIFT 0x0
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_INC1_MASK 0xf0
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_INC1__SHIFT 0x4
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_VRES_MASK 0xf00
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_VRES__SHIFT 0x8
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_HRES_MASK 0xf000
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_HRES__SHIFT 0xc
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_RAMP0_OFFSET_MASK 0xffff0000
+#define CRTC_TEST_PATTERN_PARAMETERS__CRTC_TEST_PATTERN_RAMP0_OFFSET__SHIFT 0x10
+#define CRTC_TEST_PATTERN_COLOR__CRTC_TEST_PATTERN_DATA_MASK 0xffff
+#define CRTC_TEST_PATTERN_COLOR__CRTC_TEST_PATTERN_DATA__SHIFT 0x0
+#define CRTC_TEST_PATTERN_COLOR__CRTC_TEST_PATTERN_MASK_MASK 0x3f0000
+#define CRTC_TEST_PATTERN_COLOR__CRTC_TEST_PATTERN_MASK__SHIFT 0x10
+#define CRTC_MASTER_UPDATE_LOCK__MASTER_UPDATE_LOCK_MASK 0x1
+#define CRTC_MASTER_UPDATE_LOCK__MASTER_UPDATE_LOCK__SHIFT 0x0
+#define CRTC_MASTER_UPDATE_LOCK__GSL_CONTROL_MASTER_UPDATE_LOCK_MASK 0x100
+#define CRTC_MASTER_UPDATE_LOCK__GSL_CONTROL_MASTER_UPDATE_LOCK__SHIFT 0x8
+#define CRTC_MASTER_UPDATE_LOCK__UNDERFLOW_UPDATE_LOCK_MASK 0x10000
+#define CRTC_MASTER_UPDATE_LOCK__UNDERFLOW_UPDATE_LOCK__SHIFT 0x10
+#define CRTC_MASTER_UPDATE_MODE__MASTER_UPDATE_MODE_MASK 0x7
+#define CRTC_MASTER_UPDATE_MODE__MASTER_UPDATE_MODE__SHIFT 0x0
+#define CRTC_MASTER_UPDATE_MODE__MASTER_UPDATE_INTERLACED_MODE_MASK 0x30000
+#define CRTC_MASTER_UPDATE_MODE__MASTER_UPDATE_INTERLACED_MODE__SHIFT 0x10
+#define CRTC_MVP_INBAND_CNTL_INSERT__CRTC_MVP_INBAND_OUT_MODE_MASK 0x3
+#define CRTC_MVP_INBAND_CNTL_INSERT__CRTC_MVP_INBAND_OUT_MODE__SHIFT 0x0
+#define CRTC_MVP_INBAND_CNTL_INSERT__CRTC_MVP_INBAND_CNTL_CHAR_INSERT_MASK 0xffffff00
+#define CRTC_MVP_INBAND_CNTL_INSERT__CRTC_MVP_INBAND_CNTL_CHAR_INSERT__SHIFT 0x8
+#define CRTC_MVP_INBAND_CNTL_INSERT_TIMER__CRTC_MVP_INBAND_CNTL_CHAR_INSERT_TIMER_MASK 0xff
+#define CRTC_MVP_INBAND_CNTL_INSERT_TIMER__CRTC_MVP_INBAND_CNTL_CHAR_INSERT_TIMER__SHIFT 0x0
+#define CRTC_MVP_STATUS__CRTC_FLIP_NOW_OCCURRED_MASK 0x1
+#define CRTC_MVP_STATUS__CRTC_FLIP_NOW_OCCURRED__SHIFT 0x0
+#define CRTC_MVP_STATUS__CRTC_AFR_HSYNC_SWITCH_DONE_OCCURRED_MASK 0x10
+#define CRTC_MVP_STATUS__CRTC_AFR_HSYNC_SWITCH_DONE_OCCURRED__SHIFT 0x4
+#define CRTC_MVP_STATUS__CRTC_FLIP_NOW_CLEAR_MASK 0x10000
+#define CRTC_MVP_STATUS__CRTC_FLIP_NOW_CLEAR__SHIFT 0x10
+#define CRTC_MVP_STATUS__CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR_MASK 0x100000
+#define CRTC_MVP_STATUS__CRTC_AFR_HSYNC_SWITCH_DONE_CLEAR__SHIFT 0x14
+#define CRTC_MASTER_EN__CRTC_MASTER_EN_MASK 0x1
+#define CRTC_MASTER_EN__CRTC_MASTER_EN__SHIFT 0x0
+#define CRTC_ALLOW_STOP_OFF_V_CNT__CRTC_ALLOW_STOP_OFF_V_CNT_MASK 0xff
+#define CRTC_ALLOW_STOP_OFF_V_CNT__CRTC_ALLOW_STOP_OFF_V_CNT__SHIFT 0x0
+#define CRTC_ALLOW_STOP_OFF_V_CNT__CRTC_DISABLE_ALLOW_STOP_OFF_V_CNT_MASK 0x10000
+#define CRTC_ALLOW_STOP_OFF_V_CNT__CRTC_DISABLE_ALLOW_STOP_OFF_V_CNT__SHIFT 0x10
+#define CRTC_V_UPDATE_INT_STATUS__CRTC_V_UPDATE_INT_OCCURRED_MASK 0x1
+#define CRTC_V_UPDATE_INT_STATUS__CRTC_V_UPDATE_INT_OCCURRED__SHIFT 0x0
+#define CRTC_V_UPDATE_INT_STATUS__CRTC_V_UPDATE_INT_CLEAR_MASK 0x100
+#define CRTC_V_UPDATE_INT_STATUS__CRTC_V_UPDATE_INT_CLEAR__SHIFT 0x8
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_BLUE_MASK 0x3ff
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_BLUE__SHIFT 0x0
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_GREEN_MASK 0xffc00
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_GREEN__SHIFT 0xa
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_RED_MASK 0x3ff00000
+#define CRTC_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_RED__SHIFT 0x14
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_BLUE_EXT_MASK 0x3
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_BLUE_EXT__SHIFT 0x0
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_GREEN_EXT_MASK 0x300
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_GREEN_EXT__SHIFT 0x8
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_RED_EXT_MASK 0x30000
+#define CRTC_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_RED_EXT__SHIFT 0x10
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_BLUE_CB_MASK 0x3ff
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_BLUE_CB__SHIFT 0x0
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_GREEN_Y_MASK 0xffc00
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_GREEN_Y__SHIFT 0xa
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_RED_CR_MASK 0x3ff00000
+#define CRTC_BLANK_DATA_COLOR__CRTC_BLANK_DATA_COLOR_RED_CR__SHIFT 0x14
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_BLUE_CB_EXT_MASK 0x3
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_BLUE_CB_EXT__SHIFT 0x0
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_GREEN_Y_EXT_MASK 0x300
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_GREEN_Y_EXT__SHIFT 0x8
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_RED_CR_EXT_MASK 0x30000
+#define CRTC_BLANK_DATA_COLOR_EXT__CRTC_BLANK_DATA_COLOR_RED_CR_EXT__SHIFT 0x10
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_B_CB_MASK 0x3ff
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_B_CB__SHIFT 0x0
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_G_Y_MASK 0xffc00
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_G_Y__SHIFT 0xa
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_R_CR_MASK 0x3ff00000
+#define CRTC_BLACK_COLOR__CRTC_BLACK_COLOR_R_CR__SHIFT 0x14
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_B_CB_EXT_MASK 0x3
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_B_CB_EXT__SHIFT 0x0
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_G_Y_EXT_MASK 0x300
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_G_Y_EXT__SHIFT 0x8
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_R_CR_EXT_MASK 0x30000
+#define CRTC_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_R_CR_EXT__SHIFT 0x10
+#define CRTC_VERTICAL_INTERRUPT0_POSITION__CRTC_VERTICAL_INTERRUPT0_LINE_START_MASK 0x3fff
+#define CRTC_VERTICAL_INTERRUPT0_POSITION__CRTC_VERTICAL_INTERRUPT0_LINE_START__SHIFT 0x0
+#define CRTC_VERTICAL_INTERRUPT0_POSITION__CRTC_VERTICAL_INTERRUPT0_LINE_END_MASK 0x3fff0000
+#define CRTC_VERTICAL_INTERRUPT0_POSITION__CRTC_VERTICAL_INTERRUPT0_LINE_END__SHIFT 0x10
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY_MASK 0x10
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_OUTPUT_POLARITY__SHIFT 0x4
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE_MASK 0x100
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_ENABLE__SHIFT 0x8
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_STATUS_MASK 0x1000
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_STATUS__SHIFT 0xc
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_STATUS_MASK 0x10000
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_STATUS__SHIFT 0x10
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR_MASK 0x100000
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_CLEAR__SHIFT 0x14
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_TYPE_MASK 0x1000000
+#define CRTC_VERTICAL_INTERRUPT0_CONTROL__CRTC_VERTICAL_INTERRUPT0_INT_TYPE__SHIFT 0x18
+#define CRTC_VERTICAL_INTERRUPT1_POSITION__CRTC_VERTICAL_INTERRUPT1_LINE_START_MASK 0x3fff
+#define CRTC_VERTICAL_INTERRUPT1_POSITION__CRTC_VERTICAL_INTERRUPT1_LINE_START__SHIFT 0x0
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_ENABLE_MASK 0x100
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_ENABLE__SHIFT 0x8
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_STATUS_MASK 0x1000
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_STATUS__SHIFT 0xc
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_STATUS_MASK 0x10000
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_STATUS__SHIFT 0x10
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_CLEAR_MASK 0x100000
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_CLEAR__SHIFT 0x14
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_TYPE_MASK 0x1000000
+#define CRTC_VERTICAL_INTERRUPT1_CONTROL__CRTC_VERTICAL_INTERRUPT1_INT_TYPE__SHIFT 0x18
+#define CRTC_VERTICAL_INTERRUPT2_POSITION__CRTC_VERTICAL_INTERRUPT2_LINE_START_MASK 0x3fff
+#define CRTC_VERTICAL_INTERRUPT2_POSITION__CRTC_VERTICAL_INTERRUPT2_LINE_START__SHIFT 0x0
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_ENABLE_MASK 0x100
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_ENABLE__SHIFT 0x8
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_STATUS_MASK 0x1000
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_STATUS__SHIFT 0xc
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_STATUS_MASK 0x10000
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_STATUS__SHIFT 0x10
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_CLEAR_MASK 0x100000
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_CLEAR__SHIFT 0x14
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_TYPE_MASK 0x1000000
+#define CRTC_VERTICAL_INTERRUPT2_CONTROL__CRTC_VERTICAL_INTERRUPT2_INT_TYPE__SHIFT 0x18
+#define CRTC_CRC_CNTL__CRTC_CRC_EN_MASK 0x1
+#define CRTC_CRC_CNTL__CRTC_CRC_EN__SHIFT 0x0
+#define CRTC_CRC_CNTL__CRTC_CRC_CONT_EN_MASK 0x10
+#define CRTC_CRC_CNTL__CRTC_CRC_CONT_EN__SHIFT 0x4
+#define CRTC_CRC_CNTL__CRTC_CRC_STEREO_MODE_MASK 0x300
+#define CRTC_CRC_CNTL__CRTC_CRC_STEREO_MODE__SHIFT 0x8
+#define CRTC_CRC_CNTL__CRTC_CRC_INTERLACE_MODE_MASK 0x3000
+#define CRTC_CRC_CNTL__CRTC_CRC_INTERLACE_MODE__SHIFT 0xc
+#define CRTC_CRC_CNTL__CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS_MASK 0x10000
+#define CRTC_CRC_CNTL__CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS__SHIFT 0x10
+#define CRTC_CRC_CNTL__CRTC_CRC0_SELECT_MASK 0x700000
+#define CRTC_CRC_CNTL__CRTC_CRC0_SELECT__SHIFT 0x14
+#define CRTC_CRC_CNTL__CRTC_CRC1_SELECT_MASK 0x7000000
+#define CRTC_CRC_CNTL__CRTC_CRC1_SELECT__SHIFT 0x18
+#define CRTC_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_START_MASK 0x3fff
+#define CRTC_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_START__SHIFT 0x0
+#define CRTC_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_END_MASK 0x3fff0000
+#define CRTC_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_END__SHIFT 0x10
+#define CRTC_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_START_MASK 0x3fff
+#define CRTC_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_START__SHIFT 0x0
+#define CRTC_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_END_MASK 0x3fff0000
+#define CRTC_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_END__SHIFT 0x10
+#define CRTC_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_START_MASK 0x3fff
+#define CRTC_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_START__SHIFT 0x0
+#define CRTC_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_END_MASK 0x3fff0000
+#define CRTC_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_END__SHIFT 0x10
+#define CRTC_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_START_MASK 0x3fff
+#define CRTC_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_START__SHIFT 0x0
+#define CRTC_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_END_MASK 0x3fff0000
+#define CRTC_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_END__SHIFT 0x10
+#define CRTC_CRC0_DATA_RG__CRC0_R_CR_MASK 0xffff
+#define CRTC_CRC0_DATA_RG__CRC0_R_CR__SHIFT 0x0
+#define CRTC_CRC0_DATA_RG__CRC0_G_Y_MASK 0xffff0000
+#define CRTC_CRC0_DATA_RG__CRC0_G_Y__SHIFT 0x10
+#define CRTC_CRC0_DATA_B__CRC0_B_CB_MASK 0xffff
+#define CRTC_CRC0_DATA_B__CRC0_B_CB__SHIFT 0x0
+#define CRTC_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_START_MASK 0x3fff
+#define CRTC_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_START__SHIFT 0x0
+#define CRTC_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_END_MASK 0x3fff0000
+#define CRTC_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_END__SHIFT 0x10
+#define CRTC_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_START_MASK 0x3fff
+#define CRTC_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_START__SHIFT 0x0
+#define CRTC_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_END_MASK 0x3fff0000
+#define CRTC_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_END__SHIFT 0x10
+#define CRTC_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_START_MASK 0x3fff
+#define CRTC_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_START__SHIFT 0x0
+#define CRTC_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_END_MASK 0x3fff0000
+#define CRTC_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_END__SHIFT 0x10
+#define CRTC_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_START_MASK 0x3fff
+#define CRTC_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_START__SHIFT 0x0
+#define CRTC_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_END_MASK 0x3fff0000
+#define CRTC_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_END__SHIFT 0x10
+#define CRTC_CRC1_DATA_RG__CRC1_R_CR_MASK 0xffff
+#define CRTC_CRC1_DATA_RG__CRC1_R_CR__SHIFT 0x0
+#define CRTC_CRC1_DATA_RG__CRC1_G_Y_MASK 0xffff0000
+#define CRTC_CRC1_DATA_RG__CRC1_G_Y__SHIFT 0x10
+#define CRTC_CRC1_DATA_B__CRC1_B_CB_MASK 0xffff
+#define CRTC_CRC1_DATA_B__CRC1_B_CB__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_ENABLE_MASK 0x3
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_ENABLE__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE_MASK 0x8
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_HCOUNT_MODE_ENABLE__SHIFT 0x3
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE_MASK 0x10
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_ENABLE__SHIFT 0x4
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW_MASK 0x60
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_JITTER_FILTERING_WINDOW__SHIFT 0x5
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE_MASK 0x100
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_WINDOW_ENABLE__SHIFT 0x8
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE_MASK 0x200
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_WINDOW_UPDATE__SHIFT 0x9
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY_MASK 0x1000
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_VSYNC_POLARITY__SHIFT 0xc
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY_MASK 0x2000
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_HSYNC_POLARITY__SHIFT 0xd
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_INTERLACE_MODE_MASK 0x4000
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_INTERLACE_MODE__SHIFT 0xe
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_MASTER_FRAME_RATE_MASK 0x7000000
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_MASTER_FRAME_RATE__SHIFT 0x18
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_SLAVE_FRAME_RATE_MASK 0x70000000
+#define CRTC_EXT_TIMING_SYNC_CONTROL__CRTC_EXT_TIMING_SYNC_SLAVE_FRAME_RATE__SHIFT 0x1c
+#define CRTC_EXT_TIMING_SYNC_WINDOW_START__CRTC_EXT_TIMING_SYNC_WINDOW_START_X_MASK 0x3fff
+#define CRTC_EXT_TIMING_SYNC_WINDOW_START__CRTC_EXT_TIMING_SYNC_WINDOW_START_X__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_WINDOW_START__CRTC_EXT_TIMING_SYNC_WINDOW_START_Y_MASK 0x3fff0000
+#define CRTC_EXT_TIMING_SYNC_WINDOW_START__CRTC_EXT_TIMING_SYNC_WINDOW_START_Y__SHIFT 0x10
+#define CRTC_EXT_TIMING_SYNC_WINDOW_END__CRTC_EXT_TIMING_SYNC_WINDOW_END_X_MASK 0x3fff
+#define CRTC_EXT_TIMING_SYNC_WINDOW_END__CRTC_EXT_TIMING_SYNC_WINDOW_END_X__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_WINDOW_END__CRTC_EXT_TIMING_SYNC_WINDOW_END_Y_MASK 0x3fff0000
+#define CRTC_EXT_TIMING_SYNC_WINDOW_END__CRTC_EXT_TIMING_SYNC_WINDOW_END_Y__SHIFT 0x10
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE_MASK 0x1
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_ENABLE__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_STATUS_MASK 0x10
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_STATUS__SHIFT 0x4
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_STATUS_MASK 0x100
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_STATUS__SHIFT 0x8
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_CLEAR_MASK 0x10000
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_CLEAR__SHIFT 0x10
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE_MASK 0x100000
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_INT_TYPE__SHIFT 0x14
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT_MASK 0xe0000000
+#define CRTC_EXT_TIMING_SYNC_LOSS_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_LOSS_FRAME_COUNT__SHIFT 0x1d
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_ENABLE_MASK 0x1
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_ENABLE__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_STATUS_MASK 0x10
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_STATUS__SHIFT 0x4
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_STATUS_MASK 0x100
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_STATUS__SHIFT 0x8
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_CLEAR_MASK 0x10000
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_CLEAR__SHIFT 0x10
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_TYPE_MASK 0x100000
+#define CRTC_EXT_TIMING_SYNC_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_INT_TYPE__SHIFT 0x14
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE_MASK 0x1
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_ENABLE__SHIFT 0x0
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_STATUS_MASK 0x10
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_STATUS__SHIFT 0x4
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_STATUS_MASK 0x100
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_STATUS__SHIFT 0x8
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR_MASK 0x10000
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_CLEAR__SHIFT 0x10
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE_MASK 0x100000
+#define CRTC_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_CONTROL__CRTC_EXT_TIMING_SYNC_SIGNAL_INT_TYPE__SHIFT 0x14
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_EVENT_MASK_MASK 0xffff
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_EVENT_MASK__SHIFT 0x0
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_FRAME_COUNT_MASK 0xff0000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_FRAME_COUNT__SHIFT 0x10
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_ENABLE_MASK 0x1000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_ENABLE__SHIFT 0x18
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_SS_STATUS_MASK 0x2000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_SS_STATUS__SHIFT 0x19
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_STATUS_MASK 0x4000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_STATUS__SHIFT 0x1a
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_CLEAR_MASK 0x8000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_CLEAR__SHIFT 0x1b
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_TYPE_MASK 0x10000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_CPU_SS_INT_TYPE__SHIFT 0x1c
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_OVERRIDE_MASK 0x40000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_OVERRIDE__SHIFT 0x1e
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_OVERRIDE_VALUE_MASK 0x80000000
+#define CRTC_STATIC_SCREEN_CONTROL__CRTC_STATIC_SCREEN_OVERRIDE_VALUE__SHIFT 0x1f
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_EN_MASK 0x1
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_EN__SHIFT 0x0
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_EN_DB_MASK 0x10
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_EN_DB__SHIFT 0x4
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_V_UPDATE_MODE_MASK 0x300
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_V_UPDATE_MODE__SHIFT 0x8
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_STEREO_SEL_OVR_MASK 0x1000
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_STEREO_SEL_OVR__SHIFT 0xc
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT_RESET_MASK 0x10000
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT_RESET__SHIFT 0x10
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT_RESET_PENDING_MASK 0x20000
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT_RESET_PENDING__SHIFT 0x11
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT_MASK 0xc0000
+#define CRTC_3D_STRUCTURE_CONTROL__CRTC_3D_STRUCTURE_F_COUNT__SHIFT 0x12
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_LIMIT_MASK 0xff
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_LIMIT__SHIFT 0x0
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_DELAY_MASK 0xff00
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_DELAY__SHIFT 0x8
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_SOURCE_SEL_MASK 0x10000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_SOURCE_SEL__SHIFT 0x10
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_MODE_MASK 0x60000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_MODE__SHIFT 0x11
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_CLEAR_MASK 0x80000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_CLEAR__SHIFT 0x13
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_OCCURRED_MASK 0x100000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_OCCURRED__SHIFT 0x14
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_MASTER_FASTER_MASK 0x800000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_MASTER_FASTER__SHIFT 0x17
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP_MASK 0xff000000
+#define CRTC_GSL_VSYNC_GAP__CRTC_GSL_VSYNC_GAP__SHIFT 0x18
+#define CRTC_GSL_WINDOW__CRTC_GSL_WINDOW_START_MASK 0x3fff
+#define CRTC_GSL_WINDOW__CRTC_GSL_WINDOW_START__SHIFT 0x0
+#define CRTC_GSL_WINDOW__CRTC_GSL_WINDOW_END_MASK 0x3fff0000
+#define CRTC_GSL_WINDOW__CRTC_GSL_WINDOW_END__SHIFT 0x10
+#define CRTC_GSL_CONTROL__CRTC_GSL_CHECK_LINE_NUM_MASK 0x3fff
+#define CRTC_GSL_CONTROL__CRTC_GSL_CHECK_LINE_NUM__SHIFT 0x0
+#define CRTC_GSL_CONTROL__CRTC_GSL_FORCE_DELAY_MASK 0x1f0000
+#define CRTC_GSL_CONTROL__CRTC_GSL_FORCE_DELAY__SHIFT 0x10
+#define CRTC_GSL_CONTROL__CRTC_GSL_CHECK_ALL_FIELDS_MASK 0x10000000
+#define CRTC_GSL_CONTROL__CRTC_GSL_CHECK_ALL_FIELDS__SHIFT 0x1c
+#define CRTC_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_INDEX_MASK 0xff
+#define CRTC_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_INDEX__SHIFT 0x0
+#define CRTC_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define CRTC_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define CRTC_TEST_DEBUG_DATA__CRTC_TEST_DEBUG_DATA_MASK 0xffffffff
+#define CRTC_TEST_DEBUG_DATA__CRTC_TEST_DEBUG_DATA__SHIFT 0x0
+#define DAC_ENABLE__DAC_ENABLE_MASK 0x1
+#define DAC_ENABLE__DAC_ENABLE__SHIFT 0x0
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ENABLE_MASK 0x2
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ENABLE__SHIFT 0x1
+#define DAC_ENABLE__DAC_RESYNC_FIFO_POINTER_SKEW_MASK 0xc
+#define DAC_ENABLE__DAC_RESYNC_FIFO_POINTER_SKEW__SHIFT 0x2
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ERROR_MASK 0x10
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ERROR__SHIFT 0x4
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ERROR_ACK_MASK 0x20
+#define DAC_ENABLE__DAC_RESYNC_FIFO_ERROR_ACK__SHIFT 0x5
+#define DAC_ENABLE__DAC_RESYNC_FIFO_TVOUT_SIM_MASK 0x100
+#define DAC_ENABLE__DAC_RESYNC_FIFO_TVOUT_SIM__SHIFT 0x8
+#define DAC_SOURCE_SELECT__DAC_SOURCE_SELECT_MASK 0x7
+#define DAC_SOURCE_SELECT__DAC_SOURCE_SELECT__SHIFT 0x0
+#define DAC_SOURCE_SELECT__DAC_TV_SELECT_MASK 0x8
+#define DAC_SOURCE_SELECT__DAC_TV_SELECT__SHIFT 0x3
+#define DAC_CRC_EN__DAC_CRC_EN_MASK 0x1
+#define DAC_CRC_EN__DAC_CRC_EN__SHIFT 0x0
+#define DAC_CRC_EN__DAC_CRC_CONT_EN_MASK 0x10000
+#define DAC_CRC_EN__DAC_CRC_CONT_EN__SHIFT 0x10
+#define DAC_CRC_CONTROL__DAC_CRC_FIELD_MASK 0x1
+#define DAC_CRC_CONTROL__DAC_CRC_FIELD__SHIFT 0x0
+#define DAC_CRC_CONTROL__DAC_CRC_ONLY_BLANKB_MASK 0x100
+#define DAC_CRC_CONTROL__DAC_CRC_ONLY_BLANKB__SHIFT 0x8
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_BLUE_MASK_MASK 0x3ff
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_BLUE_MASK__SHIFT 0x0
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_GREEN_MASK_MASK 0xffc00
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_GREEN_MASK__SHIFT 0xa
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_RED_MASK_MASK 0x3ff00000
+#define DAC_CRC_SIG_RGB_MASK__DAC_CRC_SIG_RED_MASK__SHIFT 0x14
+#define DAC_CRC_SIG_CONTROL_MASK__DAC_CRC_SIG_CONTROL_MASK_MASK 0x3f
+#define DAC_CRC_SIG_CONTROL_MASK__DAC_CRC_SIG_CONTROL_MASK__SHIFT 0x0
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_BLUE_MASK 0x3ff
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_BLUE__SHIFT 0x0
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_GREEN_MASK 0xffc00
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_GREEN__SHIFT 0xa
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_RED_MASK 0x3ff00000
+#define DAC_CRC_SIG_RGB__DAC_CRC_SIG_RED__SHIFT 0x14
+#define DAC_CRC_SIG_CONTROL__DAC_CRC_SIG_CONTROL_MASK 0x3f
+#define DAC_CRC_SIG_CONTROL__DAC_CRC_SIG_CONTROL__SHIFT 0x0
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_HSYNCA_TRISTATE_MASK 0x1
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_HSYNCA_TRISTATE__SHIFT 0x0
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_VSYNCA_TRISTATE_MASK 0x100
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_VSYNCA_TRISTATE__SHIFT 0x8
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_SYNCA_TRISTATE_MASK 0x10000
+#define DAC_SYNC_TRISTATE_CONTROL__DAC_SYNCA_TRISTATE__SHIFT 0x10
+#define DAC_STEREOSYNC_SELECT__DAC_STEREOSYNC_SELECT_MASK 0x7
+#define DAC_STEREOSYNC_SELECT__DAC_STEREOSYNC_SELECT__SHIFT 0x0
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_MODE_MASK 0x3
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_MODE__SHIFT 0x0
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_FRAME_TIME_COUNTER_MASK 0xff00
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_FRAME_TIME_COUNTER__SHIFT 0x8
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_CHECK_MASK_MASK 0x70000
+#define DAC_AUTODETECT_CONTROL__DAC_AUTODETECT_CHECK_MASK__SHIFT 0x10
+#define DAC_AUTODETECT_CONTROL2__DAC_AUTODETECT_POWERUP_COUNTER_MASK 0xff
+#define DAC_AUTODETECT_CONTROL2__DAC_AUTODETECT_POWERUP_COUNTER__SHIFT 0x0
+#define DAC_AUTODETECT_CONTROL2__DAC_AUTODETECT_TESTMODE_MASK 0x100
+#define DAC_AUTODETECT_CONTROL2__DAC_AUTODETECT_TESTMODE__SHIFT 0x8
+#define DAC_AUTODETECT_CONTROL3__DAC_AUTODET_COMPARATOR_IN_DELAY_MASK 0xff
+#define DAC_AUTODETECT_CONTROL3__DAC_AUTODET_COMPARATOR_IN_DELAY__SHIFT 0x0
+#define DAC_AUTODETECT_CONTROL3__DAC_AUTODET_COMPARATOR_OUT_DELAY_MASK 0xff00
+#define DAC_AUTODETECT_CONTROL3__DAC_AUTODET_COMPARATOR_OUT_DELAY__SHIFT 0x8
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_STATUS_MASK 0x1
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_STATUS__SHIFT 0x0
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_CONNECT_MASK 0x10
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_CONNECT__SHIFT 0x4
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_RED_SENSE_MASK 0x300
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_RED_SENSE__SHIFT 0x8
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_GREEN_SENSE_MASK 0x30000
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_GREEN_SENSE__SHIFT 0x10
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_BLUE_SENSE_MASK 0x3000000
+#define DAC_AUTODETECT_STATUS__DAC_AUTODETECT_BLUE_SENSE__SHIFT 0x18
+#define DAC_AUTODETECT_INT_CONTROL__DAC_AUTODETECT_ACK_MASK 0x1
+#define DAC_AUTODETECT_INT_CONTROL__DAC_AUTODETECT_ACK__SHIFT 0x0
+#define DAC_AUTODETECT_INT_CONTROL__DAC_AUTODETECT_INT_ENABLE_MASK 0x10000
+#define DAC_AUTODETECT_INT_CONTROL__DAC_AUTODETECT_INT_ENABLE__SHIFT 0x10
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_EN_MASK 0x1
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_EN__SHIFT 0x0
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_SEL_MASK 0x700
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_SEL__SHIFT 0x8
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_ON_BLANKB_ONLY_MASK 0x1000000
+#define DAC_FORCE_OUTPUT_CNTL__DAC_FORCE_DATA_ON_BLANKB_ONLY__SHIFT 0x18
+#define DAC_FORCE_DATA__DAC_FORCE_DATA_MASK 0x3ff
+#define DAC_FORCE_DATA__DAC_FORCE_DATA__SHIFT 0x0
+#define DAC_POWERDOWN__DAC_POWERDOWN_MASK 0x1
+#define DAC_POWERDOWN__DAC_POWERDOWN__SHIFT 0x0
+#define DAC_POWERDOWN__DAC_POWERDOWN_BLUE_MASK 0x100
+#define DAC_POWERDOWN__DAC_POWERDOWN_BLUE__SHIFT 0x8
+#define DAC_POWERDOWN__DAC_POWERDOWN_GREEN_MASK 0x10000
+#define DAC_POWERDOWN__DAC_POWERDOWN_GREEN__SHIFT 0x10
+#define DAC_POWERDOWN__DAC_POWERDOWN_RED_MASK 0x1000000
+#define DAC_POWERDOWN__DAC_POWERDOWN_RED__SHIFT 0x18
+#define DAC_CONTROL__DAC_DFORCE_EN_MASK 0x1
+#define DAC_CONTROL__DAC_DFORCE_EN__SHIFT 0x0
+#define DAC_CONTROL__DAC_TV_ENABLE_MASK 0x100
+#define DAC_CONTROL__DAC_TV_ENABLE__SHIFT 0x8
+#define DAC_CONTROL__DAC_ZSCALE_SHIFT_MASK 0x10000
+#define DAC_CONTROL__DAC_ZSCALE_SHIFT__SHIFT 0x10
+#define DAC_COMPARATOR_ENABLE__DAC_COMP_DDET_REF_EN_MASK 0x1
+#define DAC_COMPARATOR_ENABLE__DAC_COMP_DDET_REF_EN__SHIFT 0x0
+#define DAC_COMPARATOR_ENABLE__DAC_COMP_SDET_REF_EN_MASK 0x100
+#define DAC_COMPARATOR_ENABLE__DAC_COMP_SDET_REF_EN__SHIFT 0x8
+#define DAC_COMPARATOR_ENABLE__DAC_R_ASYNC_ENABLE_MASK 0x10000
+#define DAC_COMPARATOR_ENABLE__DAC_R_ASYNC_ENABLE__SHIFT 0x10
+#define DAC_COMPARATOR_ENABLE__DAC_G_ASYNC_ENABLE_MASK 0x20000
+#define DAC_COMPARATOR_ENABLE__DAC_G_ASYNC_ENABLE__SHIFT 0x11
+#define DAC_COMPARATOR_ENABLE__DAC_B_ASYNC_ENABLE_MASK 0x40000
+#define DAC_COMPARATOR_ENABLE__DAC_B_ASYNC_ENABLE__SHIFT 0x12
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_MASK 0x1
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT__SHIFT 0x0
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_BLUE_MASK 0x2
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_BLUE__SHIFT 0x1
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_GREEN_MASK 0x4
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_GREEN__SHIFT 0x2
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_RED_MASK 0x8
+#define DAC_COMPARATOR_OUTPUT__DAC_COMPARATOR_OUTPUT_RED__SHIFT 0x3
+#define DAC_PWR_CNTL__DAC_BG_MODE_MASK 0x3
+#define DAC_PWR_CNTL__DAC_BG_MODE__SHIFT 0x0
+#define DAC_PWR_CNTL__DAC_PWRCNTL_MASK 0x30000
+#define DAC_PWR_CNTL__DAC_PWRCNTL__SHIFT 0x10
+#define DAC_DFT_CONFIG__DAC_DFT_CONFIG_MASK 0xffffffff
+#define DAC_DFT_CONFIG__DAC_DFT_CONFIG__SHIFT 0x0
+#define DAC_FIFO_STATUS__DAC_FIFO_USE_OVERWRITE_LEVEL_MASK 0x2
+#define DAC_FIFO_STATUS__DAC_FIFO_USE_OVERWRITE_LEVEL__SHIFT 0x1
+#define DAC_FIFO_STATUS__DAC_FIFO_OVERWRITE_LEVEL_MASK 0xfc
+#define DAC_FIFO_STATUS__DAC_FIFO_OVERWRITE_LEVEL__SHIFT 0x2
+#define DAC_FIFO_STATUS__DAC_FIFO_CAL_AVERAGE_LEVEL_MASK 0xfc00
+#define DAC_FIFO_STATUS__DAC_FIFO_CAL_AVERAGE_LEVEL__SHIFT 0xa
+#define DAC_FIFO_STATUS__DAC_FIFO_MAXIMUM_LEVEL_MASK 0xf0000
+#define DAC_FIFO_STATUS__DAC_FIFO_MAXIMUM_LEVEL__SHIFT 0x10
+#define DAC_FIFO_STATUS__DAC_FIFO_MINIMUM_LEVEL_MASK 0x3c00000
+#define DAC_FIFO_STATUS__DAC_FIFO_MINIMUM_LEVEL__SHIFT 0x16
+#define DAC_FIFO_STATUS__DAC_FIFO_CALIBRATED_MASK 0x20000000
+#define DAC_FIFO_STATUS__DAC_FIFO_CALIBRATED__SHIFT 0x1d
+#define DAC_FIFO_STATUS__DAC_FIFO_FORCE_RECAL_AVERAGE_MASK 0x40000000
+#define DAC_FIFO_STATUS__DAC_FIFO_FORCE_RECAL_AVERAGE__SHIFT 0x1e
+#define DAC_FIFO_STATUS__DAC_FIFO_FORCE_RECOMP_MINMAX_MASK 0x80000000
+#define DAC_FIFO_STATUS__DAC_FIFO_FORCE_RECOMP_MINMAX__SHIFT 0x1f
+#define DAC_TEST_DEBUG_INDEX__DAC_TEST_DEBUG_INDEX_MASK 0xff
+#define DAC_TEST_DEBUG_INDEX__DAC_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DAC_TEST_DEBUG_INDEX__DAC_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DAC_TEST_DEBUG_INDEX__DAC_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DAC_TEST_DEBUG_DATA__DAC_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DAC_TEST_DEBUG_DATA__DAC_TEST_DEBUG_DATA__SHIFT 0x0
+#define PERFCOUNTER_CNTL__PERFCOUNTER_EVENT_SEL_MASK 0x1ff
+#define PERFCOUNTER_CNTL__PERFCOUNTER_EVENT_SEL__SHIFT 0x0
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CVALUE_SEL_MASK 0xe00
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CVALUE_SEL__SHIFT 0x9
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INC_MODE_MASK 0x3000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INC_MODE__SHIFT 0xc
+#define PERFCOUNTER_CNTL__PERFCOUNTER_HW_CNTL_SEL_MASK 0x4000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_HW_CNTL_SEL__SHIFT 0xe
+#define PERFCOUNTER_CNTL__PERFCOUNTER_RUNEN_MODE_MASK 0x8000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_RUNEN_MODE__SHIFT 0xf
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTOFF_SEL_MASK 0x1f0000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTOFF_SEL__SHIFT 0x10
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTOFF_START_DIS_MASK 0x200000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTOFF_START_DIS__SHIFT 0x15
+#define PERFCOUNTER_CNTL__PERFCOUNTER_RESTART_EN_MASK 0x400000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_RESTART_EN__SHIFT 0x16
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INT_EN_MASK 0x800000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INT_EN__SHIFT 0x17
+#define PERFCOUNTER_CNTL__PERFCOUNTER_OFF_MASK_MASK 0x1000000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_OFF_MASK__SHIFT 0x18
+#define PERFCOUNTER_CNTL__PERFCOUNTER_ACTIVE_MASK 0x2000000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_ACTIVE__SHIFT 0x19
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INT_TYPE_MASK 0x4000000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_INT_TYPE__SHIFT 0x1a
+#define PERFCOUNTER_CNTL__PERFCOUNTER_COUNTED_VALUE_TYPE_MASK 0x8000000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_COUNTED_VALUE_TYPE__SHIFT 0x1b
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTL_SEL_MASK 0xe0000000
+#define PERFCOUNTER_CNTL__PERFCOUNTER_CNTL_SEL__SHIFT 0x1d
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT0_STATE_MASK 0x3
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT0_STATE__SHIFT 0x0
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL0_MASK 0x4
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL0__SHIFT 0x2
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT1_STATE_MASK 0x30
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT1_STATE__SHIFT 0x4
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL1_MASK 0x40
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL1__SHIFT 0x6
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT2_STATE_MASK 0x300
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT2_STATE__SHIFT 0x8
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL2_MASK 0x400
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL2__SHIFT 0xa
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT3_STATE_MASK 0x3000
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT3_STATE__SHIFT 0xc
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL3_MASK 0x4000
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL3__SHIFT 0xe
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT4_STATE_MASK 0x30000
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT4_STATE__SHIFT 0x10
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL4_MASK 0x40000
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL4__SHIFT 0x12
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT5_STATE_MASK 0x300000
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT5_STATE__SHIFT 0x14
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL5_MASK 0x400000
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL5__SHIFT 0x16
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT6_STATE_MASK 0x3000000
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT6_STATE__SHIFT 0x18
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL6_MASK 0x4000000
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL6__SHIFT 0x1a
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT7_STATE_MASK 0x30000000
+#define PERFCOUNTER_STATE__PERFCOUNTER_CNT7_STATE__SHIFT 0x1c
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL7_MASK 0x40000000
+#define PERFCOUNTER_STATE__PERFCOUNTER_STATE_SEL7__SHIFT 0x1e
+#define PERFMON_CNTL__PERFMON_STATE_MASK 0x3
+#define PERFMON_CNTL__PERFMON_STATE__SHIFT 0x0
+#define PERFMON_CNTL__PERFMON_RUN_ENABLE_SEL_MASK 0xfc
+#define PERFMON_CNTL__PERFMON_RUN_ENABLE_SEL__SHIFT 0x2
+#define PERFMON_CNTL__PERFMON_RPT_COUNT_MASK 0xfffff00
+#define PERFMON_CNTL__PERFMON_RPT_COUNT__SHIFT 0x8
+#define PERFMON_CNTL__PERFMON_CNTOFF_AND_OR_MASK 0x10000000
+#define PERFMON_CNTL__PERFMON_CNTOFF_AND_OR__SHIFT 0x1c
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_EN_MASK 0x20000000
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_EN__SHIFT 0x1d
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_STATUS_MASK 0x40000000
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_STATUS__SHIFT 0x1e
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_ACK_MASK 0x80000000
+#define PERFMON_CNTL__PERFMON_CNTOFF_INT_ACK__SHIFT 0x1f
+#define PERFMON_CNTL2__PERFMON_CNTOFF_INT_TYPE_MASK 0x1
+#define PERFMON_CNTL2__PERFMON_CNTOFF_INT_TYPE__SHIFT 0x0
+#define PERFMON_CNTL2__PERFMON_CLK_ENABLE_MASK 0x2
+#define PERFMON_CNTL2__PERFMON_CLK_ENABLE__SHIFT 0x1
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT0_STATUS_MASK 0x1
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT0_STATUS__SHIFT 0x0
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT1_STATUS_MASK 0x2
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT1_STATUS__SHIFT 0x1
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT2_STATUS_MASK 0x4
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT2_STATUS__SHIFT 0x2
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT3_STATUS_MASK 0x8
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT3_STATUS__SHIFT 0x3
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT4_STATUS_MASK 0x10
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT4_STATUS__SHIFT 0x4
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT5_STATUS_MASK 0x20
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT5_STATUS__SHIFT 0x5
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT6_STATUS_MASK 0x40
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT6_STATUS__SHIFT 0x6
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT7_STATUS_MASK 0x80
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT7_STATUS__SHIFT 0x7
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT0_ACK_MASK 0x100
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT0_ACK__SHIFT 0x8
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT1_ACK_MASK 0x200
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT1_ACK__SHIFT 0x9
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT2_ACK_MASK 0x400
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT2_ACK__SHIFT 0xa
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT3_ACK_MASK 0x800
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT3_ACK__SHIFT 0xb
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT4_ACK_MASK 0x1000
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT4_ACK__SHIFT 0xc
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT5_ACK_MASK 0x2000
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT5_ACK__SHIFT 0xd
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT6_ACK_MASK 0x4000
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT6_ACK__SHIFT 0xe
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT7_ACK_MASK 0x8000
+#define PERFMON_CVALUE_INT_MISC__PERFCOUNTER_INT7_ACK__SHIFT 0xf
+#define PERFMON_CVALUE_INT_MISC__PERFMON_CVALUE_HI_MASK 0xffff0000
+#define PERFMON_CVALUE_INT_MISC__PERFMON_CVALUE_HI__SHIFT 0x10
+#define PERFMON_CVALUE_LOW__PERFMON_CVALUE_LOW_MASK 0xffffffff
+#define PERFMON_CVALUE_LOW__PERFMON_CVALUE_LOW__SHIFT 0x0
+#define PERFMON_HI__PERFMON_HI_MASK 0xffff
+#define PERFMON_HI__PERFMON_HI__SHIFT 0x0
+#define PERFMON_HI__PERFMON_READ_SEL_MASK 0xe0000000
+#define PERFMON_HI__PERFMON_READ_SEL__SHIFT 0x1d
+#define PERFMON_LOW__PERFMON_LOW_MASK 0xffffffff
+#define PERFMON_LOW__PERFMON_LOW__SHIFT 0x0
+#define PERFMON_TEST_DEBUG_INDEX__PERFMON_TEST_DEBUG_INDEX_MASK 0xff
+#define PERFMON_TEST_DEBUG_INDEX__PERFMON_TEST_DEBUG_INDEX__SHIFT 0x0
+#define PERFMON_TEST_DEBUG_INDEX__PERFMON_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define PERFMON_TEST_DEBUG_INDEX__PERFMON_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define PERFMON_TEST_DEBUG_DATA__PERFMON_TEST_DEBUG_DATA_MASK 0xffffffff
+#define PERFMON_TEST_DEBUG_DATA__PERFMON_TEST_DEBUG_DATA__SHIFT 0x0
+#define REFCLK_CNTL__REFCLK_CLOCK_EN_MASK 0x1
+#define REFCLK_CNTL__REFCLK_CLOCK_EN__SHIFT 0x0
+#define REFCLK_CNTL__REFCLK_SRC_SEL_MASK 0x2
+#define REFCLK_CNTL__REFCLK_SRC_SEL__SHIFT 0x1
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P0PLL_CBUS_ANTIGLITCH_RESETB_MASK 0x1
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P0PLL_CBUS_ANTIGLITCH_RESETB__SHIFT 0x0
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P1PLL_CBUS_ANTIGLITCH_RESETB_MASK 0x2
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P1PLL_CBUS_ANTIGLITCH_RESETB__SHIFT 0x1
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P2PLL_CBUS_ANTIGLITCH_RESETB_MASK 0x4
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P2PLL_CBUS_ANTIGLITCH_RESETB__SHIFT 0x2
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P3PLL_CBUS_ANTIGLITCH_RESETB_MASK 0x8
+#define DCCG_CBUS_ANTIGLITCH_RESETB__P3PLL_CBUS_ANTIGLITCH_RESETB__SHIFT 0x3
+#define DCCG_CBUS_SPARE__P0PLL_CBUS_SPARE_MASK 0xff
+#define DCCG_CBUS_SPARE__P0PLL_CBUS_SPARE__SHIFT 0x0
+#define DCCG_CBUS_SPARE__P1PLL_CBUS_SPARE_MASK 0xff00
+#define DCCG_CBUS_SPARE__P1PLL_CBUS_SPARE__SHIFT 0x8
+#define DCCG_CBUS_SPARE__P2PLL_CBUS_SPARE_MASK 0xff0000
+#define DCCG_CBUS_SPARE__P2PLL_CBUS_SPARE__SHIFT 0x10
+#define DCCG_CBUS_SPARE__P3PLL_CBUS_SPARE_MASK 0xff000000
+#define DCCG_CBUS_SPARE__P3PLL_CBUS_SPARE__SHIFT 0x18
+#define DCCG_CBUS_WRCMD_DELAY__CBUS_PLL_WRCMD_DELAY_MASK 0xf
+#define DCCG_CBUS_WRCMD_DELAY__CBUS_PLL_WRCMD_DELAY__SHIFT 0x0
+#define DPREFCLK_CNTL__DPREFCLK_SRC_SEL_MASK 0x7
+#define DPREFCLK_CNTL__DPREFCLK_SRC_SEL__SHIFT 0x0
+#define DPREFCLK_CNTL__UNB_DB_CLK_ENABLE_MASK 0x100
+#define DPREFCLK_CNTL__UNB_DB_CLK_ENABLE__SHIFT 0x8
+#define DCE_VERSION__MAJOR_VERSION_MASK 0xff
+#define DCE_VERSION__MAJOR_VERSION__SHIFT 0x0
+#define DCE_VERSION__MINOR_VERSION_MASK 0xff00
+#define DCE_VERSION__MINOR_VERSION__SHIFT 0x8
+#define AVSYNC_COUNTER_WRITE__AVSYNC_COUNTER_WRVALUE_MASK 0xffffffff
+#define AVSYNC_COUNTER_WRITE__AVSYNC_COUNTER_WRVALUE__SHIFT 0x0
+#define AVSYNC_COUNTER_CONTROL__AVSYNC_COUNTER_ENABLE_MASK 0x1
+#define AVSYNC_COUNTER_CONTROL__AVSYNC_COUNTER_ENABLE__SHIFT 0x0
+#define AVSYNC_COUNTER_READ__AVSYNC_COUNTER_RDVALUE_MASK 0xffffffff
+#define AVSYNC_COUNTER_READ__AVSYNC_COUNTER_RDVALUE__SHIFT 0x0
+#define DCCG_GTC_CNTL__DCCG_GTC_ENABLE_MASK 0x1
+#define DCCG_GTC_CNTL__DCCG_GTC_ENABLE__SHIFT 0x0
+#define DCCG_GTC_DTO_INCR__DCCG_GTC_DTO_INCR_MASK 0xffffffff
+#define DCCG_GTC_DTO_INCR__DCCG_GTC_DTO_INCR__SHIFT 0x0
+#define DCCG_GTC_DTO_MODULO__DCCG_GTC_DTO_MODULO_MASK 0xffffffff
+#define DCCG_GTC_DTO_MODULO__DCCG_GTC_DTO_MODULO__SHIFT 0x0
+#define DCCG_GTC_CURRENT__DCCG_GTC_CURRENT_MASK 0xffffffff
+#define DCCG_GTC_CURRENT__DCCG_GTC_CURRENT__SHIFT 0x0
+#define DCCG_DS_DTO_INCR__DCCG_DS_DTO_INCR_MASK 0xffffffff
+#define DCCG_DS_DTO_INCR__DCCG_DS_DTO_INCR__SHIFT 0x0
+#define DCCG_DS_DTO_MODULO__DCCG_DS_DTO_MODULO_MASK 0xffffffff
+#define DCCG_DS_DTO_MODULO__DCCG_DS_DTO_MODULO__SHIFT 0x0
+#define DCCG_DS_CNTL__DCCG_DS_ENABLE_MASK 0x1
+#define DCCG_DS_CNTL__DCCG_DS_ENABLE__SHIFT 0x0
+#define DCCG_DS_CNTL__DCCG_DS_REF_SRC_MASK 0x30
+#define DCCG_DS_CNTL__DCCG_DS_REF_SRC__SHIFT 0x4
+#define DCCG_DS_CNTL__DCCG_DS_HW_CAL_ENABLE_MASK 0x100
+#define DCCG_DS_CNTL__DCCG_DS_HW_CAL_ENABLE__SHIFT 0x8
+#define DCCG_DS_CNTL__DCCG_DS_ENABLED_STATUS_MASK 0x200
+#define DCCG_DS_CNTL__DCCG_DS_ENABLED_STATUS__SHIFT 0x9
+#define DCCG_DS_CNTL__DCCG_DS_XTALIN_RATE_DIV_MASK 0x30000
+#define DCCG_DS_CNTL__DCCG_DS_XTALIN_RATE_DIV__SHIFT 0x10
+#define DCCG_DS_CNTL__DCCG_DS_JITTER_REMOVE_DIS_MASK 0x1000000
+#define DCCG_DS_CNTL__DCCG_DS_JITTER_REMOVE_DIS__SHIFT 0x18
+#define DCCG_DS_CNTL__DCCG_DS_DELAY_XTAL_SEL_MASK 0x2000000
+#define DCCG_DS_CNTL__DCCG_DS_DELAY_XTAL_SEL__SHIFT 0x19
+#define DCCG_DS_HW_CAL_INTERVAL__DCCG_DS_HW_CAL_INTERVAL_MASK 0xffffffff
+#define DCCG_DS_HW_CAL_INTERVAL__DCCG_DS_HW_CAL_INTERVAL__SHIFT 0x0
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_ENABLE_MASK 0x1
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_ENABLE__SHIFT 0x0
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_VALUE_MASK 0x1ff0
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_VALUE__SHIFT 0x4
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_OCCURRED_MASK 0x10000
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_OCCURRED__SHIFT 0x10
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_CLEAR_MASK 0x20000
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_DEBUG_COUNT_TRIG_CLEAR__SHIFT 0x11
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT_ENABLE_MASK 0x100000
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT_ENABLE__SHIFT 0x14
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT_SRC_SEL_MASK 0x200000
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT_SRC_SEL__SHIFT 0x15
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT_MASK 0xff000000
+#define DCCG_DS_DEBUG_CNTL__DCCG_DS_JITTER_COUNT__SHIFT 0x18
+#define DMCU_SMU_INTERRUPT_CNTL__DMCU_SMU_STATIC_SCREEN_INT_MASK 0x1
+#define DMCU_SMU_INTERRUPT_CNTL__DMCU_SMU_STATIC_SCREEN_INT__SHIFT 0x0
+#define DMCU_SMU_INTERRUPT_CNTL__DMCU_SMU_STATIC_SCREEN_STATUS_MASK 0xffff0000
+#define DMCU_SMU_INTERRUPT_CNTL__DMCU_SMU_STATIC_SCREEN_STATUS__SHIFT 0x10
+#define SMU_CONTROL__DISPLAY0_FORCE_VBI_MASK 0x1
+#define SMU_CONTROL__DISPLAY0_FORCE_VBI__SHIFT 0x0
+#define SMU_CONTROL__DISPLAY1_FORCE_VBI_MASK 0x2
+#define SMU_CONTROL__DISPLAY1_FORCE_VBI__SHIFT 0x1
+#define SMU_CONTROL__DISPLAY2_FORCE_VBI_MASK 0x4
+#define SMU_CONTROL__DISPLAY2_FORCE_VBI__SHIFT 0x2
+#define SMU_CONTROL__DISPLAY3_FORCE_VBI_MASK 0x8
+#define SMU_CONTROL__DISPLAY3_FORCE_VBI__SHIFT 0x3
+#define SMU_CONTROL__DISPLAY4_FORCE_VBI_MASK 0x10
+#define SMU_CONTROL__DISPLAY4_FORCE_VBI__SHIFT 0x4
+#define SMU_CONTROL__DISPLAY5_FORCE_VBI_MASK 0x20
+#define SMU_CONTROL__DISPLAY5_FORCE_VBI__SHIFT 0x5
+#define SMU_CONTROL__DISPLAY_V0_FORCE_VBI_MASK 0x40
+#define SMU_CONTROL__DISPLAY_V0_FORCE_VBI__SHIFT 0x6
+#define SMU_CONTROL__DISPLAY_V1_FORCE_VBI_MASK 0x80
+#define SMU_CONTROL__DISPLAY_V1_FORCE_VBI__SHIFT 0x7
+#define SMU_CONTROL__MCIF_WB_FORCE_VBI_MASK 0x100
+#define SMU_CONTROL__MCIF_WB_FORCE_VBI__SHIFT 0x8
+#define SMU_CONTROL__SMU_DC_INT_CLEAR_MASK 0x10000
+#define SMU_CONTROL__SMU_DC_INT_CLEAR__SHIFT 0x10
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_ENABLE_MASK 0x1
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_ENABLE__SHIFT 0x0
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_STATUS_MASK 0x10
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_STATUS__SHIFT 0x4
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_EVENT_MASK 0xffff0000
+#define SMU_INTERRUPT_CONTROL__DC_SMU_INT_EVENT__SHIFT 0x10
+#define DAC_CLK_ENABLE__DACA_CLK_ENABLE_MASK 0x1
+#define DAC_CLK_ENABLE__DACA_CLK_ENABLE__SHIFT 0x0
+#define DAC_CLK_ENABLE__DACB_CLK_ENABLE_MASK 0x10
+#define DAC_CLK_ENABLE__DACB_CLK_ENABLE__SHIFT 0x4
+#define DVO_CLK_ENABLE__DVO_CLK_ENABLE_MASK 0x1
+#define DVO_CLK_ENABLE__DVO_CLK_ENABLE__SHIFT 0x0
+#define DCCG_GATE_DISABLE_CNTL__DISPCLK_DCCG_GATE_DISABLE_MASK 0x1
+#define DCCG_GATE_DISABLE_CNTL__DISPCLK_DCCG_GATE_DISABLE__SHIFT 0x0
+#define DCCG_GATE_DISABLE_CNTL__DISPCLK_R_DCCG_GATE_DISABLE_MASK 0x2
+#define DCCG_GATE_DISABLE_CNTL__DISPCLK_R_DCCG_GATE_DISABLE__SHIFT 0x1
+#define DCCG_GATE_DISABLE_CNTL__SCLK_GATE_DISABLE_MASK 0x4
+#define DCCG_GATE_DISABLE_CNTL__SCLK_GATE_DISABLE__SHIFT 0x2
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_GATE_DISABLE_MASK 0x8
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_GATE_DISABLE__SHIFT 0x3
+#define DCCG_GATE_DISABLE_CNTL__DACACLK_GATE_DISABLE_MASK 0x10
+#define DCCG_GATE_DISABLE_CNTL__DACACLK_GATE_DISABLE__SHIFT 0x4
+#define DCCG_GATE_DISABLE_CNTL__DACBCLK_GATE_DISABLE_MASK 0x20
+#define DCCG_GATE_DISABLE_CNTL__DACBCLK_GATE_DISABLE__SHIFT 0x5
+#define DCCG_GATE_DISABLE_CNTL__DVOACLK_GATE_DISABLE_MASK 0x40
+#define DCCG_GATE_DISABLE_CNTL__DVOACLK_GATE_DISABLE__SHIFT 0x6
+#define DCCG_GATE_DISABLE_CNTL__DPDBG_CLK_GATE_DISABLE_MASK 0x80
+#define DCCG_GATE_DISABLE_CNTL__DPDBG_CLK_GATE_DISABLE__SHIFT 0x7
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_R_DCCG_GATE_DISABLE_MASK 0x100
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_R_DCCG_GATE_DISABLE__SHIFT 0x8
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK0_GATE_DISABLE_MASK 0x20000
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK0_GATE_DISABLE__SHIFT 0x11
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK1_GATE_DISABLE_MASK 0x40000
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK1_GATE_DISABLE__SHIFT 0x12
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK2_GATE_DISABLE_MASK 0x80000
+#define DCCG_GATE_DISABLE_CNTL__AOMCLK2_GATE_DISABLE__SHIFT 0x13
+#define DCCG_GATE_DISABLE_CNTL__AUDIO_DTO2_CLK_GATE_DISABLE_MASK 0x200000
+#define DCCG_GATE_DISABLE_CNTL__AUDIO_DTO2_CLK_GATE_DISABLE__SHIFT 0x15
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_GTC_GATE_DISABLE_MASK 0x400000
+#define DCCG_GATE_DISABLE_CNTL__DPREFCLK_GTC_GATE_DISABLE__SHIFT 0x16
+#define DCCG_GATE_DISABLE_CNTL__UNB_DB_CLK_GATE_DISABLE_MASK 0x800000
+#define DCCG_GATE_DISABLE_CNTL__UNB_DB_CLK_GATE_DISABLE__SHIFT 0x17
+#define DCCG_GATE_DISABLE_CNTL__REFCLK_GATE_DISABLE_MASK 0x4000000
+#define DCCG_GATE_DISABLE_CNTL__REFCLK_GATE_DISABLE__SHIFT 0x1a
+#define DCCG_GATE_DISABLE_CNTL__REFCLK_R_DIG_GATE_DISABLE_MASK 0x8000000
+#define DCCG_GATE_DISABLE_CNTL__REFCLK_R_DIG_GATE_DISABLE__SHIFT 0x1b
+#define DCCG_GATE_DISABLE_CNTL__DSICLK_GATE_DISABLE_MASK 0x10000000
+#define DCCG_GATE_DISABLE_CNTL__DSICLK_GATE_DISABLE__SHIFT 0x1c
+#define DCCG_GATE_DISABLE_CNTL__BYTECLK_GATE_DISABLE_MASK 0x20000000
+#define DCCG_GATE_DISABLE_CNTL__BYTECLK_GATE_DISABLE__SHIFT 0x1d
+#define DCCG_GATE_DISABLE_CNTL__ESCCLK_GATE_DISABLE_MASK 0x40000000
+#define DCCG_GATE_DISABLE_CNTL__ESCCLK_GATE_DISABLE__SHIFT 0x1e
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKA_FE_GATE_DISABLE_MASK 0x1
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKA_FE_GATE_DISABLE__SHIFT 0x0
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKB_FE_GATE_DISABLE_MASK 0x2
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKB_FE_GATE_DISABLE__SHIFT 0x1
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKC_FE_GATE_DISABLE_MASK 0x4
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKC_FE_GATE_DISABLE__SHIFT 0x2
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKD_FE_GATE_DISABLE_MASK 0x8
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKD_FE_GATE_DISABLE__SHIFT 0x3
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKE_FE_GATE_DISABLE_MASK 0x10
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKE_FE_GATE_DISABLE__SHIFT 0x4
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKF_FE_GATE_DISABLE_MASK 0x20
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKF_FE_GATE_DISABLE__SHIFT 0x5
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKG_FE_GATE_DISABLE_MASK 0x40
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKG_FE_GATE_DISABLE__SHIFT 0x6
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPA_FE_GATE_DISABLE_MASK 0x100
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPA_FE_GATE_DISABLE__SHIFT 0x8
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPB_FE_GATE_DISABLE_MASK 0x200
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPB_FE_GATE_DISABLE__SHIFT 0x9
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKA_GATE_DISABLE_MASK 0x10000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKA_GATE_DISABLE__SHIFT 0x10
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKB_GATE_DISABLE_MASK 0x20000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKB_GATE_DISABLE__SHIFT 0x11
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKC_GATE_DISABLE_MASK 0x40000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKC_GATE_DISABLE__SHIFT 0x12
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKD_GATE_DISABLE_MASK 0x80000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKD_GATE_DISABLE__SHIFT 0x13
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKE_GATE_DISABLE_MASK 0x100000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKE_GATE_DISABLE__SHIFT 0x14
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKF_GATE_DISABLE_MASK 0x200000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKF_GATE_DISABLE__SHIFT 0x15
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKG_GATE_DISABLE_MASK 0x400000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKG_GATE_DISABLE__SHIFT 0x16
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPA_GATE_DISABLE_MASK 0x1000000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPA_GATE_DISABLE__SHIFT 0x18
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPB_GATE_DISABLE_MASK 0x2000000
+#define DCCG_GATE_DISABLE_CNTL2__SYMCLKLPB_GATE_DISABLE__SHIFT 0x19
+#define DISPCLK_CGTT_BLK_CTRL_REG__DISPCLK_TURN_ON_DELAY_MASK 0xf
+#define DISPCLK_CGTT_BLK_CTRL_REG__DISPCLK_TURN_ON_DELAY__SHIFT 0x0
+#define DISPCLK_CGTT_BLK_CTRL_REG__DISPCLK_TURN_OFF_DELAY_MASK 0xff0
+#define DISPCLK_CGTT_BLK_CTRL_REG__DISPCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define SCLK_CGTT_BLK_CTRL_REG__SCLK_TURN_ON_DELAY_MASK 0xf
+#define SCLK_CGTT_BLK_CTRL_REG__SCLK_TURN_ON_DELAY__SHIFT 0x0
+#define SCLK_CGTT_BLK_CTRL_REG__SCLK_TURN_OFF_DELAY_MASK 0xff0
+#define SCLK_CGTT_BLK_CTRL_REG__SCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define SCLK_CGTT_BLK_CTRL_REG__CGTT_SCLK_OVERRIDE_MASK 0x1000
+#define SCLK_CGTT_BLK_CTRL_REG__CGTT_SCLK_OVERRIDE__SHIFT 0xc
+#define DPREFCLK_CGTT_BLK_CTRL_REG__DPREFCLK_TURN_ON_DELAY_MASK 0xf
+#define DPREFCLK_CGTT_BLK_CTRL_REG__DPREFCLK_TURN_ON_DELAY__SHIFT 0x0
+#define DPREFCLK_CGTT_BLK_CTRL_REG__DPREFCLK_TURN_OFF_DELAY_MASK 0xff0
+#define DPREFCLK_CGTT_BLK_CTRL_REG__DPREFCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define REFCLK_CGTT_BLK_CTRL_REG__REFCLK_TURN_ON_DELAY_MASK 0xf
+#define REFCLK_CGTT_BLK_CTRL_REG__REFCLK_TURN_ON_DELAY__SHIFT 0x0
+#define REFCLK_CGTT_BLK_CTRL_REG__REFCLK_TURN_OFF_DELAY_MASK 0xff0
+#define REFCLK_CGTT_BLK_CTRL_REG__REFCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define SYMCLK_CGTT_BLK_CTRL_REG__SYMCLK_TURN_ON_DELAY_MASK 0xf
+#define SYMCLK_CGTT_BLK_CTRL_REG__SYMCLK_TURN_ON_DELAY__SHIFT 0x0
+#define SYMCLK_CGTT_BLK_CTRL_REG__SYMCLK_TURN_OFF_DELAY_MASK 0xff0
+#define SYMCLK_CGTT_BLK_CTRL_REG__SYMCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define DCCG_CAC_STATUS__CAC_STATUS_RDDATA_MASK 0xffffffff
+#define DCCG_CAC_STATUS__CAC_STATUS_RDDATA__SHIFT 0x0
+#define PIXCLK0_RESYNC_CNTL__PIXCLK0_RESYNC_ENABLE_MASK 0x1
+#define PIXCLK0_RESYNC_CNTL__PIXCLK0_RESYNC_ENABLE__SHIFT 0x0
+#define PIXCLK0_RESYNC_CNTL__DCCG_DEEP_COLOR_CNTL0_MASK 0x30
+#define PIXCLK0_RESYNC_CNTL__DCCG_DEEP_COLOR_CNTL0__SHIFT 0x4
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLA_PIXCLK_RESYNC_CNTL__PHYPLLA_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLB_PIXCLK_RESYNC_CNTL__PHYPLLB_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLC_PIXCLK_RESYNC_CNTL__PHYPLLC_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLD_PIXCLK_RESYNC_CNTL__PHYPLLD_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLE_PIXCLK_RESYNC_CNTL__PHYPLLE_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE_MASK 0x1
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_RESYNC_ENABLE__SHIFT 0x0
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL_MASK 0x30
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_DCCG_DEEP_COLOR_CNTL__SHIFT 0x4
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE_MASK 0x100
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_ENABLE__SHIFT 0x8
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE_MASK 0x200
+#define PHYPLLF_PIXCLK_RESYNC_CNTL__PHYPLLF_PIXCLK_DOUBLE_RATE_ENABLE__SHIFT 0x9
+#define MICROSECOND_TIME_BASE_DIV__MICROSECOND_TIME_BASE_DIV_MASK 0x7f
+#define MICROSECOND_TIME_BASE_DIV__MICROSECOND_TIME_BASE_DIV__SHIFT 0x0
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_DIV_MASK 0x7f00
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_DIV__SHIFT 0x8
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_SEL_MASK 0x10000
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_SEL__SHIFT 0x10
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_CLOCK_SOURCE_SEL_MASK 0x20000
+#define MICROSECOND_TIME_BASE_DIV__XTAL_REF_CLOCK_SOURCE_SEL__SHIFT 0x11
+#define MICROSECOND_TIME_BASE_DIV__MICROSECOND_TIME_BASE_CLOCK_SOURCE_SEL_MASK 0x100000
+#define MICROSECOND_TIME_BASE_DIV__MICROSECOND_TIME_BASE_CLOCK_SOURCE_SEL__SHIFT 0x14
+#define DCCG_DISP_CNTL_REG__ALLOW_SR_ON_TRANS_REQ_MASK 0x100
+#define DCCG_DISP_CNTL_REG__ALLOW_SR_ON_TRANS_REQ__SHIFT 0x8
+#define MILLISECOND_TIME_BASE_DIV__MILLISECOND_TIME_BASE_DIV_MASK 0x1ffff
+#define MILLISECOND_TIME_BASE_DIV__MILLISECOND_TIME_BASE_DIV__SHIFT 0x0
+#define MILLISECOND_TIME_BASE_DIV__MILLISECOND_TIME_BASE_CLOCK_SOURCE_SEL_MASK 0x100000
+#define MILLISECOND_TIME_BASE_DIV__MILLISECOND_TIME_BASE_CLOCK_SOURCE_SEL__SHIFT 0x14
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_STEP_DELAY_MASK 0x3fff
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_STEP_DELAY__SHIFT 0x0
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_STEP_SIZE_MASK 0xf0000
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_STEP_SIZE__SHIFT 0x10
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_FREQ_RAMP_DONE_MASK 0x100000
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_FREQ_RAMP_DONE__SHIFT 0x14
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_MAX_ERRDET_CYCLES_MASK 0xe000000
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_MAX_ERRDET_CYCLES__SHIFT 0x19
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_RESET_MASK 0x10000000
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_RESET__SHIFT 0x1c
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_STATE_MASK 0x20000000
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_STATE__SHIFT 0x1d
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_OVR_EN_MASK 0x40000000
+#define DISPCLK_FREQ_CHANGE_CNTL__DCCG_FIFO_ERRDET_OVR_EN__SHIFT 0x1e
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_CHG_FWD_CORR_DISABLE_MASK 0x80000000
+#define DISPCLK_FREQ_CHANGE_CNTL__DISPCLK_CHG_FWD_CORR_DISABLE__SHIFT 0x1f
+#define DC_MEM_GLOBAL_PWR_REQ_CNTL__DC_MEM_GLOBAL_PWR_REQ_DIS_MASK 0x1
+#define DC_MEM_GLOBAL_PWR_REQ_CNTL__DC_MEM_GLOBAL_PWR_REQ_DIS__SHIFT 0x0
+#define DCCG_PERFMON_CNTL__DCCG_PERF_DISPCLK_ENABLE_MASK 0x1
+#define DCCG_PERFMON_CNTL__DCCG_PERF_DISPCLK_ENABLE__SHIFT 0x0
+#define DCCG_PERFMON_CNTL__DCCG_PERF_DPREFCLK_ENABLE_MASK 0x2
+#define DCCG_PERFMON_CNTL__DCCG_PERF_DPREFCLK_ENABLE__SHIFT 0x1
+#define DCCG_PERFMON_CNTL__DCCG_PERF_UNIPHYA_PIXCLK_ENABLE_MASK 0x4
+#define DCCG_PERFMON_CNTL__DCCG_PERF_UNIPHYA_PIXCLK_ENABLE__SHIFT 0x2
+#define DCCG_PERFMON_CNTL__DCCG_PERF_UNIPHYB_PIXCLK_ENABLE_MASK 0x8
+#define DCCG_PERFMON_CNTL__DCCG_PERF_UNIPHYB_PIXCLK_ENABLE__SHIFT 0x3
+#define DCCG_PERFMON_CNTL__DCCG_PERF_PIXCLK0_ENABLE_MASK 0x10
+#define DCCG_PERFMON_CNTL__DCCG_PERF_PIXCLK0_ENABLE__SHIFT 0x4
+#define DCCG_PERFMON_CNTL__DCCG_PERF_RUN_MASK 0x20
+#define DCCG_PERFMON_CNTL__DCCG_PERF_RUN__SHIFT 0x5
+#define DCCG_PERFMON_CNTL__DCCG_PERF_MODE_VSYNC_MASK 0x40
+#define DCCG_PERFMON_CNTL__DCCG_PERF_MODE_VSYNC__SHIFT 0x6
+#define DCCG_PERFMON_CNTL__DCCG_PERF_MODE_HSYNC_MASK 0x80
+#define DCCG_PERFMON_CNTL__DCCG_PERF_MODE_HSYNC__SHIFT 0x7
+#define DCCG_PERFMON_CNTL__DCCG_PERF_CRTC_SEL_MASK 0x700
+#define DCCG_PERFMON_CNTL__DCCG_PERF_CRTC_SEL__SHIFT 0x8
+#define DCCG_PERFMON_CNTL__DCCG_PERF_XTALIN_PULSE_DIV_MASK 0xfffff800
+#define DCCG_PERFMON_CNTL__DCCG_PERF_XTALIN_PULSE_DIV__SHIFT 0xb
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_DSICLK_ENABLE_MASK 0x1
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_DSICLK_ENABLE__SHIFT 0x0
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_REFCLK_ENABLE_MASK 0x2
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_REFCLK_ENABLE__SHIFT 0x1
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_PIXCLK1_ENABLE_MASK 0x4
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_PIXCLK1_ENABLE__SHIFT 0x2
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_PIXCLK2_ENABLE_MASK 0x8
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_PIXCLK2_ENABLE__SHIFT 0x3
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYC_PIXCLK_ENABLE_MASK 0x10
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYC_PIXCLK_ENABLE__SHIFT 0x4
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYD_PIXCLK_ENABLE_MASK 0x20
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYD_PIXCLK_ENABLE__SHIFT 0x5
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYE_PIXCLK_ENABLE_MASK 0x40
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYE_PIXCLK_ENABLE__SHIFT 0x6
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYF_PIXCLK_ENABLE_MASK 0x80
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYF_PIXCLK_ENABLE__SHIFT 0x7
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYG_PIXCLK_ENABLE_MASK 0x100
+#define DCCG_PERFMON_CNTL2__DCCG_PERF_UNIPHYG_PIXCLK_ENABLE__SHIFT 0x8
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC0_PIXEL_RATE_CNTL__DP_DTO0_ENABLE_MASK 0x10
+#define CRTC0_PIXEL_RATE_CNTL__DP_DTO0_ENABLE__SHIFT 0x4
+#define CRTC0_PIXEL_RATE_CNTL__DP_DTO0_DS_DISABLE_MASK 0x20
+#define CRTC0_PIXEL_RATE_CNTL__DP_DTO0_DS_DISABLE__SHIFT 0x5
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_ADD_PIXEL_MASK 0x100
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_ADD_PIXEL__SHIFT 0x8
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DROP_PIXEL_MASK 0x200
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DROP_PIXEL__SHIFT 0x9
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC0_PIXEL_RATE_CNTL__CRTC0_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO0_PHASE__DP_DTO0_PHASE_MASK 0xffffffff
+#define DP_DTO0_PHASE__DP_DTO0_PHASE__SHIFT 0x0
+#define DP_DTO0_MODULO__DP_DTO0_MODULO_MASK 0xffffffff
+#define DP_DTO0_MODULO__DP_DTO0_MODULO__SHIFT 0x0
+#define CRTC0_PHYPLL_PIXEL_RATE_CNTL__CRTC0_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC0_PHYPLL_PIXEL_RATE_CNTL__CRTC0_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC0_PHYPLL_PIXEL_RATE_CNTL__CRTC0_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC0_PHYPLL_PIXEL_RATE_CNTL__CRTC0_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC1_PIXEL_RATE_CNTL__DP_DTO1_ENABLE_MASK 0x10
+#define CRTC1_PIXEL_RATE_CNTL__DP_DTO1_ENABLE__SHIFT 0x4
+#define CRTC1_PIXEL_RATE_CNTL__DP_DTO1_DS_DISABLE_MASK 0x20
+#define CRTC1_PIXEL_RATE_CNTL__DP_DTO1_DS_DISABLE__SHIFT 0x5
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_ADD_PIXEL_MASK 0x100
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_ADD_PIXEL__SHIFT 0x8
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DROP_PIXEL_MASK 0x200
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DROP_PIXEL__SHIFT 0x9
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC1_PIXEL_RATE_CNTL__CRTC1_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO1_PHASE__DP_DTO1_PHASE_MASK 0xffffffff
+#define DP_DTO1_PHASE__DP_DTO1_PHASE__SHIFT 0x0
+#define DP_DTO1_MODULO__DP_DTO1_MODULO_MASK 0xffffffff
+#define DP_DTO1_MODULO__DP_DTO1_MODULO__SHIFT 0x0
+#define CRTC1_PHYPLL_PIXEL_RATE_CNTL__CRTC1_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC1_PHYPLL_PIXEL_RATE_CNTL__CRTC1_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC1_PHYPLL_PIXEL_RATE_CNTL__CRTC1_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC1_PHYPLL_PIXEL_RATE_CNTL__CRTC1_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC2_PIXEL_RATE_CNTL__DP_DTO2_ENABLE_MASK 0x10
+#define CRTC2_PIXEL_RATE_CNTL__DP_DTO2_ENABLE__SHIFT 0x4
+#define CRTC2_PIXEL_RATE_CNTL__DP_DTO2_DS_DISABLE_MASK 0x20
+#define CRTC2_PIXEL_RATE_CNTL__DP_DTO2_DS_DISABLE__SHIFT 0x5
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_ADD_PIXEL_MASK 0x100
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_ADD_PIXEL__SHIFT 0x8
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DROP_PIXEL_MASK 0x200
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DROP_PIXEL__SHIFT 0x9
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC2_PIXEL_RATE_CNTL__CRTC2_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO2_PHASE__DP_DTO2_PHASE_MASK 0xffffffff
+#define DP_DTO2_PHASE__DP_DTO2_PHASE__SHIFT 0x0
+#define DP_DTO2_MODULO__DP_DTO2_MODULO_MASK 0xffffffff
+#define DP_DTO2_MODULO__DP_DTO2_MODULO__SHIFT 0x0
+#define CRTC2_PHYPLL_PIXEL_RATE_CNTL__CRTC2_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC2_PHYPLL_PIXEL_RATE_CNTL__CRTC2_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC2_PHYPLL_PIXEL_RATE_CNTL__CRTC2_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC2_PHYPLL_PIXEL_RATE_CNTL__CRTC2_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC3_PIXEL_RATE_CNTL__DP_DTO3_ENABLE_MASK 0x10
+#define CRTC3_PIXEL_RATE_CNTL__DP_DTO3_ENABLE__SHIFT 0x4
+#define CRTC3_PIXEL_RATE_CNTL__DP_DTO3_DS_DISABLE_MASK 0x20
+#define CRTC3_PIXEL_RATE_CNTL__DP_DTO3_DS_DISABLE__SHIFT 0x5
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_ADD_PIXEL_MASK 0x100
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_ADD_PIXEL__SHIFT 0x8
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DROP_PIXEL_MASK 0x200
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DROP_PIXEL__SHIFT 0x9
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC3_PIXEL_RATE_CNTL__CRTC3_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO3_PHASE__DP_DTO3_PHASE_MASK 0xffffffff
+#define DP_DTO3_PHASE__DP_DTO3_PHASE__SHIFT 0x0
+#define DP_DTO3_MODULO__DP_DTO3_MODULO_MASK 0xffffffff
+#define DP_DTO3_MODULO__DP_DTO3_MODULO__SHIFT 0x0
+#define CRTC3_PHYPLL_PIXEL_RATE_CNTL__CRTC3_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC3_PHYPLL_PIXEL_RATE_CNTL__CRTC3_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC3_PHYPLL_PIXEL_RATE_CNTL__CRTC3_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC3_PHYPLL_PIXEL_RATE_CNTL__CRTC3_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC4_PIXEL_RATE_CNTL__DP_DTO4_ENABLE_MASK 0x10
+#define CRTC4_PIXEL_RATE_CNTL__DP_DTO4_ENABLE__SHIFT 0x4
+#define CRTC4_PIXEL_RATE_CNTL__DP_DTO4_DS_DISABLE_MASK 0x20
+#define CRTC4_PIXEL_RATE_CNTL__DP_DTO4_DS_DISABLE__SHIFT 0x5
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_ADD_PIXEL_MASK 0x100
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_ADD_PIXEL__SHIFT 0x8
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DROP_PIXEL_MASK 0x200
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DROP_PIXEL__SHIFT 0x9
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC4_PIXEL_RATE_CNTL__CRTC4_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO4_PHASE__DP_DTO4_PHASE_MASK 0xffffffff
+#define DP_DTO4_PHASE__DP_DTO4_PHASE__SHIFT 0x0
+#define DP_DTO4_MODULO__DP_DTO4_MODULO_MASK 0xffffffff
+#define DP_DTO4_MODULO__DP_DTO4_MODULO__SHIFT 0x0
+#define CRTC4_PHYPLL_PIXEL_RATE_CNTL__CRTC4_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC4_PHYPLL_PIXEL_RATE_CNTL__CRTC4_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC4_PHYPLL_PIXEL_RATE_CNTL__CRTC4_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC4_PHYPLL_PIXEL_RATE_CNTL__CRTC4_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_PIXEL_RATE_SOURCE_MASK 0x3
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC5_PIXEL_RATE_CNTL__DP_DTO5_ENABLE_MASK 0x10
+#define CRTC5_PIXEL_RATE_CNTL__DP_DTO5_ENABLE__SHIFT 0x4
+#define CRTC5_PIXEL_RATE_CNTL__DP_DTO5_DS_DISABLE_MASK 0x20
+#define CRTC5_PIXEL_RATE_CNTL__DP_DTO5_DS_DISABLE__SHIFT 0x5
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_ADD_PIXEL_MASK 0x100
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_ADD_PIXEL__SHIFT 0x8
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DROP_PIXEL_MASK 0x200
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DROP_PIXEL__SHIFT 0x9
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_HALF_RATE_EN_MASK 0x800
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_HALF_RATE_EN__SHIFT 0xb
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_FIFO_ERROR_MASK 0xc000
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_FIFO_ERROR__SHIFT 0xe
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_ERROR_COUNT_MASK 0xfff0000
+#define CRTC5_PIXEL_RATE_CNTL__CRTC5_DISPOUT_ERROR_COUNT__SHIFT 0x10
+#define DP_DTO5_PHASE__DP_DTO5_PHASE_MASK 0xffffffff
+#define DP_DTO5_PHASE__DP_DTO5_PHASE__SHIFT 0x0
+#define DP_DTO5_MODULO__DP_DTO5_MODULO_MASK 0xffffffff
+#define DP_DTO5_MODULO__DP_DTO5_MODULO__SHIFT 0x0
+#define CRTC5_PHYPLL_PIXEL_RATE_CNTL__CRTC5_PHYPLL_PIXEL_RATE_SOURCE_MASK 0x7
+#define CRTC5_PHYPLL_PIXEL_RATE_CNTL__CRTC5_PHYPLL_PIXEL_RATE_SOURCE__SHIFT 0x0
+#define CRTC5_PHYPLL_PIXEL_RATE_CNTL__CRTC5_PIXEL_RATE_PLL_SOURCE_MASK 0x10
+#define CRTC5_PHYPLL_PIXEL_RATE_CNTL__CRTC5_PIXEL_RATE_PLL_SOURCE__SHIFT 0x4
+#define DCCG_SOFT_RESET__REFCLK_SOFT_RESET_MASK 0x1
+#define DCCG_SOFT_RESET__REFCLK_SOFT_RESET__SHIFT 0x0
+#define DCCG_SOFT_RESET__PCIE_REFCLK_SOFT_RESET_MASK 0x2
+#define DCCG_SOFT_RESET__PCIE_REFCLK_SOFT_RESET__SHIFT 0x1
+#define DCCG_SOFT_RESET__SOFT_RESET_DVO_MASK 0x4
+#define DCCG_SOFT_RESET__SOFT_RESET_DVO__SHIFT 0x2
+#define DCCG_SOFT_RESET__DVO_ENABLE_RST_MASK 0x8
+#define DCCG_SOFT_RESET__DVO_ENABLE_RST__SHIFT 0x3
+#define DCCG_SOFT_RESET__AUDIO_DTO2_CLK_SOFT_RESET_MASK 0x10
+#define DCCG_SOFT_RESET__AUDIO_DTO2_CLK_SOFT_RESET__SHIFT 0x4
+#define DCCG_SOFT_RESET__DPREFCLK_SOFT_RESET_MASK 0x100
+#define DCCG_SOFT_RESET__DPREFCLK_SOFT_RESET__SHIFT 0x8
+#define DCCG_SOFT_RESET__AMCLK0_SOFT_RESET_MASK 0x1000
+#define DCCG_SOFT_RESET__AMCLK0_SOFT_RESET__SHIFT 0xc
+#define DCCG_SOFT_RESET__AMCLK1_SOFT_RESET_MASK 0x2000
+#define DCCG_SOFT_RESET__AMCLK1_SOFT_RESET__SHIFT 0xd
+#define DCCG_SOFT_RESET__P0PLL_CFG_IF_SOFT_RESET_MASK 0x4000
+#define DCCG_SOFT_RESET__P0PLL_CFG_IF_SOFT_RESET__SHIFT 0xe
+#define DCCG_SOFT_RESET__P1PLL_CFG_IF_SOFT_RESET_MASK 0x8000
+#define DCCG_SOFT_RESET__P1PLL_CFG_IF_SOFT_RESET__SHIFT 0xf
+#define DCCG_SOFT_RESET__P2PLL_CFG_IF_SOFT_RESET_MASK 0x10000
+#define DCCG_SOFT_RESET__P2PLL_CFG_IF_SOFT_RESET__SHIFT 0x10
+#define DCCG_SOFT_RESET__A0PLL_CFG_IF_SOFT_RESET_MASK 0x20000
+#define DCCG_SOFT_RESET__A0PLL_CFG_IF_SOFT_RESET__SHIFT 0x11
+#define DCCG_SOFT_RESET__A1PLL_CFG_IF_SOFT_RESET_MASK 0x40000
+#define DCCG_SOFT_RESET__A1PLL_CFG_IF_SOFT_RESET__SHIFT 0x12
+#define DCCG_SOFT_RESET__C0PLL_CFG_IF_SOFT_RESET_MASK 0x80000
+#define DCCG_SOFT_RESET__C0PLL_CFG_IF_SOFT_RESET__SHIFT 0x13
+#define DCCG_SOFT_RESET__C1PLL_CFG_IF_SOFT_RESET_MASK 0x100000
+#define DCCG_SOFT_RESET__C1PLL_CFG_IF_SOFT_RESET__SHIFT 0x14
+#define DCCG_SOFT_RESET__C2PLL_CFG_IF_SOFT_RESET_MASK 0x200000
+#define DCCG_SOFT_RESET__C2PLL_CFG_IF_SOFT_RESET__SHIFT 0x15
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_FE_FORCE_EN_MASK 0x10
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKA_CLOCK_ENABLE__SYMCLKA_FE_FORCE_SRC__SHIFT 0x8
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_FE_FORCE_EN_MASK 0x10
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKB_CLOCK_ENABLE__SYMCLKB_FE_FORCE_SRC__SHIFT 0x8
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_FE_FORCE_EN_MASK 0x10
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKC_CLOCK_ENABLE__SYMCLKC_FE_FORCE_SRC__SHIFT 0x8
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_FE_FORCE_EN_MASK 0x10
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKD_CLOCK_ENABLE__SYMCLKD_FE_FORCE_SRC__SHIFT 0x8
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_FE_FORCE_EN_MASK 0x10
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKE_CLOCK_ENABLE__SYMCLKE_FE_FORCE_SRC__SHIFT 0x8
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_CLOCK_ENABLE_MASK 0x1
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_CLOCK_ENABLE__SHIFT 0x0
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_FE_FORCE_EN_MASK 0x10
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_FE_FORCE_EN__SHIFT 0x4
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_FE_FORCE_SRC_MASK 0x700
+#define SYMCLKF_CLOCK_ENABLE__SYMCLKF_FE_FORCE_SRC__SHIFT 0x8
+#define DPDBG_CLK_FORCE_CONTROL__DPDBG_CLK_FORCE_EN_MASK 0x10
+#define DPDBG_CLK_FORCE_CONTROL__DPDBG_CLK_FORCE_EN__SHIFT 0x4
+#define DPDBG_CLK_FORCE_CONTROL__DPDBG_CLK_FORCE_SRC_MASK 0x700
+#define DPDBG_CLK_FORCE_CONTROL__DPDBG_CLK_FORCE_SRC__SHIFT 0x8
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO0_SOURCE_SEL_MASK 0x7
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO0_SOURCE_SEL__SHIFT 0x0
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO_SEL_MASK 0x30
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO_SEL__SHIFT 0x4
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_SOURCE_SEL_MASK 0x3000
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_SOURCE_SEL__SHIFT 0xc
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_CLOCK_EN_MASK 0x10000
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_CLOCK_EN__SHIFT 0x10
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_USE_512FBR_DTO_MASK 0x100000
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO2_USE_512FBR_DTO__SHIFT 0x14
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO0_USE_512FBR_DTO_MASK 0x1000000
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO0_USE_512FBR_DTO__SHIFT 0x18
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO1_USE_512FBR_DTO_MASK 0x10000000
+#define DCCG_AUDIO_DTO_SOURCE__DCCG_AUDIO_DTO1_USE_512FBR_DTO__SHIFT 0x1c
+#define DCCG_AUDIO_DTO0_PHASE__DCCG_AUDIO_DTO0_PHASE_MASK 0xffffffff
+#define DCCG_AUDIO_DTO0_PHASE__DCCG_AUDIO_DTO0_PHASE__SHIFT 0x0
+#define DCCG_AUDIO_DTO0_MODULE__DCCG_AUDIO_DTO0_MODULE_MASK 0xffffffff
+#define DCCG_AUDIO_DTO0_MODULE__DCCG_AUDIO_DTO0_MODULE__SHIFT 0x0
+#define DCCG_AUDIO_DTO1_PHASE__DCCG_AUDIO_DTO1_PHASE_MASK 0xffffffff
+#define DCCG_AUDIO_DTO1_PHASE__DCCG_AUDIO_DTO1_PHASE__SHIFT 0x0
+#define DCCG_AUDIO_DTO1_MODULE__DCCG_AUDIO_DTO1_MODULE_MASK 0xffffffff
+#define DCCG_AUDIO_DTO1_MODULE__DCCG_AUDIO_DTO1_MODULE__SHIFT 0x0
+#define DCCG_TEST_DEBUG_INDEX__DCCG_TEST_DEBUG_INDEX_MASK 0xff
+#define DCCG_TEST_DEBUG_INDEX__DCCG_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCCG_TEST_DEBUG_INDEX__DCCG_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCCG_TEST_DEBUG_INDEX__DCCG_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCCG_TEST_DEBUG_DATA__DCCG_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCCG_TEST_DEBUG_DATA__DCCG_TEST_DEBUG_DATA__SHIFT 0x0
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICA_SEL_MASK 0x1ff
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICA_SEL__SHIFT 0x0
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICA_INV_MASK 0x1000
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICA_INV__SHIFT 0xc
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICB_SEL_MASK 0x1ff0000
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICB_SEL__SHIFT 0x10
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICB_INV_MASK 0x10000000
+#define DCCG_TEST_CLK_SEL__DCCG_TEST_CLK_GENERICB_INV__SHIFT 0x1c
+#define CPLL_MACRO_CNTL_RESERVED0__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED0__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED1__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED1__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED2__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED2__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED3__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED3__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED4__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED4__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED5__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED5__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED6__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED6__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED7__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED7__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED8__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED8__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED9__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED9__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED10__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED10__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define CPLL_MACRO_CNTL_RESERVED11__CPLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define CPLL_MACRO_CNTL_RESERVED11__CPLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED0__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED0__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED1__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED1__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED2__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED2__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED3__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED3__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED4__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED4__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED5__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED5__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED6__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED6__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED7__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED7__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED8__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED8__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED9__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED9__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED10__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED10__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED11__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED11__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED12__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED12__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED13__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED13__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED14__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED14__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED15__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED15__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED16__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED16__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED17__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED17__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED18__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED18__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED19__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED19__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED20__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED20__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED21__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED21__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED22__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED22__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED23__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED23__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED24__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED24__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED25__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED25__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED26__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED26__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED27__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED27__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED28__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED28__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED29__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED29__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED30__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED30__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED31__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED31__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED32__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED32__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED33__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED33__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED34__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED34__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED35__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED35__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED36__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED36__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED37__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED37__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED38__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED38__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED39__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED39__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED40__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED40__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define PLL_MACRO_CNTL_RESERVED41__PLL_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define PLL_MACRO_CNTL_RESERVED41__PLL_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_WDIVIDER_MASK 0x7f
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_WDIVIDER__SHIFT 0x0
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_RDIVIDER_MASK 0x7f00
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_RDIVIDER__SHIFT 0x8
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHG_MODE_MASK 0x18000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHG_MODE__SHIFT 0xf
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHGTOG_MASK 0x20000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHGTOG__SHIFT 0x11
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_DONETOG_MASK 0x40000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_DONETOG__SHIFT 0x12
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHG_DONE_MASK 0x80000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DISPCLK_CHG_DONE__SHIFT 0x13
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_CHG_DONE_MASK 0x100000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_CHG_DONE__SHIFT 0x14
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_CHGTOG_MASK 0x200000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_CHGTOG__SHIFT 0x15
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_DONETOG_MASK 0x400000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_DONETOG__SHIFT 0x16
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_WDIVIDER_MASK 0x7f000000
+#define DENTIST_DISPCLK_CNTL__DENTIST_DPREFCLK_WDIVIDER__SHIFT 0x18
+#define DCDEBUG_BUS_CLK1_SEL__DCDEBUG_BUS_CLK1_SEL_MASK 0xffffffff
+#define DCDEBUG_BUS_CLK1_SEL__DCDEBUG_BUS_CLK1_SEL__SHIFT 0x0
+#define DCDEBUG_BUS_CLK2_SEL__DCDEBUG_BUS_CLK2_SEL_MASK 0xffffffff
+#define DCDEBUG_BUS_CLK2_SEL__DCDEBUG_BUS_CLK2_SEL__SHIFT 0x0
+#define DCDEBUG_BUS_CLK3_SEL__DCDEBUG_BUS_CLK3_SEL_MASK 0xffffffff
+#define DCDEBUG_BUS_CLK3_SEL__DCDEBUG_BUS_CLK3_SEL__SHIFT 0x0
+#define DCDEBUG_BUS_CLK4_SEL__DCDEBUG_BUS_CLK4_SEL_MASK 0xffffffff
+#define DCDEBUG_BUS_CLK4_SEL__DCDEBUG_BUS_CLK4_SEL__SHIFT 0x0
+#define DCDEBUG_BUS_CLK5_SEL__DCDEBUG_BUS_CLK5_SEL_MASK 0xffffffff
+#define DCDEBUG_BUS_CLK5_SEL__DCDEBUG_BUS_CLK5_SEL__SHIFT 0x0
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_PIN_SEL_MASK 0x1f
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_PIN_SEL__SHIFT 0x0
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_REGBIT_SEL_MASK 0x3e0
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_REGBIT_SEL__SHIFT 0x5
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_EN_MASK 0x1000
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE1_EN__SHIFT 0xc
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_PIN_SEL_MASK 0xf8000
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_PIN_SEL__SHIFT 0xf
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_REGBIT_SEL_MASK 0x1f00000
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_REGBIT_SEL__SHIFT 0x14
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_EN_MASK 0x10000000
+#define DCDEBUG_OUT_PIN_OVERRIDE__DCDEBUG_OUT_OVERRIDE2_EN__SHIFT 0x1c
+#define DCDEBUG_OUT_CNTL__DCDEBUG_BLOCK_SEL_MASK 0x1f
+#define DCDEBUG_OUT_CNTL__DCDEBUG_BLOCK_SEL__SHIFT 0x0
+#define DCDEBUG_OUT_CNTL__DCDEBUG_OUT_24BIT_SEL_MASK 0x800000
+#define DCDEBUG_OUT_CNTL__DCDEBUG_OUT_24BIT_SEL__SHIFT 0x17
+#define DCDEBUG_OUT_CNTL__DCDEBUG_CLK_SEL_MASK 0x1f000000
+#define DCDEBUG_OUT_CNTL__DCDEBUG_CLK_SEL__SHIFT 0x18
+#define DCDEBUG_OUT_DATA__DCDEBUG_OUT_DATA_MASK 0xffffffff
+#define DCDEBUG_OUT_DATA__DCDEBUG_OUT_DATA__SHIFT 0x0
+#define DMIF_CONTROL__DMIF_BUFF_SIZE_MASK 0x3
+#define DMIF_CONTROL__DMIF_BUFF_SIZE__SHIFT 0x0
+#define DMIF_CONTROL__DMIF_GROUP_REQUESTS_IN_CHUNK_MASK 0x4
+#define DMIF_CONTROL__DMIF_GROUP_REQUESTS_IN_CHUNK__SHIFT 0x2
+#define DMIF_CONTROL__DMIF_DISABLE_EARLY_RECEIVED_LEVEL_COUNT_MASK 0x10
+#define DMIF_CONTROL__DMIF_DISABLE_EARLY_RECEIVED_LEVEL_COUNT__SHIFT 0x4
+#define DMIF_CONTROL__DMIF_REQ_BURST_SIZE_MASK 0x700
+#define DMIF_CONTROL__DMIF_REQ_BURST_SIZE__SHIFT 0x8
+#define DMIF_CONTROL__DMIF_UNDERFLOW_RECOVERY_EN_MASK 0x800
+#define DMIF_CONTROL__DMIF_UNDERFLOW_RECOVERY_EN__SHIFT 0xb
+#define DMIF_CONTROL__DMIF_FORCE_TOTAL_REQ_BURST_SIZE_MASK 0x1f000
+#define DMIF_CONTROL__DMIF_FORCE_TOTAL_REQ_BURST_SIZE__SHIFT 0xc
+#define DMIF_CONTROL__DMIF_MAX_TOTAL_OUTSTANDING_CHUNK_REQUESTS_MASK 0x7e0000
+#define DMIF_CONTROL__DMIF_MAX_TOTAL_OUTSTANDING_CHUNK_REQUESTS__SHIFT 0x11
+#define DMIF_CONTROL__DMIF_DELAY_ARBITRATION_MASK 0x1f000000
+#define DMIF_CONTROL__DMIF_DELAY_ARBITRATION__SHIFT 0x18
+#define DMIF_CONTROL__DMIF_CHUNK_BUFF_MARGIN_MASK 0x60000000
+#define DMIF_CONTROL__DMIF_CHUNK_BUFF_MARGIN__SHIFT 0x1d
+#define DMIF_CONTROL__DMIF_PSTATE_URGENT_DISABLE_MASK 0x80000000
+#define DMIF_CONTROL__DMIF_PSTATE_URGENT_DISABLE__SHIFT 0x1f
+#define DMIF_STATUS__DMIF_MC_SEND_ON_IDLE_MASK 0x3f
+#define DMIF_STATUS__DMIF_MC_SEND_ON_IDLE__SHIFT 0x0
+#define DMIF_STATUS__DMIF_CLEAR_MC_SEND_ON_IDLE_MASK 0x3f00
+#define DMIF_STATUS__DMIF_CLEAR_MC_SEND_ON_IDLE__SHIFT 0x8
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_ENABLE_MASK 0x10000
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_ENABLE__SHIFT 0x10
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_URGENT_ONLY_MASK 0x20000
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_URGENT_ONLY__SHIFT 0x11
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_SOURCE_SELECT_MASK 0xf00000
+#define DMIF_STATUS__DMIF_MC_LATENCY_COUNTER_SOURCE_SELECT__SHIFT 0x14
+#define DMIF_STATUS__DMIF_PERFORMANCE_COUNTER_SOURCE_SELECT_MASK 0xf000000
+#define DMIF_STATUS__DMIF_PERFORMANCE_COUNTER_SOURCE_SELECT__SHIFT 0x18
+#define DMIF_STATUS__DMIF_UNDERFLOW_MASK 0x10000000
+#define DMIF_STATUS__DMIF_UNDERFLOW__SHIFT 0x1c
+#define DMIF_STATUS__DMIF_MC_LATENCY_TAP_POINT_MASK 0x60000000
+#define DMIF_STATUS__DMIF_MC_LATENCY_TAP_POINT__SHIFT 0x1d
+#define DMIF_STATUS__DMIF_MC_LATENCY_REQ_TYPE_MASK 0x80000000
+#define DMIF_STATUS__DMIF_MC_LATENCY_REQ_TYPE__SHIFT 0x1f
+#define DMIFV_STATUS__DMIFV_MC_SEND_ON_IDLE_MASK 0xf
+#define DMIFV_STATUS__DMIFV_MC_SEND_ON_IDLE__SHIFT 0x0
+#define DMIFV_STATUS__DMIFV_CLEAR_MC_SEND_ON_IDLE_MASK 0xf00
+#define DMIFV_STATUS__DMIFV_CLEAR_MC_SEND_ON_IDLE__SHIFT 0x8
+#define DMIF_HW_DEBUG__DMIF_HW_DEBUG_MASK 0xffffffff
+#define DMIF_HW_DEBUG__DMIF_HW_DEBUG__SHIFT 0x0
+#define DMIF_ARBITRATION_CONTROL__DMIF_ARBITRATION_REFERENCE_CLOCK_PERIOD_MASK 0xffff
+#define DMIF_ARBITRATION_CONTROL__DMIF_ARBITRATION_REFERENCE_CLOCK_PERIOD__SHIFT 0x0
+#define DMIF_ARBITRATION_CONTROL__PIPE_SWITCH_EFFICIENCY_WEIGHT_MASK 0xffff0000
+#define DMIF_ARBITRATION_CONTROL__PIPE_SWITCH_EFFICIENCY_WEIGHT__SHIFT 0x10
+#define PIPE0_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE0_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE1_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE1_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE2_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE2_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE3_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE3_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE4_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE4_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE5_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE5_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE6_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE6_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define PIPE7_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT_MASK 0xffff
+#define PIPE7_ARBITRATION_CONTROL3__EFFICIENCY_WEIGHT__SHIFT 0x0
+#define DMIF_P_VMID__P_VMID_PIPE0_MASK 0xf
+#define DMIF_P_VMID__P_VMID_PIPE0__SHIFT 0x0
+#define DMIF_P_VMID__P_VMID_PIPE1_MASK 0xf0
+#define DMIF_P_VMID__P_VMID_PIPE1__SHIFT 0x4
+#define DMIF_P_VMID__P_VMID_PIPE2_MASK 0xf00
+#define DMIF_P_VMID__P_VMID_PIPE2__SHIFT 0x8
+#define DMIF_P_VMID__P_VMID_PIPE3_MASK 0xf000
+#define DMIF_P_VMID__P_VMID_PIPE3__SHIFT 0xc
+#define DMIF_P_VMID__P_VMID_PIPE4_MASK 0xf0000
+#define DMIF_P_VMID__P_VMID_PIPE4__SHIFT 0x10
+#define DMIF_P_VMID__P_VMID_PIPE5_MASK 0xf00000
+#define DMIF_P_VMID__P_VMID_PIPE5__SHIFT 0x14
+#define DMIF_P_VMID__P_VMID_PIPE6_MASK 0xf000000
+#define DMIF_P_VMID__P_VMID_PIPE6__SHIFT 0x18
+#define DMIF_P_VMID__P_VMID_PIPE7_MASK 0xf0000000
+#define DMIF_P_VMID__P_VMID_PIPE7__SHIFT 0x1c
+#define DMIF_URG_OVERRIDE__DMIF_URG_OVERRIDE_EN_MASK 0x1
+#define DMIF_URG_OVERRIDE__DMIF_URG_OVERRIDE_EN__SHIFT 0x0
+#define DMIF_URG_OVERRIDE__DMIF_URG_OVERRIDE_LEVEL_MASK 0xf0
+#define DMIF_URG_OVERRIDE__DMIF_URG_OVERRIDE_LEVEL__SHIFT 0x4
+#define DMIF_TEST_DEBUG_INDEX__DMIF_TEST_DEBUG_INDEX_MASK 0xff
+#define DMIF_TEST_DEBUG_INDEX__DMIF_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DMIF_TEST_DEBUG_INDEX__DMIF_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DMIF_TEST_DEBUG_INDEX__DMIF_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DMIF_TEST_DEBUG_DATA__DMIF_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DMIF_TEST_DEBUG_DATA__DMIF_TEST_DEBUG_DATA__SHIFT 0x0
+#define DMIF_DEBUG02_CORE0__DB_DATA_MASK 0xffff
+#define DMIF_DEBUG02_CORE0__DB_DATA__SHIFT 0x0
+#define DMIF_DEBUG02_CORE0__MC_RDRET_COUNT_EN_MASK 0x10000
+#define DMIF_DEBUG02_CORE0__MC_RDRET_COUNT_EN__SHIFT 0x10
+#define DMIF_DEBUG02_CORE0__MC_RDRET_COUNTER_MASK 0xffe0000
+#define DMIF_DEBUG02_CORE0__MC_RDRET_COUNTER__SHIFT 0x11
+#define DMIF_DEBUG02_CORE1__DB_DATA_MASK 0xffff
+#define DMIF_DEBUG02_CORE1__DB_DATA__SHIFT 0x0
+#define DMIF_DEBUG02_CORE1__MC_RDRET_COUNT_EN_MASK 0x10000
+#define DMIF_DEBUG02_CORE1__MC_RDRET_COUNT_EN__SHIFT 0x10
+#define DMIF_DEBUG02_CORE1__MC_RDRET_COUNTER_MASK 0xffe0000
+#define DMIF_DEBUG02_CORE1__MC_RDRET_COUNTER__SHIFT 0x11
+#define DMIF_ADDR_CALC__ADDR_CONFIG_PIPE_INTERLEAVE_SIZE_MASK 0x70
+#define DMIF_ADDR_CALC__ADDR_CONFIG_PIPE_INTERLEAVE_SIZE__SHIFT 0x4
+#define DMIF_ADDR_CALC__ADDR_CONFIG_ROW_SIZE_MASK 0x30000000
+#define DMIF_ADDR_CALC__ADDR_CONFIG_ROW_SIZE__SHIFT 0x1c
+#define DMIF_STATUS2__DMIF_PIPE0_DISPCLK_STATUS_MASK 0x1
+#define DMIF_STATUS2__DMIF_PIPE0_DISPCLK_STATUS__SHIFT 0x0
+#define DMIF_STATUS2__DMIF_PIPE1_DISPCLK_STATUS_MASK 0x2
+#define DMIF_STATUS2__DMIF_PIPE1_DISPCLK_STATUS__SHIFT 0x1
+#define DMIF_STATUS2__DMIF_PIPE2_DISPCLK_STATUS_MASK 0x4
+#define DMIF_STATUS2__DMIF_PIPE2_DISPCLK_STATUS__SHIFT 0x2
+#define DMIF_STATUS2__DMIF_PIPE3_DISPCLK_STATUS_MASK 0x8
+#define DMIF_STATUS2__DMIF_PIPE3_DISPCLK_STATUS__SHIFT 0x3
+#define DMIF_STATUS2__DMIF_PIPE4_DISPCLK_STATUS_MASK 0x10
+#define DMIF_STATUS2__DMIF_PIPE4_DISPCLK_STATUS__SHIFT 0x4
+#define DMIF_STATUS2__DMIF_PIPE5_DISPCLK_STATUS_MASK 0x20
+#define DMIF_STATUS2__DMIF_PIPE5_DISPCLK_STATUS__SHIFT 0x5
+#define DMIF_STATUS2__DMIF_CHUNK_TRACKER_SCLK_STATUS_MASK 0x100
+#define DMIF_STATUS2__DMIF_CHUNK_TRACKER_SCLK_STATUS__SHIFT 0x8
+#define DMIF_STATUS2__DMIF_FBC_TRACKER_SCLK_STATUS_MASK 0x200
+#define DMIF_STATUS2__DMIF_FBC_TRACKER_SCLK_STATUS__SHIFT 0x9
+#define PIPE0_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE0_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE1_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE1_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE2_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE2_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE3_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE3_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE4_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE4_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE5_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE5_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE6_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE6_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define PIPE7_MAX_REQUESTS__MAX_REQUESTS_MASK 0x3ff
+#define PIPE7_MAX_REQUESTS__MAX_REQUESTS__SHIFT 0x0
+#define DVMM_REG_RD_STATUS__DVMM_REG_RD_STATUS_MASK 0x1
+#define DVMM_REG_RD_STATUS__DVMM_REG_RD_STATUS__SHIFT 0x0
+#define DVMM_REG_RD_DATA__DVMM_REG_RD_DATA_MASK 0xffffffff
+#define DVMM_REG_RD_DATA__DVMM_REG_RD_DATA__SHIFT 0x0
+#define DVMM_PTE_REQ__MAX_PTEREQ_TO_ISSUE_MASK 0xff
+#define DVMM_PTE_REQ__MAX_PTEREQ_TO_ISSUE__SHIFT 0x0
+#define DVMM_PTE_REQ__HFLIP_PTEREQ_PER_CHUNK_INT_MASK 0xff00
+#define DVMM_PTE_REQ__HFLIP_PTEREQ_PER_CHUNK_INT__SHIFT 0x8
+#define DVMM_PTE_REQ__HFLIP_PTEREQ_PER_CHUNK_MULTIPLIER_MASK 0x3f0000
+#define DVMM_PTE_REQ__HFLIP_PTEREQ_PER_CHUNK_MULTIPLIER__SHIFT 0x10
+#define DVMM_CNTL__PDE_CACHE_INVALIDATE_CNTL_MASK 0x3
+#define DVMM_CNTL__PDE_CACHE_INVALIDATE_CNTL__SHIFT 0x0
+#define DVMM_CNTL__DEBUG_SYSTEM_ACCESS_MODE_MASK 0x30
+#define DVMM_CNTL__DEBUG_SYSTEM_ACCESS_MODE__SHIFT 0x4
+#define DVMM_CNTL__FORCE_SYSTEM_ACCESS_MODE_MASK 0x80
+#define DVMM_CNTL__FORCE_SYSTEM_ACCESS_MODE__SHIFT 0x7
+#define DVMM_CNTL__DBG_DCE_VMID_MASK 0xf00
+#define DVMM_CNTL__DBG_DCE_VMID__SHIFT 0x8
+#define DVMM_CNTL__FORCE_DBG_DCE_VMID_MASK 0x8000
+#define DVMM_CNTL__FORCE_DBG_DCE_VMID__SHIFT 0xf
+#define DVMM_CNTL__OVERRIDE_SNOOP_MASK 0x20000
+#define DVMM_CNTL__OVERRIDE_SNOOP__SHIFT 0x11
+#define DVMM_CNTL__ENABLE_PDE_INVALIDATE_MASK 0x40000
+#define DVMM_CNTL__ENABLE_PDE_INVALIDATE__SHIFT 0x12
+#define DVMM_FAULT_STATUS__DVMM_FAULT_STATUS_MASK 0xffffffff
+#define DVMM_FAULT_STATUS__DVMM_FAULT_STATUS__SHIFT 0x0
+#define DVMM_FAULT_ADDR__DVMM_FAULT_ADDR_MASK 0xffffffff
+#define DVMM_FAULT_ADDR__DVMM_FAULT_ADDR__SHIFT 0x0
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ENABLE_MASK 0x1
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ENABLE__SHIFT 0x0
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_MODE_MASK 0x18
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_MODE__SHIFT 0x3
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_NUM_PIPES_MASK 0xe0
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_NUM_PIPES__SHIFT 0x5
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_NUM_BANKS_MASK 0x700
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_NUM_BANKS__SHIFT 0x8
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_PIPE_INTERLEAVE_SIZE_MASK 0x800
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_PIPE_INTERLEAVE_SIZE__SHIFT 0xb
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ROW_SIZE_MASK 0x7000
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ROW_SIZE__SHIFT 0xc
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ROWS_PER_CHAN_MASK 0xfff0000
+#define LOW_POWER_TILING_CONTROL__LOW_POWER_TILING_ROWS_PER_CHAN__SHIFT 0x10
+#define MCIF_CONTROL__MCIF_BUFF_SIZE_MASK 0x3
+#define MCIF_CONTROL__MCIF_BUFF_SIZE__SHIFT 0x0
+#define MCIF_CONTROL__ADDRESS_TRANSLATION_ENABLE_MASK 0x10
+#define MCIF_CONTROL__ADDRESS_TRANSLATION_ENABLE__SHIFT 0x4
+#define MCIF_CONTROL__PRIVILEGED_ACCESS_ENABLE_MASK 0x100
+#define MCIF_CONTROL__PRIVILEGED_ACCESS_ENABLE__SHIFT 0x8
+#define MCIF_CONTROL__MCIF_SLOW_REQ_INTERVAL_MASK 0xf000
+#define MCIF_CONTROL__MCIF_SLOW_REQ_INTERVAL__SHIFT 0xc
+#define MCIF_CONTROL__LOW_READ_URG_LEVEL_MASK 0xff0000
+#define MCIF_CONTROL__LOW_READ_URG_LEVEL__SHIFT 0x10
+#define MCIF_CONTROL__MC_CLEAN_DEASSERT_LATENCY_MASK 0x3f000000
+#define MCIF_CONTROL__MC_CLEAN_DEASSERT_LATENCY__SHIFT 0x18
+#define MCIF_CONTROL__MCIF_MC_LATENCY_COUNTER_ENABLE_MASK 0x40000000
+#define MCIF_CONTROL__MCIF_MC_LATENCY_COUNTER_ENABLE__SHIFT 0x1e
+#define MCIF_CONTROL__MCIF_MC_LATENCY_COUNTER_URGENT_ONLY_MASK 0x80000000
+#define MCIF_CONTROL__MCIF_MC_LATENCY_COUNTER_URGENT_ONLY__SHIFT 0x1f
+#define MCIF_WRITE_COMBINE_CONTROL__MCIF_WRITE_COMBINE_TIMEOUT_MASK 0xff
+#define MCIF_WRITE_COMBINE_CONTROL__MCIF_WRITE_COMBINE_TIMEOUT__SHIFT 0x0
+#define MCIF_WRITE_COMBINE_CONTROL__VIP_WRITE_COMBINE_TIMEOUT_MASK 0xff00
+#define MCIF_WRITE_COMBINE_CONTROL__VIP_WRITE_COMBINE_TIMEOUT__SHIFT 0x8
+#define MCIF_TEST_DEBUG_INDEX__MCIF_TEST_DEBUG_INDEX_MASK 0xff
+#define MCIF_TEST_DEBUG_INDEX__MCIF_TEST_DEBUG_INDEX__SHIFT 0x0
+#define MCIF_TEST_DEBUG_INDEX__MCIF_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define MCIF_TEST_DEBUG_INDEX__MCIF_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define MCIF_TEST_DEBUG_DATA__MCIF_TEST_DEBUG_DATA_MASK 0xffffffff
+#define MCIF_TEST_DEBUG_DATA__MCIF_TEST_DEBUG_DATA__SHIFT 0x0
+#define IDDCCIF02_DBG_DCCIF_C__DBG_DCCIF_C_MASK 0xffffffff
+#define IDDCCIF02_DBG_DCCIF_C__DBG_DCCIF_C__SHIFT 0x0
+#define IDDCCIF04_DBG_DCCIF_E__DBG_DCCIF_E_MASK 0xffffffff
+#define IDDCCIF04_DBG_DCCIF_E__DBG_DCCIF_E__SHIFT 0x0
+#define IDDCCIF05_DBG_DCCIF_F__DBG_DCCIF_F_MASK 0xffffffff
+#define IDDCCIF05_DBG_DCCIF_F__DBG_DCCIF_F__SHIFT 0x0
+#define MCIF_VMID__MCIF_WR_VMID_MASK 0xf
+#define MCIF_VMID__MCIF_WR_VMID__SHIFT 0x0
+#define MCIF_VMID__VIP_WR_VMID_MASK 0xf0
+#define MCIF_VMID__VIP_WR_VMID__SHIFT 0x4
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_MODE_DIS_MASK 0x1
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_MODE_DIS__SHIFT 0x0
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_MODE_MASK 0x30
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_MODE__SHIFT 0x4
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_SIZE_MASK 0xff00
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_SIZE__SHIFT 0x8
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_PIPE_MASK 0x70000
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_PIPE__SHIFT 0x10
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_TYPE_MASK 0x180000
+#define MCIF_MEM_CONTROL__MCIFMEM_CACHE_TYPE__SHIFT 0x13
+#define CC_DC_PIPE_DIS__DC_PIPE_DIS_MASK 0x7e
+#define CC_DC_PIPE_DIS__DC_PIPE_DIS__SHIFT 0x1
+#define CC_DC_PIPE_DIS__DC_UNDERLAY_PIPE_DIS_MASK 0x3f0000
+#define CC_DC_PIPE_DIS__DC_UNDERLAY_PIPE_DIS__SHIFT 0x10
+#define MC_DC_INTERFACE_NACK_STATUS__DMIF_RDRET_NACK_OCCURRED_MASK 0x1
+#define MC_DC_INTERFACE_NACK_STATUS__DMIF_RDRET_NACK_OCCURRED__SHIFT 0x0
+#define MC_DC_INTERFACE_NACK_STATUS__DMIF_RDRET_NACK_CLEAR_MASK 0x10
+#define MC_DC_INTERFACE_NACK_STATUS__DMIF_RDRET_NACK_CLEAR__SHIFT 0x4
+#define MC_DC_INTERFACE_NACK_STATUS__VIP_WRRET_NACK_OCCURRED_MASK 0x100
+#define MC_DC_INTERFACE_NACK_STATUS__VIP_WRRET_NACK_OCCURRED__SHIFT 0x8
+#define MC_DC_INTERFACE_NACK_STATUS__VIP_WRRET_NACK_CLEAR_MASK 0x1000
+#define MC_DC_INTERFACE_NACK_STATUS__VIP_WRRET_NACK_CLEAR__SHIFT 0xc
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_RDRET_NACK_OCCURRED_MASK 0x10000
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_RDRET_NACK_OCCURRED__SHIFT 0x10
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_RDRET_NACK_CLEAR_MASK 0x100000
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_RDRET_NACK_CLEAR__SHIFT 0x14
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_WRRET_NACK_OCCURRED_MASK 0x1000000
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_WRRET_NACK_OCCURRED__SHIFT 0x18
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_WRRET_NACK_CLEAR_MASK 0x10000000
+#define MC_DC_INTERFACE_NACK_STATUS__MCIF_WRRET_NACK_CLEAR__SHIFT 0x1c
+#define RBBMIF_TIMEOUT__RBBMIF_TIMEOUT_DELAY_MASK 0xfffff
+#define RBBMIF_TIMEOUT__RBBMIF_TIMEOUT_DELAY__SHIFT 0x0
+#define RBBMIF_TIMEOUT__RBBMIF_TIMEOUT_TO_REQ_HOLD_MASK 0xfff00000
+#define RBBMIF_TIMEOUT__RBBMIF_TIMEOUT_TO_REQ_HOLD__SHIFT 0x14
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_CLIENTS_DEC_MASK 0xffff
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_CLIENTS_DEC__SHIFT 0x0
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_OP_MASK 0x10000000
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_OP__SHIFT 0x1c
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_RDWR_STATUS_MASK 0x20000000
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_RDWR_STATUS__SHIFT 0x1d
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_ACK_MASK 0x40000000
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_ACK__SHIFT 0x1e
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_MASK_MASK 0x80000000
+#define RBBMIF_STATUS__RBBMIF_TIMEOUT_MASK__SHIFT 0x1f
+#define RBBMIF_TIMEOUT_DIS__CLIENT0_TIMEOUT_DIS_MASK 0x1
+#define RBBMIF_TIMEOUT_DIS__CLIENT0_TIMEOUT_DIS__SHIFT 0x0
+#define RBBMIF_TIMEOUT_DIS__CLIENT1_TIMEOUT_DIS_MASK 0x2
+#define RBBMIF_TIMEOUT_DIS__CLIENT1_TIMEOUT_DIS__SHIFT 0x1
+#define RBBMIF_TIMEOUT_DIS__CLIENT2_TIMEOUT_DIS_MASK 0x4
+#define RBBMIF_TIMEOUT_DIS__CLIENT2_TIMEOUT_DIS__SHIFT 0x2
+#define RBBMIF_TIMEOUT_DIS__CLIENT3_TIMEOUT_DIS_MASK 0x8
+#define RBBMIF_TIMEOUT_DIS__CLIENT3_TIMEOUT_DIS__SHIFT 0x3
+#define RBBMIF_TIMEOUT_DIS__CLIENT4_TIMEOUT_DIS_MASK 0x10
+#define RBBMIF_TIMEOUT_DIS__CLIENT4_TIMEOUT_DIS__SHIFT 0x4
+#define RBBMIF_TIMEOUT_DIS__CLIENT5_TIMEOUT_DIS_MASK 0x20
+#define RBBMIF_TIMEOUT_DIS__CLIENT5_TIMEOUT_DIS__SHIFT 0x5
+#define RBBMIF_TIMEOUT_DIS__CLIENT6_TIMEOUT_DIS_MASK 0x40
+#define RBBMIF_TIMEOUT_DIS__CLIENT6_TIMEOUT_DIS__SHIFT 0x6
+#define RBBMIF_TIMEOUT_DIS__CLIENT7_TIMEOUT_DIS_MASK 0x80
+#define RBBMIF_TIMEOUT_DIS__CLIENT7_TIMEOUT_DIS__SHIFT 0x7
+#define RBBMIF_TIMEOUT_DIS__CLIENT8_TIMEOUT_DIS_MASK 0x100
+#define RBBMIF_TIMEOUT_DIS__CLIENT8_TIMEOUT_DIS__SHIFT 0x8
+#define RBBMIF_TIMEOUT_DIS__CLIENT9_TIMEOUT_DIS_MASK 0x200
+#define RBBMIF_TIMEOUT_DIS__CLIENT9_TIMEOUT_DIS__SHIFT 0x9
+#define RBBMIF_TIMEOUT_DIS__CLIENT10_TIMEOUT_DIS_MASK 0x400
+#define RBBMIF_TIMEOUT_DIS__CLIENT10_TIMEOUT_DIS__SHIFT 0xa
+#define RBBMIF_TIMEOUT_DIS__CLIENT11_TIMEOUT_DIS_MASK 0x800
+#define RBBMIF_TIMEOUT_DIS__CLIENT11_TIMEOUT_DIS__SHIFT 0xb
+#define RBBMIF_TIMEOUT_DIS__CLIENT12_TIMEOUT_DIS_MASK 0x1000
+#define RBBMIF_TIMEOUT_DIS__CLIENT12_TIMEOUT_DIS__SHIFT 0xc
+#define RBBMIF_TIMEOUT_DIS__CLIENT13_TIMEOUT_DIS_MASK 0x2000
+#define RBBMIF_TIMEOUT_DIS__CLIENT13_TIMEOUT_DIS__SHIFT 0xd
+#define RBBMIF_TIMEOUT_DIS__CLIENT14_TIMEOUT_DIS_MASK 0x4000
+#define RBBMIF_TIMEOUT_DIS__CLIENT14_TIMEOUT_DIS__SHIFT 0xe
+#define RBBMIF_TIMEOUT_DIS__CLIENT15_TIMEOUT_DIS_MASK 0x8000
+#define RBBMIF_TIMEOUT_DIS__CLIENT15_TIMEOUT_DIS__SHIFT 0xf
+#define RBBMIF_STATUS_FLAG__RBBMIF_STATE_MASK 0x3
+#define RBBMIF_STATUS_FLAG__RBBMIF_STATE__SHIFT 0x0
+#define RBBMIF_STATUS_FLAG__RBBMIF_READ_TIMEOUT_MASK 0x10
+#define RBBMIF_STATUS_FLAG__RBBMIF_READ_TIMEOUT__SHIFT 0x4
+#define RBBMIF_STATUS_FLAG__RBBMIF_FIFO_EMPTY_MASK 0x20
+#define RBBMIF_STATUS_FLAG__RBBMIF_FIFO_EMPTY__SHIFT 0x5
+#define RBBMIF_STATUS_FLAG__RBBMIF_FIFO_FULL_MASK 0x40
+#define RBBMIF_STATUS_FLAG__RBBMIF_FIFO_FULL__SHIFT 0x6
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM1_PWR_STATE_MASK 0x3
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM1_PWR_STATE__SHIFT 0x0
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM2_PWR_STATE_MASK 0xc
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM2_PWR_STATE__SHIFT 0x2
+#define DCI_MEM_PWR_STATUS__MCIF_RDREQ_MEM_PWR_STATE_MASK 0x10
+#define DCI_MEM_PWR_STATUS__MCIF_RDREQ_MEM_PWR_STATE__SHIFT 0x4
+#define DCI_MEM_PWR_STATUS__MCIF_WRREQ_MEM_PWR_STATE_MASK 0x40
+#define DCI_MEM_PWR_STATUS__MCIF_WRREQ_MEM_PWR_STATE__SHIFT 0x6
+#define DCI_MEM_PWR_STATUS__VGA_MEM_PWR_STATE_MASK 0x100
+#define DCI_MEM_PWR_STATUS__VGA_MEM_PWR_STATE__SHIFT 0x8
+#define DCI_MEM_PWR_STATUS__DMCU_ERAM_MEM_PWR_STATE_MASK 0x600
+#define DCI_MEM_PWR_STATUS__DMCU_ERAM_MEM_PWR_STATE__SHIFT 0x9
+#define DCI_MEM_PWR_STATUS__DMCU_IRAM_MEM_PWR_STATE_MASK 0x800
+#define DCI_MEM_PWR_STATUS__DMCU_IRAM_MEM_PWR_STATE__SHIFT 0xb
+#define DCI_MEM_PWR_STATUS__FBC_MEM_PWR_STATE_MASK 0x3000
+#define DCI_MEM_PWR_STATUS__FBC_MEM_PWR_STATE__SHIFT 0xc
+#define DCI_MEM_PWR_STATUS__MCIF_MEM_PWR_STATE_MASK 0xc000
+#define DCI_MEM_PWR_STATUS__MCIF_MEM_PWR_STATE__SHIFT 0xe
+#define DCI_MEM_PWR_STATUS__VIP_MEM_PWR_STATE_MASK 0x400000
+#define DCI_MEM_PWR_STATUS__VIP_MEM_PWR_STATE__SHIFT 0x16
+#define DCI_MEM_PWR_STATUS__DMIF0_ASYNC_MEM_PWR_STATE_MASK 0x3000000
+#define DCI_MEM_PWR_STATUS__DMIF0_ASYNC_MEM_PWR_STATE__SHIFT 0x18
+#define DCI_MEM_PWR_STATUS__DMIF0_DATA_MEM_PWR_STATE_MASK 0xc000000
+#define DCI_MEM_PWR_STATUS__DMIF0_DATA_MEM_PWR_STATE__SHIFT 0x1a
+#define DCI_MEM_PWR_STATUS__DMIF0_CHUNK_MEM_PWR_STATE_MASK 0x10000000
+#define DCI_MEM_PWR_STATUS__DMIF0_CHUNK_MEM_PWR_STATE__SHIFT 0x1c
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM3_PWR_STATE_MASK 0xc0000000
+#define DCI_MEM_PWR_STATUS__DMIF_RDREQ_MEM3_PWR_STATE__SHIFT 0x1e
+#define DCI_MEM_PWR_STATUS2__DMIF1_ASYNC_MEM_PWR_STATE_MASK 0x3
+#define DCI_MEM_PWR_STATUS2__DMIF1_ASYNC_MEM_PWR_STATE__SHIFT 0x0
+#define DCI_MEM_PWR_STATUS2__DMIF1_DATA_MEM_PWR_STATE_MASK 0xc
+#define DCI_MEM_PWR_STATUS2__DMIF1_DATA_MEM_PWR_STATE__SHIFT 0x2
+#define DCI_MEM_PWR_STATUS2__DMIF1_CHUNK_MEM_PWR_STATE_MASK 0x10
+#define DCI_MEM_PWR_STATUS2__DMIF1_CHUNK_MEM_PWR_STATE__SHIFT 0x4
+#define DCI_MEM_PWR_STATUS2__DMIF2_ASYNC_MEM_PWR_STATE_MASK 0x60
+#define DCI_MEM_PWR_STATUS2__DMIF2_ASYNC_MEM_PWR_STATE__SHIFT 0x5
+#define DCI_MEM_PWR_STATUS2__DMIF2_DATA_MEM_PWR_STATE_MASK 0x180
+#define DCI_MEM_PWR_STATUS2__DMIF2_DATA_MEM_PWR_STATE__SHIFT 0x7
+#define DCI_MEM_PWR_STATUS2__DMIF2_CHUNK_MEM_PWR_STATE_MASK 0x200
+#define DCI_MEM_PWR_STATUS2__DMIF2_CHUNK_MEM_PWR_STATE__SHIFT 0x9
+#define DCI_MEM_PWR_STATUS2__DMIF3_ASYNC_MEM_PWR_STATE_MASK 0xc00
+#define DCI_MEM_PWR_STATUS2__DMIF3_ASYNC_MEM_PWR_STATE__SHIFT 0xa
+#define DCI_MEM_PWR_STATUS2__DMIF3_DATA_MEM_PWR_STATE_MASK 0x3000
+#define DCI_MEM_PWR_STATUS2__DMIF3_DATA_MEM_PWR_STATE__SHIFT 0xc
+#define DCI_MEM_PWR_STATUS2__DMIF3_CHUNK_MEM_PWR_STATE_MASK 0x4000
+#define DCI_MEM_PWR_STATUS2__DMIF3_CHUNK_MEM_PWR_STATE__SHIFT 0xe
+#define DCI_MEM_PWR_STATUS2__DMIF4_ASYNC_MEM_PWR_STATE_MASK 0x18000
+#define DCI_MEM_PWR_STATUS2__DMIF4_ASYNC_MEM_PWR_STATE__SHIFT 0xf
+#define DCI_MEM_PWR_STATUS2__DMIF4_DATA_MEM_PWR_STATE_MASK 0x60000
+#define DCI_MEM_PWR_STATUS2__DMIF4_DATA_MEM_PWR_STATE__SHIFT 0x11
+#define DCI_MEM_PWR_STATUS2__DMIF4_CHUNK_MEM_PWR_STATE_MASK 0x80000
+#define DCI_MEM_PWR_STATUS2__DMIF4_CHUNK_MEM_PWR_STATE__SHIFT 0x13
+#define DCI_MEM_PWR_STATUS2__DMIF5_ASYNC_MEM_PWR_STATE_MASK 0x300000
+#define DCI_MEM_PWR_STATUS2__DMIF5_ASYNC_MEM_PWR_STATE__SHIFT 0x14
+#define DCI_MEM_PWR_STATUS2__DMIF5_DATA_MEM_PWR_STATE_MASK 0xc00000
+#define DCI_MEM_PWR_STATUS2__DMIF5_DATA_MEM_PWR_STATE__SHIFT 0x16
+#define DCI_MEM_PWR_STATUS2__DMIF5_CHUNK_MEM_PWR_STATE_MASK 0x1000000
+#define DCI_MEM_PWR_STATUS2__DMIF5_CHUNK_MEM_PWR_STATE__SHIFT 0x18
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_LUMA_MEM0_PWR_STATE_MASK 0x3
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_LUMA_MEM0_PWR_STATE__SHIFT 0x0
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_LUMA_MEM1_PWR_STATE_MASK 0xc
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_LUMA_MEM1_PWR_STATE__SHIFT 0x2
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_CHROMA_MEM0_PWR_STATE_MASK 0x30
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_CHROMA_MEM0_PWR_STATE__SHIFT 0x4
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_CHROMA_MEM1_PWR_STATE_MASK 0xc0
+#define DCI_MEM_PWR_STATUS3__MCIF_DWB_CHROMA_MEM1_PWR_STATE__SHIFT 0x6
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_LUMA_MEM0_PWR_STATE_MASK 0x300
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_LUMA_MEM0_PWR_STATE__SHIFT 0x8
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_LUMA_MEM1_PWR_STATE_MASK 0xc00
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_LUMA_MEM1_PWR_STATE__SHIFT 0xa
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_CHROMA_MEM0_PWR_STATE_MASK 0x3000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_CHROMA_MEM0_PWR_STATE__SHIFT 0xc
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_CHROMA_MEM1_PWR_STATE_MASK 0xc000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB0_CHROMA_MEM1_PWR_STATE__SHIFT 0xe
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_LUMA_MEM0_PWR_STATE_MASK 0x30000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_LUMA_MEM0_PWR_STATE__SHIFT 0x10
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_LUMA_MEM1_PWR_STATE_MASK 0xc0000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_LUMA_MEM1_PWR_STATE__SHIFT 0x12
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_CHROMA_MEM0_PWR_STATE_MASK 0x300000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_CHROMA_MEM0_PWR_STATE__SHIFT 0x14
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_CHROMA_MEM1_PWR_STATE_MASK 0xc00000
+#define DCI_MEM_PWR_STATUS3__MCIF_CWB1_CHROMA_MEM1_PWR_STATE__SHIFT 0x16
+#define DCI_CLK_CNTL__DCI_TEST_CLK_SEL_MASK 0x1f
+#define DCI_CLK_CNTL__DCI_TEST_CLK_SEL__SHIFT 0x0
+#define DCI_CLK_CNTL__DISPCLK_R_DCI_GATE_DIS_MASK 0x20
+#define DCI_CLK_CNTL__DISPCLK_R_DCI_GATE_DIS__SHIFT 0x5
+#define DCI_CLK_CNTL__DISPCLK_M_GATE_DIS_MASK 0x40
+#define DCI_CLK_CNTL__DISPCLK_M_GATE_DIS__SHIFT 0x6
+#define DCI_CLK_CNTL__SCLK_G_STREAM_AZ_GATE_DIS_MASK 0x80
+#define DCI_CLK_CNTL__SCLK_G_STREAM_AZ_GATE_DIS__SHIFT 0x7
+#define DCI_CLK_CNTL__SCLK_R_AZ_GATE_DIS_MASK 0x100
+#define DCI_CLK_CNTL__SCLK_R_AZ_GATE_DIS__SHIFT 0x8
+#define DCI_CLK_CNTL__DISPCLK_G_FBC_GATE_DIS_MASK 0x200
+#define DCI_CLK_CNTL__DISPCLK_G_FBC_GATE_DIS__SHIFT 0x9
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV1_L_GATE_DIS_MASK 0x400
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV1_L_GATE_DIS__SHIFT 0xa
+#define DCI_CLK_CNTL__DISPCLK_G_VGA_GATE_DIS_MASK 0x800
+#define DCI_CLK_CNTL__DISPCLK_G_VGA_GATE_DIS__SHIFT 0xb
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV1_C_GATE_DIS_MASK 0x1000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV1_C_GATE_DIS__SHIFT 0xc
+#define DCI_CLK_CNTL__DISPCLK_G_VIP_GATE_DIS_MASK 0x2000
+#define DCI_CLK_CNTL__DISPCLK_G_VIP_GATE_DIS__SHIFT 0xd
+#define DCI_CLK_CNTL__VPCLK_POL_MASK 0x4000
+#define DCI_CLK_CNTL__VPCLK_POL__SHIFT 0xe
+#define DCI_CLK_CNTL__DISPCLK_G_DMCU_GATE_DIS_MASK 0x8000
+#define DCI_CLK_CNTL__DISPCLK_G_DMCU_GATE_DIS__SHIFT 0xf
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF0_GATE_DIS_MASK 0x10000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF0_GATE_DIS__SHIFT 0x10
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF1_GATE_DIS_MASK 0x20000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF1_GATE_DIS__SHIFT 0x11
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF2_GATE_DIS_MASK 0x40000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF2_GATE_DIS__SHIFT 0x12
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF3_GATE_DIS_MASK 0x80000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF3_GATE_DIS__SHIFT 0x13
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF4_GATE_DIS_MASK 0x100000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF4_GATE_DIS__SHIFT 0x14
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF5_GATE_DIS_MASK 0x200000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIF5_GATE_DIS__SHIFT 0x15
+#define DCI_CLK_CNTL__SCLK_G_DMIF_GATE_DIS_MASK 0x400000
+#define DCI_CLK_CNTL__SCLK_G_DMIF_GATE_DIS__SHIFT 0x16
+#define DCI_CLK_CNTL__SCLK_G_DMIFTRK_GATE_DIS_MASK 0x800000
+#define DCI_CLK_CNTL__SCLK_G_DMIFTRK_GATE_DIS__SHIFT 0x17
+#define DCI_CLK_CNTL__SCLK_G_CNTL_AZ_GATE_DIS_MASK 0x1000000
+#define DCI_CLK_CNTL__SCLK_G_CNTL_AZ_GATE_DIS__SHIFT 0x18
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV0_L_GATE_DIS_MASK 0x2000000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV0_L_GATE_DIS__SHIFT 0x19
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV0_C_GATE_DIS_MASK 0x4000000
+#define DCI_CLK_CNTL__DISPCLK_G_DMIFV0_C_GATE_DIS__SHIFT 0x1a
+#define DCI_CLK_CNTL__DCI_PG_TEST_CLK_SEL_MASK 0xf8000000
+#define DCI_CLK_CNTL__DCI_PG_TEST_CLK_SEL__SHIFT 0x1b
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_DWB_GATE_DIS_MASK 0x1
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_DWB_GATE_DIS__SHIFT 0x0
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_DWB_GATE_DIS_MASK 0x2
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_DWB_GATE_DIS__SHIFT 0x1
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_CWB0_GATE_DIS_MASK 0x4
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_CWB0_GATE_DIS__SHIFT 0x2
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_CWB0_GATE_DIS_MASK 0x8
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_CWB0_GATE_DIS__SHIFT 0x3
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_CWB1_GATE_DIS_MASK 0x10
+#define DCI_CLK_RAMP_CNTL__DISPCLK_G_MCIF_CWB1_GATE_DIS__SHIFT 0x4
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_CWB1_GATE_DIS_MASK 0x80000000
+#define DCI_CLK_RAMP_CNTL__SCLK_G_MCIF_CWB1_GATE_DIS__SHIFT 0x1f
+#define DCI_MEM_PWR_CNTL__DMIF_RDREQ_MEM_PWR_FORCE_MASK 0x3
+#define DCI_MEM_PWR_CNTL__DMIF_RDREQ_MEM_PWR_FORCE__SHIFT 0x0
+#define DCI_MEM_PWR_CNTL__DMIF_RDREQ_MEM_PWR_DIS_MASK 0x4
+#define DCI_MEM_PWR_CNTL__DMIF_RDREQ_MEM_PWR_DIS__SHIFT 0x2
+#define DCI_MEM_PWR_CNTL__MCIF_RDREQ_MEM_PWR_FORCE_MASK 0x8
+#define DCI_MEM_PWR_CNTL__MCIF_RDREQ_MEM_PWR_FORCE__SHIFT 0x3
+#define DCI_MEM_PWR_CNTL__MCIF_RDREQ_MEM_PWR_DIS_MASK 0x10
+#define DCI_MEM_PWR_CNTL__MCIF_RDREQ_MEM_PWR_DIS__SHIFT 0x4
+#define DCI_MEM_PWR_CNTL__MCIF_WRREQ_MEM_PWR_FORCE_MASK 0x20
+#define DCI_MEM_PWR_CNTL__MCIF_WRREQ_MEM_PWR_FORCE__SHIFT 0x5
+#define DCI_MEM_PWR_CNTL__MCIF_WRREQ_MEM_PWR_DIS_MASK 0x40
+#define DCI_MEM_PWR_CNTL__MCIF_WRREQ_MEM_PWR_DIS__SHIFT 0x6
+#define DCI_MEM_PWR_CNTL__VGA_MEM_PWR_FORCE_MASK 0x80
+#define DCI_MEM_PWR_CNTL__VGA_MEM_PWR_FORCE__SHIFT 0x7
+#define DCI_MEM_PWR_CNTL__VGA_MEM_PWR_DIS_MASK 0x100
+#define DCI_MEM_PWR_CNTL__VGA_MEM_PWR_DIS__SHIFT 0x8
+#define DCI_MEM_PWR_CNTL__DMCU_ERAM_MEM_PWR_FORCE_MASK 0x600
+#define DCI_MEM_PWR_CNTL__DMCU_ERAM_MEM_PWR_FORCE__SHIFT 0x9
+#define DCI_MEM_PWR_CNTL__DMCU_ERAM_MEM_PWR_DIS_MASK 0x800
+#define DCI_MEM_PWR_CNTL__DMCU_ERAM_MEM_PWR_DIS__SHIFT 0xb
+#define DCI_MEM_PWR_CNTL__DMCU_IRAM_MEM_PWR_FORCE_MASK 0x1000
+#define DCI_MEM_PWR_CNTL__DMCU_IRAM_MEM_PWR_FORCE__SHIFT 0xc
+#define DCI_MEM_PWR_CNTL__DMCU_IRAM_MEM_PWR_DIS_MASK 0x2000
+#define DCI_MEM_PWR_CNTL__DMCU_IRAM_MEM_PWR_DIS__SHIFT 0xd
+#define DCI_MEM_PWR_CNTL__FBC_MEM_PWR_FORCE_MASK 0xc000
+#define DCI_MEM_PWR_CNTL__FBC_MEM_PWR_FORCE__SHIFT 0xe
+#define DCI_MEM_PWR_CNTL__FBC_MEM_PWR_DIS_MASK 0x10000
+#define DCI_MEM_PWR_CNTL__FBC_MEM_PWR_DIS__SHIFT 0x10
+#define DCI_MEM_PWR_CNTL__MCIF_MEM_PWR_FORCE_MASK 0x60000
+#define DCI_MEM_PWR_CNTL__MCIF_MEM_PWR_FORCE__SHIFT 0x11
+#define DCI_MEM_PWR_CNTL__MCIF_MEM_PWR_DIS_MASK 0x80000
+#define DCI_MEM_PWR_CNTL__MCIF_MEM_PWR_DIS__SHIFT 0x13
+#define DCI_MEM_PWR_CNTL__MCIF_DWB_MEM_PWR_FORCE_MASK 0x300000
+#define DCI_MEM_PWR_CNTL__MCIF_DWB_MEM_PWR_FORCE__SHIFT 0x14
+#define DCI_MEM_PWR_CNTL__MCIF_DWB_MEM_PWR_DIS_MASK 0x400000
+#define DCI_MEM_PWR_CNTL__MCIF_DWB_MEM_PWR_DIS__SHIFT 0x16
+#define DCI_MEM_PWR_CNTL__MCIF_CWB0_MEM_PWR_FORCE_MASK 0x1800000
+#define DCI_MEM_PWR_CNTL__MCIF_CWB0_MEM_PWR_FORCE__SHIFT 0x17
+#define DCI_MEM_PWR_CNTL__MCIF_CWB0_MEM_PWR_DIS_MASK 0x2000000
+#define DCI_MEM_PWR_CNTL__MCIF_CWB0_MEM_PWR_DIS__SHIFT 0x19
+#define DCI_MEM_PWR_CNTL__MCIF_CWB1_MEM_PWR_FORCE_MASK 0xc000000
+#define DCI_MEM_PWR_CNTL__MCIF_CWB1_MEM_PWR_FORCE__SHIFT 0x1a
+#define DCI_MEM_PWR_CNTL__MCIF_CWB1_MEM_PWR_DIS_MASK 0x10000000
+#define DCI_MEM_PWR_CNTL__MCIF_CWB1_MEM_PWR_DIS__SHIFT 0x1c
+#define DCI_MEM_PWR_CNTL__VIP_MEM_PWR_FORCE_MASK 0x20000000
+#define DCI_MEM_PWR_CNTL__VIP_MEM_PWR_FORCE__SHIFT 0x1d
+#define DCI_MEM_PWR_CNTL__VIP_MEM_PWR_DIS_MASK 0x40000000
+#define DCI_MEM_PWR_CNTL__VIP_MEM_PWR_DIS__SHIFT 0x1e
+#define DCI_MEM_PWR_CNTL2__DMIF0_ASYNC_MEM_PWR_FORCE_MASK 0x3
+#define DCI_MEM_PWR_CNTL2__DMIF0_ASYNC_MEM_PWR_FORCE__SHIFT 0x0
+#define DCI_MEM_PWR_CNTL2__DMIF0_ASYNC_MEM_PWR_DIS_MASK 0x4
+#define DCI_MEM_PWR_CNTL2__DMIF0_ASYNC_MEM_PWR_DIS__SHIFT 0x2
+#define DCI_MEM_PWR_CNTL2__DMIF0_DATA_MEM_PWR_FORCE_MASK 0x18
+#define DCI_MEM_PWR_CNTL2__DMIF0_DATA_MEM_PWR_FORCE__SHIFT 0x3
+#define DCI_MEM_PWR_CNTL2__DMIF0_DATA_MEM_PWR_DIS_MASK 0x20
+#define DCI_MEM_PWR_CNTL2__DMIF0_DATA_MEM_PWR_DIS__SHIFT 0x5
+#define DCI_MEM_PWR_CNTL2__DMIF0_CHUNK_MEM_PWR_FORCE_MASK 0x40
+#define DCI_MEM_PWR_CNTL2__DMIF0_CHUNK_MEM_PWR_FORCE__SHIFT 0x6
+#define DCI_MEM_PWR_CNTL2__DMIF0_CHUNK_MEM_PWR_DIS_MASK 0x80
+#define DCI_MEM_PWR_CNTL2__DMIF0_CHUNK_MEM_PWR_DIS__SHIFT 0x7
+#define DCI_MEM_PWR_CNTL2__DMIF1_ASYNC_MEM_PWR_FORCE_MASK 0x300
+#define DCI_MEM_PWR_CNTL2__DMIF1_ASYNC_MEM_PWR_FORCE__SHIFT 0x8
+#define DCI_MEM_PWR_CNTL2__DMIF1_ASYNC_MEM_PWR_DIS_MASK 0x400
+#define DCI_MEM_PWR_CNTL2__DMIF1_ASYNC_MEM_PWR_DIS__SHIFT 0xa
+#define DCI_MEM_PWR_CNTL2__DMIF1_DATA_MEM_PWR_FORCE_MASK 0x1800
+#define DCI_MEM_PWR_CNTL2__DMIF1_DATA_MEM_PWR_FORCE__SHIFT 0xb
+#define DCI_MEM_PWR_CNTL2__DMIF1_DATA_MEM_PWR_DIS_MASK 0x2000
+#define DCI_MEM_PWR_CNTL2__DMIF1_DATA_MEM_PWR_DIS__SHIFT 0xd
+#define DCI_MEM_PWR_CNTL2__DMIF1_CHUNK_MEM_PWR_FORCE_MASK 0x4000
+#define DCI_MEM_PWR_CNTL2__DMIF1_CHUNK_MEM_PWR_FORCE__SHIFT 0xe
+#define DCI_MEM_PWR_CNTL2__DMIF1_CHUNK_MEM_PWR_DIS_MASK 0x8000
+#define DCI_MEM_PWR_CNTL2__DMIF1_CHUNK_MEM_PWR_DIS__SHIFT 0xf
+#define DCI_MEM_PWR_CNTL2__DMIF2_ASYNC_MEM_PWR_FORCE_MASK 0x30000
+#define DCI_MEM_PWR_CNTL2__DMIF2_ASYNC_MEM_PWR_FORCE__SHIFT 0x10
+#define DCI_MEM_PWR_CNTL2__DMIF2_ASYNC_MEM_PWR_DIS_MASK 0x40000
+#define DCI_MEM_PWR_CNTL2__DMIF2_ASYNC_MEM_PWR_DIS__SHIFT 0x12
+#define DCI_MEM_PWR_CNTL2__DMIF2_DATA_MEM_PWR_FORCE_MASK 0x180000
+#define DCI_MEM_PWR_CNTL2__DMIF2_DATA_MEM_PWR_FORCE__SHIFT 0x13
+#define DCI_MEM_PWR_CNTL2__DMIF2_DATA_MEM_PWR_DIS_MASK 0x200000
+#define DCI_MEM_PWR_CNTL2__DMIF2_DATA_MEM_PWR_DIS__SHIFT 0x15
+#define DCI_MEM_PWR_CNTL2__DMIF2_CHUNK_MEM_PWR_FORCE_MASK 0x400000
+#define DCI_MEM_PWR_CNTL2__DMIF2_CHUNK_MEM_PWR_FORCE__SHIFT 0x16
+#define DCI_MEM_PWR_CNTL2__DMIF2_CHUNK_MEM_PWR_DIS_MASK 0x800000
+#define DCI_MEM_PWR_CNTL2__DMIF2_CHUNK_MEM_PWR_DIS__SHIFT 0x17
+#define DCI_MEM_PWR_CNTL2__DMIF3_ASYNC_MEM_PWR_FORCE_MASK 0x3000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_ASYNC_MEM_PWR_FORCE__SHIFT 0x18
+#define DCI_MEM_PWR_CNTL2__DMIF3_ASYNC_MEM_PWR_DIS_MASK 0x4000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_ASYNC_MEM_PWR_DIS__SHIFT 0x1a
+#define DCI_MEM_PWR_CNTL2__DMIF3_DATA_MEM_PWR_FORCE_MASK 0x18000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_DATA_MEM_PWR_FORCE__SHIFT 0x1b
+#define DCI_MEM_PWR_CNTL2__DMIF3_DATA_MEM_PWR_DIS_MASK 0x20000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_DATA_MEM_PWR_DIS__SHIFT 0x1d
+#define DCI_MEM_PWR_CNTL2__DMIF3_CHUNK_MEM_PWR_FORCE_MASK 0x40000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_CHUNK_MEM_PWR_FORCE__SHIFT 0x1e
+#define DCI_MEM_PWR_CNTL2__DMIF3_CHUNK_MEM_PWR_DIS_MASK 0x80000000
+#define DCI_MEM_PWR_CNTL2__DMIF3_CHUNK_MEM_PWR_DIS__SHIFT 0x1f
+#define DCI_MEM_PWR_CNTL3__DMIF4_ASYNC_MEM_PWR_FORCE_MASK 0x3
+#define DCI_MEM_PWR_CNTL3__DMIF4_ASYNC_MEM_PWR_FORCE__SHIFT 0x0
+#define DCI_MEM_PWR_CNTL3__DMIF4_ASYNC_MEM_PWR_DIS_MASK 0x4
+#define DCI_MEM_PWR_CNTL3__DMIF4_ASYNC_MEM_PWR_DIS__SHIFT 0x2
+#define DCI_MEM_PWR_CNTL3__DMIF4_DATA_MEM_PWR_FORCE_MASK 0x18
+#define DCI_MEM_PWR_CNTL3__DMIF4_DATA_MEM_PWR_FORCE__SHIFT 0x3
+#define DCI_MEM_PWR_CNTL3__DMIF4_DATA_MEM_PWR_DIS_MASK 0x20
+#define DCI_MEM_PWR_CNTL3__DMIF4_DATA_MEM_PWR_DIS__SHIFT 0x5
+#define DCI_MEM_PWR_CNTL3__DMIF4_CHUNK_MEM_PWR_FORCE_MASK 0x40
+#define DCI_MEM_PWR_CNTL3__DMIF4_CHUNK_MEM_PWR_FORCE__SHIFT 0x6
+#define DCI_MEM_PWR_CNTL3__DMIF4_CHUNK_MEM_PWR_DIS_MASK 0x80
+#define DCI_MEM_PWR_CNTL3__DMIF4_CHUNK_MEM_PWR_DIS__SHIFT 0x7
+#define DCI_MEM_PWR_CNTL3__DMIF5_ASYNC_MEM_PWR_FORCE_MASK 0x300
+#define DCI_MEM_PWR_CNTL3__DMIF5_ASYNC_MEM_PWR_FORCE__SHIFT 0x8
+#define DCI_MEM_PWR_CNTL3__DMIF5_ASYNC_MEM_PWR_DIS_MASK 0x400
+#define DCI_MEM_PWR_CNTL3__DMIF5_ASYNC_MEM_PWR_DIS__SHIFT 0xa
+#define DCI_MEM_PWR_CNTL3__DMIF5_DATA_MEM_PWR_FORCE_MASK 0x1800
+#define DCI_MEM_PWR_CNTL3__DMIF5_DATA_MEM_PWR_FORCE__SHIFT 0xb
+#define DCI_MEM_PWR_CNTL3__DMIF5_DATA_MEM_PWR_DIS_MASK 0x2000
+#define DCI_MEM_PWR_CNTL3__DMIF5_DATA_MEM_PWR_DIS__SHIFT 0xd
+#define DCI_MEM_PWR_CNTL3__DMIF5_CHUNK_MEM_PWR_FORCE_MASK 0x4000
+#define DCI_MEM_PWR_CNTL3__DMIF5_CHUNK_MEM_PWR_FORCE__SHIFT 0xe
+#define DCI_MEM_PWR_CNTL3__DMIF5_CHUNK_MEM_PWR_DIS_MASK 0x8000
+#define DCI_MEM_PWR_CNTL3__DMIF5_CHUNK_MEM_PWR_DIS__SHIFT 0xf
+#define DCI_MEM_PWR_CNTL3__DMIF_RDREQ_MEM_PWR_MODE_SEL_MASK 0x30000
+#define DCI_MEM_PWR_CNTL3__DMIF_RDREQ_MEM_PWR_MODE_SEL__SHIFT 0x10
+#define DCI_MEM_PWR_CNTL3__DMIF_ASYNC_MEM_PWR_MODE_SEL_MASK 0xc0000
+#define DCI_MEM_PWR_CNTL3__DMIF_ASYNC_MEM_PWR_MODE_SEL__SHIFT 0x12
+#define DCI_MEM_PWR_CNTL3__DMIF_DATA_MEM_PWR_MODE_SEL_MASK 0x300000
+#define DCI_MEM_PWR_CNTL3__DMIF_DATA_MEM_PWR_MODE_SEL__SHIFT 0x14
+#define DCI_MEM_PWR_CNTL3__DMCU_ERAM_MEM_PWR_MODE_SEL_MASK 0x400000
+#define DCI_MEM_PWR_CNTL3__DMCU_ERAM_MEM_PWR_MODE_SEL__SHIFT 0x16
+#define DCI_MEM_PWR_CNTL3__FBC_MEM_PWR_MODE_SEL_MASK 0x1800000
+#define DCI_MEM_PWR_CNTL3__FBC_MEM_PWR_MODE_SEL__SHIFT 0x17
+#define DCI_MEM_PWR_CNTL3__MCIF_CWB0_MEM_PWR_MODE_SEL_MASK 0x6000000
+#define DCI_MEM_PWR_CNTL3__MCIF_CWB0_MEM_PWR_MODE_SEL__SHIFT 0x19
+#define DCI_MEM_PWR_CNTL3__MCIF_CWB1_MEM_PWR_MODE_SEL_MASK 0x18000000
+#define DCI_MEM_PWR_CNTL3__MCIF_CWB1_MEM_PWR_MODE_SEL__SHIFT 0x1b
+#define DCI_MEM_PWR_CNTL3__MCIF_DWB_MEM_PWR_MODE_SEL_MASK 0x60000000
+#define DCI_MEM_PWR_CNTL3__MCIF_DWB_MEM_PWR_MODE_SEL__SHIFT 0x1d
+#define DCI_MEM_PWR_CNTL4__MCIF_DWB_LUMA_MEM_EN_NUM_MASK 0x1
+#define DCI_MEM_PWR_CNTL4__MCIF_DWB_LUMA_MEM_EN_NUM__SHIFT 0x0
+#define DCI_MEM_PWR_CNTL4__MCIF_DWB_CHROMA_MEM_EN_NUM_MASK 0x2
+#define DCI_MEM_PWR_CNTL4__MCIF_DWB_CHROMA_MEM_EN_NUM__SHIFT 0x1
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB0_LUMA_MEM_EN_NUM_MASK 0x4
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB0_LUMA_MEM_EN_NUM__SHIFT 0x2
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB0_CHROMA_MEM_EN_NUM_MASK 0x8
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB0_CHROMA_MEM_EN_NUM__SHIFT 0x3
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB1_LUMA_MEM_EN_NUM_MASK 0x10
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB1_LUMA_MEM_EN_NUM__SHIFT 0x4
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB1_CHROMA_MEM_EN_NUM_MASK 0x20
+#define DCI_MEM_PWR_CNTL4__MCIF_CWB1_CHROMA_MEM_EN_NUM__SHIFT 0x5
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE0_MEM_PWR_FORCE_MASK 0x3
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE0_MEM_PWR_FORCE__SHIFT 0x0
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE0_MEM_PWR_DIS_MASK 0x4
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE0_MEM_PWR_DIS__SHIFT 0x2
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE1_MEM_PWR_FORCE_MASK 0x18
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE1_MEM_PWR_FORCE__SHIFT 0x3
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE1_MEM_PWR_DIS_MASK 0x20
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE1_MEM_PWR_DIS__SHIFT 0x5
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE2_MEM_PWR_FORCE_MASK 0xc0
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE2_MEM_PWR_FORCE__SHIFT 0x6
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE2_MEM_PWR_DIS_MASK 0x100
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE2_MEM_PWR_DIS__SHIFT 0x8
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE3_MEM_PWR_FORCE_MASK 0x600
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE3_MEM_PWR_FORCE__SHIFT 0x9
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE3_MEM_PWR_DIS_MASK 0x800
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE3_MEM_PWR_DIS__SHIFT 0xb
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE4_MEM_PWR_FORCE_MASK 0x3000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE4_MEM_PWR_FORCE__SHIFT 0xc
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE4_MEM_PWR_DIS_MASK 0x4000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE4_MEM_PWR_DIS__SHIFT 0xe
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE5_MEM_PWR_FORCE_MASK 0x18000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE5_MEM_PWR_FORCE__SHIFT 0xf
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE5_MEM_PWR_DIS_MASK 0x20000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE5_MEM_PWR_DIS__SHIFT 0x11
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE6_MEM_PWR_FORCE_MASK 0xc0000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE6_MEM_PWR_FORCE__SHIFT 0x12
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE6_MEM_PWR_DIS_MASK 0x100000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE6_MEM_PWR_DIS__SHIFT 0x14
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE7_MEM_PWR_FORCE_MASK 0x600000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE7_MEM_PWR_FORCE__SHIFT 0x15
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE7_MEM_PWR_DIS_MASK 0x800000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE7_MEM_PWR_DIS__SHIFT 0x17
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE_MEM_PWR_MODE_SEL_MASK 0x3000000
+#define DVMM_PTE_PGMEM_CONTROL__DVMM_PTE_MEM_PWR_MODE_SEL__SHIFT 0x18
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE0_PTE_PGMEM_STATE_MASK 0x3
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE0_PTE_PGMEM_STATE__SHIFT 0x0
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE1_PTE_PGMEM_STATE_MASK 0xc
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE1_PTE_PGMEM_STATE__SHIFT 0x2
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE2_PTE_PGMEM_STATE_MASK 0x30
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE2_PTE_PGMEM_STATE__SHIFT 0x4
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE3_PTE_PGMEM_STATE_MASK 0xc0
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE3_PTE_PGMEM_STATE__SHIFT 0x6
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE4_PTE_PGMEM_STATE_MASK 0x300
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE4_PTE_PGMEM_STATE__SHIFT 0x8
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE5_PTE_PGMEM_STATE_MASK 0xc00
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE5_PTE_PGMEM_STATE__SHIFT 0xa
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE6_PTE_PGMEM_STATE_MASK 0x3000
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE6_PTE_PGMEM_STATE__SHIFT 0xc
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE7_PTE_PGMEM_STATE_MASK 0xc000
+#define DVMM_PTE_PGMEM_STATE__DVMM_PIPE7_PTE_PGMEM_STATE__SHIFT 0xe
+#define DCI_SOFT_RESET__VGA_SOFT_RESET_MASK 0x1
+#define DCI_SOFT_RESET__VGA_SOFT_RESET__SHIFT 0x0
+#define DCI_SOFT_RESET__VIP_SOFT_RESET_MASK 0x2
+#define DCI_SOFT_RESET__VIP_SOFT_RESET__SHIFT 0x1
+#define DCI_SOFT_RESET__MCIF_SOFT_RESET_MASK 0x4
+#define DCI_SOFT_RESET__MCIF_SOFT_RESET__SHIFT 0x2
+#define DCI_SOFT_RESET__FBC_SOFT_RESET_MASK 0x8
+#define DCI_SOFT_RESET__FBC_SOFT_RESET__SHIFT 0x3
+#define DCI_SOFT_RESET__DMIF0_SOFT_RESET_MASK 0x10
+#define DCI_SOFT_RESET__DMIF0_SOFT_RESET__SHIFT 0x4
+#define DCI_SOFT_RESET__DMIF1_SOFT_RESET_MASK 0x20
+#define DCI_SOFT_RESET__DMIF1_SOFT_RESET__SHIFT 0x5
+#define DCI_SOFT_RESET__DMIF2_SOFT_RESET_MASK 0x40
+#define DCI_SOFT_RESET__DMIF2_SOFT_RESET__SHIFT 0x6
+#define DCI_SOFT_RESET__DMIF3_SOFT_RESET_MASK 0x80
+#define DCI_SOFT_RESET__DMIF3_SOFT_RESET__SHIFT 0x7
+#define DCI_SOFT_RESET__DMIF4_SOFT_RESET_MASK 0x100
+#define DCI_SOFT_RESET__DMIF4_SOFT_RESET__SHIFT 0x8
+#define DCI_SOFT_RESET__DMIF5_SOFT_RESET_MASK 0x200
+#define DCI_SOFT_RESET__DMIF5_SOFT_RESET__SHIFT 0x9
+#define DCI_SOFT_RESET__DCFEV0_L_SOFT_RESET_MASK 0x400
+#define DCI_SOFT_RESET__DCFEV0_L_SOFT_RESET__SHIFT 0xa
+#define DCI_SOFT_RESET__DCFEV0_C_SOFT_RESET_MASK 0x800
+#define DCI_SOFT_RESET__DCFEV0_C_SOFT_RESET__SHIFT 0xb
+#define DCI_SOFT_RESET__DCFEV1_L_SOFT_RESET_MASK 0x1000
+#define DCI_SOFT_RESET__DCFEV1_L_SOFT_RESET__SHIFT 0xc
+#define DCI_SOFT_RESET__DCFEV1_C_SOFT_RESET_MASK 0x2000
+#define DCI_SOFT_RESET__DCFEV1_C_SOFT_RESET__SHIFT 0xd
+#define DCI_SOFT_RESET__DMIFARB_SOFT_RESET_MASK 0x4000
+#define DCI_SOFT_RESET__DMIFARB_SOFT_RESET__SHIFT 0xe
+#define DCI_SOFT_RESET__MCIF_DWB_SOFT_RESET_MASK 0x10000
+#define DCI_SOFT_RESET__MCIF_DWB_SOFT_RESET__SHIFT 0x10
+#define DCI_SOFT_RESET__MCIF_CWB0_SOFT_RESET_MASK 0x20000
+#define DCI_SOFT_RESET__MCIF_CWB0_SOFT_RESET__SHIFT 0x11
+#define DCI_SOFT_RESET__MCIF_CWB1_SOFT_RESET_MASK 0x40000
+#define DCI_SOFT_RESET__MCIF_CWB1_SOFT_RESET__SHIFT 0x12
+#define DCI_SOFT_RESET__MCIF_WB_SOFT_RESET_MASK 0x80000
+#define DCI_SOFT_RESET__MCIF_WB_SOFT_RESET__SHIFT 0x13
+#define DCI_MISC__MCIF_WB_URG_OVRD_MASK 0x1
+#define DCI_MISC__MCIF_WB_URG_OVRD__SHIFT 0x0
+#define DCI_MISC__MCIF_WB_URG_LVL_MASK 0x1e
+#define DCI_MISC__MCIF_WB_URG_LVL__SHIFT 0x1
+#define DCI_TEST_DEBUG_INDEX__DCI_TEST_DEBUG_INDEX_MASK 0xff
+#define DCI_TEST_DEBUG_INDEX__DCI_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCI_TEST_DEBUG_INDEX__DCI_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCI_TEST_DEBUG_INDEX__DCI_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCI_TEST_DEBUG_DATA__DCI_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCI_TEST_DEBUG_DATA__DCI_TEST_DEBUG_DATA__SHIFT 0x0
+#define DCI_DEBUG_CONFIG__DCI_DBG_EN_MASK 0x1
+#define DCI_DEBUG_CONFIG__DCI_DBG_EN__SHIFT 0x0
+#define DCI_DEBUG_CONFIG__DCI_DBG_BLOCK_SEL_MASK 0xf0
+#define DCI_DEBUG_CONFIG__DCI_DBG_BLOCK_SEL__SHIFT 0x4
+#define DCI_DEBUG_CONFIG__DCI_DBG_CLOCK_SEL_MASK 0xf00
+#define DCI_DEBUG_CONFIG__DCI_DBG_CLOCK_SEL__SHIFT 0x8
+#define PIPE0_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE0_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE0_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE0_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define PIPE1_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE1_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE1_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE1_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define PIPE2_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE2_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE2_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE2_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define PIPE3_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE3_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE3_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE3_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define PIPE4_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE4_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE4_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE4_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define PIPE5_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED_MASK 0x7
+#define PIPE5_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATED__SHIFT 0x0
+#define PIPE5_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED_MASK 0x10
+#define PIPE5_DMIF_BUFFER_CONTROL__DMIF_BUFFERS_ALLOCATION_COMPLETED__SHIFT 0x4
+#define DC_GENERICA__GENERICA_EN_MASK 0x1
+#define DC_GENERICA__GENERICA_EN__SHIFT 0x0
+#define DC_GENERICA__GENERICA_SEL_MASK 0xf80
+#define DC_GENERICA__GENERICA_SEL__SHIFT 0x7
+#define DC_GENERICA__GENERICA_UNIPHY_REFDIV_CLK_SEL_MASK 0xf000
+#define DC_GENERICA__GENERICA_UNIPHY_REFDIV_CLK_SEL__SHIFT 0xc
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_CLK_SEL_MASK 0xf0000
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_CLK_SEL__SHIFT 0x10
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_SSC_CLK_SEL_MASK 0xf00000
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_SSC_CLK_SEL__SHIFT 0x14
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_CLK_DIV2_SEL_MASK 0xf000000
+#define DC_GENERICA__GENERICA_UNIPHY_FBDIV_CLK_DIV2_SEL__SHIFT 0x18
+#define DC_GENERICB__GENERICB_EN_MASK 0x1
+#define DC_GENERICB__GENERICB_EN__SHIFT 0x0
+#define DC_GENERICB__GENERICB_SEL_MASK 0xf00
+#define DC_GENERICB__GENERICB_SEL__SHIFT 0x8
+#define DC_GENERICB__GENERICB_UNIPHY_REFDIV_CLK_SEL_MASK 0xf000
+#define DC_GENERICB__GENERICB_UNIPHY_REFDIV_CLK_SEL__SHIFT 0xc
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_CLK_SEL_MASK 0xf0000
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_CLK_SEL__SHIFT 0x10
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_SSC_CLK_SEL_MASK 0xf00000
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_SSC_CLK_SEL__SHIFT 0x14
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_CLK_DIV2_SEL_MASK 0xf000000
+#define DC_GENERICB__GENERICB_UNIPHY_FBDIV_CLK_DIV2_SEL__SHIFT 0x18
+#define DC_PAD_EXTERN_SIG__DC_PAD_EXTERN_SIG_SEL_MASK 0xf
+#define DC_PAD_EXTERN_SIG__DC_PAD_EXTERN_SIG_SEL__SHIFT 0x0
+#define DC_PAD_EXTERN_SIG__MVP_PIXEL_SRC_STATUS_MASK 0x30
+#define DC_PAD_EXTERN_SIG__MVP_PIXEL_SRC_STATUS__SHIFT 0x4
+#define DC_REF_CLK_CNTL__HSYNCA_OUTPUT_SEL_MASK 0x3
+#define DC_REF_CLK_CNTL__HSYNCA_OUTPUT_SEL__SHIFT 0x0
+#define DC_REF_CLK_CNTL__GENLK_CLK_OUTPUT_SEL_MASK 0x300
+#define DC_REF_CLK_CNTL__GENLK_CLK_OUTPUT_SEL__SHIFT 0x8
+#define DC_GPIO_DEBUG__DC_GPIO_VIP_DEBUG_MASK 0x1
+#define DC_GPIO_DEBUG__DC_GPIO_VIP_DEBUG__SHIFT 0x0
+#define DC_GPIO_DEBUG__DC_GPIO_MACRO_DEBUG_MASK 0x300
+#define DC_GPIO_DEBUG__DC_GPIO_MACRO_DEBUG__SHIFT 0x8
+#define DC_GPIO_DEBUG__DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL_MASK 0x10000
+#define DC_GPIO_DEBUG__DC_GPIO_CHIP_DEBUG_OUT_PIN_SEL__SHIFT 0x10
+#define DC_GPIO_DEBUG__DC_GPIO_DEBUG_BUS_FLOP_EN_MASK 0x20000
+#define DC_GPIO_DEBUG__DC_GPIO_DEBUG_BUS_FLOP_EN__SHIFT 0x11
+#define DC_GPIO_DEBUG__DPRX_LOOPBACK_ENABLE_MASK 0x80000000
+#define DC_GPIO_DEBUG__DPRX_LOOPBACK_ENABLE__SHIFT 0x1f
+#define UNIPHYA_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYA_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYA_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYA_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYA_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYA_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYA_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYA_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYA_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYA_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYA_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYB_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYB_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYB_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYB_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYB_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYB_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYB_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYB_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYB_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYB_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYB_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYC_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYC_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYC_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYC_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYC_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYC_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYC_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYC_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYC_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYC_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYC_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYD_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYD_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYD_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYD_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYD_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYD_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYD_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYD_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYD_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYD_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYD_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYE_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYE_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYE_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYE_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYE_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYE_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYE_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYE_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYE_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYE_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYE_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYF_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYF_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYF_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYF_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYF_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYF_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYF_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYF_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYF_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYF_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYF_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYG_LINK_CNTL__UNIPHY_PFREQCHG_MASK 0x1
+#define UNIPHYG_LINK_CNTL__UNIPHY_PFREQCHG__SHIFT 0x0
+#define UNIPHYG_LINK_CNTL__UNIPHY_PIXVLD_RESET_MASK 0x10
+#define UNIPHYG_LINK_CNTL__UNIPHY_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYG_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYG_LINK_CNTL__UNIPHY_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYG_LINK_CNTL__UNIPHY_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYG_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYG_LINK_CNTL__UNIPHY_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYG_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYG_LINK_CNTL__UNIPHY_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYA_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYB_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYC_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYD_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYE_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYF_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYG_CHANNEL_XBAR_CNTL__UNIPHY_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_PFREQCHG_MASK 0x1
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_PFREQCHG__SHIFT 0x0
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_PIXVLD_RESET_MASK 0x10
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYLPA_LINK_CNTL__UNIPHYLP_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_PFREQCHG_MASK 0x1
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_PFREQCHG__SHIFT 0x0
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_PIXVLD_RESET_MASK 0x10
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_PIXVLD_RESET__SHIFT 0x4
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_MINIMUM_PIXVLD_LOW_DURATION_MASK 0x700
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_MINIMUM_PIXVLD_LOW_DURATION__SHIFT 0x8
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL0_INVERT_MASK 0x1000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL0_INVERT__SHIFT 0xc
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL1_INVERT_MASK 0x2000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL1_INVERT__SHIFT 0xd
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL2_INVERT_MASK 0x4000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL2_INVERT__SHIFT 0xe
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL3_INVERT_MASK 0x8000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_CHANNEL3_INVERT__SHIFT 0xf
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_LANE_STAGGER_DELAY_MASK 0x700000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_LANE_STAGGER_DELAY__SHIFT 0x14
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_LINK_ENABLE_HPD_MASK_MASK 0x3000000
+#define UNIPHYLPB_LINK_CNTL__UNIPHYLP_LINK_ENABLE_HPD_MASK__SHIFT 0x18
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYLPA_CHANNEL_XBAR_CNTL__UNIPHYLP_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL0_XBAR_SOURCE_MASK 0x3
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL0_XBAR_SOURCE__SHIFT 0x0
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL1_XBAR_SOURCE_MASK 0x300
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL1_XBAR_SOURCE__SHIFT 0x8
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL2_XBAR_SOURCE_MASK 0x30000
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL2_XBAR_SOURCE__SHIFT 0x10
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL3_XBAR_SOURCE_MASK 0x3000000
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_CHANNEL3_XBAR_SOURCE__SHIFT 0x18
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_LINK_ENABLE_MASK 0x10000000
+#define UNIPHYLPB_CHANNEL_XBAR_CNTL__UNIPHYLP_LINK_ENABLE__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_ENABLE_LINKA_MASK 0x1
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_ENABLE_LINKA__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_CALOUT_LINKA_MASK 0x100
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_CALOUT_LINKA__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_CALOUT_ERROR_LINKA_MASK 0x200
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_CALOUT_ERROR_LINKA__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_CALOUT_ERROR_LINKA_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_CALOUT_ERROR_LINKA_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_VALUE_LINKA_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_VALUE_LINKA__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_STEP_DELAY_LINKA_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_STEP_DELAY_LINKA__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_OVERRIDE_LINKA_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_OVERRIDE_LINKA__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKA_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKA__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_SEL_LINKA_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKA__UNIPHY_IMPCAL_SEL_LINKA__SHIFT 0x1e
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_ENABLE_LINKB_MASK 0x1
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_ENABLE_LINKB__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_CALOUT_LINKB_MASK 0x100
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_CALOUT_LINKB__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_CALOUT_ERROR_LINKB_MASK 0x200
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_CALOUT_ERROR_LINKB__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_CALOUT_ERROR_LINKB_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_CALOUT_ERROR_LINKB_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_VALUE_LINKB_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_VALUE_LINKB__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_STEP_DELAY_LINKB_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_STEP_DELAY_LINKB__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_OVERRIDE_LINKB_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_OVERRIDE_LINKB__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKB_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKB__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_SEL_LINKB_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKB__UNIPHY_IMPCAL_SEL_LINKB__SHIFT 0x1e
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_ENABLE_LINKC_MASK 0x1
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_ENABLE_LINKC__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_CALOUT_LINKC_MASK 0x100
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_CALOUT_LINKC__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_CALOUT_ERROR_LINKC_MASK 0x200
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_CALOUT_ERROR_LINKC__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_CALOUT_ERROR_LINKC_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_CALOUT_ERROR_LINKC_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_VALUE_LINKC_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_VALUE_LINKC__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_STEP_DELAY_LINKC_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_STEP_DELAY_LINKC__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_OVERRIDE_LINKC_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_OVERRIDE_LINKC__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKC_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKC__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_SEL_LINKC_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKC__UNIPHY_IMPCAL_SEL_LINKC__SHIFT 0x1e
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_ENABLE_LINKD_MASK 0x1
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_ENABLE_LINKD__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_CALOUT_LINKD_MASK 0x100
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_CALOUT_LINKD__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_CALOUT_ERROR_LINKD_MASK 0x200
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_CALOUT_ERROR_LINKD__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_CALOUT_ERROR_LINKD_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_CALOUT_ERROR_LINKD_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_VALUE_LINKD_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_VALUE_LINKD__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_STEP_DELAY_LINKD_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_STEP_DELAY_LINKD__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_OVERRIDE_LINKD_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_OVERRIDE_LINKD__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKD_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKD__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_SEL_LINKD_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKD__UNIPHY_IMPCAL_SEL_LINKD__SHIFT 0x1e
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_ENABLE_LINKE_MASK 0x1
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_ENABLE_LINKE__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_CALOUT_LINKE_MASK 0x100
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_CALOUT_LINKE__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_CALOUT_ERROR_LINKE_MASK 0x200
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_CALOUT_ERROR_LINKE__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_CALOUT_ERROR_LINKE_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_CALOUT_ERROR_LINKE_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_VALUE_LINKE_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_VALUE_LINKE__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_STEP_DELAY_LINKE_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_STEP_DELAY_LINKE__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_OVERRIDE_LINKE_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_OVERRIDE_LINKE__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKE_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKE__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_SEL_LINKE_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKE__UNIPHY_IMPCAL_SEL_LINKE__SHIFT 0x1e
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_ENABLE_LINKF_MASK 0x1
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_ENABLE_LINKF__SHIFT 0x0
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_CALOUT_LINKF_MASK 0x100
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_CALOUT_LINKF__SHIFT 0x8
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_CALOUT_ERROR_LINKF_MASK 0x200
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_CALOUT_ERROR_LINKF__SHIFT 0x9
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_CALOUT_ERROR_LINKF_AK_MASK 0x400
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_CALOUT_ERROR_LINKF_AK__SHIFT 0xa
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_VALUE_LINKF_MASK 0xf0000
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_VALUE_LINKF__SHIFT 0x10
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_STEP_DELAY_LINKF_MASK 0xf00000
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_STEP_DELAY_LINKF__SHIFT 0x14
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_OVERRIDE_LINKF_MASK 0xf000000
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_OVERRIDE_LINKF__SHIFT 0x18
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKF_MASK 0x10000000
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_OVERRIDE_ENABLE_LINKF__SHIFT 0x1c
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_SEL_LINKF_MASK 0x40000000
+#define UNIPHY_IMPCAL_LINKF__UNIPHY_IMPCAL_SEL_LINKF__SHIFT 0x1e
+#define UNIPHY_IMPCAL_PERIOD__UNIPHY_IMPCAL_PERIOD_MASK 0xffffffff
+#define UNIPHY_IMPCAL_PERIOD__UNIPHY_IMPCAL_PERIOD__SHIFT 0x0
+#define AUXP_IMPCAL__AUXP_IMPCAL_ENABLE_MASK 0x1
+#define AUXP_IMPCAL__AUXP_IMPCAL_ENABLE__SHIFT 0x0
+#define AUXP_IMPCAL__AUXP_IMPCAL_CALOUT_MASK 0x100
+#define AUXP_IMPCAL__AUXP_IMPCAL_CALOUT__SHIFT 0x8
+#define AUXP_IMPCAL__AUXP_CALOUT_ERROR_MASK 0x200
+#define AUXP_IMPCAL__AUXP_CALOUT_ERROR__SHIFT 0x9
+#define AUXP_IMPCAL__AUXP_CALOUT_ERROR_AK_MASK 0x400
+#define AUXP_IMPCAL__AUXP_CALOUT_ERROR_AK__SHIFT 0xa
+#define AUXP_IMPCAL__AUXP_IMPCAL_VALUE_MASK 0xf0000
+#define AUXP_IMPCAL__AUXP_IMPCAL_VALUE__SHIFT 0x10
+#define AUXP_IMPCAL__AUXP_IMPCAL_STEP_DELAY_MASK 0xf00000
+#define AUXP_IMPCAL__AUXP_IMPCAL_STEP_DELAY__SHIFT 0x14
+#define AUXP_IMPCAL__AUXP_IMPCAL_OVERRIDE_MASK 0xf000000
+#define AUXP_IMPCAL__AUXP_IMPCAL_OVERRIDE__SHIFT 0x18
+#define AUXP_IMPCAL__AUXP_IMPCAL_OVERRIDE_ENABLE_MASK 0x10000000
+#define AUXP_IMPCAL__AUXP_IMPCAL_OVERRIDE_ENABLE__SHIFT 0x1c
+#define AUXN_IMPCAL__AUXN_IMPCAL_ENABLE_MASK 0x1
+#define AUXN_IMPCAL__AUXN_IMPCAL_ENABLE__SHIFT 0x0
+#define AUXN_IMPCAL__AUXN_IMPCAL_CALOUT_MASK 0x100
+#define AUXN_IMPCAL__AUXN_IMPCAL_CALOUT__SHIFT 0x8
+#define AUXN_IMPCAL__AUXN_CALOUT_ERROR_MASK 0x200
+#define AUXN_IMPCAL__AUXN_CALOUT_ERROR__SHIFT 0x9
+#define AUXN_IMPCAL__AUXN_CALOUT_ERROR_AK_MASK 0x400
+#define AUXN_IMPCAL__AUXN_CALOUT_ERROR_AK__SHIFT 0xa
+#define AUXN_IMPCAL__AUXN_IMPCAL_VALUE_MASK 0xf0000
+#define AUXN_IMPCAL__AUXN_IMPCAL_VALUE__SHIFT 0x10
+#define AUXN_IMPCAL__AUXN_IMPCAL_STEP_DELAY_MASK 0xf00000
+#define AUXN_IMPCAL__AUXN_IMPCAL_STEP_DELAY__SHIFT 0x14
+#define AUXN_IMPCAL__AUXN_IMPCAL_OVERRIDE_MASK 0xf000000
+#define AUXN_IMPCAL__AUXN_IMPCAL_OVERRIDE__SHIFT 0x18
+#define AUXN_IMPCAL__AUXN_IMPCAL_OVERRIDE_ENABLE_MASK 0x10000000
+#define AUXN_IMPCAL__AUXN_IMPCAL_OVERRIDE_ENABLE__SHIFT 0x1c
+#define DCIO_IMPCAL_CNTL__CALR_CNTL_OVERRIDE_MASK 0xf
+#define DCIO_IMPCAL_CNTL__CALR_CNTL_OVERRIDE__SHIFT 0x0
+#define DCIO_IMPCAL_CNTL__IMPCAL_SOFT_RESET_MASK 0x20
+#define DCIO_IMPCAL_CNTL__IMPCAL_SOFT_RESET__SHIFT 0x5
+#define DCIO_IMPCAL_CNTL__IMPCAL_STATUS_MASK 0x300
+#define DCIO_IMPCAL_CNTL__IMPCAL_STATUS__SHIFT 0x8
+#define DCIO_IMPCAL_CNTL__IMPCAL_ARB_STATE_MASK 0x7000
+#define DCIO_IMPCAL_CNTL__IMPCAL_ARB_STATE__SHIFT 0xc
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_INTERVAL_MASK 0x78000
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_INTERVAL__SHIFT 0xf
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_BIASENTST_MASK 0x380000
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_BIASENTST__SHIFT 0x13
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_RESBIASEN_MASK 0x400000
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_RESBIASEN__SHIFT 0x16
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_SPARE_CONTROL_MASK 0x1800000
+#define DCIO_IMPCAL_CNTL__AUX_IMPCAL_SPARE_CONTROL__SHIFT 0x17
+#define UNIPHY_IMPCAL_PSW_AB__UNIPHY_IMPCAL_PSW_LINKA_MASK 0x7fff
+#define UNIPHY_IMPCAL_PSW_AB__UNIPHY_IMPCAL_PSW_LINKA__SHIFT 0x0
+#define UNIPHY_IMPCAL_PSW_AB__UNIPHY_IMPCAL_PSW_LINKB_MASK 0x7fff0000
+#define UNIPHY_IMPCAL_PSW_AB__UNIPHY_IMPCAL_PSW_LINKB__SHIFT 0x10
+#define DCIO_IMPCAL_CNTL_CD__CALR_CNTL_OVERRIDE_MASK 0xf
+#define DCIO_IMPCAL_CNTL_CD__CALR_CNTL_OVERRIDE__SHIFT 0x0
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_SOFT_RESET_MASK 0x20
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_SOFT_RESET__SHIFT 0x5
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_STATUS_MASK 0x300
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_STATUS__SHIFT 0x8
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_ARB_STATE_MASK 0x7000
+#define DCIO_IMPCAL_CNTL_CD__IMPCAL_ARB_STATE__SHIFT 0xc
+#define UNIPHY_IMPCAL_PSW_CD__UNIPHY_IMPCAL_PSW_LINKC_MASK 0x7fff
+#define UNIPHY_IMPCAL_PSW_CD__UNIPHY_IMPCAL_PSW_LINKC__SHIFT 0x0
+#define UNIPHY_IMPCAL_PSW_CD__UNIPHY_IMPCAL_PSW_LINKD_MASK 0x7fff0000
+#define UNIPHY_IMPCAL_PSW_CD__UNIPHY_IMPCAL_PSW_LINKD__SHIFT 0x10
+#define DCIO_IMPCAL_CNTL_EF__CALR_CNTL_OVERRIDE_MASK 0xf
+#define DCIO_IMPCAL_CNTL_EF__CALR_CNTL_OVERRIDE__SHIFT 0x0
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_SOFT_RESET_MASK 0x20
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_SOFT_RESET__SHIFT 0x5
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_STATUS_MASK 0x300
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_STATUS__SHIFT 0x8
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_ARB_STATE_MASK 0x7000
+#define DCIO_IMPCAL_CNTL_EF__IMPCAL_ARB_STATE__SHIFT 0xc
+#define UNIPHY_IMPCAL_PSW_EF__UNIPHY_IMPCAL_PSW_LINKE_MASK 0x7fff
+#define UNIPHY_IMPCAL_PSW_EF__UNIPHY_IMPCAL_PSW_LINKE__SHIFT 0x0
+#define UNIPHY_IMPCAL_PSW_EF__UNIPHY_IMPCAL_PSW_LINKF_MASK 0x7fff0000
+#define UNIPHY_IMPCAL_PSW_EF__UNIPHY_IMPCAL_PSW_LINKF__SHIFT 0x10
+#define DCIO_WRCMD_DELAY__UNIPHY_DELAY_MASK 0xf
+#define DCIO_WRCMD_DELAY__UNIPHY_DELAY__SHIFT 0x0
+#define DCIO_WRCMD_DELAY__DAC_DELAY_MASK 0xf0
+#define DCIO_WRCMD_DELAY__DAC_DELAY__SHIFT 0x4
+#define DCIO_WRCMD_DELAY__DPHY_DELAY_MASK 0xf00
+#define DCIO_WRCMD_DELAY__DPHY_DELAY__SHIFT 0x8
+#define DCIO_WRCMD_DELAY__DCRXPHY_DELAY_MASK 0xf000
+#define DCIO_WRCMD_DELAY__DCRXPHY_DELAY__SHIFT 0xc
+#define DCIO_WRCMD_DELAY__ZCAL_DELAY_MASK 0xf0000
+#define DCIO_WRCMD_DELAY__ZCAL_DELAY__SHIFT 0x10
+#define DC_PINSTRAPS__DC_PINSTRAPS_BIF_CEC_DIS_MASK 0x400
+#define DC_PINSTRAPS__DC_PINSTRAPS_BIF_CEC_DIS__SHIFT 0xa
+#define DC_PINSTRAPS__DC_PINSTRAPS_SMS_EN_HARD_MASK 0x2000
+#define DC_PINSTRAPS__DC_PINSTRAPS_SMS_EN_HARD__SHIFT 0xd
+#define DC_PINSTRAPS__DC_PINSTRAPS_AUDIO_MASK 0xc000
+#define DC_PINSTRAPS__DC_PINSTRAPS_AUDIO__SHIFT 0xe
+#define DC_PINSTRAPS__DC_PINSTRAPS_CCBYPASS_MASK 0x10000
+#define DC_PINSTRAPS__DC_PINSTRAPS_CCBYPASS__SHIFT 0x10
+#define DC_PINSTRAPS__DC_PINSTRAPS_CONNECTIVITY_MASK 0xe0000
+#define DC_PINSTRAPS__DC_PINSTRAPS_CONNECTIVITY__SHIFT 0x11
+#define DC_DVODATA_CONFIG__VIP_MUX_EN_MASK 0x80000
+#define DC_DVODATA_CONFIG__VIP_MUX_EN__SHIFT 0x13
+#define DC_DVODATA_CONFIG__VIP_ALTER_MAPPING_EN_MASK 0x100000
+#define DC_DVODATA_CONFIG__VIP_ALTER_MAPPING_EN__SHIFT 0x14
+#define DC_DVODATA_CONFIG__DVO_ALTER_MAPPING_EN_MASK 0x200000
+#define DC_DVODATA_CONFIG__DVO_ALTER_MAPPING_EN__SHIFT 0x15
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_EN_MASK 0x1
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_EN__SHIFT 0x0
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN_MASK 0x2
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN__SHIFT 0x1
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_TARGET_STATE_MASK 0x10
+#define LVTMA_PWRSEQ_CNTL__LVTMA_PWRSEQ_TARGET_STATE__SHIFT 0x4
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN_MASK 0x100
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN__SHIFT 0x8
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN_OVRD_MASK 0x200
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN_OVRD__SHIFT 0x9
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN_POL_MASK 0x400
+#define LVTMA_PWRSEQ_CNTL__LVTMA_SYNCEN_POL__SHIFT 0xa
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON_MASK 0x10000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON__SHIFT 0x10
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON_OVRD_MASK 0x20000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON_OVRD__SHIFT 0x11
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON_POL_MASK 0x40000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_DIGON_POL__SHIFT 0x12
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON_MASK 0x1000000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON__SHIFT 0x18
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON_OVRD_MASK 0x2000000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON_OVRD__SHIFT 0x19
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON_POL_MASK 0x4000000
+#define LVTMA_PWRSEQ_CNTL__LVTMA_BLON_POL__SHIFT 0x1a
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_TARGET_STATE_R_MASK 0x1
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_TARGET_STATE_R__SHIFT 0x0
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_DIGON_MASK 0x2
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_DIGON__SHIFT 0x1
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_SYNCEN_MASK 0x4
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_SYNCEN__SHIFT 0x2
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_BLON_MASK 0x8
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_BLON__SHIFT 0x3
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_DONE_MASK 0x10
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_DONE__SHIFT 0x4
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_STATE_MASK 0xf00
+#define LVTMA_PWRSEQ_STATE__LVTMA_PWRSEQ_STATE__SHIFT 0x8
+#define LVTMA_PWRSEQ_REF_DIV__LVTMA_PWRSEQ_REF_DIV_MASK 0xfff
+#define LVTMA_PWRSEQ_REF_DIV__LVTMA_PWRSEQ_REF_DIV__SHIFT 0x0
+#define LVTMA_PWRSEQ_REF_DIV__BL_PWM_REF_DIV_MASK 0xffff0000
+#define LVTMA_PWRSEQ_REF_DIV__BL_PWM_REF_DIV__SHIFT 0x10
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRUP_DELAY1_MASK 0xff
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRUP_DELAY1__SHIFT 0x0
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRUP_DELAY2_MASK 0xff00
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRUP_DELAY2__SHIFT 0x8
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRDN_DELAY1_MASK 0xff0000
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRDN_DELAY1__SHIFT 0x10
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRDN_DELAY2_MASK 0xff000000
+#define LVTMA_PWRSEQ_DELAY1__LVTMA_PWRDN_DELAY2__SHIFT 0x18
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRDN_MIN_LENGTH_MASK 0xff
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRDN_MIN_LENGTH__SHIFT 0x0
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRUP_DELAY3_MASK 0xff00
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRUP_DELAY3__SHIFT 0x8
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRDN_DELAY3_MASK 0xff0000
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_PWRDN_DELAY3__SHIFT 0x10
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_VARY_BL_OVERRIDE_EN_MASK 0x1000000
+#define LVTMA_PWRSEQ_DELAY2__LVTMA_VARY_BL_OVERRIDE_EN__SHIFT 0x18
+#define BL_PWM_CNTL__BL_ACTIVE_INT_FRAC_CNT_MASK 0xffff
+#define BL_PWM_CNTL__BL_ACTIVE_INT_FRAC_CNT__SHIFT 0x0
+#define BL_PWM_CNTL__BL_PWM_FRACTIONAL_EN_MASK 0x40000000
+#define BL_PWM_CNTL__BL_PWM_FRACTIONAL_EN__SHIFT 0x1e
+#define BL_PWM_CNTL__BL_PWM_EN_MASK 0x80000000
+#define BL_PWM_CNTL__BL_PWM_EN__SHIFT 0x1f
+#define BL_PWM_CNTL2__BL_PWM_POST_FRAME_START_DELAY_BEFORE_UPDATE_MASK 0xffff
+#define BL_PWM_CNTL2__BL_PWM_POST_FRAME_START_DELAY_BEFORE_UPDATE__SHIFT 0x0
+#define BL_PWM_CNTL2__DBG_BL_PWM_INPUT_REFCLK_SELECT_MASK 0x30000000
+#define BL_PWM_CNTL2__DBG_BL_PWM_INPUT_REFCLK_SELECT__SHIFT 0x1c
+#define BL_PWM_CNTL2__BL_PWM_OVERRIDE_BL_OUT_ENABLE_MASK 0x40000000
+#define BL_PWM_CNTL2__BL_PWM_OVERRIDE_BL_OUT_ENABLE__SHIFT 0x1e
+#define BL_PWM_CNTL2__BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN_MASK 0x80000000
+#define BL_PWM_CNTL2__BL_PWM_OVERRIDE_LVTMA_PWRSEQ_EN__SHIFT 0x1f
+#define BL_PWM_PERIOD_CNTL__BL_PWM_PERIOD_MASK 0xffff
+#define BL_PWM_PERIOD_CNTL__BL_PWM_PERIOD__SHIFT 0x0
+#define BL_PWM_PERIOD_CNTL__BL_PWM_PERIOD_BITCNT_MASK 0xf0000
+#define BL_PWM_PERIOD_CNTL__BL_PWM_PERIOD_BITCNT__SHIFT 0x10
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_REG_LOCK_MASK 0x1
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_REG_LOCK__SHIFT 0x0
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_REG_UPDATE_PENDING_MASK 0x100
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_REG_UPDATE_PENDING__SHIFT 0x8
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_UPDATE_AT_FRAME_START_MASK 0x10000
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_UPDATE_AT_FRAME_START__SHIFT 0x10
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_FRAME_START_DISP_SEL_MASK 0xe0000
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_FRAME_START_DISP_SEL__SHIFT 0x11
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN_MASK 0x1000000
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_READBACK_DB_REG_VALUE_EN__SHIFT 0x18
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN_MASK 0x80000000
+#define BL_PWM_GRP1_REG_LOCK__BL_PWM_GRP1_IGNORE_MASTER_LOCK_EN__SHIFT 0x1f
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_TIMING_SYNC_SEL_MASK 0x3
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_TIMING_SYNC_SEL__SHIFT 0x0
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_FLIP_LOCK_SEL_MASK 0x30
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_FLIP_LOCK_SEL__SHIFT 0x4
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_MASK_MASK 0x300
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_CLK_GSL_MASK__SHIFT 0x8
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_TIMING_SYNC_SEL_MASK 0x30000
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_TIMING_SYNC_SEL__SHIFT 0x10
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_FLIP_LOCK_SEL_MASK 0x300000
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_FLIP_LOCK_SEL__SHIFT 0x14
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_MASK_MASK 0x3000000
+#define DCIO_GSL_GENLK_PAD_CNTL__DCIO_GENLK_VSYNC_GSL_MASK__SHIFT 0x18
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_TIMING_SYNC_SEL_MASK 0x3
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_TIMING_SYNC_SEL__SHIFT 0x0
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_FLIP_LOCK_SEL_MASK 0x30
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_FLIP_LOCK_SEL__SHIFT 0x4
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_MASK_MASK 0x300
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_A_GSL_MASK__SHIFT 0x8
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_TIMING_SYNC_SEL_MASK 0x30000
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_TIMING_SYNC_SEL__SHIFT 0x10
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_FLIP_LOCK_SEL_MASK 0x300000
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_FLIP_LOCK_SEL__SHIFT 0x14
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_MASK_MASK 0x3000000
+#define DCIO_GSL_SWAPLOCK_PAD_CNTL__DCIO_SWAPLOCK_B_GSL_MASK__SHIFT 0x18
+#define DCIO_GSL0_CNTL__DCIO_GSL0_VSYNC_SEL_MASK 0x7
+#define DCIO_GSL0_CNTL__DCIO_GSL0_VSYNC_SEL__SHIFT 0x0
+#define DCIO_GSL0_CNTL__DCIO_GSL0_TIMING_SYNC_SEL_MASK 0x700
+#define DCIO_GSL0_CNTL__DCIO_GSL0_TIMING_SYNC_SEL__SHIFT 0x8
+#define DCIO_GSL0_CNTL__DCIO_GSL0_GLOBAL_UNLOCK_SEL_MASK 0x70000
+#define DCIO_GSL0_CNTL__DCIO_GSL0_GLOBAL_UNLOCK_SEL__SHIFT 0x10
+#define DCIO_GSL1_CNTL__DCIO_GSL1_VSYNC_SEL_MASK 0x7
+#define DCIO_GSL1_CNTL__DCIO_GSL1_VSYNC_SEL__SHIFT 0x0
+#define DCIO_GSL1_CNTL__DCIO_GSL1_TIMING_SYNC_SEL_MASK 0x700
+#define DCIO_GSL1_CNTL__DCIO_GSL1_TIMING_SYNC_SEL__SHIFT 0x8
+#define DCIO_GSL1_CNTL__DCIO_GSL1_GLOBAL_UNLOCK_SEL_MASK 0x70000
+#define DCIO_GSL1_CNTL__DCIO_GSL1_GLOBAL_UNLOCK_SEL__SHIFT 0x10
+#define DCIO_GSL2_CNTL__DCIO_GSL2_VSYNC_SEL_MASK 0x7
+#define DCIO_GSL2_CNTL__DCIO_GSL2_VSYNC_SEL__SHIFT 0x0
+#define DCIO_GSL2_CNTL__DCIO_GSL2_TIMING_SYNC_SEL_MASK 0x700
+#define DCIO_GSL2_CNTL__DCIO_GSL2_TIMING_SYNC_SEL__SHIFT 0x8
+#define DCIO_GSL2_CNTL__DCIO_GSL2_GLOBAL_UNLOCK_SEL_MASK 0x70000
+#define DCIO_GSL2_CNTL__DCIO_GSL2_GLOBAL_UNLOCK_SEL__SHIFT 0x10
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D1_V_UPDATE_MASK 0x7
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D1_V_UPDATE__SHIFT 0x0
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D2_V_UPDATE_MASK 0x70
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D2_V_UPDATE__SHIFT 0x4
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D3_V_UPDATE_MASK 0x700
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D3_V_UPDATE__SHIFT 0x8
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D4_V_UPDATE_MASK 0x7000
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D4_V_UPDATE__SHIFT 0xc
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D5_V_UPDATE_MASK 0x70000
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D5_V_UPDATE__SHIFT 0x10
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D6_V_UPDATE_MASK 0x700000
+#define DC_GPU_TIMER_START_POSITION_V_UPDATE__DC_GPU_TIMER_START_POSITION_D6_V_UPDATE__SHIFT 0x14
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D1_P_FLIP_MASK 0x7
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D1_P_FLIP__SHIFT 0x0
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D2_P_FLIP_MASK 0x70
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D2_P_FLIP__SHIFT 0x4
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D3_P_FLIP_MASK 0x700
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D3_P_FLIP__SHIFT 0x8
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D4_P_FLIP_MASK 0x7000
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D4_P_FLIP__SHIFT 0xc
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D5_P_FLIP_MASK 0x70000
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D5_P_FLIP__SHIFT 0x10
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D6_P_FLIP_MASK 0x700000
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_D6_P_FLIP__SHIFT 0x14
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_DCFEV0_P_FLIP_MASK 0x3800000
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_DCFEV0_P_FLIP__SHIFT 0x17
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_DCFEV1_P_FLIP_MASK 0x1c000000
+#define DC_GPU_TIMER_START_POSITION_P_FLIP__DC_GPU_TIMER_START_POSITION_DCFEV1_P_FLIP__SHIFT 0x1a
+#define DC_GPU_TIMER_READ__DC_GPU_TIMER_READ_MASK 0xffffffff
+#define DC_GPU_TIMER_READ__DC_GPU_TIMER_READ__SHIFT 0x0
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_READ_SELECT_MASK 0x3f
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_READ_SELECT__SHIFT 0x0
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D1_VSYNC_NOM_MASK 0x700
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D1_VSYNC_NOM__SHIFT 0x8
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D2_VSYNC_NOM_MASK 0x3800
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D2_VSYNC_NOM__SHIFT 0xb
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D3_VSYNC_NOM_MASK 0x1c000
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D3_VSYNC_NOM__SHIFT 0xe
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D4_VSYNC_NOM_MASK 0xe0000
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D4_VSYNC_NOM__SHIFT 0x11
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D5_VSYNC_NOM_MASK 0x700000
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D5_VSYNC_NOM__SHIFT 0x14
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D6_VSYNC_NOM_MASK 0x3800000
+#define DC_GPU_TIMER_READ_CNTL__DC_GPU_TIMER_START_POSITION_D6_VSYNC_NOM__SHIFT 0x17
+#define DCIO_CLOCK_CNTL__DCIO_TEST_CLK_SEL_MASK 0x1f
+#define DCIO_CLOCK_CNTL__DCIO_TEST_CLK_SEL__SHIFT 0x0
+#define DCIO_CLOCK_CNTL__DISPCLK_R_DCIO_GATE_DIS_MASK 0x20
+#define DCIO_CLOCK_CNTL__DISPCLK_R_DCIO_GATE_DIS__SHIFT 0x5
+#define DCIO_DEBUG__DCIO_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG__DCIO_DEBUG__SHIFT 0x0
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE0_EXT_VSYNC_MUX_MASK 0x7
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE0_EXT_VSYNC_MUX__SHIFT 0x0
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE1_EXT_VSYNC_MUX_MASK 0x70
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE1_EXT_VSYNC_MUX__SHIFT 0x4
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE2_EXT_VSYNC_MUX_MASK 0x700
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE2_EXT_VSYNC_MUX__SHIFT 0x8
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE3_EXT_VSYNC_MUX_MASK 0x7000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE3_EXT_VSYNC_MUX__SHIFT 0xc
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE4_EXT_VSYNC_MUX_MASK 0x70000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE4_EXT_VSYNC_MUX__SHIFT 0x10
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE5_EXT_VSYNC_MUX_MASK 0x700000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_DCFE5_EXT_VSYNC_MUX__SHIFT 0x14
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_SWAPLOCKB_EXT_VSYNC_MASK_MASK 0x7000000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_SWAPLOCKB_EXT_VSYNC_MASK__SHIFT 0x18
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_GENERICB_EXT_VSYNC_MASK_MASK 0x70000000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_GENERICB_EXT_VSYNC_MASK__SHIFT 0x1c
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_CRTC_MANUAL_FLOW_CONTROL_MASK 0x80000000
+#define DCO_DCFE_EXT_VSYNC_CNTL__DCO_CRTC_MANUAL_FLOW_CONTROL__SHIFT 0x1f
+#define DBG_OUT_CNTL__DBG_OUT_PIN_EN_MASK 0x1
+#define DBG_OUT_CNTL__DBG_OUT_PIN_EN__SHIFT 0x0
+#define DBG_OUT_CNTL__DBG_OUT_PIN_SEL_MASK 0x10
+#define DBG_OUT_CNTL__DBG_OUT_PIN_SEL__SHIFT 0x4
+#define DBG_OUT_CNTL__DBG_OUT_12BIT_SEL_MASK 0x300
+#define DBG_OUT_CNTL__DBG_OUT_12BIT_SEL__SHIFT 0x8
+#define DBG_OUT_CNTL__DBG_OUT_TEST_DATA_MASK 0xfff000
+#define DBG_OUT_CNTL__DBG_OUT_TEST_DATA__SHIFT 0xc
+#define DCIO_DEBUG_CONFIG__DCIO_DBG_EN_MASK 0x1
+#define DCIO_DEBUG_CONFIG__DCIO_DBG_EN__SHIFT 0x0
+#define DCIO_DEBUG_CONFIG__DCIO_DBG_SEL_MASK 0xf00
+#define DCIO_DEBUG_CONFIG__DCIO_DBG_SEL__SHIFT 0x8
+#define DCIO_SOFT_RESET__UNIPHYA_SOFT_RESET_MASK 0x1
+#define DCIO_SOFT_RESET__UNIPHYA_SOFT_RESET__SHIFT 0x0
+#define DCIO_SOFT_RESET__DSYNCA_SOFT_RESET_MASK 0x2
+#define DCIO_SOFT_RESET__DSYNCA_SOFT_RESET__SHIFT 0x1
+#define DCIO_SOFT_RESET__UNIPHYB_SOFT_RESET_MASK 0x4
+#define DCIO_SOFT_RESET__UNIPHYB_SOFT_RESET__SHIFT 0x2
+#define DCIO_SOFT_RESET__DSYNCB_SOFT_RESET_MASK 0x8
+#define DCIO_SOFT_RESET__DSYNCB_SOFT_RESET__SHIFT 0x3
+#define DCIO_SOFT_RESET__UNIPHYC_SOFT_RESET_MASK 0x10
+#define DCIO_SOFT_RESET__UNIPHYC_SOFT_RESET__SHIFT 0x4
+#define DCIO_SOFT_RESET__DSYNCC_SOFT_RESET_MASK 0x20
+#define DCIO_SOFT_RESET__DSYNCC_SOFT_RESET__SHIFT 0x5
+#define DCIO_SOFT_RESET__UNIPHYD_SOFT_RESET_MASK 0x40
+#define DCIO_SOFT_RESET__UNIPHYD_SOFT_RESET__SHIFT 0x6
+#define DCIO_SOFT_RESET__DSYNCD_SOFT_RESET_MASK 0x80
+#define DCIO_SOFT_RESET__DSYNCD_SOFT_RESET__SHIFT 0x7
+#define DCIO_SOFT_RESET__UNIPHYE_SOFT_RESET_MASK 0x100
+#define DCIO_SOFT_RESET__UNIPHYE_SOFT_RESET__SHIFT 0x8
+#define DCIO_SOFT_RESET__DSYNCE_SOFT_RESET_MASK 0x200
+#define DCIO_SOFT_RESET__DSYNCE_SOFT_RESET__SHIFT 0x9
+#define DCIO_SOFT_RESET__UNIPHYF_SOFT_RESET_MASK 0x400
+#define DCIO_SOFT_RESET__UNIPHYF_SOFT_RESET__SHIFT 0xa
+#define DCIO_SOFT_RESET__DSYNCF_SOFT_RESET_MASK 0x800
+#define DCIO_SOFT_RESET__DSYNCF_SOFT_RESET__SHIFT 0xb
+#define DCIO_SOFT_RESET__UNIPHYG_SOFT_RESET_MASK 0x1000
+#define DCIO_SOFT_RESET__UNIPHYG_SOFT_RESET__SHIFT 0xc
+#define DCIO_SOFT_RESET__DSYNCG_SOFT_RESET_MASK 0x2000
+#define DCIO_SOFT_RESET__DSYNCG_SOFT_RESET__SHIFT 0xd
+#define DCIO_SOFT_RESET__DACA_SOFT_RESET_MASK 0x10000
+#define DCIO_SOFT_RESET__DACA_SOFT_RESET__SHIFT 0x10
+#define DCIO_SOFT_RESET__DCRXPHY_SOFT_RESET_MASK 0x100000
+#define DCIO_SOFT_RESET__DCRXPHY_SOFT_RESET__SHIFT 0x14
+#define DCIO_SOFT_RESET__DPHY_SOFT_RESET_MASK 0x1000000
+#define DCIO_SOFT_RESET__DPHY_SOFT_RESET__SHIFT 0x18
+#define DCIO_SOFT_RESET__ZCAL_SOFT_RESET_MASK 0x4000000
+#define DCIO_SOFT_RESET__ZCAL_SOFT_RESET__SHIFT 0x1a
+#define DCIO_SOFT_RESET__UNIPHYLPA_SOFT_RESET_MASK 0x10000000
+#define DCIO_SOFT_RESET__UNIPHYLPA_SOFT_RESET__SHIFT 0x1c
+#define DCIO_SOFT_RESET__DSYNCLPA_SOFT_RESET_MASK 0x20000000
+#define DCIO_SOFT_RESET__DSYNCLPA_SOFT_RESET__SHIFT 0x1d
+#define DCIO_SOFT_RESET__UNIPHYLPB_SOFT_RESET_MASK 0x40000000
+#define DCIO_SOFT_RESET__UNIPHYLPB_SOFT_RESET__SHIFT 0x1e
+#define DCIO_SOFT_RESET__DSYNCLPB_SOFT_RESET_MASK 0x80000000
+#define DCIO_SOFT_RESET__DSYNCLPB_SOFT_RESET__SHIFT 0x1f
+#define DCIO_DPHY_SEL__DPHY_LANE0_SEL_MASK 0x3
+#define DCIO_DPHY_SEL__DPHY_LANE0_SEL__SHIFT 0x0
+#define DCIO_DPHY_SEL__DPHY_LANE1_SEL_MASK 0xc
+#define DCIO_DPHY_SEL__DPHY_LANE1_SEL__SHIFT 0x2
+#define DCIO_DPHY_SEL__DPHY_LANE2_SEL_MASK 0x30
+#define DCIO_DPHY_SEL__DPHY_LANE2_SEL__SHIFT 0x4
+#define DCIO_DPHY_SEL__DPHY_LANE3_SEL_MASK 0xc0
+#define DCIO_DPHY_SEL__DPHY_LANE3_SEL__SHIFT 0x6
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_TYPE_MASK 0x1
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_TYPE__SHIFT 0x0
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_MASK_MASK 0x2
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_MASK__SHIFT 0x1
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_OCCUR_MASK 0x4
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXA_INT_OCCUR__SHIFT 0x2
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_TYPE_MASK 0x8
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_TYPE__SHIFT 0x3
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_MASK_MASK 0x10
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_MASK__SHIFT 0x4
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_OCCUR_MASK 0x20
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXB_INT_OCCUR__SHIFT 0x5
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_TYPE_MASK 0x40
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_TYPE__SHIFT 0x6
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_MASK_MASK 0x80
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_MASK__SHIFT 0x7
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_OCCUR_MASK 0x100
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXC_INT_OCCUR__SHIFT 0x8
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_TYPE_MASK 0x200
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_TYPE__SHIFT 0x9
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_MASK_MASK 0x400
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_MASK__SHIFT 0xa
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_OCCUR_MASK 0x800
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXD_INT_OCCUR__SHIFT 0xb
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_TYPE_MASK 0x1000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_TYPE__SHIFT 0xc
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_MASK_MASK 0x2000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_MASK__SHIFT 0xd
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_OCCUR_MASK 0x4000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXE_INT_OCCUR__SHIFT 0xe
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_TYPE_MASK 0x8000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_TYPE__SHIFT 0xf
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_MASK_MASK 0x10000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_MASK__SHIFT 0x10
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_OCCUR_MASK 0x20000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXF_INT_OCCUR__SHIFT 0x11
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_TYPE_MASK 0x40000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_TYPE__SHIFT 0x12
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_MASK_MASK 0x80000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_MASK__SHIFT 0x13
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_OCCUR_MASK 0x100000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXG_INT_OCCUR__SHIFT 0x14
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_TYPE_MASK 0x1000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_TYPE__SHIFT 0x18
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_MASK_MASK 0x2000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_MASK__SHIFT 0x19
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_OCCUR_MASK 0x4000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPA_INT_OCCUR__SHIFT 0x1a
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_TYPE_MASK 0x8000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_TYPE__SHIFT 0x1b
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_MASK_MASK 0x10000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_MASK__SHIFT 0x1c
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_OCCUR_MASK 0x20000000
+#define DCIO_DPCS_TX_INTERRUPT__DCIO_DPCS_TXLPB_INT_OCCUR__SHIFT 0x1d
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_TYPE_MASK 0x1
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_TYPE__SHIFT 0x0
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_MASK_MASK 0x2
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_MASK__SHIFT 0x1
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_OCCUR_MASK 0x4
+#define DCIO_DPCS_RX_INTERRUPT__DCIO_DPCS_RXA_INT_OCCUR__SHIFT 0x2
+#define DCIO_SEMAPHORE0__DCIO_SEMAPHORE0_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE0__DCIO_SEMAPHORE0_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE0__DCIO_SEMAPHORE0_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE0__DCIO_SEMAPHORE0_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE1__DCIO_SEMAPHORE1_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE1__DCIO_SEMAPHORE1_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE1__DCIO_SEMAPHORE1_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE1__DCIO_SEMAPHORE1_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE2__DCIO_SEMAPHORE2_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE2__DCIO_SEMAPHORE2_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE2__DCIO_SEMAPHORE2_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE2__DCIO_SEMAPHORE2_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE3__DCIO_SEMAPHORE3_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE3__DCIO_SEMAPHORE3_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE3__DCIO_SEMAPHORE3_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE3__DCIO_SEMAPHORE3_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE4__DCIO_SEMAPHORE4_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE4__DCIO_SEMAPHORE4_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE4__DCIO_SEMAPHORE4_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE4__DCIO_SEMAPHORE4_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE5__DCIO_SEMAPHORE5_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE5__DCIO_SEMAPHORE5_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE5__DCIO_SEMAPHORE5_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE5__DCIO_SEMAPHORE5_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE6__DCIO_SEMAPHORE6_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE6__DCIO_SEMAPHORE6_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE6__DCIO_SEMAPHORE6_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE6__DCIO_SEMAPHORE6_GNT__SHIFT 0x10
+#define DCIO_SEMAPHORE7__DCIO_SEMAPHORE7_REQ_MASK 0xffff
+#define DCIO_SEMAPHORE7__DCIO_SEMAPHORE7_REQ__SHIFT 0x0
+#define DCIO_SEMAPHORE7__DCIO_SEMAPHORE7_GNT_MASK 0xffff0000
+#define DCIO_SEMAPHORE7__DCIO_SEMAPHORE7_GNT__SHIFT 0x10
+#define DCIO_TEST_DEBUG_INDEX__DCIO_TEST_DEBUG_INDEX_MASK 0xff
+#define DCIO_TEST_DEBUG_INDEX__DCIO_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCIO_TEST_DEBUG_INDEX__DCIO_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCIO_TEST_DEBUG_INDEX__DCIO_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCIO_TEST_DEBUG_DATA__DCIO_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCIO_TEST_DEBUG_DATA__DCIO_TEST_DEBUG_DATA__SHIFT 0x0
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_A0_REG_MASK 0x3
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_A0_REG__SHIFT 0x0
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_MASK_REG_MASK 0xc
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_MASK_REG__SHIFT 0x2
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_EN_REG_MASK 0x30
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_EN_REG__SHIFT 0x4
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_A0_MASK 0xc0
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_A0__SHIFT 0x6
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_SEL0_MASK 0x300
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_SEL0__SHIFT 0x8
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_EN_MASK 0xc00
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCNTL_EN__SHIFT 0xa
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCLK_C_MASK 0x1000
+#define DCIO_DEBUG1__DCO_DCIO_MVP_DVOCLK_C__SHIFT 0xc
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0_REG_MASK 0x2000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0_REG__SHIFT 0xd
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0_PREMUX_MASK 0x4000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0_PREMUX__SHIFT 0xe
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0_MASK 0x8000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_A0__SHIFT 0xf
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN_REG_MASK 0x10000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN_REG__SHIFT 0x10
+#define DCIO_DEBUG1__DCO_DCIO_DVO_HSYNC_TRISTATE_MASK 0x20000
+#define DCIO_DEBUG1__DCO_DCIO_DVO_HSYNC_TRISTATE__SHIFT 0x11
+#define DCIO_DEBUG1__DCO_DCIO_DVO_CLK_TRISTATE_MASK 0x40000
+#define DCIO_DEBUG1__DCO_DCIO_DVO_CLK_TRISTATE__SHIFT 0x12
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN_PREMUX_MASK 0x80000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN_PREMUX__SHIFT 0x13
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN_MASK 0x100000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_EN__SHIFT 0x14
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_MUX_MASK 0x200000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_MUX__SHIFT 0x15
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_MASK_REG_MASK 0x400000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_MASK_REG__SHIFT 0x16
+#define DCIO_DEBUG1__DCO_DCIO_DVO_ENABLE_MASK 0x800000
+#define DCIO_DEBUG1__DCO_DCIO_DVO_ENABLE__SHIFT 0x17
+#define DCIO_DEBUG1__DCO_DCIO_DVO_VSYNC_TRISTATE_MASK 0x1000000
+#define DCIO_DEBUG1__DCO_DCIO_DVO_VSYNC_TRISTATE__SHIFT 0x18
+#define DCIO_DEBUG1__DCO_DCIO_DVO_RATE_SEL_MASK 0x2000000
+#define DCIO_DEBUG1__DCO_DCIO_DVO_RATE_SEL__SHIFT 0x19
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_SEL0_PREMUX_MASK 0x4000000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_SEL0_PREMUX__SHIFT 0x1a
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_SEL0_MASK 0x8000000
+#define DCIO_DEBUG1__DCO_DCIO_DVOCNTL1_SEL0__SHIFT 0x1b
+#define DCIO_DEBUG2__DCIO_DEBUG2_MASK 0xffffffff
+#define DCIO_DEBUG2__DCIO_DEBUG2__SHIFT 0x0
+#define DCIO_DEBUG3__DCIO_DEBUG3_MASK 0xffffffff
+#define DCIO_DEBUG3__DCIO_DEBUG3__SHIFT 0x0
+#define DCIO_DEBUG4__DCIO_DEBUG4_MASK 0xffffffff
+#define DCIO_DEBUG4__DCIO_DEBUG4__SHIFT 0x0
+#define DCIO_DEBUG5__DCIO_DEBUG5_MASK 0xffffffff
+#define DCIO_DEBUG5__DCIO_DEBUG5__SHIFT 0x0
+#define DCIO_DEBUG6__DCIO_DEBUG6_MASK 0xffffffff
+#define DCIO_DEBUG6__DCIO_DEBUG6__SHIFT 0x0
+#define DCIO_DEBUG7__DCIO_DEBUG7_MASK 0xffffffff
+#define DCIO_DEBUG7__DCIO_DEBUG7__SHIFT 0x0
+#define DCIO_DEBUG8__DCIO_DEBUG8_MASK 0xffffffff
+#define DCIO_DEBUG8__DCIO_DEBUG8__SHIFT 0x0
+#define DCIO_DEBUG9__DCIO_DEBUG9_MASK 0xffffffff
+#define DCIO_DEBUG9__DCIO_DEBUG9__SHIFT 0x0
+#define DCIO_DEBUGA__DCIO_DEBUGA_MASK 0xffffffff
+#define DCIO_DEBUGA__DCIO_DEBUGA__SHIFT 0x0
+#define DCIO_DEBUGB__DCIO_DEBUGB_MASK 0xffffffff
+#define DCIO_DEBUGB__DCIO_DEBUGB__SHIFT 0x0
+#define DCIO_DEBUGC__DCIO_DEBUGC_MASK 0xffffffff
+#define DCIO_DEBUGC__DCIO_DEBUGC__SHIFT 0x0
+#define DCIO_DEBUGD__DCIO_DEBUGD_MASK 0xffffffff
+#define DCIO_DEBUGD__DCIO_DEBUGD__SHIFT 0x0
+#define DCIO_DEBUGE__DCIO_DIGA_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUGE__DCIO_DIGA_DEBUG__SHIFT 0x0
+#define DCIO_DEBUGF__DCIO_DIGB_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUGF__DCIO_DIGB_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG10__DCIO_DIGC_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG10__DCIO_DIGC_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG11__DCIO_DIGD_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG11__DCIO_DIGD_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG12__DCIO_DIGE_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG12__DCIO_DIGE_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG13__DCIO_DIGF_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG13__DCIO_DIGF_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG14__DCIO_DIGG_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG14__DCIO_DIGG_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG15__DCIO_DEBUG15_MASK 0xffffffff
+#define DCIO_DEBUG15__DCIO_DEBUG15__SHIFT 0x0
+#define DCIO_DEBUG16__DCIO_DEBUG16_MASK 0xffffffff
+#define DCIO_DEBUG16__DCIO_DEBUG16__SHIFT 0x0
+#define DCIO_DEBUG17__DCIO_DEBUG17_MASK 0xffffffff
+#define DCIO_DEBUG17__DCIO_DEBUG17__SHIFT 0x0
+#define DCIO_DEBUG18__DCIO_DEBUG18_MASK 0xffffffff
+#define DCIO_DEBUG18__DCIO_DEBUG18__SHIFT 0x0
+#define DCIO_DEBUG19__DCIO_DIGLPA_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG19__DCIO_DIGLPA_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG1A__DCIO_DIGLPB_DEBUG_MASK 0xffffffff
+#define DCIO_DEBUG1A__DCIO_DIGLPB_DEBUG__SHIFT 0x0
+#define DCIO_DEBUG1B__DCIO_DEBUGHPD_MASK 0xffffffff
+#define DCIO_DEBUG1B__DCIO_DEBUGHPD__SHIFT 0x0
+#define DCIO_DEBUG1C__DCIO_DEBUG_UNIPHYA_CFG_MASK 0xffffffff
+#define DCIO_DEBUG1C__DCIO_DEBUG_UNIPHYA_CFG__SHIFT 0x0
+#define DCIO_DEBUG1D__DCIO_DEBUG_UNIPHYB_CFG_MASK 0xffffffff
+#define DCIO_DEBUG1D__DCIO_DEBUG_UNIPHYB_CFG__SHIFT 0x0
+#define DCIO_DEBUG1E__DCIO_DEBUG_UNIPHYC_CFG_MASK 0xffffffff
+#define DCIO_DEBUG1E__DCIO_DEBUG_UNIPHYC_CFG__SHIFT 0x0
+#define DCIO_DEBUG1F__DCIO_DEBUG_UNIPHYD_CFG_MASK 0xffffffff
+#define DCIO_DEBUG1F__DCIO_DEBUG_UNIPHYD_CFG__SHIFT 0x0
+#define DCIO_DEBUG20__DCIO_DEBUG_UNIPHYE_CFG_MASK 0xffffffff
+#define DCIO_DEBUG20__DCIO_DEBUG_UNIPHYE_CFG__SHIFT 0x0
+#define DCIO_DEBUG21__DCIO_DEBUG_UNIPHYF_CFG_MASK 0xffffffff
+#define DCIO_DEBUG21__DCIO_DEBUG_UNIPHYF_CFG__SHIFT 0x0
+#define DCIO_DEBUG22__DCIO_DEBUG_UNIPHYG_CFG_MASK 0xffffffff
+#define DCIO_DEBUG22__DCIO_DEBUG_UNIPHYG_CFG__SHIFT 0x0
+#define DCIO_DEBUG23__DCIO_DEBUG_UNIPHYLPA_CFG_MASK 0xffffffff
+#define DCIO_DEBUG23__DCIO_DEBUG_UNIPHYLPA_CFG__SHIFT 0x0
+#define DCIO_DEBUG24__DCIO_DEBUG_UNIPHYLPB_CFG_MASK 0xffffffff
+#define DCIO_DEBUG24__DCIO_DEBUG_UNIPHYLPB_CFG__SHIFT 0x0
+#define DCIO_DEBUG25__DCIO_DEBUG_DCRXPHY_CFG_MASK 0xffffffff
+#define DCIO_DEBUG25__DCIO_DEBUG_DCRXPHY_CFG__SHIFT 0x0
+#define DCIO_DEBUG26__DCIO_DEBUG_DPHY_CFG_MASK 0xffffffff
+#define DCIO_DEBUG26__DCIO_DEBUG_DPHY_CFG__SHIFT 0x0
+#define DCIO_DEBUG27__DCIO_DEBUG_DACA_CFG_MASK 0xffffffff
+#define DCIO_DEBUG27__DCIO_DEBUG_DACA_CFG__SHIFT 0x0
+#define DCIO_DEBUG28__DCIO_DEBUG_ZCAL_CFG_MASK 0xffffffff
+#define DCIO_DEBUG28__DCIO_DEBUG_ZCAL_CFG__SHIFT 0x0
+#define DCIO_DEBUG_ID__DCIO_DEBUG_ID_MASK 0xffffffff
+#define DCIO_DEBUG_ID__DCIO_DEBUG_ID__SHIFT 0x0
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_MASK_MASK 0x1
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_MASK__SHIFT 0x0
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_PD_DIS_MASK 0x2
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_PD_DIS__SHIFT 0x1
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_RECV_MASK 0x4
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_RECV__SHIFT 0x2
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_RECV1_MASK 0x8
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICA_RECV1__SHIFT 0x3
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_MASK_MASK 0x10
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_MASK__SHIFT 0x4
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_PD_DIS_MASK 0x20
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_PD_DIS__SHIFT 0x5
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_RECV_MASK 0x40
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_RECV__SHIFT 0x6
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_RECV1_MASK 0x80
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICB_RECV1__SHIFT 0x7
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_MASK_MASK 0x100
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_MASK__SHIFT 0x8
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_PD_DIS_MASK 0x200
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_PD_DIS__SHIFT 0x9
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_RECV_MASK 0x400
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_RECV__SHIFT 0xa
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_RECV1_MASK 0x800
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICC_RECV1__SHIFT 0xb
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_MASK_MASK 0x1000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_MASK__SHIFT 0xc
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_PD_DIS_MASK 0x2000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_PD_DIS__SHIFT 0xd
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_RECV_MASK 0x4000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_RECV__SHIFT 0xe
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_RECV1_MASK 0x8000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICD_RECV1__SHIFT 0xf
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_MASK_MASK 0x10000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_MASK__SHIFT 0x10
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_PD_DIS_MASK 0x20000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_PD_DIS__SHIFT 0x11
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_RECV_MASK 0x40000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_RECV__SHIFT 0x12
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_RECV1_MASK 0x80000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICE_RECV1__SHIFT 0x13
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_MASK_MASK 0x100000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_MASK__SHIFT 0x14
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_PD_DIS_MASK 0x200000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_PD_DIS__SHIFT 0x15
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_RECV_MASK 0x400000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_RECV__SHIFT 0x16
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_RECV1_MASK 0x800000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICF_RECV1__SHIFT 0x17
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_MASK_MASK 0x1000000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_MASK__SHIFT 0x18
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_PD_DIS_MASK 0x2000000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_PD_DIS__SHIFT 0x19
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_RECV_MASK 0x4000000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_RECV__SHIFT 0x1a
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_RECV1_MASK 0x8000000
+#define DC_GPIO_GENERIC_MASK__DC_GPIO_GENERICG_RECV1__SHIFT 0x1b
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK 0x1
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A__SHIFT 0x0
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK 0x100
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A__SHIFT 0x8
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK 0x10000
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A__SHIFT 0x10
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK 0x100000
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A__SHIFT 0x14
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK 0x200000
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A__SHIFT 0x15
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK 0x400000
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A__SHIFT 0x16
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK 0x800000
+#define DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A__SHIFT 0x17
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICA_EN_MASK 0x1
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICA_EN__SHIFT 0x0
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICB_EN_MASK 0x100
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICB_EN__SHIFT 0x8
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICC_EN_MASK 0x10000
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICC_EN__SHIFT 0x10
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICD_EN_MASK 0x100000
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICD_EN__SHIFT 0x14
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICE_EN_MASK 0x200000
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICE_EN__SHIFT 0x15
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICF_EN_MASK 0x400000
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICF_EN__SHIFT 0x16
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICG_EN_MASK 0x800000
+#define DC_GPIO_GENERIC_EN__DC_GPIO_GENERICG_EN__SHIFT 0x17
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICA_Y_MASK 0x1
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICA_Y__SHIFT 0x0
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICB_Y_MASK 0x100
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICB_Y__SHIFT 0x8
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICC_Y_MASK 0x10000
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICC_Y__SHIFT 0x10
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICD_Y_MASK 0x100000
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICD_Y__SHIFT 0x14
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICE_Y_MASK 0x200000
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICE_Y__SHIFT 0x15
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICF_Y_MASK 0x400000
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICF_Y__SHIFT 0x16
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICG_Y_MASK 0x800000
+#define DC_GPIO_GENERIC_Y__DC_GPIO_GENERICG_Y__SHIFT 0x17
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC1_MASK__AUX_PAD1_MODE_MASK 0x10000
+#define DC_GPIO_DDC1_MASK__AUX_PAD1_MODE__SHIFT 0x10
+#define DC_GPIO_DDC1_MASK__AUX1_POL_MASK 0x100000
+#define DC_GPIO_DDC1_MASK__AUX1_POL__SHIFT 0x14
+#define DC_GPIO_DDC1_MASK__ALLOW_HW_DDC1_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC1_MASK__ALLOW_HW_DDC1_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC1_MASK__DC_GPIO_DDC1DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC1_A__DC_GPIO_DDC1CLK_A_MASK 0x1
+#define DC_GPIO_DDC1_A__DC_GPIO_DDC1CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC1_A__DC_GPIO_DDC1DATA_A_MASK 0x100
+#define DC_GPIO_DDC1_A__DC_GPIO_DDC1DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC1_EN__DC_GPIO_DDC1CLK_EN_MASK 0x1
+#define DC_GPIO_DDC1_EN__DC_GPIO_DDC1CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC1_EN__DC_GPIO_DDC1DATA_EN_MASK 0x100
+#define DC_GPIO_DDC1_EN__DC_GPIO_DDC1DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC1_Y__DC_GPIO_DDC1CLK_Y_MASK 0x1
+#define DC_GPIO_DDC1_Y__DC_GPIO_DDC1CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC1_Y__DC_GPIO_DDC1DATA_Y_MASK 0x100
+#define DC_GPIO_DDC1_Y__DC_GPIO_DDC1DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC2_MASK__AUX_PAD2_MODE_MASK 0x10000
+#define DC_GPIO_DDC2_MASK__AUX_PAD2_MODE__SHIFT 0x10
+#define DC_GPIO_DDC2_MASK__AUX2_POL_MASK 0x100000
+#define DC_GPIO_DDC2_MASK__AUX2_POL__SHIFT 0x14
+#define DC_GPIO_DDC2_MASK__ALLOW_HW_DDC2_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC2_MASK__ALLOW_HW_DDC2_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC2_MASK__DC_GPIO_DDC2DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC2_A__DC_GPIO_DDC2CLK_A_MASK 0x1
+#define DC_GPIO_DDC2_A__DC_GPIO_DDC2CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC2_A__DC_GPIO_DDC2DATA_A_MASK 0x100
+#define DC_GPIO_DDC2_A__DC_GPIO_DDC2DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC2_EN__DC_GPIO_DDC2CLK_EN_MASK 0x1
+#define DC_GPIO_DDC2_EN__DC_GPIO_DDC2CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC2_EN__DC_GPIO_DDC2DATA_EN_MASK 0x100
+#define DC_GPIO_DDC2_EN__DC_GPIO_DDC2DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC2_Y__DC_GPIO_DDC2CLK_Y_MASK 0x1
+#define DC_GPIO_DDC2_Y__DC_GPIO_DDC2CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC2_Y__DC_GPIO_DDC2DATA_Y_MASK 0x100
+#define DC_GPIO_DDC2_Y__DC_GPIO_DDC2DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC3_MASK__AUX_PAD3_MODE_MASK 0x10000
+#define DC_GPIO_DDC3_MASK__AUX_PAD3_MODE__SHIFT 0x10
+#define DC_GPIO_DDC3_MASK__AUX3_POL_MASK 0x100000
+#define DC_GPIO_DDC3_MASK__AUX3_POL__SHIFT 0x14
+#define DC_GPIO_DDC3_MASK__ALLOW_HW_DDC3_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC3_MASK__ALLOW_HW_DDC3_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC3_MASK__DC_GPIO_DDC3DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC3_A__DC_GPIO_DDC3CLK_A_MASK 0x1
+#define DC_GPIO_DDC3_A__DC_GPIO_DDC3CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC3_A__DC_GPIO_DDC3DATA_A_MASK 0x100
+#define DC_GPIO_DDC3_A__DC_GPIO_DDC3DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC3_EN__DC_GPIO_DDC3CLK_EN_MASK 0x1
+#define DC_GPIO_DDC3_EN__DC_GPIO_DDC3CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC3_EN__DC_GPIO_DDC3DATA_EN_MASK 0x100
+#define DC_GPIO_DDC3_EN__DC_GPIO_DDC3DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC3_Y__DC_GPIO_DDC3CLK_Y_MASK 0x1
+#define DC_GPIO_DDC3_Y__DC_GPIO_DDC3CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC3_Y__DC_GPIO_DDC3DATA_Y_MASK 0x100
+#define DC_GPIO_DDC3_Y__DC_GPIO_DDC3DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC4_MASK__AUX_PAD4_MODE_MASK 0x10000
+#define DC_GPIO_DDC4_MASK__AUX_PAD4_MODE__SHIFT 0x10
+#define DC_GPIO_DDC4_MASK__AUX4_POL_MASK 0x100000
+#define DC_GPIO_DDC4_MASK__AUX4_POL__SHIFT 0x14
+#define DC_GPIO_DDC4_MASK__ALLOW_HW_DDC4_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC4_MASK__ALLOW_HW_DDC4_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC4_MASK__DC_GPIO_DDC4DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC4_A__DC_GPIO_DDC4CLK_A_MASK 0x1
+#define DC_GPIO_DDC4_A__DC_GPIO_DDC4CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC4_A__DC_GPIO_DDC4DATA_A_MASK 0x100
+#define DC_GPIO_DDC4_A__DC_GPIO_DDC4DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC4_EN__DC_GPIO_DDC4CLK_EN_MASK 0x1
+#define DC_GPIO_DDC4_EN__DC_GPIO_DDC4CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC4_EN__DC_GPIO_DDC4DATA_EN_MASK 0x100
+#define DC_GPIO_DDC4_EN__DC_GPIO_DDC4DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC4_Y__DC_GPIO_DDC4CLK_Y_MASK 0x1
+#define DC_GPIO_DDC4_Y__DC_GPIO_DDC4CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC4_Y__DC_GPIO_DDC4DATA_Y_MASK 0x100
+#define DC_GPIO_DDC4_Y__DC_GPIO_DDC4DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC5_MASK__AUX_PAD5_MODE_MASK 0x10000
+#define DC_GPIO_DDC5_MASK__AUX_PAD5_MODE__SHIFT 0x10
+#define DC_GPIO_DDC5_MASK__AUX5_POL_MASK 0x100000
+#define DC_GPIO_DDC5_MASK__AUX5_POL__SHIFT 0x14
+#define DC_GPIO_DDC5_MASK__ALLOW_HW_DDC5_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC5_MASK__ALLOW_HW_DDC5_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC5_MASK__DC_GPIO_DDC5DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC5_A__DC_GPIO_DDC5CLK_A_MASK 0x1
+#define DC_GPIO_DDC5_A__DC_GPIO_DDC5CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC5_A__DC_GPIO_DDC5DATA_A_MASK 0x100
+#define DC_GPIO_DDC5_A__DC_GPIO_DDC5DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC5_EN__DC_GPIO_DDC5CLK_EN_MASK 0x1
+#define DC_GPIO_DDC5_EN__DC_GPIO_DDC5CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC5_EN__DC_GPIO_DDC5DATA_EN_MASK 0x100
+#define DC_GPIO_DDC5_EN__DC_GPIO_DDC5DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC5_Y__DC_GPIO_DDC5CLK_Y_MASK 0x1
+#define DC_GPIO_DDC5_Y__DC_GPIO_DDC5CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC5_Y__DC_GPIO_DDC5DATA_Y_MASK 0x100
+#define DC_GPIO_DDC5_Y__DC_GPIO_DDC5DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_MASK_MASK 0x1
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_PD_EN_MASK 0x10
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_PD_EN__SHIFT 0x4
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_RECV_MASK 0x40
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_RECV1_MASK 0x80
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_MASK_MASK 0x100
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_RECV_MASK 0x4000
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDC6_MASK__AUX_PAD6_MODE_MASK 0x10000
+#define DC_GPIO_DDC6_MASK__AUX_PAD6_MODE__SHIFT 0x10
+#define DC_GPIO_DDC6_MASK__AUX6_POL_MASK 0x100000
+#define DC_GPIO_DDC6_MASK__AUX6_POL__SHIFT 0x14
+#define DC_GPIO_DDC6_MASK__ALLOW_HW_DDC6_PD_EN_MASK 0x400000
+#define DC_GPIO_DDC6_MASK__ALLOW_HW_DDC6_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_STR_MASK 0xf000000
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6CLK_STR__SHIFT 0x18
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDC6_MASK__DC_GPIO_DDC6DATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A_MASK 0x1
+#define DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A__SHIFT 0x0
+#define DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A_MASK 0x100
+#define DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A__SHIFT 0x8
+#define DC_GPIO_DDC6_EN__DC_GPIO_DDC6CLK_EN_MASK 0x1
+#define DC_GPIO_DDC6_EN__DC_GPIO_DDC6CLK_EN__SHIFT 0x0
+#define DC_GPIO_DDC6_EN__DC_GPIO_DDC6DATA_EN_MASK 0x100
+#define DC_GPIO_DDC6_EN__DC_GPIO_DDC6DATA_EN__SHIFT 0x8
+#define DC_GPIO_DDC6_Y__DC_GPIO_DDC6CLK_Y_MASK 0x1
+#define DC_GPIO_DDC6_Y__DC_GPIO_DDC6CLK_Y__SHIFT 0x0
+#define DC_GPIO_DDC6_Y__DC_GPIO_DDC6DATA_Y_MASK 0x100
+#define DC_GPIO_DDC6_Y__DC_GPIO_DDC6DATA_Y__SHIFT 0x8
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_MASK_MASK 0x1
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_MASK__SHIFT 0x0
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_RECV_MASK 0x40
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_RECV__SHIFT 0x6
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_RECV1_MASK 0x80
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_RECV1__SHIFT 0x7
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_MASK_MASK 0x100
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_MASK__SHIFT 0x8
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_PD_EN_MASK 0x1000
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_PD_EN__SHIFT 0xc
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_RECV_MASK 0x4000
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_RECV__SHIFT 0xe
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_RECV1_MASK 0x8000
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_RECV1__SHIFT 0xf
+#define DC_GPIO_DDCVGA_MASK__AUX_PADVGA_MODE_MASK 0x10000
+#define DC_GPIO_DDCVGA_MASK__AUX_PADVGA_MODE__SHIFT 0x10
+#define DC_GPIO_DDCVGA_MASK__AUXVGA_POL_MASK 0x100000
+#define DC_GPIO_DDCVGA_MASK__AUXVGA_POL__SHIFT 0x14
+#define DC_GPIO_DDCVGA_MASK__ALLOW_HW_DDCVGA_PD_EN_MASK 0x400000
+#define DC_GPIO_DDCVGA_MASK__ALLOW_HW_DDCVGA_PD_EN__SHIFT 0x16
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_STR_MASK 0xf000000
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGACLK_STR__SHIFT 0x18
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_STR_MASK 0xf0000000
+#define DC_GPIO_DDCVGA_MASK__DC_GPIO_DDCVGADATA_STR__SHIFT 0x1c
+#define DC_GPIO_DDCVGA_A__DC_GPIO_DDCVGACLK_A_MASK 0x1
+#define DC_GPIO_DDCVGA_A__DC_GPIO_DDCVGACLK_A__SHIFT 0x0
+#define DC_GPIO_DDCVGA_A__DC_GPIO_DDCVGADATA_A_MASK 0x100
+#define DC_GPIO_DDCVGA_A__DC_GPIO_DDCVGADATA_A__SHIFT 0x8
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGACLK_EN_MASK 0x1
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGACLK_EN__SHIFT 0x0
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_EN_MASK 0x100
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_EN__SHIFT 0x8
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RXSEL_MASK 0x30000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RXSEL__SHIFT 0x10
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPARE_MASK 0xc0000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPARE__SHIFT 0x12
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_BIASCRTEN_MASK 0x100000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_BIASCRTEN__SHIFT 0x14
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_CSEL0P9_MASK 0x200000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_CSEL0P9__SHIFT 0x15
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_CSEL1P1_MASK 0x400000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_CSEL1P1__SHIFT 0x16
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_COMPSEL_MASK 0x800000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_COMPSEL__SHIFT 0x17
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RSEL0P9_MASK 0x1000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RSEL0P9__SHIFT 0x18
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RSEL1P1_MASK 0x2000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RSEL1P1__SHIFT 0x19
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPIKERCEN_MASK 0x4000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPIKERCEN__SHIFT 0x1a
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPIKERCSEL_MASK 0x8000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SPIKERCSEL__SHIFT 0x1b
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_FALLSLEWSEL_MASK 0x30000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_FALLSLEWSEL__SHIFT 0x1c
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RESBIASEN_MASK 0x40000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_RESBIASEN__SHIFT 0x1e
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SLEWN_MASK 0x80000000
+#define DC_GPIO_DDCVGA_EN__DC_GPIO_DDCVGADATA_PAD_SLEWN__SHIFT 0x1f
+#define DC_GPIO_DDCVGA_Y__DC_GPIO_DDCVGACLK_Y_MASK 0x1
+#define DC_GPIO_DDCVGA_Y__DC_GPIO_DDCVGACLK_Y__SHIFT 0x0
+#define DC_GPIO_DDCVGA_Y__DC_GPIO_DDCVGADATA_Y_MASK 0x100
+#define DC_GPIO_DDCVGA_Y__DC_GPIO_DDCVGADATA_Y__SHIFT 0x8
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_MASK_MASK 0x1
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_MASK__SHIFT 0x0
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_PD_DIS_MASK 0x10
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_PD_DIS__SHIFT 0x4
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_RECV_MASK 0x40
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_RECV__SHIFT 0x6
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_RECV1_MASK 0x80
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_RECV1__SHIFT 0x7
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_MASK_MASK 0x100
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_MASK__SHIFT 0x8
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_PD_DIS_MASK 0x1000
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_PD_DIS__SHIFT 0xc
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_RECV_MASK 0x4000
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_RECV__SHIFT 0xe
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_RECV1_MASK 0x8000
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_RECV1__SHIFT 0xf
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_CRTC_HSYNC_MASK_MASK 0x7000000
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_HSYNCA_CRTC_HSYNC_MASK__SHIFT 0x18
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_CRTC_VSYNC_MASK_MASK 0x70000000
+#define DC_GPIO_SYNCA_MASK__DC_GPIO_VSYNCA_CRTC_VSYNC_MASK__SHIFT 0x1c
+#define DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK 0x1
+#define DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A__SHIFT 0x0
+#define DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK 0x100
+#define DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A__SHIFT 0x8
+#define DC_GPIO_SYNCA_EN__DC_GPIO_HSYNCA_EN_MASK 0x1
+#define DC_GPIO_SYNCA_EN__DC_GPIO_HSYNCA_EN__SHIFT 0x0
+#define DC_GPIO_SYNCA_EN__DC_GPIO_VSYNCA_EN_MASK 0x100
+#define DC_GPIO_SYNCA_EN__DC_GPIO_VSYNCA_EN__SHIFT 0x8
+#define DC_GPIO_SYNCA_Y__DC_GPIO_HSYNCA_Y_MASK 0x1
+#define DC_GPIO_SYNCA_Y__DC_GPIO_HSYNCA_Y__SHIFT 0x0
+#define DC_GPIO_SYNCA_Y__DC_GPIO_VSYNCA_Y_MASK 0x100
+#define DC_GPIO_SYNCA_Y__DC_GPIO_VSYNCA_Y__SHIFT 0x8
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_MASK_MASK 0x1
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_MASK__SHIFT 0x0
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_PD_DIS_MASK 0x2
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_PD_DIS__SHIFT 0x1
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_RECV_MASK 0x4
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_RECV__SHIFT 0x2
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_PU_EN_MASK 0x8
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_PU_EN__SHIFT 0x3
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_RECV1_MASK 0x10
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_CLK_RECV1__SHIFT 0x4
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_RECV1_MASK 0x20
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_RECV1__SHIFT 0x5
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_MASK_MASK 0x100
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_MASK__SHIFT 0x8
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_PD_DIS_MASK 0x200
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_PD_DIS__SHIFT 0x9
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_RECV_MASK 0x400
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_RECV__SHIFT 0xa
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_PU_EN_MASK 0x800
+#define DC_GPIO_GENLK_MASK__DC_GPIO_GENLK_VSYNC_PU_EN__SHIFT 0xb
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_MASK_MASK 0x10000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_MASK__SHIFT 0x10
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_PD_DIS_MASK 0x20000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_PD_DIS__SHIFT 0x11
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_RECV_MASK 0x40000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_RECV__SHIFT 0x12
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_PU_EN_MASK 0x80000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_PU_EN__SHIFT 0x13
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_RECV1_MASK 0x100000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_A_RECV1__SHIFT 0x14
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_RECV1_MASK 0x800000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_RECV1__SHIFT 0x17
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_MASK_MASK 0x1000000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_MASK__SHIFT 0x18
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_PD_DIS_MASK 0x2000000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_PD_DIS__SHIFT 0x19
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_RECV_MASK 0x4000000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_RECV__SHIFT 0x1a
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_PU_EN_MASK 0x8000000
+#define DC_GPIO_GENLK_MASK__DC_GPIO_SWAPLOCK_B_PU_EN__SHIFT 0x1b
+#define DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK 0x1
+#define DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A__SHIFT 0x0
+#define DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK 0x100
+#define DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A__SHIFT 0x8
+#define DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK 0x10000
+#define DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A__SHIFT 0x10
+#define DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK 0x1000000
+#define DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A__SHIFT 0x18
+#define DC_GPIO_GENLK_EN__DC_GPIO_GENLK_CLK_EN_MASK 0x1
+#define DC_GPIO_GENLK_EN__DC_GPIO_GENLK_CLK_EN__SHIFT 0x0
+#define DC_GPIO_GENLK_EN__DC_GPIO_GENLK_VSYNC_EN_MASK 0x100
+#define DC_GPIO_GENLK_EN__DC_GPIO_GENLK_VSYNC_EN__SHIFT 0x8
+#define DC_GPIO_GENLK_EN__DC_GPIO_SWAPLOCK_A_EN_MASK 0x10000
+#define DC_GPIO_GENLK_EN__DC_GPIO_SWAPLOCK_A_EN__SHIFT 0x10
+#define DC_GPIO_GENLK_EN__DC_GPIO_SWAPLOCK_B_EN_MASK 0x1000000
+#define DC_GPIO_GENLK_EN__DC_GPIO_SWAPLOCK_B_EN__SHIFT 0x18
+#define DC_GPIO_GENLK_Y__DC_GPIO_GENLK_CLK_Y_MASK 0x1
+#define DC_GPIO_GENLK_Y__DC_GPIO_GENLK_CLK_Y__SHIFT 0x0
+#define DC_GPIO_GENLK_Y__DC_GPIO_GENLK_VSYNC_Y_MASK 0x100
+#define DC_GPIO_GENLK_Y__DC_GPIO_GENLK_VSYNC_Y__SHIFT 0x8
+#define DC_GPIO_GENLK_Y__DC_GPIO_SWAPLOCK_A_Y_MASK 0x10000
+#define DC_GPIO_GENLK_Y__DC_GPIO_SWAPLOCK_A_Y__SHIFT 0x10
+#define DC_GPIO_GENLK_Y__DC_GPIO_SWAPLOCK_B_Y_MASK 0x1000000
+#define DC_GPIO_GENLK_Y__DC_GPIO_SWAPLOCK_B_Y__SHIFT 0x18
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_MASK_MASK 0x1
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_MASK__SHIFT 0x0
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_MASK_MASK 0x2
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_MASK__SHIFT 0x1
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_PD_DIS_MASK 0x4
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_PD_DIS__SHIFT 0x2
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_RECV_MASK 0x8
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_RECV__SHIFT 0x3
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_PD_DIS_MASK 0x10
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_PD_DIS__SHIFT 0x4
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_RECV1_MASK 0x20
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_RECV1__SHIFT 0x5
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_RECV_MASK 0x40
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD1_RECV__SHIFT 0x6
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_RECV1_MASK 0x80
+#define DC_GPIO_HPD_MASK__DC_GPIO_RX_HPD_RECV1__SHIFT 0x7
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_MASK_MASK 0x100
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_MASK__SHIFT 0x8
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_PD_DIS_MASK 0x200
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_PD_DIS__SHIFT 0x9
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_RECV_MASK 0x400
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_RECV__SHIFT 0xa
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_RECV1_MASK 0x800
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD2_RECV1__SHIFT 0xb
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_MASK_MASK 0x10000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_MASK__SHIFT 0x10
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_PD_DIS_MASK 0x20000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_PD_DIS__SHIFT 0x11
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_RECV_MASK 0x40000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_RECV__SHIFT 0x12
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_RECV1_MASK 0x80000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD3_RECV1__SHIFT 0x13
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_MASK_MASK 0x100000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_MASK__SHIFT 0x14
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_PD_DIS_MASK 0x200000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_PD_DIS__SHIFT 0x15
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_RECV_MASK 0x400000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_RECV__SHIFT 0x16
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_RECV1_MASK 0x800000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD4_RECV1__SHIFT 0x17
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_MASK_MASK 0x1000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_MASK__SHIFT 0x18
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_PD_DIS_MASK 0x2000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_PD_DIS__SHIFT 0x19
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_RECV_MASK 0x4000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_RECV__SHIFT 0x1a
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_RECV1_MASK 0x8000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD5_RECV1__SHIFT 0x1b
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_MASK_MASK 0x10000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_MASK__SHIFT 0x1c
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_PD_DIS_MASK 0x20000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_PD_DIS__SHIFT 0x1d
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_RECV_MASK 0x40000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_RECV__SHIFT 0x1e
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_RECV1_MASK 0x80000000
+#define DC_GPIO_HPD_MASK__DC_GPIO_HPD6_RECV1__SHIFT 0x1f
+#define DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK 0x1
+#define DC_GPIO_HPD_A__DC_GPIO_HPD1_A__SHIFT 0x0
+#define DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK 0x100
+#define DC_GPIO_HPD_A__DC_GPIO_HPD2_A__SHIFT 0x8
+#define DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK 0x10000
+#define DC_GPIO_HPD_A__DC_GPIO_HPD3_A__SHIFT 0x10
+#define DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK 0x1000000
+#define DC_GPIO_HPD_A__DC_GPIO_HPD4_A__SHIFT 0x18
+#define DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK 0x4000000
+#define DC_GPIO_HPD_A__DC_GPIO_HPD5_A__SHIFT 0x1a
+#define DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK 0x10000000
+#define DC_GPIO_HPD_A__DC_GPIO_HPD6_A__SHIFT 0x1c
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD1_EN_MASK 0x1
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD1_EN__SHIFT 0x0
+#define DC_GPIO_HPD_EN__HPD1_SCHMEN_PI_MASK 0x2
+#define DC_GPIO_HPD_EN__HPD1_SCHMEN_PI__SHIFT 0x1
+#define DC_GPIO_HPD_EN__HPD1_SLEWNCORE_MASK 0x4
+#define DC_GPIO_HPD_EN__HPD1_SLEWNCORE__SHIFT 0x2
+#define DC_GPIO_HPD_EN__RX_HPD_SCHMEN_PI_MASK 0x8
+#define DC_GPIO_HPD_EN__RX_HPD_SCHMEN_PI__SHIFT 0x3
+#define DC_GPIO_HPD_EN__RX_HPD_SLEWNCORE_MASK 0x10
+#define DC_GPIO_HPD_EN__RX_HPD_SLEWNCORE__SHIFT 0x4
+#define DC_GPIO_HPD_EN__HPD12_SPARE0_MASK 0x20
+#define DC_GPIO_HPD_EN__HPD12_SPARE0__SHIFT 0x5
+#define DC_GPIO_HPD_EN__HPD1_SEL0_MASK 0x40
+#define DC_GPIO_HPD_EN__HPD1_SEL0__SHIFT 0x6
+#define DC_GPIO_HPD_EN__RX_HPD_SEL0_MASK 0x80
+#define DC_GPIO_HPD_EN__RX_HPD_SEL0__SHIFT 0x7
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD2_EN_MASK 0x100
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD2_EN__SHIFT 0x8
+#define DC_GPIO_HPD_EN__HPD2_SCHMEN_PI_MASK 0x200
+#define DC_GPIO_HPD_EN__HPD2_SCHMEN_PI__SHIFT 0x9
+#define DC_GPIO_HPD_EN__HPD12_SPARE1_MASK 0x400
+#define DC_GPIO_HPD_EN__HPD12_SPARE1__SHIFT 0xa
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD3_EN_MASK 0x10000
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD3_EN__SHIFT 0x10
+#define DC_GPIO_HPD_EN__HPD3_SCHMEN_PI_MASK 0x20000
+#define DC_GPIO_HPD_EN__HPD3_SCHMEN_PI__SHIFT 0x11
+#define DC_GPIO_HPD_EN__HPD34_SPARE0_MASK 0x40000
+#define DC_GPIO_HPD_EN__HPD34_SPARE0__SHIFT 0x12
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD4_EN_MASK 0x100000
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD4_EN__SHIFT 0x14
+#define DC_GPIO_HPD_EN__HPD4_SCHMEN_PI_MASK 0x200000
+#define DC_GPIO_HPD_EN__HPD4_SCHMEN_PI__SHIFT 0x15
+#define DC_GPIO_HPD_EN__HPD34_SPARE1_MASK 0x400000
+#define DC_GPIO_HPD_EN__HPD34_SPARE1__SHIFT 0x16
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD5_EN_MASK 0x1000000
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD5_EN__SHIFT 0x18
+#define DC_GPIO_HPD_EN__HPD5_SCHMEN_PI_MASK 0x2000000
+#define DC_GPIO_HPD_EN__HPD5_SCHMEN_PI__SHIFT 0x19
+#define DC_GPIO_HPD_EN__HPD56_SPARE0_MASK 0x4000000
+#define DC_GPIO_HPD_EN__HPD56_SPARE0__SHIFT 0x1a
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD6_EN_MASK 0x10000000
+#define DC_GPIO_HPD_EN__DC_GPIO_HPD6_EN__SHIFT 0x1c
+#define DC_GPIO_HPD_EN__HPD6_SCHMEN_PI_MASK 0x20000000
+#define DC_GPIO_HPD_EN__HPD6_SCHMEN_PI__SHIFT 0x1d
+#define DC_GPIO_HPD_EN__HPD56_SPARE1_MASK 0x40000000
+#define DC_GPIO_HPD_EN__HPD56_SPARE1__SHIFT 0x1e
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD1_Y_MASK 0x1
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD1_Y__SHIFT 0x0
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD2_Y_MASK 0x100
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD2_Y__SHIFT 0x8
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD3_Y_MASK 0x10000
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD3_Y__SHIFT 0x10
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD4_Y_MASK 0x1000000
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD4_Y__SHIFT 0x18
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD5_Y_MASK 0x4000000
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD5_Y__SHIFT 0x1a
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD6_Y_MASK 0x10000000
+#define DC_GPIO_HPD_Y__DC_GPIO_HPD6_Y__SHIFT 0x1c
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_MASK_MASK 0x1
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_MASK__SHIFT 0x0
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_PD_DIS_MASK 0x10
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_PD_DIS__SHIFT 0x4
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_RECV_MASK 0x40
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_RECV__SHIFT 0x6
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_RECV1_MASK 0x80
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_BLON_RECV1__SHIFT 0x7
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_MASK_MASK 0x100
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_MASK__SHIFT 0x8
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_PD_DIS_MASK 0x1000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_PD_DIS__SHIFT 0xc
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_RECV_MASK 0x4000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_RECV__SHIFT 0xe
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_RECV1_MASK 0x8000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_DIGON_RECV1__SHIFT 0xf
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_MASK_MASK 0x10000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_MASK__SHIFT 0x10
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_PD_DIS_MASK 0x100000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_PD_DIS__SHIFT 0x14
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_RECV_MASK 0x400000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_RECV__SHIFT 0x16
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_RECV1_MASK 0x800000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_ENA_BL_RECV1__SHIFT 0x17
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_MASK_MASK 0x1000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_MASK__SHIFT 0x18
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_PD_DIS_MASK 0x2000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_PD_DIS__SHIFT 0x19
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_RECV_MASK 0x4000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_RECV__SHIFT 0x1a
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_RECV1_MASK 0x8000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_VSYNC_IN_RECV1__SHIFT 0x1b
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_MASK_MASK 0x10000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_MASK__SHIFT 0x1c
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_PD_DIS_MASK 0x20000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_PD_DIS__SHIFT 0x1d
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_RECV_MASK 0x40000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_RECV__SHIFT 0x1e
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_RECV1_MASK 0x80000000
+#define DC_GPIO_PWRSEQ_MASK__DC_GPIO_HSYNC_IN_RECV1__SHIFT 0x1f
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_BLON_A_MASK 0x1
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_BLON_A__SHIFT 0x0
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_DIGON_A_MASK 0x100
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_DIGON_A__SHIFT 0x8
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_ENA_BL_A_MASK 0x10000
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_ENA_BL_A__SHIFT 0x10
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_VSYNC_IN_A_MASK 0x1000000
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_VSYNC_IN_A__SHIFT 0x18
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_HSYNC_IN_A_MASK 0x80000000
+#define DC_GPIO_PWRSEQ_A__DC_GPIO_HSYNC_IN_A__SHIFT 0x1f
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_BLON_EN_MASK 0x1
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_BLON_EN__SHIFT 0x0
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_VARY_BL_GENERICA_EN_MASK 0x2
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_VARY_BL_GENERICA_EN__SHIFT 0x1
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_DIGON_EN_MASK 0x100
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_DIGON_EN__SHIFT 0x8
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_ENA_BL_EN_MASK 0x10000
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_ENA_BL_EN__SHIFT 0x10
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_VSYNC_IN_EN_MASK 0x1000000
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_VSYNC_IN_EN__SHIFT 0x18
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_HSYNC_IN_EN_MASK 0x80000000
+#define DC_GPIO_PWRSEQ_EN__DC_GPIO_HSYNC_IN_EN__SHIFT 0x1f
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_BLON_Y_MASK 0x1
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_BLON_Y__SHIFT 0x0
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_DIGON_Y_MASK 0x100
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_DIGON_Y__SHIFT 0x8
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_ENA_BL_Y_MASK 0x10000
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_ENA_BL_Y__SHIFT 0x10
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_VSYNC_IN_MASK 0x1000000
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_VSYNC_IN__SHIFT 0x18
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_HSYNC_IN_MASK 0x80000000
+#define DC_GPIO_PWRSEQ_Y__DC_GPIO_HSYNC_IN__SHIFT 0x1f
+#define DC_GPIO_PAD_STRENGTH_1__GENLK_STRENGTH_SN_MASK 0xf
+#define DC_GPIO_PAD_STRENGTH_1__GENLK_STRENGTH_SN__SHIFT 0x0
+#define DC_GPIO_PAD_STRENGTH_1__GENLK_STRENGTH_SP_MASK 0xf0
+#define DC_GPIO_PAD_STRENGTH_1__GENLK_STRENGTH_SP__SHIFT 0x4
+#define DC_GPIO_PAD_STRENGTH_1__RX_HPD_STRENGTH_SN_MASK 0xf00
+#define DC_GPIO_PAD_STRENGTH_1__RX_HPD_STRENGTH_SN__SHIFT 0x8
+#define DC_GPIO_PAD_STRENGTH_1__RX_HPD_STRENGTH_SP_MASK 0xf000
+#define DC_GPIO_PAD_STRENGTH_1__RX_HPD_STRENGTH_SP__SHIFT 0xc
+#define DC_GPIO_PAD_STRENGTH_1__TX_HPD_STRENGTH_SN_MASK 0xf0000
+#define DC_GPIO_PAD_STRENGTH_1__TX_HPD_STRENGTH_SN__SHIFT 0x10
+#define DC_GPIO_PAD_STRENGTH_1__TX_HPD_STRENGTH_SP_MASK 0xf00000
+#define DC_GPIO_PAD_STRENGTH_1__TX_HPD_STRENGTH_SP__SHIFT 0x14
+#define DC_GPIO_PAD_STRENGTH_1__SYNC_STRENGTH_SN_MASK 0xf000000
+#define DC_GPIO_PAD_STRENGTH_1__SYNC_STRENGTH_SN__SHIFT 0x18
+#define DC_GPIO_PAD_STRENGTH_1__SYNC_STRENGTH_SP_MASK 0xf0000000
+#define DC_GPIO_PAD_STRENGTH_1__SYNC_STRENGTH_SP__SHIFT 0x1c
+#define DC_GPIO_PAD_STRENGTH_2__STRENGTH_SN_MASK 0xf
+#define DC_GPIO_PAD_STRENGTH_2__STRENGTH_SN__SHIFT 0x0
+#define DC_GPIO_PAD_STRENGTH_2__STRENGTH_SP_MASK 0xf0
+#define DC_GPIO_PAD_STRENGTH_2__STRENGTH_SP__SHIFT 0x4
+#define DC_GPIO_PAD_STRENGTH_2__EXT_RESET_DRVSTRENGTH_MASK 0x700
+#define DC_GPIO_PAD_STRENGTH_2__EXT_RESET_DRVSTRENGTH__SHIFT 0x8
+#define DC_GPIO_PAD_STRENGTH_2__REF_27_DRVSTRENGTH_MASK 0x7000
+#define DC_GPIO_PAD_STRENGTH_2__REF_27_DRVSTRENGTH__SHIFT 0xc
+#define DC_GPIO_PAD_STRENGTH_2__PWRSEQ_STRENGTH_SN_MASK 0xf0000
+#define DC_GPIO_PAD_STRENGTH_2__PWRSEQ_STRENGTH_SN__SHIFT 0x10
+#define DC_GPIO_PAD_STRENGTH_2__PWRSEQ_STRENGTH_SP_MASK 0xf00000
+#define DC_GPIO_PAD_STRENGTH_2__PWRSEQ_STRENGTH_SP__SHIFT 0x14
+#define DC_GPIO_PAD_STRENGTH_2__REF_27_SRC_SEL_MASK 0xc0000000
+#define DC_GPIO_PAD_STRENGTH_2__REF_27_SRC_SEL__SHIFT 0x1e
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_SLEWN_MASK 0x1
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_SLEWN__SHIFT 0x0
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_WAKE_MASK 0x2
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_WAKE__SHIFT 0x1
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_RXSEL_MASK 0x4
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_RXSEL__SHIFT 0x2
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_MODE_MASK 0x8
+#define PHY_AUX_CNTL__AUXSLAVE_PAD_MODE__SHIFT 0x3
+#define PHY_AUX_CNTL__DDCSLAVE_DATA_PD_EN_MASK 0x10
+#define PHY_AUX_CNTL__DDCSLAVE_DATA_PD_EN__SHIFT 0x4
+#define PHY_AUX_CNTL__DDCSLAVE_DATA_EN_MASK 0x20
+#define PHY_AUX_CNTL__DDCSLAVE_DATA_EN__SHIFT 0x5
+#define PHY_AUX_CNTL__DDCSLAVE_CLK_PD_EN_MASK 0x40
+#define PHY_AUX_CNTL__DDCSLAVE_CLK_PD_EN__SHIFT 0x6
+#define PHY_AUX_CNTL__DDCSLAVE_CLK_EN_MASK 0x80
+#define PHY_AUX_CNTL__DDCSLAVE_CLK_EN__SHIFT 0x7
+#define PHY_AUX_CNTL__AUX_PAD_SLEWN_MASK 0x1000
+#define PHY_AUX_CNTL__AUX_PAD_SLEWN__SHIFT 0xc
+#define PHY_AUX_CNTL__AUXSLAVE_CLK_PD_EN_MASK 0x2000
+#define PHY_AUX_CNTL__AUXSLAVE_CLK_PD_EN__SHIFT 0xd
+#define PHY_AUX_CNTL__AUX_PAD_WAKE_MASK 0x4000
+#define PHY_AUX_CNTL__AUX_PAD_WAKE__SHIFT 0xe
+#define PHY_AUX_CNTL__AUX_PAD_RXSEL_MASK 0x30000
+#define PHY_AUX_CNTL__AUX_PAD_RXSEL__SHIFT 0x10
+#define PHY_AUX_CNTL__AUX_PAD_RESBIASEN_MASK 0x40000
+#define PHY_AUX_CNTL__AUX_PAD_RESBIASEN__SHIFT 0x12
+#define PHY_AUX_CNTL__AUX_PAD_COMPSEL_MASK 0x80000
+#define PHY_AUX_CNTL__AUX_PAD_COMPSEL__SHIFT 0x13
+#define DC_GPIO_I2CPAD_A__DC_GPIO_SCL_A_MASK 0x1
+#define DC_GPIO_I2CPAD_A__DC_GPIO_SCL_A__SHIFT 0x0
+#define DC_GPIO_I2CPAD_A__DC_GPIO_SDA_A_MASK 0x2
+#define DC_GPIO_I2CPAD_A__DC_GPIO_SDA_A__SHIFT 0x1
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_SCL_EN_MASK 0x1
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_SCL_EN__SHIFT 0x0
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_SDA_EN_MASK 0x2
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_SDA_EN__SHIFT 0x1
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_DATA_PD_EN_MASK 0x4
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_DATA_PD_EN__SHIFT 0x2
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RXSEL_MASK 0x30000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RXSEL__SHIFT 0x10
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPARE_MASK 0xc0000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPARE__SHIFT 0x12
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_BIASCRTEN_MASK 0x100000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_BIASCRTEN__SHIFT 0x14
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_CSEL0P9_MASK 0x200000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_CSEL0P9__SHIFT 0x15
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_CSEL1P1_MASK 0x400000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_CSEL1P1__SHIFT 0x16
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_COMPSEL_MASK 0x800000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_COMPSEL__SHIFT 0x17
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RSEL0P9_MASK 0x1000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RSEL0P9__SHIFT 0x18
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RSEL1P1_MASK 0x2000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RSEL1P1__SHIFT 0x19
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPIKERCEN_MASK 0x4000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPIKERCEN__SHIFT 0x1a
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPIKERCSEL_MASK 0x8000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SPIKERCSEL__SHIFT 0x1b
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_FALLSLEWSEL_MASK 0x30000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_FALLSLEWSEL__SHIFT 0x1c
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RESBIASEN_MASK 0x40000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_RESBIASEN__SHIFT 0x1e
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SLEWN_MASK 0x80000000
+#define DC_GPIO_I2CPAD_EN__DC_GPIO_I2C_PAD_SLEWN__SHIFT 0x1f
+#define DC_GPIO_I2CPAD_Y__DC_GPIO_SCL_Y_MASK 0x1
+#define DC_GPIO_I2CPAD_Y__DC_GPIO_SCL_Y__SHIFT 0x0
+#define DC_GPIO_I2CPAD_Y__DC_GPIO_SDA_Y_MASK 0x2
+#define DC_GPIO_I2CPAD_Y__DC_GPIO_SDA_Y__SHIFT 0x1
+#define DC_GPIO_I2CPAD_STRENGTH__I2C_STRENGTH_SN_MASK 0xf
+#define DC_GPIO_I2CPAD_STRENGTH__I2C_STRENGTH_SN__SHIFT 0x0
+#define DC_GPIO_I2CPAD_STRENGTH__I2C_STRENGTH_SP_MASK 0xf0
+#define DC_GPIO_I2CPAD_STRENGTH__I2C_STRENGTH_SP__SHIFT 0x4
+#define DVO_VREF_CONTROL__DVO_VREFPON_MASK 0x1
+#define DVO_VREF_CONTROL__DVO_VREFPON__SHIFT 0x0
+#define DVO_VREF_CONTROL__DVO_VREFSEL_MASK 0x2
+#define DVO_VREF_CONTROL__DVO_VREFSEL__SHIFT 0x1
+#define DVO_VREF_CONTROL__DVO_VREFCAL_MASK 0xf0
+#define DVO_VREF_CONTROL__DVO_VREFCAL__SHIFT 0x4
+#define DVO_SKEW_ADJUST__DVO_SKEW_ADJUST_MASK 0xffffffff
+#define DVO_SKEW_ADJUST__DVO_SKEW_ADJUST__SHIFT 0x0
+#define DC_GPIO_RECEIVER_EN0__VIPPAD_SCL_RECEN_MASK 0x1
+#define DC_GPIO_RECEIVER_EN0__VIPPAD_SCL_RECEN__SHIFT 0x0
+#define DC_GPIO_RECEIVER_EN0__VIPPAD_SDA_RECEN_MASK 0x2
+#define DC_GPIO_RECEIVER_EN0__VIPPAD_SDA_RECEN__SHIFT 0x1
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_RX_HPD_RECEN_MASK 0x10000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_RX_HPD_RECEN__SHIFT 0x10
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_HPD1_RECEN_MASK 0x20000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_HPD1_RECEN__SHIFT 0x11
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENLK_VSYNC_RECEN_MASK 0x40000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENLK_VSYNC_RECEN__SHIFT 0x12
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENLK_CLK_RECEN_MASK 0x80000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENLK_CLK_RECEN__SHIFT 0x13
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_VSYNCA_RECEN_MASK 0x100000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_VSYNCA_RECEN__SHIFT 0x14
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_HSYNCA_RECEN_MASK 0x200000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_HSYNCA_RECEN__SHIFT 0x15
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICG_RECEN_MASK 0x400000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICG_RECEN__SHIFT 0x16
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICF_RECEN_MASK 0x800000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICF_RECEN__SHIFT 0x17
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICE_RECEN_MASK 0x1000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICE_RECEN__SHIFT 0x18
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICD_RECEN_MASK 0x2000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICD_RECEN__SHIFT 0x19
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICC_RECEN_MASK 0x4000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICC_RECEN__SHIFT 0x1a
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICB_RECEN_MASK 0x8000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICB_RECEN__SHIFT 0x1b
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICA_RECEN_MASK 0x10000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_GENERICA_RECEN__SHIFT 0x1c
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_BLON_RECEN_MASK 0x20000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_BLON_RECEN__SHIFT 0x1d
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_DIGON_RECEN_MASK 0x40000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_DIGON_RECEN__SHIFT 0x1e
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_DDC2DATA_RECEN_MASK 0x80000000
+#define DC_GPIO_RECEIVER_EN0__DC_GPIO_DDC2DATA_RECEN__SHIFT 0x1f
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC2CLK_RECEN_MASK 0x1
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC2CLK_RECEN__SHIFT 0x0
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC1DATA_RECEN_MASK 0x2
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC1DATA_RECEN__SHIFT 0x1
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC1CLK_RECEN_MASK 0x4
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC1CLK_RECEN__SHIFT 0x2
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC3DATA_RECEN_MASK 0x8
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC3DATA_RECEN__SHIFT 0x3
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC3CLK_RECEN_MASK 0x10
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC3CLK_RECEN__SHIFT 0x4
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC4DATA_RECEN_MASK 0x20
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC4DATA_RECEN__SHIFT 0x5
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC4CLK_RECEN_MASK 0x40
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC4CLK_RECEN__SHIFT 0x6
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC5DATA_RECEN_MASK 0x80
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC5DATA_RECEN__SHIFT 0x7
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC5CLK_RECEN_MASK 0x100
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC5CLK_RECEN__SHIFT 0x8
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC6DATA_RECEN_MASK 0x200
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC6DATA_RECEN__SHIFT 0x9
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC6CLK_RECEN_MASK 0x400
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_DDC6CLK_RECEN__SHIFT 0xa
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD2_RECEN_MASK 0x800
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD2_RECEN__SHIFT 0xb
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD3_RECEN_MASK 0x1000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD3_RECEN__SHIFT 0xc
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD4_RECEN_MASK 0x2000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD4_RECEN__SHIFT 0xd
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD5_RECEN_MASK 0x4000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD5_RECEN__SHIFT 0xe
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD6_RECEN_MASK 0x8000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_HPD6_RECEN__SHIFT 0xf
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_ENA_BL_RECEN_MASK 0x10000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_ENA_BL_RECEN__SHIFT 0x10
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_SWAPLOCK_A_RECEN_MASK 0x20000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_SWAPLOCK_A_RECEN__SHIFT 0x11
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_SWAPLOCK_B_RECEN_MASK 0x40000
+#define DC_GPIO_RECEIVER_EN1__DC_GPIO_SWAPLOCK_B_RECEN__SHIFT 0x12
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_I2SDATA0_MASK_MASK 0xf
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_I2SDATA0_MASK__SHIFT 0x0
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_MCLK0_MASK_MASK 0x10
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_MCLK0_MASK__SHIFT 0x4
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_BCLK0_MASK_MASK 0x20
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_BCLK0_MASK__SHIFT 0x5
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_LRCK0_MASK_MASK 0x40
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_LRCK0_MASK__SHIFT 0x6
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_SPDIF0_MASK_MASK 0x80
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_SPDIF0_MASK__SHIFT 0x7
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_I2SDATA1_MASK_MASK 0x100
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_I2SDATA1_MASK__SHIFT 0x8
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_MCLK1_MASK_MASK 0x200
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_MCLK1_MASK__SHIFT 0x9
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_BCLK1_MASK_MASK 0x400
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_BCLK1_MASK__SHIFT 0xa
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_LRCK1_MASK_MASK 0x800
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_LRCK1_MASK__SHIFT 0xb
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_SPDIF1_MASK_MASK 0x1000
+#define DC_GPIO_I2S_SPDIF_MASK__DC_GPIO_SPDIF1_MASK__SHIFT 0xc
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_I2SDATA0_A_MASK 0xf
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_I2SDATA0_A__SHIFT 0x0
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_MCLK0_A_MASK 0x10
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_MCLK0_A__SHIFT 0x4
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_BCLK0_A_MASK 0x20
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_BCLK0_A__SHIFT 0x5
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_LRCK0_A_MASK 0x40
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_LRCK0_A__SHIFT 0x6
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_SPDIF0_A_MASK 0x80
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_SPDIF0_A__SHIFT 0x7
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_I2SDATA1_A_MASK 0x100
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_I2SDATA1_A__SHIFT 0x8
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_MCLK1_A_MASK 0x200
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_MCLK1_A__SHIFT 0x9
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_BCLK1_A_MASK 0x400
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_BCLK1_A__SHIFT 0xa
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_LRCK1_A_MASK 0x800
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_LRCK1_A__SHIFT 0xb
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_SPDIF1_A_MASK 0x1000
+#define DC_GPIO_I2S_SPDIF_A__DC_GPIO_SPDIF1_A__SHIFT 0xc
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_I2SDATA0_EN_MASK 0xf
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_I2SDATA0_EN__SHIFT 0x0
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_MCLK0_EN_MASK 0x10
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_MCLK0_EN__SHIFT 0x4
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_BCLK0_EN_MASK 0x20
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_BCLK0_EN__SHIFT 0x5
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_LRCK0_EN_MASK 0x40
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_LRCK0_EN__SHIFT 0x6
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_SPDIF0_EN_MASK 0x80
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_SPDIF0_EN__SHIFT 0x7
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_I2SDATA1_EN_MASK 0x100
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_I2SDATA1_EN__SHIFT 0x8
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_MCLK1_EN_MASK 0x200
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_MCLK1_EN__SHIFT 0x9
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_BCLK1_EN_MASK 0x400
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_BCLK1_EN__SHIFT 0xa
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_LRCK1_EN_MASK 0x800
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_LRCK1_EN__SHIFT 0xb
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_SPDIF1_EN_MASK 0x1000
+#define DC_GPIO_I2S_SPDIF_EN__DC_GPIO_SPDIF1_EN__SHIFT 0xc
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_APORT_MASK 0x2000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_APORT__SHIFT 0xd
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_PU_MASK 0x4000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_PU__SHIFT 0xe
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_RXSEL_MASK 0x8000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_RXSEL__SHIFT 0xf
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_SCHMEN_MASK 0x10000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_SCHMEN__SHIFT 0x10
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_SMODE_EN_MASK 0x20000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_SMODE_EN__SHIFT 0x11
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_IMODE_MASK 0x40000
+#define DC_GPIO_I2S_SPDIF_EN__SPDIF1_IMODE__SHIFT 0x12
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_I2SDATA0_Y_MASK 0xf
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_I2SDATA0_Y__SHIFT 0x0
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_MCLK0_Y_MASK 0x10
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_MCLK0_Y__SHIFT 0x4
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_BCLK0_Y_MASK 0x20
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_BCLK0_Y__SHIFT 0x5
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_LRCK0_Y_MASK 0x40
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_LRCK0_Y__SHIFT 0x6
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_SPDIF0_Y_MASK 0x80
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_SPDIF0_Y__SHIFT 0x7
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_I2SDATA1_Y_MASK 0x100
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_I2SDATA1_Y__SHIFT 0x8
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_MCLK1_Y_MASK 0x200
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_MCLK1_Y__SHIFT 0x9
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_BCLK1_Y_MASK 0x400
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_BCLK1_Y__SHIFT 0xa
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_LRCK1_Y_MASK 0x800
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_LRCK1_Y__SHIFT 0xb
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_SPDIF1_Y_MASK 0x1000
+#define DC_GPIO_I2S_SPDIF_Y__DC_GPIO_SPDIF1_Y__SHIFT 0xc
+#define DC_GPIO_I2S_SPDIF_STRENGTH__I2S0_DRVSTRENGTH_MASK 0x7
+#define DC_GPIO_I2S_SPDIF_STRENGTH__I2S0_DRVSTRENGTH__SHIFT 0x0
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF0_DRVSTRENGTH_SN_MASK 0x700
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF0_DRVSTRENGTH_SN__SHIFT 0x8
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF0_DRVSTRENGTH_SP_MASK 0x3800
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF0_DRVSTRENGTH_SP__SHIFT 0xb
+#define DC_GPIO_I2S_SPDIF_STRENGTH__I2S1_DRVSTRENGTH_MASK 0x70000
+#define DC_GPIO_I2S_SPDIF_STRENGTH__I2S1_DRVSTRENGTH__SHIFT 0x10
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF1_DRVSTRENGTH_SN_MASK 0x7000000
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF1_DRVSTRENGTH_SN__SHIFT 0x18
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF1_DRVSTRENGTH_SP_MASK 0x38000000
+#define DC_GPIO_I2S_SPDIF_STRENGTH__SPDIF1_DRVSTRENGTH_SP__SHIFT 0x1b
+#define DC_GPIO_TX12_EN__DC_GPIO_BLON_TX12_EN_MASK 0x1
+#define DC_GPIO_TX12_EN__DC_GPIO_BLON_TX12_EN__SHIFT 0x0
+#define DC_GPIO_TX12_EN__DC_GPIO_DIGON_TX12_EN_MASK 0x2
+#define DC_GPIO_TX12_EN__DC_GPIO_DIGON_TX12_EN__SHIFT 0x1
+#define DC_GPIO_TX12_EN__DC_GPIO_ENA_BL_TX12_EN_MASK 0x4
+#define DC_GPIO_TX12_EN__DC_GPIO_ENA_BL_TX12_EN__SHIFT 0x2
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICA_TX12_EN_MASK 0x8
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICA_TX12_EN__SHIFT 0x3
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICB_TX12_EN_MASK 0x10
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICB_TX12_EN__SHIFT 0x4
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICC_TX12_EN_MASK 0x20
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICC_TX12_EN__SHIFT 0x5
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICD_TX12_EN_MASK 0x40
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICD_TX12_EN__SHIFT 0x6
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICE_TX12_EN_MASK 0x80
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICE_TX12_EN__SHIFT 0x7
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICF_TX12_EN_MASK 0x100
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICF_TX12_EN__SHIFT 0x8
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICG_TX12_EN_MASK 0x200
+#define DC_GPIO_TX12_EN__DC_GPIO_GENERICG_TX12_EN__SHIFT 0x9
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_FALLSLEWSEL_MASK 0x3
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_FALLSLEWSEL__SHIFT 0x0
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_FALLSLEWSEL_MASK 0xc
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_FALLSLEWSEL__SHIFT 0x2
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_FALLSLEWSEL_MASK 0x30
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_FALLSLEWSEL__SHIFT 0x4
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_FALLSLEWSEL_MASK 0xc0
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_FALLSLEWSEL__SHIFT 0x6
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_FALLSLEWSEL_MASK 0x300
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_FALLSLEWSEL__SHIFT 0x8
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_FALLSLEWSEL_MASK 0xc00
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_FALLSLEWSEL__SHIFT 0xa
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_SPIKERCEN_MASK 0x10000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_SPIKERCEN__SHIFT 0x10
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_SPIKERCEN_MASK 0x20000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_SPIKERCEN__SHIFT 0x11
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_SPIKERCEN_MASK 0x40000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_SPIKERCEN__SHIFT 0x12
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_SPIKERCEN_MASK 0x80000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_SPIKERCEN__SHIFT 0x13
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_SPIKERCEN_MASK 0x100000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_SPIKERCEN__SHIFT 0x14
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_SPIKERCEN_MASK 0x200000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_SPIKERCEN__SHIFT 0x15
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_SPIKERCSEL_MASK 0x1000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX1_SPIKERCSEL__SHIFT 0x18
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_SPIKERCSEL_MASK 0x2000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX2_SPIKERCSEL__SHIFT 0x19
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_SPIKERCSEL_MASK 0x4000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX3_SPIKERCSEL__SHIFT 0x1a
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_SPIKERCSEL_MASK 0x8000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX4_SPIKERCSEL__SHIFT 0x1b
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_SPIKERCSEL_MASK 0x10000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX5_SPIKERCSEL__SHIFT 0x1c
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_SPIKERCSEL_MASK 0x20000000
+#define DC_GPIO_AUX_CTRL_0__DC_GPIO_AUX6_SPIKERCSEL__SHIFT 0x1d
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_CSEL_0P9_MASK 0x1
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_CSEL_0P9__SHIFT 0x0
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_CSEL_0P9_MASK 0x2
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_CSEL_0P9__SHIFT 0x1
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_CSEL_0P9_MASK 0x4
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_CSEL_0P9__SHIFT 0x2
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_CSEL_0P9_MASK 0x8
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_CSEL_0P9__SHIFT 0x3
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_CSEL_0P9_MASK 0x10
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_CSEL_0P9__SHIFT 0x4
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_CSEL_0P9_MASK 0x20
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_CSEL_0P9__SHIFT 0x5
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_CSEL_1P1_MASK 0x100
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_CSEL_1P1__SHIFT 0x8
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_CSEL_1P1_MASK 0x200
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_CSEL_1P1__SHIFT 0x9
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_CSEL_1P1_MASK 0x400
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_CSEL_1P1__SHIFT 0xa
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_CSEL_1P1_MASK 0x800
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_CSEL_1P1__SHIFT 0xb
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_CSEL_1P1_MASK 0x1000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_CSEL_1P1__SHIFT 0xc
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_CSEL_1P1_MASK 0x2000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_CSEL_1P1__SHIFT 0xd
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_RSEL_0P9_MASK 0x10000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_RSEL_0P9__SHIFT 0x10
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_RSEL_0P9_MASK 0x20000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_RSEL_0P9__SHIFT 0x11
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_RSEL_0P9_MASK 0x40000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_RSEL_0P9__SHIFT 0x12
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_RSEL_0P9_MASK 0x80000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_RSEL_0P9__SHIFT 0x13
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_RSEL_0P9_MASK 0x100000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_RSEL_0P9__SHIFT 0x14
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_RSEL_0P9_MASK 0x200000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_RSEL_0P9__SHIFT 0x15
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_RSEL_1P1_MASK 0x1000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX1_RSEL_1P1__SHIFT 0x18
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_RSEL_1P1_MASK 0x2000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX2_RSEL_1P1__SHIFT 0x19
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_RSEL_1P1_MASK 0x4000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX3_RSEL_1P1__SHIFT 0x1a
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_RSEL_1P1_MASK 0x8000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX4_RSEL_1P1__SHIFT 0x1b
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_RSEL_1P1_MASK 0x10000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX5_RSEL_1P1__SHIFT 0x1c
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_RSEL_1P1_MASK 0x20000000
+#define DC_GPIO_AUX_CTRL_1__DC_GPIO_AUX6_RSEL_1P1__SHIFT 0x1d
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX1_BIASCRTEN_MASK 0x1
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX1_BIASCRTEN__SHIFT 0x0
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX2_BIASCRTEN_MASK 0x2
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX2_BIASCRTEN__SHIFT 0x1
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX3_BIASCRTEN_MASK 0x4
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX3_BIASCRTEN__SHIFT 0x2
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX4_BIASCRTEN_MASK 0x8
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX4_BIASCRTEN__SHIFT 0x3
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX5_BIASCRTEN_MASK 0x10
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX5_BIASCRTEN__SHIFT 0x4
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX6_BIASCRTEN_MASK 0x20
+#define DC_GPIO_AUX_CTRL_2__DC_GPIO_AUX6_BIASCRTEN__SHIFT 0x5
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX1_SPARE_MASK 0xc0
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX1_SPARE__SHIFT 0x6
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX2_SPARE_MASK 0x300
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX2_SPARE__SHIFT 0x8
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX3_SPARE_MASK 0xc00
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX3_SPARE__SHIFT 0xa
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX4_SPARE_MASK 0x3000
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX4_SPARE__SHIFT 0xc
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX5_SPARE_MASK 0xc000
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX5_SPARE__SHIFT 0xe
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX6_SPARE_MASK 0x30000
+#define DC_GPIO_AUX_CTRL_2__DC_IO_AUX6_SPARE__SHIFT 0x10
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_FALLSLEWSEL_MASK 0x3
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_FALLSLEWSEL__SHIFT 0x0
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_FALLSLEWSEL_MASK 0xc
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_FALLSLEWSEL__SHIFT 0x2
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_FALLSLEWSEL_MASK 0x30
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_FALLSLEWSEL__SHIFT 0x4
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_SPIKERCEN_MASK 0x100
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_SPIKERCEN__SHIFT 0x8
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_SPIKERCEN_MASK 0x200
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_SPIKERCEN__SHIFT 0x9
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_SPIKERCEN_MASK 0x400
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_SPIKERCEN__SHIFT 0xa
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_SPIKERCSEL_MASK 0x1000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_SPIKERCSEL__SHIFT 0xc
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_SPIKERCSEL_MASK 0x2000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_SPIKERCSEL__SHIFT 0xd
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_SPIKERCSEL_MASK 0x4000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_SPIKERCSEL__SHIFT 0xe
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_CSEL_0P9_MASK 0x10000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_CSEL_0P9__SHIFT 0x10
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_CSEL_0P9_MASK 0x20000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_CSEL_0P9__SHIFT 0x11
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_CSEL_0P9_MASK 0x40000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_CSEL_0P9__SHIFT 0x12
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_CSEL_1P1_MASK 0x100000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_CSEL_1P1__SHIFT 0x14
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_CSEL_1P1_MASK 0x200000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_CSEL_1P1__SHIFT 0x15
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_CSEL_1P1_MASK 0x400000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_CSEL_1P1__SHIFT 0x16
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_RSEL_0P9_MASK 0x1000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_RSEL_0P9__SHIFT 0x18
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_RSEL_0P9_MASK 0x2000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_RSEL_0P9__SHIFT 0x19
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_RSEL_0P9_MASK 0x4000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_RSEL_0P9__SHIFT 0x1a
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_RSEL_1P1_MASK 0x10000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD12_RSEL_1P1__SHIFT 0x1c
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_RSEL_1P1_MASK 0x20000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD34_RSEL_1P1__SHIFT 0x1d
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_RSEL_1P1_MASK 0x40000000
+#define DC_GPIO_HPD_CTRL_0__DC_GPIO_HPD56_RSEL_1P1__SHIFT 0x1e
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD12_BIASCRTEN_MASK 0x1
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD12_BIASCRTEN__SHIFT 0x0
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD34_BIASCRTEN_MASK 0x2
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD34_BIASCRTEN__SHIFT 0x1
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD56_BIASCRTEN_MASK 0x4
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD56_BIASCRTEN__SHIFT 0x2
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD12_SLEWN_MASK 0x10
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD12_SLEWN__SHIFT 0x4
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD34_SLEWN_MASK 0x20
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD34_SLEWN__SHIFT 0x5
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD56_SLEWN_MASK 0x40
+#define DC_GPIO_HPD_CTRL_1__DC_GPIO_HPD56_SLEWN__SHIFT 0x6
+#define DAC_MACRO_CNTL_RESERVED0__DAC_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DAC_MACRO_CNTL_RESERVED0__DAC_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DAC_MACRO_CNTL_RESERVED1__DAC_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DAC_MACRO_CNTL_RESERVED1__DAC_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DAC_MACRO_CNTL_RESERVED2__DAC_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DAC_MACRO_CNTL_RESERVED2__DAC_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DAC_MACRO_CNTL_RESERVED3__DAC_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DAC_MACRO_CNTL_RESERVED3__DAC_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED0__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED0__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED1__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED1__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED2__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED2__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED3__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED3__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED4__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED4__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED5__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED5__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED6__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED6__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED7__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED7__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED8__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED8__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED9__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED9__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED10__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED10__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED11__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED11__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED12__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED12__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED13__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED13__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED14__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED14__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED15__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED15__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED16__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED16__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED17__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED17__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED18__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED18__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED19__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED19__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED20__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED20__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED21__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED21__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED22__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED22__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED23__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED23__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED24__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED24__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED25__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED25__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED26__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED26__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED27__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED27__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED28__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED28__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED29__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED29__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED30__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED30__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED31__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED31__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED32__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED32__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED33__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED33__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED34__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED34__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED35__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED35__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED36__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED36__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED37__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED37__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED38__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED38__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED39__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED39__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED40__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED40__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED41__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED41__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED42__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED42__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED43__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED43__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED44__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED44__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED45__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED45__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED46__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED46__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED47__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED47__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED48__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED48__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED49__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED49__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED50__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED50__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED51__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED51__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED52__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED52__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED53__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED53__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED54__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED54__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED55__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED55__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED56__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED56__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED57__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED57__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED58__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED58__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED59__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED59__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED60__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED60__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED61__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED61__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED62__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED62__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED63__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED63__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED64__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED64__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED65__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED65__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED66__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED66__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED67__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED67__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED68__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED68__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED69__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED69__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED70__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED70__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED71__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED71__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED72__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED72__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED73__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED73__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED74__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED74__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED75__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED75__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED76__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED76__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED77__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED77__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED78__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED78__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED79__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED79__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED80__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED80__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED81__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED81__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED82__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED82__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED83__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED83__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED84__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED84__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED85__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED85__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED86__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED86__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED87__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED87__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED88__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED88__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED89__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED89__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED90__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED90__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED91__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED91__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED92__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED92__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED93__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED93__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED94__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED94__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED95__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED95__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED96__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED96__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED97__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED97__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED98__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED98__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED99__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED99__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED100__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED100__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED101__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED101__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED102__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED102__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED103__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED103__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED104__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED104__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED105__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED105__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED106__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED106__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED107__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED107__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED108__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED108__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED109__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED109__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED110__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED110__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED111__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED111__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED112__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED112__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED113__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED113__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED114__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED114__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED115__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED115__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED116__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED116__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED117__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED117__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED118__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED118__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED119__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED119__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED120__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED120__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED121__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED121__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED122__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED122__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED123__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED123__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED124__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED124__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED125__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED125__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED126__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED126__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED127__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED127__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED128__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED128__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED129__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED129__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED130__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED130__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED131__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED131__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED132__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED132__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED133__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED133__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED134__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED134__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED135__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED135__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED136__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED136__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED137__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED137__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED138__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED138__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED139__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED139__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED140__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED140__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED141__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED141__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED142__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED142__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED143__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED143__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED144__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED144__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED145__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED145__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED146__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED146__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED147__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED147__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED148__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED148__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED149__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED149__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED150__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED150__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED151__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED151__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED152__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED152__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED153__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED153__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED154__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED154__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED155__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED155__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED156__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED156__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED157__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED157__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED158__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED158__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define UNIPHY_MACRO_CNTL_RESERVED159__UNIPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define UNIPHY_MACRO_CNTL_RESERVED159__UNIPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED0__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED0__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED1__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED1__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED2__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED2__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED3__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED3__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED4__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED4__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED5__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED5__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED6__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED6__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED7__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED7__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED8__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED8__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED9__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED9__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED10__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED10__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED11__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED11__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED12__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED12__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED13__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED13__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED14__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED14__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED15__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED15__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED16__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED16__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED17__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED17__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED18__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED18__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED19__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED19__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED20__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED20__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED21__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED21__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED22__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED22__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED23__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED23__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED24__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED24__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED25__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED25__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED26__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED26__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED27__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED27__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED28__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED28__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED29__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED29__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED30__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED30__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED31__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED31__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED32__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED32__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED33__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED33__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED34__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED34__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED35__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED35__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED36__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED36__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED37__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED37__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED38__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED38__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED39__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED39__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED40__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED40__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED41__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED41__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED42__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED42__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED43__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED43__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED44__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED44__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED45__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED45__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED46__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED46__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED47__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED47__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED48__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED48__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED49__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED49__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED50__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED50__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED51__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED51__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED52__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED52__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED53__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED53__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED54__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED54__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED55__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED55__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED56__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED56__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED57__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED57__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED58__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED58__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED59__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED59__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED60__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED60__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED61__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED61__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED62__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED62__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED63__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED63__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED64__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED64__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED65__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED65__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED66__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED66__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED67__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED67__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED68__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED68__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED69__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED69__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED70__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED70__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED71__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED71__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED72__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED72__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED73__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED73__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED74__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED74__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED75__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED75__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED76__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED76__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED77__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED77__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED78__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED78__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED79__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED79__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED80__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED80__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED81__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED81__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED82__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED82__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED83__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED83__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED84__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED84__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED85__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED85__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED86__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED86__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED87__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED87__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED88__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED88__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED89__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED89__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED90__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED90__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED91__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED91__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED92__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED92__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED93__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED93__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED94__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED94__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED95__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED95__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED96__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED96__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED97__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED97__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED98__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED98__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED99__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED99__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED100__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED100__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED101__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED101__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED102__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED102__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED103__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED103__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED104__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED104__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED105__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED105__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED106__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED106__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED107__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED107__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED108__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED108__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED109__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED109__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED110__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED110__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED111__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED111__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED112__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED112__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED113__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED113__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED114__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED114__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED115__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED115__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED116__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED116__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED117__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED117__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED118__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED118__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED119__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED119__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED120__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED120__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED121__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED121__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED122__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED122__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED123__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED123__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED124__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED124__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED125__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED125__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED126__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED126__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED127__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED127__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED128__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED128__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED129__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED129__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED130__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED130__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED131__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED131__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED132__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED132__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED133__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED133__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED134__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED134__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED135__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED135__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED136__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED136__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED137__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED137__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED138__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED138__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED139__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED139__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED140__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED140__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED141__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED141__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED142__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED142__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED143__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED143__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED144__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED144__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED145__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED145__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED146__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED146__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED147__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED147__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED148__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED148__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED149__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED149__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED150__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED150__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED151__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED151__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED152__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED152__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED153__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED153__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED154__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED154__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED155__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED155__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED156__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED156__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED157__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED157__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED158__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED158__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED159__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED159__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED160__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED160__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED161__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED161__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED162__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED162__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED163__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED163__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED164__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED164__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED165__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED165__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED166__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED166__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED167__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED167__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED168__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED168__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED169__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED169__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED170__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED170__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED171__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED171__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED172__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED172__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED173__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED173__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED174__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED174__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED175__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED175__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED176__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED176__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED177__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED177__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED178__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED178__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED179__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED179__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED180__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED180__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED181__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED181__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED182__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED182__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED183__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED183__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED184__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED184__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED185__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED185__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED186__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED186__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED187__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED187__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED188__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED188__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED189__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED189__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED190__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED190__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED191__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED191__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED192__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED192__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED193__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED193__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED194__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED194__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED195__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED195__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED196__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED196__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED197__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED197__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED198__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED198__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED199__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED199__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED200__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED200__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED201__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED201__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED202__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED202__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED203__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED203__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED204__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED204__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED205__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED205__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED206__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED206__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED207__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED207__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED208__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED208__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED209__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED209__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED210__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED210__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED211__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED211__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED212__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED212__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED213__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED213__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED214__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED214__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED215__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED215__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED216__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED216__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED217__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED217__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED218__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED218__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED219__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED219__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED220__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED220__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED221__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED221__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED222__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED222__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED223__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED223__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED224__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED224__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED225__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED225__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED226__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED226__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED227__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED227__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED228__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED228__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED229__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED229__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED230__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED230__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED231__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED231__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED232__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED232__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED233__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED233__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED234__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED234__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED235__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED235__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED236__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED236__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED237__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED237__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED238__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED238__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED239__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED239__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED240__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED240__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED241__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED241__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED242__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED242__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED243__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED243__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED244__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED244__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED245__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED245__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED246__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED246__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED247__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED247__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED248__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED248__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED249__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED249__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED250__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED250__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED251__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED251__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED252__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED252__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED253__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED253__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED254__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED254__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED255__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED255__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED256__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED256__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED257__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED257__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED258__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED258__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED259__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED259__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED260__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED260__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED261__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED261__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED262__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED262__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED263__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED263__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED264__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED264__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED265__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED265__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED266__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED266__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED267__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED267__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED268__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED268__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED269__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED269__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED270__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED270__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED271__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED271__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED272__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED272__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED273__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED273__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED274__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED274__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED275__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED275__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED276__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED276__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED277__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED277__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED278__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED278__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED279__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED279__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED280__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED280__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED281__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED281__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED282__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED282__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED283__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED283__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED284__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED284__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED285__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED285__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED286__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED286__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED287__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED287__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED288__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED288__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED289__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED289__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED290__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED290__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED291__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED291__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED292__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED292__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED293__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED293__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED294__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED294__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED295__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED295__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED296__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED296__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED297__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED297__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED298__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED298__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED299__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED299__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED300__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED300__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED301__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED301__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED302__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED302__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED303__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED303__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED304__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED304__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED305__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED305__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED306__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED306__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED307__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED307__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED308__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED308__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED309__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED309__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED310__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED310__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED311__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED311__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED312__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED312__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED313__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED313__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED314__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED314__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED315__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED315__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED316__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED316__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED317__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED317__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED318__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED318__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED319__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED319__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED320__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED320__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED321__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED321__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED322__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED322__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED323__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED323__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED324__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED324__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED325__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED325__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED326__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED326__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED327__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED327__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED328__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED328__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED329__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED329__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED330__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED330__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED331__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED331__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED332__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED332__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED333__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED333__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED334__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED334__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED335__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED335__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED336__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED336__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED337__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED337__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED338__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED338__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED339__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED339__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED340__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED340__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED341__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED341__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED342__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED342__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED343__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED343__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED344__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED344__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED345__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED345__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED346__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED346__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED347__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED347__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED348__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED348__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED349__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED349__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED350__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED350__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED351__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED351__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED352__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED352__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED353__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED353__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED354__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED354__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED355__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED355__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED356__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED356__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED357__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED357__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED358__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED358__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED359__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED359__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED360__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED360__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED361__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED361__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED362__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED362__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED363__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED363__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED364__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED364__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED365__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED365__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED366__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED366__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED367__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED367__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED368__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED368__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED369__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED369__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED370__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED370__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED371__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED371__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED372__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED372__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED373__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED373__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED374__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED374__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED375__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED375__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED376__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED376__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED377__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED377__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED378__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED378__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DCRX_PHY_MACRO_CNTL_RESERVED379__DCRX_PHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DCRX_PHY_MACRO_CNTL_RESERVED379__DCRX_PHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED0__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED0__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED1__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED1__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED2__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED2__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED3__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED3__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED4__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED4__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED5__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED5__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED6__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED6__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED7__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED7__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED8__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED8__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED9__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED9__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED10__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED10__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED11__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED11__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED12__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED12__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED13__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED13__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED14__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED14__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED15__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED15__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED16__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED16__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED17__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED17__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED18__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED18__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED19__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED19__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED20__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED20__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED21__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED21__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED22__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED22__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED23__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED23__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED24__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED24__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED25__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED25__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED26__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED26__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED27__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED27__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED28__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED28__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED29__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED29__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED30__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED30__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED31__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED31__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED32__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED32__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED33__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED33__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED34__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED34__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED35__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED35__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED36__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED36__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED37__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED37__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED38__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED38__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED39__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED39__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED40__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED40__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED41__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED41__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED42__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED42__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED43__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED43__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED44__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED44__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED45__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED45__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED46__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED46__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED47__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED47__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED48__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED48__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED49__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED49__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED50__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED50__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED51__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED51__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED52__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED52__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED53__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED53__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED54__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED54__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED55__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED55__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED56__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED56__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED57__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED57__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED58__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED58__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED59__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED59__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED60__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED60__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED61__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED61__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED62__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED62__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define DPHY_MACRO_CNTL_RESERVED63__DPHY_MACRO_CNTL_RESERVED_MASK 0xffffffff
+#define DPHY_MACRO_CNTL_RESERVED63__DPHY_MACRO_CNTL_RESERVED__SHIFT 0x0
+#define GRPH_ENABLE__GRPH_ENABLE_MASK 0x1
+#define GRPH_ENABLE__GRPH_ENABLE__SHIFT 0x0
+#define GRPH_ENABLE__GRPH_KEYER_ALPHA_SEL_MASK 0x2
+#define GRPH_ENABLE__GRPH_KEYER_ALPHA_SEL__SHIFT 0x1
+#define GRPH_CONTROL__GRPH_DEPTH_MASK 0x3
+#define GRPH_CONTROL__GRPH_DEPTH__SHIFT 0x0
+#define GRPH_CONTROL__GRPH_NUM_BANKS_MASK 0xc
+#define GRPH_CONTROL__GRPH_NUM_BANKS__SHIFT 0x2
+#define GRPH_CONTROL__GRPH_Z_MASK 0x30
+#define GRPH_CONTROL__GRPH_Z__SHIFT 0x4
+#define GRPH_CONTROL__GRPH_BANK_WIDTH_MASK 0xc0
+#define GRPH_CONTROL__GRPH_BANK_WIDTH__SHIFT 0x6
+#define GRPH_CONTROL__GRPH_FORMAT_MASK 0x700
+#define GRPH_CONTROL__GRPH_FORMAT__SHIFT 0x8
+#define GRPH_CONTROL__GRPH_BANK_HEIGHT_MASK 0x1800
+#define GRPH_CONTROL__GRPH_BANK_HEIGHT__SHIFT 0xb
+#define GRPH_CONTROL__GRPH_TILE_SPLIT_MASK 0xe000
+#define GRPH_CONTROL__GRPH_TILE_SPLIT__SHIFT 0xd
+#define GRPH_CONTROL__GRPH_ADDRESS_TRANSLATION_ENABLE_MASK 0x10000
+#define GRPH_CONTROL__GRPH_ADDRESS_TRANSLATION_ENABLE__SHIFT 0x10
+#define GRPH_CONTROL__GRPH_PRIVILEGED_ACCESS_ENABLE_MASK 0x20000
+#define GRPH_CONTROL__GRPH_PRIVILEGED_ACCESS_ENABLE__SHIFT 0x11
+#define GRPH_CONTROL__GRPH_MACRO_TILE_ASPECT_MASK 0xc0000
+#define GRPH_CONTROL__GRPH_MACRO_TILE_ASPECT__SHIFT 0x12
+#define GRPH_CONTROL__GRPH_ARRAY_MODE_MASK 0xf00000
+#define GRPH_CONTROL__GRPH_ARRAY_MODE__SHIFT 0x14
+#define GRPH_CONTROL__GRPH_PIPE_CONFIG_MASK 0x1f000000
+#define GRPH_CONTROL__GRPH_PIPE_CONFIG__SHIFT 0x18
+#define GRPH_CONTROL__GRPH_MICRO_TILE_MODE_MASK 0x60000000
+#define GRPH_CONTROL__GRPH_MICRO_TILE_MODE__SHIFT 0x1d
+#define GRPH_CONTROL__GRPH_COLOR_EXPANSION_MODE_MASK 0x80000000
+#define GRPH_CONTROL__GRPH_COLOR_EXPANSION_MODE__SHIFT 0x1f
+#define GRPH_LUT_10BIT_BYPASS__GRPH_LUT_10BIT_BYPASS_EN_MASK 0x100
+#define GRPH_LUT_10BIT_BYPASS__GRPH_LUT_10BIT_BYPASS_EN__SHIFT 0x8
+#define GRPH_LUT_10BIT_BYPASS__GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN_MASK 0x10000
+#define GRPH_LUT_10BIT_BYPASS__GRPH_LUT_10BIT_BYPASS_DBL_BUF_EN__SHIFT 0x10
+#define GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP_MASK 0x3
+#define GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT 0x0
+#define GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR_MASK 0x30
+#define GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR__SHIFT 0x4
+#define GRPH_SWAP_CNTL__GRPH_GREEN_CROSSBAR_MASK 0xc0
+#define GRPH_SWAP_CNTL__GRPH_GREEN_CROSSBAR__SHIFT 0x6
+#define GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR_MASK 0x300
+#define GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR__SHIFT 0x8
+#define GRPH_SWAP_CNTL__GRPH_ALPHA_CROSSBAR_MASK 0xc00
+#define GRPH_SWAP_CNTL__GRPH_ALPHA_CROSSBAR__SHIFT 0xa
+#define GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_DFQ_ENABLE_MASK 0x1
+#define GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_DFQ_ENABLE__SHIFT 0x0
+#define GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS_MASK 0xffffff00
+#define GRPH_PRIMARY_SURFACE_ADDRESS__GRPH_PRIMARY_SURFACE_ADDRESS__SHIFT 0x8
+#define GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_DFQ_ENABLE_MASK 0x1
+#define GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_DFQ_ENABLE__SHIFT 0x0
+#define GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS_MASK 0xffffff00
+#define GRPH_SECONDARY_SURFACE_ADDRESS__GRPH_SECONDARY_SURFACE_ADDRESS__SHIFT 0x8
+#define GRPH_PITCH__GRPH_PITCH_MASK 0x7fff
+#define GRPH_PITCH__GRPH_PITCH__SHIFT 0x0
+#define GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_MASK 0xff
+#define GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH__SHIFT 0x0
+#define GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_MASK 0xff
+#define GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH__SHIFT 0x0
+#define GRPH_SURFACE_OFFSET_X__GRPH_SURFACE_OFFSET_X_MASK 0x3fff
+#define GRPH_SURFACE_OFFSET_X__GRPH_SURFACE_OFFSET_X__SHIFT 0x0
+#define GRPH_SURFACE_OFFSET_Y__GRPH_SURFACE_OFFSET_Y_MASK 0x3fff
+#define GRPH_SURFACE_OFFSET_Y__GRPH_SURFACE_OFFSET_Y__SHIFT 0x0
+#define GRPH_X_START__GRPH_X_START_MASK 0x3fff
+#define GRPH_X_START__GRPH_X_START__SHIFT 0x0
+#define GRPH_Y_START__GRPH_Y_START_MASK 0x3fff
+#define GRPH_Y_START__GRPH_Y_START__SHIFT 0x0
+#define GRPH_X_END__GRPH_X_END_MASK 0x7fff
+#define GRPH_X_END__GRPH_X_END__SHIFT 0x0
+#define GRPH_Y_END__GRPH_Y_END_MASK 0x7fff
+#define GRPH_Y_END__GRPH_Y_END__SHIFT 0x0
+#define INPUT_GAMMA_CONTROL__GRPH_INPUT_GAMMA_MODE_MASK 0x1
+#define INPUT_GAMMA_CONTROL__GRPH_INPUT_GAMMA_MODE__SHIFT 0x0
+#define GRPH_UPDATE__GRPH_MODE_UPDATE_PENDING_MASK 0x1
+#define GRPH_UPDATE__GRPH_MODE_UPDATE_PENDING__SHIFT 0x0
+#define GRPH_UPDATE__GRPH_MODE_UPDATE_TAKEN_MASK 0x2
+#define GRPH_UPDATE__GRPH_MODE_UPDATE_TAKEN__SHIFT 0x1
+#define GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK 0x4
+#define GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING__SHIFT 0x2
+#define GRPH_UPDATE__GRPH_SURFACE_UPDATE_TAKEN_MASK 0x8
+#define GRPH_UPDATE__GRPH_SURFACE_UPDATE_TAKEN__SHIFT 0x3
+#define GRPH_UPDATE__GRPH_SURFACE_XDMA_PENDING_ENABLE_MASK 0x100
+#define GRPH_UPDATE__GRPH_SURFACE_XDMA_PENDING_ENABLE__SHIFT 0x8
+#define GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK 0x10000
+#define GRPH_UPDATE__GRPH_UPDATE_LOCK__SHIFT 0x10
+#define GRPH_UPDATE__GRPH_SURFACE_IGNORE_UPDATE_LOCK_MASK 0x100000
+#define GRPH_UPDATE__GRPH_SURFACE_IGNORE_UPDATE_LOCK__SHIFT 0x14
+#define GRPH_UPDATE__GRPH_MODE_DISABLE_MULTIPLE_UPDATE_MASK 0x1000000
+#define GRPH_UPDATE__GRPH_MODE_DISABLE_MULTIPLE_UPDATE__SHIFT 0x18
+#define GRPH_UPDATE__GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_MASK 0x10000000
+#define GRPH_UPDATE__GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE__SHIFT 0x1c
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN_MASK 0x1
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_H_RETRACE_EN__SHIFT 0x0
+#define GRPH_FLIP_CONTROL__GRPH_XDMA_SUPER_AA_EN_MASK 0x2
+#define GRPH_FLIP_CONTROL__GRPH_XDMA_SUPER_AA_EN__SHIFT 0x1
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_IMMEDIATE_EN_MASK 0x10
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_IMMEDIATE_EN__SHIFT 0x4
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_PENDING_MODE_MASK 0x20
+#define GRPH_FLIP_CONTROL__GRPH_SURFACE_UPDATE_PENDING_MODE__SHIFT 0x5
+#define GRPH_SURFACE_ADDRESS_INUSE__GRPH_SURFACE_ADDRESS_INUSE_MASK 0xffffff00
+#define GRPH_SURFACE_ADDRESS_INUSE__GRPH_SURFACE_ADDRESS_INUSE__SHIFT 0x8
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_RESET_MASK 0x1
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_RESET__SHIFT 0x0
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_SIZE_MASK 0x70
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_SIZE__SHIFT 0x4
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_MIN_FREE_ENTRIES_MASK 0x700
+#define GRPH_DFQ_CONTROL__GRPH_DFQ_MIN_FREE_ENTRIES__SHIFT 0x8
+#define GRPH_DFQ_STATUS__GRPH_PRIMARY_DFQ_NUM_ENTRIES_MASK 0xf
+#define GRPH_DFQ_STATUS__GRPH_PRIMARY_DFQ_NUM_ENTRIES__SHIFT 0x0
+#define GRPH_DFQ_STATUS__GRPH_SECONDARY_DFQ_NUM_ENTRIES_MASK 0xf0
+#define GRPH_DFQ_STATUS__GRPH_SECONDARY_DFQ_NUM_ENTRIES__SHIFT 0x4
+#define GRPH_DFQ_STATUS__GRPH_DFQ_RESET_FLAG_MASK 0x100
+#define GRPH_DFQ_STATUS__GRPH_DFQ_RESET_FLAG__SHIFT 0x8
+#define GRPH_DFQ_STATUS__GRPH_DFQ_RESET_ACK_MASK 0x200
+#define GRPH_DFQ_STATUS__GRPH_DFQ_RESET_ACK__SHIFT 0x9
+#define GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK 0x1
+#define GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED__SHIFT 0x0
+#define GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK 0x100
+#define GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR__SHIFT 0x8
+#define GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK 0x1
+#define GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK__SHIFT 0x0
+#define GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_TYPE_MASK 0x100
+#define GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_TYPE__SHIFT 0x8
+#define GRPH_SURFACE_ADDRESS_HIGH_INUSE__GRPH_SURFACE_ADDRESS_HIGH_INUSE_MASK 0xff
+#define GRPH_SURFACE_ADDRESS_HIGH_INUSE__GRPH_SURFACE_ADDRESS_HIGH_INUSE__SHIFT 0x0
+#define GRPH_COMPRESS_SURFACE_ADDRESS__GRPH_COMPRESS_SURFACE_ADDRESS_MASK 0xffffff00
+#define GRPH_COMPRESS_SURFACE_ADDRESS__GRPH_COMPRESS_SURFACE_ADDRESS__SHIFT 0x8
+#define GRPH_COMPRESS_PITCH__GRPH_COMPRESS_PITCH_MASK 0x1ffc0
+#define GRPH_COMPRESS_PITCH__GRPH_COMPRESS_PITCH__SHIFT 0x6
+#define GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__GRPH_COMPRESS_SURFACE_ADDRESS_HIGH_MASK 0xff
+#define GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__GRPH_COMPRESS_SURFACE_ADDRESS_HIGH__SHIFT 0x0
+#define GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT__GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT_MASK 0xff
+#define GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT__GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT__SHIFT 0x0
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_SELECT_MASK 0x1
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_SELECT__SHIFT 0x0
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_R_SIGN_MASK 0x2
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_R_SIGN__SHIFT 0x1
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_G_SIGN_MASK 0x4
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_G_SIGN__SHIFT 0x2
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_B_SIGN_MASK 0x8
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_B_SIGN__SHIFT 0x3
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_BYPASS_MASK 0x10
+#define PRESCALE_GRPH_CONTROL__GRPH_PRESCALE_BYPASS__SHIFT 0x4
+#define PRESCALE_VALUES_GRPH_R__GRPH_PRESCALE_BIAS_R_MASK 0xffff
+#define PRESCALE_VALUES_GRPH_R__GRPH_PRESCALE_BIAS_R__SHIFT 0x0
+#define PRESCALE_VALUES_GRPH_R__GRPH_PRESCALE_SCALE_R_MASK 0xffff0000
+#define PRESCALE_VALUES_GRPH_R__GRPH_PRESCALE_SCALE_R__SHIFT 0x10
+#define PRESCALE_VALUES_GRPH_G__GRPH_PRESCALE_BIAS_G_MASK 0xffff
+#define PRESCALE_VALUES_GRPH_G__GRPH_PRESCALE_BIAS_G__SHIFT 0x0
+#define PRESCALE_VALUES_GRPH_G__GRPH_PRESCALE_SCALE_G_MASK 0xffff0000
+#define PRESCALE_VALUES_GRPH_G__GRPH_PRESCALE_SCALE_G__SHIFT 0x10
+#define PRESCALE_VALUES_GRPH_B__GRPH_PRESCALE_BIAS_B_MASK 0xffff
+#define PRESCALE_VALUES_GRPH_B__GRPH_PRESCALE_BIAS_B__SHIFT 0x0
+#define PRESCALE_VALUES_GRPH_B__GRPH_PRESCALE_SCALE_B_MASK 0xffff0000
+#define PRESCALE_VALUES_GRPH_B__GRPH_PRESCALE_SCALE_B__SHIFT 0x10
+#define INPUT_CSC_CONTROL__INPUT_CSC_GRPH_MODE_MASK 0x3
+#define INPUT_CSC_CONTROL__INPUT_CSC_GRPH_MODE__SHIFT 0x0
+#define INPUT_CSC_C11_C12__INPUT_CSC_C11_MASK 0xffff
+#define INPUT_CSC_C11_C12__INPUT_CSC_C11__SHIFT 0x0
+#define INPUT_CSC_C11_C12__INPUT_CSC_C12_MASK 0xffff0000
+#define INPUT_CSC_C11_C12__INPUT_CSC_C12__SHIFT 0x10
+#define INPUT_CSC_C13_C14__INPUT_CSC_C13_MASK 0xffff
+#define INPUT_CSC_C13_C14__INPUT_CSC_C13__SHIFT 0x0
+#define INPUT_CSC_C13_C14__INPUT_CSC_C14_MASK 0xffff0000
+#define INPUT_CSC_C13_C14__INPUT_CSC_C14__SHIFT 0x10
+#define INPUT_CSC_C21_C22__INPUT_CSC_C21_MASK 0xffff
+#define INPUT_CSC_C21_C22__INPUT_CSC_C21__SHIFT 0x0
+#define INPUT_CSC_C21_C22__INPUT_CSC_C22_MASK 0xffff0000
+#define INPUT_CSC_C21_C22__INPUT_CSC_C22__SHIFT 0x10
+#define INPUT_CSC_C23_C24__INPUT_CSC_C23_MASK 0xffff
+#define INPUT_CSC_C23_C24__INPUT_CSC_C23__SHIFT 0x0
+#define INPUT_CSC_C23_C24__INPUT_CSC_C24_MASK 0xffff0000
+#define INPUT_CSC_C23_C24__INPUT_CSC_C24__SHIFT 0x10
+#define INPUT_CSC_C31_C32__INPUT_CSC_C31_MASK 0xffff
+#define INPUT_CSC_C31_C32__INPUT_CSC_C31__SHIFT 0x0
+#define INPUT_CSC_C31_C32__INPUT_CSC_C32_MASK 0xffff0000
+#define INPUT_CSC_C31_C32__INPUT_CSC_C32__SHIFT 0x10
+#define INPUT_CSC_C33_C34__INPUT_CSC_C33_MASK 0xffff
+#define INPUT_CSC_C33_C34__INPUT_CSC_C33__SHIFT 0x0
+#define INPUT_CSC_C33_C34__INPUT_CSC_C34_MASK 0xffff0000
+#define INPUT_CSC_C33_C34__INPUT_CSC_C34__SHIFT 0x10
+#define OUTPUT_CSC_CONTROL__OUTPUT_CSC_GRPH_MODE_MASK 0x7
+#define OUTPUT_CSC_CONTROL__OUTPUT_CSC_GRPH_MODE__SHIFT 0x0
+#define OUTPUT_CSC_C11_C12__OUTPUT_CSC_C11_MASK 0xffff
+#define OUTPUT_CSC_C11_C12__OUTPUT_CSC_C11__SHIFT 0x0
+#define OUTPUT_CSC_C11_C12__OUTPUT_CSC_C12_MASK 0xffff0000
+#define OUTPUT_CSC_C11_C12__OUTPUT_CSC_C12__SHIFT 0x10
+#define OUTPUT_CSC_C13_C14__OUTPUT_CSC_C13_MASK 0xffff
+#define OUTPUT_CSC_C13_C14__OUTPUT_CSC_C13__SHIFT 0x0
+#define OUTPUT_CSC_C13_C14__OUTPUT_CSC_C14_MASK 0xffff0000
+#define OUTPUT_CSC_C13_C14__OUTPUT_CSC_C14__SHIFT 0x10
+#define OUTPUT_CSC_C21_C22__OUTPUT_CSC_C21_MASK 0xffff
+#define OUTPUT_CSC_C21_C22__OUTPUT_CSC_C21__SHIFT 0x0
+#define OUTPUT_CSC_C21_C22__OUTPUT_CSC_C22_MASK 0xffff0000
+#define OUTPUT_CSC_C21_C22__OUTPUT_CSC_C22__SHIFT 0x10
+#define OUTPUT_CSC_C23_C24__OUTPUT_CSC_C23_MASK 0xffff
+#define OUTPUT_CSC_C23_C24__OUTPUT_CSC_C23__SHIFT 0x0
+#define OUTPUT_CSC_C23_C24__OUTPUT_CSC_C24_MASK 0xffff0000
+#define OUTPUT_CSC_C23_C24__OUTPUT_CSC_C24__SHIFT 0x10
+#define OUTPUT_CSC_C31_C32__OUTPUT_CSC_C31_MASK 0xffff
+#define OUTPUT_CSC_C31_C32__OUTPUT_CSC_C31__SHIFT 0x0
+#define OUTPUT_CSC_C31_C32__OUTPUT_CSC_C32_MASK 0xffff0000
+#define OUTPUT_CSC_C31_C32__OUTPUT_CSC_C32__SHIFT 0x10
+#define OUTPUT_CSC_C33_C34__OUTPUT_CSC_C33_MASK 0xffff
+#define OUTPUT_CSC_C33_C34__OUTPUT_CSC_C33__SHIFT 0x0
+#define OUTPUT_CSC_C33_C34__OUTPUT_CSC_C34_MASK 0xffff0000
+#define OUTPUT_CSC_C33_C34__OUTPUT_CSC_C34__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C11_C12__COMM_MATRIXA_TRANS_C11_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C11_C12__COMM_MATRIXA_TRANS_C11__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C11_C12__COMM_MATRIXA_TRANS_C12_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C11_C12__COMM_MATRIXA_TRANS_C12__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C13_C14__COMM_MATRIXA_TRANS_C13_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C13_C14__COMM_MATRIXA_TRANS_C13__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C13_C14__COMM_MATRIXA_TRANS_C14_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C13_C14__COMM_MATRIXA_TRANS_C14__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C21_C22__COMM_MATRIXA_TRANS_C21_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C21_C22__COMM_MATRIXA_TRANS_C21__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C21_C22__COMM_MATRIXA_TRANS_C22_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C21_C22__COMM_MATRIXA_TRANS_C22__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C23_C24__COMM_MATRIXA_TRANS_C23_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C23_C24__COMM_MATRIXA_TRANS_C23__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C23_C24__COMM_MATRIXA_TRANS_C24_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C23_C24__COMM_MATRIXA_TRANS_C24__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C31_C32__COMM_MATRIXA_TRANS_C31_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C31_C32__COMM_MATRIXA_TRANS_C31__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C31_C32__COMM_MATRIXA_TRANS_C32_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C31_C32__COMM_MATRIXA_TRANS_C32__SHIFT 0x10
+#define COMM_MATRIXA_TRANS_C33_C34__COMM_MATRIXA_TRANS_C33_MASK 0xffff
+#define COMM_MATRIXA_TRANS_C33_C34__COMM_MATRIXA_TRANS_C33__SHIFT 0x0
+#define COMM_MATRIXA_TRANS_C33_C34__COMM_MATRIXA_TRANS_C34_MASK 0xffff0000
+#define COMM_MATRIXA_TRANS_C33_C34__COMM_MATRIXA_TRANS_C34__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C11_C12__COMM_MATRIXB_TRANS_C11_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C11_C12__COMM_MATRIXB_TRANS_C11__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C11_C12__COMM_MATRIXB_TRANS_C12_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C11_C12__COMM_MATRIXB_TRANS_C12__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C13_C14__COMM_MATRIXB_TRANS_C13_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C13_C14__COMM_MATRIXB_TRANS_C13__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C13_C14__COMM_MATRIXB_TRANS_C14_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C13_C14__COMM_MATRIXB_TRANS_C14__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C21_C22__COMM_MATRIXB_TRANS_C21_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C21_C22__COMM_MATRIXB_TRANS_C21__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C21_C22__COMM_MATRIXB_TRANS_C22_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C21_C22__COMM_MATRIXB_TRANS_C22__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C23_C24__COMM_MATRIXB_TRANS_C23_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C23_C24__COMM_MATRIXB_TRANS_C23__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C23_C24__COMM_MATRIXB_TRANS_C24_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C23_C24__COMM_MATRIXB_TRANS_C24__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C31_C32__COMM_MATRIXB_TRANS_C31_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C31_C32__COMM_MATRIXB_TRANS_C31__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C31_C32__COMM_MATRIXB_TRANS_C32_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C31_C32__COMM_MATRIXB_TRANS_C32__SHIFT 0x10
+#define COMM_MATRIXB_TRANS_C33_C34__COMM_MATRIXB_TRANS_C33_MASK 0xffff
+#define COMM_MATRIXB_TRANS_C33_C34__COMM_MATRIXB_TRANS_C33__SHIFT 0x0
+#define COMM_MATRIXB_TRANS_C33_C34__COMM_MATRIXB_TRANS_C34_MASK 0xffff0000
+#define COMM_MATRIXB_TRANS_C33_C34__COMM_MATRIXB_TRANS_C34__SHIFT 0x10
+#define DENORM_CONTROL__DENORM_MODE_MASK 0x7
+#define DENORM_CONTROL__DENORM_MODE__SHIFT 0x0
+#define DENORM_CONTROL__DENORM_14BIT_OUT_MASK 0x10
+#define DENORM_CONTROL__DENORM_14BIT_OUT__SHIFT 0x4
+#define OUT_ROUND_CONTROL__OUT_ROUND_TRUNC_MODE_MASK 0xf
+#define OUT_ROUND_CONTROL__OUT_ROUND_TRUNC_MODE__SHIFT 0x0
+#define OUT_CLAMP_CONTROL_R_CR__OUT_CLAMP_MAX_R_CR_MASK 0x3fff
+#define OUT_CLAMP_CONTROL_R_CR__OUT_CLAMP_MAX_R_CR__SHIFT 0x0
+#define OUT_CLAMP_CONTROL_R_CR__OUT_CLAMP_MIN_R_CR_MASK 0x3fff0000
+#define OUT_CLAMP_CONTROL_R_CR__OUT_CLAMP_MIN_R_CR__SHIFT 0x10
+#define OUT_CLAMP_CONTROL_G_Y__OUT_CLAMP_MAX_G_Y_MASK 0x3fff
+#define OUT_CLAMP_CONTROL_G_Y__OUT_CLAMP_MAX_G_Y__SHIFT 0x0
+#define OUT_CLAMP_CONTROL_G_Y__OUT_CLAMP_MIN_G_Y_MASK 0x3fff0000
+#define OUT_CLAMP_CONTROL_G_Y__OUT_CLAMP_MIN_G_Y__SHIFT 0x10
+#define OUT_CLAMP_CONTROL_B_CB__OUT_CLAMP_MAX_B_CB_MASK 0x3fff
+#define OUT_CLAMP_CONTROL_B_CB__OUT_CLAMP_MAX_B_CB__SHIFT 0x0
+#define OUT_CLAMP_CONTROL_B_CB__OUT_CLAMP_MIN_B_CB_MASK 0x3fff0000
+#define OUT_CLAMP_CONTROL_B_CB__OUT_CLAMP_MIN_B_CB__SHIFT 0x10
+#define KEY_CONTROL__KEY_MODE_MASK 0x6
+#define KEY_CONTROL__KEY_MODE__SHIFT 0x1
+#define KEY_RANGE_ALPHA__KEY_ALPHA_LOW_MASK 0xffff
+#define KEY_RANGE_ALPHA__KEY_ALPHA_LOW__SHIFT 0x0
+#define KEY_RANGE_ALPHA__KEY_ALPHA_HIGH_MASK 0xffff0000
+#define KEY_RANGE_ALPHA__KEY_ALPHA_HIGH__SHIFT 0x10
+#define KEY_RANGE_RED__KEY_RED_LOW_MASK 0xffff
+#define KEY_RANGE_RED__KEY_RED_LOW__SHIFT 0x0
+#define KEY_RANGE_RED__KEY_RED_HIGH_MASK 0xffff0000
+#define KEY_RANGE_RED__KEY_RED_HIGH__SHIFT 0x10
+#define KEY_RANGE_GREEN__KEY_GREEN_LOW_MASK 0xffff
+#define KEY_RANGE_GREEN__KEY_GREEN_LOW__SHIFT 0x0
+#define KEY_RANGE_GREEN__KEY_GREEN_HIGH_MASK 0xffff0000
+#define KEY_RANGE_GREEN__KEY_GREEN_HIGH__SHIFT 0x10
+#define KEY_RANGE_BLUE__KEY_BLUE_LOW_MASK 0xffff
+#define KEY_RANGE_BLUE__KEY_BLUE_LOW__SHIFT 0x0
+#define KEY_RANGE_BLUE__KEY_BLUE_HIGH_MASK 0xffff0000
+#define KEY_RANGE_BLUE__KEY_BLUE_HIGH__SHIFT 0x10
+#define DEGAMMA_CONTROL__GRPH_DEGAMMA_MODE_MASK 0x3
+#define DEGAMMA_CONTROL__GRPH_DEGAMMA_MODE__SHIFT 0x0
+#define DEGAMMA_CONTROL__CURSOR2_DEGAMMA_MODE_MASK 0x300
+#define DEGAMMA_CONTROL__CURSOR2_DEGAMMA_MODE__SHIFT 0x8
+#define DEGAMMA_CONTROL__CURSOR_DEGAMMA_MODE_MASK 0x3000
+#define DEGAMMA_CONTROL__CURSOR_DEGAMMA_MODE__SHIFT 0xc
+#define GAMUT_REMAP_CONTROL__GRPH_GAMUT_REMAP_MODE_MASK 0x3
+#define GAMUT_REMAP_CONTROL__GRPH_GAMUT_REMAP_MODE__SHIFT 0x0
+#define GAMUT_REMAP_C11_C12__GAMUT_REMAP_C11_MASK 0xffff
+#define GAMUT_REMAP_C11_C12__GAMUT_REMAP_C11__SHIFT 0x0
+#define GAMUT_REMAP_C11_C12__GAMUT_REMAP_C12_MASK 0xffff0000
+#define GAMUT_REMAP_C11_C12__GAMUT_REMAP_C12__SHIFT 0x10
+#define GAMUT_REMAP_C13_C14__GAMUT_REMAP_C13_MASK 0xffff
+#define GAMUT_REMAP_C13_C14__GAMUT_REMAP_C13__SHIFT 0x0
+#define GAMUT_REMAP_C13_C14__GAMUT_REMAP_C14_MASK 0xffff0000
+#define GAMUT_REMAP_C13_C14__GAMUT_REMAP_C14__SHIFT 0x10
+#define GAMUT_REMAP_C21_C22__GAMUT_REMAP_C21_MASK 0xffff
+#define GAMUT_REMAP_C21_C22__GAMUT_REMAP_C21__SHIFT 0x0
+#define GAMUT_REMAP_C21_C22__GAMUT_REMAP_C22_MASK 0xffff0000
+#define GAMUT_REMAP_C21_C22__GAMUT_REMAP_C22__SHIFT 0x10
+#define GAMUT_REMAP_C23_C24__GAMUT_REMAP_C23_MASK 0xffff
+#define GAMUT_REMAP_C23_C24__GAMUT_REMAP_C23__SHIFT 0x0
+#define GAMUT_REMAP_C23_C24__GAMUT_REMAP_C24_MASK 0xffff0000
+#define GAMUT_REMAP_C23_C24__GAMUT_REMAP_C24__SHIFT 0x10
+#define GAMUT_REMAP_C31_C32__GAMUT_REMAP_C31_MASK 0xffff
+#define GAMUT_REMAP_C31_C32__GAMUT_REMAP_C31__SHIFT 0x0
+#define GAMUT_REMAP_C31_C32__GAMUT_REMAP_C32_MASK 0xffff0000
+#define GAMUT_REMAP_C31_C32__GAMUT_REMAP_C32__SHIFT 0x10
+#define GAMUT_REMAP_C33_C34__GAMUT_REMAP_C33_MASK 0xffff
+#define GAMUT_REMAP_C33_C34__GAMUT_REMAP_C33__SHIFT 0x0
+#define GAMUT_REMAP_C33_C34__GAMUT_REMAP_C34_MASK 0xffff0000
+#define GAMUT_REMAP_C33_C34__GAMUT_REMAP_C34__SHIFT 0x10
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_EN_MASK 0x1
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_EN__SHIFT 0x0
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_MODE_MASK 0x30
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_MODE__SHIFT 0x4
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_DEPTH_MASK 0xc0
+#define DCP_SPATIAL_DITHER_CNTL__DCP_SPATIAL_DITHER_DEPTH__SHIFT 0x6
+#define DCP_SPATIAL_DITHER_CNTL__DCP_FRAME_RANDOM_ENABLE_MASK 0x100
+#define DCP_SPATIAL_DITHER_CNTL__DCP_FRAME_RANDOM_ENABLE__SHIFT 0x8
+#define DCP_SPATIAL_DITHER_CNTL__DCP_RGB_RANDOM_ENABLE_MASK 0x200
+#define DCP_SPATIAL_DITHER_CNTL__DCP_RGB_RANDOM_ENABLE__SHIFT 0x9
+#define DCP_SPATIAL_DITHER_CNTL__DCP_HIGHPASS_RANDOM_ENABLE_MASK 0x400
+#define DCP_SPATIAL_DITHER_CNTL__DCP_HIGHPASS_RANDOM_ENABLE__SHIFT 0xa
+#define DCP_RANDOM_SEEDS__DCP_RAND_R_SEED_MASK 0xff
+#define DCP_RANDOM_SEEDS__DCP_RAND_R_SEED__SHIFT 0x0
+#define DCP_RANDOM_SEEDS__DCP_RAND_G_SEED_MASK 0xff00
+#define DCP_RANDOM_SEEDS__DCP_RAND_G_SEED__SHIFT 0x8
+#define DCP_RANDOM_SEEDS__DCP_RAND_B_SEED_MASK 0xff0000
+#define DCP_RANDOM_SEEDS__DCP_RAND_B_SEED__SHIFT 0x10
+#define DCP_FP_CONVERTED_FIELD__DCP_FP_CONVERTED_FIELD_DATA_MASK 0x3ffff
+#define DCP_FP_CONVERTED_FIELD__DCP_FP_CONVERTED_FIELD_DATA__SHIFT 0x0
+#define DCP_FP_CONVERTED_FIELD__DCP_FP_CONVERTED_FIELD_INDEX_MASK 0x7f00000
+#define DCP_FP_CONVERTED_FIELD__DCP_FP_CONVERTED_FIELD_INDEX__SHIFT 0x14
+#define CUR_CONTROL__CURSOR_EN_MASK 0x1
+#define CUR_CONTROL__CURSOR_EN__SHIFT 0x0
+#define CUR_CONTROL__CUR_INV_TRANS_CLAMP_MASK 0x10
+#define CUR_CONTROL__CUR_INV_TRANS_CLAMP__SHIFT 0x4
+#define CUR_CONTROL__CURSOR_MODE_MASK 0x300
+#define CUR_CONTROL__CURSOR_MODE__SHIFT 0x8
+#define CUR_CONTROL__CURSOR_BUSY_START_LINE_POSITION_MASK 0xf000
+#define CUR_CONTROL__CURSOR_BUSY_START_LINE_POSITION__SHIFT 0xc
+#define CUR_CONTROL__CURSOR_2X_MAGNIFY_MASK 0x10000
+#define CUR_CONTROL__CURSOR_2X_MAGNIFY__SHIFT 0x10
+#define CUR_CONTROL__CURSOR_FORCE_MC_ON_MASK 0x100000
+#define CUR_CONTROL__CURSOR_FORCE_MC_ON__SHIFT 0x14
+#define CUR_CONTROL__CURSOR_URGENT_CONTROL_MASK 0x7000000
+#define CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT 0x18
+#define CUR_SURFACE_ADDRESS__CURSOR_SURFACE_ADDRESS_MASK 0xffffffff
+#define CUR_SURFACE_ADDRESS__CURSOR_SURFACE_ADDRESS__SHIFT 0x0
+#define CUR_SIZE__CURSOR_HEIGHT_MASK 0x7f
+#define CUR_SIZE__CURSOR_HEIGHT__SHIFT 0x0
+#define CUR_SIZE__CURSOR_WIDTH_MASK 0x7f0000
+#define CUR_SIZE__CURSOR_WIDTH__SHIFT 0x10
+#define CUR_SURFACE_ADDRESS_HIGH__CURSOR_SURFACE_ADDRESS_HIGH_MASK 0xff
+#define CUR_SURFACE_ADDRESS_HIGH__CURSOR_SURFACE_ADDRESS_HIGH__SHIFT 0x0
+#define CUR_POSITION__CURSOR_Y_POSITION_MASK 0x3fff
+#define CUR_POSITION__CURSOR_Y_POSITION__SHIFT 0x0
+#define CUR_POSITION__CURSOR_X_POSITION_MASK 0x3fff0000
+#define CUR_POSITION__CURSOR_X_POSITION__SHIFT 0x10
+#define CUR_HOT_SPOT__CURSOR_HOT_SPOT_Y_MASK 0x7f
+#define CUR_HOT_SPOT__CURSOR_HOT_SPOT_Y__SHIFT 0x0
+#define CUR_HOT_SPOT__CURSOR_HOT_SPOT_X_MASK 0x7f0000
+#define CUR_HOT_SPOT__CURSOR_HOT_SPOT_X__SHIFT 0x10
+#define CUR_COLOR1__CUR_COLOR1_BLUE_MASK 0xff
+#define CUR_COLOR1__CUR_COLOR1_BLUE__SHIFT 0x0
+#define CUR_COLOR1__CUR_COLOR1_GREEN_MASK 0xff00
+#define CUR_COLOR1__CUR_COLOR1_GREEN__SHIFT 0x8
+#define CUR_COLOR1__CUR_COLOR1_RED_MASK 0xff0000
+#define CUR_COLOR1__CUR_COLOR1_RED__SHIFT 0x10
+#define CUR_COLOR2__CUR_COLOR2_BLUE_MASK 0xff
+#define CUR_COLOR2__CUR_COLOR2_BLUE__SHIFT 0x0
+#define CUR_COLOR2__CUR_COLOR2_GREEN_MASK 0xff00
+#define CUR_COLOR2__CUR_COLOR2_GREEN__SHIFT 0x8
+#define CUR_COLOR2__CUR_COLOR2_RED_MASK 0xff0000
+#define CUR_COLOR2__CUR_COLOR2_RED__SHIFT 0x10
+#define CUR_UPDATE__CURSOR_UPDATE_PENDING_MASK 0x1
+#define CUR_UPDATE__CURSOR_UPDATE_PENDING__SHIFT 0x0
+#define CUR_UPDATE__CURSOR_UPDATE_TAKEN_MASK 0x2
+#define CUR_UPDATE__CURSOR_UPDATE_TAKEN__SHIFT 0x1
+#define CUR_UPDATE__CURSOR_UPDATE_LOCK_MASK 0x10000
+#define CUR_UPDATE__CURSOR_UPDATE_LOCK__SHIFT 0x10
+#define CUR_UPDATE__CURSOR_DISABLE_MULTIPLE_UPDATE_MASK 0x1000000
+#define CUR_UPDATE__CURSOR_DISABLE_MULTIPLE_UPDATE__SHIFT 0x18
+#define CUR_UPDATE__CURSOR_UPDATE_STEREO_MODE_MASK 0x6000000
+#define CUR_UPDATE__CURSOR_UPDATE_STEREO_MODE__SHIFT 0x19
+#define CUR_REQUEST_FILTER_CNTL__CUR_REQUEST_FILTER_DIS_MASK 0x1
+#define CUR_REQUEST_FILTER_CNTL__CUR_REQUEST_FILTER_DIS__SHIFT 0x0
+#define CUR_STEREO_CONTROL__CURSOR_STEREO_EN_MASK 0x1
+#define CUR_STEREO_CONTROL__CURSOR_STEREO_EN__SHIFT 0x0
+#define CUR_STEREO_CONTROL__CURSOR_STEREO_OFFSET_YNX_MASK 0x2
+#define CUR_STEREO_CONTROL__CURSOR_STEREO_OFFSET_YNX__SHIFT 0x1
+#define CUR_STEREO_CONTROL__CURSOR_PRIMARY_OFFSET_MASK 0x3ff0
+#define CUR_STEREO_CONTROL__CURSOR_PRIMARY_OFFSET__SHIFT 0x4
+#define CUR_STEREO_CONTROL__CURSOR_SECONDARY_OFFSET_MASK 0x3ff0000
+#define CUR_STEREO_CONTROL__CURSOR_SECONDARY_OFFSET__SHIFT 0x10
+#define DC_LUT_RW_MODE__DC_LUT_RW_MODE_MASK 0x1
+#define DC_LUT_RW_MODE__DC_LUT_RW_MODE__SHIFT 0x0
+#define DC_LUT_RW_MODE__DC_LUT_ERROR_MASK 0x10000
+#define DC_LUT_RW_MODE__DC_LUT_ERROR__SHIFT 0x10
+#define DC_LUT_RW_MODE__DC_LUT_ERROR_RST_MASK 0x20000
+#define DC_LUT_RW_MODE__DC_LUT_ERROR_RST__SHIFT 0x11
+#define DC_LUT_RW_INDEX__DC_LUT_RW_INDEX_MASK 0xff
+#define DC_LUT_RW_INDEX__DC_LUT_RW_INDEX__SHIFT 0x0
+#define DC_LUT_SEQ_COLOR__DC_LUT_SEQ_COLOR_MASK 0xffff
+#define DC_LUT_SEQ_COLOR__DC_LUT_SEQ_COLOR__SHIFT 0x0
+#define DC_LUT_PWL_DATA__DC_LUT_BASE_MASK 0xffff
+#define DC_LUT_PWL_DATA__DC_LUT_BASE__SHIFT 0x0
+#define DC_LUT_PWL_DATA__DC_LUT_DELTA_MASK 0xffff0000
+#define DC_LUT_PWL_DATA__DC_LUT_DELTA__SHIFT 0x10
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_BLUE_MASK 0x3ff
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_BLUE__SHIFT 0x0
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_GREEN_MASK 0xffc00
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_GREEN__SHIFT 0xa
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_RED_MASK 0x3ff00000
+#define DC_LUT_30_COLOR__DC_LUT_COLOR_10_RED__SHIFT 0x14
+#define DC_LUT_VGA_ACCESS_ENABLE__DC_LUT_VGA_ACCESS_ENABLE_MASK 0x1
+#define DC_LUT_VGA_ACCESS_ENABLE__DC_LUT_VGA_ACCESS_ENABLE__SHIFT 0x0
+#define DC_LUT_WRITE_EN_MASK__DC_LUT_WRITE_EN_MASK_MASK 0x7
+#define DC_LUT_WRITE_EN_MASK__DC_LUT_WRITE_EN_MASK__SHIFT 0x0
+#define DC_LUT_AUTOFILL__DC_LUT_AUTOFILL_MASK 0x1
+#define DC_LUT_AUTOFILL__DC_LUT_AUTOFILL__SHIFT 0x0
+#define DC_LUT_AUTOFILL__DC_LUT_AUTOFILL_DONE_MASK 0x2
+#define DC_LUT_AUTOFILL__DC_LUT_AUTOFILL_DONE__SHIFT 0x1
+#define DC_LUT_CONTROL__DC_LUT_INC_B_MASK 0xf
+#define DC_LUT_CONTROL__DC_LUT_INC_B__SHIFT 0x0
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_SIGNED_EN_MASK 0x10
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_SIGNED_EN__SHIFT 0x4
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_FLOAT_POINT_EN_MASK 0x20
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_FLOAT_POINT_EN__SHIFT 0x5
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_FORMAT_MASK 0xc0
+#define DC_LUT_CONTROL__DC_LUT_DATA_B_FORMAT__SHIFT 0x6
+#define DC_LUT_CONTROL__DC_LUT_INC_G_MASK 0xf00
+#define DC_LUT_CONTROL__DC_LUT_INC_G__SHIFT 0x8
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_SIGNED_EN_MASK 0x1000
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_SIGNED_EN__SHIFT 0xc
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_FLOAT_POINT_EN_MASK 0x2000
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_FLOAT_POINT_EN__SHIFT 0xd
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_FORMAT_MASK 0xc000
+#define DC_LUT_CONTROL__DC_LUT_DATA_G_FORMAT__SHIFT 0xe
+#define DC_LUT_CONTROL__DC_LUT_INC_R_MASK 0xf0000
+#define DC_LUT_CONTROL__DC_LUT_INC_R__SHIFT 0x10
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_SIGNED_EN_MASK 0x100000
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_SIGNED_EN__SHIFT 0x14
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_FLOAT_POINT_EN_MASK 0x200000
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_FLOAT_POINT_EN__SHIFT 0x15
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_FORMAT_MASK 0xc00000
+#define DC_LUT_CONTROL__DC_LUT_DATA_R_FORMAT__SHIFT 0x16
+#define DC_LUT_BLACK_OFFSET_BLUE__DC_LUT_BLACK_OFFSET_BLUE_MASK 0xffff
+#define DC_LUT_BLACK_OFFSET_BLUE__DC_LUT_BLACK_OFFSET_BLUE__SHIFT 0x0
+#define DC_LUT_BLACK_OFFSET_GREEN__DC_LUT_BLACK_OFFSET_GREEN_MASK 0xffff
+#define DC_LUT_BLACK_OFFSET_GREEN__DC_LUT_BLACK_OFFSET_GREEN__SHIFT 0x0
+#define DC_LUT_BLACK_OFFSET_RED__DC_LUT_BLACK_OFFSET_RED_MASK 0xffff
+#define DC_LUT_BLACK_OFFSET_RED__DC_LUT_BLACK_OFFSET_RED__SHIFT 0x0
+#define DC_LUT_WHITE_OFFSET_BLUE__DC_LUT_WHITE_OFFSET_BLUE_MASK 0xffff
+#define DC_LUT_WHITE_OFFSET_BLUE__DC_LUT_WHITE_OFFSET_BLUE__SHIFT 0x0
+#define DC_LUT_WHITE_OFFSET_GREEN__DC_LUT_WHITE_OFFSET_GREEN_MASK 0xffff
+#define DC_LUT_WHITE_OFFSET_GREEN__DC_LUT_WHITE_OFFSET_GREEN__SHIFT 0x0
+#define DC_LUT_WHITE_OFFSET_RED__DC_LUT_WHITE_OFFSET_RED_MASK 0xffff
+#define DC_LUT_WHITE_OFFSET_RED__DC_LUT_WHITE_OFFSET_RED__SHIFT 0x0
+#define DCP_CRC_CONTROL__DCP_CRC_ENABLE_MASK 0x1
+#define DCP_CRC_CONTROL__DCP_CRC_ENABLE__SHIFT 0x0
+#define DCP_CRC_CONTROL__DCP_CRC_SOURCE_SEL_MASK 0x1c
+#define DCP_CRC_CONTROL__DCP_CRC_SOURCE_SEL__SHIFT 0x2
+#define DCP_CRC_CONTROL__DCP_CRC_LINE_SEL_MASK 0x300
+#define DCP_CRC_CONTROL__DCP_CRC_LINE_SEL__SHIFT 0x8
+#define DCP_CRC_MASK__DCP_CRC_MASK_MASK 0xffffffff
+#define DCP_CRC_MASK__DCP_CRC_MASK__SHIFT 0x0
+#define DCP_CRC_CURRENT__DCP_CRC_CURRENT_MASK 0xffffffff
+#define DCP_CRC_CURRENT__DCP_CRC_CURRENT__SHIFT 0x0
+#define DVMM_PTE_CONTROL__DVMM_USE_SINGLE_PTE_MASK 0x1
+#define DVMM_PTE_CONTROL__DVMM_USE_SINGLE_PTE__SHIFT 0x0
+#define DVMM_PTE_CONTROL__DVMM_PAGE_WIDTH_MASK 0x1e
+#define DVMM_PTE_CONTROL__DVMM_PAGE_WIDTH__SHIFT 0x1
+#define DVMM_PTE_CONTROL__DVMM_PAGE_HEIGHT_MASK 0x1e0
+#define DVMM_PTE_CONTROL__DVMM_PAGE_HEIGHT__SHIFT 0x5
+#define DVMM_PTE_CONTROL__DVMM_MIN_PTE_BEFORE_FLIP_MASK 0x7fe00
+#define DVMM_PTE_CONTROL__DVMM_MIN_PTE_BEFORE_FLIP__SHIFT 0x9
+#define DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE0_MASK 0x100000
+#define DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE0__SHIFT 0x14
+#define DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE1_MASK 0x200000
+#define DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE1__SHIFT 0x15
+#define DCP_CRC_LAST__DCP_CRC_LAST_MASK 0xffffffff
+#define DCP_CRC_LAST__DCP_CRC_LAST__SHIFT 0x0
+#define DCP_DEBUG__DCP_DEBUG_MASK 0xffffffff
+#define DCP_DEBUG__DCP_DEBUG__SHIFT 0x0
+#define GRPH_FLIP_RATE_CNTL__GRPH_FLIP_RATE_MASK 0x7
+#define GRPH_FLIP_RATE_CNTL__GRPH_FLIP_RATE__SHIFT 0x0
+#define GRPH_FLIP_RATE_CNTL__GRPH_FLIP_RATE_ENABLE_MASK 0x8
+#define GRPH_FLIP_RATE_CNTL__GRPH_FLIP_RATE_ENABLE__SHIFT 0x3
+#define DCP_GSL_CONTROL__DCP_GSL0_EN_MASK 0x1
+#define DCP_GSL_CONTROL__DCP_GSL0_EN__SHIFT 0x0
+#define DCP_GSL_CONTROL__DCP_GSL1_EN_MASK 0x2
+#define DCP_GSL_CONTROL__DCP_GSL1_EN__SHIFT 0x1
+#define DCP_GSL_CONTROL__DCP_GSL2_EN_MASK 0x4
+#define DCP_GSL_CONTROL__DCP_GSL2_EN__SHIFT 0x2
+#define DCP_GSL_CONTROL__DCP_GSL_HSYNC_FLIP_FORCE_DELAY_MASK 0xf000
+#define DCP_GSL_CONTROL__DCP_GSL_HSYNC_FLIP_FORCE_DELAY__SHIFT 0xc
+#define DCP_GSL_CONTROL__DCP_GSL_MASTER_EN_MASK 0x10000
+#define DCP_GSL_CONTROL__DCP_GSL_MASTER_EN__SHIFT 0x10
+#define DCP_GSL_CONTROL__DCP_GSL_XDMA_GROUP_MASK 0x60000
+#define DCP_GSL_CONTROL__DCP_GSL_XDMA_GROUP__SHIFT 0x11
+#define DCP_GSL_CONTROL__DCP_GSL_XDMA_GROUP_UNDERFLOW_EN_MASK 0x80000
+#define DCP_GSL_CONTROL__DCP_GSL_XDMA_GROUP_UNDERFLOW_EN__SHIFT 0x13
+#define DCP_GSL_CONTROL__DCP_GSL_SYNC_SOURCE_MASK 0x3000000
+#define DCP_GSL_CONTROL__DCP_GSL_SYNC_SOURCE__SHIFT 0x18
+#define DCP_GSL_CONTROL__DCP_GSL_DELAY_SURFACE_UPDATE_PENDING_MASK 0x8000000
+#define DCP_GSL_CONTROL__DCP_GSL_DELAY_SURFACE_UPDATE_PENDING__SHIFT 0x1b
+#define DCP_GSL_CONTROL__DCP_GSL_HSYNC_FLIP_CHECK_DELAY_MASK 0xf0000000
+#define DCP_GSL_CONTROL__DCP_GSL_HSYNC_FLIP_CHECK_DELAY__SHIFT 0x1c
+#define DCP_LB_DATA_GAP_BETWEEN_CHUNK__DCP_LB_GAP_BETWEEN_CHUNK_20BPP_MASK 0xf
+#define DCP_LB_DATA_GAP_BETWEEN_CHUNK__DCP_LB_GAP_BETWEEN_CHUNK_20BPP__SHIFT 0x0
+#define DCP_LB_DATA_GAP_BETWEEN_CHUNK__DCP_LB_GAP_BETWEEN_CHUNK_30BPP_MASK 0x1f0
+#define DCP_LB_DATA_GAP_BETWEEN_CHUNK__DCP_LB_GAP_BETWEEN_CHUNK_30BPP__SHIFT 0x4
+#define DCP_DEBUG_SG__DCP_DEBUG_SG_MASK 0xffffffff
+#define DCP_DEBUG_SG__DCP_DEBUG_SG__SHIFT 0x0
+#define DCP_DEBUG_SG2__DCP_DEBUG_SG2_MASK 0xffffffff
+#define DCP_DEBUG_SG2__DCP_DEBUG_SG2__SHIFT 0x0
+#define DCP_DVMM_DEBUG__DCP_DVMM_DEBUG_MASK 0xffffffff
+#define DCP_DVMM_DEBUG__DCP_DVMM_DEBUG__SHIFT 0x0
+#define DCP_TEST_DEBUG_INDEX__DCP_TEST_DEBUG_INDEX_MASK 0xff
+#define DCP_TEST_DEBUG_INDEX__DCP_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCP_TEST_DEBUG_INDEX__DCP_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCP_TEST_DEBUG_INDEX__DCP_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCP_TEST_DEBUG_DATA__DCP_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCP_TEST_DEBUG_DATA__DCP_TEST_DEBUG_DATA__SHIFT 0x0
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_EN_MASK 0x1
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_EN__SHIFT 0x0
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_MODE_MASK 0x300
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_MODE__SHIFT 0x8
+#define GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_SURFACE_PENDING_MASK 0x10000
+#define GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_SURFACE_PENDING__SHIFT 0x10
+#define GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_SURFACE_PENDING_MASK 0x20000
+#define GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_SURFACE_PENDING__SHIFT 0x11
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_SELECT_DISABLE_MASK 0x10000000
+#define GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_SELECT_DISABLE__SHIFT 0x1c
+#define DCP_DEBUG2__DCP_DEBUG2_MASK 0xffffffff
+#define DCP_DEBUG2__DCP_DEBUG2__SHIFT 0x0
+#define HW_ROTATION__GRPH_ROTATION_ANGLE_MASK 0x7
+#define HW_ROTATION__GRPH_ROTATION_ANGLE__SHIFT 0x0
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN_MASK 0x1
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_CNT_EN__SHIFT 0x0
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE_MASK 0x2
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_CNT_MODE__SHIFT 0x1
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_CNT_MASK 0x1fff0
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_CNTL__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_CNT__SHIFT 0x4
+#define REGAMMA_CONTROL__GRPH_REGAMMA_MODE_MASK 0x7
+#define REGAMMA_CONTROL__GRPH_REGAMMA_MODE__SHIFT 0x0
+#define REGAMMA_LUT_INDEX__REGAMMA_LUT_INDEX_MASK 0x1ff
+#define REGAMMA_LUT_INDEX__REGAMMA_LUT_INDEX__SHIFT 0x0
+#define REGAMMA_LUT_DATA__REGAMMA_LUT_DATA_MASK 0x7ffff
+#define REGAMMA_LUT_DATA__REGAMMA_LUT_DATA__SHIFT 0x0
+#define REGAMMA_LUT_WRITE_EN_MASK__REGAMMA_LUT_WRITE_EN_MASK_MASK 0x7
+#define REGAMMA_LUT_WRITE_EN_MASK__REGAMMA_LUT_WRITE_EN_MASK__SHIFT 0x0
+#define REGAMMA_CNTLA_START_CNTL__REGAMMA_CNTLA_EXP_REGION_START_MASK 0x3ffff
+#define REGAMMA_CNTLA_START_CNTL__REGAMMA_CNTLA_EXP_REGION_START__SHIFT 0x0
+#define REGAMMA_CNTLA_START_CNTL__REGAMMA_CNTLA_EXP_REGION_START_SEGMENT_MASK 0x7f00000
+#define REGAMMA_CNTLA_START_CNTL__REGAMMA_CNTLA_EXP_REGION_START_SEGMENT__SHIFT 0x14
+#define REGAMMA_CNTLA_SLOPE_CNTL__REGAMMA_CNTLA_EXP_REGION_LINEAR_SLOPE_MASK 0x3ffff
+#define REGAMMA_CNTLA_SLOPE_CNTL__REGAMMA_CNTLA_EXP_REGION_LINEAR_SLOPE__SHIFT 0x0
+#define REGAMMA_CNTLA_END_CNTL1__REGAMMA_CNTLA_EXP_REGION_END_MASK 0xffff
+#define REGAMMA_CNTLA_END_CNTL1__REGAMMA_CNTLA_EXP_REGION_END__SHIFT 0x0
+#define REGAMMA_CNTLA_END_CNTL2__REGAMMA_CNTLA_EXP_REGION_END_SLOPE_MASK 0xffff
+#define REGAMMA_CNTLA_END_CNTL2__REGAMMA_CNTLA_EXP_REGION_END_SLOPE__SHIFT 0x0
+#define REGAMMA_CNTLA_END_CNTL2__REGAMMA_CNTLA_EXP_REGION_END_BASE_MASK 0xffff0000
+#define REGAMMA_CNTLA_END_CNTL2__REGAMMA_CNTLA_EXP_REGION_END_BASE__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION0_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION0_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION0_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION0_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION1_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION1_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION1_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_0_1__REGAMMA_CNTLA_EXP_REGION1_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION2_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION2_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION2_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION2_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION3_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION3_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION3_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_2_3__REGAMMA_CNTLA_EXP_REGION3_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION4_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION4_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION4_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION4_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION5_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION5_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION5_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_4_5__REGAMMA_CNTLA_EXP_REGION5_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION6_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION6_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION6_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION6_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION7_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION7_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION7_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_6_7__REGAMMA_CNTLA_EXP_REGION7_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION8_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION8_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION8_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION8_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION9_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION9_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION9_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_8_9__REGAMMA_CNTLA_EXP_REGION9_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION10_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION10_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION10_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION10_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION11_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION11_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION11_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_10_11__REGAMMA_CNTLA_EXP_REGION11_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION12_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION12_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION12_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION12_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION13_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION13_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION13_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_12_13__REGAMMA_CNTLA_EXP_REGION13_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION14_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION14_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION14_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION14_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION15_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION15_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION15_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLA_REGION_14_15__REGAMMA_CNTLA_EXP_REGION15_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_START_CNTL__REGAMMA_CNTLB_EXP_REGION_START_MASK 0x3ffff
+#define REGAMMA_CNTLB_START_CNTL__REGAMMA_CNTLB_EXP_REGION_START__SHIFT 0x0
+#define REGAMMA_CNTLB_START_CNTL__REGAMMA_CNTLB_EXP_REGION_START_SEGMENT_MASK 0x7f00000
+#define REGAMMA_CNTLB_START_CNTL__REGAMMA_CNTLB_EXP_REGION_START_SEGMENT__SHIFT 0x14
+#define REGAMMA_CNTLB_SLOPE_CNTL__REGAMMA_CNTLB_EXP_REGION_LINEAR_SLOPE_MASK 0x3ffff
+#define REGAMMA_CNTLB_SLOPE_CNTL__REGAMMA_CNTLB_EXP_REGION_LINEAR_SLOPE__SHIFT 0x0
+#define REGAMMA_CNTLB_END_CNTL1__REGAMMA_CNTLB_EXP_REGION_END_MASK 0xffff
+#define REGAMMA_CNTLB_END_CNTL1__REGAMMA_CNTLB_EXP_REGION_END__SHIFT 0x0
+#define REGAMMA_CNTLB_END_CNTL2__REGAMMA_CNTLB_EXP_REGION_END_SLOPE_MASK 0xffff
+#define REGAMMA_CNTLB_END_CNTL2__REGAMMA_CNTLB_EXP_REGION_END_SLOPE__SHIFT 0x0
+#define REGAMMA_CNTLB_END_CNTL2__REGAMMA_CNTLB_EXP_REGION_END_BASE_MASK 0xffff0000
+#define REGAMMA_CNTLB_END_CNTL2__REGAMMA_CNTLB_EXP_REGION_END_BASE__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION0_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION0_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION0_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION0_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION1_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION1_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION1_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_0_1__REGAMMA_CNTLB_EXP_REGION1_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION2_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION2_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION2_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION2_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION3_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION3_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION3_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_2_3__REGAMMA_CNTLB_EXP_REGION3_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION4_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION4_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION4_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION4_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION5_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION5_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION5_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_4_5__REGAMMA_CNTLB_EXP_REGION5_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION6_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION6_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION6_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION6_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION7_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION7_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION7_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_6_7__REGAMMA_CNTLB_EXP_REGION7_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION8_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION8_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION8_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION8_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION9_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION9_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION9_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_8_9__REGAMMA_CNTLB_EXP_REGION9_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION10_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION10_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION10_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION10_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION11_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION11_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION11_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_10_11__REGAMMA_CNTLB_EXP_REGION11_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION12_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION12_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION12_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION12_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION13_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION13_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION13_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_12_13__REGAMMA_CNTLB_EXP_REGION13_NUM_SEGMENTS__SHIFT 0x1c
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION14_LUT_OFFSET_MASK 0x1ff
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION14_LUT_OFFSET__SHIFT 0x0
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION14_NUM_SEGMENTS_MASK 0x7000
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION14_NUM_SEGMENTS__SHIFT 0xc
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION15_LUT_OFFSET_MASK 0x1ff0000
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION15_LUT_OFFSET__SHIFT 0x10
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION15_NUM_SEGMENTS_MASK 0x70000000
+#define REGAMMA_CNTLB_REGION_14_15__REGAMMA_CNTLB_EXP_REGION15_NUM_SEGMENTS__SHIFT 0x1c
+#define ALPHA_CONTROL__ALPHA_ROUND_TRUNC_MODE_MASK 0x1
+#define ALPHA_CONTROL__ALPHA_ROUND_TRUNC_MODE__SHIFT 0x0
+#define ALPHA_CONTROL__CURSOR_ALPHA_BLND_ENA_MASK 0x2
+#define ALPHA_CONTROL__CURSOR_ALPHA_BLND_ENA__SHIFT 0x1
+#define GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_MASK 0xffffff00
+#define GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__GRPH_XDMA_RECOVERY_SURFACE_ADDRESS__SHIFT 0x8
+#define GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH_MASK 0xff
+#define GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__GRPH_XDMA_RECOVERY_SURFACE_ADDRESS_HIGH__SHIFT 0x0
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_CNT_MASK 0xfffff
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_CNT__SHIFT 0x0
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_CNT_STATUS_MASK 0x1000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_CNT_STATUS__SHIFT 0x18
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK_MASK 0x2000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_MASK__SHIFT 0x19
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK_MASK 0x4000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_FRAME_ACK__SHIFT 0x1a
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK 0x10000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT__SHIFT 0x1c
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK_MASK 0x20000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT_MASK__SHIFT 0x1d
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK_MASK 0x40000000
+#define GRPH_XDMA_CACHE_UNDERFLOW_DET_STATUS__GRPH_XDMA_CACHE_UNDERFLOW_INT_ACK__SHIFT 0x1e
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_EN_MASK 0x1
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_EN__SHIFT 0x0
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_EVENT_SELECT_MASK 0x1e
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_EVENT_SELECT__SHIFT 0x1
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED_MASK 0x200
+#define GRPH_SURFACE_COUNTER_CONTROL__GRPH_SURFACE_COUNTER_ERR_WRAP_OCCURED__SHIFT 0x9
+#define GRPH_SURFACE_COUNTER_OUTPUT__GRPH_SURFACE_COUNTER_MIN_MASK 0xffff
+#define GRPH_SURFACE_COUNTER_OUTPUT__GRPH_SURFACE_COUNTER_MIN__SHIFT 0x0
+#define GRPH_SURFACE_COUNTER_OUTPUT__GRPH_SURFACE_COUNTER_MAX_MASK 0xffff0000
+#define GRPH_SURFACE_COUNTER_OUTPUT__GRPH_SURFACE_COUNTER_MAX__SHIFT 0x10
+#define DIG_FE_CNTL__DIG_SOURCE_SELECT_MASK 0x7
+#define DIG_FE_CNTL__DIG_SOURCE_SELECT__SHIFT 0x0
+#define DIG_FE_CNTL__DIG_STEREOSYNC_SELECT_MASK 0x70
+#define DIG_FE_CNTL__DIG_STEREOSYNC_SELECT__SHIFT 0x4
+#define DIG_FE_CNTL__DIG_STEREOSYNC_GATE_EN_MASK 0x100
+#define DIG_FE_CNTL__DIG_STEREOSYNC_GATE_EN__SHIFT 0x8
+#define DIG_FE_CNTL__DIG_START_MASK 0x400
+#define DIG_FE_CNTL__DIG_START__SHIFT 0xa
+#define DIG_FE_CNTL__DIG_SYMCLK_FE_ON_MASK 0x1000000
+#define DIG_FE_CNTL__DIG_SYMCLK_FE_ON__SHIFT 0x18
+#define DIG_FE_CNTL__TMDS_PIXEL_ENCODING_MASK 0x10000000
+#define DIG_FE_CNTL__TMDS_PIXEL_ENCODING__SHIFT 0x1c
+#define DIG_FE_CNTL__TMDS_COLOR_FORMAT_MASK 0xc0000000
+#define DIG_FE_CNTL__TMDS_COLOR_FORMAT__SHIFT 0x1e
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_EN_MASK 0x1
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_EN__SHIFT 0x0
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_LINK_SEL_MASK 0x10
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_LINK_SEL__SHIFT 0x4
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_DATA_SEL_MASK 0x300
+#define DIG_OUTPUT_CRC_CNTL__DIG_OUTPUT_CRC_DATA_SEL__SHIFT 0x8
+#define DIG_OUTPUT_CRC_RESULT__DIG_OUTPUT_CRC_RESULT_MASK 0x3fffffff
+#define DIG_OUTPUT_CRC_RESULT__DIG_OUTPUT_CRC_RESULT__SHIFT 0x0
+#define DIG_CLOCK_PATTERN__DIG_CLOCK_PATTERN_MASK 0x3ff
+#define DIG_CLOCK_PATTERN__DIG_CLOCK_PATTERN__SHIFT 0x0
+#define DIG_TEST_PATTERN__DIG_TEST_PATTERN_OUT_EN_MASK 0x1
+#define DIG_TEST_PATTERN__DIG_TEST_PATTERN_OUT_EN__SHIFT 0x0
+#define DIG_TEST_PATTERN__DIG_HALF_CLOCK_PATTERN_SEL_MASK 0x2
+#define DIG_TEST_PATTERN__DIG_HALF_CLOCK_PATTERN_SEL__SHIFT 0x1
+#define DIG_TEST_PATTERN__DIG_RANDOM_PATTERN_OUT_EN_MASK 0x10
+#define DIG_TEST_PATTERN__DIG_RANDOM_PATTERN_OUT_EN__SHIFT 0x4
+#define DIG_TEST_PATTERN__DIG_RANDOM_PATTERN_RESET_MASK 0x20
+#define DIG_TEST_PATTERN__DIG_RANDOM_PATTERN_RESET__SHIFT 0x5
+#define DIG_TEST_PATTERN__DIG_TEST_PATTERN_EXTERNAL_RESET_EN_MASK 0x40
+#define DIG_TEST_PATTERN__DIG_TEST_PATTERN_EXTERNAL_RESET_EN__SHIFT 0x6
+#define DIG_TEST_PATTERN__DIG_STATIC_TEST_PATTERN_MASK 0x3ff0000
+#define DIG_TEST_PATTERN__DIG_STATIC_TEST_PATTERN__SHIFT 0x10
+#define DIG_RANDOM_PATTERN_SEED__DIG_RANDOM_PATTERN_SEED_MASK 0xffffff
+#define DIG_RANDOM_PATTERN_SEED__DIG_RANDOM_PATTERN_SEED__SHIFT 0x0
+#define DIG_RANDOM_PATTERN_SEED__DIG_RAN_PAT_DURING_DE_ONLY_MASK 0x1000000
+#define DIG_RANDOM_PATTERN_SEED__DIG_RAN_PAT_DURING_DE_ONLY__SHIFT 0x18
+#define DIG_FIFO_STATUS__DIG_FIFO_LEVEL_ERROR_MASK 0x1
+#define DIG_FIFO_STATUS__DIG_FIFO_LEVEL_ERROR__SHIFT 0x0
+#define DIG_FIFO_STATUS__DIG_FIFO_USE_OVERWRITE_LEVEL_MASK 0x2
+#define DIG_FIFO_STATUS__DIG_FIFO_USE_OVERWRITE_LEVEL__SHIFT 0x1
+#define DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL_MASK 0xfc
+#define DIG_FIFO_STATUS__DIG_FIFO_OVERWRITE_LEVEL__SHIFT 0x2
+#define DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK_MASK 0x100
+#define DIG_FIFO_STATUS__DIG_FIFO_ERROR_ACK__SHIFT 0x8
+#define DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL_MASK 0xfc00
+#define DIG_FIFO_STATUS__DIG_FIFO_CAL_AVERAGE_LEVEL__SHIFT 0xa
+#define DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL_MASK 0x1f0000
+#define DIG_FIFO_STATUS__DIG_FIFO_MAXIMUM_LEVEL__SHIFT 0x10
+#define DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL_MASK 0x3c00000
+#define DIG_FIFO_STATUS__DIG_FIFO_MINIMUM_LEVEL__SHIFT 0x16
+#define DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC_MASK 0x4000000
+#define DIG_FIFO_STATUS__DIG_FIFO_READ_CLOCK_SRC__SHIFT 0x1a
+#define DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED_MASK 0x20000000
+#define DIG_FIFO_STATUS__DIG_FIFO_CALIBRATED__SHIFT 0x1d
+#define DIG_FIFO_STATUS__DIG_FIFO_FORCE_RECAL_AVERAGE_MASK 0x40000000
+#define DIG_FIFO_STATUS__DIG_FIFO_FORCE_RECAL_AVERAGE__SHIFT 0x1e
+#define DIG_FIFO_STATUS__DIG_FIFO_FORCE_RECOMP_MINMAX_MASK 0x80000000
+#define DIG_FIFO_STATUS__DIG_FIFO_FORCE_RECOMP_MINMAX__SHIFT 0x1f
+#define DIG_DISPCLK_SWITCH_CNTL__DIG_DISPCLK_SWITCH_POINT_MASK 0x1
+#define DIG_DISPCLK_SWITCH_CNTL__DIG_DISPCLK_SWITCH_POINT__SHIFT 0x0
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_MASK 0x1
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED__SHIFT 0x0
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT_MASK 0x10
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT__SHIFT 0x4
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT_ACK_MASK 0x100
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT_ACK__SHIFT 0x8
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT_MASK_MASK 0x1000
+#define DIG_DISPCLK_SWITCH_STATUS__DIG_DISPCLK_SWITCH_ALLOWED_INT_MASK__SHIFT 0xc
+#define HDMI_CONTROL__HDMI_KEEPOUT_MODE_MASK 0x1
+#define HDMI_CONTROL__HDMI_KEEPOUT_MODE__SHIFT 0x0
+#define HDMI_CONTROL__HDMI_CLOCK_CHANNEL_RATE_MASK 0x4
+#define HDMI_CONTROL__HDMI_CLOCK_CHANNEL_RATE__SHIFT 0x2
+#define HDMI_CONTROL__HDMI_NO_EXTRA_NULL_PACKET_FILLED_MASK 0x8
+#define HDMI_CONTROL__HDMI_NO_EXTRA_NULL_PACKET_FILLED__SHIFT 0x3
+#define HDMI_CONTROL__HDMI_PACKET_GEN_VERSION_MASK 0x10
+#define HDMI_CONTROL__HDMI_PACKET_GEN_VERSION__SHIFT 0x4
+#define HDMI_CONTROL__HDMI_ERROR_ACK_MASK 0x100
+#define HDMI_CONTROL__HDMI_ERROR_ACK__SHIFT 0x8
+#define HDMI_CONTROL__HDMI_ERROR_MASK_MASK 0x200
+#define HDMI_CONTROL__HDMI_ERROR_MASK__SHIFT 0x9
+#define HDMI_CONTROL__HDMI_DEEP_COLOR_ENABLE_MASK 0x1000000
+#define HDMI_CONTROL__HDMI_DEEP_COLOR_ENABLE__SHIFT 0x18
+#define HDMI_CONTROL__HDMI_DEEP_COLOR_DEPTH_MASK 0x30000000
+#define HDMI_CONTROL__HDMI_DEEP_COLOR_DEPTH__SHIFT 0x1c
+#define HDMI_STATUS__HDMI_ACTIVE_AVMUTE_MASK 0x1
+#define HDMI_STATUS__HDMI_ACTIVE_AVMUTE__SHIFT 0x0
+#define HDMI_STATUS__HDMI_AUDIO_PACKET_ERROR_MASK 0x10000
+#define HDMI_STATUS__HDMI_AUDIO_PACKET_ERROR__SHIFT 0x10
+#define HDMI_STATUS__HDMI_VBI_PACKET_ERROR_MASK 0x100000
+#define HDMI_STATUS__HDMI_VBI_PACKET_ERROR__SHIFT 0x14
+#define HDMI_STATUS__HDMI_ERROR_INT_MASK 0x8000000
+#define HDMI_STATUS__HDMI_ERROR_INT__SHIFT 0x1b
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_DELAY_EN_MASK 0x30
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_DELAY_EN__SHIFT 0x4
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_SEND_MAX_PACKETS_MASK 0x100
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_SEND_MAX_PACKETS__SHIFT 0x8
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_PACKETS_PER_LINE_MASK 0x1f0000
+#define HDMI_AUDIO_PACKET_CONTROL__HDMI_AUDIO_PACKETS_PER_LINE__SHIFT 0x10
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SEND_MASK 0x1
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SEND__SHIFT 0x0
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_CONT_MASK 0x2
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_CONT__SHIFT 0x1
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SELECT_MASK 0x30
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SELECT__SHIFT 0x4
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SOURCE_MASK 0x100
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_SOURCE__SHIFT 0x8
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_AUTO_SEND_MASK 0x1000
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_AUTO_SEND__SHIFT 0xc
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_N_MULTIPLE_MASK 0x70000
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_N_MULTIPLE__SHIFT 0x10
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_AUDIO_PRIORITY_MASK 0x80000000
+#define HDMI_ACR_PACKET_CONTROL__HDMI_ACR_AUDIO_PRIORITY__SHIFT 0x1f
+#define HDMI_VBI_PACKET_CONTROL__HDMI_NULL_SEND_MASK 0x1
+#define HDMI_VBI_PACKET_CONTROL__HDMI_NULL_SEND__SHIFT 0x0
+#define HDMI_VBI_PACKET_CONTROL__HDMI_GC_SEND_MASK 0x10
+#define HDMI_VBI_PACKET_CONTROL__HDMI_GC_SEND__SHIFT 0x4
+#define HDMI_VBI_PACKET_CONTROL__HDMI_GC_CONT_MASK 0x20
+#define HDMI_VBI_PACKET_CONTROL__HDMI_GC_CONT__SHIFT 0x5
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_SEND_MASK 0x100
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_SEND__SHIFT 0x8
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_CONT_MASK 0x200
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_CONT__SHIFT 0x9
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_LINE_MASK 0x3f0000
+#define HDMI_VBI_PACKET_CONTROL__HDMI_ISRC_LINE__SHIFT 0x10
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_SEND_MASK 0x1
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_SEND__SHIFT 0x0
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_CONT_MASK 0x2
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AVI_INFO_CONT__SHIFT 0x1
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AUDIO_INFO_SEND_MASK 0x10
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AUDIO_INFO_SEND__SHIFT 0x4
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AUDIO_INFO_CONT_MASK 0x20
+#define HDMI_INFOFRAME_CONTROL0__HDMI_AUDIO_INFO_CONT__SHIFT 0x5
+#define HDMI_INFOFRAME_CONTROL0__HDMI_MPEG_INFO_SEND_MASK 0x100
+#define HDMI_INFOFRAME_CONTROL0__HDMI_MPEG_INFO_SEND__SHIFT 0x8
+#define HDMI_INFOFRAME_CONTROL0__HDMI_MPEG_INFO_CONT_MASK 0x200
+#define HDMI_INFOFRAME_CONTROL0__HDMI_MPEG_INFO_CONT__SHIFT 0x9
+#define HDMI_INFOFRAME_CONTROL1__HDMI_AVI_INFO_LINE_MASK 0x3f
+#define HDMI_INFOFRAME_CONTROL1__HDMI_AVI_INFO_LINE__SHIFT 0x0
+#define HDMI_INFOFRAME_CONTROL1__HDMI_AUDIO_INFO_LINE_MASK 0x3f00
+#define HDMI_INFOFRAME_CONTROL1__HDMI_AUDIO_INFO_LINE__SHIFT 0x8
+#define HDMI_INFOFRAME_CONTROL1__HDMI_MPEG_INFO_LINE_MASK 0x3f0000
+#define HDMI_INFOFRAME_CONTROL1__HDMI_MPEG_INFO_LINE__SHIFT 0x10
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_SEND_MASK 0x1
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_SEND__SHIFT 0x0
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_CONT_MASK 0x2
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_CONT__SHIFT 0x1
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_SEND_MASK 0x10
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_SEND__SHIFT 0x4
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_CONT_MASK 0x20
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_CONT__SHIFT 0x5
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_LINE_MASK 0x3f0000
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC0_LINE__SHIFT 0x10
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_LINE_MASK 0x3f000000
+#define HDMI_GENERIC_PACKET_CONTROL0__HDMI_GENERIC1_LINE__SHIFT 0x18
+#define HDMI_GC__HDMI_GC_AVMUTE_MASK 0x1
+#define HDMI_GC__HDMI_GC_AVMUTE__SHIFT 0x0
+#define HDMI_GC__HDMI_GC_AVMUTE_CONT_MASK 0x4
+#define HDMI_GC__HDMI_GC_AVMUTE_CONT__SHIFT 0x2
+#define HDMI_GC__HDMI_DEFAULT_PHASE_MASK 0x10
+#define HDMI_GC__HDMI_DEFAULT_PHASE__SHIFT 0x4
+#define HDMI_GC__HDMI_PACKING_PHASE_MASK 0xf00
+#define HDMI_GC__HDMI_PACKING_PHASE__SHIFT 0x8
+#define HDMI_GC__HDMI_PACKING_PHASE_OVERRIDE_MASK 0x1000
+#define HDMI_GC__HDMI_PACKING_PHASE_OVERRIDE__SHIFT 0xc
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_LAYOUT_OVRD_MASK 0x1
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_LAYOUT_OVRD__SHIFT 0x0
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_LAYOUT_SELECT_MASK 0x2
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_LAYOUT_SELECT__SHIFT 0x1
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_CHANNEL_ENABLE_MASK 0xff00
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_AUDIO_CHANNEL_ENABLE__SHIFT 0x8
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_DP_AUDIO_STREAM_ID_MASK 0xff0000
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_DP_AUDIO_STREAM_ID__SHIFT 0x10
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_HBR_ENABLE_OVRD_MASK 0x1000000
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_HBR_ENABLE_OVRD__SHIFT 0x18
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_60958_OSF_OVRD_MASK 0x10000000
+#define AFMT_AUDIO_PACKET_CONTROL2__AFMT_60958_OSF_OVRD__SHIFT 0x1c
+#define AFMT_ISRC1_0__AFMT_ISRC_STATUS_MASK 0x7
+#define AFMT_ISRC1_0__AFMT_ISRC_STATUS__SHIFT 0x0
+#define AFMT_ISRC1_0__AFMT_ISRC_CONTINUE_MASK 0x40
+#define AFMT_ISRC1_0__AFMT_ISRC_CONTINUE__SHIFT 0x6
+#define AFMT_ISRC1_0__AFMT_ISRC_VALID_MASK 0x80
+#define AFMT_ISRC1_0__AFMT_ISRC_VALID__SHIFT 0x7
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC0_MASK 0xff
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC0__SHIFT 0x0
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC1_MASK 0xff00
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC1__SHIFT 0x8
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC2_MASK 0xff0000
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC2__SHIFT 0x10
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC3_MASK 0xff000000
+#define AFMT_ISRC1_1__AFMT_UPC_EAN_ISRC3__SHIFT 0x18
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC4_MASK 0xff
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC4__SHIFT 0x0
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC5_MASK 0xff00
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC5__SHIFT 0x8
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC6_MASK 0xff0000
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC6__SHIFT 0x10
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC7_MASK 0xff000000
+#define AFMT_ISRC1_2__AFMT_UPC_EAN_ISRC7__SHIFT 0x18
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC8_MASK 0xff
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC8__SHIFT 0x0
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC9_MASK 0xff00
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC9__SHIFT 0x8
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC10_MASK 0xff0000
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC10__SHIFT 0x10
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC11_MASK 0xff000000
+#define AFMT_ISRC1_3__AFMT_UPC_EAN_ISRC11__SHIFT 0x18
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC12_MASK 0xff
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC12__SHIFT 0x0
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC13_MASK 0xff00
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC13__SHIFT 0x8
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC14_MASK 0xff0000
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC14__SHIFT 0x10
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC15_MASK 0xff000000
+#define AFMT_ISRC1_4__AFMT_UPC_EAN_ISRC15__SHIFT 0x18
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC16_MASK 0xff
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC16__SHIFT 0x0
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC17_MASK 0xff00
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC17__SHIFT 0x8
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC18_MASK 0xff0000
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC18__SHIFT 0x10
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC19_MASK 0xff000000
+#define AFMT_ISRC2_0__AFMT_UPC_EAN_ISRC19__SHIFT 0x18
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC20_MASK 0xff
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC20__SHIFT 0x0
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC21_MASK 0xff00
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC21__SHIFT 0x8
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC22_MASK 0xff0000
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC22__SHIFT 0x10
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC23_MASK 0xff000000
+#define AFMT_ISRC2_1__AFMT_UPC_EAN_ISRC23__SHIFT 0x18
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC24_MASK 0xff
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC24__SHIFT 0x0
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC25_MASK 0xff00
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC25__SHIFT 0x8
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC26_MASK 0xff0000
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC26__SHIFT 0x10
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC27_MASK 0xff000000
+#define AFMT_ISRC2_2__AFMT_UPC_EAN_ISRC27__SHIFT 0x18
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC28_MASK 0xff
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC28__SHIFT 0x0
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC29_MASK 0xff00
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC29__SHIFT 0x8
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC30_MASK 0xff0000
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC30__SHIFT 0x10
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC31_MASK 0xff000000
+#define AFMT_ISRC2_3__AFMT_UPC_EAN_ISRC31__SHIFT 0x18
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_CHECKSUM_MASK 0xff
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_CHECKSUM__SHIFT 0x0
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_S_MASK 0x300
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_S__SHIFT 0x8
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_B_MASK 0xc00
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_B__SHIFT 0xa
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_A_MASK 0x1000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_A__SHIFT 0xc
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_Y_MASK 0xe000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_Y__SHIFT 0xd
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_R_MASK 0xf0000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_R__SHIFT 0x10
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_M_MASK 0x300000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_M__SHIFT 0x14
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_C_MASK 0xc00000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_C__SHIFT 0x16
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_SC_MASK 0x3000000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_SC__SHIFT 0x18
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_Q_MASK 0xc000000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_Q__SHIFT 0x1a
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_EC_MASK 0x70000000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_EC__SHIFT 0x1c
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_ITC_MASK 0x80000000
+#define AFMT_AVI_INFO0__AFMT_AVI_INFO_ITC__SHIFT 0x1f
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_VIC_MASK 0xff
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_VIC__SHIFT 0x0
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_PR_MASK 0xf00
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_PR__SHIFT 0x8
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_CN_MASK 0x3000
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_CN__SHIFT 0xc
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_YQ_MASK 0xc000
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_YQ__SHIFT 0xe
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_TOP_MASK 0xffff0000
+#define AFMT_AVI_INFO1__AFMT_AVI_INFO_TOP__SHIFT 0x10
+#define AFMT_AVI_INFO2__AFMT_AVI_INFO_BOTTOM_MASK 0xffff
+#define AFMT_AVI_INFO2__AFMT_AVI_INFO_BOTTOM__SHIFT 0x0
+#define AFMT_AVI_INFO2__AFMT_AVI_INFO_LEFT_MASK 0xffff0000
+#define AFMT_AVI_INFO2__AFMT_AVI_INFO_LEFT__SHIFT 0x10
+#define AFMT_AVI_INFO3__AFMT_AVI_INFO_RIGHT_MASK 0xffff
+#define AFMT_AVI_INFO3__AFMT_AVI_INFO_RIGHT__SHIFT 0x0
+#define AFMT_AVI_INFO3__AFMT_AVI_INFO_VERSION_MASK 0xff000000
+#define AFMT_AVI_INFO3__AFMT_AVI_INFO_VERSION__SHIFT 0x18
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_CHECKSUM_MASK 0xff
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_CHECKSUM__SHIFT 0x0
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB0_MASK 0xff00
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB0__SHIFT 0x8
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB1_MASK 0xff0000
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB1__SHIFT 0x10
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB2_MASK 0xff000000
+#define AFMT_MPEG_INFO0__AFMT_MPEG_INFO_MB2__SHIFT 0x18
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_MB3_MASK 0xff
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_MB3__SHIFT 0x0
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_MF_MASK 0x300
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_MF__SHIFT 0x8
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_FR_MASK 0x1000
+#define AFMT_MPEG_INFO1__AFMT_MPEG_INFO_FR__SHIFT 0xc
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB0_MASK 0xff
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB0__SHIFT 0x0
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB1_MASK 0xff00
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB1__SHIFT 0x8
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB2_MASK 0xff0000
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB2__SHIFT 0x10
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB3_MASK 0xff000000
+#define AFMT_GENERIC_HDR__AFMT_GENERIC_HB3__SHIFT 0x18
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE0_MASK 0xff
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE0__SHIFT 0x0
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE1_MASK 0xff00
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE1__SHIFT 0x8
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE2_MASK 0xff0000
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE2__SHIFT 0x10
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE3_MASK 0xff000000
+#define AFMT_GENERIC_0__AFMT_GENERIC_BYTE3__SHIFT 0x18
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE4_MASK 0xff
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE4__SHIFT 0x0
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE5_MASK 0xff00
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE5__SHIFT 0x8
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE6_MASK 0xff0000
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE6__SHIFT 0x10
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE7_MASK 0xff000000
+#define AFMT_GENERIC_1__AFMT_GENERIC_BYTE7__SHIFT 0x18
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE8_MASK 0xff
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE8__SHIFT 0x0
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE9_MASK 0xff00
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE9__SHIFT 0x8
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE10_MASK 0xff0000
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE10__SHIFT 0x10
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE11_MASK 0xff000000
+#define AFMT_GENERIC_2__AFMT_GENERIC_BYTE11__SHIFT 0x18
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE12_MASK 0xff
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE12__SHIFT 0x0
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE13_MASK 0xff00
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE13__SHIFT 0x8
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE14_MASK 0xff0000
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE14__SHIFT 0x10
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE15_MASK 0xff000000
+#define AFMT_GENERIC_3__AFMT_GENERIC_BYTE15__SHIFT 0x18
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE16_MASK 0xff
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE16__SHIFT 0x0
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE17_MASK 0xff00
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE17__SHIFT 0x8
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE18_MASK 0xff0000
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE18__SHIFT 0x10
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE19_MASK 0xff000000
+#define AFMT_GENERIC_4__AFMT_GENERIC_BYTE19__SHIFT 0x18
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE20_MASK 0xff
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE20__SHIFT 0x0
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE21_MASK 0xff00
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE21__SHIFT 0x8
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE22_MASK 0xff0000
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE22__SHIFT 0x10
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE23_MASK 0xff000000
+#define AFMT_GENERIC_5__AFMT_GENERIC_BYTE23__SHIFT 0x18
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE24_MASK 0xff
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE24__SHIFT 0x0
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE25_MASK 0xff00
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE25__SHIFT 0x8
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE26_MASK 0xff0000
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE26__SHIFT 0x10
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE27_MASK 0xff000000
+#define AFMT_GENERIC_6__AFMT_GENERIC_BYTE27__SHIFT 0x18
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE28_MASK 0xff
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE28__SHIFT 0x0
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE29_MASK 0xff00
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE29__SHIFT 0x8
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE30_MASK 0xff0000
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE30__SHIFT 0x10
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE31_MASK 0xff000000
+#define AFMT_GENERIC_7__AFMT_GENERIC_BYTE31__SHIFT 0x18
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_SEND_MASK 0x1
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_SEND__SHIFT 0x0
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_CONT_MASK 0x2
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_CONT__SHIFT 0x1
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_SEND_MASK 0x10
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_SEND__SHIFT 0x4
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_CONT_MASK 0x20
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_CONT__SHIFT 0x5
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_LINE_MASK 0x3f0000
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC2_LINE__SHIFT 0x10
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_LINE_MASK 0x3f000000
+#define HDMI_GENERIC_PACKET_CONTROL1__HDMI_GENERIC3_LINE__SHIFT 0x18
+#define HDMI_ACR_32_0__HDMI_ACR_CTS_32_MASK 0xfffff000
+#define HDMI_ACR_32_0__HDMI_ACR_CTS_32__SHIFT 0xc
+#define HDMI_ACR_32_1__HDMI_ACR_N_32_MASK 0xfffff
+#define HDMI_ACR_32_1__HDMI_ACR_N_32__SHIFT 0x0
+#define HDMI_ACR_44_0__HDMI_ACR_CTS_44_MASK 0xfffff000
+#define HDMI_ACR_44_0__HDMI_ACR_CTS_44__SHIFT 0xc
+#define HDMI_ACR_44_1__HDMI_ACR_N_44_MASK 0xfffff
+#define HDMI_ACR_44_1__HDMI_ACR_N_44__SHIFT 0x0
+#define HDMI_ACR_48_0__HDMI_ACR_CTS_48_MASK 0xfffff000
+#define HDMI_ACR_48_0__HDMI_ACR_CTS_48__SHIFT 0xc
+#define HDMI_ACR_48_1__HDMI_ACR_N_48_MASK 0xfffff
+#define HDMI_ACR_48_1__HDMI_ACR_N_48__SHIFT 0x0
+#define HDMI_ACR_STATUS_0__HDMI_ACR_CTS_MASK 0xfffff000
+#define HDMI_ACR_STATUS_0__HDMI_ACR_CTS__SHIFT 0xc
+#define HDMI_ACR_STATUS_1__HDMI_ACR_N_MASK 0xfffff
+#define HDMI_ACR_STATUS_1__HDMI_ACR_N__SHIFT 0x0
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CHECKSUM_MASK 0xff
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CHECKSUM__SHIFT 0x0
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CC_MASK 0x700
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CC__SHIFT 0x8
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CT_MASK 0x7800
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CT__SHIFT 0xb
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CHECKSUM_OFFSET_MASK 0xff0000
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CHECKSUM_OFFSET__SHIFT 0x10
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CXT_MASK 0x1f000000
+#define AFMT_AUDIO_INFO0__AFMT_AUDIO_INFO_CXT__SHIFT 0x18
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_CA_MASK 0xff
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_CA__SHIFT 0x0
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_LSV_MASK 0x7800
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_LSV__SHIFT 0xb
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_DM_INH_MASK 0x8000
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_DM_INH__SHIFT 0xf
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_LFEPBL_MASK 0x30000
+#define AFMT_AUDIO_INFO1__AFMT_AUDIO_INFO_LFEPBL__SHIFT 0x10
+#define AFMT_60958_0__AFMT_60958_CS_A_MASK 0x1
+#define AFMT_60958_0__AFMT_60958_CS_A__SHIFT 0x0
+#define AFMT_60958_0__AFMT_60958_CS_B_MASK 0x2
+#define AFMT_60958_0__AFMT_60958_CS_B__SHIFT 0x1
+#define AFMT_60958_0__AFMT_60958_CS_C_MASK 0x4
+#define AFMT_60958_0__AFMT_60958_CS_C__SHIFT 0x2
+#define AFMT_60958_0__AFMT_60958_CS_D_MASK 0x38
+#define AFMT_60958_0__AFMT_60958_CS_D__SHIFT 0x3
+#define AFMT_60958_0__AFMT_60958_CS_MODE_MASK 0xc0
+#define AFMT_60958_0__AFMT_60958_CS_MODE__SHIFT 0x6
+#define AFMT_60958_0__AFMT_60958_CS_CATEGORY_CODE_MASK 0xff00
+#define AFMT_60958_0__AFMT_60958_CS_CATEGORY_CODE__SHIFT 0x8
+#define AFMT_60958_0__AFMT_60958_CS_SOURCE_NUMBER_MASK 0xf0000
+#define AFMT_60958_0__AFMT_60958_CS_SOURCE_NUMBER__SHIFT 0x10
+#define AFMT_60958_0__AFMT_60958_CS_CHANNEL_NUMBER_L_MASK 0xf00000
+#define AFMT_60958_0__AFMT_60958_CS_CHANNEL_NUMBER_L__SHIFT 0x14
+#define AFMT_60958_0__AFMT_60958_CS_SAMPLING_FREQUENCY_MASK 0xf000000
+#define AFMT_60958_0__AFMT_60958_CS_SAMPLING_FREQUENCY__SHIFT 0x18
+#define AFMT_60958_0__AFMT_60958_CS_CLOCK_ACCURACY_MASK 0x30000000
+#define AFMT_60958_0__AFMT_60958_CS_CLOCK_ACCURACY__SHIFT 0x1c
+#define AFMT_60958_1__AFMT_60958_CS_WORD_LENGTH_MASK 0xf
+#define AFMT_60958_1__AFMT_60958_CS_WORD_LENGTH__SHIFT 0x0
+#define AFMT_60958_1__AFMT_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_MASK 0xf0
+#define AFMT_60958_1__AFMT_60958_CS_ORIGINAL_SAMPLING_FREQUENCY__SHIFT 0x4
+#define AFMT_60958_1__AFMT_60958_VALID_L_MASK 0x10000
+#define AFMT_60958_1__AFMT_60958_VALID_L__SHIFT 0x10
+#define AFMT_60958_1__AFMT_60958_VALID_R_MASK 0x40000
+#define AFMT_60958_1__AFMT_60958_VALID_R__SHIFT 0x12
+#define AFMT_60958_1__AFMT_60958_CS_CHANNEL_NUMBER_R_MASK 0xf00000
+#define AFMT_60958_1__AFMT_60958_CS_CHANNEL_NUMBER_R__SHIFT 0x14
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_EN_MASK 0x1
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_EN__SHIFT 0x0
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_CONT_MASK 0x10
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_CONT__SHIFT 0x4
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_SOURCE_MASK 0x100
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_SOURCE__SHIFT 0x8
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_CH_SEL_MASK 0xf000
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_CH_SEL__SHIFT 0xc
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_COUNT_MASK 0xffff0000
+#define AFMT_AUDIO_CRC_CONTROL__AFMT_AUDIO_CRC_COUNT__SHIFT 0x10
+#define AFMT_RAMP_CONTROL0__AFMT_RAMP_MAX_COUNT_MASK 0xffffff
+#define AFMT_RAMP_CONTROL0__AFMT_RAMP_MAX_COUNT__SHIFT 0x0
+#define AFMT_RAMP_CONTROL0__AFMT_RAMP_DATA_SIGN_MASK 0x80000000
+#define AFMT_RAMP_CONTROL0__AFMT_RAMP_DATA_SIGN__SHIFT 0x1f
+#define AFMT_RAMP_CONTROL1__AFMT_RAMP_MIN_COUNT_MASK 0xffffff
+#define AFMT_RAMP_CONTROL1__AFMT_RAMP_MIN_COUNT__SHIFT 0x0
+#define AFMT_RAMP_CONTROL1__AFMT_AUDIO_TEST_CH_DISABLE_MASK 0xff000000
+#define AFMT_RAMP_CONTROL1__AFMT_AUDIO_TEST_CH_DISABLE__SHIFT 0x18
+#define AFMT_RAMP_CONTROL2__AFMT_RAMP_INC_COUNT_MASK 0xffffff
+#define AFMT_RAMP_CONTROL2__AFMT_RAMP_INC_COUNT__SHIFT 0x0
+#define AFMT_RAMP_CONTROL3__AFMT_RAMP_DEC_COUNT_MASK 0xffffff
+#define AFMT_RAMP_CONTROL3__AFMT_RAMP_DEC_COUNT__SHIFT 0x0
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_2_MASK 0xf
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_2__SHIFT 0x0
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_3_MASK 0xf0
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_3__SHIFT 0x4
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_4_MASK 0xf00
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_4__SHIFT 0x8
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_5_MASK 0xf000
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_5__SHIFT 0xc
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_6_MASK 0xf0000
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_6__SHIFT 0x10
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_7_MASK 0xf00000
+#define AFMT_60958_2__AFMT_60958_CS_CHANNEL_NUMBER_7__SHIFT 0x14
+#define AFMT_AUDIO_CRC_RESULT__AFMT_AUDIO_CRC_DONE_MASK 0x1
+#define AFMT_AUDIO_CRC_RESULT__AFMT_AUDIO_CRC_DONE__SHIFT 0x0
+#define AFMT_AUDIO_CRC_RESULT__AFMT_AUDIO_CRC_MASK 0xffffff00
+#define AFMT_AUDIO_CRC_RESULT__AFMT_AUDIO_CRC__SHIFT 0x8
+#define AFMT_STATUS__AFMT_AUDIO_ENABLE_MASK 0x10
+#define AFMT_STATUS__AFMT_AUDIO_ENABLE__SHIFT 0x4
+#define AFMT_STATUS__AFMT_AZ_HBR_ENABLE_MASK 0x100
+#define AFMT_STATUS__AFMT_AZ_HBR_ENABLE__SHIFT 0x8
+#define AFMT_STATUS__AFMT_AUDIO_FIFO_OVERFLOW_MASK 0x1000000
+#define AFMT_STATUS__AFMT_AUDIO_FIFO_OVERFLOW__SHIFT 0x18
+#define AFMT_STATUS__AFMT_AZ_AUDIO_ENABLE_CHG_MASK 0x40000000
+#define AFMT_STATUS__AFMT_AZ_AUDIO_ENABLE_CHG__SHIFT 0x1e
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_SAMPLE_SEND_MASK 0x1
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_SAMPLE_SEND__SHIFT 0x0
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_RESET_FIFO_WHEN_AUDIO_DIS_MASK 0x800
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_RESET_FIFO_WHEN_AUDIO_DIS__SHIFT 0xb
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_TEST_EN_MASK 0x1000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_TEST_EN__SHIFT 0xc
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_TEST_MODE_MASK 0x4000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_TEST_MODE__SHIFT 0xe
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_FIFO_OVERFLOW_ACK_MASK 0x800000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_FIFO_OVERFLOW_ACK__SHIFT 0x17
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_CHANNEL_SWAP_MASK 0x1000000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AUDIO_CHANNEL_SWAP__SHIFT 0x18
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_60958_CS_UPDATE_MASK 0x4000000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_60958_CS_UPDATE__SHIFT 0x1a
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AZ_AUDIO_ENABLE_CHG_ACK_MASK 0x40000000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_AZ_AUDIO_ENABLE_CHG_ACK__SHIFT 0x1e
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_BLANK_TEST_DATA_ON_ENC_ENB_MASK 0x80000000
+#define AFMT_AUDIO_PACKET_CONTROL__AFMT_BLANK_TEST_DATA_ON_ENC_ENB__SHIFT 0x1f
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC0_UPDATE_MASK 0x4
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC0_UPDATE__SHIFT 0x2
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC2_UPDATE_MASK 0x8
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC2_UPDATE__SHIFT 0x3
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC_INDEX_MASK 0xc0000000
+#define AFMT_VBI_PACKET_CONTROL__AFMT_GENERIC_INDEX__SHIFT 0x1e
+#define AFMT_INFOFRAME_CONTROL0__AFMT_AUDIO_INFO_SOURCE_MASK 0x40
+#define AFMT_INFOFRAME_CONTROL0__AFMT_AUDIO_INFO_SOURCE__SHIFT 0x6
+#define AFMT_INFOFRAME_CONTROL0__AFMT_AUDIO_INFO_UPDATE_MASK 0x80
+#define AFMT_INFOFRAME_CONTROL0__AFMT_AUDIO_INFO_UPDATE__SHIFT 0x7
+#define AFMT_INFOFRAME_CONTROL0__AFMT_MPEG_INFO_UPDATE_MASK 0x400
+#define AFMT_INFOFRAME_CONTROL0__AFMT_MPEG_INFO_UPDATE__SHIFT 0xa
+#define AFMT_AUDIO_SRC_CONTROL__AFMT_AUDIO_SRC_SELECT_MASK 0x7
+#define AFMT_AUDIO_SRC_CONTROL__AFMT_AUDIO_SRC_SELECT__SHIFT 0x0
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_FS_DIV_SEL_MASK 0x7
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_FS_DIV_SEL__SHIFT 0x0
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_BASE_MASK 0x100
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_BASE__SHIFT 0x8
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_MULTI_MASK 0x7000
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_MULTI__SHIFT 0xc
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_DIV_MASK 0x70000
+#define AFMT_AUDIO_DBG_DTO_CNTL__AFMT_AUDIO_DTO_DBG_DIV__SHIFT 0x10
+#define AFMT_CNTL__AFMT_AUDIO_CLOCK_EN_MASK 0x1
+#define AFMT_CNTL__AFMT_AUDIO_CLOCK_EN__SHIFT 0x0
+#define AFMT_CNTL__AFMT_AUDIO_CLOCK_ON_MASK 0x100
+#define AFMT_CNTL__AFMT_AUDIO_CLOCK_ON__SHIFT 0x8
+#define DIG_BE_CNTL__DIG_DUAL_LINK_ENABLE_MASK 0x1
+#define DIG_BE_CNTL__DIG_DUAL_LINK_ENABLE__SHIFT 0x0
+#define DIG_BE_CNTL__DIG_SWAP_MASK 0x2
+#define DIG_BE_CNTL__DIG_SWAP__SHIFT 0x1
+#define DIG_BE_CNTL__DIG_RB_SWITCH_EN_MASK 0x4
+#define DIG_BE_CNTL__DIG_RB_SWITCH_EN__SHIFT 0x2
+#define DIG_BE_CNTL__DIG_FE_SOURCE_SELECT_MASK 0x7f00
+#define DIG_BE_CNTL__DIG_FE_SOURCE_SELECT__SHIFT 0x8
+#define DIG_BE_CNTL__DIG_MODE_MASK 0x70000
+#define DIG_BE_CNTL__DIG_MODE__SHIFT 0x10
+#define DIG_BE_CNTL__DIG_HPD_SELECT_MASK 0x70000000
+#define DIG_BE_CNTL__DIG_HPD_SELECT__SHIFT 0x1c
+#define DIG_BE_EN_CNTL__DIG_ENABLE_MASK 0x1
+#define DIG_BE_EN_CNTL__DIG_ENABLE__SHIFT 0x0
+#define DIG_BE_EN_CNTL__DIG_SYMCLK_BE_ON_MASK 0x100
+#define DIG_BE_EN_CNTL__DIG_SYMCLK_BE_ON__SHIFT 0x8
+#define TMDS_CNTL__TMDS_SYNC_PHASE_MASK 0x1
+#define TMDS_CNTL__TMDS_SYNC_PHASE__SHIFT 0x0
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR0_OUT_EN_MASK 0x1
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR0_OUT_EN__SHIFT 0x0
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR1_OUT_EN_MASK 0x2
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR1_OUT_EN__SHIFT 0x1
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR2_OUT_EN_MASK 0x4
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR2_OUT_EN__SHIFT 0x2
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR3_OUT_EN_MASK 0x8
+#define TMDS_CONTROL_CHAR__TMDS_CONTROL_CHAR3_OUT_EN__SHIFT 0x3
+#define TMDS_CONTROL0_FEEDBACK__TMDS_CONTROL0_FEEDBACK_SELECT_MASK 0x3
+#define TMDS_CONTROL0_FEEDBACK__TMDS_CONTROL0_FEEDBACK_SELECT__SHIFT 0x0
+#define TMDS_CONTROL0_FEEDBACK__TMDS_CONTROL0_FEEDBACK_DELAY_MASK 0x300
+#define TMDS_CONTROL0_FEEDBACK__TMDS_CONTROL0_FEEDBACK_DELAY__SHIFT 0x8
+#define TMDS_STEREOSYNC_CTL_SEL__TMDS_STEREOSYNC_CTL_SEL_MASK 0x3
+#define TMDS_STEREOSYNC_CTL_SEL__TMDS_STEREOSYNC_CTL_SEL__SHIFT 0x0
+#define TMDS_SYNC_CHAR_PATTERN_0_1__TMDS_SYNC_CHAR_PATTERN0_MASK 0x3ff
+#define TMDS_SYNC_CHAR_PATTERN_0_1__TMDS_SYNC_CHAR_PATTERN0__SHIFT 0x0
+#define TMDS_SYNC_CHAR_PATTERN_0_1__TMDS_SYNC_CHAR_PATTERN1_MASK 0x3ff0000
+#define TMDS_SYNC_CHAR_PATTERN_0_1__TMDS_SYNC_CHAR_PATTERN1__SHIFT 0x10
+#define TMDS_SYNC_CHAR_PATTERN_2_3__TMDS_SYNC_CHAR_PATTERN2_MASK 0x3ff
+#define TMDS_SYNC_CHAR_PATTERN_2_3__TMDS_SYNC_CHAR_PATTERN2__SHIFT 0x0
+#define TMDS_SYNC_CHAR_PATTERN_2_3__TMDS_SYNC_CHAR_PATTERN3_MASK 0x3ff0000
+#define TMDS_SYNC_CHAR_PATTERN_2_3__TMDS_SYNC_CHAR_PATTERN3__SHIFT 0x10
+#define TMDS_DEBUG__TMDS_DEBUG_EN_MASK 0x1
+#define TMDS_DEBUG__TMDS_DEBUG_EN__SHIFT 0x0
+#define TMDS_DEBUG__TMDS_DEBUG_HSYNC_MASK 0x100
+#define TMDS_DEBUG__TMDS_DEBUG_HSYNC__SHIFT 0x8
+#define TMDS_DEBUG__TMDS_DEBUG_HSYNC_EN_MASK 0x200
+#define TMDS_DEBUG__TMDS_DEBUG_HSYNC_EN__SHIFT 0x9
+#define TMDS_DEBUG__TMDS_DEBUG_VSYNC_MASK 0x10000
+#define TMDS_DEBUG__TMDS_DEBUG_VSYNC__SHIFT 0x10
+#define TMDS_DEBUG__TMDS_DEBUG_VSYNC_EN_MASK 0x20000
+#define TMDS_DEBUG__TMDS_DEBUG_VSYNC_EN__SHIFT 0x11
+#define TMDS_DEBUG__TMDS_DEBUG_DE_MASK 0x1000000
+#define TMDS_DEBUG__TMDS_DEBUG_DE__SHIFT 0x18
+#define TMDS_DEBUG__TMDS_DEBUG_DE_EN_MASK 0x2000000
+#define TMDS_DEBUG__TMDS_DEBUG_DE_EN__SHIFT 0x19
+#define TMDS_CTL_BITS__TMDS_CTL0_MASK 0x1
+#define TMDS_CTL_BITS__TMDS_CTL0__SHIFT 0x0
+#define TMDS_CTL_BITS__TMDS_CTL1_MASK 0x100
+#define TMDS_CTL_BITS__TMDS_CTL1__SHIFT 0x8
+#define TMDS_CTL_BITS__TMDS_CTL2_MASK 0x10000
+#define TMDS_CTL_BITS__TMDS_CTL2__SHIFT 0x10
+#define TMDS_CTL_BITS__TMDS_CTL3_MASK 0x1000000
+#define TMDS_CTL_BITS__TMDS_CTL3__SHIFT 0x18
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_EN_MASK 0x1
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_EN__SHIFT 0x0
+#define TMDS_DCBALANCER_CONTROL__TMDS_SYNC_DCBAL_EN_MASK 0x70
+#define TMDS_DCBALANCER_CONTROL__TMDS_SYNC_DCBAL_EN__SHIFT 0x4
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_TEST_EN_MASK 0x100
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_TEST_EN__SHIFT 0x8
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_TEST_IN_MASK 0xf0000
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_TEST_IN__SHIFT 0x10
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_FORCE_MASK 0x1000000
+#define TMDS_DCBALANCER_CONTROL__TMDS_DCBALANCER_FORCE__SHIFT 0x18
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_SEL_MASK 0xf
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_SEL__SHIFT 0x0
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_DELAY_MASK 0x70
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_DELAY__SHIFT 0x4
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_INVERT_MASK 0x80
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_INVERT__SHIFT 0x7
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_MODULATION_MASK 0x300
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_DATA_MODULATION__SHIFT 0x8
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_USE_FEEDBACK_PATH_MASK 0x400
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_USE_FEEDBACK_PATH__SHIFT 0xa
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_FB_SYNC_CONT_MASK 0x800
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_FB_SYNC_CONT__SHIFT 0xb
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_PATTERN_OUT_EN_MASK 0x1000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL0_PATTERN_OUT_EN__SHIFT 0xc
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_SEL_MASK 0xf0000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_SEL__SHIFT 0x10
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_DELAY_MASK 0x700000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_DELAY__SHIFT 0x14
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_INVERT_MASK 0x800000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_INVERT__SHIFT 0x17
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_MODULATION_MASK 0x3000000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_DATA_MODULATION__SHIFT 0x18
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_USE_FEEDBACK_PATH_MASK 0x4000000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_USE_FEEDBACK_PATH__SHIFT 0x1a
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_FB_SYNC_CONT_MASK 0x8000000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_FB_SYNC_CONT__SHIFT 0x1b
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_PATTERN_OUT_EN_MASK 0x10000000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_CTL1_PATTERN_OUT_EN__SHIFT 0x1c
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_2BIT_COUNTER_EN_MASK 0x80000000
+#define TMDS_CTL0_1_GEN_CNTL__TMDS_2BIT_COUNTER_EN__SHIFT 0x1f
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_SEL_MASK 0xf
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_SEL__SHIFT 0x0
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_DELAY_MASK 0x70
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_DELAY__SHIFT 0x4
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_INVERT_MASK 0x80
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_INVERT__SHIFT 0x7
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_MODULATION_MASK 0x300
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_DATA_MODULATION__SHIFT 0x8
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_USE_FEEDBACK_PATH_MASK 0x400
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_USE_FEEDBACK_PATH__SHIFT 0xa
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_FB_SYNC_CONT_MASK 0x800
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_FB_SYNC_CONT__SHIFT 0xb
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_PATTERN_OUT_EN_MASK 0x1000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL2_PATTERN_OUT_EN__SHIFT 0xc
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_SEL_MASK 0xf0000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_SEL__SHIFT 0x10
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_DELAY_MASK 0x700000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_DELAY__SHIFT 0x14
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_INVERT_MASK 0x800000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_INVERT__SHIFT 0x17
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_MODULATION_MASK 0x3000000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_DATA_MODULATION__SHIFT 0x18
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_USE_FEEDBACK_PATH_MASK 0x4000000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_USE_FEEDBACK_PATH__SHIFT 0x1a
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_FB_SYNC_CONT_MASK 0x8000000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_FB_SYNC_CONT__SHIFT 0x1b
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_PATTERN_OUT_EN_MASK 0x10000000
+#define TMDS_CTL2_3_GEN_CNTL__TMDS_CTL3_PATTERN_OUT_EN__SHIFT 0x1c
+#define DIG_VERSION__DIG_TYPE_MASK 0x1
+#define DIG_VERSION__DIG_TYPE__SHIFT 0x0
+#define DIG_LANE_ENABLE__DIG_LANE0EN_MASK 0x1
+#define DIG_LANE_ENABLE__DIG_LANE0EN__SHIFT 0x0
+#define DIG_LANE_ENABLE__DIG_LANE1EN_MASK 0x2
+#define DIG_LANE_ENABLE__DIG_LANE1EN__SHIFT 0x1
+#define DIG_LANE_ENABLE__DIG_LANE2EN_MASK 0x4
+#define DIG_LANE_ENABLE__DIG_LANE2EN__SHIFT 0x2
+#define DIG_LANE_ENABLE__DIG_LANE3EN_MASK 0x8
+#define DIG_LANE_ENABLE__DIG_LANE3EN__SHIFT 0x3
+#define DIG_LANE_ENABLE__DIG_CLK_EN_MASK 0x100
+#define DIG_LANE_ENABLE__DIG_CLK_EN__SHIFT 0x8
+#define DIG_TEST_DEBUG_INDEX__DIG_TEST_DEBUG_INDEX_MASK 0xff
+#define DIG_TEST_DEBUG_INDEX__DIG_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DIG_TEST_DEBUG_INDEX__DIG_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DIG_TEST_DEBUG_INDEX__DIG_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DIG_TEST_DEBUG_DATA__DIG_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DIG_TEST_DEBUG_DATA__DIG_TEST_DEBUG_DATA__SHIFT 0x0
+#define DIG_FE_TEST_DEBUG_INDEX__DIG_FE_TEST_DEBUG_INDEX_MASK 0xff
+#define DIG_FE_TEST_DEBUG_INDEX__DIG_FE_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DIG_FE_TEST_DEBUG_INDEX__DIG_FE_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DIG_FE_TEST_DEBUG_INDEX__DIG_FE_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DIG_FE_TEST_DEBUG_DATA__DIG_FE_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DIG_FE_TEST_DEBUG_DATA__DIG_FE_TEST_DEBUG_DATA__SHIFT 0x0
+#define DMCU_CTRL__RESET_UC_MASK 0x1
+#define DMCU_CTRL__RESET_UC__SHIFT 0x0
+#define DMCU_CTRL__IGNORE_PWRMGT_MASK 0x2
+#define DMCU_CTRL__IGNORE_PWRMGT__SHIFT 0x1
+#define DMCU_CTRL__DISABLE_IRQ_TO_UC_MASK 0x4
+#define DMCU_CTRL__DISABLE_IRQ_TO_UC__SHIFT 0x2
+#define DMCU_CTRL__DISABLE_XIRQ_TO_UC_MASK 0x8
+#define DMCU_CTRL__DISABLE_XIRQ_TO_UC__SHIFT 0x3
+#define DMCU_CTRL__DMCU_ENABLE_MASK 0x10
+#define DMCU_CTRL__DMCU_ENABLE__SHIFT 0x4
+#define DMCU_CTRL__DMCU_DYN_CLK_GATING_EN_MASK 0x100
+#define DMCU_CTRL__DMCU_DYN_CLK_GATING_EN__SHIFT 0x8
+#define DMCU_CTRL__UC_REG_RD_TIMEOUT_MASK 0xffff0000
+#define DMCU_CTRL__UC_REG_RD_TIMEOUT__SHIFT 0x10
+#define DMCU_STATUS__UC_IN_RESET_MASK 0x1
+#define DMCU_STATUS__UC_IN_RESET__SHIFT 0x0
+#define DMCU_STATUS__UC_IN_WAIT_MODE_MASK 0x2
+#define DMCU_STATUS__UC_IN_WAIT_MODE__SHIFT 0x1
+#define DMCU_STATUS__UC_IN_STOP_MODE_MASK 0x4
+#define DMCU_STATUS__UC_IN_STOP_MODE__SHIFT 0x2
+#define DMCU_PC_START_ADDR__PC_START_ADDR_LSB_MASK 0xff
+#define DMCU_PC_START_ADDR__PC_START_ADDR_LSB__SHIFT 0x0
+#define DMCU_PC_START_ADDR__PC_START_ADDR_MSB_MASK 0xff00
+#define DMCU_PC_START_ADDR__PC_START_ADDR_MSB__SHIFT 0x8
+#define DMCU_FW_START_ADDR__FW_START_ADDR_LSB_MASK 0xff
+#define DMCU_FW_START_ADDR__FW_START_ADDR_LSB__SHIFT 0x0
+#define DMCU_FW_START_ADDR__FW_START_ADDR_MSB_MASK 0xff00
+#define DMCU_FW_START_ADDR__FW_START_ADDR_MSB__SHIFT 0x8
+#define DMCU_FW_END_ADDR__FW_END_ADDR_LSB_MASK 0xff
+#define DMCU_FW_END_ADDR__FW_END_ADDR_LSB__SHIFT 0x0
+#define DMCU_FW_END_ADDR__FW_END_ADDR_MSB_MASK 0xff00
+#define DMCU_FW_END_ADDR__FW_END_ADDR_MSB__SHIFT 0x8
+#define DMCU_FW_ISR_START_ADDR__FW_ISR_START_ADDR_LSB_MASK 0xff
+#define DMCU_FW_ISR_START_ADDR__FW_ISR_START_ADDR_LSB__SHIFT 0x0
+#define DMCU_FW_ISR_START_ADDR__FW_ISR_START_ADDR_MSB_MASK 0xff00
+#define DMCU_FW_ISR_START_ADDR__FW_ISR_START_ADDR_MSB__SHIFT 0x8
+#define DMCU_FW_CS_HI__FW_CHECKSUM_HI_MASK 0xffffffff
+#define DMCU_FW_CS_HI__FW_CHECKSUM_HI__SHIFT 0x0
+#define DMCU_FW_CS_LO__FW_CHECKSUM_LO_MASK 0xffffffff
+#define DMCU_FW_CS_LO__FW_CHECKSUM_LO__SHIFT 0x0
+#define DMCU_RAM_ACCESS_CTRL__ERAM_WR_ADDR_AUTO_INC_MASK 0x1
+#define DMCU_RAM_ACCESS_CTRL__ERAM_WR_ADDR_AUTO_INC__SHIFT 0x0
+#define DMCU_RAM_ACCESS_CTRL__ERAM_RD_ADDR_AUTO_INC_MASK 0x2
+#define DMCU_RAM_ACCESS_CTRL__ERAM_RD_ADDR_AUTO_INC__SHIFT 0x1
+#define DMCU_RAM_ACCESS_CTRL__IRAM_WR_ADDR_AUTO_INC_MASK 0x4
+#define DMCU_RAM_ACCESS_CTRL__IRAM_WR_ADDR_AUTO_INC__SHIFT 0x2
+#define DMCU_RAM_ACCESS_CTRL__IRAM_RD_ADDR_AUTO_INC_MASK 0x8
+#define DMCU_RAM_ACCESS_CTRL__IRAM_RD_ADDR_AUTO_INC__SHIFT 0x3
+#define DMCU_RAM_ACCESS_CTRL__ERAM_HOST_ACCESS_EN_MASK 0x10
+#define DMCU_RAM_ACCESS_CTRL__ERAM_HOST_ACCESS_EN__SHIFT 0x4
+#define DMCU_RAM_ACCESS_CTRL__IRAM_HOST_ACCESS_EN_MASK 0x20
+#define DMCU_RAM_ACCESS_CTRL__IRAM_HOST_ACCESS_EN__SHIFT 0x5
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_ADDR_MASK 0xffff
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_ADDR__SHIFT 0x0
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_BE_MASK 0xf0000
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_BE__SHIFT 0x10
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_BYTE_MODE_MASK 0x100000
+#define DMCU_ERAM_WR_CTRL__ERAM_WR_BYTE_MODE__SHIFT 0x14
+#define DMCU_ERAM_WR_DATA__ERAM_WR_DATA_MASK 0xffffffff
+#define DMCU_ERAM_WR_DATA__ERAM_WR_DATA__SHIFT 0x0
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_ADDR_MASK 0xffff
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_ADDR__SHIFT 0x0
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_BE_MASK 0xf0000
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_BE__SHIFT 0x10
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_BYTE_MODE_MASK 0x100000
+#define DMCU_ERAM_RD_CTRL__ERAM_RD_BYTE_MODE__SHIFT 0x14
+#define DMCU_ERAM_RD_DATA__ERAM_RD_DATA_MASK 0xffffffff
+#define DMCU_ERAM_RD_DATA__ERAM_RD_DATA__SHIFT 0x0
+#define DMCU_IRAM_WR_CTRL__IRAM_WR_ADDR_MASK 0x3ff
+#define DMCU_IRAM_WR_CTRL__IRAM_WR_ADDR__SHIFT 0x0
+#define DMCU_IRAM_WR_DATA__IRAM_WR_DATA_MASK 0xff
+#define DMCU_IRAM_WR_DATA__IRAM_WR_DATA__SHIFT 0x0
+#define DMCU_IRAM_RD_CTRL__IRAM_RD_ADDR_MASK 0x3ff
+#define DMCU_IRAM_RD_CTRL__IRAM_RD_ADDR__SHIFT 0x0
+#define DMCU_IRAM_RD_DATA__IRAM_RD_DATA_MASK 0xff
+#define DMCU_IRAM_RD_DATA__IRAM_RD_DATA__SHIFT 0x0
+#define DMCU_EVENT_TRIGGER__GEN_SW_INT_TO_UC_MASK 0x1
+#define DMCU_EVENT_TRIGGER__GEN_SW_INT_TO_UC__SHIFT 0x0
+#define DMCU_EVENT_TRIGGER__UC_INTERNAL_INT_CODE_MASK 0x7f0000
+#define DMCU_EVENT_TRIGGER__UC_INTERNAL_INT_CODE__SHIFT 0x10
+#define DMCU_EVENT_TRIGGER__GEN_UC_INTERNAL_INT_TO_HOST_MASK 0x800000
+#define DMCU_EVENT_TRIGGER__GEN_UC_INTERNAL_INT_TO_HOST__SHIFT 0x17
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_IRQ_N_PIN_MASK 0x1
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_IRQ_N_PIN__SHIFT 0x0
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_XIRQ_N_PIN_MASK 0x2
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_XIRQ_N_PIN__SHIFT 0x1
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_SOFTWARE_INTERRUPT_MASK 0x4
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_SOFTWARE_INTERRUPT__SHIFT 0x2
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_ILLEGAL_OPCODE_TRAP_MASK 0x8
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_ILLEGAL_OPCODE_TRAP__SHIFT 0x3
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_4_MASK 0x10
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_4__SHIFT 0x4
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_3_MASK 0x20
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_3__SHIFT 0x5
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_2_MASK 0x40
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_2__SHIFT 0x6
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_1_MASK 0x80
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OUTPUT_COMPARE_1__SHIFT 0x7
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OVERFLOW_MASK 0x100
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_OVERFLOW__SHIFT 0x8
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_REAL_TIME_INTERRUPT_MASK 0x200
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_REAL_TIME_INTERRUPT__SHIFT 0x9
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_4_OUTPUT_COMPARE_5_MASK 0x400
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_4_OUTPUT_COMPARE_5__SHIFT 0xa
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_3_MASK 0x800
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_3__SHIFT 0xb
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_2_MASK 0x1000
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_2__SHIFT 0xc
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_1_MASK 0x2000
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_TIMER_INPUT_CAPTURE_1__SHIFT 0xd
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_PULSE_ACCUMULATOR_INPUT_EDGE_MASK 0x4000
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_PULSE_ACCUMULATOR_INPUT_EDGE__SHIFT 0xe
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_PULSE_ACCUMULATOR_OVERFLOW_MASK 0x8000
+#define DMCU_UC_INTERNAL_INT_STATUS__UC_INT_PULSE_ACCUMULATOR_OVERFLOW__SHIFT 0xf
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_STATUS_MASK 0x2000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_STATUS__SHIFT 0xd
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_OCCURRED_MASK 0x4000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_OCCURRED__SHIFT 0xe
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_CLEAR_MASK 0x4000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN1_INT_CLEAR__SHIFT 0xe
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_STATUS_MASK 0x8000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_STATUS__SHIFT 0xf
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_OCCURRED_MASK 0x10000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_OCCURRED__SHIFT 0x10
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_CLEAR_MASK 0x10000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN2_INT_CLEAR__SHIFT 0x10
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_STATUS_MASK 0x20000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_STATUS__SHIFT 0x11
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_OCCURRED_MASK 0x40000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_OCCURRED__SHIFT 0x12
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_CLEAR_MASK 0x40000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN3_INT_CLEAR__SHIFT 0x12
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_STATUS_MASK 0x80000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_STATUS__SHIFT 0x13
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_OCCURRED_MASK 0x100000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_OCCURRED__SHIFT 0x14
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_CLEAR_MASK 0x100000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN4_INT_CLEAR__SHIFT 0x14
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_STATUS_MASK 0x200000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_STATUS__SHIFT 0x15
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_OCCURRED_MASK 0x400000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_OCCURRED__SHIFT 0x16
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_CLEAR_MASK 0x400000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN5_INT_CLEAR__SHIFT 0x16
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_STATUS_MASK 0x800000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_STATUS__SHIFT 0x17
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_OCCURRED_MASK 0x1000000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_OCCURRED__SHIFT 0x18
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_CLEAR_MASK 0x1000000
+#define DMCU_SS_INTERRUPT_CNTL_STATUS__STATIC_SCREEN6_INT_CLEAR__SHIFT 0x18
+#define DMCU_INTERRUPT_STATUS__ABM1_HG_READY_INT_OCCURRED_MASK 0x1
+#define DMCU_INTERRUPT_STATUS__ABM1_HG_READY_INT_OCCURRED__SHIFT 0x0
+#define DMCU_INTERRUPT_STATUS__ABM1_HG_READY_INT_CLEAR_MASK 0x1
+#define DMCU_INTERRUPT_STATUS__ABM1_HG_READY_INT_CLEAR__SHIFT 0x0
+#define DMCU_INTERRUPT_STATUS__ABM1_LS_READY_INT_OCCURRED_MASK 0x2
+#define DMCU_INTERRUPT_STATUS__ABM1_LS_READY_INT_OCCURRED__SHIFT 0x1
+#define DMCU_INTERRUPT_STATUS__ABM1_LS_READY_INT_CLEAR_MASK 0x2
+#define DMCU_INTERRUPT_STATUS__ABM1_LS_READY_INT_CLEAR__SHIFT 0x1
+#define DMCU_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT_OCCURRED_MASK 0x4
+#define DMCU_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT_OCCURRED__SHIFT 0x2
+#define DMCU_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT_CLEAR_MASK 0x4
+#define DMCU_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT_CLEAR__SHIFT 0x2
+#define DMCU_INTERRUPT_STATUS__MCP_INT_OCCURRED_MASK 0x8
+#define DMCU_INTERRUPT_STATUS__MCP_INT_OCCURRED__SHIFT 0x3
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_UP_INT_OCCURRED_MASK 0x10
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_UP_INT_OCCURRED__SHIFT 0x4
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_UP_INT_CLEAR_MASK 0x10
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_UP_INT_CLEAR__SHIFT 0x4
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_DOWN_INT_OCCURRED_MASK 0x20
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_DOWN_INT_OCCURRED__SHIFT 0x5
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_DOWN_INT_CLEAR_MASK 0x20
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DSI_POWER_DOWN_INT_CLEAR__SHIFT 0x5
+#define DMCU_INTERRUPT_STATUS__EXTERNAL_SW_INT_OCCURRED_MASK 0x100
+#define DMCU_INTERRUPT_STATUS__EXTERNAL_SW_INT_OCCURRED__SHIFT 0x8
+#define DMCU_INTERRUPT_STATUS__EXTERNAL_SW_INT_CLEAR_MASK 0x100
+#define DMCU_INTERRUPT_STATUS__EXTERNAL_SW_INT_CLEAR__SHIFT 0x8
+#define DMCU_INTERRUPT_STATUS__SCP_INT_OCCURRED_MASK 0x200
+#define DMCU_INTERRUPT_STATUS__SCP_INT_OCCURRED__SHIFT 0x9
+#define DMCU_INTERRUPT_STATUS__UC_INTERNAL_INT_OCCURRED_MASK 0x400
+#define DMCU_INTERRUPT_STATUS__UC_INTERNAL_INT_OCCURRED__SHIFT 0xa
+#define DMCU_INTERRUPT_STATUS__UC_INTERNAL_INT_CLEAR_MASK 0x400
+#define DMCU_INTERRUPT_STATUS__UC_INTERNAL_INT_CLEAR__SHIFT 0xa
+#define DMCU_INTERRUPT_STATUS__UC_REG_RD_TIMEOUT_INT_OCCURRED_MASK 0x800
+#define DMCU_INTERRUPT_STATUS__UC_REG_RD_TIMEOUT_INT_OCCURRED__SHIFT 0xb
+#define DMCU_INTERRUPT_STATUS__UC_REG_RD_TIMEOUT_INT_CLEAR_MASK 0x800
+#define DMCU_INTERRUPT_STATUS__UC_REG_RD_TIMEOUT_INT_CLEAR__SHIFT 0xb
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_UP_INT_OCCURRED_MASK 0x1000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_UP_INT_OCCURRED__SHIFT 0xc
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_UP_INT_CLEAR_MASK 0x1000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_UP_INT_CLEAR__SHIFT 0xc
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_UP_INT_OCCURRED_MASK 0x2000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_UP_INT_OCCURRED__SHIFT 0xd
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_UP_INT_CLEAR_MASK 0x2000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_UP_INT_CLEAR__SHIFT 0xd
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_UP_INT_OCCURRED_MASK 0x4000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_UP_INT_OCCURRED__SHIFT 0xe
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_UP_INT_CLEAR_MASK 0x4000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_UP_INT_CLEAR__SHIFT 0xe
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_UP_INT_OCCURRED_MASK 0x8000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_UP_INT_OCCURRED__SHIFT 0xf
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_UP_INT_CLEAR_MASK 0x8000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_UP_INT_CLEAR__SHIFT 0xf
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_UP_INT_OCCURRED_MASK 0x10000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_UP_INT_OCCURRED__SHIFT 0x10
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_UP_INT_CLEAR_MASK 0x10000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_UP_INT_CLEAR__SHIFT 0x10
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_UP_INT_OCCURRED_MASK 0x20000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_UP_INT_OCCURRED__SHIFT 0x11
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_UP_INT_CLEAR_MASK 0x20000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_UP_INT_CLEAR__SHIFT 0x11
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_DOWN_INT_OCCURRED_MASK 0x40000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_DOWN_INT_OCCURRED__SHIFT 0x12
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_DOWN_INT_CLEAR_MASK 0x40000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE0_POWER_DOWN_INT_CLEAR__SHIFT 0x12
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_DOWN_INT_OCCURRED_MASK 0x80000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_DOWN_INT_OCCURRED__SHIFT 0x13
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_DOWN_INT_CLEAR_MASK 0x80000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE1_POWER_DOWN_INT_CLEAR__SHIFT 0x13
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_DOWN_INT_OCCURRED_MASK 0x100000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_DOWN_INT_OCCURRED__SHIFT 0x14
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_DOWN_INT_CLEAR_MASK 0x100000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE2_POWER_DOWN_INT_CLEAR__SHIFT 0x14
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_DOWN_INT_OCCURRED_MASK 0x200000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_DOWN_INT_OCCURRED__SHIFT 0x15
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_DOWN_INT_CLEAR_MASK 0x200000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE3_POWER_DOWN_INT_CLEAR__SHIFT 0x15
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_DOWN_INT_OCCURRED_MASK 0x400000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_DOWN_INT_OCCURRED__SHIFT 0x16
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_DOWN_INT_CLEAR_MASK 0x400000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE4_POWER_DOWN_INT_CLEAR__SHIFT 0x16
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_DOWN_INT_OCCURRED_MASK 0x800000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_DOWN_INT_OCCURRED__SHIFT 0x17
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_DOWN_INT_CLEAR_MASK 0x800000
+#define DMCU_INTERRUPT_STATUS__DCPG_IHC_DCFE5_POWER_DOWN_INT_CLEAR__SHIFT 0x17
+#define DMCU_INTERRUPT_STATUS__VBLANK1_INT_OCCURRED_MASK 0x1000000
+#define DMCU_INTERRUPT_STATUS__VBLANK1_INT_OCCURRED__SHIFT 0x18
+#define DMCU_INTERRUPT_STATUS__VBLANK1_INT_CLEAR_MASK 0x1000000
+#define DMCU_INTERRUPT_STATUS__VBLANK1_INT_CLEAR__SHIFT 0x18
+#define DMCU_INTERRUPT_STATUS__VBLANK2_INT_OCCURRED_MASK 0x2000000
+#define DMCU_INTERRUPT_STATUS__VBLANK2_INT_OCCURRED__SHIFT 0x19
+#define DMCU_INTERRUPT_STATUS__VBLANK2_INT_CLEAR_MASK 0x2000000
+#define DMCU_INTERRUPT_STATUS__VBLANK2_INT_CLEAR__SHIFT 0x19
+#define DMCU_INTERRUPT_STATUS__VBLANK3_INT_OCCURRED_MASK 0x4000000
+#define DMCU_INTERRUPT_STATUS__VBLANK3_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_INTERRUPT_STATUS__VBLANK3_INT_CLEAR_MASK 0x4000000
+#define DMCU_INTERRUPT_STATUS__VBLANK3_INT_CLEAR__SHIFT 0x1a
+#define DMCU_INTERRUPT_STATUS__VBLANK4_INT_OCCURRED_MASK 0x8000000
+#define DMCU_INTERRUPT_STATUS__VBLANK4_INT_OCCURRED__SHIFT 0x1b
+#define DMCU_INTERRUPT_STATUS__VBLANK4_INT_CLEAR_MASK 0x8000000
+#define DMCU_INTERRUPT_STATUS__VBLANK4_INT_CLEAR__SHIFT 0x1b
+#define DMCU_INTERRUPT_STATUS__VBLANK5_INT_OCCURRED_MASK 0x10000000
+#define DMCU_INTERRUPT_STATUS__VBLANK5_INT_OCCURRED__SHIFT 0x1c
+#define DMCU_INTERRUPT_STATUS__VBLANK5_INT_CLEAR_MASK 0x10000000
+#define DMCU_INTERRUPT_STATUS__VBLANK5_INT_CLEAR__SHIFT 0x1c
+#define DMCU_INTERRUPT_STATUS__VBLANK6_INT_OCCURRED_MASK 0x20000000
+#define DMCU_INTERRUPT_STATUS__VBLANK6_INT_OCCURRED__SHIFT 0x1d
+#define DMCU_INTERRUPT_STATUS__VBLANK6_INT_CLEAR_MASK 0x20000000
+#define DMCU_INTERRUPT_STATUS__VBLANK6_INT_CLEAR__SHIFT 0x1d
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_UP_INT_OCCURRED_MASK 0x1
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_UP_INT_OCCURRED__SHIFT 0x0
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_UP_INT_CLEAR_MASK 0x1
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_UP_INT_CLEAR__SHIFT 0x0
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_UP_INT_OCCURRED_MASK 0x2
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_UP_INT_OCCURRED__SHIFT 0x1
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_UP_INT_CLEAR_MASK 0x2
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_UP_INT_CLEAR__SHIFT 0x1
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_OCCURRED_MASK 0x4
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_OCCURRED__SHIFT 0x2
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_CLEAR_MASK 0x4
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_CLEAR__SHIFT 0x2
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_OCCURRED_MASK 0x8
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_OCCURRED__SHIFT 0x3
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_CLEAR_MASK 0x8
+#define DMCU_INTERRUPT_STATUS_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_CLEAR__SHIFT 0x3
+#define DMCU_INTERRUPT_STATUS_1__DCFEV0_VBLANK_INT_OCCURRED_MASK 0x10
+#define DMCU_INTERRUPT_STATUS_1__DCFEV0_VBLANK_INT_OCCURRED__SHIFT 0x4
+#define DMCU_INTERRUPT_STATUS_1__DCFEV0_VBLANK_INT_CLEAR_MASK 0x10
+#define DMCU_INTERRUPT_STATUS_1__DCFEV0_VBLANK_INT_CLEAR__SHIFT 0x4
+#define DMCU_INTERRUPT_STATUS_1__DCFEV1_VBLANK_INT_OCCURRED_MASK 0x20
+#define DMCU_INTERRUPT_STATUS_1__DCFEV1_VBLANK_INT_OCCURRED__SHIFT 0x5
+#define DMCU_INTERRUPT_STATUS_1__DCFEV1_VBLANK_INT_CLEAR_MASK 0x20
+#define DMCU_INTERRUPT_STATUS_1__DCFEV1_VBLANK_INT_CLEAR__SHIFT 0x5
+#define DMCU_INTERRUPT_STATUS_1__DMCU_GENERIC_INTERRUPT_OCCURRED_MASK 0x2000
+#define DMCU_INTERRUPT_STATUS_1__DMCU_GENERIC_INTERRUPT_OCCURRED__SHIFT 0xd
+#define DMCU_INTERRUPT_STATUS_1__DMCU_GENERIC_INTERRUPT_CLEAR_MASK 0x2000
+#define DMCU_INTERRUPT_STATUS_1__DMCU_GENERIC_INTERRUPT_CLEAR__SHIFT 0xd
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_HG_READY_INT_MASK_MASK 0x1
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_HG_READY_INT_MASK__SHIFT 0x0
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_LS_READY_INT_MASK_MASK 0x2
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_LS_READY_INT_MASK__SHIFT 0x1
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_BL_UPDATE_INT_MASK_MASK 0x4
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__ABM1_BL_UPDATE_INT_MASK__SHIFT 0x2
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__SCP_INT_MASK_MASK 0x200
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__SCP_INT_MASK__SHIFT 0x9
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__UC_INTERNAL_INT_MASK_MASK 0x400
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__UC_INTERNAL_INT_MASK__SHIFT 0xa
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__UC_REG_RD_TIMEOUT_INT_MASK_MASK 0x800
+#define DMCU_INTERRUPT_TO_HOST_EN_MASK__UC_REG_RD_TIMEOUT_INT_MASK__SHIFT 0xb
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_HG_READY_INT_TO_UC_EN_MASK 0x1
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_HG_READY_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_LS_READY_INT_TO_UC_EN_MASK 0x2
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_LS_READY_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_BL_UPDATE_INT_TO_UC_EN_MASK 0x4
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__ABM1_BL_UPDATE_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__MCP_INT_TO_UC_EN_MASK 0x8
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__MCP_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DSI_POWER_UP_INT_TO_UC_EN_MASK 0x10
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DSI_POWER_UP_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DSI_POWER_DOWN_INT_TO_UC_EN_MASK 0x20
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DSI_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN1_INT_TO_UC_EN_MASK 0x40
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN1_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN2_INT_TO_UC_EN_MASK 0x80
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN2_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__EXTERNAL_SW_INT_TO_UC_EN_MASK 0x100
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__EXTERNAL_SW_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN3_INT_TO_UC_EN_MASK 0x200
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN3_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN4_INT_TO_UC_EN_MASK 0x400
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN4_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN5_INT_TO_UC_EN_MASK 0x800
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN5_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE0_POWER_UP_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE0_POWER_UP_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE1_POWER_UP_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE1_POWER_UP_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE2_POWER_UP_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE2_POWER_UP_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE3_POWER_UP_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE3_POWER_UP_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE4_POWER_UP_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE4_POWER_UP_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE5_POWER_UP_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE5_POWER_UP_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE0_POWER_DOWN_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE0_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE1_POWER_DOWN_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE1_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE2_POWER_DOWN_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE2_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE3_POWER_DOWN_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE3_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE4_POWER_DOWN_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE4_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE5_POWER_DOWN_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__DCPG_IHC_DCFE5_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK1_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK1_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK2_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK2_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK3_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK3_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK4_INT_TO_UC_EN_MASK 0x8000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK4_INT_TO_UC_EN__SHIFT 0x1b
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK5_INT_TO_UC_EN_MASK 0x10000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK5_INT_TO_UC_EN__SHIFT 0x1c
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK6_INT_TO_UC_EN_MASK 0x20000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__VBLANK6_INT_TO_UC_EN__SHIFT 0x1d
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN6_INT_TO_UC_EN_MASK 0x40000000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK__STATIC_SCREEN6_INT_TO_UC_EN__SHIFT 0x1e
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV0_POWER_UP_INT_TO_UC_EN_MASK 0x1
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV0_POWER_UP_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_TO_UC_EN_MASK 0x2
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCFEV0_VBLANK_INT_TO_UC_EN_MASK 0x4
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCFEV0_VBLANK_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV1_POWER_UP_INT_TO_UC_EN_MASK 0x8
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV1_POWER_UP_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_TO_UC_EN_MASK 0x10
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCFEV1_VBLANK_INT_TO_UC_EN_MASK 0x20
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DCFEV1_VBLANK_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DMCU_GENERIC_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_INTERRUPT_TO_UC_EN_MASK_1__DMCU_GENERIC_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_HG_READY_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_HG_READY_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_LS_READY_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_LS_READY_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_BL_UPDATE_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__ABM1_BL_UPDATE_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__MCP_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__MCP_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DSI_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DSI_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DSI_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DSI_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN1_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN1_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN2_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN2_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__EXTERNAL_SW_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__EXTERNAL_SW_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN3_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN3_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN4_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN4_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN5_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN5_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE0_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE0_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE1_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE1_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE2_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE2_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE3_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE3_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE4_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE4_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE5_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE5_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE0_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE0_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE1_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE1_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE2_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE2_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE3_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE3_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE4_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE4_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE5_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__DCPG_IHC_DCFE5_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK1_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK1_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK2_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK2_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK3_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK3_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK4_INT_XIRQ_IRQ_SEL_MASK 0x8000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK4_INT_XIRQ_IRQ_SEL__SHIFT 0x1b
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK5_INT_XIRQ_IRQ_SEL_MASK 0x10000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK5_INT_XIRQ_IRQ_SEL__SHIFT 0x1c
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK6_INT_XIRQ_IRQ_SEL_MASK 0x20000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__VBLANK6_INT_XIRQ_IRQ_SEL__SHIFT 0x1d
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN6_INT_XIRQ_IRQ_SEL_MASK 0x40000000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL__STATIC_SCREEN6_INT_XIRQ_IRQ_SEL__SHIFT 0x1e
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV0_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV0_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV0_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCFEV0_VBLANK_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCFEV0_VBLANK_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV1_POWER_UP_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV1_POWER_UP_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCPG_IHC_DCFEV1_POWER_DOWN_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCFEV1_VBLANK_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DCFEV1_VBLANK_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DMCU_GENERIC_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_INTERRUPT_TO_UC_XIRQ_IRQ_SEL_1__DMCU_GENERIC_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DC_DMCU_SCRATCH__DMCU_SCRATCH_MASK 0xffffffff
+#define DC_DMCU_SCRATCH__DMCU_SCRATCH__SHIFT 0x0
+#define DMCU_INT_CNT__DMCU_ABM1_HG_READY_INT_CNT_MASK 0xff
+#define DMCU_INT_CNT__DMCU_ABM1_HG_READY_INT_CNT__SHIFT 0x0
+#define DMCU_INT_CNT__DMCU_ABM1_LS_READY_INT_CNT_MASK 0xff00
+#define DMCU_INT_CNT__DMCU_ABM1_LS_READY_INT_CNT__SHIFT 0x8
+#define DMCU_INT_CNT__DMCU_ABM1_BL_UPDATE_INT_CNT_MASK 0xff0000
+#define DMCU_INT_CNT__DMCU_ABM1_BL_UPDATE_INT_CNT__SHIFT 0x10
+#define DMCU_FW_CHECKSUM_SMPL_BYTE_POS__DMCU_FW_CHECKSUM_LO_SMPL_BYTE_POS_MASK 0x3
+#define DMCU_FW_CHECKSUM_SMPL_BYTE_POS__DMCU_FW_CHECKSUM_LO_SMPL_BYTE_POS__SHIFT 0x0
+#define DMCU_FW_CHECKSUM_SMPL_BYTE_POS__DMCU_FW_CHECKSUM_HI_SMPL_BYTE_POS_MASK 0xc
+#define DMCU_FW_CHECKSUM_SMPL_BYTE_POS__DMCU_FW_CHECKSUM_HI_SMPL_BYTE_POS__SHIFT 0x2
+#define DMCU_UC_CLK_GATING_CNTL__UC_IRAM_RD_DELAY_MASK 0x7
+#define DMCU_UC_CLK_GATING_CNTL__UC_IRAM_RD_DELAY__SHIFT 0x0
+#define DMCU_UC_CLK_GATING_CNTL__UC_ERAM_RD_DELAY_MASK 0x700
+#define DMCU_UC_CLK_GATING_CNTL__UC_ERAM_RD_DELAY__SHIFT 0x8
+#define DMCU_UC_CLK_GATING_CNTL__UC_RBBM_RD_CLK_GATING_EN_MASK 0x10000
+#define DMCU_UC_CLK_GATING_CNTL__UC_RBBM_RD_CLK_GATING_EN__SHIFT 0x10
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE0_MASK 0xff
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE0__SHIFT 0x0
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE1_MASK 0xff00
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE1__SHIFT 0x8
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE2_MASK 0xff0000
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE2__SHIFT 0x10
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE3_MASK 0xff000000
+#define MASTER_COMM_DATA_REG1__MASTER_COMM_DATA_REG1_BYTE3__SHIFT 0x18
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE0_MASK 0xff
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE0__SHIFT 0x0
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE1_MASK 0xff00
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE1__SHIFT 0x8
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE2_MASK 0xff0000
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE2__SHIFT 0x10
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE3_MASK 0xff000000
+#define MASTER_COMM_DATA_REG2__MASTER_COMM_DATA_REG2_BYTE3__SHIFT 0x18
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE0_MASK 0xff
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE0__SHIFT 0x0
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE1_MASK 0xff00
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE1__SHIFT 0x8
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE2_MASK 0xff0000
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE2__SHIFT 0x10
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE3_MASK 0xff000000
+#define MASTER_COMM_DATA_REG3__MASTER_COMM_DATA_REG3_BYTE3__SHIFT 0x18
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE0_MASK 0xff
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE0__SHIFT 0x0
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE1_MASK 0xff00
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE1__SHIFT 0x8
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE2_MASK 0xff0000
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE2__SHIFT 0x10
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE3_MASK 0xff000000
+#define MASTER_COMM_CMD_REG__MASTER_COMM_CMD_REG_BYTE3__SHIFT 0x18
+#define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT_MASK 0x1
+#define MASTER_COMM_CNTL_REG__MASTER_COMM_INTERRUPT__SHIFT 0x0
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE0_MASK 0xff
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE0__SHIFT 0x0
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE1_MASK 0xff00
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE1__SHIFT 0x8
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE2_MASK 0xff0000
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE2__SHIFT 0x10
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE3_MASK 0xff000000
+#define SLAVE_COMM_DATA_REG1__SLAVE_COMM_DATA_REG1_BYTE3__SHIFT 0x18
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE0_MASK 0xff
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE0__SHIFT 0x0
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE1_MASK 0xff00
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE1__SHIFT 0x8
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE2_MASK 0xff0000
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE2__SHIFT 0x10
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE3_MASK 0xff000000
+#define SLAVE_COMM_DATA_REG2__SLAVE_COMM_DATA_REG2_BYTE3__SHIFT 0x18
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE0_MASK 0xff
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE0__SHIFT 0x0
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE1_MASK 0xff00
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE1__SHIFT 0x8
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE2_MASK 0xff0000
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE2__SHIFT 0x10
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE3_MASK 0xff000000
+#define SLAVE_COMM_DATA_REG3__SLAVE_COMM_DATA_REG3_BYTE3__SHIFT 0x18
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE0_MASK 0xff
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE0__SHIFT 0x0
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE1_MASK 0xff00
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE1__SHIFT 0x8
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE2_MASK 0xff0000
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE2__SHIFT 0x10
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE3_MASK 0xff000000
+#define SLAVE_COMM_CMD_REG__SLAVE_COMM_CMD_REG_BYTE3__SHIFT 0x18
+#define SLAVE_COMM_CNTL_REG__SLAVE_COMM_INTERRUPT_MASK 0x1
+#define SLAVE_COMM_CNTL_REG__SLAVE_COMM_INTERRUPT__SHIFT 0x0
+#define SLAVE_COMM_CNTL_REG__COMM_PORT_MSG_TO_HOST_IN_PROGRESS_MASK 0x100
+#define SLAVE_COMM_CNTL_REG__COMM_PORT_MSG_TO_HOST_IN_PROGRESS__SHIFT 0x8
+#define DMCU_TEST_DEBUG_INDEX__DMCU_TEST_DEBUG_INDEX_MASK 0xff
+#define DMCU_TEST_DEBUG_INDEX__DMCU_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DMCU_TEST_DEBUG_INDEX__DMCU_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DMCU_TEST_DEBUG_INDEX__DMCU_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DMCU_TEST_DEBUG_DATA__DMCU_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DMCU_TEST_DEBUG_DATA__DMCU_TEST_DEBUG_DATA__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER0_INT_CLEAR_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER1_INT_CLEAR_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER2_INT_CLEAR_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER3_INT_CLEAR_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER4_INT_CLEAR_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER5_INT_CLEAR_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER6_INT_CLEAR_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER7_INT_CLEAR_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER0_INT_CLEAR_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER1_INT_CLEAR_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER2_INT_CLEAR_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER3_INT_CLEAR_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER4_INT_CLEAR_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER5_INT_CLEAR_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER6_INT_CLEAR_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER7_INT_CLEAR_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER0_INT_CLEAR_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER1_INT_CLEAR_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER2_INT_CLEAR_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER3_INT_CLEAR_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER4_INT_CLEAR_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER5_INT_CLEAR_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER6_INT_CLEAR_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER7_INT_CLEAR_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCI_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCO_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS1__DCCG_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER0_INT_CLEAR_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER1_INT_CLEAR_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER2_INT_CLEAR_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER3_INT_CLEAR_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER4_INT_CLEAR_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER5_INT_CLEAR_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER6_INT_CLEAR_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER7_INT_CLEAR_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER0_INT_CLEAR_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER1_INT_CLEAR_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER2_INT_CLEAR_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER3_INT_CLEAR_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER4_INT_CLEAR_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER5_INT_CLEAR_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER6_INT_CLEAR_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER7_INT_CLEAR_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER0_INT_CLEAR_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER1_INT_CLEAR_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER2_INT_CLEAR_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER3_INT_CLEAR_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER4_INT_CLEAR_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER5_INT_CLEAR_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER6_INT_CLEAR_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER7_INT_CLEAR_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE0_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE1_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS2__DCFE2_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER0_INT_CLEAR_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER1_INT_CLEAR_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER2_INT_CLEAR_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER3_INT_CLEAR_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER4_INT_CLEAR_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER5_INT_CLEAR_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER6_INT_CLEAR_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER7_INT_CLEAR_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER0_INT_CLEAR_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER1_INT_CLEAR_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER2_INT_CLEAR_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER3_INT_CLEAR_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER4_INT_CLEAR_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER5_INT_CLEAR_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER6_INT_CLEAR_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER7_INT_CLEAR_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER0_INT_CLEAR_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER1_INT_CLEAR_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER2_INT_CLEAR_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER3_INT_CLEAR_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER4_INT_CLEAR_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER5_INT_CLEAR_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER6_INT_CLEAR_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER7_INT_CLEAR_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE3_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE4_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS3__DCFE5_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER0_INT_CLEAR_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER1_INT_CLEAR_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER2_INT_CLEAR_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER3_INT_CLEAR_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER4_INT_CLEAR_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER5_INT_CLEAR_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER6_INT_CLEAR_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER7_INT_CLEAR_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER0_INT_CLEAR_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER1_INT_CLEAR_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER2_INT_CLEAR_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER3_INT_CLEAR_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER4_INT_CLEAR_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER5_INT_CLEAR_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER6_INT_CLEAR_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER7_INT_CLEAR_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER0_INT_OCCURRED_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER0_INT_OCCURRED__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER0_INT_CLEAR_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER0_INT_CLEAR__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER1_INT_OCCURRED_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER1_INT_OCCURRED__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER1_INT_CLEAR_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER1_INT_CLEAR__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER2_INT_OCCURRED_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER2_INT_OCCURRED__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER2_INT_CLEAR_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER2_INT_CLEAR__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER3_INT_OCCURRED_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER3_INT_OCCURRED__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER3_INT_CLEAR_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER3_INT_CLEAR__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER4_INT_OCCURRED_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER4_INT_OCCURRED__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER4_INT_CLEAR_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER4_INT_CLEAR__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER5_INT_OCCURRED_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER5_INT_OCCURRED__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER5_INT_CLEAR_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER5_INT_CLEAR__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER6_INT_OCCURRED_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER6_INT_OCCURRED__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER6_INT_CLEAR_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER6_INT_CLEAR__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER7_INT_OCCURRED_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER7_INT_OCCURRED__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER7_INT_CLEAR_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER7_INT_CLEAR__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__WB_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCRX_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER_OFF_INT_OCCURRED_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER_OFF_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER_OFF_INT_CLEAR_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_STATUS4__DCCG_PERFMON2_COUNTER_OFF_INT_CLEAR__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER0_INT_CLEAR_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER1_INT_CLEAR_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER2_INT_CLEAR_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER3_INT_CLEAR_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER4_INT_CLEAR_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER5_INT_CLEAR_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER6_INT_CLEAR_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER7_INT_CLEAR_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER0_INT_OCCURRED_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER0_INT_OCCURRED__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER0_INT_CLEAR_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER0_INT_CLEAR__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER1_INT_OCCURRED_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER1_INT_OCCURRED__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER1_INT_CLEAR_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER1_INT_CLEAR__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER2_INT_OCCURRED_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER2_INT_OCCURRED__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER2_INT_CLEAR_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER2_INT_CLEAR__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER3_INT_OCCURRED_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER3_INT_OCCURRED__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER3_INT_CLEAR_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER3_INT_CLEAR__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER4_INT_OCCURRED_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER4_INT_OCCURRED__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER4_INT_CLEAR_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER4_INT_CLEAR__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER5_INT_OCCURRED_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER5_INT_OCCURRED__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER5_INT_CLEAR_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER5_INT_CLEAR__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER6_INT_OCCURRED_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER6_INT_OCCURRED__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER6_INT_CLEAR_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER6_INT_CLEAR__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER7_INT_OCCURRED_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER7_INT_OCCURRED__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER7_INT_CLEAR_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER7_INT_CLEAR__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV0_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER_OFF_INT_OCCURRED_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER_OFF_INT_OCCURRED__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER_OFF_INT_CLEAR_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_STATUS5__DCFEV1_PERFMON_COUNTER_OFF_INT_CLEAR__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCI_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCO_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK1__DCCG_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE0_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE1_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK2__DCFE2_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE3_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE4_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK3__DCFE5_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER0_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER0_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER1_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER1_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER2_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER2_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER3_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER3_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER4_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER4_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER5_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER5_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER6_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER6_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER7_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER7_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__WB_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCRX_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER_OFF_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK4__DCCG_PERFMON2_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV0_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER0_INT_TO_UC_EN_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER0_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER1_INT_TO_UC_EN_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER1_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER2_INT_TO_UC_EN_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER2_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER3_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER3_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER4_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER4_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER5_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER5_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER6_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER6_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER7_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER7_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER_OFF_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_EN_MASK5__DCFEV1_PERFMON_COUNTER_OFF_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCI_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCO_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DCCG_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE0_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE1_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL2__DCFE2_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE3_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE4_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL3__DCFE5_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__WB_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCRX_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL4__DCCG_PERFMON2_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV0_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER0_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER1_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER2_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER3_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER4_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER5_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER6_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER7_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_PERFMON_INTERRUPT_TO_UC_XIRQ_IRQ_SEL5__DCFEV1_PERFMON_COUNTER_OFF_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_MSA_RECEIVED_INT_OCCURRED_MASK 0x1
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_MSA_RECEIVED_INT_OCCURRED__SHIFT 0x0
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_MSA_RECEIVED_INT_CLEAR_MASK 0x1
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_MSA_RECEIVED_INT_CLEAR__SHIFT 0x0
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_OCCURRED_MASK 0x2
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_OCCURRED__SHIFT 0x1
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_CLEAR_MASK 0x2
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_CLEAR__SHIFT 0x1
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT0_OCCURRED_MASK 0x4
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT0_OCCURRED__SHIFT 0x2
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT0_CLEAR_MASK 0x4
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT0_CLEAR__SHIFT 0x2
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT1_OCCURRED_MASK 0x8
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT1_OCCURRED__SHIFT 0x3
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT1_CLEAR_MASK 0x8
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_VERTICAL_INT1_CLEAR__SHIFT 0x3
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_SDP_RECEIVED_INT_OCCURRED_MASK 0x10
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_SDP_RECEIVED_INT_OCCURRED__SHIFT 0x4
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_SDP_RECEIVED_INT_CLEAR_MASK 0x10
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD0P0_SDP_RECEIVED_INT_CLEAR__SHIFT 0x4
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_MSA_RECEIVED_INT_OCCURRED_MASK 0x20
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_MSA_RECEIVED_INT_OCCURRED__SHIFT 0x5
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_MSA_RECEIVED_INT_CLEAR_MASK 0x20
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_MSA_RECEIVED_INT_CLEAR__SHIFT 0x5
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_OCCURRED_MASK 0x40
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_OCCURRED__SHIFT 0x6
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_CLEAR_MASK 0x40
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_CLEAR__SHIFT 0x6
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT0_OCCURRED_MASK 0x80
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT0_OCCURRED__SHIFT 0x7
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT0_CLEAR_MASK 0x80
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT0_CLEAR__SHIFT 0x7
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT1_OCCURRED_MASK 0x100
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT1_OCCURRED__SHIFT 0x8
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT1_CLEAR_MASK 0x100
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_VERTICAL_INT1_CLEAR__SHIFT 0x8
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_SDP_RECEIVED_INT_OCCURRED_MASK 0x200
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_SDP_RECEIVED_INT_OCCURRED__SHIFT 0x9
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_SDP_RECEIVED_INT_CLEAR_MASK 0x200
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_SD1P0_SDP_RECEIVED_INT_CLEAR__SHIFT 0x9
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x400
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xa
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x400
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xa
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x800
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xb
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x800
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xb
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x1000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xc
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x1000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xc
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x2000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xd
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x2000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xd
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x4000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xe
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x4000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xe
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x8000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0xf
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x8000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0xf
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_OCCURRED_MASK 0x10000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_OCCURRED__SHIFT 0x10
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_CLEAR_MASK 0x10000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_CLEAR__SHIFT 0x10
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_OCCURRED_MASK 0x20000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_OCCURRED__SHIFT 0x11
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_CLEAR_MASK 0x20000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_CLEAR__SHIFT 0x11
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_OCCURRED_MASK 0x40000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_OCCURRED__SHIFT 0x12
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_CLEAR_MASK 0x40000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_CLEAR__SHIFT 0x12
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_OCCURRED_MASK 0x80000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_OCCURRED__SHIFT 0x13
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_CLEAR_MASK 0x80000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_CLEAR__SHIFT 0x13
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_OCCURRED_MASK 0x100000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_OCCURRED__SHIFT 0x14
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_CLEAR_MASK 0x100000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_CLEAR__SHIFT 0x14
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_OCCURRED_MASK 0x200000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_OCCURRED__SHIFT 0x15
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_CLEAR_MASK 0x200000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_CLEAR__SHIFT 0x15
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_AUX_INT_OCCURRED_MASK 0x400000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_AUX_INT_OCCURRED__SHIFT 0x16
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_AUX_INT_CLEAR_MASK 0x400000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_AUX_INT_CLEAR__SHIFT 0x16
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_I2C_INT_OCCURRED_MASK 0x800000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_I2C_INT_OCCURRED__SHIFT 0x17
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_I2C_INT_CLEAR_MASK 0x800000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_I2C_INT_CLEAR__SHIFT 0x17
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_CPU_INT_OCCURRED_MASK 0x1000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_CPU_INT_OCCURRED__SHIFT 0x18
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_CPU_INT_CLEAR_MASK 0x1000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_CPU_INT_CLEAR__SHIFT 0x18
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_OCCURRED_MASK 0x2000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_OCCURRED__SHIFT 0x19
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_CLEAR_MASK 0x2000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_CLEAR__SHIFT 0x19
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_OCCURRED_MASK 0x4000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_OCCURRED__SHIFT 0x1a
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_CLEAR_MASK 0x4000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_CLEAR__SHIFT 0x1a
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_OCCURRED_MASK 0x8000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_OCCURRED__SHIFT 0x1b
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_CLEAR_MASK 0x8000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_CLEAR__SHIFT 0x1b
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_OCCURRED_MASK 0x10000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_OCCURRED__SHIFT 0x1c
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_CLEAR_MASK 0x10000000
+#define DMCU_DPRX_INTERRUPT_STATUS1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_CLEAR__SHIFT 0x1c
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_MSA_RECEIVED_INT_TO_UC_EN_MASK 0x1
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_MSA_RECEIVED_INT_TO_UC_EN__SHIFT 0x0
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_TO_UC_EN_MASK 0x2
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_TO_UC_EN__SHIFT 0x1
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VERTICAL_INT0_TO_UC_EN_MASK 0x4
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VERTICAL_INT0_TO_UC_EN__SHIFT 0x2
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VERTICAL_INT1_TO_UC_EN_MASK 0x8
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_VERTICAL_INT1_TO_UC_EN__SHIFT 0x3
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_SDP_RECEIVED_INT_TO_UC_EN_MASK 0x10
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD0P0_SDP_RECEIVED_INT_TO_UC_EN__SHIFT 0x4
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_MSA_RECEIVED_INT_TO_UC_EN_MASK 0x20
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_MSA_RECEIVED_INT_TO_UC_EN__SHIFT 0x5
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_TO_UC_EN_MASK 0x40
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_TO_UC_EN__SHIFT 0x6
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VERTICAL_INT0_TO_UC_EN_MASK 0x80
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VERTICAL_INT0_TO_UC_EN__SHIFT 0x7
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VERTICAL_INT1_TO_UC_EN_MASK 0x100
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_VERTICAL_INT1_TO_UC_EN__SHIFT 0x8
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_SDP_RECEIVED_INT_TO_UC_EN_MASK 0x200
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_SD1P0_SDP_RECEIVED_INT_TO_UC_EN__SHIFT 0x9
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x400
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xa
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x800
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xb
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x1000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xc
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x2000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xd
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x4000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xe
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x8000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0xf
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN_MASK 0x10000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_TO_UC_EN__SHIFT 0x10
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_TO_UC_EN_MASK 0x20000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_TO_UC_EN__SHIFT 0x11
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_TO_UC_EN_MASK 0x40000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_TO_UC_EN__SHIFT 0x12
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_TO_UC_EN_MASK 0x80000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_TO_UC_EN__SHIFT 0x13
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_TO_UC_EN_MASK 0x100000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_TO_UC_EN__SHIFT 0x14
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_TO_UC_EN_MASK 0x200000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_TO_UC_EN__SHIFT 0x15
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_AUX_INT_TO_UC_EN_MASK 0x400000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_AUX_INT_TO_UC_EN__SHIFT 0x16
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_I2C_INT_TO_UC_EN_MASK 0x800000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_I2C_INT_TO_UC_EN__SHIFT 0x17
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_CPU_INT_TO_UC_EN_MASK 0x1000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_CPU_INT_TO_UC_EN__SHIFT 0x18
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_TO_UC_EN_MASK 0x2000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_TO_UC_EN__SHIFT 0x19
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_TO_UC_EN_MASK 0x4000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_TO_UC_EN__SHIFT 0x1a
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_TO_UC_EN_MASK 0x8000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_TO_UC_EN__SHIFT 0x1b
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_TO_UC_EN_MASK 0x10000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_EN_MASK1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_TO_UC_EN__SHIFT 0x1c
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_MSA_RECEIVED_INT_XIRQ_IRQ_SEL_MASK 0x1
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_MSA_RECEIVED_INT_XIRQ_IRQ_SEL__SHIFT 0x0
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_XIRQ_IRQ_SEL_MASK 0x2
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_XIRQ_IRQ_SEL__SHIFT 0x1
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VERTICAL_INT0_XIRQ_IRQ_SEL_MASK 0x4
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VERTICAL_INT0_XIRQ_IRQ_SEL__SHIFT 0x2
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VERTICAL_INT1_XIRQ_IRQ_SEL_MASK 0x8
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_VERTICAL_INT1_XIRQ_IRQ_SEL__SHIFT 0x3
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_SDP_RECEIVED_INT_XIRQ_IRQ_SEL_MASK 0x10
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD0P0_SDP_RECEIVED_INT_XIRQ_IRQ_SEL__SHIFT 0x4
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_MSA_RECEIVED_INT_XIRQ_IRQ_SEL_MASK 0x20
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_MSA_RECEIVED_INT_XIRQ_IRQ_SEL__SHIFT 0x5
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_XIRQ_IRQ_SEL_MASK 0x40
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VBID_VID_STREAM_STATUS_TOGGLED_INT_XIRQ_IRQ_SEL__SHIFT 0x6
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VERTICAL_INT0_XIRQ_IRQ_SEL_MASK 0x80
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VERTICAL_INT0_XIRQ_IRQ_SEL__SHIFT 0x7
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VERTICAL_INT1_XIRQ_IRQ_SEL_MASK 0x100
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_VERTICAL_INT1_XIRQ_IRQ_SEL__SHIFT 0x8
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_SDP_RECEIVED_INT_XIRQ_IRQ_SEL_MASK 0x200
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_SD1P0_SDP_RECEIVED_INT_XIRQ_IRQ_SEL__SHIFT 0x9
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x400
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_BS_INTERVAL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xa
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x800
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_SR_INTERVAL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xb
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x1000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_SYMBOL_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xc
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x2000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DISPARITY_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xd
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x4000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_TRAINING_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xe
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x8000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_TEST_PATTERN_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0xf
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL_MASK 0x10000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_ECF_ERROR_THRESH_EXCEEDED_INT_XIRQ_IRQ_SEL__SHIFT 0x10
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_XIRQ_IRQ_SEL_MASK 0x20000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DETECT_SR_LOCK_INT_XIRQ_IRQ_SEL__SHIFT 0x11
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_XIRQ_IRQ_SEL_MASK 0x40000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_LOSS_OF_ALIGN_INT_XIRQ_IRQ_SEL__SHIFT 0x12
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_XIRQ_IRQ_SEL_MASK 0x80000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_LOSS_OF_DESKEW_INT_XIRQ_IRQ_SEL__SHIFT 0x13
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_XIRQ_IRQ_SEL_MASK 0x100000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_EXCESSIVE_ERROR_INT_XIRQ_IRQ_SEL__SHIFT 0x14
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_XIRQ_IRQ_SEL_MASK 0x200000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_DPHY_P0_DESKEW_FIFO_OVERFLOW_INT_XIRQ_IRQ_SEL__SHIFT 0x15
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_AUX_INT_XIRQ_IRQ_SEL_MASK 0x400000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_AUX_INT_XIRQ_IRQ_SEL__SHIFT 0x16
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_I2C_INT_XIRQ_IRQ_SEL_MASK 0x800000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_I2C_INT_XIRQ_IRQ_SEL__SHIFT 0x17
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_CPU_INT_XIRQ_IRQ_SEL_MASK 0x1000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_CPU_INT_XIRQ_IRQ_SEL__SHIFT 0x18
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_XIRQ_IRQ_SEL_MASK 0x2000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG1_TIMEOUT_INT_XIRQ_IRQ_SEL__SHIFT 0x19
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_XIRQ_IRQ_SEL_MASK 0x4000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG2_TIMEOUT_INT_XIRQ_IRQ_SEL__SHIFT 0x1a
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_XIRQ_IRQ_SEL_MASK 0x8000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG3_TIMEOUT_INT_XIRQ_IRQ_SEL__SHIFT 0x1b
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_XIRQ_IRQ_SEL_MASK 0x10000000
+#define DMCU_DPRX_INTERRUPT_TO_UC_XIRQ_IRQ_SEL1__DPRX_AUX_P0_MSG4_TIMEOUT_INT_XIRQ_IRQ_SEL__SHIFT 0x1c
+#define DP_LINK_CNTL__DP_LINK_TRAINING_COMPLETE_MASK 0x10
+#define DP_LINK_CNTL__DP_LINK_TRAINING_COMPLETE__SHIFT 0x4
+#define DP_LINK_CNTL__DP_LINK_STATUS_MASK 0x100
+#define DP_LINK_CNTL__DP_LINK_STATUS__SHIFT 0x8
+#define DP_LINK_CNTL__DP_EMBEDDED_PANEL_MODE_MASK 0x20000
+#define DP_LINK_CNTL__DP_EMBEDDED_PANEL_MODE__SHIFT 0x11
+#define DP_PIXEL_FORMAT__DP_PIXEL_ENCODING_MASK 0x7
+#define DP_PIXEL_FORMAT__DP_PIXEL_ENCODING__SHIFT 0x0
+#define DP_PIXEL_FORMAT__DP_DYN_RANGE_MASK 0x100
+#define DP_PIXEL_FORMAT__DP_DYN_RANGE__SHIFT 0x8
+#define DP_PIXEL_FORMAT__DP_YCBCR_RANGE_MASK 0x10000
+#define DP_PIXEL_FORMAT__DP_YCBCR_RANGE__SHIFT 0x10
+#define DP_PIXEL_FORMAT__DP_COMPONENT_DEPTH_MASK 0x7000000
+#define DP_PIXEL_FORMAT__DP_COMPONENT_DEPTH__SHIFT 0x18
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC0_OVERRIDE_MASK 0xff
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC0_OVERRIDE__SHIFT 0x0
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC0_OVERRIDE_ENABLE_MASK 0x100
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC0_OVERRIDE_ENABLE__SHIFT 0x8
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC1_BIT7_OVERRIDE_MASK 0x200
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC1_BIT7_OVERRIDE__SHIFT 0x9
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC1_BIT7_OVERRIDE_ENABLE_MASK 0x20000
+#define DP_MSA_COLORIMETRY__DP_MSA_MISC1_BIT7_OVERRIDE_ENABLE__SHIFT 0x11
+#define DP_CONFIG__DP_UDI_LANES_MASK 0x3
+#define DP_CONFIG__DP_UDI_LANES__SHIFT 0x0
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_ENABLE_MASK 0x1
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_ENABLE__SHIFT 0x0
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_DIS_DEFER_MASK 0x300
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_DIS_DEFER__SHIFT 0x8
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_STATUS_MASK 0x10000
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_STATUS__SHIFT 0x10
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_CHANGE_KEEPOUT_MASK 0x100000
+#define DP_VID_STREAM_CNTL__DP_VID_STREAM_CHANGE_KEEPOUT__SHIFT 0x14
+#define DP_STEER_FIFO__DP_STEER_FIFO_RESET_MASK 0x1
+#define DP_STEER_FIFO__DP_STEER_FIFO_RESET__SHIFT 0x0
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_FLAG_MASK 0x10
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_FLAG__SHIFT 0x4
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_INT_MASK 0x20
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_INT__SHIFT 0x5
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_ACK_MASK 0x40
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_ACK__SHIFT 0x6
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_MASK_MASK 0x80
+#define DP_STEER_FIFO__DP_STEER_OVERFLOW_MASK__SHIFT 0x7
+#define DP_STEER_FIFO__DP_TU_OVERFLOW_FLAG_MASK 0x100
+#define DP_STEER_FIFO__DP_TU_OVERFLOW_FLAG__SHIFT 0x8
+#define DP_STEER_FIFO__DP_TU_OVERFLOW_ACK_MASK 0x1000
+#define DP_STEER_FIFO__DP_TU_OVERFLOW_ACK__SHIFT 0xc
+#define DP_MSA_MISC__DP_MSA_MISC1_MASK 0x78
+#define DP_MSA_MISC__DP_MSA_MISC1__SHIFT 0x3
+#define DP_MSA_MISC__DP_MSA_MISC2_MASK 0xff00
+#define DP_MSA_MISC__DP_MSA_MISC2__SHIFT 0x8
+#define DP_MSA_MISC__DP_MSA_MISC3_MASK 0xff0000
+#define DP_MSA_MISC__DP_MSA_MISC3__SHIFT 0x10
+#define DP_MSA_MISC__DP_MSA_MISC4_MASK 0xff000000
+#define DP_MSA_MISC__DP_MSA_MISC4__SHIFT 0x18
+#define DP_VID_TIMING__DP_VID_TIMING_MODE_MASK 0x1
+#define DP_VID_TIMING__DP_VID_TIMING_MODE__SHIFT 0x0
+#define DP_VID_TIMING__DP_VID_M_N_DOUBLE_BUFFER_MODE_MASK 0x10
+#define DP_VID_TIMING__DP_VID_M_N_DOUBLE_BUFFER_MODE__SHIFT 0x4
+#define DP_VID_TIMING__DP_VID_M_N_GEN_EN_MASK 0x100
+#define DP_VID_TIMING__DP_VID_M_N_GEN_EN__SHIFT 0x8
+#define DP_VID_TIMING__DP_VID_M_DOUBLE_VALUE_EN_MASK 0x200
+#define DP_VID_TIMING__DP_VID_M_DOUBLE_VALUE_EN__SHIFT 0x9
+#define DP_VID_TIMING__DP_VID_N_DIV_MASK 0xff000000
+#define DP_VID_TIMING__DP_VID_N_DIV__SHIFT 0x18
+#define DP_VID_N__DP_VID_N_MASK 0xffffff
+#define DP_VID_N__DP_VID_N__SHIFT 0x0
+#define DP_VID_M__DP_VID_M_MASK 0xffffff
+#define DP_VID_M__DP_VID_M__SHIFT 0x0
+#define DP_LINK_FRAMING_CNTL__DP_IDLE_BS_INTERVAL_MASK 0x3ffff
+#define DP_LINK_FRAMING_CNTL__DP_IDLE_BS_INTERVAL__SHIFT 0x0
+#define DP_LINK_FRAMING_CNTL__DP_VBID_DISABLE_MASK 0x1000000
+#define DP_LINK_FRAMING_CNTL__DP_VBID_DISABLE__SHIFT 0x18
+#define DP_LINK_FRAMING_CNTL__DP_VID_ENHANCED_FRAME_MODE_MASK 0x10000000
+#define DP_LINK_FRAMING_CNTL__DP_VID_ENHANCED_FRAME_MODE__SHIFT 0x1c
+#define DP_HBR2_EYE_PATTERN__DP_HBR2_EYE_PATTERN_ENABLE_MASK 0x1
+#define DP_HBR2_EYE_PATTERN__DP_HBR2_EYE_PATTERN_ENABLE__SHIFT 0x0
+#define DP_VID_MSA_VBID__DP_VID_MSA_LOCATION_MASK 0xfff
+#define DP_VID_MSA_VBID__DP_VID_MSA_LOCATION__SHIFT 0x0
+#define DP_VID_MSA_VBID__DP_VID_MSA_TOP_FIELD_MODE_MASK 0x10000
+#define DP_VID_MSA_VBID__DP_VID_MSA_TOP_FIELD_MODE__SHIFT 0x10
+#define DP_VID_MSA_VBID__DP_VID_VBID_FIELD_POL_MASK 0x1000000
+#define DP_VID_MSA_VBID__DP_VID_VBID_FIELD_POL__SHIFT 0x18
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_INT_MASK 0x1
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_INT__SHIFT 0x0
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_ACK_MASK 0x2
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_ACK__SHIFT 0x1
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_MASK_MASK 0x4
+#define DP_VID_INTERRUPT_CNTL__DP_VID_STREAM_DISABLE_MASK__SHIFT 0x2
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE0_MASK 0x1
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE0__SHIFT 0x0
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE1_MASK 0x2
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE1__SHIFT 0x1
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE2_MASK 0x4
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE2__SHIFT 0x2
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE3_MASK 0x8
+#define DP_DPHY_CNTL__DPHY_ATEST_SEL_LANE3__SHIFT 0x3
+#define DP_DPHY_CNTL__DPHY_BYPASS_MASK 0x10000
+#define DP_DPHY_CNTL__DPHY_BYPASS__SHIFT 0x10
+#define DP_DPHY_CNTL__DPHY_SKEW_BYPASS_MASK 0x1000000
+#define DP_DPHY_CNTL__DPHY_SKEW_BYPASS__SHIFT 0x18
+#define DP_DPHY_TRAINING_PATTERN_SEL__DPHY_TRAINING_PATTERN_SEL_MASK 0x3
+#define DP_DPHY_TRAINING_PATTERN_SEL__DPHY_TRAINING_PATTERN_SEL__SHIFT 0x0
+#define DP_DPHY_SYM0__DPHY_SYM1_MASK 0x3ff
+#define DP_DPHY_SYM0__DPHY_SYM1__SHIFT 0x0
+#define DP_DPHY_SYM0__DPHY_SYM2_MASK 0xffc00
+#define DP_DPHY_SYM0__DPHY_SYM2__SHIFT 0xa
+#define DP_DPHY_SYM0__DPHY_SYM3_MASK 0x3ff00000
+#define DP_DPHY_SYM0__DPHY_SYM3__SHIFT 0x14
+#define DP_DPHY_SYM1__DPHY_SYM4_MASK 0x3ff
+#define DP_DPHY_SYM1__DPHY_SYM4__SHIFT 0x0
+#define DP_DPHY_SYM1__DPHY_SYM5_MASK 0xffc00
+#define DP_DPHY_SYM1__DPHY_SYM5__SHIFT 0xa
+#define DP_DPHY_SYM1__DPHY_SYM6_MASK 0x3ff00000
+#define DP_DPHY_SYM1__DPHY_SYM6__SHIFT 0x14
+#define DP_DPHY_SYM2__DPHY_SYM7_MASK 0x3ff
+#define DP_DPHY_SYM2__DPHY_SYM7__SHIFT 0x0
+#define DP_DPHY_SYM2__DPHY_SYM8_MASK 0xffc00
+#define DP_DPHY_SYM2__DPHY_SYM8__SHIFT 0xa
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_RESET_MASK 0x100
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_RESET__SHIFT 0x8
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_EXT_DISP_MASK 0x10000
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_EXT_DISP__SHIFT 0x10
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_CUR_DISP_MASK 0x1000000
+#define DP_DPHY_8B10B_CNTL__DPHY_8B10B_CUR_DISP__SHIFT 0x18
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_EN_MASK 0x1
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_EN__SHIFT 0x0
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_SEL_MASK 0x30
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_SEL__SHIFT 0x4
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_SEED_MASK 0x7fffff00
+#define DP_DPHY_PRBS_CNTL__DPHY_PRBS_SEED__SHIFT 0x8
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_LOAD_BS_COUNT_MASK 0x3ff
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_LOAD_BS_COUNT__SHIFT 0x0
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_BS_SR_SWAP_DONE_MASK 0x8000
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_BS_SR_SWAP_DONE__SHIFT 0xf
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_LOAD_BS_COUNT_START_MASK 0x10000
+#define DP_DPHY_BS_SR_SWAP_CNTL__DPHY_LOAD_BS_COUNT_START__SHIFT 0x10
+#define DP_DPHY_CRC_EN__DPHY_CRC_EN_MASK 0x1
+#define DP_DPHY_CRC_EN__DPHY_CRC_EN__SHIFT 0x0
+#define DP_DPHY_CRC_EN__DPHY_CRC_CONT_EN_MASK 0x10
+#define DP_DPHY_CRC_EN__DPHY_CRC_CONT_EN__SHIFT 0x4
+#define DP_DPHY_CRC_EN__DPHY_CRC_RESULT_VALID_MASK 0x100
+#define DP_DPHY_CRC_EN__DPHY_CRC_RESULT_VALID__SHIFT 0x8
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_FIELD_MASK 0x1
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_FIELD__SHIFT 0x0
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_SEL_MASK 0x30
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_SEL__SHIFT 0x4
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_MASK_MASK 0xff0000
+#define DP_DPHY_CRC_CNTL__DPHY_CRC_MASK__SHIFT 0x10
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT_MASK 0xff
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT__SHIFT 0x0
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT1_MASK 0xff00
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT1__SHIFT 0x8
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT2_MASK 0xff0000
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT2__SHIFT 0x10
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT3_MASK 0xff000000
+#define DP_DPHY_CRC_RESULT__DPHY_CRC_RESULT3__SHIFT 0x18
+#define DP_DPHY_CRC_MST_CNTL__DPHY_CRC_MST_FIRST_SLOT_MASK 0x3f
+#define DP_DPHY_CRC_MST_CNTL__DPHY_CRC_MST_FIRST_SLOT__SHIFT 0x0
+#define DP_DPHY_CRC_MST_CNTL__DPHY_CRC_MST_LAST_SLOT_MASK 0x3f00
+#define DP_DPHY_CRC_MST_CNTL__DPHY_CRC_MST_LAST_SLOT__SHIFT 0x8
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_LOCK_MASK 0x1
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_LOCK__SHIFT 0x0
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_ERROR_MASK 0x100
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_ERROR__SHIFT 0x8
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_ERROR_ACK_MASK 0x10000
+#define DP_DPHY_CRC_MST_STATUS__DPHY_CRC_MST_PHASE_ERROR_ACK__SHIFT 0x10
+#define DP_DPHY_FAST_TRAINING__DPHY_RX_FAST_TRAINING_CAPABLE_MASK 0x1
+#define DP_DPHY_FAST_TRAINING__DPHY_RX_FAST_TRAINING_CAPABLE__SHIFT 0x0
+#define DP_DPHY_FAST_TRAINING__DPHY_SW_FAST_TRAINING_START_MASK 0x2
+#define DP_DPHY_FAST_TRAINING__DPHY_SW_FAST_TRAINING_START__SHIFT 0x1
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_EN_MASK 0x4
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_VBLANK_EDGE_DETECT_EN__SHIFT 0x2
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_TP1_TIME_MASK 0xfff00
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_TP1_TIME__SHIFT 0x8
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_TP2_TIME_MASK 0xfff00000
+#define DP_DPHY_FAST_TRAINING__DPHY_FAST_TRAINING_TP2_TIME__SHIFT 0x14
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_STATE_MASK 0x7
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_STATE__SHIFT 0x0
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_OCCURRED_MASK 0x10
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_OCCURRED__SHIFT 0x4
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_MASK_MASK 0x100
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_MASK__SHIFT 0x8
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_ACK_MASK 0x1000
+#define DP_DPHY_FAST_TRAINING_STATUS__DPHY_FAST_TRAINING_COMPLETE_ACK__SHIFT 0xc
+#define DP_DPHY_HBR2_PATTERN_CONTROL__DP_DPHY_HBR2_PATTERN_CONTROL_MASK 0x7
+#define DP_DPHY_HBR2_PATTERN_CONTROL__DP_DPHY_HBR2_PATTERN_CONTROL__SHIFT 0x0
+#define DP_MSA_V_TIMING_OVERRIDE1__DP_MSA_V_TIMING_OVERRIDE_EN_MASK 0x1
+#define DP_MSA_V_TIMING_OVERRIDE1__DP_MSA_V_TIMING_OVERRIDE_EN__SHIFT 0x0
+#define DP_MSA_V_TIMING_OVERRIDE1__DP_MSA_V_TOTAL_OVERRIDE_MASK 0x3fff0
+#define DP_MSA_V_TIMING_OVERRIDE1__DP_MSA_V_TOTAL_OVERRIDE__SHIFT 0x4
+#define DP_MSA_V_TIMING_OVERRIDE2__DP_MSA_V_BLANK_START_OVERRIDE_MASK 0x3fff
+#define DP_MSA_V_TIMING_OVERRIDE2__DP_MSA_V_BLANK_START_OVERRIDE__SHIFT 0x0
+#define DP_MSA_V_TIMING_OVERRIDE2__DP_MSA_V_BLANK_END_OVERRIDE_MASK 0x3fff0000
+#define DP_MSA_V_TIMING_OVERRIDE2__DP_MSA_V_BLANK_END_OVERRIDE__SHIFT 0x10
+#define DP_SEC_CNTL__DP_SEC_STREAM_ENABLE_MASK 0x1
+#define DP_SEC_CNTL__DP_SEC_STREAM_ENABLE__SHIFT 0x0
+#define DP_SEC_CNTL__DP_SEC_ASP_ENABLE_MASK 0x10
+#define DP_SEC_CNTL__DP_SEC_ASP_ENABLE__SHIFT 0x4
+#define DP_SEC_CNTL__DP_SEC_ATP_ENABLE_MASK 0x100
+#define DP_SEC_CNTL__DP_SEC_ATP_ENABLE__SHIFT 0x8
+#define DP_SEC_CNTL__DP_SEC_AIP_ENABLE_MASK 0x1000
+#define DP_SEC_CNTL__DP_SEC_AIP_ENABLE__SHIFT 0xc
+#define DP_SEC_CNTL__DP_SEC_ACM_ENABLE_MASK 0x10000
+#define DP_SEC_CNTL__DP_SEC_ACM_ENABLE__SHIFT 0x10
+#define DP_SEC_CNTL__DP_SEC_GSP0_ENABLE_MASK 0x100000
+#define DP_SEC_CNTL__DP_SEC_GSP0_ENABLE__SHIFT 0x14
+#define DP_SEC_CNTL__DP_SEC_GSP1_ENABLE_MASK 0x200000
+#define DP_SEC_CNTL__DP_SEC_GSP1_ENABLE__SHIFT 0x15
+#define DP_SEC_CNTL__DP_SEC_GSP2_ENABLE_MASK 0x400000
+#define DP_SEC_CNTL__DP_SEC_GSP2_ENABLE__SHIFT 0x16
+#define DP_SEC_CNTL__DP_SEC_GSP3_ENABLE_MASK 0x800000
+#define DP_SEC_CNTL__DP_SEC_GSP3_ENABLE__SHIFT 0x17
+#define DP_SEC_CNTL__DP_SEC_AVI_ENABLE_MASK 0x1000000
+#define DP_SEC_CNTL__DP_SEC_AVI_ENABLE__SHIFT 0x18
+#define DP_SEC_CNTL__DP_SEC_MPG_ENABLE_MASK 0x10000000
+#define DP_SEC_CNTL__DP_SEC_MPG_ENABLE__SHIFT 0x1c
+#define DP_SEC_CNTL1__DP_SEC_ISRC_ENABLE_MASK 0x1
+#define DP_SEC_CNTL1__DP_SEC_ISRC_ENABLE__SHIFT 0x0
+#define DP_SEC_CNTL1__DP_SEC_GSP0_PRIORITY_MASK 0x10
+#define DP_SEC_CNTL1__DP_SEC_GSP0_PRIORITY__SHIFT 0x4
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND_MASK 0x20
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND__SHIFT 0x5
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND_PENDING_MASK 0x40
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND_PENDING__SHIFT 0x6
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND_DEADLINE_MISSED_MASK 0x80
+#define DP_SEC_CNTL1__DP_SEC_GSP0_SEND_DEADLINE_MISSED__SHIFT 0x7
+#define DP_SEC_CNTL1__DP_SEC_GSP0_LINE_NUM_MASK 0xffff0000
+#define DP_SEC_CNTL1__DP_SEC_GSP0_LINE_NUM__SHIFT 0x10
+#define DP_SEC_FRAMING1__DP_SEC_FRAME_START_LOCATION_MASK 0xfff
+#define DP_SEC_FRAMING1__DP_SEC_FRAME_START_LOCATION__SHIFT 0x0
+#define DP_SEC_FRAMING1__DP_SEC_VBLANK_TRANSMIT_WIDTH_MASK 0xffff0000
+#define DP_SEC_FRAMING1__DP_SEC_VBLANK_TRANSMIT_WIDTH__SHIFT 0x10
+#define DP_SEC_FRAMING2__DP_SEC_START_POSITION_MASK 0xffff
+#define DP_SEC_FRAMING2__DP_SEC_START_POSITION__SHIFT 0x0
+#define DP_SEC_FRAMING2__DP_SEC_HBLANK_TRANSMIT_WIDTH_MASK 0xffff0000
+#define DP_SEC_FRAMING2__DP_SEC_HBLANK_TRANSMIT_WIDTH__SHIFT 0x10
+#define DP_SEC_FRAMING3__DP_SEC_IDLE_FRAME_SIZE_MASK 0x3fff
+#define DP_SEC_FRAMING3__DP_SEC_IDLE_FRAME_SIZE__SHIFT 0x0
+#define DP_SEC_FRAMING3__DP_SEC_IDLE_TRANSMIT_WIDTH_MASK 0xffff0000
+#define DP_SEC_FRAMING3__DP_SEC_IDLE_TRANSMIT_WIDTH__SHIFT 0x10
+#define DP_SEC_FRAMING4__DP_SEC_COLLISION_STATUS_MASK 0x100000
+#define DP_SEC_FRAMING4__DP_SEC_COLLISION_STATUS__SHIFT 0x14
+#define DP_SEC_FRAMING4__DP_SEC_COLLISION_ACK_MASK 0x1000000
+#define DP_SEC_FRAMING4__DP_SEC_COLLISION_ACK__SHIFT 0x18
+#define DP_SEC_FRAMING4__DP_SEC_AUDIO_MUTE_MASK 0x10000000
+#define DP_SEC_FRAMING4__DP_SEC_AUDIO_MUTE__SHIFT 0x1c
+#define DP_SEC_FRAMING4__DP_SEC_AUDIO_MUTE_STATUS_MASK 0x20000000
+#define DP_SEC_FRAMING4__DP_SEC_AUDIO_MUTE_STATUS__SHIFT 0x1d
+#define DP_SEC_AUD_N__DP_SEC_AUD_N_MASK 0xffffff
+#define DP_SEC_AUD_N__DP_SEC_AUD_N__SHIFT 0x0
+#define DP_SEC_AUD_N_READBACK__DP_SEC_AUD_N_READBACK_MASK 0xffffff
+#define DP_SEC_AUD_N_READBACK__DP_SEC_AUD_N_READBACK__SHIFT 0x0
+#define DP_SEC_AUD_M__DP_SEC_AUD_M_MASK 0xffffff
+#define DP_SEC_AUD_M__DP_SEC_AUD_M__SHIFT 0x0
+#define DP_SEC_AUD_M_READBACK__DP_SEC_AUD_M_READBACK_MASK 0xffffff
+#define DP_SEC_AUD_M_READBACK__DP_SEC_AUD_M_READBACK__SHIFT 0x0
+#define DP_SEC_TIMESTAMP__DP_SEC_TIMESTAMP_MODE_MASK 0x1
+#define DP_SEC_TIMESTAMP__DP_SEC_TIMESTAMP_MODE__SHIFT 0x0
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_CODING_TYPE_MASK 0xe
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_CODING_TYPE__SHIFT 0x1
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_PRIORITY_MASK 0x10
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_PRIORITY__SHIFT 0x4
+#define DP_SEC_PACKET_CNTL__DP_SEC_VERSION_MASK 0x3f00
+#define DP_SEC_PACKET_CNTL__DP_SEC_VERSION__SHIFT 0x8
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_CHANNEL_COUNT_OVERRIDE_MASK 0x10000
+#define DP_SEC_PACKET_CNTL__DP_SEC_ASP_CHANNEL_COUNT_OVERRIDE__SHIFT 0x10
+#define DP_MSE_RATE_CNTL__DP_MSE_RATE_Y_MASK 0x3ffffff
+#define DP_MSE_RATE_CNTL__DP_MSE_RATE_Y__SHIFT 0x0
+#define DP_MSE_RATE_CNTL__DP_MSE_RATE_X_MASK 0xfc000000
+#define DP_MSE_RATE_CNTL__DP_MSE_RATE_X__SHIFT 0x1a
+#define DP_MSE_RATE_UPDATE__DP_MSE_RATE_UPDATE_PENDING_MASK 0x1
+#define DP_MSE_RATE_UPDATE__DP_MSE_RATE_UPDATE_PENDING__SHIFT 0x0
+#define DP_MSE_SAT0__DP_MSE_SAT_SRC0_MASK 0x7
+#define DP_MSE_SAT0__DP_MSE_SAT_SRC0__SHIFT 0x0
+#define DP_MSE_SAT0__DP_MSE_SAT_SLOT_COUNT0_MASK 0x3f00
+#define DP_MSE_SAT0__DP_MSE_SAT_SLOT_COUNT0__SHIFT 0x8
+#define DP_MSE_SAT0__DP_MSE_SAT_SRC1_MASK 0x70000
+#define DP_MSE_SAT0__DP_MSE_SAT_SRC1__SHIFT 0x10
+#define DP_MSE_SAT0__DP_MSE_SAT_SLOT_COUNT1_MASK 0x3f000000
+#define DP_MSE_SAT0__DP_MSE_SAT_SLOT_COUNT1__SHIFT 0x18
+#define DP_MSE_SAT1__DP_MSE_SAT_SRC2_MASK 0x7
+#define DP_MSE_SAT1__DP_MSE_SAT_SRC2__SHIFT 0x0
+#define DP_MSE_SAT1__DP_MSE_SAT_SLOT_COUNT2_MASK 0x3f00
+#define DP_MSE_SAT1__DP_MSE_SAT_SLOT_COUNT2__SHIFT 0x8
+#define DP_MSE_SAT1__DP_MSE_SAT_SRC3_MASK 0x70000
+#define DP_MSE_SAT1__DP_MSE_SAT_SRC3__SHIFT 0x10
+#define DP_MSE_SAT1__DP_MSE_SAT_SLOT_COUNT3_MASK 0x3f000000
+#define DP_MSE_SAT1__DP_MSE_SAT_SLOT_COUNT3__SHIFT 0x18
+#define DP_MSE_SAT2__DP_MSE_SAT_SRC4_MASK 0x7
+#define DP_MSE_SAT2__DP_MSE_SAT_SRC4__SHIFT 0x0
+#define DP_MSE_SAT2__DP_MSE_SAT_SLOT_COUNT4_MASK 0x3f00
+#define DP_MSE_SAT2__DP_MSE_SAT_SLOT_COUNT4__SHIFT 0x8
+#define DP_MSE_SAT2__DP_MSE_SAT_SRC5_MASK 0x70000
+#define DP_MSE_SAT2__DP_MSE_SAT_SRC5__SHIFT 0x10
+#define DP_MSE_SAT2__DP_MSE_SAT_SLOT_COUNT5_MASK 0x3f000000
+#define DP_MSE_SAT2__DP_MSE_SAT_SLOT_COUNT5__SHIFT 0x18
+#define DP_MSE_SAT_UPDATE__DP_MSE_SAT_UPDATE_MASK 0x3
+#define DP_MSE_SAT_UPDATE__DP_MSE_SAT_UPDATE__SHIFT 0x0
+#define DP_MSE_SAT_UPDATE__DP_MSE_16_MTP_KEEPOUT_MASK 0x100
+#define DP_MSE_SAT_UPDATE__DP_MSE_16_MTP_KEEPOUT__SHIFT 0x8
+#define DP_MSE_LINK_TIMING__DP_MSE_LINK_FRAME_MASK 0x3ff
+#define DP_MSE_LINK_TIMING__DP_MSE_LINK_FRAME__SHIFT 0x0
+#define DP_MSE_LINK_TIMING__DP_MSE_LINK_LINE_MASK 0x30000
+#define DP_MSE_LINK_TIMING__DP_MSE_LINK_LINE__SHIFT 0x10
+#define DP_MSE_MISC_CNTL__DP_MSE_BLANK_CODE_MASK 0x1
+#define DP_MSE_MISC_CNTL__DP_MSE_BLANK_CODE__SHIFT 0x0
+#define DP_MSE_MISC_CNTL__DP_MSE_TIMESTAMP_MODE_MASK 0x10
+#define DP_MSE_MISC_CNTL__DP_MSE_TIMESTAMP_MODE__SHIFT 0x4
+#define DP_MSE_MISC_CNTL__DP_MSE_ZERO_ENCODER_MASK 0x100
+#define DP_MSE_MISC_CNTL__DP_MSE_ZERO_ENCODER__SHIFT 0x8
+#define DP_MSE_MISC_CNTL__DP_MSE_OUTPUT_DPDBG_DATA_MASK 0x10000
+#define DP_MSE_MISC_CNTL__DP_MSE_OUTPUT_DPDBG_DATA__SHIFT 0x10
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SRC0_STATUS_MASK 0x7
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SRC0_STATUS__SHIFT 0x0
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SLOT_COUNT0_STATUS_MASK 0x3f00
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SLOT_COUNT0_STATUS__SHIFT 0x8
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SRC1_STATUS_MASK 0x70000
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SRC1_STATUS__SHIFT 0x10
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SLOT_COUNT1_STATUS_MASK 0x3f000000
+#define DP_MSE_SAT0_STATUS__DP_MSE_SAT_SLOT_COUNT1_STATUS__SHIFT 0x18
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SRC2_STATUS_MASK 0x7
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SRC2_STATUS__SHIFT 0x0
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SLOT_COUNT2_STATUS_MASK 0x3f00
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SLOT_COUNT2_STATUS__SHIFT 0x8
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SRC3_STATUS_MASK 0x70000
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SRC3_STATUS__SHIFT 0x10
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SLOT_COUNT3_STATUS_MASK 0x3f000000
+#define DP_MSE_SAT1_STATUS__DP_MSE_SAT_SLOT_COUNT3_STATUS__SHIFT 0x18
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SRC4_STATUS_MASK 0x7
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SRC4_STATUS__SHIFT 0x0
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SLOT_COUNT4_STATUS_MASK 0x3f00
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SLOT_COUNT4_STATUS__SHIFT 0x8
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SRC5_STATUS_MASK 0x70000
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SRC5_STATUS__SHIFT 0x10
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SLOT_COUNT5_STATUS_MASK 0x3f000000
+#define DP_MSE_SAT2_STATUS__DP_MSE_SAT_SLOT_COUNT5_STATUS__SHIFT 0x18
+#define DP_TEST_DEBUG_INDEX__DP_TEST_DEBUG_INDEX_MASK 0xff
+#define DP_TEST_DEBUG_INDEX__DP_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DP_TEST_DEBUG_INDEX__DP_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DP_TEST_DEBUG_INDEX__DP_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DP_TEST_DEBUG_DATA__DP_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DP_TEST_DEBUG_DATA__DP_TEST_DEBUG_DATA__SHIFT 0x0
+#define DP_FE_TEST_DEBUG_INDEX__DP_FE_TEST_DEBUG_INDEX_MASK 0xff
+#define DP_FE_TEST_DEBUG_INDEX__DP_FE_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DP_FE_TEST_DEBUG_INDEX__DP_FE_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DP_FE_TEST_DEBUG_INDEX__DP_FE_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DP_FE_TEST_DEBUG_DATA__DP_FE_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DP_FE_TEST_DEBUG_DATA__DP_FE_TEST_DEBUG_DATA__SHIFT 0x0
+#define AUX_CONTROL__AUX_EN_MASK 0x1
+#define AUX_CONTROL__AUX_EN__SHIFT 0x0
+#define AUX_CONTROL__AUX_RESET_MASK 0x10
+#define AUX_CONTROL__AUX_RESET__SHIFT 0x4
+#define AUX_CONTROL__AUX_RESET_DONE_MASK 0x20
+#define AUX_CONTROL__AUX_RESET_DONE__SHIFT 0x5
+#define AUX_CONTROL__AUX_LS_READ_EN_MASK 0x100
+#define AUX_CONTROL__AUX_LS_READ_EN__SHIFT 0x8
+#define AUX_CONTROL__AUX_LS_UPDATE_DISABLE_MASK 0x1000
+#define AUX_CONTROL__AUX_LS_UPDATE_DISABLE__SHIFT 0xc
+#define AUX_CONTROL__AUX_IGNORE_HPD_DISCON_MASK 0x10000
+#define AUX_CONTROL__AUX_IGNORE_HPD_DISCON__SHIFT 0x10
+#define AUX_CONTROL__AUX_MODE_DET_EN_MASK 0x40000
+#define AUX_CONTROL__AUX_MODE_DET_EN__SHIFT 0x12
+#define AUX_CONTROL__AUX_HPD_SEL_MASK 0x700000
+#define AUX_CONTROL__AUX_HPD_SEL__SHIFT 0x14
+#define AUX_CONTROL__AUX_IMPCAL_REQ_EN_MASK 0x1000000
+#define AUX_CONTROL__AUX_IMPCAL_REQ_EN__SHIFT 0x18
+#define AUX_CONTROL__AUX_TEST_MODE_MASK 0x10000000
+#define AUX_CONTROL__AUX_TEST_MODE__SHIFT 0x1c
+#define AUX_CONTROL__AUX_DEGLITCH_EN_MASK 0x20000000
+#define AUX_CONTROL__AUX_DEGLITCH_EN__SHIFT 0x1d
+#define AUX_CONTROL__SPARE_0_MASK 0x40000000
+#define AUX_CONTROL__SPARE_0__SHIFT 0x1e
+#define AUX_CONTROL__SPARE_1_MASK 0x80000000
+#define AUX_CONTROL__SPARE_1__SHIFT 0x1f
+#define AUX_SW_CONTROL__AUX_SW_GO_MASK 0x1
+#define AUX_SW_CONTROL__AUX_SW_GO__SHIFT 0x0
+#define AUX_SW_CONTROL__AUX_LS_READ_TRIG_MASK 0x4
+#define AUX_SW_CONTROL__AUX_LS_READ_TRIG__SHIFT 0x2
+#define AUX_SW_CONTROL__AUX_SW_START_DELAY_MASK 0xf0
+#define AUX_SW_CONTROL__AUX_SW_START_DELAY__SHIFT 0x4
+#define AUX_SW_CONTROL__AUX_SW_WR_BYTES_MASK 0x1f0000
+#define AUX_SW_CONTROL__AUX_SW_WR_BYTES__SHIFT 0x10
+#define AUX_ARB_CONTROL__AUX_ARB_PRIORITY_MASK 0x3
+#define AUX_ARB_CONTROL__AUX_ARB_PRIORITY__SHIFT 0x0
+#define AUX_ARB_CONTROL__AUX_REG_RW_CNTL_STATUS_MASK 0xc
+#define AUX_ARB_CONTROL__AUX_REG_RW_CNTL_STATUS__SHIFT 0x2
+#define AUX_ARB_CONTROL__AUX_NO_QUEUED_SW_GO_MASK 0x100
+#define AUX_ARB_CONTROL__AUX_NO_QUEUED_SW_GO__SHIFT 0x8
+#define AUX_ARB_CONTROL__AUX_NO_QUEUED_LS_GO_MASK 0x400
+#define AUX_ARB_CONTROL__AUX_NO_QUEUED_LS_GO__SHIFT 0xa
+#define AUX_ARB_CONTROL__AUX_SW_USE_AUX_REG_REQ_MASK 0x10000
+#define AUX_ARB_CONTROL__AUX_SW_USE_AUX_REG_REQ__SHIFT 0x10
+#define AUX_ARB_CONTROL__AUX_SW_PENDING_USE_AUX_REG_REQ_MASK 0x10000
+#define AUX_ARB_CONTROL__AUX_SW_PENDING_USE_AUX_REG_REQ__SHIFT 0x10
+#define AUX_ARB_CONTROL__AUX_SW_DONE_USING_AUX_REG_MASK 0x20000
+#define AUX_ARB_CONTROL__AUX_SW_DONE_USING_AUX_REG__SHIFT 0x11
+#define AUX_ARB_CONTROL__AUX_DMCU_USE_AUX_REG_REQ_MASK 0x1000000
+#define AUX_ARB_CONTROL__AUX_DMCU_USE_AUX_REG_REQ__SHIFT 0x18
+#define AUX_ARB_CONTROL__AUX_DMCU_PENDING_USE_AUX_REG_REQ_MASK 0x1000000
+#define AUX_ARB_CONTROL__AUX_DMCU_PENDING_USE_AUX_REG_REQ__SHIFT 0x18
+#define AUX_ARB_CONTROL__AUX_DMCU_DONE_USING_AUX_REG_MASK 0x2000000
+#define AUX_ARB_CONTROL__AUX_DMCU_DONE_USING_AUX_REG__SHIFT 0x19
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_INT_MASK 0x1
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_INT__SHIFT 0x0
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_ACK_MASK 0x2
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_ACK__SHIFT 0x1
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_MASK_MASK 0x4
+#define AUX_INTERRUPT_CONTROL__AUX_SW_DONE_MASK__SHIFT 0x2
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_INT_MASK 0x10
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_INT__SHIFT 0x4
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_ACK_MASK 0x20
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_ACK__SHIFT 0x5
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_MASK_MASK 0x40
+#define AUX_INTERRUPT_CONTROL__AUX_LS_DONE_MASK__SHIFT 0x6
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_INT_MASK 0x100
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_INT__SHIFT 0x8
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_ACK_MASK 0x200
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_ACK__SHIFT 0x9
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_INT_MASK_MASK 0x400
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_LOCK_DONE_INT_MASK__SHIFT 0xa
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_INT_MASK 0x1000
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_INT__SHIFT 0xc
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_ACK_MASK 0x2000
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_ACK__SHIFT 0xd
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_INT_MASK_MASK 0x4000
+#define AUX_INTERRUPT_CONTROL__AUX_GTC_SYNC_ERROR_INT_MASK__SHIFT 0xe
+#define AUX_SW_STATUS__AUX_SW_DONE_MASK 0x1
+#define AUX_SW_STATUS__AUX_SW_DONE__SHIFT 0x0
+#define AUX_SW_STATUS__AUX_SW_REQ_MASK 0x2
+#define AUX_SW_STATUS__AUX_SW_REQ__SHIFT 0x1
+#define AUX_SW_STATUS__AUX_SW_RX_TIMEOUT_STATE_MASK 0x70
+#define AUX_SW_STATUS__AUX_SW_RX_TIMEOUT_STATE__SHIFT 0x4
+#define AUX_SW_STATUS__AUX_SW_RX_TIMEOUT_MASK 0x80
+#define AUX_SW_STATUS__AUX_SW_RX_TIMEOUT__SHIFT 0x7
+#define AUX_SW_STATUS__AUX_SW_RX_OVERFLOW_MASK 0x100
+#define AUX_SW_STATUS__AUX_SW_RX_OVERFLOW__SHIFT 0x8
+#define AUX_SW_STATUS__AUX_SW_HPD_DISCON_MASK 0x200
+#define AUX_SW_STATUS__AUX_SW_HPD_DISCON__SHIFT 0x9
+#define AUX_SW_STATUS__AUX_SW_RX_PARTIAL_BYTE_MASK 0x400
+#define AUX_SW_STATUS__AUX_SW_RX_PARTIAL_BYTE__SHIFT 0xa
+#define AUX_SW_STATUS__AUX_SW_NON_AUX_MODE_MASK 0x800
+#define AUX_SW_STATUS__AUX_SW_NON_AUX_MODE__SHIFT 0xb
+#define AUX_SW_STATUS__AUX_SW_RX_MIN_COUNT_VIOL_MASK 0x1000
+#define AUX_SW_STATUS__AUX_SW_RX_MIN_COUNT_VIOL__SHIFT 0xc
+#define AUX_SW_STATUS__AUX_SW_RX_INVALID_STOP_MASK 0x4000
+#define AUX_SW_STATUS__AUX_SW_RX_INVALID_STOP__SHIFT 0xe
+#define AUX_SW_STATUS__AUX_SW_RX_SYNC_INVALID_L_MASK 0x20000
+#define AUX_SW_STATUS__AUX_SW_RX_SYNC_INVALID_L__SHIFT 0x11
+#define AUX_SW_STATUS__AUX_SW_RX_SYNC_INVALID_H_MASK 0x40000
+#define AUX_SW_STATUS__AUX_SW_RX_SYNC_INVALID_H__SHIFT 0x12
+#define AUX_SW_STATUS__AUX_SW_RX_INVALID_START_MASK 0x80000
+#define AUX_SW_STATUS__AUX_SW_RX_INVALID_START__SHIFT 0x13
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_NO_DET_MASK 0x100000
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_NO_DET__SHIFT 0x14
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_INVALID_H_MASK 0x400000
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_INVALID_H__SHIFT 0x16
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_INVALID_L_MASK 0x800000
+#define AUX_SW_STATUS__AUX_SW_RX_RECV_INVALID_L__SHIFT 0x17
+#define AUX_SW_STATUS__AUX_SW_REPLY_BYTE_COUNT_MASK 0x1f000000
+#define AUX_SW_STATUS__AUX_SW_REPLY_BYTE_COUNT__SHIFT 0x18
+#define AUX_SW_STATUS__AUX_ARB_STATUS_MASK 0xc0000000
+#define AUX_SW_STATUS__AUX_ARB_STATUS__SHIFT 0x1e
+#define AUX_LS_STATUS__AUX_LS_DONE_MASK 0x1
+#define AUX_LS_STATUS__AUX_LS_DONE__SHIFT 0x0
+#define AUX_LS_STATUS__AUX_LS_REQ_MASK 0x2
+#define AUX_LS_STATUS__AUX_LS_REQ__SHIFT 0x1
+#define AUX_LS_STATUS__AUX_LS_RX_TIMEOUT_STATE_MASK 0x70
+#define AUX_LS_STATUS__AUX_LS_RX_TIMEOUT_STATE__SHIFT 0x4
+#define AUX_LS_STATUS__AUX_LS_RX_TIMEOUT_MASK 0x80
+#define AUX_LS_STATUS__AUX_LS_RX_TIMEOUT__SHIFT 0x7
+#define AUX_LS_STATUS__AUX_LS_RX_OVERFLOW_MASK 0x100
+#define AUX_LS_STATUS__AUX_LS_RX_OVERFLOW__SHIFT 0x8
+#define AUX_LS_STATUS__AUX_LS_HPD_DISCON_MASK 0x200
+#define AUX_LS_STATUS__AUX_LS_HPD_DISCON__SHIFT 0x9
+#define AUX_LS_STATUS__AUX_LS_RX_PARTIAL_BYTE_MASK 0x400
+#define AUX_LS_STATUS__AUX_LS_RX_PARTIAL_BYTE__SHIFT 0xa
+#define AUX_LS_STATUS__AUX_LS_NON_AUX_MODE_MASK 0x800
+#define AUX_LS_STATUS__AUX_LS_NON_AUX_MODE__SHIFT 0xb
+#define AUX_LS_STATUS__AUX_LS_RX_MIN_COUNT_VIOL_MASK 0x1000
+#define AUX_LS_STATUS__AUX_LS_RX_MIN_COUNT_VIOL__SHIFT 0xc
+#define AUX_LS_STATUS__AUX_LS_RX_INVALID_STOP_MASK 0x4000
+#define AUX_LS_STATUS__AUX_LS_RX_INVALID_STOP__SHIFT 0xe
+#define AUX_LS_STATUS__AUX_LS_RX_SYNC_INVALID_L_MASK 0x20000
+#define AUX_LS_STATUS__AUX_LS_RX_SYNC_INVALID_L__SHIFT 0x11
+#define AUX_LS_STATUS__AUX_LS_RX_SYNC_INVALID_H_MASK 0x40000
+#define AUX_LS_STATUS__AUX_LS_RX_SYNC_INVALID_H__SHIFT 0x12
+#define AUX_LS_STATUS__AUX_LS_RX_INVALID_START_MASK 0x80000
+#define AUX_LS_STATUS__AUX_LS_RX_INVALID_START__SHIFT 0x13
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_NO_DET_MASK 0x100000
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_NO_DET__SHIFT 0x14
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_INVALID_H_MASK 0x400000
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_INVALID_H__SHIFT 0x16
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_INVALID_L_MASK 0x800000
+#define AUX_LS_STATUS__AUX_LS_RX_RECV_INVALID_L__SHIFT 0x17
+#define AUX_LS_STATUS__AUX_LS_REPLY_BYTE_COUNT_MASK 0x1f000000
+#define AUX_LS_STATUS__AUX_LS_REPLY_BYTE_COUNT__SHIFT 0x18
+#define AUX_LS_STATUS__AUX_LS_CP_IRQ_MASK 0x20000000
+#define AUX_LS_STATUS__AUX_LS_CP_IRQ__SHIFT 0x1d
+#define AUX_LS_STATUS__AUX_LS_UPDATED_MASK 0x40000000
+#define AUX_LS_STATUS__AUX_LS_UPDATED__SHIFT 0x1e
+#define AUX_LS_STATUS__AUX_LS_UPDATED_ACK_MASK 0x80000000
+#define AUX_LS_STATUS__AUX_LS_UPDATED_ACK__SHIFT 0x1f
+#define AUX_SW_DATA__AUX_SW_DATA_RW_MASK 0x1
+#define AUX_SW_DATA__AUX_SW_DATA_RW__SHIFT 0x0
+#define AUX_SW_DATA__AUX_SW_DATA_MASK 0xff00
+#define AUX_SW_DATA__AUX_SW_DATA__SHIFT 0x8
+#define AUX_SW_DATA__AUX_SW_INDEX_MASK 0x1f0000
+#define AUX_SW_DATA__AUX_SW_INDEX__SHIFT 0x10
+#define AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE_MASK 0x80000000
+#define AUX_SW_DATA__AUX_SW_AUTOINCREMENT_DISABLE__SHIFT 0x1f
+#define AUX_LS_DATA__AUX_LS_DATA_MASK 0xff00
+#define AUX_LS_DATA__AUX_LS_DATA__SHIFT 0x8
+#define AUX_LS_DATA__AUX_LS_INDEX_MASK 0x1f0000
+#define AUX_LS_DATA__AUX_LS_INDEX__SHIFT 0x10
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_REF_SEL_MASK 0x1
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_REF_SEL__SHIFT 0x0
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_RATE_MASK 0x30
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_RATE__SHIFT 0x4
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_REF_DIV_MASK 0x1ff0000
+#define AUX_DPHY_TX_REF_CONTROL__AUX_TX_REF_DIV__SHIFT 0x10
+#define AUX_DPHY_TX_CONTROL__AUX_TX_PRECHARGE_LEN_MASK 0x7
+#define AUX_DPHY_TX_CONTROL__AUX_TX_PRECHARGE_LEN__SHIFT 0x0
+#define AUX_DPHY_TX_CONTROL__AUX_TX_PRECHARGE_SYMBOLS_MASK 0x3f00
+#define AUX_DPHY_TX_CONTROL__AUX_TX_PRECHARGE_SYMBOLS__SHIFT 0x8
+#define AUX_DPHY_TX_CONTROL__AUX_MODE_DET_CHECK_DELAY_MASK 0x70000
+#define AUX_DPHY_TX_CONTROL__AUX_MODE_DET_CHECK_DELAY__SHIFT 0x10
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_START_WINDOW_MASK 0x70
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_START_WINDOW__SHIFT 0x4
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_RECEIVE_WINDOW_MASK 0x700
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_RECEIVE_WINDOW__SHIFT 0x8
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_HALF_SYM_DETECT_LEN_MASK 0x3000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_HALF_SYM_DETECT_LEN__SHIFT 0xc
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_TRANSITION_FILTER_EN_MASK 0x10000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_TRANSITION_FILTER_EN__SHIFT 0x10
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT_MASK 0x20000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT__SHIFT 0x11
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_START_MASK 0x40000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_START__SHIFT 0x12
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_STOP_MASK 0x80000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_ALLOW_BELOW_THRESHOLD_STOP__SHIFT 0x13
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_PHASE_DETECT_LEN_MASK 0x300000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_PHASE_DETECT_LEN__SHIFT 0x14
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_TIMEOUT_LEN_MASK 0x7000000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_TIMEOUT_LEN__SHIFT 0x18
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_DETECTION_THRESHOLD_MASK 0x70000000
+#define AUX_DPHY_RX_CONTROL0__AUX_RX_DETECTION_THRESHOLD__SHIFT 0x1c
+#define AUX_DPHY_RX_CONTROL1__AUX_RX_PRECHARGE_SKIP_MASK 0xff
+#define AUX_DPHY_RX_CONTROL1__AUX_RX_PRECHARGE_SKIP__SHIFT 0x0
+#define AUX_DPHY_TX_STATUS__AUX_TX_ACTIVE_MASK 0x1
+#define AUX_DPHY_TX_STATUS__AUX_TX_ACTIVE__SHIFT 0x0
+#define AUX_DPHY_TX_STATUS__AUX_TX_STATE_MASK 0x70
+#define AUX_DPHY_TX_STATUS__AUX_TX_STATE__SHIFT 0x4
+#define AUX_DPHY_TX_STATUS__AUX_TX_HALF_SYM_PERIOD_MASK 0x1ff0000
+#define AUX_DPHY_TX_STATUS__AUX_TX_HALF_SYM_PERIOD__SHIFT 0x10
+#define AUX_DPHY_RX_STATUS__AUX_RX_STATE_MASK 0x7
+#define AUX_DPHY_RX_STATUS__AUX_RX_STATE__SHIFT 0x0
+#define AUX_DPHY_RX_STATUS__AUX_RX_SYNC_VALID_COUNT_MASK 0x1f00
+#define AUX_DPHY_RX_STATUS__AUX_RX_SYNC_VALID_COUNT__SHIFT 0x8
+#define AUX_DPHY_RX_STATUS__AUX_RX_HALF_SYM_PERIOD_FRACT_MASK 0x1f0000
+#define AUX_DPHY_RX_STATUS__AUX_RX_HALF_SYM_PERIOD_FRACT__SHIFT 0x10
+#define AUX_DPHY_RX_STATUS__AUX_RX_HALF_SYM_PERIOD_MASK 0x3fe00000
+#define AUX_DPHY_RX_STATUS__AUX_RX_HALF_SYM_PERIOD__SHIFT 0x15
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_POTENTIAL_ERROR_THRESHOLD_MASK 0x1f
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_POTENTIAL_ERROR_THRESHOLD__SHIFT 0x0
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_DEFINITE_ERROR_THRESHOLD_MASK 0x1f00
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_DEFINITE_ERROR_THRESHOLD__SHIFT 0x8
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_LEN_MASK 0x30000
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_LEN__SHIFT 0x10
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_SYNC_NUM_RETRY_FOR_LOCK_MAINT_MASK 0x300000
+#define AUX_GTC_SYNC_ERROR_CONTROL__AUX_GTC_SYNC_NUM_RETRY_FOR_LOCK_MAINT__SHIFT 0x14
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_COMPLETE_MASK 0x1
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_COMPLETE__SHIFT 0x0
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_LOST_MASK 0x10
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_LOST__SHIFT 0x4
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_OCCURRED_MASK 0x100
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_OCCURRED__SHIFT 0x8
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_STATE_MASK 0x1e00
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_LOCK_ACQ_TIMEOUT_STATE__SHIFT 0x9
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_PHASE_ADJUST_TIME_VIOL_MASK 0x10000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_PHASE_ADJUST_TIME_VIOL__SHIFT 0x10
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CRITICAL_ERR_OCCURRED_MASK 0x100000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CRITICAL_ERR_OCCURRED__SHIFT 0x14
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CRITICAL_ERR_OCCURRED_ACK_MASK 0x200000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CRITICAL_ERR_OCCURRED_ACK__SHIFT 0x15
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_POTENTIAL_ERR_REACHED_MASK 0x400000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_POTENTIAL_ERR_REACHED__SHIFT 0x16
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_POTENTIAL_ERR_REACHED_ACK_MASK 0x800000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_POTENTIAL_ERR_REACHED_ACK__SHIFT 0x17
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_DEFINITE_ERR_REACHED_MASK 0x1000000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_DEFINITE_ERR_REACHED__SHIFT 0x18
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_DEFINITE_ERR_REACHED_ACK_MASK 0x2000000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_MAX_DEFINITE_ERR_REACHED_ACK__SHIFT 0x19
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CTRL_STATE_MASK 0xf0000000
+#define AUX_GTC_SYNC_CONTROLLER_STATUS__AUX_GTC_SYNC_CTRL_STATE__SHIFT 0x1c
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_DONE_MASK 0x1
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_DONE__SHIFT 0x0
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_REQ_MASK 0x2
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_REQ__SHIFT 0x1
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_TIMEOUT_STATE_MASK 0x70
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_TIMEOUT_STATE__SHIFT 0x4
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_TIMEOUT_MASK 0x80
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_TIMEOUT__SHIFT 0x7
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_OVERFLOW_MASK 0x100
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_OVERFLOW__SHIFT 0x8
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_HPD_DISCON_MASK 0x200
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_HPD_DISCON__SHIFT 0x9
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_PARTIAL_BYTE_MASK 0x400
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_PARTIAL_BYTE__SHIFT 0xa
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_NON_AUX_MODE_MASK 0x800
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_NON_AUX_MODE__SHIFT 0xb
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_MIN_COUNT_VIOL_MASK 0x1000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_MIN_COUNT_VIOL__SHIFT 0xc
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_INVALID_STOP_MASK 0x4000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_INVALID_STOP__SHIFT 0xe
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_SYNC_INVALID_L_MASK 0x20000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_SYNC_INVALID_L__SHIFT 0x11
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_SYNC_INVALID_H_MASK 0x40000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_SYNC_INVALID_H__SHIFT 0x12
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_INVALID_START_MASK 0x80000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_INVALID_START__SHIFT 0x13
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_NO_DET_MASK 0x100000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_NO_DET__SHIFT 0x14
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_INVALID_H_MASK 0x400000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_INVALID_H__SHIFT 0x16
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_INVALID_L_MASK 0x800000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_RX_RECV_INVALID_L__SHIFT 0x17
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_REPLY_BYTE_COUNT_MASK 0x1f000000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_REPLY_BYTE_COUNT__SHIFT 0x18
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_NACKED_MASK 0x20000000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_SYNC_NACKED__SHIFT 0x1d
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_MASTER_REQ_BY_RX_MASK 0x40000000
+#define AUX_GTC_SYNC_STATUS__AUX_GTC_MASTER_REQ_BY_RX__SHIFT 0x1e
+#define AUX_TEST_DEBUG_INDEX__AUX_TEST_DEBUG_INDEX_MASK 0xff
+#define AUX_TEST_DEBUG_INDEX__AUX_TEST_DEBUG_INDEX__SHIFT 0x0
+#define AUX_TEST_DEBUG_INDEX__AUX_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define AUX_TEST_DEBUG_INDEX__AUX_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define AUX_TEST_DEBUG_DATA__AUX_TEST_DEBUG_DATA_MASK 0xffffffff
+#define AUX_TEST_DEBUG_DATA__AUX_TEST_DEBUG_DATA__SHIFT 0x0
+#define DP_AUX_DEBUG_A__DP_AUX_DEBUG_A_MASK 0xffffffff
+#define DP_AUX_DEBUG_A__DP_AUX_DEBUG_A__SHIFT 0x0
+#define DP_AUX_DEBUG_B__DP_AUX_DEBUG_B_MASK 0xffffffff
+#define DP_AUX_DEBUG_B__DP_AUX_DEBUG_B__SHIFT 0x0
+#define DP_AUX_DEBUG_C__DP_AUX_DEBUG_C_MASK 0xffffffff
+#define DP_AUX_DEBUG_C__DP_AUX_DEBUG_C__SHIFT 0x0
+#define DP_AUX_DEBUG_D__DP_AUX_DEBUG_D_MASK 0xffffffff
+#define DP_AUX_DEBUG_D__DP_AUX_DEBUG_D__SHIFT 0x0
+#define DP_AUX_DEBUG_E__DP_AUX_DEBUG_E_MASK 0xffffffff
+#define DP_AUX_DEBUG_E__DP_AUX_DEBUG_E__SHIFT 0x0
+#define DP_AUX_DEBUG_F__DP_AUX_DEBUG_F_MASK 0xffffffff
+#define DP_AUX_DEBUG_F__DP_AUX_DEBUG_F__SHIFT 0x0
+#define DP_AUX_DEBUG_G__DP_AUX_DEBUG_G_MASK 0xffffffff
+#define DP_AUX_DEBUG_G__DP_AUX_DEBUG_G__SHIFT 0x0
+#define DP_AUX_DEBUG_H__DP_AUX_DEBUG_H_MASK 0xffffffff
+#define DP_AUX_DEBUG_H__DP_AUX_DEBUG_H__SHIFT 0x0
+#define DP_AUX_DEBUG_I__DP_AUX_DEBUG_I_MASK 0xffffffff
+#define DP_AUX_DEBUG_I__DP_AUX_DEBUG_I__SHIFT 0x0
+#define DP_AUX_DEBUG_J__DP_AUX_DEBUG_J_MASK 0xffffffff
+#define DP_AUX_DEBUG_J__DP_AUX_DEBUG_J__SHIFT 0x0
+#define DP_AUX_DEBUG_K__DP_AUX_DEBUG_K_MASK 0xffffffff
+#define DP_AUX_DEBUG_K__DP_AUX_DEBUG_K__SHIFT 0x0
+#define DP_AUX_DEBUG_L__DP_AUX_DEBUG_L_MASK 0xffffffff
+#define DP_AUX_DEBUG_L__DP_AUX_DEBUG_L__SHIFT 0x0
+#define DP_AUX_DEBUG_M__DP_AUX_DEBUG_M_MASK 0xffffffff
+#define DP_AUX_DEBUG_M__DP_AUX_DEBUG_M__SHIFT 0x0
+#define DP_AUX_DEBUG_N__DP_AUX_DEBUG_N_MASK 0xffffffff
+#define DP_AUX_DEBUG_N__DP_AUX_DEBUG_N__SHIFT 0x0
+#define DP_AUX_DEBUG_O__DP_AUX_DEBUG_O_MASK 0xffffffff
+#define DP_AUX_DEBUG_O__DP_AUX_DEBUG_O__SHIFT 0x0
+#define DP_AUX_DEBUG_P__DP_AUX_DEBUG_P_MASK 0xffffffff
+#define DP_AUX_DEBUG_P__DP_AUX_DEBUG_P__SHIFT 0x0
+#define DP_AUX_DEBUG_Q__DP_AUX_DEBUG_Q_MASK 0xffffffff
+#define DP_AUX_DEBUG_Q__DP_AUX_DEBUG_Q__SHIFT 0x0
+#define DVO_ENABLE__DVO_ENABLE_MASK 0x1
+#define DVO_ENABLE__DVO_ENABLE__SHIFT 0x0
+#define DVO_ENABLE__DVO_PIXEL_WIDTH_MASK 0x30
+#define DVO_ENABLE__DVO_PIXEL_WIDTH__SHIFT 0x4
+#define DVO_SOURCE_SELECT__DVO_SOURCE_SELECT_MASK 0x7
+#define DVO_SOURCE_SELECT__DVO_SOURCE_SELECT__SHIFT 0x0
+#define DVO_SOURCE_SELECT__DVO_STEREOSYNC_SELECT_MASK 0x70000
+#define DVO_SOURCE_SELECT__DVO_STEREOSYNC_SELECT__SHIFT 0x10
+#define DVO_OUTPUT__DVO_OUTPUT_ENABLE_MODE_MASK 0x3
+#define DVO_OUTPUT__DVO_OUTPUT_ENABLE_MODE__SHIFT 0x0
+#define DVO_OUTPUT__DVO_CLOCK_MODE_MASK 0x100
+#define DVO_OUTPUT__DVO_CLOCK_MODE__SHIFT 0x8
+#define DVO_CONTROL__DVO_RATE_SELECT_MASK 0x1
+#define DVO_CONTROL__DVO_RATE_SELECT__SHIFT 0x0
+#define DVO_CONTROL__DVO_SDRCLK_SEL_MASK 0x2
+#define DVO_CONTROL__DVO_SDRCLK_SEL__SHIFT 0x1
+#define DVO_CONTROL__DVO_DVPDATA_WIDTH_MASK 0x30
+#define DVO_CONTROL__DVO_DVPDATA_WIDTH__SHIFT 0x4
+#define DVO_CONTROL__DVO_DUAL_CHANNEL_EN_MASK 0x100
+#define DVO_CONTROL__DVO_DUAL_CHANNEL_EN__SHIFT 0x8
+#define DVO_CONTROL__DVO_RESET_FIFO_MASK 0x10000
+#define DVO_CONTROL__DVO_RESET_FIFO__SHIFT 0x10
+#define DVO_CONTROL__DVO_SYNC_PHASE_MASK 0x20000
+#define DVO_CONTROL__DVO_SYNC_PHASE__SHIFT 0x11
+#define DVO_CONTROL__DVO_INVERT_DVOCLK_MASK 0x40000
+#define DVO_CONTROL__DVO_INVERT_DVOCLK__SHIFT 0x12
+#define DVO_CONTROL__DVO_HSYNC_POLARITY_MASK 0x100000
+#define DVO_CONTROL__DVO_HSYNC_POLARITY__SHIFT 0x14
+#define DVO_CONTROL__DVO_VSYNC_POLARITY_MASK 0x200000
+#define DVO_CONTROL__DVO_VSYNC_POLARITY__SHIFT 0x15
+#define DVO_CONTROL__DVO_DE_POLARITY_MASK 0x400000
+#define DVO_CONTROL__DVO_DE_POLARITY__SHIFT 0x16
+#define DVO_CONTROL__DVO_COLOR_FORMAT_MASK 0x3000000
+#define DVO_CONTROL__DVO_COLOR_FORMAT__SHIFT 0x18
+#define DVO_CONTROL__DVO_CTL3_MASK 0x80000000
+#define DVO_CONTROL__DVO_CTL3__SHIFT 0x1f
+#define DVO_CRC_EN__DVO_CRC2_EN_MASK 0x10000
+#define DVO_CRC_EN__DVO_CRC2_EN__SHIFT 0x10
+#define DVO_CRC2_SIG_MASK__DVO_CRC2_SIG_MASK_MASK 0x7ffffff
+#define DVO_CRC2_SIG_MASK__DVO_CRC2_SIG_MASK__SHIFT 0x0
+#define DVO_CRC2_SIG_RESULT__DVO_CRC2_SIG_RESULT_MASK 0x7ffffff
+#define DVO_CRC2_SIG_RESULT__DVO_CRC2_SIG_RESULT__SHIFT 0x0
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_LEVEL_ERROR_MASK 0x1
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_LEVEL_ERROR__SHIFT 0x0
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_USE_OVERWRITE_LEVEL_MASK 0x2
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_USE_OVERWRITE_LEVEL__SHIFT 0x1
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_OVERWRITE_LEVEL_MASK 0xfc
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_OVERWRITE_LEVEL__SHIFT 0x2
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_ERROR_ACK_MASK 0x100
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_ERROR_ACK__SHIFT 0x8
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_CAL_AVERAGE_LEVEL_MASK 0xfc00
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_CAL_AVERAGE_LEVEL__SHIFT 0xa
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_MAXIMUM_LEVEL_MASK 0xf0000
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_MAXIMUM_LEVEL__SHIFT 0x10
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_MINIMUM_LEVEL_MASK 0x3c00000
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_MINIMUM_LEVEL__SHIFT 0x16
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_CALIBRATED_MASK 0x20000000
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_CALIBRATED__SHIFT 0x1d
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_FORCE_RECAL_AVERAGE_MASK 0x40000000
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_FORCE_RECAL_AVERAGE__SHIFT 0x1e
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_FORCE_RECOMP_MINMAX_MASK 0x80000000
+#define DVO_FIFO_ERROR_STATUS__DVO_FIFO_FORCE_RECOMP_MINMAX__SHIFT 0x1f
+#define DVO_TEST_DEBUG_INDEX__DVO_TEST_DEBUG_INDEX_MASK 0xff
+#define DVO_TEST_DEBUG_INDEX__DVO_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DVO_TEST_DEBUG_INDEX__DVO_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DVO_TEST_DEBUG_INDEX__DVO_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DVO_TEST_DEBUG_DATA__DVO_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DVO_TEST_DEBUG_DATA__DVO_TEST_DEBUG_DATA__SHIFT 0x0
+#define FBC_CNTL__FBC_GRPH_COMP_EN_MASK 0x1
+#define FBC_CNTL__FBC_GRPH_COMP_EN__SHIFT 0x0
+#define FBC_CNTL__FBC_SRC_SEL_MASK 0xe
+#define FBC_CNTL__FBC_SRC_SEL__SHIFT 0x1
+#define FBC_CNTL__FBC_COMP_CLK_GATE_EN_MASK 0x100
+#define FBC_CNTL__FBC_COMP_CLK_GATE_EN__SHIFT 0x8
+#define FBC_CNTL__FBC_DECOMP_CLK_GATE_EN_MASK 0x400
+#define FBC_CNTL__FBC_DECOMP_CLK_GATE_EN__SHIFT 0xa
+#define FBC_CNTL__FBC_COHERENCY_MODE_MASK 0x30000
+#define FBC_CNTL__FBC_COHERENCY_MODE__SHIFT 0x10
+#define FBC_CNTL__FBC_SOFT_COMPRESS_EN_MASK 0x2000000
+#define FBC_CNTL__FBC_SOFT_COMPRESS_EN__SHIFT 0x19
+#define FBC_CNTL__FBC_EN_MASK 0x80000000
+#define FBC_CNTL__FBC_EN__SHIFT 0x1f
+#define FBC_IDLE_FORCE_CLEAR_MASK__FBC_IDLE_FORCE_CLEAR_MASK_MASK 0xffffffff
+#define FBC_IDLE_FORCE_CLEAR_MASK__FBC_IDLE_FORCE_CLEAR_MASK__SHIFT 0x0
+#define FBC_START_STOP_DELAY__FBC_DECOMP_START_DELAY_MASK 0x1f
+#define FBC_START_STOP_DELAY__FBC_DECOMP_START_DELAY__SHIFT 0x0
+#define FBC_START_STOP_DELAY__FBC_DECOMP_STOP_DELAY_MASK 0x80
+#define FBC_START_STOP_DELAY__FBC_DECOMP_STOP_DELAY__SHIFT 0x7
+#define FBC_START_STOP_DELAY__FBC_COMP_START_DELAY_MASK 0x1f00
+#define FBC_START_STOP_DELAY__FBC_COMP_START_DELAY__SHIFT 0x8
+#define FBC_COMP_CNTL__FBC_MIN_COMPRESSION_MASK 0xf
+#define FBC_COMP_CNTL__FBC_MIN_COMPRESSION__SHIFT 0x0
+#define FBC_COMP_CNTL__FBC_DEPTH_MONO08_EN_MASK 0x10000
+#define FBC_COMP_CNTL__FBC_DEPTH_MONO08_EN__SHIFT 0x10
+#define FBC_COMP_CNTL__FBC_DEPTH_MONO16_EN_MASK 0x20000
+#define FBC_COMP_CNTL__FBC_DEPTH_MONO16_EN__SHIFT 0x11
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB04_EN_MASK 0x40000
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB04_EN__SHIFT 0x12
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB08_EN_MASK 0x80000
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB08_EN__SHIFT 0x13
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB16_EN_MASK 0x100000
+#define FBC_COMP_CNTL__FBC_DEPTH_RGB16_EN__SHIFT 0x14
+#define FBC_COMP_MODE__FBC_RLE_EN_MASK 0x1
+#define FBC_COMP_MODE__FBC_RLE_EN__SHIFT 0x0
+#define FBC_COMP_MODE__FBC_DPCM4_RGB_EN_MASK 0x100
+#define FBC_COMP_MODE__FBC_DPCM4_RGB_EN__SHIFT 0x8
+#define FBC_COMP_MODE__FBC_DPCM8_RGB_EN_MASK 0x200
+#define FBC_COMP_MODE__FBC_DPCM8_RGB_EN__SHIFT 0x9
+#define FBC_COMP_MODE__FBC_DPCM4_YUV_EN_MASK 0x400
+#define FBC_COMP_MODE__FBC_DPCM4_YUV_EN__SHIFT 0xa
+#define FBC_COMP_MODE__FBC_DPCM8_YUV_EN_MASK 0x800
+#define FBC_COMP_MODE__FBC_DPCM8_YUV_EN__SHIFT 0xb
+#define FBC_COMP_MODE__FBC_IND_EN_MASK 0x10000
+#define FBC_COMP_MODE__FBC_IND_EN__SHIFT 0x10
+#define FBC_DEBUG0__FBC_PERF_MUX0_MASK 0xff
+#define FBC_DEBUG0__FBC_PERF_MUX0__SHIFT 0x0
+#define FBC_DEBUG0__FBC_PERF_MUX1_MASK 0xff00
+#define FBC_DEBUG0__FBC_PERF_MUX1__SHIFT 0x8
+#define FBC_DEBUG0__FBC_COMP_WAKE_DIS_MASK 0x10000
+#define FBC_DEBUG0__FBC_COMP_WAKE_DIS__SHIFT 0x10
+#define FBC_DEBUG0__FBC_DEBUG0_MASK 0xfe0000
+#define FBC_DEBUG0__FBC_DEBUG0__SHIFT 0x11
+#define FBC_DEBUG0__FBC_DEBUG_MUX_MASK 0xff000000
+#define FBC_DEBUG0__FBC_DEBUG_MUX__SHIFT 0x18
+#define FBC_DEBUG1__FBC_DEBUG1_MASK 0xffffffff
+#define FBC_DEBUG1__FBC_DEBUG1__SHIFT 0x0
+#define FBC_DEBUG2__FBC_DEBUG2_MASK 0xffffffff
+#define FBC_DEBUG2__FBC_DEBUG2__SHIFT 0x0
+#define FBC_IND_LUT0__FBC_IND_LUT0_MASK 0xffffffff
+#define FBC_IND_LUT0__FBC_IND_LUT0__SHIFT 0x0
+#define FBC_IND_LUT1__FBC_IND_LUT1_MASK 0xffffffff
+#define FBC_IND_LUT1__FBC_IND_LUT1__SHIFT 0x0
+#define FBC_IND_LUT2__FBC_IND_LUT2_MASK 0xffffffff
+#define FBC_IND_LUT2__FBC_IND_LUT2__SHIFT 0x0
+#define FBC_IND_LUT3__FBC_IND_LUT3_MASK 0xffffffff
+#define FBC_IND_LUT3__FBC_IND_LUT3__SHIFT 0x0
+#define FBC_IND_LUT4__FBC_IND_LUT4_MASK 0xffffffff
+#define FBC_IND_LUT4__FBC_IND_LUT4__SHIFT 0x0
+#define FBC_IND_LUT5__FBC_IND_LUT5_MASK 0xffffffff
+#define FBC_IND_LUT5__FBC_IND_LUT5__SHIFT 0x0
+#define FBC_IND_LUT6__FBC_IND_LUT6_MASK 0xffffffff
+#define FBC_IND_LUT6__FBC_IND_LUT6__SHIFT 0x0
+#define FBC_IND_LUT7__FBC_IND_LUT7_MASK 0xffffffff
+#define FBC_IND_LUT7__FBC_IND_LUT7__SHIFT 0x0
+#define FBC_IND_LUT8__FBC_IND_LUT8_MASK 0xffffffff
+#define FBC_IND_LUT8__FBC_IND_LUT8__SHIFT 0x0
+#define FBC_IND_LUT9__FBC_IND_LUT9_MASK 0xffffffff
+#define FBC_IND_LUT9__FBC_IND_LUT9__SHIFT 0x0
+#define FBC_IND_LUT10__FBC_IND_LUT10_MASK 0xffffffff
+#define FBC_IND_LUT10__FBC_IND_LUT10__SHIFT 0x0
+#define FBC_IND_LUT11__FBC_IND_LUT11_MASK 0xffffffff
+#define FBC_IND_LUT11__FBC_IND_LUT11__SHIFT 0x0
+#define FBC_IND_LUT12__FBC_IND_LUT12_MASK 0xffffffff
+#define FBC_IND_LUT12__FBC_IND_LUT12__SHIFT 0x0
+#define FBC_IND_LUT13__FBC_IND_LUT13_MASK 0xffffffff
+#define FBC_IND_LUT13__FBC_IND_LUT13__SHIFT 0x0
+#define FBC_IND_LUT14__FBC_IND_LUT14_MASK 0xffffffff
+#define FBC_IND_LUT14__FBC_IND_LUT14__SHIFT 0x0
+#define FBC_IND_LUT15__FBC_IND_LUT15_MASK 0xffffffff
+#define FBC_IND_LUT15__FBC_IND_LUT15__SHIFT 0x0
+#define FBC_CSM_REGION_OFFSET_01__FBC_CSM_REGION_OFFSET_0_MASK 0xfff
+#define FBC_CSM_REGION_OFFSET_01__FBC_CSM_REGION_OFFSET_0__SHIFT 0x0
+#define FBC_CSM_REGION_OFFSET_01__FBC_CSM_REGION_OFFSET_1_MASK 0xfff0000
+#define FBC_CSM_REGION_OFFSET_01__FBC_CSM_REGION_OFFSET_1__SHIFT 0x10
+#define FBC_CSM_REGION_OFFSET_23__FBC_CSM_REGION_OFFSET_2_MASK 0xfff
+#define FBC_CSM_REGION_OFFSET_23__FBC_CSM_REGION_OFFSET_2__SHIFT 0x0
+#define FBC_CSM_REGION_OFFSET_23__FBC_CSM_REGION_OFFSET_3_MASK 0xfff0000
+#define FBC_CSM_REGION_OFFSET_23__FBC_CSM_REGION_OFFSET_3__SHIFT 0x10
+#define FBC_CLIENT_REGION_MASK__FBC_MEMORY_REGION_MASK_MASK 0xf0000
+#define FBC_CLIENT_REGION_MASK__FBC_MEMORY_REGION_MASK__SHIFT 0x10
+#define FBC_DEBUG_COMP__FBC_COMP_SWAP_MASK 0x3
+#define FBC_DEBUG_COMP__FBC_COMP_SWAP__SHIFT 0x0
+#define FBC_DEBUG_COMP__FBC_COMP_RSIZE_MASK 0x8
+#define FBC_DEBUG_COMP__FBC_COMP_RSIZE__SHIFT 0x3
+#define FBC_DEBUG_COMP__FBC_COMP_BUSY_HYSTERESIS_MASK 0xf0
+#define FBC_DEBUG_COMP__FBC_COMP_BUSY_HYSTERESIS__SHIFT 0x4
+#define FBC_DEBUG_COMP__FBC_COMP_CLK_CNTL_MASK 0x300
+#define FBC_DEBUG_COMP__FBC_COMP_CLK_CNTL__SHIFT 0x8
+#define FBC_DEBUG_COMP__FBC_COMP_PRIVILEGED_ACCESS_ENABLE_MASK 0x400
+#define FBC_DEBUG_COMP__FBC_COMP_PRIVILEGED_ACCESS_ENABLE__SHIFT 0xa
+#define FBC_DEBUG_COMP__FBC_COMP_ADDRESS_TRANSLATION_ENABLE_MASK 0x800
+#define FBC_DEBUG_COMP__FBC_COMP_ADDRESS_TRANSLATION_ENABLE__SHIFT 0xb
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_ADDR_MASK 0xfff
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_ADDR__SHIFT 0x0
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_WR_DATA_MASK 0x10000
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_WR_DATA__SHIFT 0x10
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_RD_DATA_MASK 0x20000
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_RD_DATA__SHIFT 0x11
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_EN_MASK 0x80000000
+#define FBC_DEBUG_CSR__FBC_DEBUG_CSR_EN__SHIFT 0x1f
+#define FBC_DEBUG_CSR_RDATA__FBC_DEBUG_CSR_RDATA_MASK 0xffffffff
+#define FBC_DEBUG_CSR_RDATA__FBC_DEBUG_CSR_RDATA__SHIFT 0x0
+#define FBC_DEBUG_CSR_WDATA__FBC_DEBUG_CSR_WDATA_MASK 0xffffffff
+#define FBC_DEBUG_CSR_WDATA__FBC_DEBUG_CSR_WDATA__SHIFT 0x0
+#define FBC_DEBUG_CSR_RDATA_HI__FBC_DEBUG_CSR_RDATA_HI_MASK 0xff
+#define FBC_DEBUG_CSR_RDATA_HI__FBC_DEBUG_CSR_RDATA_HI__SHIFT 0x0
+#define FBC_DEBUG_CSR_WDATA_HI__FBC_DEBUG_CSR_WDATA_HI_MASK 0xff
+#define FBC_DEBUG_CSR_WDATA_HI__FBC_DEBUG_CSR_WDATA_HI__SHIFT 0x0
+#define FBC_MISC__FBC_DECOMPRESS_ERROR_MASK 0x3
+#define FBC_MISC__FBC_DECOMPRESS_ERROR__SHIFT 0x0
+#define FBC_MISC__FBC_STOP_ON_ERROR_MASK 0x4
+#define FBC_MISC__FBC_STOP_ON_ERROR__SHIFT 0x2
+#define FBC_MISC__FBC_INVALIDATE_ON_ERROR_MASK 0x8
+#define FBC_MISC__FBC_INVALIDATE_ON_ERROR__SHIFT 0x3
+#define FBC_MISC__FBC_ERROR_PIXEL_MASK 0xf0
+#define FBC_MISC__FBC_ERROR_PIXEL__SHIFT 0x4
+#define FBC_MISC__FBC_DIVIDE_X_MASK 0x300
+#define FBC_MISC__FBC_DIVIDE_X__SHIFT 0x8
+#define FBC_MISC__FBC_DIVIDE_Y_MASK 0x400
+#define FBC_MISC__FBC_DIVIDE_Y__SHIFT 0xa
+#define FBC_MISC__FBC_RSM_WRITE_VALUE_MASK 0x800
+#define FBC_MISC__FBC_RSM_WRITE_VALUE__SHIFT 0xb
+#define FBC_MISC__FBC_RSM_UNCOMP_DATA_IMMEDIATELY_MASK 0x1000
+#define FBC_MISC__FBC_RSM_UNCOMP_DATA_IMMEDIATELY__SHIFT 0xc
+#define FBC_MISC__FBC_STOP_ON_HFLIP_EVENT_MASK 0x2000
+#define FBC_MISC__FBC_STOP_ON_HFLIP_EVENT__SHIFT 0xd
+#define FBC_MISC__FBC_DECOMPRESS_ERROR_CLEAR_MASK 0x10000
+#define FBC_MISC__FBC_DECOMPRESS_ERROR_CLEAR__SHIFT 0x10
+#define FBC_MISC__FBC_RESET_AT_ENABLE_MASK 0x100000
+#define FBC_MISC__FBC_RESET_AT_ENABLE__SHIFT 0x14
+#define FBC_MISC__FBC_RESET_AT_DISABLE_MASK 0x200000
+#define FBC_MISC__FBC_RESET_AT_DISABLE__SHIFT 0x15
+#define FBC_MISC__FBC_SLOW_REQ_INTERVAL_MASK 0x1f000000
+#define FBC_MISC__FBC_SLOW_REQ_INTERVAL__SHIFT 0x18
+#define FBC_MISC__FBC_FORCE_DECOMPRESSOR_EN_MASK 0x80000000
+#define FBC_MISC__FBC_FORCE_DECOMPRESSOR_EN__SHIFT 0x1f
+#define FBC_STATUS__FBC_ENABLE_STATUS_MASK 0x1
+#define FBC_STATUS__FBC_ENABLE_STATUS__SHIFT 0x0
+#define FBC_ALPHA_CNTL__FBC_ALPHA_COMP_EN_MASK 0x1
+#define FBC_ALPHA_CNTL__FBC_ALPHA_COMP_EN__SHIFT 0x0
+#define FBC_ALPHA_CNTL__FBC_FORCE_COPY_TO_COMP_BUF_MASK 0x10
+#define FBC_ALPHA_CNTL__FBC_FORCE_COPY_TO_COMP_BUF__SHIFT 0x4
+#define FBC_ALPHA_CNTL__FBC_ZERO_ALPHA_CHUNK_SKIP_EN_MASK 0x100
+#define FBC_ALPHA_CNTL__FBC_ZERO_ALPHA_CHUNK_SKIP_EN__SHIFT 0x8
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_R_VAL_MASK 0xff
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_R_VAL__SHIFT 0x0
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_G_VAL_MASK 0xff000
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_G_VAL__SHIFT 0xc
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_B_VAL_MASK 0xff000000
+#define FBC_ALPHA_RGB_OVERRIDE__FBC_ZERO_ALPHA_B_VAL__SHIFT 0x18
+#define FBC_TEST_DEBUG_INDEX__FBC_TEST_DEBUG_INDEX_MASK 0xff
+#define FBC_TEST_DEBUG_INDEX__FBC_TEST_DEBUG_INDEX__SHIFT 0x0
+#define FBC_TEST_DEBUG_INDEX__FBC_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define FBC_TEST_DEBUG_INDEX__FBC_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define FBC_TEST_DEBUG_DATA__FBC_TEST_DEBUG_DATA_MASK 0xffffffff
+#define FBC_TEST_DEBUG_DATA__FBC_TEST_DEBUG_DATA__SHIFT 0x0
+#define FMT_CLAMP_COMPONENT_R__FMT_CLAMP_LOWER_R_MASK 0xffff
+#define FMT_CLAMP_COMPONENT_R__FMT_CLAMP_LOWER_R__SHIFT 0x0
+#define FMT_CLAMP_COMPONENT_R__FMT_CLAMP_UPPER_R_MASK 0xffff0000
+#define FMT_CLAMP_COMPONENT_R__FMT_CLAMP_UPPER_R__SHIFT 0x10
+#define FMT_CLAMP_COMPONENT_G__FMT_CLAMP_LOWER_G_MASK 0xffff
+#define FMT_CLAMP_COMPONENT_G__FMT_CLAMP_LOWER_G__SHIFT 0x0
+#define FMT_CLAMP_COMPONENT_G__FMT_CLAMP_UPPER_G_MASK 0xffff0000
+#define FMT_CLAMP_COMPONENT_G__FMT_CLAMP_UPPER_G__SHIFT 0x10
+#define FMT_CLAMP_COMPONENT_B__FMT_CLAMP_LOWER_B_MASK 0xffff
+#define FMT_CLAMP_COMPONENT_B__FMT_CLAMP_LOWER_B__SHIFT 0x0
+#define FMT_CLAMP_COMPONENT_B__FMT_CLAMP_UPPER_B_MASK 0xffff0000
+#define FMT_CLAMP_COMPONENT_B__FMT_CLAMP_UPPER_B__SHIFT 0x10
+#define FMT_DYNAMIC_EXP_CNTL__FMT_DYNAMIC_EXP_EN_MASK 0x1
+#define FMT_DYNAMIC_EXP_CNTL__FMT_DYNAMIC_EXP_EN__SHIFT 0x0
+#define FMT_DYNAMIC_EXP_CNTL__FMT_DYNAMIC_EXP_MODE_MASK 0x10
+#define FMT_DYNAMIC_EXP_CNTL__FMT_DYNAMIC_EXP_MODE__SHIFT 0x4
+#define FMT_CONTROL__FMT_STEREOSYNC_OVERRIDE_MASK 0x1
+#define FMT_CONTROL__FMT_STEREOSYNC_OVERRIDE__SHIFT 0x0
+#define FMT_CONTROL__FMT_STEREOSYNC_OVR_POL_MASK 0x10
+#define FMT_CONTROL__FMT_STEREOSYNC_OVR_POL__SHIFT 0x4
+#define FMT_CONTROL__FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX_MASK 0xf00
+#define FMT_CONTROL__FMT_SPATIAL_DITHER_FRAME_COUNTER_MAX__SHIFT 0x8
+#define FMT_CONTROL__FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP_MASK 0x3000
+#define FMT_CONTROL__FMT_SPATIAL_DITHER_FRAME_COUNTER_BIT_SWAP__SHIFT 0xc
+#define FMT_CONTROL__FMT_PIXEL_ENCODING_MASK 0x30000
+#define FMT_CONTROL__FMT_PIXEL_ENCODING__SHIFT 0x10
+#define FMT_CONTROL__FMT_SUBSAMPLING_MODE_MASK 0xc0000
+#define FMT_CONTROL__FMT_SUBSAMPLING_MODE__SHIFT 0x12
+#define FMT_CONTROL__FMT_SUBSAMPLING_ORDER_MASK 0x100000
+#define FMT_CONTROL__FMT_SUBSAMPLING_ORDER__SHIFT 0x14
+#define FMT_CONTROL__FMT_CBCR_BIT_REDUCTION_BYPASS_MASK 0x200000
+#define FMT_CONTROL__FMT_CBCR_BIT_REDUCTION_BYPASS__SHIFT 0x15
+#define FMT_CONTROL__FMT_SRC_SELECT_MASK 0x7000000
+#define FMT_CONTROL__FMT_SRC_SELECT__SHIFT 0x18
+#define FMT_CONTROL__FMT_420_PIXEL_PHASE_LOCKED_MASK 0x40000000
+#define FMT_CONTROL__FMT_420_PIXEL_PHASE_LOCKED__SHIFT 0x1e
+#define FMT_CONTROL__FMT_420_PIXEL_PHASE_LOCKED_CLEAR_MASK 0x80000000
+#define FMT_CONTROL__FMT_420_PIXEL_PHASE_LOCKED_CLEAR__SHIFT 0x1f
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_EN_MASK 0x1
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_EN__SHIFT 0x0
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_MODE_MASK 0x2
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_MODE__SHIFT 0x1
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_DEPTH_MASK 0x30
+#define FMT_BIT_DEPTH_CONTROL__FMT_TRUNCATE_DEPTH__SHIFT 0x4
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_EN_MASK 0x100
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_EN__SHIFT 0x8
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_MODE_MASK 0x600
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_MODE__SHIFT 0x9
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_DEPTH_MASK 0x1800
+#define FMT_BIT_DEPTH_CONTROL__FMT_SPATIAL_DITHER_DEPTH__SHIFT 0xb
+#define FMT_BIT_DEPTH_CONTROL__FMT_FRAME_RANDOM_ENABLE_MASK 0x2000
+#define FMT_BIT_DEPTH_CONTROL__FMT_FRAME_RANDOM_ENABLE__SHIFT 0xd
+#define FMT_BIT_DEPTH_CONTROL__FMT_RGB_RANDOM_ENABLE_MASK 0x4000
+#define FMT_BIT_DEPTH_CONTROL__FMT_RGB_RANDOM_ENABLE__SHIFT 0xe
+#define FMT_BIT_DEPTH_CONTROL__FMT_HIGHPASS_RANDOM_ENABLE_MASK 0x8000
+#define FMT_BIT_DEPTH_CONTROL__FMT_HIGHPASS_RANDOM_ENABLE__SHIFT 0xf
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_EN_MASK 0x10000
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_EN__SHIFT 0x10
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_DEPTH_MASK 0x60000
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_DEPTH__SHIFT 0x11
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_OFFSET_MASK 0x600000
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_OFFSET__SHIFT 0x15
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_LEVEL_MASK 0x1000000
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_LEVEL__SHIFT 0x18
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_RESET_MASK 0x2000000
+#define FMT_BIT_DEPTH_CONTROL__FMT_TEMPORAL_DITHER_RESET__SHIFT 0x19
+#define FMT_BIT_DEPTH_CONTROL__FMT_25FRC_SEL_MASK 0xc000000
+#define FMT_BIT_DEPTH_CONTROL__FMT_25FRC_SEL__SHIFT 0x1a
+#define FMT_BIT_DEPTH_CONTROL__FMT_50FRC_SEL_MASK 0x30000000
+#define FMT_BIT_DEPTH_CONTROL__FMT_50FRC_SEL__SHIFT 0x1c
+#define FMT_BIT_DEPTH_CONTROL__FMT_75FRC_SEL_MASK 0xc0000000
+#define FMT_BIT_DEPTH_CONTROL__FMT_75FRC_SEL__SHIFT 0x1e
+#define FMT_DITHER_RAND_R_SEED__FMT_RAND_R_SEED_MASK 0xff
+#define FMT_DITHER_RAND_R_SEED__FMT_RAND_R_SEED__SHIFT 0x0
+#define FMT_DITHER_RAND_R_SEED__FMT_OFFSET_R_CR_MASK 0xffff0000
+#define FMT_DITHER_RAND_R_SEED__FMT_OFFSET_R_CR__SHIFT 0x10
+#define FMT_DITHER_RAND_G_SEED__FMT_RAND_G_SEED_MASK 0xff
+#define FMT_DITHER_RAND_G_SEED__FMT_RAND_G_SEED__SHIFT 0x0
+#define FMT_DITHER_RAND_G_SEED__FMT_OFFSET_G_Y_MASK 0xffff0000
+#define FMT_DITHER_RAND_G_SEED__FMT_OFFSET_G_Y__SHIFT 0x10
+#define FMT_DITHER_RAND_B_SEED__FMT_RAND_B_SEED_MASK 0xff
+#define FMT_DITHER_RAND_B_SEED__FMT_RAND_B_SEED__SHIFT 0x0
+#define FMT_DITHER_RAND_B_SEED__FMT_OFFSET_B_CB_MASK 0xffff0000
+#define FMT_DITHER_RAND_B_SEED__FMT_OFFSET_B_CB__SHIFT 0x10
+#define FMT_CLAMP_CNTL__FMT_CLAMP_DATA_EN_MASK 0x1
+#define FMT_CLAMP_CNTL__FMT_CLAMP_DATA_EN__SHIFT 0x0
+#define FMT_CLAMP_CNTL__FMT_CLAMP_COLOR_FORMAT_MASK 0x70000
+#define FMT_CLAMP_CNTL__FMT_CLAMP_COLOR_FORMAT__SHIFT 0x10
+#define FMT_CRC_CNTL__FMT_CRC_EN_MASK 0x1
+#define FMT_CRC_CNTL__FMT_CRC_EN__SHIFT 0x0
+#define FMT_CRC_CNTL__FMT_DTMTEST_CRC_EN_MASK 0x2
+#define FMT_CRC_CNTL__FMT_DTMTEST_CRC_EN__SHIFT 0x1
+#define FMT_CRC_CNTL__FMT_CRC_CONT_EN_MASK 0x10
+#define FMT_CRC_CNTL__FMT_CRC_CONT_EN__SHIFT 0x4
+#define FMT_CRC_CNTL__FMT_ONE_SHOT_CRC_PENDING_MASK 0x20
+#define FMT_CRC_CNTL__FMT_ONE_SHOT_CRC_PENDING__SHIFT 0x5
+#define FMT_CRC_CNTL__FMT_CRC_INCLUDE_OVERSCAN_MASK 0x40
+#define FMT_CRC_CNTL__FMT_CRC_INCLUDE_OVERSCAN__SHIFT 0x6
+#define FMT_CRC_CNTL__FMT_CRC_ONLY_BLANKB_MASK 0x100
+#define FMT_CRC_CNTL__FMT_CRC_ONLY_BLANKB__SHIFT 0x8
+#define FMT_CRC_CNTL__FMT_CRC_PSR_MODE_ENABLE_MASK 0x200
+#define FMT_CRC_CNTL__FMT_CRC_PSR_MODE_ENABLE__SHIFT 0x9
+#define FMT_CRC_CNTL__FMT_CRC_INTERLACE_MODE_MASK 0x3000
+#define FMT_CRC_CNTL__FMT_CRC_INTERLACE_MODE__SHIFT 0xc
+#define FMT_CRC_CNTL__FMT_CRC_USE_NEW_AND_REPEATED_PIXELS_MASK 0x10000
+#define FMT_CRC_CNTL__FMT_CRC_USE_NEW_AND_REPEATED_PIXELS__SHIFT 0x10
+#define FMT_CRC_CNTL__FMT_CRC_EVEN_ODD_PIX_ENABLE_MASK 0x100000
+#define FMT_CRC_CNTL__FMT_CRC_EVEN_ODD_PIX_ENABLE__SHIFT 0x14
+#define FMT_CRC_CNTL__FMT_CRC_EVEN_ODD_PIX_SELECT_MASK 0x1000000
+#define FMT_CRC_CNTL__FMT_CRC_EVEN_ODD_PIX_SELECT__SHIFT 0x18
+#define FMT_CRC_SIG_RED_GREEN_MASK__FMT_CRC_SIG_RED_MASK_MASK 0xffff
+#define FMT_CRC_SIG_RED_GREEN_MASK__FMT_CRC_SIG_RED_MASK__SHIFT 0x0
+#define FMT_CRC_SIG_RED_GREEN_MASK__FMT_CRC_SIG_GREEN_MASK_MASK 0xffff0000
+#define FMT_CRC_SIG_RED_GREEN_MASK__FMT_CRC_SIG_GREEN_MASK__SHIFT 0x10
+#define FMT_CRC_SIG_BLUE_CONTROL_MASK__FMT_CRC_SIG_BLUE_MASK_MASK 0xffff
+#define FMT_CRC_SIG_BLUE_CONTROL_MASK__FMT_CRC_SIG_BLUE_MASK__SHIFT 0x0
+#define FMT_CRC_SIG_BLUE_CONTROL_MASK__FMT_CRC_SIG_CONTROL_MASK_MASK 0xffff0000
+#define FMT_CRC_SIG_BLUE_CONTROL_MASK__FMT_CRC_SIG_CONTROL_MASK__SHIFT 0x10
+#define FMT_CRC_SIG_RED_GREEN__FMT_CRC_SIG_RED_MASK 0xffff
+#define FMT_CRC_SIG_RED_GREEN__FMT_CRC_SIG_RED__SHIFT 0x0
+#define FMT_CRC_SIG_RED_GREEN__FMT_CRC_SIG_GREEN_MASK 0xffff0000
+#define FMT_CRC_SIG_RED_GREEN__FMT_CRC_SIG_GREEN__SHIFT 0x10
+#define FMT_CRC_SIG_BLUE_CONTROL__FMT_CRC_SIG_BLUE_MASK 0xffff
+#define FMT_CRC_SIG_BLUE_CONTROL__FMT_CRC_SIG_BLUE__SHIFT 0x0
+#define FMT_CRC_SIG_BLUE_CONTROL__FMT_CRC_SIG_CONTROL_MASK 0xffff0000
+#define FMT_CRC_SIG_BLUE_CONTROL__FMT_CRC_SIG_CONTROL__SHIFT 0x10
+#define FMT_DEBUG_CNTL__FMT_DEBUG_COLOR_SELECT_MASK 0x3
+#define FMT_DEBUG_CNTL__FMT_DEBUG_COLOR_SELECT__SHIFT 0x0
+#define FMT_SIDE_BY_SIDE_STEREO_CONTROL__FMT_SIDE_BY_SIDE_STEREO_ACTIVE_WIDTH_MASK 0x1fff
+#define FMT_SIDE_BY_SIDE_STEREO_CONTROL__FMT_SIDE_BY_SIDE_STEREO_ACTIVE_WIDTH__SHIFT 0x0
+#define FMT_420_HBLANK_EARLY_START__FMT_420_HBLANK_EARLY_START_MASK 0xfff
+#define FMT_420_HBLANK_EARLY_START__FMT_420_HBLANK_EARLY_START__SHIFT 0x0
+#define FMT_TEST_DEBUG_INDEX__FMT_TEST_DEBUG_INDEX_MASK 0xff
+#define FMT_TEST_DEBUG_INDEX__FMT_TEST_DEBUG_INDEX__SHIFT 0x0
+#define FMT_TEST_DEBUG_INDEX__FMT_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define FMT_TEST_DEBUG_INDEX__FMT_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define FMT_TEST_DEBUG_DATA__FMT_TEST_DEBUG_DATA_MASK 0xffffffff
+#define FMT_TEST_DEBUG_DATA__FMT_TEST_DEBUG_DATA__SHIFT 0x0
+#define FMT_DEBUG0__FMT_DEBUG0_MASK 0xffffffff
+#define FMT_DEBUG0__FMT_DEBUG0__SHIFT 0x0
+#define FMT_DEBUG1__FMT_DEBUG1_MASK 0xffffffff
+#define FMT_DEBUG1__FMT_DEBUG1__SHIFT 0x0
+#define FMT_DEBUG2__FMT_DEBUG2_MASK 0xffffffff
+#define FMT_DEBUG2__FMT_DEBUG2__SHIFT 0x0
+#define FMT_DEBUG3__FMT_DEBUG3_MASK 0xffffffff
+#define FMT_DEBUG3__FMT_DEBUG3__SHIFT 0x0
+#define FMT_DEBUG_ID__FMT_DEBUG_ID_MASK 0xffffffff
+#define FMT_DEBUG_ID__FMT_DEBUG_ID__SHIFT 0x0
+#define LB_DATA_FORMAT__PIXEL_DEPTH_MASK 0x3
+#define LB_DATA_FORMAT__PIXEL_DEPTH__SHIFT 0x0
+#define LB_DATA_FORMAT__PIXEL_EXPAN_MODE_MASK 0x4
+#define LB_DATA_FORMAT__PIXEL_EXPAN_MODE__SHIFT 0x2
+#define LB_DATA_FORMAT__INTERLEAVE_EN_MASK 0x8
+#define LB_DATA_FORMAT__INTERLEAVE_EN__SHIFT 0x3
+#define LB_DATA_FORMAT__PIXEL_REDUCE_MODE_MASK 0x10
+#define LB_DATA_FORMAT__PIXEL_REDUCE_MODE__SHIFT 0x4
+#define LB_DATA_FORMAT__DYNAMIC_PIXEL_DEPTH_MASK 0x20
+#define LB_DATA_FORMAT__DYNAMIC_PIXEL_DEPTH__SHIFT 0x5
+#define LB_DATA_FORMAT__PREFILL_EN_MASK 0x100
+#define LB_DATA_FORMAT__PREFILL_EN__SHIFT 0x8
+#define LB_DATA_FORMAT__PREFETCH_MASK 0x1000
+#define LB_DATA_FORMAT__PREFETCH__SHIFT 0xc
+#define LB_DATA_FORMAT__REQUEST_MODE_MASK 0x1000000
+#define LB_DATA_FORMAT__REQUEST_MODE__SHIFT 0x18
+#define LB_DATA_FORMAT__ALPHA_EN_MASK 0x80000000
+#define LB_DATA_FORMAT__ALPHA_EN__SHIFT 0x1f
+#define LB_MEMORY_CTRL__LB_MEMORY_SIZE_MASK 0x1fff
+#define LB_MEMORY_CTRL__LB_MEMORY_SIZE__SHIFT 0x0
+#define LB_MEMORY_CTRL__LB_NUM_PARTITIONS_MASK 0xf0000
+#define LB_MEMORY_CTRL__LB_NUM_PARTITIONS__SHIFT 0x10
+#define LB_MEMORY_CTRL__LB_MEMORY_CONFIG_MASK 0x300000
+#define LB_MEMORY_CTRL__LB_MEMORY_CONFIG__SHIFT 0x14
+#define LB_MEMORY_SIZE_STATUS__LB_MEMORY_SIZE_STATUS_MASK 0x1fff
+#define LB_MEMORY_SIZE_STATUS__LB_MEMORY_SIZE_STATUS__SHIFT 0x0
+#define LB_DESKTOP_HEIGHT__DESKTOP_HEIGHT_MASK 0x7fff
+#define LB_DESKTOP_HEIGHT__DESKTOP_HEIGHT__SHIFT 0x0
+#define LB_VLINE_START_END__VLINE_START_MASK 0x3fff
+#define LB_VLINE_START_END__VLINE_START__SHIFT 0x0
+#define LB_VLINE_START_END__VLINE_END_MASK 0x7fff0000
+#define LB_VLINE_START_END__VLINE_END__SHIFT 0x10
+#define LB_VLINE_START_END__VLINE_INV_MASK 0x80000000
+#define LB_VLINE_START_END__VLINE_INV__SHIFT 0x1f
+#define LB_VLINE2_START_END__VLINE2_START_MASK 0x3fff
+#define LB_VLINE2_START_END__VLINE2_START__SHIFT 0x0
+#define LB_VLINE2_START_END__VLINE2_END_MASK 0x7fff0000
+#define LB_VLINE2_START_END__VLINE2_END__SHIFT 0x10
+#define LB_VLINE2_START_END__VLINE2_INV_MASK 0x80000000
+#define LB_VLINE2_START_END__VLINE2_INV__SHIFT 0x1f
+#define LB_V_COUNTER__V_COUNTER_MASK 0x7fff
+#define LB_V_COUNTER__V_COUNTER__SHIFT 0x0
+#define LB_SNAPSHOT_V_COUNTER__SNAPSHOT_V_COUNTER_MASK 0x7fff
+#define LB_SNAPSHOT_V_COUNTER__SNAPSHOT_V_COUNTER__SHIFT 0x0
+#define LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK 0x1
+#define LB_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK__SHIFT 0x0
+#define LB_INTERRUPT_MASK__VLINE_INTERRUPT_MASK_MASK 0x10
+#define LB_INTERRUPT_MASK__VLINE_INTERRUPT_MASK__SHIFT 0x4
+#define LB_INTERRUPT_MASK__VLINE2_INTERRUPT_MASK_MASK 0x100
+#define LB_INTERRUPT_MASK__VLINE2_INTERRUPT_MASK__SHIFT 0x8
+#define LB_VLINE_STATUS__VLINE_OCCURRED_MASK 0x1
+#define LB_VLINE_STATUS__VLINE_OCCURRED__SHIFT 0x0
+#define LB_VLINE_STATUS__VLINE_ACK_MASK 0x10
+#define LB_VLINE_STATUS__VLINE_ACK__SHIFT 0x4
+#define LB_VLINE_STATUS__VLINE_STAT_MASK 0x1000
+#define LB_VLINE_STATUS__VLINE_STAT__SHIFT 0xc
+#define LB_VLINE_STATUS__VLINE_INTERRUPT_MASK 0x10000
+#define LB_VLINE_STATUS__VLINE_INTERRUPT__SHIFT 0x10
+#define LB_VLINE_STATUS__VLINE_INTERRUPT_TYPE_MASK 0x20000
+#define LB_VLINE_STATUS__VLINE_INTERRUPT_TYPE__SHIFT 0x11
+#define LB_VLINE2_STATUS__VLINE2_OCCURRED_MASK 0x1
+#define LB_VLINE2_STATUS__VLINE2_OCCURRED__SHIFT 0x0
+#define LB_VLINE2_STATUS__VLINE2_ACK_MASK 0x10
+#define LB_VLINE2_STATUS__VLINE2_ACK__SHIFT 0x4
+#define LB_VLINE2_STATUS__VLINE2_STAT_MASK 0x1000
+#define LB_VLINE2_STATUS__VLINE2_STAT__SHIFT 0xc
+#define LB_VLINE2_STATUS__VLINE2_INTERRUPT_MASK 0x10000
+#define LB_VLINE2_STATUS__VLINE2_INTERRUPT__SHIFT 0x10
+#define LB_VLINE2_STATUS__VLINE2_INTERRUPT_TYPE_MASK 0x20000
+#define LB_VLINE2_STATUS__VLINE2_INTERRUPT_TYPE__SHIFT 0x11
+#define LB_VBLANK_STATUS__VBLANK_OCCURRED_MASK 0x1
+#define LB_VBLANK_STATUS__VBLANK_OCCURRED__SHIFT 0x0
+#define LB_VBLANK_STATUS__VBLANK_ACK_MASK 0x10
+#define LB_VBLANK_STATUS__VBLANK_ACK__SHIFT 0x4
+#define LB_VBLANK_STATUS__VBLANK_STAT_MASK 0x1000
+#define LB_VBLANK_STATUS__VBLANK_STAT__SHIFT 0xc
+#define LB_VBLANK_STATUS__VBLANK_INTERRUPT_MASK 0x10000
+#define LB_VBLANK_STATUS__VBLANK_INTERRUPT__SHIFT 0x10
+#define LB_VBLANK_STATUS__VBLANK_INTERRUPT_TYPE_MASK 0x20000
+#define LB_VBLANK_STATUS__VBLANK_INTERRUPT_TYPE__SHIFT 0x11
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_SEL_MASK 0x3
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_SEL__SHIFT 0x0
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_SEL2_MASK 0x10
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_SEL2__SHIFT 0x4
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_DELAY_MASK 0xff00
+#define LB_SYNC_RESET_SEL__LB_SYNC_RESET_DELAY__SHIFT 0x8
+#define LB_SYNC_RESET_SEL__LB_SYNC_DURATION_MASK 0xc00000
+#define LB_SYNC_RESET_SEL__LB_SYNC_DURATION__SHIFT 0x16
+#define LB_BLACK_KEYER_R_CR__LB_BLACK_KEYER_R_CR_MASK 0xfff0
+#define LB_BLACK_KEYER_R_CR__LB_BLACK_KEYER_R_CR__SHIFT 0x4
+#define LB_BLACK_KEYER_G_Y__LB_BLACK_KEYER_G_Y_MASK 0xfff0
+#define LB_BLACK_KEYER_G_Y__LB_BLACK_KEYER_G_Y__SHIFT 0x4
+#define LB_BLACK_KEYER_B_CB__LB_BLACK_KEYER_B_CB_MASK 0xfff0
+#define LB_BLACK_KEYER_B_CB__LB_BLACK_KEYER_B_CB__SHIFT 0x4
+#define LB_KEYER_COLOR_CTRL__LB_KEYER_COLOR_EN_MASK 0x1
+#define LB_KEYER_COLOR_CTRL__LB_KEYER_COLOR_EN__SHIFT 0x0
+#define LB_KEYER_COLOR_CTRL__LB_KEYER_COLOR_REP_EN_MASK 0x100
+#define LB_KEYER_COLOR_CTRL__LB_KEYER_COLOR_REP_EN__SHIFT 0x8
+#define LB_KEYER_COLOR_R_CR__LB_KEYER_COLOR_R_CR_MASK 0xfff0
+#define LB_KEYER_COLOR_R_CR__LB_KEYER_COLOR_R_CR__SHIFT 0x4
+#define LB_KEYER_COLOR_G_Y__LB_KEYER_COLOR_G_Y_MASK 0xfff0
+#define LB_KEYER_COLOR_G_Y__LB_KEYER_COLOR_G_Y__SHIFT 0x4
+#define LB_KEYER_COLOR_B_CB__LB_KEYER_COLOR_B_CB_MASK 0xfff0
+#define LB_KEYER_COLOR_B_CB__LB_KEYER_COLOR_B_CB__SHIFT 0x4
+#define LB_KEYER_COLOR_REP_R_CR__LB_KEYER_COLOR_REP_R_CR_MASK 0xfff0
+#define LB_KEYER_COLOR_REP_R_CR__LB_KEYER_COLOR_REP_R_CR__SHIFT 0x4
+#define LB_KEYER_COLOR_REP_G_Y__LB_KEYER_COLOR_REP_G_Y_MASK 0xfff0
+#define LB_KEYER_COLOR_REP_G_Y__LB_KEYER_COLOR_REP_G_Y__SHIFT 0x4
+#define LB_KEYER_COLOR_REP_B_CB__LB_KEYER_COLOR_REP_B_CB_MASK 0xfff0
+#define LB_KEYER_COLOR_REP_B_CB__LB_KEYER_COLOR_REP_B_CB__SHIFT 0x4
+#define LB_BUFFER_LEVEL_STATUS__REQ_FIFO_LEVEL_MASK 0x3f
+#define LB_BUFFER_LEVEL_STATUS__REQ_FIFO_LEVEL__SHIFT 0x0
+#define LB_BUFFER_LEVEL_STATUS__REQ_FIFO_FULL_CNTL_MASK 0xfc00
+#define LB_BUFFER_LEVEL_STATUS__REQ_FIFO_FULL_CNTL__SHIFT 0xa
+#define LB_BUFFER_LEVEL_STATUS__DATA_BUFFER_LEVEL_MASK 0xfff0000
+#define LB_BUFFER_LEVEL_STATUS__DATA_BUFFER_LEVEL__SHIFT 0x10
+#define LB_BUFFER_LEVEL_STATUS__DATA_FIFO_FULL_CNTL_MASK 0xf0000000
+#define LB_BUFFER_LEVEL_STATUS__DATA_FIFO_FULL_CNTL__SHIFT 0x1c
+#define LB_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_ON_MASK 0xfff
+#define LB_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_ON__SHIFT 0x0
+#define LB_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_OFF_MASK 0xfff0000
+#define LB_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_OFF__SHIFT 0x10
+#define LB_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_LEVEL_MASK 0xfff
+#define LB_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_LEVEL__SHIFT 0x0
+#define LB_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_STAT_MASK 0x10000
+#define LB_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_STAT__SHIFT 0x10
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_MARGIN_MASK 0xf
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_MARGIN__SHIFT 0x0
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_STAT_MASK 0x10
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_STAT__SHIFT 0x4
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_OCCURRED_MASK 0x100
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_OCCURRED__SHIFT 0x8
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_ACK_MASK 0x1000
+#define LB_BUFFER_STATUS__LB_BUFFER_EMPTY_ACK__SHIFT 0xc
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_STAT_MASK 0x10000
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_STAT__SHIFT 0x10
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_OCCURRED_MASK 0x100000
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_OCCURRED__SHIFT 0x14
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_ACK_MASK 0x1000000
+#define LB_BUFFER_STATUS__LB_BUFFER_FULL_ACK__SHIFT 0x18
+#define LB_NO_OUTSTANDING_REQ_STATUS__LB_NO_OUTSTANDING_REQ_STAT_MASK 0x1
+#define LB_NO_OUTSTANDING_REQ_STATUS__LB_NO_OUTSTANDING_REQ_STAT__SHIFT 0x0
+#define MVP_AFR_FLIP_MODE__MVP_AFR_FLIP_MODE_MASK 0x3
+#define MVP_AFR_FLIP_MODE__MVP_AFR_FLIP_MODE__SHIFT 0x0
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_NUM_ENTRIES_MASK 0xf
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_NUM_ENTRIES__SHIFT 0x0
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET_MASK 0x10
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET__SHIFT 0x4
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET_FLAG_MASK 0x100
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET_FLAG__SHIFT 0x8
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET_ACK_MASK 0x1000
+#define MVP_AFR_FLIP_FIFO_CNTL__MVP_AFR_FLIP_FIFO_RESET_ACK__SHIFT 0xc
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_INSERT_MODE_MASK 0x3
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_INSERT_MODE__SHIFT 0x0
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_INSERT_MASK 0x7fff00
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_INSERT__SHIFT 0x8
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_OFFSET_MASK 0x3f000000
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_LINE_NUM_OFFSET__SHIFT 0x18
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_AUTO_ENABLE_MASK 0x40000000
+#define MVP_FLIP_LINE_NUM_INSERT__MVP_FLIP_AUTO_ENABLE__SHIFT 0x1e
+#define DC_MVP_LB_CONTROL__MVP_SWAP_LOCK_IN_MODE_MASK 0x3
+#define DC_MVP_LB_CONTROL__MVP_SWAP_LOCK_IN_MODE__SHIFT 0x0
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_SEL_MASK 0x100
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_SEL__SHIFT 0x8
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_FORCE_ONE_MASK 0x1000
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_FORCE_ONE__SHIFT 0xc
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_FORCE_ZERO_MASK 0x10000
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_OUT_FORCE_ZERO__SHIFT 0x10
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_STATUS_MASK 0x100000
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_STATUS__SHIFT 0x14
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_IN_CAP_MASK 0x10000000
+#define DC_MVP_LB_CONTROL__DC_MVP_SWAP_LOCK_IN_CAP__SHIFT 0x1c
+#define DC_MVP_LB_CONTROL__DC_MVP_SPARE_FLOPS_MASK 0x80000000
+#define DC_MVP_LB_CONTROL__DC_MVP_SPARE_FLOPS__SHIFT 0x1f
+#define LB_DEBUG__LB_DEBUG_MASK 0xffffffff
+#define LB_DEBUG__LB_DEBUG__SHIFT 0x0
+#define LB_DEBUG2__LB_DEBUG2_MASK 0xffffffff
+#define LB_DEBUG2__LB_DEBUG2__SHIFT 0x0
+#define LB_DEBUG3__LB_DEBUG3_MASK 0xffffffff
+#define LB_DEBUG3__LB_DEBUG3__SHIFT 0x0
+#define LB_TEST_DEBUG_INDEX__LB_TEST_DEBUG_INDEX_MASK 0xff
+#define LB_TEST_DEBUG_INDEX__LB_TEST_DEBUG_INDEX__SHIFT 0x0
+#define LB_TEST_DEBUG_INDEX__LB_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define LB_TEST_DEBUG_INDEX__LB_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define LB_TEST_DEBUG_DATA__LB_TEST_DEBUG_DATA_MASK 0xffffffff
+#define LB_TEST_DEBUG_DATA__LB_TEST_DEBUG_DATA__SHIFT 0x0
+#define LBV_DATA_FORMAT__PIXEL_DEPTH_MASK 0x3
+#define LBV_DATA_FORMAT__PIXEL_DEPTH__SHIFT 0x0
+#define LBV_DATA_FORMAT__PIXEL_EXPAN_MODE_MASK 0x4
+#define LBV_DATA_FORMAT__PIXEL_EXPAN_MODE__SHIFT 0x2
+#define LBV_DATA_FORMAT__INTERLEAVE_EN_MASK 0x8
+#define LBV_DATA_FORMAT__INTERLEAVE_EN__SHIFT 0x3
+#define LBV_DATA_FORMAT__PIXEL_REDUCE_MODE_MASK 0x10
+#define LBV_DATA_FORMAT__PIXEL_REDUCE_MODE__SHIFT 0x4
+#define LBV_DATA_FORMAT__DYNAMIC_PIXEL_DEPTH_MASK 0x20
+#define LBV_DATA_FORMAT__DYNAMIC_PIXEL_DEPTH__SHIFT 0x5
+#define LBV_DATA_FORMAT__DITHER_EN_MASK 0x40
+#define LBV_DATA_FORMAT__DITHER_EN__SHIFT 0x6
+#define LBV_DATA_FORMAT__DOWNSCALE_PREFETCH_EN_MASK 0x80
+#define LBV_DATA_FORMAT__DOWNSCALE_PREFETCH_EN__SHIFT 0x7
+#define LBV_DATA_FORMAT__PREFETCH_MASK 0x1000
+#define LBV_DATA_FORMAT__PREFETCH__SHIFT 0xc
+#define LBV_DATA_FORMAT__REQUEST_MODE_MASK 0x1000000
+#define LBV_DATA_FORMAT__REQUEST_MODE__SHIFT 0x18
+#define LBV_DATA_FORMAT__ALPHA_EN_MASK 0x80000000
+#define LBV_DATA_FORMAT__ALPHA_EN__SHIFT 0x1f
+#define LBV_MEMORY_CTRL__LB_MEMORY_SIZE_MASK 0xfff
+#define LBV_MEMORY_CTRL__LB_MEMORY_SIZE__SHIFT 0x0
+#define LBV_MEMORY_CTRL__LB_NUM_PARTITIONS_MASK 0xf0000
+#define LBV_MEMORY_CTRL__LB_NUM_PARTITIONS__SHIFT 0x10
+#define LBV_MEMORY_CTRL__LB_MEMORY_CONFIG_MASK 0x300000
+#define LBV_MEMORY_CTRL__LB_MEMORY_CONFIG__SHIFT 0x14
+#define LBV_MEMORY_SIZE_STATUS__LB_MEMORY_SIZE_STATUS_MASK 0xfff
+#define LBV_MEMORY_SIZE_STATUS__LB_MEMORY_SIZE_STATUS__SHIFT 0x0
+#define LBV_DESKTOP_HEIGHT__DESKTOP_HEIGHT_MASK 0x7fff
+#define LBV_DESKTOP_HEIGHT__DESKTOP_HEIGHT__SHIFT 0x0
+#define LBV_VLINE_START_END__VLINE_START_MASK 0x3fff
+#define LBV_VLINE_START_END__VLINE_START__SHIFT 0x0
+#define LBV_VLINE_START_END__VLINE_END_MASK 0x7fff0000
+#define LBV_VLINE_START_END__VLINE_END__SHIFT 0x10
+#define LBV_VLINE_START_END__VLINE_INV_MASK 0x80000000
+#define LBV_VLINE_START_END__VLINE_INV__SHIFT 0x1f
+#define LBV_VLINE2_START_END__VLINE2_START_MASK 0x3fff
+#define LBV_VLINE2_START_END__VLINE2_START__SHIFT 0x0
+#define LBV_VLINE2_START_END__VLINE2_END_MASK 0x7fff0000
+#define LBV_VLINE2_START_END__VLINE2_END__SHIFT 0x10
+#define LBV_VLINE2_START_END__VLINE2_INV_MASK 0x80000000
+#define LBV_VLINE2_START_END__VLINE2_INV__SHIFT 0x1f
+#define LBV_V_COUNTER__V_COUNTER_MASK 0x7fff
+#define LBV_V_COUNTER__V_COUNTER__SHIFT 0x0
+#define LBV_SNAPSHOT_V_COUNTER__SNAPSHOT_V_COUNTER_MASK 0x7fff
+#define LBV_SNAPSHOT_V_COUNTER__SNAPSHOT_V_COUNTER__SHIFT 0x0
+#define LBV_V_COUNTER_CHROMA__V_COUNTER_CHROMA_MASK 0x7fff
+#define LBV_V_COUNTER_CHROMA__V_COUNTER_CHROMA__SHIFT 0x0
+#define LBV_SNAPSHOT_V_COUNTER_CHROMA__SNAPSHOT_V_COUNTER_CHROMA_MASK 0x7fff
+#define LBV_SNAPSHOT_V_COUNTER_CHROMA__SNAPSHOT_V_COUNTER_CHROMA__SHIFT 0x0
+#define LBV_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK_MASK 0x1
+#define LBV_INTERRUPT_MASK__VBLANK_INTERRUPT_MASK__SHIFT 0x0
+#define LBV_INTERRUPT_MASK__VLINE_INTERRUPT_MASK_MASK 0x10
+#define LBV_INTERRUPT_MASK__VLINE_INTERRUPT_MASK__SHIFT 0x4
+#define LBV_INTERRUPT_MASK__VLINE2_INTERRUPT_MASK_MASK 0x100
+#define LBV_INTERRUPT_MASK__VLINE2_INTERRUPT_MASK__SHIFT 0x8
+#define LBV_VLINE_STATUS__VLINE_OCCURRED_MASK 0x1
+#define LBV_VLINE_STATUS__VLINE_OCCURRED__SHIFT 0x0
+#define LBV_VLINE_STATUS__VLINE_ACK_MASK 0x10
+#define LBV_VLINE_STATUS__VLINE_ACK__SHIFT 0x4
+#define LBV_VLINE_STATUS__VLINE_STAT_MASK 0x1000
+#define LBV_VLINE_STATUS__VLINE_STAT__SHIFT 0xc
+#define LBV_VLINE_STATUS__VLINE_INTERRUPT_MASK 0x10000
+#define LBV_VLINE_STATUS__VLINE_INTERRUPT__SHIFT 0x10
+#define LBV_VLINE_STATUS__VLINE_INTERRUPT_TYPE_MASK 0x20000
+#define LBV_VLINE_STATUS__VLINE_INTERRUPT_TYPE__SHIFT 0x11
+#define LBV_VLINE2_STATUS__VLINE2_OCCURRED_MASK 0x1
+#define LBV_VLINE2_STATUS__VLINE2_OCCURRED__SHIFT 0x0
+#define LBV_VLINE2_STATUS__VLINE2_ACK_MASK 0x10
+#define LBV_VLINE2_STATUS__VLINE2_ACK__SHIFT 0x4
+#define LBV_VLINE2_STATUS__VLINE2_STAT_MASK 0x1000
+#define LBV_VLINE2_STATUS__VLINE2_STAT__SHIFT 0xc
+#define LBV_VLINE2_STATUS__VLINE2_INTERRUPT_MASK 0x10000
+#define LBV_VLINE2_STATUS__VLINE2_INTERRUPT__SHIFT 0x10
+#define LBV_VLINE2_STATUS__VLINE2_INTERRUPT_TYPE_MASK 0x20000
+#define LBV_VLINE2_STATUS__VLINE2_INTERRUPT_TYPE__SHIFT 0x11
+#define LBV_VBLANK_STATUS__VBLANK_OCCURRED_MASK 0x1
+#define LBV_VBLANK_STATUS__VBLANK_OCCURRED__SHIFT 0x0
+#define LBV_VBLANK_STATUS__VBLANK_ACK_MASK 0x10
+#define LBV_VBLANK_STATUS__VBLANK_ACK__SHIFT 0x4
+#define LBV_VBLANK_STATUS__VBLANK_STAT_MASK 0x1000
+#define LBV_VBLANK_STATUS__VBLANK_STAT__SHIFT 0xc
+#define LBV_VBLANK_STATUS__VBLANK_INTERRUPT_MASK 0x10000
+#define LBV_VBLANK_STATUS__VBLANK_INTERRUPT__SHIFT 0x10
+#define LBV_VBLANK_STATUS__VBLANK_INTERRUPT_TYPE_MASK 0x20000
+#define LBV_VBLANK_STATUS__VBLANK_INTERRUPT_TYPE__SHIFT 0x11
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_SEL_MASK 0x3
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_SEL__SHIFT 0x0
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_SEL2_MASK 0x10
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_SEL2__SHIFT 0x4
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_DELAY_MASK 0xff00
+#define LBV_SYNC_RESET_SEL__LB_SYNC_RESET_DELAY__SHIFT 0x8
+#define LBV_SYNC_RESET_SEL__LB_SYNC_DURATION_MASK 0xc00000
+#define LBV_SYNC_RESET_SEL__LB_SYNC_DURATION__SHIFT 0x16
+#define LBV_BLACK_KEYER_R_CR__LB_BLACK_KEYER_R_CR_MASK 0xfff0
+#define LBV_BLACK_KEYER_R_CR__LB_BLACK_KEYER_R_CR__SHIFT 0x4
+#define LBV_BLACK_KEYER_G_Y__LB_BLACK_KEYER_G_Y_MASK 0xfff0
+#define LBV_BLACK_KEYER_G_Y__LB_BLACK_KEYER_G_Y__SHIFT 0x4
+#define LBV_BLACK_KEYER_B_CB__LB_BLACK_KEYER_B_CB_MASK 0xfff0
+#define LBV_BLACK_KEYER_B_CB__LB_BLACK_KEYER_B_CB__SHIFT 0x4
+#define LBV_KEYER_COLOR_CTRL__LB_KEYER_COLOR_EN_MASK 0x1
+#define LBV_KEYER_COLOR_CTRL__LB_KEYER_COLOR_EN__SHIFT 0x0
+#define LBV_KEYER_COLOR_CTRL__LB_KEYER_COLOR_REP_EN_MASK 0x100
+#define LBV_KEYER_COLOR_CTRL__LB_KEYER_COLOR_REP_EN__SHIFT 0x8
+#define LBV_KEYER_COLOR_R_CR__LB_KEYER_COLOR_R_CR_MASK 0xfff0
+#define LBV_KEYER_COLOR_R_CR__LB_KEYER_COLOR_R_CR__SHIFT 0x4
+#define LBV_KEYER_COLOR_G_Y__LB_KEYER_COLOR_G_Y_MASK 0xfff0
+#define LBV_KEYER_COLOR_G_Y__LB_KEYER_COLOR_G_Y__SHIFT 0x4
+#define LBV_KEYER_COLOR_B_CB__LB_KEYER_COLOR_B_CB_MASK 0xfff0
+#define LBV_KEYER_COLOR_B_CB__LB_KEYER_COLOR_B_CB__SHIFT 0x4
+#define LBV_KEYER_COLOR_REP_R_CR__LB_KEYER_COLOR_REP_R_CR_MASK 0xfff0
+#define LBV_KEYER_COLOR_REP_R_CR__LB_KEYER_COLOR_REP_R_CR__SHIFT 0x4
+#define LBV_KEYER_COLOR_REP_G_Y__LB_KEYER_COLOR_REP_G_Y_MASK 0xfff0
+#define LBV_KEYER_COLOR_REP_G_Y__LB_KEYER_COLOR_REP_G_Y__SHIFT 0x4
+#define LBV_KEYER_COLOR_REP_B_CB__LB_KEYER_COLOR_REP_B_CB_MASK 0xfff0
+#define LBV_KEYER_COLOR_REP_B_CB__LB_KEYER_COLOR_REP_B_CB__SHIFT 0x4
+#define LBV_BUFFER_LEVEL_STATUS__REQ_FIFO_LEVEL_MASK 0x3f
+#define LBV_BUFFER_LEVEL_STATUS__REQ_FIFO_LEVEL__SHIFT 0x0
+#define LBV_BUFFER_LEVEL_STATUS__REQ_FIFO_FULL_CNTL_MASK 0xfc00
+#define LBV_BUFFER_LEVEL_STATUS__REQ_FIFO_FULL_CNTL__SHIFT 0xa
+#define LBV_BUFFER_LEVEL_STATUS__DATA_BUFFER_LEVEL_MASK 0xfff0000
+#define LBV_BUFFER_LEVEL_STATUS__DATA_BUFFER_LEVEL__SHIFT 0x10
+#define LBV_BUFFER_LEVEL_STATUS__DATA_FIFO_FULL_CNTL_MASK 0xf0000000
+#define LBV_BUFFER_LEVEL_STATUS__DATA_FIFO_FULL_CNTL__SHIFT 0x1c
+#define LBV_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_ON_MASK 0xfff
+#define LBV_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_ON__SHIFT 0x0
+#define LBV_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_OFF_MASK 0xfff0000
+#define LBV_BUFFER_URGENCY_CTRL__LB_BUFFER_URGENCY_MARK_OFF__SHIFT 0x10
+#define LBV_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_LEVEL_MASK 0xfff
+#define LBV_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_LEVEL__SHIFT 0x0
+#define LBV_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_STAT_MASK 0x10000
+#define LBV_BUFFER_URGENCY_STATUS__LB_BUFFER_URGENCY_STAT__SHIFT 0x10
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_MARGIN_MASK 0xf
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_MARGIN__SHIFT 0x0
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_STAT_MASK 0x10
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_STAT__SHIFT 0x4
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_OCCURRED_MASK 0x100
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_OCCURRED__SHIFT 0x8
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_ACK_MASK 0x1000
+#define LBV_BUFFER_STATUS__LB_BUFFER_EMPTY_ACK__SHIFT 0xc
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_STAT_MASK 0x10000
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_STAT__SHIFT 0x10
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_OCCURRED_MASK 0x100000
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_OCCURRED__SHIFT 0x14
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_ACK_MASK 0x1000000
+#define LBV_BUFFER_STATUS__LB_BUFFER_FULL_ACK__SHIFT 0x18
+#define LBV_BUFFER_STATUS__LB_ENABLE_HIGH_THROUGHPUT_MASK 0x2000000
+#define LBV_BUFFER_STATUS__LB_ENABLE_HIGH_THROUGHPUT__SHIFT 0x19
+#define LBV_BUFFER_STATUS__LB_HIGH_THROUGHPUT_CNTL_MASK 0x1c000000
+#define LBV_BUFFER_STATUS__LB_HIGH_THROUGHPUT_CNTL__SHIFT 0x1a
+#define LBV_NO_OUTSTANDING_REQ_STATUS__LB_NO_OUTSTANDING_REQ_STAT_MASK 0x1
+#define LBV_NO_OUTSTANDING_REQ_STATUS__LB_NO_OUTSTANDING_REQ_STAT__SHIFT 0x0
+#define LBV_DEBUG__LB_DEBUG_MASK 0xffffffff
+#define LBV_DEBUG__LB_DEBUG__SHIFT 0x0
+#define LBV_DEBUG2__LB_DEBUG2_MASK 0xffffffff
+#define LBV_DEBUG2__LB_DEBUG2__SHIFT 0x0
+#define LBV_DEBUG3__LB_DEBUG3_MASK 0xffffffff
+#define LBV_DEBUG3__LB_DEBUG3__SHIFT 0x0
+#define LBV_TEST_DEBUG_INDEX__LB_TEST_DEBUG_INDEX_MASK 0xff
+#define LBV_TEST_DEBUG_INDEX__LB_TEST_DEBUG_INDEX__SHIFT 0x0
+#define LBV_TEST_DEBUG_INDEX__LB_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define LBV_TEST_DEBUG_INDEX__LB_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define LBV_TEST_DEBUG_DATA__LB_TEST_DEBUG_DATA_MASK 0xffffffff
+#define LBV_TEST_DEBUG_DATA__LB_TEST_DEBUG_DATA__SHIFT 0x0
+#define MVP_CONTROL1__MVP_EN_MASK 0x1
+#define MVP_CONTROL1__MVP_EN__SHIFT 0x0
+#define MVP_CONTROL1__MVP_MIXER_MODE_MASK 0x70
+#define MVP_CONTROL1__MVP_MIXER_MODE__SHIFT 0x4
+#define MVP_CONTROL1__MVP_MIXER_SLAVE_SEL_MASK 0x100
+#define MVP_CONTROL1__MVP_MIXER_SLAVE_SEL__SHIFT 0x8
+#define MVP_CONTROL1__MVP_MIXER_SLAVE_SEL_DELAY_UNTIL_END_OF_BLANK_MASK 0x200
+#define MVP_CONTROL1__MVP_MIXER_SLAVE_SEL_DELAY_UNTIL_END_OF_BLANK__SHIFT 0x9
+#define MVP_CONTROL1__MVP_ARBITRATION_MODE_FOR_AFR_MANUAL_SWITCH_MODE_MASK 0x400
+#define MVP_CONTROL1__MVP_ARBITRATION_MODE_FOR_AFR_MANUAL_SWITCH_MODE__SHIFT 0xa
+#define MVP_CONTROL1__MVP_RATE_CONTROL_MASK 0x1000
+#define MVP_CONTROL1__MVP_RATE_CONTROL__SHIFT 0xc
+#define MVP_CONTROL1__MVP_CHANNEL_CONTROL_MASK 0x10000
+#define MVP_CONTROL1__MVP_CHANNEL_CONTROL__SHIFT 0x10
+#define MVP_CONTROL1__MVP_GPU_CHAIN_LOCATION_MASK 0x300000
+#define MVP_CONTROL1__MVP_GPU_CHAIN_LOCATION__SHIFT 0x14
+#define MVP_CONTROL1__MVP_DISABLE_MSB_EXPAND_MASK 0x1000000
+#define MVP_CONTROL1__MVP_DISABLE_MSB_EXPAND__SHIFT 0x18
+#define MVP_CONTROL1__MVP_30BPP_EN_MASK 0x10000000
+#define MVP_CONTROL1__MVP_30BPP_EN__SHIFT 0x1c
+#define MVP_CONTROL1__MVP_TERMINATION_CNTL_A_MASK 0x40000000
+#define MVP_CONTROL1__MVP_TERMINATION_CNTL_A__SHIFT 0x1e
+#define MVP_CONTROL1__MVP_TERMINATION_CNTL_B_MASK 0x80000000
+#define MVP_CONTROL1__MVP_TERMINATION_CNTL_B__SHIFT 0x1f
+#define MVP_CONTROL2__MVP_MUX_DE_DVOCNTL0_SEL_MASK 0x1
+#define MVP_CONTROL2__MVP_MUX_DE_DVOCNTL0_SEL__SHIFT 0x0
+#define MVP_CONTROL2__MVP_MUX_DE_DVOCNTL2_SEL_MASK 0x10
+#define MVP_CONTROL2__MVP_MUX_DE_DVOCNTL2_SEL__SHIFT 0x4
+#define MVP_CONTROL2__MVP_MUXA_CLK_SEL_MASK 0x100
+#define MVP_CONTROL2__MVP_MUXA_CLK_SEL__SHIFT 0x8
+#define MVP_CONTROL2__MVP_MUXB_CLK_SEL_MASK 0x1000
+#define MVP_CONTROL2__MVP_MUXB_CLK_SEL__SHIFT 0xc
+#define MVP_CONTROL2__MVP_DVOCNTL_MUX_MASK 0x10000
+#define MVP_CONTROL2__MVP_DVOCNTL_MUX__SHIFT 0x10
+#define MVP_CONTROL2__MVP_FLOW_CONTROL_OUT_EN_MASK 0x100000
+#define MVP_CONTROL2__MVP_FLOW_CONTROL_OUT_EN__SHIFT 0x14
+#define MVP_CONTROL2__MVP_SWAP_LOCK_OUT_EN_MASK 0x1000000
+#define MVP_CONTROL2__MVP_SWAP_LOCK_OUT_EN__SHIFT 0x18
+#define MVP_CONTROL2__MVP_SWAP_AB_IN_DC_DDR_MASK 0x10000000
+#define MVP_CONTROL2__MVP_SWAP_AB_IN_DC_DDR__SHIFT 0x1c
+#define MVP_FIFO_CONTROL__MVP_STOP_SLAVE_WM_MASK 0xff
+#define MVP_FIFO_CONTROL__MVP_STOP_SLAVE_WM__SHIFT 0x0
+#define MVP_FIFO_CONTROL__MVP_PAUSE_SLAVE_WM_MASK 0xff00
+#define MVP_FIFO_CONTROL__MVP_PAUSE_SLAVE_WM__SHIFT 0x8
+#define MVP_FIFO_CONTROL__MVP_PAUSE_SLAVE_CNT_MASK 0xff0000
+#define MVP_FIFO_CONTROL__MVP_PAUSE_SLAVE_CNT__SHIFT 0x10
+#define MVP_FIFO_STATUS__MVP_FIFO_LEVEL_MASK 0xff
+#define MVP_FIFO_STATUS__MVP_FIFO_LEVEL__SHIFT 0x0
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW_MASK 0x100
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW__SHIFT 0x8
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW_OCCURRED_MASK 0x1000
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW_OCCURRED__SHIFT 0xc
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW_ACK_MASK 0x10000
+#define MVP_FIFO_STATUS__MVP_FIFO_OVERFLOW_ACK__SHIFT 0x10
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW_MASK 0x100000
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW__SHIFT 0x14
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW_OCCURRED_MASK 0x1000000
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW_OCCURRED__SHIFT 0x18
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW_ACK_MASK 0x10000000
+#define MVP_FIFO_STATUS__MVP_FIFO_UNDERFLOW_ACK__SHIFT 0x1c
+#define MVP_FIFO_STATUS__MVP_FIFO_ERROR_MASK_MASK 0x40000000
+#define MVP_FIFO_STATUS__MVP_FIFO_ERROR_MASK__SHIFT 0x1e
+#define MVP_FIFO_STATUS__MVP_FIFO_ERROR_INT_STATUS_MASK 0x80000000
+#define MVP_FIFO_STATUS__MVP_FIFO_ERROR_INT_STATUS__SHIFT 0x1f
+#define MVP_SLAVE_STATUS__MVP_SLAVE_PIXELS_PER_LINE_RCVED_MASK 0x1fff
+#define MVP_SLAVE_STATUS__MVP_SLAVE_PIXELS_PER_LINE_RCVED__SHIFT 0x0
+#define MVP_SLAVE_STATUS__MVP_SLAVE_LINES_PER_FRAME_RCVED_MASK 0x1fff0000
+#define MVP_SLAVE_STATUS__MVP_SLAVE_LINES_PER_FRAME_RCVED__SHIFT 0x10
+#define MVP_INBAND_CNTL_CAP__MVP_IGNOR_INBAND_CNTL_MASK 0x1
+#define MVP_INBAND_CNTL_CAP__MVP_IGNOR_INBAND_CNTL__SHIFT 0x0
+#define MVP_INBAND_CNTL_CAP__MVP_PASSING_INBAND_CNTL_EN_MASK 0x10
+#define MVP_INBAND_CNTL_CAP__MVP_PASSING_INBAND_CNTL_EN__SHIFT 0x4
+#define MVP_INBAND_CNTL_CAP__MVP_INBAND_CNTL_CHAR_CAP_MASK 0xffffff00
+#define MVP_INBAND_CNTL_CAP__MVP_INBAND_CNTL_CHAR_CAP__SHIFT 0x8
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_R_MASK 0x3ff
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_R__SHIFT 0x0
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_G_MASK 0xffc00
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_G__SHIFT 0xa
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_B_MASK 0x3ff00000
+#define MVP_BLACK_KEYER__MVP_BLACK_KEYER_B__SHIFT 0x14
+#define MVP_CRC_CNTL__MVP_CRC_BLUE_MASK_MASK 0xff
+#define MVP_CRC_CNTL__MVP_CRC_BLUE_MASK__SHIFT 0x0
+#define MVP_CRC_CNTL__MVP_CRC_GREEN_MASK_MASK 0xff00
+#define MVP_CRC_CNTL__MVP_CRC_GREEN_MASK__SHIFT 0x8
+#define MVP_CRC_CNTL__MVP_CRC_RED_MASK_MASK 0xff0000
+#define MVP_CRC_CNTL__MVP_CRC_RED_MASK__SHIFT 0x10
+#define MVP_CRC_CNTL__MVP_CRC_EN_MASK 0x10000000
+#define MVP_CRC_CNTL__MVP_CRC_EN__SHIFT 0x1c
+#define MVP_CRC_CNTL__MVP_CRC_CONT_EN_MASK 0x20000000
+#define MVP_CRC_CNTL__MVP_CRC_CONT_EN__SHIFT 0x1d
+#define MVP_CRC_CNTL__MVP_DC_DDR_CRC_EVEN_ODD_PIX_SEL_MASK 0x40000000
+#define MVP_CRC_CNTL__MVP_DC_DDR_CRC_EVEN_ODD_PIX_SEL__SHIFT 0x1e
+#define MVP_CRC_RESULT_BLUE_GREEN__MVP_CRC_BLUE_RESULT_MASK 0xffff
+#define MVP_CRC_RESULT_BLUE_GREEN__MVP_CRC_BLUE_RESULT__SHIFT 0x0
+#define MVP_CRC_RESULT_BLUE_GREEN__MVP_CRC_GREEN_RESULT_MASK 0xffff0000
+#define MVP_CRC_RESULT_BLUE_GREEN__MVP_CRC_GREEN_RESULT__SHIFT 0x10
+#define MVP_CRC_RESULT_RED__MVP_CRC_RED_RESULT_MASK 0xffff
+#define MVP_CRC_RESULT_RED__MVP_CRC_RED_RESULT__SHIFT 0x0
+#define MVP_CONTROL3__MVP_RESET_IN_BETWEEN_FRAMES_MASK 0x1
+#define MVP_CONTROL3__MVP_RESET_IN_BETWEEN_FRAMES__SHIFT 0x0
+#define MVP_CONTROL3__MVP_DDR_SC_AB_SEL_MASK 0x10
+#define MVP_CONTROL3__MVP_DDR_SC_AB_SEL__SHIFT 0x4
+#define MVP_CONTROL3__MVP_DDR_SC_B_START_MODE_MASK 0x100
+#define MVP_CONTROL3__MVP_DDR_SC_B_START_MODE__SHIFT 0x8
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_OUT_FORCE_ONE_MASK 0x1000
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_OUT_FORCE_ONE__SHIFT 0xc
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_OUT_FORCE_ZERO_MASK 0x10000
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_OUT_FORCE_ZERO__SHIFT 0x10
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_CASCADE_EN_MASK 0x100000
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_CASCADE_EN__SHIFT 0x14
+#define MVP_CONTROL3__MVP_SWAP_48BIT_EN_MASK 0x1000000
+#define MVP_CONTROL3__MVP_SWAP_48BIT_EN__SHIFT 0x18
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_IN_CAP_MASK 0x10000000
+#define MVP_CONTROL3__MVP_FLOW_CONTROL_IN_CAP__SHIFT 0x1c
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_PIXEL_ERROR_CNT_MASK 0x1fff
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_PIXEL_ERROR_CNT__SHIFT 0x0
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_LINE_ERROR_CNT_MASK 0x1fff0000
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_LINE_ERROR_CNT__SHIFT 0x10
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_DATA_CHK_EN_MASK 0x80000000
+#define MVP_RECEIVE_CNT_CNTL1__MVP_SLAVE_DATA_CHK_EN__SHIFT 0x1f
+#define MVP_RECEIVE_CNT_CNTL2__MVP_SLAVE_FRAME_ERROR_CNT_MASK 0x1fff
+#define MVP_RECEIVE_CNT_CNTL2__MVP_SLAVE_FRAME_ERROR_CNT__SHIFT 0x0
+#define MVP_RECEIVE_CNT_CNTL2__MVP_SLAVE_FRAME_ERROR_CNT_RESET_MASK 0x80000000
+#define MVP_RECEIVE_CNT_CNTL2__MVP_SLAVE_FRAME_ERROR_CNT_RESET__SHIFT 0x1f
+#define MVP_DEBUG__MVP_SWAP_LOCK_IN_EN_MASK 0x1
+#define MVP_DEBUG__MVP_SWAP_LOCK_IN_EN__SHIFT 0x0
+#define MVP_DEBUG__MVP_FLOW_CONTROL_IN_EN_MASK 0x2
+#define MVP_DEBUG__MVP_FLOW_CONTROL_IN_EN__SHIFT 0x1
+#define MVP_DEBUG__MVP_SWAP_LOCK_IN_SEL_MASK 0x4
+#define MVP_DEBUG__MVP_SWAP_LOCK_IN_SEL__SHIFT 0x2
+#define MVP_DEBUG__MVP_FLOW_CONTROL_IN_SEL_MASK 0x8
+#define MVP_DEBUG__MVP_FLOW_CONTROL_IN_SEL__SHIFT 0x3
+#define MVP_DEBUG__MVP_DIS_FIX_AFR_MANUAL_HSYNC_FLIP_MASK 0x10
+#define MVP_DEBUG__MVP_DIS_FIX_AFR_MANUAL_HSYNC_FLIP__SHIFT 0x4
+#define MVP_DEBUG__MVP_DIS_FIX_AFR_AUTO_VSYNC_FLIP_MASK 0x20
+#define MVP_DEBUG__MVP_DIS_FIX_AFR_AUTO_VSYNC_FLIP__SHIFT 0x5
+#define MVP_DEBUG__MVP_EN_FIX_AFR_MANUAL_SWITCH_IN_SFR_MASK 0x40
+#define MVP_DEBUG__MVP_EN_FIX_AFR_MANUAL_SWITCH_IN_SFR__SHIFT 0x6
+#define MVP_DEBUG__MVP_DIS_READ_POINTER_RESET_DELAY_MASK 0x80
+#define MVP_DEBUG__MVP_DIS_READ_POINTER_RESET_DELAY__SHIFT 0x7
+#define MVP_DEBUG__MVP_DEBUG_BITS_MASK 0xffffff00
+#define MVP_DEBUG__MVP_DEBUG_BITS__SHIFT 0x8
+#define MVP_TEST_DEBUG_INDEX__MVP_TEST_DEBUG_INDEX_MASK 0xff
+#define MVP_TEST_DEBUG_INDEX__MVP_TEST_DEBUG_INDEX__SHIFT 0x0
+#define MVP_TEST_DEBUG_INDEX__MVP_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define MVP_TEST_DEBUG_INDEX__MVP_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define MVP_TEST_DEBUG_DATA__MVP_TEST_DEBUG_DATA_MASK 0xffffffff
+#define MVP_TEST_DEBUG_DATA__MVP_TEST_DEBUG_DATA__SHIFT 0x0
+#define MVP_DEBUG_12__IDEC_MVP_DATA_A_H_MASK 0x1
+#define MVP_DEBUG_12__IDEC_MVP_DATA_A_H__SHIFT 0x0
+#define MVP_DEBUG_12__IDEC_MVP_DATA_A_MASK 0x1fffffe
+#define MVP_DEBUG_12__IDEC_MVP_DATA_A__SHIFT 0x1
+#define MVP_DEBUG_13__IDED_MVP_DATA_B_H_MASK 0x1
+#define MVP_DEBUG_13__IDED_MVP_DATA_B_H__SHIFT 0x0
+#define MVP_DEBUG_13__IDED_MVP_DATA_B_MASK 0x1fffffe
+#define MVP_DEBUG_13__IDED_MVP_DATA_B__SHIFT 0x1
+#define MVP_DEBUG_13__IDED_START_READ_B_MASK 0x2000000
+#define MVP_DEBUG_13__IDED_START_READ_B__SHIFT 0x19
+#define MVP_DEBUG_13__IDED_READ_FIFO_ENTRY_DE_B_MASK 0x4000000
+#define MVP_DEBUG_13__IDED_READ_FIFO_ENTRY_DE_B__SHIFT 0x1a
+#define MVP_DEBUG_13__IDED_WRITE_ADD_B_MASK 0x38000000
+#define MVP_DEBUG_13__IDED_WRITE_ADD_B__SHIFT 0x1b
+#define MVP_DEBUG_14__IDEE_READ_ADD_MASK 0x7
+#define MVP_DEBUG_14__IDEE_READ_ADD__SHIFT 0x0
+#define MVP_DEBUG_14__IDEE_WRITE_ADD_A_MASK 0x38
+#define MVP_DEBUG_14__IDEE_WRITE_ADD_A__SHIFT 0x3
+#define MVP_DEBUG_14__IDEE_WRITE_ADD_B_MASK 0x1c0
+#define MVP_DEBUG_14__IDEE_WRITE_ADD_B__SHIFT 0x6
+#define MVP_DEBUG_14__IDEE_START_READ_MASK 0x200
+#define MVP_DEBUG_14__IDEE_START_READ__SHIFT 0x9
+#define MVP_DEBUG_14__IDEE_START_READ_B_MASK 0x400
+#define MVP_DEBUG_14__IDEE_START_READ_B__SHIFT 0xa
+#define MVP_DEBUG_14__IDEE_START_INCR_WR_A_MASK 0x800
+#define MVP_DEBUG_14__IDEE_START_INCR_WR_A__SHIFT 0xb
+#define MVP_DEBUG_14__IDEE_START_INCR_WR_B_MASK 0x1000
+#define MVP_DEBUG_14__IDEE_START_INCR_WR_B__SHIFT 0xc
+#define MVP_DEBUG_14__IDEE_WRITE2FIFO_MASK 0x2000
+#define MVP_DEBUG_14__IDEE_WRITE2FIFO__SHIFT 0xd
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENTRY_DE_MASK 0x4000
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENTRY_DE__SHIFT 0xe
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENTRY_DE_B_MASK 0x8000
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENTRY_DE_B__SHIFT 0xf
+#define MVP_DEBUG_14__IDEE_READ_FIFO_DE_MASK 0x10000
+#define MVP_DEBUG_14__IDEE_READ_FIFO_DE__SHIFT 0x10
+#define MVP_DEBUG_14__IDEE_READ_FIFO_DE_B_MASK 0x20000
+#define MVP_DEBUG_14__IDEE_READ_FIFO_DE_B__SHIFT 0x11
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENABLE_MASK 0x40000
+#define MVP_DEBUG_14__IDEE_READ_FIFO_ENABLE__SHIFT 0x12
+#define MVP_DEBUG_14__IDEE_CRTC1_CNTL_CAPTURE_START_A_MASK 0x80000
+#define MVP_DEBUG_14__IDEE_CRTC1_CNTL_CAPTURE_START_A__SHIFT 0x13
+#define MVP_DEBUG_14__IDEE_CRC_PHASE_MASK 0x100000
+#define MVP_DEBUG_14__IDEE_CRC_PHASE__SHIFT 0x14
+#define MVP_DEBUG_15__IDEF_MVP_ASYNC_FIFO_WEN_MASK 0x1
+#define MVP_DEBUG_15__IDEF_MVP_ASYNC_FIFO_WEN__SHIFT 0x0
+#define MVP_DEBUG_15__IDEF_MVP_ASYNC_FIFO_WDATA_MASK 0xfffffff0
+#define MVP_DEBUG_15__IDEF_MVP_ASYNC_FIFO_WDATA__SHIFT 0x4
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_READ_MASK 0x1
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_READ__SHIFT 0x0
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_EXCEED_STOP_LEVEL_MASK 0x2
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_EXCEED_STOP_LEVEL__SHIFT 0x1
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_EXCEED_PAUSE_LEVEL_MASK 0x4
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_EXCEED_PAUSE_LEVEL__SHIFT 0x2
+#define MVP_DEBUG_16__IDCC_FLOW_CONTROL_OUT_MASK 0x8
+#define MVP_DEBUG_16__IDCC_FLOW_CONTROL_OUT__SHIFT 0x3
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_NUM_ENTRIES_MASK 0xff0
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_NUM_ENTRIES__SHIFT 0x4
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_OVERFLOW_MASK 0x1000
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_OVERFLOW__SHIFT 0xc
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_UNDERFLOW_MASK 0x2000
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_FIFO_UNDERFLOW__SHIFT 0xd
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_READ_ADDR_MASK 0xff0000
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_READ_ADDR__SHIFT 0x10
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_WRITE_ADDR_MASK 0xff000000
+#define MVP_DEBUG_16__IDCC_MVP_ASYNC_WRITE_ADDR__SHIFT 0x18
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_READ_MASK 0x1
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_READ__SHIFT 0x0
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_PHASE_MASK 0x2
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_PHASE__SHIFT 0x1
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_READ_DATA_MASK 0xfffffffc
+#define MVP_DEBUG_17__IDCD_MVP_ASYNC_FIFO_READ_DATA__SHIFT 0x2
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_TAP_PAIR_IDX_MASK 0xf
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_TAP_PAIR_IDX__SHIFT 0x0
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_PHASE_MASK 0xf00
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_PHASE__SHIFT 0x8
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_FILTER_TYPE_MASK 0x70000
+#define SCL_COEF_RAM_SELECT__SCL_C_RAM_FILTER_TYPE__SHIFT 0x10
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_MASK 0x3fff
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF__SHIFT 0x0
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_EN_MASK 0x8000
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_EN__SHIFT 0xf
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_MASK 0x3fff0000
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF__SHIFT 0x10
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_EN_MASK 0x80000000
+#define SCL_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_EN__SHIFT 0x1f
+#define SCL_MODE__SCL_MODE_MASK 0x3
+#define SCL_MODE__SCL_MODE__SHIFT 0x0
+#define SCL_MODE__SCL_PSCL_EN_MASK 0x10
+#define SCL_MODE__SCL_PSCL_EN__SHIFT 0x4
+#define SCL_TAP_CONTROL__SCL_V_NUM_OF_TAPS_MASK 0x7
+#define SCL_TAP_CONTROL__SCL_V_NUM_OF_TAPS__SHIFT 0x0
+#define SCL_TAP_CONTROL__SCL_H_NUM_OF_TAPS_MASK 0xf00
+#define SCL_TAP_CONTROL__SCL_H_NUM_OF_TAPS__SHIFT 0x8
+#define SCL_CONTROL__SCL_BOUNDARY_MODE_MASK 0x1
+#define SCL_CONTROL__SCL_BOUNDARY_MODE__SHIFT 0x0
+#define SCL_CONTROL__SCL_EARLY_EOL_MODE_MASK 0x10
+#define SCL_CONTROL__SCL_EARLY_EOL_MODE__SHIFT 0x4
+#define SCL_BYPASS_CONTROL__SCL_BYPASS_MODE_MASK 0x3
+#define SCL_BYPASS_CONTROL__SCL_BYPASS_MODE__SHIFT 0x0
+#define SCL_MANUAL_REPLICATE_CONTROL__SCL_V_MANUAL_REPLICATE_FACTOR_MASK 0xf
+#define SCL_MANUAL_REPLICATE_CONTROL__SCL_V_MANUAL_REPLICATE_FACTOR__SHIFT 0x0
+#define SCL_MANUAL_REPLICATE_CONTROL__SCL_H_MANUAL_REPLICATE_FACTOR_MASK 0xf00
+#define SCL_MANUAL_REPLICATE_CONTROL__SCL_H_MANUAL_REPLICATE_FACTOR__SHIFT 0x8
+#define SCL_AUTOMATIC_MODE_CONTROL__SCL_V_CALC_AUTO_RATIO_EN_MASK 0x1
+#define SCL_AUTOMATIC_MODE_CONTROL__SCL_V_CALC_AUTO_RATIO_EN__SHIFT 0x0
+#define SCL_AUTOMATIC_MODE_CONTROL__SCL_H_CALC_AUTO_RATIO_EN_MASK 0x10000
+#define SCL_AUTOMATIC_MODE_CONTROL__SCL_H_CALC_AUTO_RATIO_EN__SHIFT 0x10
+#define SCL_HORZ_FILTER_CONTROL__SCL_H_FILTER_PICK_NEAREST_MASK 0x1
+#define SCL_HORZ_FILTER_CONTROL__SCL_H_FILTER_PICK_NEAREST__SHIFT 0x0
+#define SCL_HORZ_FILTER_CONTROL__SCL_H_2TAP_HARDCODE_COEF_EN_MASK 0x100
+#define SCL_HORZ_FILTER_CONTROL__SCL_H_2TAP_HARDCODE_COEF_EN__SHIFT 0x8
+#define SCL_HORZ_FILTER_SCALE_RATIO__SCL_H_SCALE_RATIO_MASK 0x3ffffff
+#define SCL_HORZ_FILTER_SCALE_RATIO__SCL_H_SCALE_RATIO__SHIFT 0x0
+#define SCL_HORZ_FILTER_INIT__SCL_H_INIT_FRAC_MASK 0xffffff
+#define SCL_HORZ_FILTER_INIT__SCL_H_INIT_FRAC__SHIFT 0x0
+#define SCL_HORZ_FILTER_INIT__SCL_H_INIT_INT_MASK 0xf000000
+#define SCL_HORZ_FILTER_INIT__SCL_H_INIT_INT__SHIFT 0x18
+#define SCL_VERT_FILTER_CONTROL__SCL_V_FILTER_PICK_NEAREST_MASK 0x1
+#define SCL_VERT_FILTER_CONTROL__SCL_V_FILTER_PICK_NEAREST__SHIFT 0x0
+#define SCL_VERT_FILTER_CONTROL__SCL_V_2TAP_HARDCODE_COEF_EN_MASK 0x100
+#define SCL_VERT_FILTER_CONTROL__SCL_V_2TAP_HARDCODE_COEF_EN__SHIFT 0x8
+#define SCL_VERT_FILTER_SCALE_RATIO__SCL_V_SCALE_RATIO_MASK 0x3ffffff
+#define SCL_VERT_FILTER_SCALE_RATIO__SCL_V_SCALE_RATIO__SHIFT 0x0
+#define SCL_VERT_FILTER_INIT__SCL_V_INIT_FRAC_MASK 0xffffff
+#define SCL_VERT_FILTER_INIT__SCL_V_INIT_FRAC__SHIFT 0x0
+#define SCL_VERT_FILTER_INIT__SCL_V_INIT_INT_MASK 0x7000000
+#define SCL_VERT_FILTER_INIT__SCL_V_INIT_INT__SHIFT 0x18
+#define SCL_VERT_FILTER_INIT_BOT__SCL_V_INIT_FRAC_BOT_MASK 0xffffff
+#define SCL_VERT_FILTER_INIT_BOT__SCL_V_INIT_FRAC_BOT__SHIFT 0x0
+#define SCL_VERT_FILTER_INIT_BOT__SCL_V_INIT_INT_BOT_MASK 0x7000000
+#define SCL_VERT_FILTER_INIT_BOT__SCL_V_INIT_INT_BOT__SHIFT 0x18
+#define SCL_ROUND_OFFSET__SCL_ROUND_OFFSET_RGB_Y_MASK 0xffff
+#define SCL_ROUND_OFFSET__SCL_ROUND_OFFSET_RGB_Y__SHIFT 0x0
+#define SCL_ROUND_OFFSET__SCL_ROUND_OFFSET_CBCR_MASK 0xffff0000
+#define SCL_ROUND_OFFSET__SCL_ROUND_OFFSET_CBCR__SHIFT 0x10
+#define SCL_UPDATE__SCL_UPDATE_PENDING_MASK 0x1
+#define SCL_UPDATE__SCL_UPDATE_PENDING__SHIFT 0x0
+#define SCL_UPDATE__SCL_UPDATE_TAKEN_MASK 0x100
+#define SCL_UPDATE__SCL_UPDATE_TAKEN__SHIFT 0x8
+#define SCL_UPDATE__SCL_UPDATE_LOCK_MASK 0x10000
+#define SCL_UPDATE__SCL_UPDATE_LOCK__SHIFT 0x10
+#define SCL_UPDATE__SCL_COEF_UPDATE_COMPLETE_MASK 0x1000000
+#define SCL_UPDATE__SCL_COEF_UPDATE_COMPLETE__SHIFT 0x18
+#define SCL_F_SHARP_CONTROL__SCL_HF_SHARP_SCALE_FACTOR_MASK 0x7
+#define SCL_F_SHARP_CONTROL__SCL_HF_SHARP_SCALE_FACTOR__SHIFT 0x0
+#define SCL_F_SHARP_CONTROL__SCL_HF_SHARP_EN_MASK 0x10
+#define SCL_F_SHARP_CONTROL__SCL_HF_SHARP_EN__SHIFT 0x4
+#define SCL_F_SHARP_CONTROL__SCL_VF_SHARP_SCALE_FACTOR_MASK 0x700
+#define SCL_F_SHARP_CONTROL__SCL_VF_SHARP_SCALE_FACTOR__SHIFT 0x8
+#define SCL_F_SHARP_CONTROL__SCL_VF_SHARP_EN_MASK 0x1000
+#define SCL_F_SHARP_CONTROL__SCL_VF_SHARP_EN__SHIFT 0xc
+#define SCL_ALU_CONTROL__SCL_ALU_DISABLE_MASK 0x1
+#define SCL_ALU_CONTROL__SCL_ALU_DISABLE__SHIFT 0x0
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_FLAG_MASK 0x1
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_FLAG__SHIFT 0x0
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_ACK_MASK 0x100
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_ACK__SHIFT 0x8
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_MASK_MASK 0x1000
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_MASK__SHIFT 0xc
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_INT_STATUS_MASK 0x10000
+#define SCL_COEF_RAM_CONFLICT_STATUS__SCL_HOST_CONFLICT_INT_STATUS__SHIFT 0x10
+#define VIEWPORT_START_SECONDARY__VIEWPORT_Y_START_SECONDARY_MASK 0x3fff
+#define VIEWPORT_START_SECONDARY__VIEWPORT_Y_START_SECONDARY__SHIFT 0x0
+#define VIEWPORT_START_SECONDARY__VIEWPORT_X_START_SECONDARY_MASK 0x3fff0000
+#define VIEWPORT_START_SECONDARY__VIEWPORT_X_START_SECONDARY__SHIFT 0x10
+#define VIEWPORT_START__VIEWPORT_Y_START_MASK 0x3fff
+#define VIEWPORT_START__VIEWPORT_Y_START__SHIFT 0x0
+#define VIEWPORT_START__VIEWPORT_X_START_MASK 0x3fff0000
+#define VIEWPORT_START__VIEWPORT_X_START__SHIFT 0x10
+#define VIEWPORT_SIZE__VIEWPORT_HEIGHT_MASK 0x3fff
+#define VIEWPORT_SIZE__VIEWPORT_HEIGHT__SHIFT 0x0
+#define VIEWPORT_SIZE__VIEWPORT_WIDTH_MASK 0x3fff0000
+#define VIEWPORT_SIZE__VIEWPORT_WIDTH__SHIFT 0x10
+#define EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_RIGHT_MASK 0x1fff
+#define EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_RIGHT__SHIFT 0x0
+#define EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_LEFT_MASK 0x1fff0000
+#define EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_LEFT__SHIFT 0x10
+#define EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_BOTTOM_MASK 0x1fff
+#define EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_BOTTOM__SHIFT 0x0
+#define EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_TOP_MASK 0x1fff0000
+#define EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_TOP__SHIFT 0x10
+#define SCL_MODE_CHANGE_DET1__SCL_MODE_CHANGE_MASK 0x1
+#define SCL_MODE_CHANGE_DET1__SCL_MODE_CHANGE__SHIFT 0x0
+#define SCL_MODE_CHANGE_DET1__SCL_MODE_CHANGE_ACK_MASK 0x10
+#define SCL_MODE_CHANGE_DET1__SCL_MODE_CHANGE_ACK__SHIFT 0x4
+#define SCL_MODE_CHANGE_DET1__SCL_ALU_H_SCALE_RATIO_MASK 0xfffff80
+#define SCL_MODE_CHANGE_DET1__SCL_ALU_H_SCALE_RATIO__SHIFT 0x7
+#define SCL_MODE_CHANGE_DET2__SCL_ALU_V_SCALE_RATIO_MASK 0x1fffff
+#define SCL_MODE_CHANGE_DET2__SCL_ALU_V_SCALE_RATIO__SHIFT 0x0
+#define SCL_MODE_CHANGE_DET3__SCL_ALU_SOURCE_HEIGHT_MASK 0x3fff
+#define SCL_MODE_CHANGE_DET3__SCL_ALU_SOURCE_HEIGHT__SHIFT 0x0
+#define SCL_MODE_CHANGE_DET3__SCL_ALU_SOURCE_WIDTH_MASK 0x3fff0000
+#define SCL_MODE_CHANGE_DET3__SCL_ALU_SOURCE_WIDTH__SHIFT 0x10
+#define SCL_MODE_CHANGE_MASK__SCL_MODE_CHANGE_MASK_MASK 0x1
+#define SCL_MODE_CHANGE_MASK__SCL_MODE_CHANGE_MASK__SHIFT 0x0
+#define SCL_DEBUG2__SCL_DEBUG_REQ_MODE_MASK 0x1
+#define SCL_DEBUG2__SCL_DEBUG_REQ_MODE__SHIFT 0x0
+#define SCL_DEBUG2__SCL_DEBUG_EOF_MODE_MASK 0x6
+#define SCL_DEBUG2__SCL_DEBUG_EOF_MODE__SHIFT 0x1
+#define SCL_DEBUG2__SCL_DEBUG2_MASK 0xfffffff8
+#define SCL_DEBUG2__SCL_DEBUG2__SHIFT 0x3
+#define SCL_DEBUG__SCL_DEBUG_MASK 0xffffffff
+#define SCL_DEBUG__SCL_DEBUG__SHIFT 0x0
+#define SCL_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_INDEX_MASK 0xff
+#define SCL_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_INDEX__SHIFT 0x0
+#define SCL_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define SCL_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define SCL_TEST_DEBUG_DATA__SCL_TEST_DEBUG_DATA_MASK 0xffffffff
+#define SCL_TEST_DEBUG_DATA__SCL_TEST_DEBUG_DATA__SHIFT 0x0
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_TAP_PAIR_IDX_MASK 0x3
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_TAP_PAIR_IDX__SHIFT 0x0
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_PHASE_MASK 0x7f00
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_PHASE__SHIFT 0x8
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_FILTER_TYPE_MASK 0x30000
+#define SCLV_COEF_RAM_SELECT__SCL_C_RAM_FILTER_TYPE__SHIFT 0x10
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_MASK 0x3fff
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF__SHIFT 0x0
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_EN_MASK 0x8000
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_EVEN_TAP_COEF_EN__SHIFT 0xf
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_MASK 0x3fff0000
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF__SHIFT 0x10
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_EN_MASK 0x80000000
+#define SCLV_COEF_RAM_TAP_DATA__SCL_C_RAM_ODD_TAP_COEF_EN__SHIFT 0x1f
+#define SCLV_MODE__SCL_MODE_MASK 0x3
+#define SCLV_MODE__SCL_MODE__SHIFT 0x0
+#define SCLV_MODE__SCL_MODE_C_MASK 0xc
+#define SCLV_MODE__SCL_MODE_C__SHIFT 0x2
+#define SCLV_MODE__SCL_PSCL_EN_MASK 0x10
+#define SCLV_MODE__SCL_PSCL_EN__SHIFT 0x4
+#define SCLV_MODE__SCL_PSCL_EN_C_MASK 0x20
+#define SCLV_MODE__SCL_PSCL_EN_C__SHIFT 0x5
+#define SCLV_MODE__SCL_INTERLACE_SOURCE_MASK 0x300
+#define SCLV_MODE__SCL_INTERLACE_SOURCE__SHIFT 0x8
+#define SCLV_TAP_CONTROL__SCL_V_NUM_OF_TAPS_MASK 0x7
+#define SCLV_TAP_CONTROL__SCL_V_NUM_OF_TAPS__SHIFT 0x0
+#define SCLV_TAP_CONTROL__SCL_H_NUM_OF_TAPS_MASK 0x70
+#define SCLV_TAP_CONTROL__SCL_H_NUM_OF_TAPS__SHIFT 0x4
+#define SCLV_TAP_CONTROL__SCL_V_NUM_OF_TAPS_C_MASK 0x700
+#define SCLV_TAP_CONTROL__SCL_V_NUM_OF_TAPS_C__SHIFT 0x8
+#define SCLV_TAP_CONTROL__SCL_H_NUM_OF_TAPS_C_MASK 0x7000
+#define SCLV_TAP_CONTROL__SCL_H_NUM_OF_TAPS_C__SHIFT 0xc
+#define SCLV_CONTROL__SCL_BOUNDARY_MODE_MASK 0x1
+#define SCLV_CONTROL__SCL_BOUNDARY_MODE__SHIFT 0x0
+#define SCLV_CONTROL__SCL_EARLY_EOL_MODE_MASK 0x10
+#define SCLV_CONTROL__SCL_EARLY_EOL_MODE__SHIFT 0x4
+#define SCLV_CONTROL__SCL_TOTAL_PHASE_MASK 0x100
+#define SCLV_CONTROL__SCL_TOTAL_PHASE__SHIFT 0x8
+#define SCLV_MANUAL_REPLICATE_CONTROL__SCL_V_MANUAL_REPLICATE_FACTOR_MASK 0xf
+#define SCLV_MANUAL_REPLICATE_CONTROL__SCL_V_MANUAL_REPLICATE_FACTOR__SHIFT 0x0
+#define SCLV_MANUAL_REPLICATE_CONTROL__SCL_H_MANUAL_REPLICATE_FACTOR_MASK 0xf00
+#define SCLV_MANUAL_REPLICATE_CONTROL__SCL_H_MANUAL_REPLICATE_FACTOR__SHIFT 0x8
+#define SCLV_AUTOMATIC_MODE_CONTROL__SCL_V_CALC_AUTO_RATIO_EN_MASK 0x1
+#define SCLV_AUTOMATIC_MODE_CONTROL__SCL_V_CALC_AUTO_RATIO_EN__SHIFT 0x0
+#define SCLV_AUTOMATIC_MODE_CONTROL__SCL_H_CALC_AUTO_RATIO_EN_MASK 0x10000
+#define SCLV_AUTOMATIC_MODE_CONTROL__SCL_H_CALC_AUTO_RATIO_EN__SHIFT 0x10
+#define SCLV_HORZ_FILTER_CONTROL__SCL_H_2TAP_HARDCODE_COEF_EN_MASK 0x100
+#define SCLV_HORZ_FILTER_CONTROL__SCL_H_2TAP_HARDCODE_COEF_EN__SHIFT 0x8
+#define SCLV_HORZ_FILTER_SCALE_RATIO__SCL_H_SCALE_RATIO_MASK 0x3ffffff
+#define SCLV_HORZ_FILTER_SCALE_RATIO__SCL_H_SCALE_RATIO__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT__SCL_H_INIT_FRAC_MASK 0xffffff
+#define SCLV_HORZ_FILTER_INIT__SCL_H_INIT_FRAC__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT__SCL_H_INIT_INT_MASK 0xf000000
+#define SCLV_HORZ_FILTER_INIT__SCL_H_INIT_INT__SHIFT 0x18
+#define SCLV_HORZ_FILTER_SCALE_RATIO_C__SCL_H_SCALE_RATIO_C_MASK 0x3ffffff
+#define SCLV_HORZ_FILTER_SCALE_RATIO_C__SCL_H_SCALE_RATIO_C__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT_C__SCL_H_INIT_FRAC_C_MASK 0xffffff
+#define SCLV_HORZ_FILTER_INIT_C__SCL_H_INIT_FRAC_C__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT_C__SCL_H_INIT_INT_C_MASK 0xf000000
+#define SCLV_HORZ_FILTER_INIT_C__SCL_H_INIT_INT_C__SHIFT 0x18
+#define SCLV_VERT_FILTER_CONTROL__SCL_V_2TAP_HARDCODE_COEF_EN_MASK 0x100
+#define SCLV_VERT_FILTER_CONTROL__SCL_V_2TAP_HARDCODE_COEF_EN__SHIFT 0x8
+#define SCLV_VERT_FILTER_SCALE_RATIO__SCL_V_SCALE_RATIO_MASK 0x3ffffff
+#define SCLV_VERT_FILTER_SCALE_RATIO__SCL_V_SCALE_RATIO__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT__SCL_V_INIT_FRAC_MASK 0xffffff
+#define SCLV_VERT_FILTER_INIT__SCL_V_INIT_FRAC__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT__SCL_V_INIT_INT_MASK 0x7000000
+#define SCLV_VERT_FILTER_INIT__SCL_V_INIT_INT__SHIFT 0x18
+#define SCLV_VERT_FILTER_INIT_BOT__SCL_V_INIT_FRAC_BOT_MASK 0xffffff
+#define SCLV_VERT_FILTER_INIT_BOT__SCL_V_INIT_FRAC_BOT__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT_BOT__SCL_V_INIT_INT_BOT_MASK 0x7000000
+#define SCLV_VERT_FILTER_INIT_BOT__SCL_V_INIT_INT_BOT__SHIFT 0x18
+#define SCLV_VERT_FILTER_SCALE_RATIO_C__SCL_V_SCALE_RATIO_C_MASK 0x3ffffff
+#define SCLV_VERT_FILTER_SCALE_RATIO_C__SCL_V_SCALE_RATIO_C__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT_C__SCL_V_INIT_FRAC_C_MASK 0xffffff
+#define SCLV_VERT_FILTER_INIT_C__SCL_V_INIT_FRAC_C__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT_C__SCL_V_INIT_INT_C_MASK 0x7000000
+#define SCLV_VERT_FILTER_INIT_C__SCL_V_INIT_INT_C__SHIFT 0x18
+#define SCLV_VERT_FILTER_INIT_BOT_C__SCL_V_INIT_FRAC_BOT_C_MASK 0xffffff
+#define SCLV_VERT_FILTER_INIT_BOT_C__SCL_V_INIT_FRAC_BOT_C__SHIFT 0x0
+#define SCLV_VERT_FILTER_INIT_BOT_C__SCL_V_INIT_INT_BOT_C_MASK 0x7000000
+#define SCLV_VERT_FILTER_INIT_BOT_C__SCL_V_INIT_INT_BOT_C__SHIFT 0x18
+#define SCLV_ROUND_OFFSET__SCL_ROUND_OFFSET_RGB_Y_MASK 0xffff
+#define SCLV_ROUND_OFFSET__SCL_ROUND_OFFSET_RGB_Y__SHIFT 0x0
+#define SCLV_ROUND_OFFSET__SCL_ROUND_OFFSET_CBCR_MASK 0xffff0000
+#define SCLV_ROUND_OFFSET__SCL_ROUND_OFFSET_CBCR__SHIFT 0x10
+#define SCLV_UPDATE__SCL_UPDATE_PENDING_MASK 0x1
+#define SCLV_UPDATE__SCL_UPDATE_PENDING__SHIFT 0x0
+#define SCLV_UPDATE__SCL_UPDATE_TAKEN_MASK 0x100
+#define SCLV_UPDATE__SCL_UPDATE_TAKEN__SHIFT 0x8
+#define SCLV_UPDATE__SCL_UPDATE_LOCK_MASK 0x10000
+#define SCLV_UPDATE__SCL_UPDATE_LOCK__SHIFT 0x10
+#define SCLV_UPDATE__SCL_COEF_UPDATE_COMPLETE_MASK 0x1000000
+#define SCLV_UPDATE__SCL_COEF_UPDATE_COMPLETE__SHIFT 0x18
+#define SCLV_ALU_CONTROL__SCL_ALU_DISABLE_MASK 0x1
+#define SCLV_ALU_CONTROL__SCL_ALU_DISABLE__SHIFT 0x0
+#define SCLV_VIEWPORT_START__VIEWPORT_Y_START_MASK 0x3fff
+#define SCLV_VIEWPORT_START__VIEWPORT_Y_START__SHIFT 0x0
+#define SCLV_VIEWPORT_START__VIEWPORT_X_START_MASK 0x3fff0000
+#define SCLV_VIEWPORT_START__VIEWPORT_X_START__SHIFT 0x10
+#define SCLV_VIEWPORT_START_SECONDARY__VIEWPORT_Y_START_SECONDARY_MASK 0x3fff
+#define SCLV_VIEWPORT_START_SECONDARY__VIEWPORT_Y_START_SECONDARY__SHIFT 0x0
+#define SCLV_VIEWPORT_START_SECONDARY__VIEWPORT_X_START_SECONDARY_MASK 0x3fff0000
+#define SCLV_VIEWPORT_START_SECONDARY__VIEWPORT_X_START_SECONDARY__SHIFT 0x10
+#define SCLV_VIEWPORT_SIZE__VIEWPORT_HEIGHT_MASK 0x1fff
+#define SCLV_VIEWPORT_SIZE__VIEWPORT_HEIGHT__SHIFT 0x0
+#define SCLV_VIEWPORT_SIZE__VIEWPORT_WIDTH_MASK 0x1fff0000
+#define SCLV_VIEWPORT_SIZE__VIEWPORT_WIDTH__SHIFT 0x10
+#define SCLV_VIEWPORT_START_C__VIEWPORT_Y_START_C_MASK 0x3fff
+#define SCLV_VIEWPORT_START_C__VIEWPORT_Y_START_C__SHIFT 0x0
+#define SCLV_VIEWPORT_START_C__VIEWPORT_X_START_C_MASK 0x3fff0000
+#define SCLV_VIEWPORT_START_C__VIEWPORT_X_START_C__SHIFT 0x10
+#define SCLV_VIEWPORT_START_SECONDARY_C__VIEWPORT_Y_START_SECONDARY_C_MASK 0x3fff
+#define SCLV_VIEWPORT_START_SECONDARY_C__VIEWPORT_Y_START_SECONDARY_C__SHIFT 0x0
+#define SCLV_VIEWPORT_START_SECONDARY_C__VIEWPORT_X_START_SECONDARY_C_MASK 0x3fff0000
+#define SCLV_VIEWPORT_START_SECONDARY_C__VIEWPORT_X_START_SECONDARY_C__SHIFT 0x10
+#define SCLV_VIEWPORT_SIZE_C__VIEWPORT_HEIGHT_C_MASK 0x1fff
+#define SCLV_VIEWPORT_SIZE_C__VIEWPORT_HEIGHT_C__SHIFT 0x0
+#define SCLV_VIEWPORT_SIZE_C__VIEWPORT_WIDTH_C_MASK 0x1fff0000
+#define SCLV_VIEWPORT_SIZE_C__VIEWPORT_WIDTH_C__SHIFT 0x10
+#define SCLV_EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_RIGHT_MASK 0x1fff
+#define SCLV_EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_RIGHT__SHIFT 0x0
+#define SCLV_EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_LEFT_MASK 0x1fff0000
+#define SCLV_EXT_OVERSCAN_LEFT_RIGHT__EXT_OVERSCAN_LEFT__SHIFT 0x10
+#define SCLV_EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_BOTTOM_MASK 0x1fff
+#define SCLV_EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_BOTTOM__SHIFT 0x0
+#define SCLV_EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_TOP_MASK 0x1fff0000
+#define SCLV_EXT_OVERSCAN_TOP_BOTTOM__EXT_OVERSCAN_TOP__SHIFT 0x10
+#define SCLV_MODE_CHANGE_DET1__SCL_MODE_CHANGE_MASK 0x1
+#define SCLV_MODE_CHANGE_DET1__SCL_MODE_CHANGE__SHIFT 0x0
+#define SCLV_MODE_CHANGE_DET1__SCL_MODE_CHANGE_ACK_MASK 0x10
+#define SCLV_MODE_CHANGE_DET1__SCL_MODE_CHANGE_ACK__SHIFT 0x4
+#define SCLV_MODE_CHANGE_DET1__SCL_ALU_H_SCALE_RATIO_MASK 0xfffff80
+#define SCLV_MODE_CHANGE_DET1__SCL_ALU_H_SCALE_RATIO__SHIFT 0x7
+#define SCLV_MODE_CHANGE_DET2__SCL_ALU_V_SCALE_RATIO_MASK 0x1fffff
+#define SCLV_MODE_CHANGE_DET2__SCL_ALU_V_SCALE_RATIO__SHIFT 0x0
+#define SCLV_MODE_CHANGE_DET3__SCL_ALU_SOURCE_HEIGHT_MASK 0x3fff
+#define SCLV_MODE_CHANGE_DET3__SCL_ALU_SOURCE_HEIGHT__SHIFT 0x0
+#define SCLV_MODE_CHANGE_DET3__SCL_ALU_SOURCE_WIDTH_MASK 0x3fff0000
+#define SCLV_MODE_CHANGE_DET3__SCL_ALU_SOURCE_WIDTH__SHIFT 0x10
+#define SCLV_MODE_CHANGE_MASK__SCL_MODE_CHANGE_MASK_MASK 0x1
+#define SCLV_MODE_CHANGE_MASK__SCL_MODE_CHANGE_MASK__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT_BOT__SCL_H_INIT_FRAC_BOT_MASK 0xffffff
+#define SCLV_HORZ_FILTER_INIT_BOT__SCL_H_INIT_FRAC_BOT__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT_BOT__SCL_H_INIT_INT_BOT_MASK 0xf000000
+#define SCLV_HORZ_FILTER_INIT_BOT__SCL_H_INIT_INT_BOT__SHIFT 0x18
+#define SCLV_HORZ_FILTER_INIT_BOT_C__SCL_H_INIT_FRAC_BOT_C_MASK 0xffffff
+#define SCLV_HORZ_FILTER_INIT_BOT_C__SCL_H_INIT_FRAC_BOT_C__SHIFT 0x0
+#define SCLV_HORZ_FILTER_INIT_BOT_C__SCL_H_INIT_INT_BOT_C_MASK 0xf000000
+#define SCLV_HORZ_FILTER_INIT_BOT_C__SCL_H_INIT_INT_BOT_C__SHIFT 0x18
+#define SCLV_DEBUG2__SCL_DEBUG_REQ_MODE_MASK 0x1
+#define SCLV_DEBUG2__SCL_DEBUG_REQ_MODE__SHIFT 0x0
+#define SCLV_DEBUG2__SCL_DEBUG_EOF_MODE_MASK 0x6
+#define SCLV_DEBUG2__SCL_DEBUG_EOF_MODE__SHIFT 0x1
+#define SCLV_DEBUG2__SCL_DEBUG2_MASK 0xfffffff8
+#define SCLV_DEBUG2__SCL_DEBUG2__SHIFT 0x3
+#define SCLV_DEBUG__SCL_DEBUG_MASK 0xffffffff
+#define SCLV_DEBUG__SCL_DEBUG__SHIFT 0x0
+#define SCLV_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_INDEX_MASK 0xff
+#define SCLV_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_INDEX__SHIFT 0x0
+#define SCLV_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define SCLV_TEST_DEBUG_INDEX__SCL_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define SCLV_TEST_DEBUG_DATA__SCL_TEST_DEBUG_DATA_MASK 0xffffffff
+#define SCLV_TEST_DEBUG_DATA__SCL_TEST_DEBUG_DATA__SHIFT 0x0
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_PENDING_MASK 0x1
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_PENDING__SHIFT 0x0
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_TAKEN_MASK 0x2
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_TAKEN__SHIFT 0x1
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_LOCK_MASK 0x10000
+#define COL_MAN_UPDATE__COL_MAN_UPDATE_LOCK__SHIFT 0x10
+#define COL_MAN_UPDATE__COL_MAN_DISABLE_MULTIPLE_UPDATE_MASK 0x1000000
+#define COL_MAN_UPDATE__COL_MAN_DISABLE_MULTIPLE_UPDATE__SHIFT 0x18
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_MODE_MASK 0x3
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_MODE__SHIFT 0x0
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_INPUT_TYPE_MASK 0x300
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_INPUT_TYPE__SHIFT 0x8
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_CONVERSION_MODE_MASK 0x10000
+#define COL_MAN_INPUT_CSC_CONTROL__INPUT_CSC_CONVERSION_MODE__SHIFT 0x10
+#define INPUT_CSC_C11_C12_A__INPUT_CSC_C11_A_MASK 0xffff
+#define INPUT_CSC_C11_C12_A__INPUT_CSC_C11_A__SHIFT 0x0
+#define INPUT_CSC_C11_C12_A__INPUT_CSC_C12_A_MASK 0xffff0000
+#define INPUT_CSC_C11_C12_A__INPUT_CSC_C12_A__SHIFT 0x10
+#define INPUT_CSC_C13_C14_A__INPUT_CSC_C13_A_MASK 0xffff
+#define INPUT_CSC_C13_C14_A__INPUT_CSC_C13_A__SHIFT 0x0
+#define INPUT_CSC_C13_C14_A__INPUT_CSC_C14_A_MASK 0xffff0000
+#define INPUT_CSC_C13_C14_A__INPUT_CSC_C14_A__SHIFT 0x10
+#define INPUT_CSC_C21_C22_A__INPUT_CSC_C21_A_MASK 0xffff
+#define INPUT_CSC_C21_C22_A__INPUT_CSC_C21_A__SHIFT 0x0
+#define INPUT_CSC_C21_C22_A__INPUT_CSC_C22_A_MASK 0xffff0000
+#define INPUT_CSC_C21_C22_A__INPUT_CSC_C22_A__SHIFT 0x10
+#define INPUT_CSC_C23_C24_A__INPUT_CSC_C23_A_MASK 0xffff
+#define INPUT_CSC_C23_C24_A__INPUT_CSC_C23_A__SHIFT 0x0
+#define INPUT_CSC_C23_C24_A__INPUT_CSC_C24_A_MASK 0xffff0000
+#define INPUT_CSC_C23_C24_A__INPUT_CSC_C24_A__SHIFT 0x10
+#define INPUT_CSC_C31_C32_A__INPUT_CSC_C31_A_MASK 0xffff
+#define INPUT_CSC_C31_C32_A__INPUT_CSC_C31_A__SHIFT 0x0
+#define INPUT_CSC_C31_C32_A__INPUT_CSC_C32_A_MASK 0xffff0000
+#define INPUT_CSC_C31_C32_A__INPUT_CSC_C32_A__SHIFT 0x10
+#define INPUT_CSC_C33_C34_A__INPUT_CSC_C33_A_MASK 0xffff
+#define INPUT_CSC_C33_C34_A__INPUT_CSC_C33_A__SHIFT 0x0
+#define INPUT_CSC_C33_C34_A__INPUT_CSC_C34_A_MASK 0xffff0000
+#define INPUT_CSC_C33_C34_A__INPUT_CSC_C34_A__SHIFT 0x10
+#define INPUT_CSC_C11_C12_B__INPUT_CSC_C11_B_MASK 0xffff
+#define INPUT_CSC_C11_C12_B__INPUT_CSC_C11_B__SHIFT 0x0
+#define INPUT_CSC_C11_C12_B__INPUT_CSC_C12_B_MASK 0xffff0000
+#define INPUT_CSC_C11_C12_B__INPUT_CSC_C12_B__SHIFT 0x10
+#define INPUT_CSC_C13_C14_B__INPUT_CSC_C13_B_MASK 0xffff
+#define INPUT_CSC_C13_C14_B__INPUT_CSC_C13_B__SHIFT 0x0
+#define INPUT_CSC_C13_C14_B__INPUT_CSC_C14_B_MASK 0xffff0000
+#define INPUT_CSC_C13_C14_B__INPUT_CSC_C14_B__SHIFT 0x10
+#define INPUT_CSC_C21_C22_B__INPUT_CSC_C21_B_MASK 0xffff
+#define INPUT_CSC_C21_C22_B__INPUT_CSC_C21_B__SHIFT 0x0
+#define INPUT_CSC_C21_C22_B__INPUT_CSC_C22_B_MASK 0xffff0000
+#define INPUT_CSC_C21_C22_B__INPUT_CSC_C22_B__SHIFT 0x10
+#define INPUT_CSC_C23_C24_B__INPUT_CSC_C23_B_MASK 0xffff
+#define INPUT_CSC_C23_C24_B__INPUT_CSC_C23_B__SHIFT 0x0
+#define INPUT_CSC_C23_C24_B__INPUT_CSC_C24_B_MASK 0xffff0000
+#define INPUT_CSC_C23_C24_B__INPUT_CSC_C24_B__SHIFT 0x10
+#define INPUT_CSC_C31_C32_B__INPUT_CSC_C31_B_MASK 0xffff
+#define INPUT_CSC_C31_C32_B__INPUT_CSC_C31_B__SHIFT 0x0
+#define INPUT_CSC_C31_C32_B__INPUT_CSC_C32_B_MASK 0xffff0000
+#define INPUT_CSC_C31_C32_B__INPUT_CSC_C32_B__SHIFT 0x10
+#define INPUT_CSC_C33_C34_B__INPUT_CSC_C33_B_MASK 0xffff
+#define INPUT_CSC_C33_C34_B__INPUT_CSC_C33_B__SHIFT 0x0
+#define INPUT_CSC_C33_C34_B__INPUT_CSC_C34_B_MASK 0xffff0000
+#define INPUT_CSC_C33_C34_B__INPUT_CSC_C34_B__SHIFT 0x10
+#define PRESCALE_CONTROL__PRESCALE_MODE_MASK 0x3
+#define PRESCALE_CONTROL__PRESCALE_MODE__SHIFT 0x0
+#define PRESCALE_VALUES_R__PRESCALE_BIAS_R_MASK 0xffff
+#define PRESCALE_VALUES_R__PRESCALE_BIAS_R__SHIFT 0x0
+#define PRESCALE_VALUES_R__PRESCALE_SCALE_R_MASK 0xffff0000
+#define PRESCALE_VALUES_R__PRESCALE_SCALE_R__SHIFT 0x10
+#define PRESCALE_VALUES_G__PRESCALE_BIAS_G_MASK 0xffff
+#define PRESCALE_VALUES_G__PRESCALE_BIAS_G__SHIFT 0x0
+#define PRESCALE_VALUES_G__PRESCALE_SCALE_G_MASK 0xffff0000
+#define PRESCALE_VALUES_G__PRESCALE_SCALE_G__SHIFT 0x10
+#define PRESCALE_VALUES_B__PRESCALE_BIAS_B_MASK 0xffff
+#define PRESCALE_VALUES_B__PRESCALE_BIAS_B__SHIFT 0x0
+#define PRESCALE_VALUES_B__PRESCALE_SCALE_B_MASK 0xffff0000
+#define PRESCALE_VALUES_B__PRESCALE_SCALE_B__SHIFT 0x10
+#define COL_MAN_OUTPUT_CSC_CONTROL__OUTPUT_CSC_MODE_MASK 0x7
+#define COL_MAN_OUTPUT_CSC_CONTROL__OUTPUT_CSC_MODE__SHIFT 0x0
+#define OUTPUT_CSC_C11_C12_A__OUTPUT_CSC_C11_A_MASK 0xffff
+#define OUTPUT_CSC_C11_C12_A__OUTPUT_CSC_C11_A__SHIFT 0x0
+#define OUTPUT_CSC_C11_C12_A__OUTPUT_CSC_C12_A_MASK 0xffff0000
+#define OUTPUT_CSC_C11_C12_A__OUTPUT_CSC_C12_A__SHIFT 0x10
+#define OUTPUT_CSC_C13_C14_A__OUTPUT_CSC_C13_A_MASK 0xffff
+#define OUTPUT_CSC_C13_C14_A__OUTPUT_CSC_C13_A__SHIFT 0x0
+#define OUTPUT_CSC_C13_C14_A__OUTPUT_CSC_C14_A_MASK 0xffff0000
+#define OUTPUT_CSC_C13_C14_A__OUTPUT_CSC_C14_A__SHIFT 0x10
+#define OUTPUT_CSC_C21_C22_A__OUTPUT_CSC_C21_A_MASK 0xffff
+#define OUTPUT_CSC_C21_C22_A__OUTPUT_CSC_C21_A__SHIFT 0x0
+#define OUTPUT_CSC_C21_C22_A__OUTPUT_CSC_C22_A_MASK 0xffff0000
+#define OUTPUT_CSC_C21_C22_A__OUTPUT_CSC_C22_A__SHIFT 0x10
+#define OUTPUT_CSC_C23_C24_A__OUTPUT_CSC_C23_A_MASK 0xffff
+#define OUTPUT_CSC_C23_C24_A__OUTPUT_CSC_C23_A__SHIFT 0x0
+#define OUTPUT_CSC_C23_C24_A__OUTPUT_CSC_C24_A_MASK 0xffff0000
+#define OUTPUT_CSC_C23_C24_A__OUTPUT_CSC_C24_A__SHIFT 0x10
+#define OUTPUT_CSC_C31_C32_A__OUTPUT_CSC_C31_A_MASK 0xffff
+#define OUTPUT_CSC_C31_C32_A__OUTPUT_CSC_C31_A__SHIFT 0x0
+#define OUTPUT_CSC_C31_C32_A__OUTPUT_CSC_C32_A_MASK 0xffff0000
+#define OUTPUT_CSC_C31_C32_A__OUTPUT_CSC_C32_A__SHIFT 0x10
+#define OUTPUT_CSC_C33_C34_A__OUTPUT_CSC_C33_A_MASK 0xffff
+#define OUTPUT_CSC_C33_C34_A__OUTPUT_CSC_C33_A__SHIFT 0x0
+#define OUTPUT_CSC_C33_C34_A__OUTPUT_CSC_C34_A_MASK 0xffff0000
+#define OUTPUT_CSC_C33_C34_A__OUTPUT_CSC_C34_A__SHIFT 0x10
+#define OUTPUT_CSC_C11_C12_B__OUTPUT_CSC_C11_B_MASK 0xffff
+#define OUTPUT_CSC_C11_C12_B__OUTPUT_CSC_C11_B__SHIFT 0x0
+#define OUTPUT_CSC_C11_C12_B__OUTPUT_CSC_C12_B_MASK 0xffff0000
+#define OUTPUT_CSC_C11_C12_B__OUTPUT_CSC_C12_B__SHIFT 0x10
+#define OUTPUT_CSC_C13_C14_B__OUTPUT_CSC_C13_B_MASK 0xffff
+#define OUTPUT_CSC_C13_C14_B__OUTPUT_CSC_C13_B__SHIFT 0x0
+#define OUTPUT_CSC_C13_C14_B__OUTPUT_CSC_C14_B_MASK 0xffff0000
+#define OUTPUT_CSC_C13_C14_B__OUTPUT_CSC_C14_B__SHIFT 0x10
+#define OUTPUT_CSC_C21_C22_B__OUTPUT_CSC_C21_B_MASK 0xffff
+#define OUTPUT_CSC_C21_C22_B__OUTPUT_CSC_C21_B__SHIFT 0x0
+#define OUTPUT_CSC_C21_C22_B__OUTPUT_CSC_C22_B_MASK 0xffff0000
+#define OUTPUT_CSC_C21_C22_B__OUTPUT_CSC_C22_B__SHIFT 0x10
+#define OUTPUT_CSC_C23_C24_B__OUTPUT_CSC_C23_B_MASK 0xffff
+#define OUTPUT_CSC_C23_C24_B__OUTPUT_CSC_C23_B__SHIFT 0x0
+#define OUTPUT_CSC_C23_C24_B__OUTPUT_CSC_C24_B_MASK 0xffff0000
+#define OUTPUT_CSC_C23_C24_B__OUTPUT_CSC_C24_B__SHIFT 0x10
+#define OUTPUT_CSC_C31_C32_B__OUTPUT_CSC_C31_B_MASK 0xffff
+#define OUTPUT_CSC_C31_C32_B__OUTPUT_CSC_C31_B__SHIFT 0x0
+#define OUTPUT_CSC_C31_C32_B__OUTPUT_CSC_C32_B_MASK 0xffff0000
+#define OUTPUT_CSC_C31_C32_B__OUTPUT_CSC_C32_B__SHIFT 0x10
+#define OUTPUT_CSC_C33_C34_B__OUTPUT_CSC_C33_B_MASK 0xffff
+#define OUTPUT_CSC_C33_C34_B__OUTPUT_CSC_C33_B__SHIFT 0x0
+#define OUTPUT_CSC_C33_C34_B__OUTPUT_CSC_C34_B_MASK 0xffff0000
+#define OUTPUT_CSC_C33_C34_B__OUTPUT_CSC_C34_B__SHIFT 0x10
+#define DENORM_CLAMP_CONTROL__DENORM_MODE_MASK 0x3
+#define DENORM_CLAMP_CONTROL__DENORM_MODE__SHIFT 0x0
+#define DENORM_CLAMP_CONTROL__DENORM_10BIT_OUT_MASK 0x100
+#define DENORM_CLAMP_CONTROL__DENORM_10BIT_OUT__SHIFT 0x8
+#define DENORM_CLAMP_RANGE_R_CR__RANGE_CLAMP_MAX_R_CR_MASK 0xfff
+#define DENORM_CLAMP_RANGE_R_CR__RANGE_CLAMP_MAX_R_CR__SHIFT 0x0
+#define DENORM_CLAMP_RANGE_R_CR__RANGE_CLAMP_MIN_R_CR_MASK 0xfff000
+#define DENORM_CLAMP_RANGE_R_CR__RANGE_CLAMP_MIN_R_CR__SHIFT 0xc
+#define DENORM_CLAMP_RANGE_G_Y__RANGE_CLAMP_MAX_G_Y_MASK 0xfff
+#define DENORM_CLAMP_RANGE_G_Y__RANGE_CLAMP_MAX_G_Y__SHIFT 0x0
+#define DENORM_CLAMP_RANGE_G_Y__RANGE_CLAMP_MIN_G_Y_MASK 0xfff000
+#define DENORM_CLAMP_RANGE_G_Y__RANGE_CLAMP_MIN_G_Y__SHIFT 0xc
+#define DENORM_CLAMP_RANGE_B_CB__RANGE_CLAMP_MAX_B_CB_MASK 0xfff
+#define DENORM_CLAMP_RANGE_B_CB__RANGE_CLAMP_MAX_B_CB__SHIFT 0x0
+#define DENORM_CLAMP_RANGE_B_CB__RANGE_CLAMP_MIN_B_CB_MASK 0xfff000
+#define DENORM_CLAMP_RANGE_B_CB__RANGE_CLAMP_MIN_B_CB__SHIFT 0xc
+#define COL_MAN_FP_CONVERTED_FIELD__COL_MAN_FP_CONVERTED_FIELD_DATA_MASK 0x3ffff
+#define COL_MAN_FP_CONVERTED_FIELD__COL_MAN_FP_CONVERTED_FIELD_DATA__SHIFT 0x0
+#define COL_MAN_FP_CONVERTED_FIELD__COL_MAN_FP_CONVERTED_FIELD_INDEX_MASK 0x3f00000
+#define COL_MAN_FP_CONVERTED_FIELD__COL_MAN_FP_CONVERTED_FIELD_INDEX__SHIFT 0x14
+#define GAMMA_CORR_CONTROL__GAMMA_CORR_MODE_MASK 0x3
+#define GAMMA_CORR_CONTROL__GAMMA_CORR_MODE__SHIFT 0x0
+#define GAMMA_CORR_LUT_INDEX__GAMMA_CORR_LUT_INDEX_MASK 0xff
+#define GAMMA_CORR_LUT_INDEX__GAMMA_CORR_LUT_INDEX__SHIFT 0x0
+#define GAMMA_CORR_LUT_DATA__GAMMA_CORR_LUT_DATA_MASK 0x7ffff
+#define GAMMA_CORR_LUT_DATA__GAMMA_CORR_LUT_DATA__SHIFT 0x0
+#define GAMMA_CORR_LUT_WRITE_EN_MASK__GAMMA_CORR_LUT_WRITE_EN_MASK_MASK 0x7
+#define GAMMA_CORR_LUT_WRITE_EN_MASK__GAMMA_CORR_LUT_WRITE_EN_MASK__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_START_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_START_MASK 0x3ffff
+#define GAMMA_CORR_CNTLA_START_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_START__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_START_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_START_SEGMENT_MASK 0x7f00000
+#define GAMMA_CORR_CNTLA_START_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_START_SEGMENT__SHIFT 0x14
+#define GAMMA_CORR_CNTLA_SLOPE_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_LINEAR_SLOPE_MASK 0x3ffff
+#define GAMMA_CORR_CNTLA_SLOPE_CNTL__GAMMA_CORR_CNTLA_EXP_REGION_LINEAR_SLOPE__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_END_CNTL1__GAMMA_CORR_CNTLA_EXP_REGION_END_MASK 0xffff
+#define GAMMA_CORR_CNTLA_END_CNTL1__GAMMA_CORR_CNTLA_EXP_REGION_END__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_END_CNTL2__GAMMA_CORR_CNTLA_EXP_REGION_END_SLOPE_MASK 0xffff
+#define GAMMA_CORR_CNTLA_END_CNTL2__GAMMA_CORR_CNTLA_EXP_REGION_END_SLOPE__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_END_CNTL2__GAMMA_CORR_CNTLA_EXP_REGION_END_BASE_MASK 0xffff0000
+#define GAMMA_CORR_CNTLA_END_CNTL2__GAMMA_CORR_CNTLA_EXP_REGION_END_BASE__SHIFT 0x10
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION0_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION0_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION0_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION0_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION1_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION1_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION1_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_0_1__GAMMA_CORR_CNTLA_EXP_REGION1_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION2_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION2_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION2_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION2_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION3_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION3_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION3_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_2_3__GAMMA_CORR_CNTLA_EXP_REGION3_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION4_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION4_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION4_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION4_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION5_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION5_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION5_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_4_5__GAMMA_CORR_CNTLA_EXP_REGION5_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION6_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION6_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION6_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION6_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION7_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION7_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION7_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_6_7__GAMMA_CORR_CNTLA_EXP_REGION7_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION8_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION8_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION8_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION8_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION9_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION9_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION9_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_8_9__GAMMA_CORR_CNTLA_EXP_REGION9_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION10_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION10_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION10_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION10_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION11_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION11_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION11_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_10_11__GAMMA_CORR_CNTLA_EXP_REGION11_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION12_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION12_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION12_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION12_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION13_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION13_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION13_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_12_13__GAMMA_CORR_CNTLA_EXP_REGION13_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION14_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION14_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION14_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION14_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION15_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION15_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION15_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLA_REGION_14_15__GAMMA_CORR_CNTLA_EXP_REGION15_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_START_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_START_MASK 0x3ffff
+#define GAMMA_CORR_CNTLB_START_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_START__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_START_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_START_SEGMENT_MASK 0x7f00000
+#define GAMMA_CORR_CNTLB_START_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_START_SEGMENT__SHIFT 0x14
+#define GAMMA_CORR_CNTLB_SLOPE_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_LINEAR_SLOPE_MASK 0x3ffff
+#define GAMMA_CORR_CNTLB_SLOPE_CNTL__GAMMA_CORR_CNTLB_EXP_REGION_LINEAR_SLOPE__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_END_CNTL1__GAMMA_CORR_CNTLB_EXP_REGION_END_MASK 0xffff
+#define GAMMA_CORR_CNTLB_END_CNTL1__GAMMA_CORR_CNTLB_EXP_REGION_END__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_END_CNTL2__GAMMA_CORR_CNTLB_EXP_REGION_END_SLOPE_MASK 0xffff
+#define GAMMA_CORR_CNTLB_END_CNTL2__GAMMA_CORR_CNTLB_EXP_REGION_END_SLOPE__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_END_CNTL2__GAMMA_CORR_CNTLB_EXP_REGION_END_BASE_MASK 0xffff0000
+#define GAMMA_CORR_CNTLB_END_CNTL2__GAMMA_CORR_CNTLB_EXP_REGION_END_BASE__SHIFT 0x10
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION0_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION0_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION0_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION0_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION1_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION1_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION1_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_0_1__GAMMA_CORR_CNTLB_EXP_REGION1_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION2_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION2_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION2_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION2_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION3_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION3_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION3_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_2_3__GAMMA_CORR_CNTLB_EXP_REGION3_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION4_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION4_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION4_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION4_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION5_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION5_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION5_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_4_5__GAMMA_CORR_CNTLB_EXP_REGION5_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION6_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION6_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION6_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION6_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION7_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION7_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION7_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_6_7__GAMMA_CORR_CNTLB_EXP_REGION7_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION8_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION8_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION8_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION8_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION9_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION9_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION9_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_8_9__GAMMA_CORR_CNTLB_EXP_REGION9_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION10_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION10_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION10_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION10_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION11_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION11_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION11_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_10_11__GAMMA_CORR_CNTLB_EXP_REGION11_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION12_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION12_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION12_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION12_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION13_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION13_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION13_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_12_13__GAMMA_CORR_CNTLB_EXP_REGION13_NUM_SEGMENTS__SHIFT 0x1b
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION14_LUT_OFFSET_MASK 0xff
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION14_LUT_OFFSET__SHIFT 0x0
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION14_NUM_SEGMENTS_MASK 0x3800
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION14_NUM_SEGMENTS__SHIFT 0xb
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION15_LUT_OFFSET_MASK 0x7f8000
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION15_LUT_OFFSET__SHIFT 0xf
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION15_NUM_SEGMENTS_MASK 0x38000000
+#define GAMMA_CORR_CNTLB_REGION_14_15__GAMMA_CORR_CNTLB_EXP_REGION15_NUM_SEGMENTS__SHIFT 0x1b
+#define PACK_FIFO_ERROR__PACK_FIFO_L_UNDERFLOW_OCCURED_MASK 0x1
+#define PACK_FIFO_ERROR__PACK_FIFO_L_UNDERFLOW_OCCURED__SHIFT 0x0
+#define PACK_FIFO_ERROR__PACK_FIFO_L_UNDERFLOW_ACK_MASK 0x2
+#define PACK_FIFO_ERROR__PACK_FIFO_L_UNDERFLOW_ACK__SHIFT 0x1
+#define PACK_FIFO_ERROR__PACK_FIFO_C_UNDERFLOW_OCCURED_MASK 0x100
+#define PACK_FIFO_ERROR__PACK_FIFO_C_UNDERFLOW_OCCURED__SHIFT 0x8
+#define PACK_FIFO_ERROR__PACK_FIFO_C_UNDERFLOW_ACK_MASK 0x200
+#define PACK_FIFO_ERROR__PACK_FIFO_C_UNDERFLOW_ACK__SHIFT 0x9
+#define PACK_FIFO_ERROR__PACK_FIFO_L_OVERFLOW_OCCURED_MASK 0x10000
+#define PACK_FIFO_ERROR__PACK_FIFO_L_OVERFLOW_OCCURED__SHIFT 0x10
+#define PACK_FIFO_ERROR__PACK_FIFO_L_OVERFLOW_ACK_MASK 0x20000
+#define PACK_FIFO_ERROR__PACK_FIFO_L_OVERFLOW_ACK__SHIFT 0x11
+#define PACK_FIFO_ERROR__PACK_FIFO_C_OVERFLOW_OCCURED_MASK 0x1000000
+#define PACK_FIFO_ERROR__PACK_FIFO_C_OVERFLOW_OCCURED__SHIFT 0x18
+#define PACK_FIFO_ERROR__PACK_FIFO_C_OVERFLOW_ACK_MASK 0x2000000
+#define PACK_FIFO_ERROR__PACK_FIFO_C_OVERFLOW_ACK__SHIFT 0x19
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_UNDERFLOW_OCCURED_MASK 0x1
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_UNDERFLOW_OCCURED__SHIFT 0x0
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_UNDERFLOW_ACK_MASK 0x2
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_UNDERFLOW_ACK__SHIFT 0x1
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_OVERFLOW_OCCURED_MASK 0x100
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_OVERFLOW_OCCURED__SHIFT 0x8
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_OVERFLOW_ACK_MASK 0x200
+#define OUTPUT_FIFO_ERROR__OUTPUT_FIFO_OVERFLOW_ACK__SHIFT 0x9
+#define INPUT_GAMMA_LUT_AUTOFILL__INPUT_GAMMA_LUT_AUTOFILL_MASK 0x1
+#define INPUT_GAMMA_LUT_AUTOFILL__INPUT_GAMMA_LUT_AUTOFILL__SHIFT 0x0
+#define INPUT_GAMMA_LUT_AUTOFILL__INPUT_GAMMA_LUT_AUTOFILL_DONE_MASK 0x2
+#define INPUT_GAMMA_LUT_AUTOFILL__INPUT_GAMMA_LUT_AUTOFILL_DONE__SHIFT 0x1
+#define INPUT_GAMMA_LUT_RW_INDEX__INPUT_GAMMA_LUT_RW_INDEX_MASK 0xff
+#define INPUT_GAMMA_LUT_RW_INDEX__INPUT_GAMMA_LUT_RW_INDEX__SHIFT 0x0
+#define INPUT_GAMMA_LUT_SEQ_COLOR__INPUT_GAMMA_LUT_SEQ_COLOR_MASK 0xffff
+#define INPUT_GAMMA_LUT_SEQ_COLOR__INPUT_GAMMA_LUT_SEQ_COLOR__SHIFT 0x0
+#define INPUT_GAMMA_LUT_PWL_DATA__INPUT_GAMMA_LUT_BASE_MASK 0xffff
+#define INPUT_GAMMA_LUT_PWL_DATA__INPUT_GAMMA_LUT_BASE__SHIFT 0x0
+#define INPUT_GAMMA_LUT_PWL_DATA__INPUT_GAMMA_LUT_DELTA_MASK 0xffff0000
+#define INPUT_GAMMA_LUT_PWL_DATA__INPUT_GAMMA_LUT_DELTA__SHIFT 0x10
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_BLUE_MASK 0x3ff
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_BLUE__SHIFT 0x0
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_GREEN_MASK 0xffc00
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_GREEN__SHIFT 0xa
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_RED_MASK 0x3ff00000
+#define INPUT_GAMMA_LUT_30_COLOR__INPUT_GAMMA_LUT_COLOR_10_RED__SHIFT 0x14
+#define COL_MAN_INPUT_GAMMA_CONTROL1__INPUT_GAMMA_MODE_MASK 0x3
+#define COL_MAN_INPUT_GAMMA_CONTROL1__INPUT_GAMMA_MODE__SHIFT 0x0
+#define COL_MAN_INPUT_GAMMA_CONTROL1__INPUT_GAMMA_LUT_10BIT_BYPASS_EN_MASK 0x4000000
+#define COL_MAN_INPUT_GAMMA_CONTROL1__INPUT_GAMMA_LUT_10BIT_BYPASS_EN__SHIFT 0x1a
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_B_MASK 0x1e
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_B__SHIFT 0x1
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_B_SIGNED_EN_MASK 0x20
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_B_SIGNED_EN__SHIFT 0x5
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_B_FORMAT_MASK 0xc0
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_B_FORMAT__SHIFT 0x6
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_G_MASK 0xf00
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_G__SHIFT 0x8
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_G_SIGNED_EN_MASK 0x1000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_G_SIGNED_EN__SHIFT 0xc
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_G_FORMAT_MASK 0x6000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_G_FORMAT__SHIFT 0xd
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_R_MASK 0x78000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_INC_R__SHIFT 0xf
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_R_SIGNED_EN_MASK 0x80000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_R_SIGNED_EN__SHIFT 0x13
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_R_FORMAT_MASK 0x300000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_DATA_R_FORMAT__SHIFT 0x14
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_RW_MODE_MASK 0x400000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_RW_MODE__SHIFT 0x16
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_WRITE_EN_MASK_MASK 0x3800000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_WRITE_EN_MASK__SHIFT 0x17
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_VGA_ACCESS_ENABLE_MASK 0x4000000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_VGA_ACCESS_ENABLE__SHIFT 0x1a
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_10BIT_BYPASS_DBL_BUF_EN_MASK 0x8000000
+#define COL_MAN_INPUT_GAMMA_CONTROL2__INPUT_GAMMA_LUT_10BIT_BYPASS_DBL_BUF_EN__SHIFT 0x1b
+#define INPUT_GAMMA_BW_OFFSETS_B__INPUT_GAMMA_BLACK_OFFSET_B_MASK 0xffff
+#define INPUT_GAMMA_BW_OFFSETS_B__INPUT_GAMMA_BLACK_OFFSET_B__SHIFT 0x0
+#define INPUT_GAMMA_BW_OFFSETS_B__INPUT_GAMMA_WHITE_OFFSET_B_MASK 0xffff0000
+#define INPUT_GAMMA_BW_OFFSETS_B__INPUT_GAMMA_WHITE_OFFSET_B__SHIFT 0x10
+#define INPUT_GAMMA_BW_OFFSETS_G__INPUT_GAMMA_BLACK_OFFSET_G_MASK 0xffff
+#define INPUT_GAMMA_BW_OFFSETS_G__INPUT_GAMMA_BLACK_OFFSET_G__SHIFT 0x0
+#define INPUT_GAMMA_BW_OFFSETS_G__INPUT_GAMMA_WHITE_OFFSET_G_MASK 0xffff0000
+#define INPUT_GAMMA_BW_OFFSETS_G__INPUT_GAMMA_WHITE_OFFSET_G__SHIFT 0x10
+#define INPUT_GAMMA_BW_OFFSETS_R__INPUT_GAMMA_BLACK_OFFSET_R_MASK 0xffff
+#define INPUT_GAMMA_BW_OFFSETS_R__INPUT_GAMMA_BLACK_OFFSET_R__SHIFT 0x0
+#define INPUT_GAMMA_BW_OFFSETS_R__INPUT_GAMMA_WHITE_OFFSET_R_MASK 0xffff0000
+#define INPUT_GAMMA_BW_OFFSETS_R__INPUT_GAMMA_WHITE_OFFSET_R__SHIFT 0x10
+#define COL_MAN_DEBUG_CONTROL__COL_MAN_GLOBAL_PASSTHROUGH_ENABLE_MASK 0x1
+#define COL_MAN_DEBUG_CONTROL__COL_MAN_GLOBAL_PASSTHROUGH_ENABLE__SHIFT 0x0
+#define COL_MAN_TEST_DEBUG_INDEX__COL_MAN_TEST_DEBUG_INDEX_MASK 0xff
+#define COL_MAN_TEST_DEBUG_INDEX__COL_MAN_TEST_DEBUG_INDEX__SHIFT 0x0
+#define COL_MAN_TEST_DEBUG_INDEX__COL_MAN_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define COL_MAN_TEST_DEBUG_INDEX__COL_MAN_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define COL_MAN_TEST_DEBUG_DATA__COL_MAN_TEST_DEBUG_DATA_MASK 0xffffffff
+#define COL_MAN_TEST_DEBUG_DATA__COL_MAN_TEST_DEBUG_DATA__SHIFT 0x0
+#define UNP_GRPH_ENABLE__GRPH_ENABLE_MASK 0x1
+#define UNP_GRPH_ENABLE__GRPH_ENABLE__SHIFT 0x0
+#define UNP_GRPH_CONTROL__GRPH_DEPTH_MASK 0x3
+#define UNP_GRPH_CONTROL__GRPH_DEPTH__SHIFT 0x0
+#define UNP_GRPH_CONTROL__GRPH_NUM_BANKS_MASK 0xc
+#define UNP_GRPH_CONTROL__GRPH_NUM_BANKS__SHIFT 0x2
+#define UNP_GRPH_CONTROL__GRPH_Z_MASK 0x30
+#define UNP_GRPH_CONTROL__GRPH_Z__SHIFT 0x4
+#define UNP_GRPH_CONTROL__GRPH_BANK_WIDTH_L_MASK 0xc0
+#define UNP_GRPH_CONTROL__GRPH_BANK_WIDTH_L__SHIFT 0x6
+#define UNP_GRPH_CONTROL__GRPH_FORMAT_MASK 0x700
+#define UNP_GRPH_CONTROL__GRPH_FORMAT__SHIFT 0x8
+#define UNP_GRPH_CONTROL__GRPH_BANK_HEIGHT_L_MASK 0x1800
+#define UNP_GRPH_CONTROL__GRPH_BANK_HEIGHT_L__SHIFT 0xb
+#define UNP_GRPH_CONTROL__GRPH_TILE_SPLIT_L_MASK 0xe000
+#define UNP_GRPH_CONTROL__GRPH_TILE_SPLIT_L__SHIFT 0xd
+#define UNP_GRPH_CONTROL__GRPH_ADDRESS_TRANSLATION_ENABLE_MASK 0x10000
+#define UNP_GRPH_CONTROL__GRPH_ADDRESS_TRANSLATION_ENABLE__SHIFT 0x10
+#define UNP_GRPH_CONTROL__GRPH_PRIVILEGED_ACCESS_ENABLE_MASK 0x20000
+#define UNP_GRPH_CONTROL__GRPH_PRIVILEGED_ACCESS_ENABLE__SHIFT 0x11
+#define UNP_GRPH_CONTROL__GRPH_MACRO_TILE_ASPECT_L_MASK 0xc0000
+#define UNP_GRPH_CONTROL__GRPH_MACRO_TILE_ASPECT_L__SHIFT 0x12
+#define UNP_GRPH_CONTROL__GRPH_ARRAY_MODE_MASK 0xf00000
+#define UNP_GRPH_CONTROL__GRPH_ARRAY_MODE__SHIFT 0x14
+#define UNP_GRPH_CONTROL__GRPH_PIPE_CONFIG_MASK 0x1f000000
+#define UNP_GRPH_CONTROL__GRPH_PIPE_CONFIG__SHIFT 0x18
+#define UNP_GRPH_CONTROL__GRPH_MICRO_TILE_MODE_L_MASK 0x60000000
+#define UNP_GRPH_CONTROL__GRPH_MICRO_TILE_MODE_L__SHIFT 0x1d
+#define UNP_GRPH_CONTROL__GRPH_COLOR_EXPANSION_MODE_MASK 0x80000000
+#define UNP_GRPH_CONTROL__GRPH_COLOR_EXPANSION_MODE__SHIFT 0x1f
+#define UNP_GRPH_CONTROL_C__GRPH_BANK_WIDTH_C_MASK 0xc0
+#define UNP_GRPH_CONTROL_C__GRPH_BANK_WIDTH_C__SHIFT 0x6
+#define UNP_GRPH_CONTROL_C__GRPH_BANK_HEIGHT_C_MASK 0x1800
+#define UNP_GRPH_CONTROL_C__GRPH_BANK_HEIGHT_C__SHIFT 0xb
+#define UNP_GRPH_CONTROL_C__GRPH_TILE_SPLIT_C_MASK 0xe000
+#define UNP_GRPH_CONTROL_C__GRPH_TILE_SPLIT_C__SHIFT 0xd
+#define UNP_GRPH_CONTROL_C__GRPH_MACRO_TILE_ASPECT_C_MASK 0xc0000
+#define UNP_GRPH_CONTROL_C__GRPH_MACRO_TILE_ASPECT_C__SHIFT 0x12
+#define UNP_GRPH_CONTROL_C__GRPH_MICRO_TILE_MODE_C_MASK 0x60000000
+#define UNP_GRPH_CONTROL_C__GRPH_MICRO_TILE_MODE_C__SHIFT 0x1d
+#define UNP_GRPH_CONTROL_EXP__VIDEO_FORMAT_MASK 0x7
+#define UNP_GRPH_CONTROL_EXP__VIDEO_FORMAT__SHIFT 0x0
+#define UNP_GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP_MASK 0x3
+#define UNP_GRPH_SWAP_CNTL__GRPH_ENDIAN_SWAP__SHIFT 0x0
+#define UNP_GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR_MASK 0x30
+#define UNP_GRPH_SWAP_CNTL__GRPH_RED_CROSSBAR__SHIFT 0x4
+#define UNP_GRPH_SWAP_CNTL__GRPH_GREEN_CROSSBAR_MASK 0xc0
+#define UNP_GRPH_SWAP_CNTL__GRPH_GREEN_CROSSBAR__SHIFT 0x6
+#define UNP_GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR_MASK 0x300
+#define UNP_GRPH_SWAP_CNTL__GRPH_BLUE_CROSSBAR__SHIFT 0x8
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L__GRPH_PRIMARY_SURFACE_ADDRESS_L_MASK 0xffffff00
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_L__GRPH_PRIMARY_SURFACE_ADDRESS_L__SHIFT 0x8
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C__GRPH_PRIMARY_SURFACE_ADDRESS_C_MASK 0xffffff00
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_C__GRPH_PRIMARY_SURFACE_ADDRESS_C__SHIFT 0x8
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L_MASK 0xff
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_L__SHIFT 0x0
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C_MASK 0xff
+#define UNP_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_SURFACE_ADDRESS_HIGH_C__SHIFT 0x0
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L_MASK 0xffffff00
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_L__SHIFT 0x8
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C_MASK 0xffffff00
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_C__SHIFT 0x8
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L_MASK 0xff
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__SHIFT 0x0
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C_MASK 0xff
+#define UNP_GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__GRPH_PRIMARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__SHIFT 0x0
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_L__GRPH_SECONDARY_SURFACE_ADDRESS_L_MASK 0xffffff00
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_L__GRPH_SECONDARY_SURFACE_ADDRESS_L__SHIFT 0x8
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_C__GRPH_SECONDARY_SURFACE_ADDRESS_C_MASK 0xffffff00
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_C__GRPH_SECONDARY_SURFACE_ADDRESS_C__SHIFT 0x8
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L_MASK 0xff
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_L__SHIFT 0x0
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C_MASK 0xff
+#define UNP_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C__GRPH_SECONDARY_SURFACE_ADDRESS_HIGH_C__SHIFT 0x0
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L_MASK 0xffffff00
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_L__SHIFT 0x8
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C_MASK 0xffffff00
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_C__SHIFT 0x8
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L_MASK 0xff
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_L__SHIFT 0x0
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C_MASK 0xff
+#define UNP_GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__GRPH_SECONDARY_BOTTOM_SURFACE_ADDRESS_HIGH_C__SHIFT 0x0
+#define UNP_GRPH_PITCH_L__GRPH_PITCH_L_MASK 0x7fff
+#define UNP_GRPH_PITCH_L__GRPH_PITCH_L__SHIFT 0x0
+#define UNP_GRPH_PITCH_C__GRPH_PITCH_C_MASK 0x7fff
+#define UNP_GRPH_PITCH_C__GRPH_PITCH_C__SHIFT 0x0
+#define UNP_GRPH_SURFACE_OFFSET_X_L__GRPH_SURFACE_OFFSET_X_L_MASK 0x3fff
+#define UNP_GRPH_SURFACE_OFFSET_X_L__GRPH_SURFACE_OFFSET_X_L__SHIFT 0x0
+#define UNP_GRPH_SURFACE_OFFSET_X_C__GRPH_SURFACE_OFFSET_X_C_MASK 0x3fff
+#define UNP_GRPH_SURFACE_OFFSET_X_C__GRPH_SURFACE_OFFSET_X_C__SHIFT 0x0
+#define UNP_GRPH_SURFACE_OFFSET_Y_L__GRPH_SURFACE_OFFSET_Y_L_MASK 0x3fff
+#define UNP_GRPH_SURFACE_OFFSET_Y_L__GRPH_SURFACE_OFFSET_Y_L__SHIFT 0x0
+#define UNP_GRPH_SURFACE_OFFSET_Y_C__GRPH_SURFACE_OFFSET_Y_C_MASK 0x3fff
+#define UNP_GRPH_SURFACE_OFFSET_Y_C__GRPH_SURFACE_OFFSET_Y_C__SHIFT 0x0
+#define UNP_GRPH_X_START_L__GRPH_X_START_L_MASK 0x3fff
+#define UNP_GRPH_X_START_L__GRPH_X_START_L__SHIFT 0x0
+#define UNP_GRPH_X_START_C__GRPH_X_START_C_MASK 0x3fff
+#define UNP_GRPH_X_START_C__GRPH_X_START_C__SHIFT 0x0
+#define UNP_GRPH_Y_START_L__GRPH_Y_START_L_MASK 0x3fff
+#define UNP_GRPH_Y_START_L__GRPH_Y_START_L__SHIFT 0x0
+#define UNP_GRPH_Y_START_C__GRPH_Y_START_C_MASK 0x3fff
+#define UNP_GRPH_Y_START_C__GRPH_Y_START_C__SHIFT 0x0
+#define UNP_GRPH_X_END_L__GRPH_X_END_L_MASK 0x7fff
+#define UNP_GRPH_X_END_L__GRPH_X_END_L__SHIFT 0x0
+#define UNP_GRPH_X_END_C__GRPH_X_END_C_MASK 0x7fff
+#define UNP_GRPH_X_END_C__GRPH_X_END_C__SHIFT 0x0
+#define UNP_GRPH_Y_END_L__GRPH_Y_END_L_MASK 0x7fff
+#define UNP_GRPH_Y_END_L__GRPH_Y_END_L__SHIFT 0x0
+#define UNP_GRPH_Y_END_C__GRPH_Y_END_C_MASK 0x7fff
+#define UNP_GRPH_Y_END_C__GRPH_Y_END_C__SHIFT 0x0
+#define UNP_GRPH_UPDATE__GRPH_MODE_UPDATE_PENDING_MASK 0x1
+#define UNP_GRPH_UPDATE__GRPH_MODE_UPDATE_PENDING__SHIFT 0x0
+#define UNP_GRPH_UPDATE__GRPH_MODE_UPDATE_TAKEN_MASK 0x2
+#define UNP_GRPH_UPDATE__GRPH_MODE_UPDATE_TAKEN__SHIFT 0x1
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING_MASK 0x4
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_UPDATE_PENDING__SHIFT 0x2
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_UPDATE_TAKEN_MASK 0x8
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_UPDATE_TAKEN__SHIFT 0x3
+#define UNP_GRPH_UPDATE__GRPH_UPDATE_LOCK_MASK 0x10000
+#define UNP_GRPH_UPDATE__GRPH_UPDATE_LOCK__SHIFT 0x10
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_IGNORE_UPDATE_LOCK_MASK 0x100000
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_IGNORE_UPDATE_LOCK__SHIFT 0x14
+#define UNP_GRPH_UPDATE__GRPH_MODE_DISABLE_MULTIPLE_UPDATE_MASK 0x1000000
+#define UNP_GRPH_UPDATE__GRPH_MODE_DISABLE_MULTIPLE_UPDATE__SHIFT 0x18
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE_MASK 0x10000000
+#define UNP_GRPH_UPDATE__GRPH_SURFACE_DISABLE_MULTIPLE_UPDATE__SHIFT 0x1c
+#define UNP_PIPE_OUTSTANDING_REQUEST_LIMIT__UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_L_MASK 0xff
+#define UNP_PIPE_OUTSTANDING_REQUEST_LIMIT__UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_L__SHIFT 0x0
+#define UNP_PIPE_OUTSTANDING_REQUEST_LIMIT__UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_C_MASK 0xff00
+#define UNP_PIPE_OUTSTANDING_REQUEST_LIMIT__UNP_PIPE_OUTSTANDING_REQUEST_LIMIT_C__SHIFT 0x8
+#define UNP_GRPH_SURFACE_ADDRESS_INUSE_L__GRPH_SURFACE_ADDRESS_INUSE_L_MASK 0xffffff00
+#define UNP_GRPH_SURFACE_ADDRESS_INUSE_L__GRPH_SURFACE_ADDRESS_INUSE_L__SHIFT 0x8
+#define UNP_GRPH_SURFACE_ADDRESS_INUSE_C__GRPH_SURFACE_ADDRESS_INUSE_C_MASK 0xffffff00
+#define UNP_GRPH_SURFACE_ADDRESS_INUSE_C__GRPH_SURFACE_ADDRESS_INUSE_C__SHIFT 0x8
+#define UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L__GRPH_SURFACE_ADDRESS_HIGH_INUSE_L_MASK 0xff
+#define UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_L__GRPH_SURFACE_ADDRESS_HIGH_INUSE_L__SHIFT 0x0
+#define UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C__GRPH_SURFACE_ADDRESS_HIGH_INUSE_C_MASK 0xff
+#define UNP_GRPH_SURFACE_ADDRESS_HIGH_INUSE_C__GRPH_SURFACE_ADDRESS_HIGH_INUSE_C__SHIFT 0x0
+#define UNP_DVMM_PTE_CONTROL__DVMM_USE_SINGLE_PTE_MASK 0x1
+#define UNP_DVMM_PTE_CONTROL__DVMM_USE_SINGLE_PTE__SHIFT 0x0
+#define UNP_DVMM_PTE_CONTROL__DVMM_PAGE_WIDTH_MASK 0x1e
+#define UNP_DVMM_PTE_CONTROL__DVMM_PAGE_WIDTH__SHIFT 0x1
+#define UNP_DVMM_PTE_CONTROL__DVMM_PAGE_HEIGHT_MASK 0x1e0
+#define UNP_DVMM_PTE_CONTROL__DVMM_PAGE_HEIGHT__SHIFT 0x5
+#define UNP_DVMM_PTE_CONTROL__DVMM_MIN_PTE_BEFORE_FLIP_MASK 0x7fe00
+#define UNP_DVMM_PTE_CONTROL__DVMM_MIN_PTE_BEFORE_FLIP__SHIFT 0x9
+#define UNP_DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE0_MASK 0x100000
+#define UNP_DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE0__SHIFT 0x14
+#define UNP_DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE1_MASK 0x200000
+#define UNP_DVMM_PTE_CONTROL__DVMM_PTE_BUFFER_MODE1__SHIFT 0x15
+#define UNP_GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED_MASK 0x1
+#define UNP_GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_OCCURRED__SHIFT 0x0
+#define UNP_GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR_MASK 0x100
+#define UNP_GRPH_INTERRUPT_STATUS__GRPH_PFLIP_INT_CLEAR__SHIFT 0x8
+#define UNP_GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK_MASK 0x1
+#define UNP_GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_MASK__SHIFT 0x0
+#define UNP_GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_TYPE_MASK 0x100
+#define UNP_GRPH_INTERRUPT_CONTROL__GRPH_PFLIP_INT_TYPE__SHIFT 0x8
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_EN_MASK 0x1
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_EN__SHIFT 0x0
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_MODE_MASK 0x30
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_FLIP_MODE__SHIFT 0x4
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STACK_INTERLACE_FLIP_EN_MASK 0x100
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STACK_INTERLACE_FLIP_EN__SHIFT 0x8
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STACK_INTERLACE_FLIP_MODE_MASK 0x3000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STACK_INTERLACE_FLIP_MODE__SHIFT 0xc
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_SURFACE_PENDING_MASK 0x10000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_SURFACE_PENDING__SHIFT 0x10
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_SURFACE_PENDING_MASK 0x20000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_SURFACE_PENDING__SHIFT 0x11
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_BOTTOM_SURFACE_PENDING_MASK 0x40000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_PRIMARY_BOTTOM_SURFACE_PENDING__SHIFT 0x12
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_BOTTOM_SURFACE_PENDING_MASK 0x80000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_SECONDARY_BOTTOM_SURFACE_PENDING__SHIFT 0x13
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_SELECT_DISABLE_MASK 0x10000000
+#define UNP_GRPH_STEREOSYNC_FLIP__GRPH_STEREOSYNC_SELECT_DISABLE__SHIFT 0x1c
+#define UNP_FLIP_CONTROL__GRPH_SURFACE_UPDATE_PENDING_MODE_MASK 0x1
+#define UNP_FLIP_CONTROL__GRPH_SURFACE_UPDATE_PENDING_MODE__SHIFT 0x0
+#define UNP_FLIP_CONTROL__UNP_DEBUG_SG_MASK 0xfffffffc
+#define UNP_FLIP_CONTROL__UNP_DEBUG_SG__SHIFT 0x2
+#define UNP_CRC_CONTROL__UNP_CRC_ENABLE_MASK 0x1
+#define UNP_CRC_CONTROL__UNP_CRC_ENABLE__SHIFT 0x0
+#define UNP_CRC_CONTROL__UNP_CRC_SOURCE_SEL_MASK 0x1c
+#define UNP_CRC_CONTROL__UNP_CRC_SOURCE_SEL__SHIFT 0x2
+#define UNP_CRC_CONTROL__UNP_CRC_LINE_SEL_MASK 0x300
+#define UNP_CRC_CONTROL__UNP_CRC_LINE_SEL__SHIFT 0x8
+#define UNP_CRC_MASK__UNP_CRC_MASK_MASK 0xffffffff
+#define UNP_CRC_MASK__UNP_CRC_MASK__SHIFT 0x0
+#define UNP_CRC_CURRENT__UNP_CRC_CURRENT_MASK 0xffffffff
+#define UNP_CRC_CURRENT__UNP_CRC_CURRENT__SHIFT 0x0
+#define UNP_CRC_LAST__UNP_CRC_LAST_MASK 0xffffffff
+#define UNP_CRC_LAST__UNP_CRC_LAST__SHIFT 0x0
+#define UNP_LB_DATA_GAP_BETWEEN_CHUNK__UNP_LB_GAP_BETWEEN_CHUNK_MASK 0x1f0
+#define UNP_LB_DATA_GAP_BETWEEN_CHUNK__UNP_LB_GAP_BETWEEN_CHUNK__SHIFT 0x4
+#define UNP_HW_ROTATION__ROTATION_ANGLE_MASK 0x7
+#define UNP_HW_ROTATION__ROTATION_ANGLE__SHIFT 0x0
+#define UNP_HW_ROTATION__PIXEL_DROP_MASK 0x10
+#define UNP_HW_ROTATION__PIXEL_DROP__SHIFT 0x4
+#define UNP_HW_ROTATION__BUFFER_MODE_MASK 0x100
+#define UNP_HW_ROTATION__BUFFER_MODE__SHIFT 0x8
+#define UNP_DEBUG__UNP_DEBUG_MASK 0xffffffff
+#define UNP_DEBUG__UNP_DEBUG__SHIFT 0x0
+#define UNP_DEBUG2__UNP_DEBUG2_MASK 0xffffffff
+#define UNP_DEBUG2__UNP_DEBUG2__SHIFT 0x0
+#define UNP_DVMM_DEBUG__UNP_L_DVMM_DEBUG_MASK 0xffff
+#define UNP_DVMM_DEBUG__UNP_L_DVMM_DEBUG__SHIFT 0x0
+#define UNP_DVMM_DEBUG__UNP_C_DVMM_DEBUG_MASK 0xffff0000
+#define UNP_DVMM_DEBUG__UNP_C_DVMM_DEBUG__SHIFT 0x10
+#define UNP_TEST_DEBUG_INDEX__UNP_TEST_DEBUG_INDEX_MASK 0xff
+#define UNP_TEST_DEBUG_INDEX__UNP_TEST_DEBUG_INDEX__SHIFT 0x0
+#define UNP_TEST_DEBUG_INDEX__UNP_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define UNP_TEST_DEBUG_INDEX__UNP_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define UNP_TEST_DEBUG_DATA__UNP_TEST_DEBUG_DATA_MASK 0xffffffff
+#define UNP_TEST_DEBUG_DATA__UNP_TEST_DEBUG_DATA__SHIFT 0x0
+#define GENMO_WT__GENMO_MONO_ADDRESS_B_MASK 0x1
+#define GENMO_WT__GENMO_MONO_ADDRESS_B__SHIFT 0x0
+#define GENMO_WT__VGA_RAM_EN_MASK 0x2
+#define GENMO_WT__VGA_RAM_EN__SHIFT 0x1
+#define GENMO_WT__VGA_CKSEL_MASK 0xc
+#define GENMO_WT__VGA_CKSEL__SHIFT 0x2
+#define GENMO_WT__ODD_EVEN_MD_PGSEL_MASK 0x20
+#define GENMO_WT__ODD_EVEN_MD_PGSEL__SHIFT 0x5
+#define GENMO_WT__VGA_HSYNC_POL_MASK 0x40
+#define GENMO_WT__VGA_HSYNC_POL__SHIFT 0x6
+#define GENMO_WT__VGA_VSYNC_POL_MASK 0x80
+#define GENMO_WT__VGA_VSYNC_POL__SHIFT 0x7
+#define GENMO_RD__GENMO_MONO_ADDRESS_B_MASK 0x1
+#define GENMO_RD__GENMO_MONO_ADDRESS_B__SHIFT 0x0
+#define GENMO_RD__VGA_RAM_EN_MASK 0x2
+#define GENMO_RD__VGA_RAM_EN__SHIFT 0x1
+#define GENMO_RD__VGA_CKSEL_MASK 0xc
+#define GENMO_RD__VGA_CKSEL__SHIFT 0x2
+#define GENMO_RD__ODD_EVEN_MD_PGSEL_MASK 0x20
+#define GENMO_RD__ODD_EVEN_MD_PGSEL__SHIFT 0x5
+#define GENMO_RD__VGA_HSYNC_POL_MASK 0x40
+#define GENMO_RD__VGA_HSYNC_POL__SHIFT 0x6
+#define GENMO_RD__VGA_VSYNC_POL_MASK 0x80
+#define GENMO_RD__VGA_VSYNC_POL__SHIFT 0x7
+#define GENENB__BLK_IO_BASE_MASK 0xff
+#define GENENB__BLK_IO_BASE__SHIFT 0x0
+#define GENFC_WT__VSYNC_SEL_W_MASK 0x8
+#define GENFC_WT__VSYNC_SEL_W__SHIFT 0x3
+#define GENFC_RD__VSYNC_SEL_R_MASK 0x8
+#define GENFC_RD__VSYNC_SEL_R__SHIFT 0x3
+#define GENS0__SENSE_SWITCH_MASK 0x10
+#define GENS0__SENSE_SWITCH__SHIFT 0x4
+#define GENS0__CRT_INTR_MASK 0x80
+#define GENS0__CRT_INTR__SHIFT 0x7
+#define GENS1__NO_DISPLAY_MASK 0x1
+#define GENS1__NO_DISPLAY__SHIFT 0x0
+#define GENS1__VGA_VSTATUS_MASK 0x8
+#define GENS1__VGA_VSTATUS__SHIFT 0x3
+#define GENS1__PIXEL_READ_BACK_MASK 0x30
+#define GENS1__PIXEL_READ_BACK__SHIFT 0x4
+#define DAC_DATA__DAC_DATA_MASK 0x3f
+#define DAC_DATA__DAC_DATA__SHIFT 0x0
+#define DAC_MASK__DAC_MASK_MASK 0xff
+#define DAC_MASK__DAC_MASK__SHIFT 0x0
+#define DAC_R_INDEX__DAC_R_INDEX_MASK 0xff
+#define DAC_R_INDEX__DAC_R_INDEX__SHIFT 0x0
+#define DAC_W_INDEX__DAC_W_INDEX_MASK 0xff
+#define DAC_W_INDEX__DAC_W_INDEX__SHIFT 0x0
+#define SEQ8_IDX__SEQ_IDX_MASK 0x7
+#define SEQ8_IDX__SEQ_IDX__SHIFT 0x0
+#define SEQ8_DATA__SEQ_DATA_MASK 0xff
+#define SEQ8_DATA__SEQ_DATA__SHIFT 0x0
+#define SEQ00__SEQ_RST0B_MASK 0x1
+#define SEQ00__SEQ_RST0B__SHIFT 0x0
+#define SEQ00__SEQ_RST1B_MASK 0x2
+#define SEQ00__SEQ_RST1B__SHIFT 0x1
+#define SEQ01__SEQ_DOT8_MASK 0x1
+#define SEQ01__SEQ_DOT8__SHIFT 0x0
+#define SEQ01__SEQ_SHIFT2_MASK 0x4
+#define SEQ01__SEQ_SHIFT2__SHIFT 0x2
+#define SEQ01__SEQ_PCLKBY2_MASK 0x8
+#define SEQ01__SEQ_PCLKBY2__SHIFT 0x3
+#define SEQ01__SEQ_SHIFT4_MASK 0x10
+#define SEQ01__SEQ_SHIFT4__SHIFT 0x4
+#define SEQ01__SEQ_MAXBW_MASK 0x20
+#define SEQ01__SEQ_MAXBW__SHIFT 0x5
+#define SEQ02__SEQ_MAP0_EN_MASK 0x1
+#define SEQ02__SEQ_MAP0_EN__SHIFT 0x0
+#define SEQ02__SEQ_MAP1_EN_MASK 0x2
+#define SEQ02__SEQ_MAP1_EN__SHIFT 0x1
+#define SEQ02__SEQ_MAP2_EN_MASK 0x4
+#define SEQ02__SEQ_MAP2_EN__SHIFT 0x2
+#define SEQ02__SEQ_MAP3_EN_MASK 0x8
+#define SEQ02__SEQ_MAP3_EN__SHIFT 0x3
+#define SEQ03__SEQ_FONT_B1_MASK 0x1
+#define SEQ03__SEQ_FONT_B1__SHIFT 0x0
+#define SEQ03__SEQ_FONT_B2_MASK 0x2
+#define SEQ03__SEQ_FONT_B2__SHIFT 0x1
+#define SEQ03__SEQ_FONT_A1_MASK 0x4
+#define SEQ03__SEQ_FONT_A1__SHIFT 0x2
+#define SEQ03__SEQ_FONT_A2_MASK 0x8
+#define SEQ03__SEQ_FONT_A2__SHIFT 0x3
+#define SEQ03__SEQ_FONT_B0_MASK 0x10
+#define SEQ03__SEQ_FONT_B0__SHIFT 0x4
+#define SEQ03__SEQ_FONT_A0_MASK 0x20
+#define SEQ03__SEQ_FONT_A0__SHIFT 0x5
+#define SEQ04__SEQ_256K_MASK 0x2
+#define SEQ04__SEQ_256K__SHIFT 0x1
+#define SEQ04__SEQ_ODDEVEN_MASK 0x4
+#define SEQ04__SEQ_ODDEVEN__SHIFT 0x2
+#define SEQ04__SEQ_CHAIN_MASK 0x8
+#define SEQ04__SEQ_CHAIN__SHIFT 0x3
+#define CRTC8_IDX__VCRTC_IDX_MASK 0x3f
+#define CRTC8_IDX__VCRTC_IDX__SHIFT 0x0
+#define CRTC8_DATA__VCRTC_DATA_MASK 0xff
+#define CRTC8_DATA__VCRTC_DATA__SHIFT 0x0
+#define CRT00__H_TOTAL_MASK 0xff
+#define CRT00__H_TOTAL__SHIFT 0x0
+#define CRT01__H_DISP_END_MASK 0xff
+#define CRT01__H_DISP_END__SHIFT 0x0
+#define CRT02__H_BLANK_START_MASK 0xff
+#define CRT02__H_BLANK_START__SHIFT 0x0
+#define CRT03__H_BLANK_END_MASK 0x1f
+#define CRT03__H_BLANK_END__SHIFT 0x0
+#define CRT03__H_DE_SKEW_MASK 0x60
+#define CRT03__H_DE_SKEW__SHIFT 0x5
+#define CRT03__CR10CR11_R_DIS_B_MASK 0x80
+#define CRT03__CR10CR11_R_DIS_B__SHIFT 0x7
+#define CRT04__H_SYNC_START_MASK 0xff
+#define CRT04__H_SYNC_START__SHIFT 0x0
+#define CRT05__H_SYNC_END_MASK 0x1f
+#define CRT05__H_SYNC_END__SHIFT 0x0
+#define CRT05__H_SYNC_SKEW_MASK 0x60
+#define CRT05__H_SYNC_SKEW__SHIFT 0x5
+#define CRT05__H_BLANK_END_B5_MASK 0x80
+#define CRT05__H_BLANK_END_B5__SHIFT 0x7
+#define CRT06__V_TOTAL_MASK 0xff
+#define CRT06__V_TOTAL__SHIFT 0x0
+#define CRT07__V_TOTAL_B8_MASK 0x1
+#define CRT07__V_TOTAL_B8__SHIFT 0x0
+#define CRT07__V_DISP_END_B8_MASK 0x2
+#define CRT07__V_DISP_END_B8__SHIFT 0x1
+#define CRT07__V_SYNC_START_B8_MASK 0x4
+#define CRT07__V_SYNC_START_B8__SHIFT 0x2
+#define CRT07__V_BLANK_START_B8_MASK 0x8
+#define CRT07__V_BLANK_START_B8__SHIFT 0x3
+#define CRT07__LINE_CMP_B8_MASK 0x10
+#define CRT07__LINE_CMP_B8__SHIFT 0x4
+#define CRT07__V_TOTAL_B9_MASK 0x20
+#define CRT07__V_TOTAL_B9__SHIFT 0x5
+#define CRT07__V_DISP_END_B9_MASK 0x40
+#define CRT07__V_DISP_END_B9__SHIFT 0x6
+#define CRT07__V_SYNC_START_B9_MASK 0x80
+#define CRT07__V_SYNC_START_B9__SHIFT 0x7
+#define CRT08__ROW_SCAN_START_MASK 0x1f
+#define CRT08__ROW_SCAN_START__SHIFT 0x0
+#define CRT08__BYTE_PAN_MASK 0x60
+#define CRT08__BYTE_PAN__SHIFT 0x5
+#define CRT09__MAX_ROW_SCAN_MASK 0x1f
+#define CRT09__MAX_ROW_SCAN__SHIFT 0x0
+#define CRT09__V_BLANK_START_B9_MASK 0x20
+#define CRT09__V_BLANK_START_B9__SHIFT 0x5
+#define CRT09__LINE_CMP_B9_MASK 0x40
+#define CRT09__LINE_CMP_B9__SHIFT 0x6
+#define CRT09__DOUBLE_CHAR_HEIGHT_MASK 0x80
+#define CRT09__DOUBLE_CHAR_HEIGHT__SHIFT 0x7
+#define CRT0A__CURSOR_START_MASK 0x1f
+#define CRT0A__CURSOR_START__SHIFT 0x0
+#define CRT0A__CURSOR_DISABLE_MASK 0x20
+#define CRT0A__CURSOR_DISABLE__SHIFT 0x5
+#define CRT0B__CURSOR_END_MASK 0x1f
+#define CRT0B__CURSOR_END__SHIFT 0x0
+#define CRT0B__CURSOR_SKEW_MASK 0x60
+#define CRT0B__CURSOR_SKEW__SHIFT 0x5
+#define CRT0C__DISP_START_MASK 0xff
+#define CRT0C__DISP_START__SHIFT 0x0
+#define CRT0D__DISP_START_MASK 0xff
+#define CRT0D__DISP_START__SHIFT 0x0
+#define CRT0E__CURSOR_LOC_HI_MASK 0xff
+#define CRT0E__CURSOR_LOC_HI__SHIFT 0x0
+#define CRT0F__CURSOR_LOC_LO_MASK 0xff
+#define CRT0F__CURSOR_LOC_LO__SHIFT 0x0
+#define CRT10__V_SYNC_START_MASK 0xff
+#define CRT10__V_SYNC_START__SHIFT 0x0
+#define CRT11__V_SYNC_END_MASK 0xf
+#define CRT11__V_SYNC_END__SHIFT 0x0
+#define CRT11__V_INTR_CLR_MASK 0x10
+#define CRT11__V_INTR_CLR__SHIFT 0x4
+#define CRT11__V_INTR_EN_MASK 0x20
+#define CRT11__V_INTR_EN__SHIFT 0x5
+#define CRT11__SEL5_REFRESH_CYC_MASK 0x40
+#define CRT11__SEL5_REFRESH_CYC__SHIFT 0x6
+#define CRT11__C0T7_WR_ONLY_MASK 0x80
+#define CRT11__C0T7_WR_ONLY__SHIFT 0x7
+#define CRT12__V_DISP_END_MASK 0xff
+#define CRT12__V_DISP_END__SHIFT 0x0
+#define CRT13__DISP_PITCH_MASK 0xff
+#define CRT13__DISP_PITCH__SHIFT 0x0
+#define CRT14__UNDRLN_LOC_MASK 0x1f
+#define CRT14__UNDRLN_LOC__SHIFT 0x0
+#define CRT14__ADDR_CNT_BY4_MASK 0x20
+#define CRT14__ADDR_CNT_BY4__SHIFT 0x5
+#define CRT14__DOUBLE_WORD_MASK 0x40
+#define CRT14__DOUBLE_WORD__SHIFT 0x6
+#define CRT15__V_BLANK_START_MASK 0xff
+#define CRT15__V_BLANK_START__SHIFT 0x0
+#define CRT16__V_BLANK_END_MASK 0xff
+#define CRT16__V_BLANK_END__SHIFT 0x0
+#define CRT17__RA0_AS_A13B_MASK 0x1
+#define CRT17__RA0_AS_A13B__SHIFT 0x0
+#define CRT17__RA1_AS_A14B_MASK 0x2
+#define CRT17__RA1_AS_A14B__SHIFT 0x1
+#define CRT17__VCOUNT_BY2_MASK 0x4
+#define CRT17__VCOUNT_BY2__SHIFT 0x2
+#define CRT17__ADDR_CNT_BY2_MASK 0x8
+#define CRT17__ADDR_CNT_BY2__SHIFT 0x3
+#define CRT17__WRAP_A15TOA0_MASK 0x20
+#define CRT17__WRAP_A15TOA0__SHIFT 0x5
+#define CRT17__BYTE_MODE_MASK 0x40
+#define CRT17__BYTE_MODE__SHIFT 0x6
+#define CRT17__CRTC_SYNC_EN_MASK 0x80
+#define CRT17__CRTC_SYNC_EN__SHIFT 0x7
+#define CRT18__LINE_CMP_MASK 0xff
+#define CRT18__LINE_CMP__SHIFT 0x0
+#define CRT1E__GRPH_DEC_RD1_MASK 0x2
+#define CRT1E__GRPH_DEC_RD1__SHIFT 0x1
+#define CRT1F__GRPH_DEC_RD0_MASK 0xff
+#define CRT1F__GRPH_DEC_RD0__SHIFT 0x0
+#define CRT22__GRPH_LATCH_DATA_MASK 0xff
+#define CRT22__GRPH_LATCH_DATA__SHIFT 0x0
+#define GRPH8_IDX__GRPH_IDX_MASK 0xf
+#define GRPH8_IDX__GRPH_IDX__SHIFT 0x0
+#define GRPH8_DATA__GRPH_DATA_MASK 0xff
+#define GRPH8_DATA__GRPH_DATA__SHIFT 0x0
+#define GRA00__GRPH_SET_RESET0_MASK 0x1
+#define GRA00__GRPH_SET_RESET0__SHIFT 0x0
+#define GRA00__GRPH_SET_RESET1_MASK 0x2
+#define GRA00__GRPH_SET_RESET1__SHIFT 0x1
+#define GRA00__GRPH_SET_RESET2_MASK 0x4
+#define GRA00__GRPH_SET_RESET2__SHIFT 0x2
+#define GRA00__GRPH_SET_RESET3_MASK 0x8
+#define GRA00__GRPH_SET_RESET3__SHIFT 0x3
+#define GRA01__GRPH_SET_RESET_ENA0_MASK 0x1
+#define GRA01__GRPH_SET_RESET_ENA0__SHIFT 0x0
+#define GRA01__GRPH_SET_RESET_ENA1_MASK 0x2
+#define GRA01__GRPH_SET_RESET_ENA1__SHIFT 0x1
+#define GRA01__GRPH_SET_RESET_ENA2_MASK 0x4
+#define GRA01__GRPH_SET_RESET_ENA2__SHIFT 0x2
+#define GRA01__GRPH_SET_RESET_ENA3_MASK 0x8
+#define GRA01__GRPH_SET_RESET_ENA3__SHIFT 0x3
+#define GRA02__GRPH_CCOMP_MASK 0xf
+#define GRA02__GRPH_CCOMP__SHIFT 0x0
+#define GRA03__GRPH_ROTATE_MASK 0x7
+#define GRA03__GRPH_ROTATE__SHIFT 0x0
+#define GRA03__GRPH_FN_SEL_MASK 0x18
+#define GRA03__GRPH_FN_SEL__SHIFT 0x3
+#define GRA04__GRPH_RMAP_MASK 0x3
+#define GRA04__GRPH_RMAP__SHIFT 0x0
+#define GRA05__GRPH_WRITE_MODE_MASK 0x3
+#define GRA05__GRPH_WRITE_MODE__SHIFT 0x0
+#define GRA05__GRPH_READ1_MASK 0x8
+#define GRA05__GRPH_READ1__SHIFT 0x3
+#define GRA05__CGA_ODDEVEN_MASK 0x10
+#define GRA05__CGA_ODDEVEN__SHIFT 0x4
+#define GRA05__GRPH_OES_MASK 0x20
+#define GRA05__GRPH_OES__SHIFT 0x5
+#define GRA05__GRPH_PACK_MASK 0x40
+#define GRA05__GRPH_PACK__SHIFT 0x6
+#define GRA06__GRPH_GRAPHICS_MASK 0x1
+#define GRA06__GRPH_GRAPHICS__SHIFT 0x0
+#define GRA06__GRPH_ODDEVEN_MASK 0x2
+#define GRA06__GRPH_ODDEVEN__SHIFT 0x1
+#define GRA06__GRPH_ADRSEL_MASK 0xc
+#define GRA06__GRPH_ADRSEL__SHIFT 0x2
+#define GRA07__GRPH_XCARE0_MASK 0x1
+#define GRA07__GRPH_XCARE0__SHIFT 0x0
+#define GRA07__GRPH_XCARE1_MASK 0x2
+#define GRA07__GRPH_XCARE1__SHIFT 0x1
+#define GRA07__GRPH_XCARE2_MASK 0x4
+#define GRA07__GRPH_XCARE2__SHIFT 0x2
+#define GRA07__GRPH_XCARE3_MASK 0x8
+#define GRA07__GRPH_XCARE3__SHIFT 0x3
+#define GRA08__GRPH_BMSK_MASK 0xff
+#define GRA08__GRPH_BMSK__SHIFT 0x0
+#define ATTRX__ATTR_IDX_MASK 0x1f
+#define ATTRX__ATTR_IDX__SHIFT 0x0
+#define ATTRX__ATTR_PAL_RW_ENB_MASK 0x20
+#define ATTRX__ATTR_PAL_RW_ENB__SHIFT 0x5
+#define ATTRDW__ATTR_DATA_MASK 0xff
+#define ATTRDW__ATTR_DATA__SHIFT 0x0
+#define ATTRDR__ATTR_DATA_MASK 0xff
+#define ATTRDR__ATTR_DATA__SHIFT 0x0
+#define ATTR00__ATTR_PAL_MASK 0x3f
+#define ATTR00__ATTR_PAL__SHIFT 0x0
+#define ATTR01__ATTR_PAL_MASK 0x3f
+#define ATTR01__ATTR_PAL__SHIFT 0x0
+#define ATTR02__ATTR_PAL_MASK 0x3f
+#define ATTR02__ATTR_PAL__SHIFT 0x0
+#define ATTR03__ATTR_PAL_MASK 0x3f
+#define ATTR03__ATTR_PAL__SHIFT 0x0
+#define ATTR04__ATTR_PAL_MASK 0x3f
+#define ATTR04__ATTR_PAL__SHIFT 0x0
+#define ATTR05__ATTR_PAL_MASK 0x3f
+#define ATTR05__ATTR_PAL__SHIFT 0x0
+#define ATTR06__ATTR_PAL_MASK 0x3f
+#define ATTR06__ATTR_PAL__SHIFT 0x0
+#define ATTR07__ATTR_PAL_MASK 0x3f
+#define ATTR07__ATTR_PAL__SHIFT 0x0
+#define ATTR08__ATTR_PAL_MASK 0x3f
+#define ATTR08__ATTR_PAL__SHIFT 0x0
+#define ATTR09__ATTR_PAL_MASK 0x3f
+#define ATTR09__ATTR_PAL__SHIFT 0x0
+#define ATTR0A__ATTR_PAL_MASK 0x3f
+#define ATTR0A__ATTR_PAL__SHIFT 0x0
+#define ATTR0B__ATTR_PAL_MASK 0x3f
+#define ATTR0B__ATTR_PAL__SHIFT 0x0
+#define ATTR0C__ATTR_PAL_MASK 0x3f
+#define ATTR0C__ATTR_PAL__SHIFT 0x0
+#define ATTR0D__ATTR_PAL_MASK 0x3f
+#define ATTR0D__ATTR_PAL__SHIFT 0x0
+#define ATTR0E__ATTR_PAL_MASK 0x3f
+#define ATTR0E__ATTR_PAL__SHIFT 0x0
+#define ATTR0F__ATTR_PAL_MASK 0x3f
+#define ATTR0F__ATTR_PAL__SHIFT 0x0
+#define ATTR10__ATTR_GRPH_MODE_MASK 0x1
+#define ATTR10__ATTR_GRPH_MODE__SHIFT 0x0
+#define ATTR10__ATTR_MONO_EN_MASK 0x2
+#define ATTR10__ATTR_MONO_EN__SHIFT 0x1
+#define ATTR10__ATTR_LGRPH_EN_MASK 0x4
+#define ATTR10__ATTR_LGRPH_EN__SHIFT 0x2
+#define ATTR10__ATTR_BLINK_EN_MASK 0x8
+#define ATTR10__ATTR_BLINK_EN__SHIFT 0x3
+#define ATTR10__ATTR_PANTOPONLY_MASK 0x20
+#define ATTR10__ATTR_PANTOPONLY__SHIFT 0x5
+#define ATTR10__ATTR_PCLKBY2_MASK 0x40
+#define ATTR10__ATTR_PCLKBY2__SHIFT 0x6
+#define ATTR10__ATTR_CSEL_EN_MASK 0x80
+#define ATTR10__ATTR_CSEL_EN__SHIFT 0x7
+#define ATTR11__ATTR_OVSC_MASK 0xff
+#define ATTR11__ATTR_OVSC__SHIFT 0x0
+#define ATTR12__ATTR_MAP_EN_MASK 0xf
+#define ATTR12__ATTR_MAP_EN__SHIFT 0x0
+#define ATTR12__ATTR_VSMUX_MASK 0x30
+#define ATTR12__ATTR_VSMUX__SHIFT 0x4
+#define ATTR13__ATTR_PPAN_MASK 0xf
+#define ATTR13__ATTR_PPAN__SHIFT 0x0
+#define ATTR14__ATTR_CSEL1_MASK 0x3
+#define ATTR14__ATTR_CSEL1__SHIFT 0x0
+#define ATTR14__ATTR_CSEL2_MASK 0xc
+#define ATTR14__ATTR_CSEL2__SHIFT 0x2
+#define VGA_RENDER_CONTROL__VGA_BLINK_RATE_MASK 0x1f
+#define VGA_RENDER_CONTROL__VGA_BLINK_RATE__SHIFT 0x0
+#define VGA_RENDER_CONTROL__VGA_BLINK_MODE_MASK 0x60
+#define VGA_RENDER_CONTROL__VGA_BLINK_MODE__SHIFT 0x5
+#define VGA_RENDER_CONTROL__VGA_CURSOR_BLINK_INVERT_MASK 0x80
+#define VGA_RENDER_CONTROL__VGA_CURSOR_BLINK_INVERT__SHIFT 0x7
+#define VGA_RENDER_CONTROL__VGA_EXTD_ADDR_COUNT_ENABLE_MASK 0x100
+#define VGA_RENDER_CONTROL__VGA_EXTD_ADDR_COUNT_ENABLE__SHIFT 0x8
+#define VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL_MASK 0x30000
+#define VGA_RENDER_CONTROL__VGA_VSTATUS_CNTL__SHIFT 0x10
+#define VGA_RENDER_CONTROL__VGA_LOCK_8DOT_MASK 0x1000000
+#define VGA_RENDER_CONTROL__VGA_LOCK_8DOT__SHIFT 0x18
+#define VGA_RENDER_CONTROL__VGAREG_LINECMP_COMPATIBILITY_SEL_MASK 0x2000000
+#define VGA_RENDER_CONTROL__VGAREG_LINECMP_COMPATIBILITY_SEL__SHIFT 0x19
+#define VGA_SOURCE_SELECT__VGA_SOURCE_SEL_A_MASK 0x7
+#define VGA_SOURCE_SELECT__VGA_SOURCE_SEL_A__SHIFT 0x0
+#define VGA_SOURCE_SELECT__VGA_SOURCE_SEL_B_MASK 0x700
+#define VGA_SOURCE_SELECT__VGA_SOURCE_SEL_B__SHIFT 0x8
+#define VGA_SEQUENCER_RESET_CONTROL__D1_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x1
+#define VGA_SEQUENCER_RESET_CONTROL__D1_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x0
+#define VGA_SEQUENCER_RESET_CONTROL__D2_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x2
+#define VGA_SEQUENCER_RESET_CONTROL__D2_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x1
+#define VGA_SEQUENCER_RESET_CONTROL__D3_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x4
+#define VGA_SEQUENCER_RESET_CONTROL__D3_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x2
+#define VGA_SEQUENCER_RESET_CONTROL__D4_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x8
+#define VGA_SEQUENCER_RESET_CONTROL__D4_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x3
+#define VGA_SEQUENCER_RESET_CONTROL__D5_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x10
+#define VGA_SEQUENCER_RESET_CONTROL__D5_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x4
+#define VGA_SEQUENCER_RESET_CONTROL__D6_BLANK_DISPLAY_WHEN_SEQUENCER_RESET_MASK 0x20
+#define VGA_SEQUENCER_RESET_CONTROL__D6_BLANK_DISPLAY_WHEN_SEQUENCER_RESET__SHIFT 0x5
+#define VGA_SEQUENCER_RESET_CONTROL__D1_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x100
+#define VGA_SEQUENCER_RESET_CONTROL__D1_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0x8
+#define VGA_SEQUENCER_RESET_CONTROL__D2_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x200
+#define VGA_SEQUENCER_RESET_CONTROL__D2_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0x9
+#define VGA_SEQUENCER_RESET_CONTROL__D3_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x400
+#define VGA_SEQUENCER_RESET_CONTROL__D3_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0xa
+#define VGA_SEQUENCER_RESET_CONTROL__D4_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x800
+#define VGA_SEQUENCER_RESET_CONTROL__D4_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0xb
+#define VGA_SEQUENCER_RESET_CONTROL__D5_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x1000
+#define VGA_SEQUENCER_RESET_CONTROL__D5_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0xc
+#define VGA_SEQUENCER_RESET_CONTROL__D6_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET_MASK 0x2000
+#define VGA_SEQUENCER_RESET_CONTROL__D6_DISABLE_SYNCS_AND_DE_WHEN_SEQUENCER_RESET__SHIFT 0xd
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_ENABLE_MASK 0x10000
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_ENABLE__SHIFT 0x10
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_REGISTER_SELECT_MASK 0x20000
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_REGISTER_SELECT__SHIFT 0x11
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_INDEX_SELECT_MASK 0xfc0000
+#define VGA_SEQUENCER_RESET_CONTROL__VGA_MODE_AUTO_TRIGGER_INDEX_SELECT__SHIFT 0x12
+#define VGA_MODE_CONTROL__VGA_ATI_LINEAR_MASK 0x1
+#define VGA_MODE_CONTROL__VGA_ATI_LINEAR__SHIFT 0x0
+#define VGA_MODE_CONTROL__VGA_LUT_PALETTE_UPDATE_MODE_MASK 0x30
+#define VGA_MODE_CONTROL__VGA_LUT_PALETTE_UPDATE_MODE__SHIFT 0x4
+#define VGA_MODE_CONTROL__VGA_128K_APERTURE_PAGING_MASK 0x100
+#define VGA_MODE_CONTROL__VGA_128K_APERTURE_PAGING__SHIFT 0x8
+#define VGA_MODE_CONTROL__VGA_TEXT_132_COLUMNS_EN_MASK 0x10000
+#define VGA_MODE_CONTROL__VGA_TEXT_132_COLUMNS_EN__SHIFT 0x10
+#define VGA_SURFACE_PITCH_SELECT__VGA_SURFACE_PITCH_SELECT_MASK 0x3
+#define VGA_SURFACE_PITCH_SELECT__VGA_SURFACE_PITCH_SELECT__SHIFT 0x0
+#define VGA_SURFACE_PITCH_SELECT__VGA_SURFACE_HEIGHT_SELECT_MASK 0x300
+#define VGA_SURFACE_PITCH_SELECT__VGA_SURFACE_HEIGHT_SELECT__SHIFT 0x8
+#define VGA_MEMORY_BASE_ADDRESS__VGA_MEMORY_BASE_ADDRESS_MASK 0xffffffff
+#define VGA_MEMORY_BASE_ADDRESS__VGA_MEMORY_BASE_ADDRESS__SHIFT 0x0
+#define VGA_MEMORY_BASE_ADDRESS_HIGH__VGA_MEMORY_BASE_ADDRESS_HIGH_MASK 0xff
+#define VGA_MEMORY_BASE_ADDRESS_HIGH__VGA_MEMORY_BASE_ADDRESS_HIGH__SHIFT 0x0
+#define VGA_DISPBUF1_SURFACE_ADDR__VGA_DISPBUF1_SURFACE_ADDR_MASK 0x1ffffff
+#define VGA_DISPBUF1_SURFACE_ADDR__VGA_DISPBUF1_SURFACE_ADDR__SHIFT 0x0
+#define VGA_DISPBUF2_SURFACE_ADDR__VGA_DISPBUF2_SURFACE_ADDR_MASK 0x1ffffff
+#define VGA_DISPBUF2_SURFACE_ADDR__VGA_DISPBUF2_SURFACE_ADDR__SHIFT 0x0
+#define VGA_HDP_CONTROL__VGA_MEM_PAGE_SELECT_EN_MASK 0x1
+#define VGA_HDP_CONTROL__VGA_MEM_PAGE_SELECT_EN__SHIFT 0x0
+#define VGA_HDP_CONTROL__VGA_MEMORY_DISABLE_MASK 0x10
+#define VGA_HDP_CONTROL__VGA_MEMORY_DISABLE__SHIFT 0x4
+#define VGA_HDP_CONTROL__VGA_RBBM_LOCK_DISABLE_MASK 0x100
+#define VGA_HDP_CONTROL__VGA_RBBM_LOCK_DISABLE__SHIFT 0x8
+#define VGA_HDP_CONTROL__VGA_SOFT_RESET_MASK 0x10000
+#define VGA_HDP_CONTROL__VGA_SOFT_RESET__SHIFT 0x10
+#define VGA_HDP_CONTROL__VGA_TEST_RESET_CONTROL_MASK 0x1000000
+#define VGA_HDP_CONTROL__VGA_TEST_RESET_CONTROL__SHIFT 0x18
+#define VGA_CACHE_CONTROL__VGA_WRITE_THROUGH_CACHE_DIS_MASK 0x1
+#define VGA_CACHE_CONTROL__VGA_WRITE_THROUGH_CACHE_DIS__SHIFT 0x0
+#define VGA_CACHE_CONTROL__VGA_READ_CACHE_DISABLE_MASK 0x100
+#define VGA_CACHE_CONTROL__VGA_READ_CACHE_DISABLE__SHIFT 0x8
+#define VGA_CACHE_CONTROL__VGA_READ_BUFFER_INVALIDATE_MASK 0x10000
+#define VGA_CACHE_CONTROL__VGA_READ_BUFFER_INVALIDATE__SHIFT 0x10
+#define VGA_CACHE_CONTROL__VGA_DCCIF_W256ONLY_MASK 0x100000
+#define VGA_CACHE_CONTROL__VGA_DCCIF_W256ONLY__SHIFT 0x14
+#define VGA_CACHE_CONTROL__VGA_DCCIF_WC_TIMEOUT_MASK 0x3f000000
+#define VGA_CACHE_CONTROL__VGA_DCCIF_WC_TIMEOUT__SHIFT 0x18
+#define D1VGA_CONTROL__D1VGA_MODE_ENABLE_MASK 0x1
+#define D1VGA_CONTROL__D1VGA_MODE_ENABLE__SHIFT 0x0
+#define D1VGA_CONTROL__D1VGA_TIMING_SELECT_MASK 0x100
+#define D1VGA_CONTROL__D1VGA_TIMING_SELECT__SHIFT 0x8
+#define D1VGA_CONTROL__D1VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D1VGA_CONTROL__D1VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D1VGA_CONTROL__D1VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D1VGA_CONTROL__D1VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D1VGA_CONTROL__D1VGA_ROTATE_MASK 0x3000000
+#define D1VGA_CONTROL__D1VGA_ROTATE__SHIFT 0x18
+#define D2VGA_CONTROL__D2VGA_MODE_ENABLE_MASK 0x1
+#define D2VGA_CONTROL__D2VGA_MODE_ENABLE__SHIFT 0x0
+#define D2VGA_CONTROL__D2VGA_TIMING_SELECT_MASK 0x100
+#define D2VGA_CONTROL__D2VGA_TIMING_SELECT__SHIFT 0x8
+#define D2VGA_CONTROL__D2VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D2VGA_CONTROL__D2VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D2VGA_CONTROL__D2VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D2VGA_CONTROL__D2VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D2VGA_CONTROL__D2VGA_ROTATE_MASK 0x3000000
+#define D2VGA_CONTROL__D2VGA_ROTATE__SHIFT 0x18
+#define D3VGA_CONTROL__D3VGA_MODE_ENABLE_MASK 0x1
+#define D3VGA_CONTROL__D3VGA_MODE_ENABLE__SHIFT 0x0
+#define D3VGA_CONTROL__D3VGA_TIMING_SELECT_MASK 0x100
+#define D3VGA_CONTROL__D3VGA_TIMING_SELECT__SHIFT 0x8
+#define D3VGA_CONTROL__D3VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D3VGA_CONTROL__D3VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D3VGA_CONTROL__D3VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D3VGA_CONTROL__D3VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D3VGA_CONTROL__D3VGA_ROTATE_MASK 0x3000000
+#define D3VGA_CONTROL__D3VGA_ROTATE__SHIFT 0x18
+#define D4VGA_CONTROL__D4VGA_MODE_ENABLE_MASK 0x1
+#define D4VGA_CONTROL__D4VGA_MODE_ENABLE__SHIFT 0x0
+#define D4VGA_CONTROL__D4VGA_TIMING_SELECT_MASK 0x100
+#define D4VGA_CONTROL__D4VGA_TIMING_SELECT__SHIFT 0x8
+#define D4VGA_CONTROL__D4VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D4VGA_CONTROL__D4VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D4VGA_CONTROL__D4VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D4VGA_CONTROL__D4VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D4VGA_CONTROL__D4VGA_ROTATE_MASK 0x3000000
+#define D4VGA_CONTROL__D4VGA_ROTATE__SHIFT 0x18
+#define D5VGA_CONTROL__D5VGA_MODE_ENABLE_MASK 0x1
+#define D5VGA_CONTROL__D5VGA_MODE_ENABLE__SHIFT 0x0
+#define D5VGA_CONTROL__D5VGA_TIMING_SELECT_MASK 0x100
+#define D5VGA_CONTROL__D5VGA_TIMING_SELECT__SHIFT 0x8
+#define D5VGA_CONTROL__D5VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D5VGA_CONTROL__D5VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D5VGA_CONTROL__D5VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D5VGA_CONTROL__D5VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D5VGA_CONTROL__D5VGA_ROTATE_MASK 0x3000000
+#define D5VGA_CONTROL__D5VGA_ROTATE__SHIFT 0x18
+#define D6VGA_CONTROL__D6VGA_MODE_ENABLE_MASK 0x1
+#define D6VGA_CONTROL__D6VGA_MODE_ENABLE__SHIFT 0x0
+#define D6VGA_CONTROL__D6VGA_TIMING_SELECT_MASK 0x100
+#define D6VGA_CONTROL__D6VGA_TIMING_SELECT__SHIFT 0x8
+#define D6VGA_CONTROL__D6VGA_SYNC_POLARITY_SELECT_MASK 0x200
+#define D6VGA_CONTROL__D6VGA_SYNC_POLARITY_SELECT__SHIFT 0x9
+#define D6VGA_CONTROL__D6VGA_OVERSCAN_COLOR_EN_MASK 0x10000
+#define D6VGA_CONTROL__D6VGA_OVERSCAN_COLOR_EN__SHIFT 0x10
+#define D6VGA_CONTROL__D6VGA_ROTATE_MASK 0x3000000
+#define D6VGA_CONTROL__D6VGA_ROTATE__SHIFT 0x18
+#define VGA_HW_DEBUG__VGA_HW_DEBUG_MASK 0xffffffff
+#define VGA_HW_DEBUG__VGA_HW_DEBUG__SHIFT 0x0
+#define VGA_STATUS__VGA_MEM_ACCESS_STATUS_MASK 0x1
+#define VGA_STATUS__VGA_MEM_ACCESS_STATUS__SHIFT 0x0
+#define VGA_STATUS__VGA_REG_ACCESS_STATUS_MASK 0x2
+#define VGA_STATUS__VGA_REG_ACCESS_STATUS__SHIFT 0x1
+#define VGA_STATUS__VGA_DISPLAY_SWITCH_STATUS_MASK 0x4
+#define VGA_STATUS__VGA_DISPLAY_SWITCH_STATUS__SHIFT 0x2
+#define VGA_STATUS__VGA_MODE_AUTO_TRIGGER_STATUS_MASK 0x8
+#define VGA_STATUS__VGA_MODE_AUTO_TRIGGER_STATUS__SHIFT 0x3
+#define VGA_INTERRUPT_CONTROL__VGA_MEM_ACCESS_INT_MASK_MASK 0x1
+#define VGA_INTERRUPT_CONTROL__VGA_MEM_ACCESS_INT_MASK__SHIFT 0x0
+#define VGA_INTERRUPT_CONTROL__VGA_REG_ACCESS_INT_MASK_MASK 0x100
+#define VGA_INTERRUPT_CONTROL__VGA_REG_ACCESS_INT_MASK__SHIFT 0x8
+#define VGA_INTERRUPT_CONTROL__VGA_DISPLAY_SWITCH_INT_MASK_MASK 0x10000
+#define VGA_INTERRUPT_CONTROL__VGA_DISPLAY_SWITCH_INT_MASK__SHIFT 0x10
+#define VGA_INTERRUPT_CONTROL__VGA_MODE_AUTO_TRIGGER_INT_MASK_MASK 0x1000000
+#define VGA_INTERRUPT_CONTROL__VGA_MODE_AUTO_TRIGGER_INT_MASK__SHIFT 0x18
+#define VGA_STATUS_CLEAR__VGA_MEM_ACCESS_INT_CLEAR_MASK 0x1
+#define VGA_STATUS_CLEAR__VGA_MEM_ACCESS_INT_CLEAR__SHIFT 0x0
+#define VGA_STATUS_CLEAR__VGA_REG_ACCESS_INT_CLEAR_MASK 0x100
+#define VGA_STATUS_CLEAR__VGA_REG_ACCESS_INT_CLEAR__SHIFT 0x8
+#define VGA_STATUS_CLEAR__VGA_DISPLAY_SWITCH_INT_CLEAR_MASK 0x10000
+#define VGA_STATUS_CLEAR__VGA_DISPLAY_SWITCH_INT_CLEAR__SHIFT 0x10
+#define VGA_STATUS_CLEAR__VGA_MODE_AUTO_TRIGGER_INT_CLEAR_MASK 0x1000000
+#define VGA_STATUS_CLEAR__VGA_MODE_AUTO_TRIGGER_INT_CLEAR__SHIFT 0x18
+#define VGA_INTERRUPT_STATUS__VGA_MEM_ACCESS_INT_STATUS_MASK 0x1
+#define VGA_INTERRUPT_STATUS__VGA_MEM_ACCESS_INT_STATUS__SHIFT 0x0
+#define VGA_INTERRUPT_STATUS__VGA_REG_ACCESS_INT_STATUS_MASK 0x2
+#define VGA_INTERRUPT_STATUS__VGA_REG_ACCESS_INT_STATUS__SHIFT 0x1
+#define VGA_INTERRUPT_STATUS__VGA_DISPLAY_SWITCH_INT_STATUS_MASK 0x4
+#define VGA_INTERRUPT_STATUS__VGA_DISPLAY_SWITCH_INT_STATUS__SHIFT 0x2
+#define VGA_INTERRUPT_STATUS__VGA_MODE_AUTO_TRIGGER_INT_STATUS_MASK 0x8
+#define VGA_INTERRUPT_STATUS__VGA_MODE_AUTO_TRIGGER_INT_STATUS__SHIFT 0x3
+#define VGA_MAIN_CONTROL__VGA_CRTC_TIMEOUT_MASK 0x3
+#define VGA_MAIN_CONTROL__VGA_CRTC_TIMEOUT__SHIFT 0x0
+#define VGA_MAIN_CONTROL__VGA_RENDER_TIMEOUT_COUNT_MASK 0x18
+#define VGA_MAIN_CONTROL__VGA_RENDER_TIMEOUT_COUNT__SHIFT 0x3
+#define VGA_MAIN_CONTROL__VGA_VIRTUAL_VERTICAL_RETRACE_DURATION_MASK 0xe0
+#define VGA_MAIN_CONTROL__VGA_VIRTUAL_VERTICAL_RETRACE_DURATION__SHIFT 0x5
+#define VGA_MAIN_CONTROL__VGA_READBACK_VGA_VSTATUS_SOURCE_SELECT_MASK 0x300
+#define VGA_MAIN_CONTROL__VGA_READBACK_VGA_VSTATUS_SOURCE_SELECT__SHIFT 0x8
+#define VGA_MAIN_CONTROL__VGA_MC_WRITE_CLEAN_WAIT_DELAY_MASK 0xf000
+#define VGA_MAIN_CONTROL__VGA_MC_WRITE_CLEAN_WAIT_DELAY__SHIFT 0xc
+#define VGA_MAIN_CONTROL__VGA_READBACK_NO_DISPLAY_SOURCE_SELECT_MASK 0x30000
+#define VGA_MAIN_CONTROL__VGA_READBACK_NO_DISPLAY_SOURCE_SELECT__SHIFT 0x10
+#define VGA_MAIN_CONTROL__VGA_READBACK_CRT_INTR_SOURCE_SELECT_MASK 0x3000000
+#define VGA_MAIN_CONTROL__VGA_READBACK_CRT_INTR_SOURCE_SELECT__SHIFT 0x18
+#define VGA_MAIN_CONTROL__VGA_READBACK_SENSE_SWITCH_SELECT_MASK 0x4000000
+#define VGA_MAIN_CONTROL__VGA_READBACK_SENSE_SWITCH_SELECT__SHIFT 0x1a
+#define VGA_MAIN_CONTROL__VGA_READ_URGENT_ENABLE_MASK 0x8000000
+#define VGA_MAIN_CONTROL__VGA_READ_URGENT_ENABLE__SHIFT 0x1b
+#define VGA_MAIN_CONTROL__VGA_WRITES_URGENT_ENABLE_MASK 0x10000000
+#define VGA_MAIN_CONTROL__VGA_WRITES_URGENT_ENABLE__SHIFT 0x1c
+#define VGA_MAIN_CONTROL__VGA_EXTERNAL_DAC_SENSE_MASK 0x20000000
+#define VGA_MAIN_CONTROL__VGA_EXTERNAL_DAC_SENSE__SHIFT 0x1d
+#define VGA_MAIN_CONTROL__VGA_MAIN_TEST_VSTATUS_NO_DISPLAY_CRTC_TIMEOUT_MASK 0x80000000
+#define VGA_MAIN_CONTROL__VGA_MAIN_TEST_VSTATUS_NO_DISPLAY_CRTC_TIMEOUT__SHIFT 0x1f
+#define VGA_TEST_CONTROL__VGA_TEST_ENABLE_MASK 0x1
+#define VGA_TEST_CONTROL__VGA_TEST_ENABLE__SHIFT 0x0
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_START_MASK 0x100
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_START__SHIFT 0x8
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_DONE_MASK 0x10000
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_DONE__SHIFT 0x10
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_DISPBUF_SELECT_MASK 0x1000000
+#define VGA_TEST_CONTROL__VGA_TEST_RENDER_DISPBUF_SELECT__SHIFT 0x18
+#define VGA_DEBUG_READBACK_INDEX__VGA_DEBUG_READBACK_INDEX_MASK 0xff
+#define VGA_DEBUG_READBACK_INDEX__VGA_DEBUG_READBACK_INDEX__SHIFT 0x0
+#define VGA_DEBUG_READBACK_DATA__VGA_DEBUG_READBACK_DATA_MASK 0xffffffff
+#define VGA_DEBUG_READBACK_DATA__VGA_DEBUG_READBACK_DATA__SHIFT 0x0
+#define VGA_MEM_WRITE_PAGE_ADDR__VGA_MEM_WRITE_PAGE0_ADDR_MASK 0x3ff
+#define VGA_MEM_WRITE_PAGE_ADDR__VGA_MEM_WRITE_PAGE0_ADDR__SHIFT 0x0
+#define VGA_MEM_WRITE_PAGE_ADDR__VGA_MEM_WRITE_PAGE1_ADDR_MASK 0x3ff0000
+#define VGA_MEM_WRITE_PAGE_ADDR__VGA_MEM_WRITE_PAGE1_ADDR__SHIFT 0x10
+#define VGA_MEM_READ_PAGE_ADDR__VGA_MEM_READ_PAGE0_ADDR_MASK 0x3ff
+#define VGA_MEM_READ_PAGE_ADDR__VGA_MEM_READ_PAGE0_ADDR__SHIFT 0x0
+#define VGA_MEM_READ_PAGE_ADDR__VGA_MEM_READ_PAGE1_ADDR_MASK 0x3ff0000
+#define VGA_MEM_READ_PAGE_ADDR__VGA_MEM_READ_PAGE1_ADDR__SHIFT 0x10
+#define VGA_TEST_DEBUG_INDEX__VGA_TEST_DEBUG_INDEX_MASK 0xff
+#define VGA_TEST_DEBUG_INDEX__VGA_TEST_DEBUG_INDEX__SHIFT 0x0
+#define VGA_TEST_DEBUG_INDEX__VGA_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define VGA_TEST_DEBUG_INDEX__VGA_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define VGA_TEST_DEBUG_DATA__VGA_TEST_DEBUG_DATA_MASK 0xffffffff
+#define VGA_TEST_DEBUG_DATA__VGA_TEST_DEBUG_DATA__SHIFT 0x0
+#define VGADCC_DBG_DCCIF_C__DBG_DCCIF_C_MASK 0xffffffff
+#define VGADCC_DBG_DCCIF_C__DBG_DCCIF_C__SHIFT 0x0
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_WHITE_LEVEL_MASK 0x3
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_WHITE_LEVEL__SHIFT 0x0
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_WHITE_FINE_CONTROL_MASK 0x3f00
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_WHITE_FINE_CONTROL__SHIFT 0x8
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_BANDGAP_ADJUSTMENT_MASK 0x3f0000
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_BANDGAP_ADJUSTMENT__SHIFT 0x10
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_ANALOG_MONITOR_MASK 0xf000000
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_ANALOG_MONITOR__SHIFT 0x18
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_COREMON_MASK 0x10000000
+#define BPHYC_DAC_MACRO_CNTL__BPHYC_DAC_COREMON__SHIFT 0x1c
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_INITB_MASK 0x1
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_INITB__SHIFT 0x0
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_EN_MASK 0x2
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_EN__SHIFT 0x1
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_DACADJ_EN_MASK 0x4
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_DACADJ_EN__SHIFT 0x2
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_WAIT_ADJUST_MASK 0x3ff0
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_WAIT_ADJUST__SHIFT 0x4
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_MASK_MASK 0x700000
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_MASK__SHIFT 0x14
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_COMPLETE_MASK 0x10000000
+#define BPHYC_DAC_AUTO_CALIB_CONTROL__BPHYC_DAC_CAL_COMPLETE__SHIFT 0x1c
+#define DPG_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION_MASK 0xffff
+#define DPG_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION__SHIFT 0x0
+#define DPG_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT_MASK 0xffff0000
+#define DPG_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT__SHIFT 0x10
+#define DPG_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT_MASK 0xffff
+#define DPG_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT__SHIFT 0x0
+#define DPG_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT_MASK 0xffff0000
+#define DPG_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT__SHIFT 0x10
+#define DPG_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK_MASK 0x7
+#define DPG_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK__SHIFT 0x0
+#define DPG_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK_MASK 0x700
+#define DPG_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK__SHIFT 0x8
+#define DPG_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK_MASK 0x70000
+#define DPG_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK__SHIFT 0x10
+#define DPG_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT_MASK 0x1000000
+#define DPG_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT__SHIFT 0x18
+#define DPG_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK_MASK 0xffff
+#define DPG_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK__SHIFT 0x0
+#define DPG_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK_MASK 0xffff0000
+#define DPG_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK__SHIFT 0x10
+#define DPG_PIPE_DPM_CONTROL__DPM_ENABLE_MASK 0x1
+#define DPG_PIPE_DPM_CONTROL__DPM_ENABLE__SHIFT 0x0
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE_MASK 0x10
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE__SHIFT 0x4
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON_MASK 0x100
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON__SHIFT 0x8
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK_MASK 0x3000
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK__SHIFT 0xc
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK 0xffff0000
+#define DPG_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK__SHIFT 0x10
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_ENABLE_MASK 0x1
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_ENABLE__SHIFT 0x0
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR_MASK 0x10
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR__SHIFT 0x4
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON_MASK 0x20
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON__SHIFT 0x5
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA_MASK 0x40
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA__SHIFT 0x6
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC_MASK 0x80
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC__SHIFT 0x7
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON_MASK 0x100
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON__SHIFT 0x8
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK_MASK 0x200
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK__SHIFT 0x9
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH_MASK 0x400
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH__SHIFT 0xa
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON_MASK 0x800
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON__SHIFT 0xb
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK 0xffff0000
+#define DPG_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK__SHIFT 0x10
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE_MASK 0x1
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE__SHIFT 0x0
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST_MASK 0x10
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST__SHIFT 0x4
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST_MASK 0x100
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST__SHIFT 0x8
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON_MASK 0x200
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON__SHIFT 0x9
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT_MASK 0x400
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT__SHIFT 0xa
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK 0xffff8000
+#define DPG_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK__SHIFT 0xf
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH_MASK 0x1
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH__SHIFT 0x0
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH_MASK 0x10
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH__SHIFT 0x4
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH_MASK 0x20
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH__SHIFT 0x5
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH_MASK 0x40
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH__SHIFT 0x6
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH_MASK 0x80
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH__SHIFT 0x7
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH_MASK 0x100
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH__SHIFT 0x8
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH_MASK 0x200
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH__SHIFT 0x9
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH_MASK 0x400
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH__SHIFT 0xa
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH_MASK 0x800
+#define DPG_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH__SHIFT 0xb
+#define DPG_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER_MASK 0x7
+#define DPG_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER__SHIFT 0x0
+#define DPG_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER_MASK 0x70
+#define DPG_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER__SHIFT 0x4
+#define DPG_HW_DEBUG_A__DPG_HW_DEBUG_A_MASK 0xffffffff
+#define DPG_HW_DEBUG_A__DPG_HW_DEBUG_A__SHIFT 0x0
+#define DPG_HW_DEBUG_B__DPG_HW_DEBUG_B_MASK 0xffffffff
+#define DPG_HW_DEBUG_B__DPG_HW_DEBUG_B__SHIFT 0x0
+#define DPG_HW_DEBUG_11__DPG_HW_DEBUG_11_MASK 0x1
+#define DPG_HW_DEBUG_11__DPG_HW_DEBUG_11__SHIFT 0x0
+#define DPG_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK_MASK 0x1
+#define DPG_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK__SHIFT 0x0
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_UNMAPPED_MASK 0x1
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_UNMAPPED__SHIFT 0x0
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_MAPPED_MASK 0x2
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_MAPPED__SHIFT 0x1
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_UNMAPPED_CLR_MASK 0x10
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_UNMAPPED_CLR__SHIFT 0x4
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_MAPPED_CLR_MASK 0x20
+#define DPG_DVMM_STATUS__DPG_DVMM_FORCED_FLIP_TO_MAPPED_CLR__SHIFT 0x5
+#define DPG_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_INDEX_MASK 0xff
+#define DPG_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DPG_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DPG_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DPG_TEST_DEBUG_DATA__DPG_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DPG_TEST_DEBUG_DATA__DPG_TEST_DEBUG_DATA__SHIFT 0x0
+#define DPGV0_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION_MASK 0xffff
+#define DPGV0_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION__SHIFT 0x0
+#define DPGV0_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT_MASK 0xffff0000
+#define DPGV0_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT__SHIFT 0x10
+#define DPGV1_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION_MASK 0xffff
+#define DPGV1_PIPE_ARBITRATION_CONTROL1__PIXEL_DURATION__SHIFT 0x0
+#define DPGV1_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT_MASK 0xffff0000
+#define DPGV1_PIPE_ARBITRATION_CONTROL1__BASE_WEIGHT__SHIFT 0x10
+#define DPGV0_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT_MASK 0xffff
+#define DPGV0_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT__SHIFT 0x0
+#define DPGV0_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT_MASK 0xffff0000
+#define DPGV0_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT__SHIFT 0x10
+#define DPGV1_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT_MASK 0xffff
+#define DPGV1_PIPE_ARBITRATION_CONTROL2__TIME_WEIGHT__SHIFT 0x0
+#define DPGV1_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT_MASK 0xffff0000
+#define DPGV1_PIPE_ARBITRATION_CONTROL2__URGENCY_WEIGHT__SHIFT 0x10
+#define DPGV0_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK_MASK 0x3
+#define DPGV0_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK__SHIFT 0x0
+#define DPGV0_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK_MASK 0x300
+#define DPGV0_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK__SHIFT 0x8
+#define DPGV0_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK_MASK 0x30000
+#define DPGV0_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK__SHIFT 0x10
+#define DPGV0_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT_MASK 0x1000000
+#define DPGV0_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT__SHIFT 0x18
+#define DPGV1_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK_MASK 0x3
+#define DPGV1_WATERMARK_MASK_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK__SHIFT 0x0
+#define DPGV1_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK_MASK 0x300
+#define DPGV1_WATERMARK_MASK_CONTROL__URGENCY_WATERMARK_MASK__SHIFT 0x8
+#define DPGV1_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK_MASK 0x30000
+#define DPGV1_WATERMARK_MASK_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK__SHIFT 0x10
+#define DPGV1_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT_MASK 0x1000000
+#define DPGV1_WATERMARK_MASK_CONTROL__DISABLE_FLIP_URGENT__SHIFT 0x18
+#define DPGV0_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK_MASK 0xffff
+#define DPGV0_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK__SHIFT 0x0
+#define DPGV0_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK_MASK 0xffff0000
+#define DPGV0_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK__SHIFT 0x10
+#define DPGV1_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK_MASK 0xffff
+#define DPGV1_PIPE_URGENCY_CONTROL__URGENCY_LOW_WATERMARK__SHIFT 0x0
+#define DPGV1_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK_MASK 0xffff0000
+#define DPGV1_PIPE_URGENCY_CONTROL__URGENCY_HIGH_WATERMARK__SHIFT 0x10
+#define DPGV0_PIPE_DPM_CONTROL__DPM_ENABLE_MASK 0x1
+#define DPGV0_PIPE_DPM_CONTROL__DPM_ENABLE__SHIFT 0x0
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE_MASK 0x10
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE__SHIFT 0x4
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON_MASK 0x100
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON__SHIFT 0x8
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK_MASK 0x3000
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK__SHIFT 0xc
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK 0xffff0000
+#define DPGV0_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK__SHIFT 0x10
+#define DPGV1_PIPE_DPM_CONTROL__DPM_ENABLE_MASK 0x1
+#define DPGV1_PIPE_DPM_CONTROL__DPM_ENABLE__SHIFT 0x0
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE_MASK 0x10
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_ENABLE__SHIFT 0x4
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON_MASK 0x100
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_FORCE_ON__SHIFT 0x8
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK_MASK 0x3000
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK__SHIFT 0xc
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK_MASK 0xffff0000
+#define DPGV1_PIPE_DPM_CONTROL__MCLK_CHANGE_WATERMARK__SHIFT 0x10
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_ENABLE_MASK 0x1
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_ENABLE__SHIFT 0x0
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR_MASK 0x10
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR__SHIFT 0x4
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON_MASK 0x20
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON__SHIFT 0x5
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA_MASK 0x40
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA__SHIFT 0x6
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC_MASK 0x80
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC__SHIFT 0x7
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON_MASK 0x100
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON__SHIFT 0x8
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK_MASK 0x200
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK__SHIFT 0x9
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH_MASK 0x400
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH__SHIFT 0xa
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON_MASK 0x800
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON__SHIFT 0xb
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK 0xffff0000
+#define DPGV0_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK__SHIFT 0x10
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_ENABLE_MASK 0x1
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_ENABLE__SHIFT 0x0
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR_MASK 0x10
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_CURSOR__SHIFT 0x4
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON_MASK 0x20
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_ICON__SHIFT 0x5
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA_MASK 0x40
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_VGA__SHIFT 0x6
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC_MASK 0x80
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_IGNORE_FBC__SHIFT 0x7
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON_MASK 0x100
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_FORCE_ON__SHIFT 0x8
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK_MASK 0x200
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_WM_HIGH_EXCLUDES_VBLANK__SHIFT 0x9
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH_MASK 0x400
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_URGENT_IN_NOT_SELF_REFRESH__SHIFT 0xa
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON_MASK 0x800
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_SELF_REFRESH_FORCE_ON__SHIFT 0xb
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK 0xffff0000
+#define DPGV1_PIPE_STUTTER_CONTROL__STUTTER_EXIT_SELF_REFRESH_WATERMARK__SHIFT 0x10
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE_MASK 0x1
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE__SHIFT 0x0
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST_MASK 0x10
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST__SHIFT 0x4
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST_MASK 0x100
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST__SHIFT 0x8
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON_MASK 0x200
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON__SHIFT 0x9
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT_MASK 0x400
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT__SHIFT 0xa
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK 0xffff0000
+#define DPGV0_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK__SHIFT 0x10
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE_MASK 0x1
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_ENABLE__SHIFT 0x0
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST_MASK 0x10
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_URGENT_DURING_REQUEST__SHIFT 0x4
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST_MASK 0x100
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST__SHIFT 0x8
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON_MASK 0x200
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_FORCE_ON__SHIFT 0x9
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT_MASK 0x400
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_ALLOW_FOR_URGENT__SHIFT 0xa
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK_MASK 0xffff0000
+#define DPGV1_PIPE_NB_PSTATE_CHANGE_CONTROL__NB_PSTATE_CHANGE_WATERMARK__SHIFT 0x10
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH_MASK 0x1
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH__SHIFT 0x0
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH_MASK 0x10
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH__SHIFT 0x4
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH_MASK 0x20
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH__SHIFT 0x5
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH_MASK 0x40
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH__SHIFT 0x6
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH_MASK 0x80
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH__SHIFT 0x7
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH_MASK 0x100
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH__SHIFT 0x8
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH_MASK 0x200
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH__SHIFT 0x9
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH_MASK 0x400
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH__SHIFT 0xa
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH_MASK 0x800
+#define DPGV0_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH__SHIFT 0xb
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH_MASK 0x1
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_ENABLE_NONLPTCH__SHIFT 0x0
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH_MASK 0x10
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_CURSOR_NONLPTCH__SHIFT 0x4
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH_MASK 0x20
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_ICON_NONLPTCH__SHIFT 0x5
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH_MASK 0x40
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_VGA_NONLPTCH__SHIFT 0x6
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH_MASK 0x80
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_IGNORE_FBC_NONLPTCH__SHIFT 0x7
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH_MASK 0x100
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_FORCE_ON_NONLPTCH__SHIFT 0x8
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH_MASK 0x200
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_WM_HIGH_EXCLUDES_VBLANK_NONLPTCH__SHIFT 0x9
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH_MASK 0x400
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_URGENT_IN_NOT_SELF_REFRESH_NONLPTCH__SHIFT 0xa
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH_MASK 0x800
+#define DPGV1_PIPE_STUTTER_CONTROL_NONLPTCH__STUTTER_SELF_REFRESH_FORCE_ON_NONLPTCH__SHIFT 0xb
+#define DPGV0_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER_MASK 0x7
+#define DPGV0_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER__SHIFT 0x0
+#define DPGV0_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER_MASK 0x70
+#define DPGV0_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER__SHIFT 0x4
+#define DPGV1_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER_MASK 0x7
+#define DPGV1_REPEATER_PROGRAM__REG_DPG_DMIFRC_REPEATER__SHIFT 0x0
+#define DPGV1_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER_MASK 0x70
+#define DPGV1_REPEATER_PROGRAM__REG_DMIFRC_DPG_REPEATER__SHIFT 0x4
+#define DPGV0_HW_DEBUG_A__DPG_HW_DEBUG_A_MASK 0xffffffff
+#define DPGV0_HW_DEBUG_A__DPG_HW_DEBUG_A__SHIFT 0x0
+#define DPGV1_HW_DEBUG_A__DPG_HW_DEBUG_A_MASK 0xffffffff
+#define DPGV1_HW_DEBUG_A__DPG_HW_DEBUG_A__SHIFT 0x0
+#define DPGV0_HW_DEBUG_B__DPG_HW_DEBUG_B_MASK 0xffffffff
+#define DPGV0_HW_DEBUG_B__DPG_HW_DEBUG_B__SHIFT 0x0
+#define DPGV1_HW_DEBUG_B__DPG_HW_DEBUG_B_MASK 0xffffffff
+#define DPGV1_HW_DEBUG_B__DPG_HW_DEBUG_B__SHIFT 0x0
+#define DPGV0_HW_DEBUG_11__DPG_HW_DEBUG_11_MASK 0x1
+#define DPGV0_HW_DEBUG_11__DPG_HW_DEBUG_11__SHIFT 0x0
+#define DPGV1_HW_DEBUG_11__DPG_HW_DEBUG_11_MASK 0x1
+#define DPGV1_HW_DEBUG_11__DPG_HW_DEBUG_11__SHIFT 0x0
+#define DPGV0_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK_MASK 0x1
+#define DPGV0_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK__SHIFT 0x0
+#define DPGV1_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK_MASK 0x1
+#define DPGV1_CHK_PRE_PROC_CNTL__DPG_DISABLE_DMIF_BUF_CHK__SHIFT 0x0
+#define DPGV_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_INDEX_MASK 0xff
+#define DPGV_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DPGV_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DPGV_TEST_DEBUG_INDEX__DPG_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DPGV_TEST_DEBUG_DATA__DPG_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DPGV_TEST_DEBUG_DATA__DPG_TEST_DEBUG_DATA__SHIFT 0x0
+#define AZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE_MASK 0x1ffff
+#define AZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE_MASK 0xffffffff
+#define AZROOT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__AZALIA_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID_MASK 0xffffffff
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__AZALIA_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_REVISION_ID__AZALIA_CODEC_ROOT_PARAMETER_REVISION_ID_MASK 0xffffffff
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_REVISION_ID__AZALIA_CODEC_ROOT_PARAMETER_REVISION_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_SUBORDINATE_NODE_COUNT__AZALIA_CODEC_ROOT_PARAMETER_SUBORDINATE_NODE_COUNT_MASK 0xffffffff
+#define AZALIA_F2_CODEC_ROOT_PARAMETER_SUBORDINATE_NODE_COUNT__AZALIA_CODEC_ROOT_PARAMETER_SUBORDINATE_NODE_COUNT__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUBORDINATE_NODE_COUNT__AZALIA_CODEC_FUNCTION_PARAMETER_SUBORDINATE_NODE_COUNT_MASK 0xffffffff
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUBORDINATE_NODE_COUNT__AZALIA_CODEC_FUNCTION_PARAMETER_SUBORDINATE_NODE_COUNT__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__AZALIA_CODEC_FUNCTION_PARAMETER_GROUP_TYPE_MASK 0xffffffff
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__AZALIA_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__AZALIA_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__AZALIA_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__AZALIA_CODEC_FUNCTION_PARAMETER_POWER_STATES_MASK 0x3fffffff
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__AZALIA_CODEC_FUNCTION_PARAMETER_POWER_STATES__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__CLKSTOP_MASK 0x40000000
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__CLKSTOP__SHIFT 0x1e
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__EPSS_MASK 0x80000000
+#define AZALIA_F2_CODEC_FUNCTION_PARAMETER_POWER_STATES__EPSS__SHIFT 0x1f
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SET_MASK 0xf
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SET__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_ACT_MASK 0xf0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_ACT__SHIFT 0x4
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__CLKSTOPOK_MASK 0x200
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__CLKSTOPOK__SHIFT 0x9
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SETTINGS_RESET_MASK 0x400
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SETTINGS_RESET__SHIFT 0xa
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET__CODEC_RESET_MASK 0x1
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESET__CODEC_RESET__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE0_MASK 0xff
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE0__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE1_MASK 0xff00
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE1__SHIFT 0x8
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE2_MASK 0xff0000
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE2__SHIFT 0x10
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE3_MASK 0xff000000
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE3__SHIFT 0x18
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_2__SUBSYSTEM_ID_BYTE1_MASK 0xff
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_2__SUBSYSTEM_ID_BYTE1__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_3__SUBSYSTEM_ID_BYTE2_MASK 0xff
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_3__SUBSYSTEM_ID_BYTE2__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_4__SUBSYSTEM_ID_BYTE3_MASK 0xff
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID_4__SUBSYSTEM_ID_BYTE3__SHIFT 0x0
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION__CONVERTER_SYNCHRONIZATION_MASK 0x7f
+#define AZALIA_F2_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION__CONVERTER_SYNCHRONIZATION__SHIFT 0x0
+#define AZALIA_F0_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__AZALIA_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID_MASK 0xffffffff
+#define AZALIA_F0_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__AZALIA_CODEC_ROOT_PARAMETER_VENDOR_AND_DEVICE_ID__SHIFT 0x0
+#define AZALIA_F0_CODEC_ROOT_PARAMETER_REVISION_ID__AZALIA_CODEC_ROOT_PARAMETER_REVISION_ID_MASK 0xffffffff
+#define AZALIA_F0_CODEC_ROOT_PARAMETER_REVISION_ID__AZALIA_CODEC_ROOT_PARAMETER_REVISION_ID__SHIFT 0x0
+#define AZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL__HBR_CHANNEL_COUNT_MASK 0x7
+#define AZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL__HBR_CHANNEL_COUNT__SHIFT 0x0
+#define AZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL__COMPRESSED_CHANNEL_COUNT_MASK 0x70
+#define AZALIA_F0_CODEC_CHANNEL_COUNT_CONTROL__COMPRESSED_CHANNEL_COUNT__SHIFT 0x4
+#define AZALIA_F0_CODEC_RESYNC_FIFO_CONTROL__RESYNC_FIFO_STARTUP_KEEPOUT_WINDOW_MASK 0x3f
+#define AZALIA_F0_CODEC_RESYNC_FIFO_CONTROL__RESYNC_FIFO_STARTUP_KEEPOUT_WINDOW__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__AZALIA_CODEC_FUNCTION_PARAMETER_GROUP_TYPE_MASK 0xffffffff
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__AZALIA_CODEC_FUNCTION_PARAMETER_GROUP_TYPE__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__AZALIA_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__AZALIA_CODEC_FUNCTION_PARAMETER_STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__AZALIA_CODEC_FUNCTION_PARAMETER_POWER_STATES_MASK 0x3fffffff
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__AZALIA_CODEC_FUNCTION_PARAMETER_POWER_STATES__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__CLKSTOP_MASK 0x40000000
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__CLKSTOP__SHIFT 0x1e
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__EPSS_MASK 0x80000000
+#define AZALIA_F0_CODEC_FUNCTION_PARAMETER_POWER_STATES__EPSS__SHIFT 0x1f
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SET_MASK 0xf
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SET__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_ACT_MASK 0xf0
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_ACT__SHIFT 0x4
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__CLKSTOPOK_MASK 0x200
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__CLKSTOPOK__SHIFT 0x9
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SETTINGS_RESET_MASK 0x400
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_POWER_STATE__POWER_STATE_SETTINGS_RESET__SHIFT 0xa
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESET__CODEC_RESET_MASK 0x1
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESET__CODEC_RESET__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE0_MASK 0xff
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE0__SHIFT 0x0
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE1_MASK 0xff00
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE1__SHIFT 0x8
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE2_MASK 0xff0000
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE2__SHIFT 0x10
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE3_MASK 0xff000000
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_RESPONSE_SUBSYSTEM_ID__SUBSYSTEM_ID_BYTE3__SHIFT 0x18
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION__CONVERTER_SYNCHRONIZATION_MASK 0x7f
+#define AZALIA_F0_CODEC_FUNCTION_CONTROL_CONVERTER_SYNCHRONIZATION__CONVERTER_SYNCHRONIZATION__SHIFT 0x0
+#define CC_RCU_DC_AUDIO_PORT_CONNECTIVITY__PORT_CONNECTIVITY_MASK 0x7
+#define CC_RCU_DC_AUDIO_PORT_CONNECTIVITY__PORT_CONNECTIVITY__SHIFT 0x0
+#define CC_RCU_DC_AUDIO_PORT_CONNECTIVITY__PORT_CONNECTIVITY_OVERRIDE_ENABLE_MASK 0x10
+#define CC_RCU_DC_AUDIO_PORT_CONNECTIVITY__PORT_CONNECTIVITY_OVERRIDE_ENABLE__SHIFT 0x4
+#define CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY__INPUT_PORT_CONNECTIVITY_MASK 0x7
+#define CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY__INPUT_PORT_CONNECTIVITY__SHIFT 0x0
+#define CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY__INPUT_PORT_CONNECTIVITY_OVERRIDE_ENABLE_MASK 0x10
+#define CC_RCU_DC_AUDIO_INPUT_PORT_CONNECTIVITY__INPUT_PORT_CONNECTIVITY_OVERRIDE_ENABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_DEBUG__DISABLE_FORMAT_COMPARISON_MASK 0x3f
+#define AZALIA_F0_CODEC_DEBUG__DISABLE_FORMAT_COMPARISON__SHIFT 0x0
+#define AZALIA_F0_CODEC_DEBUG__CODEC_DEBUG_MASK 0xffffffc0
+#define AZALIA_F0_CODEC_DEBUG__CODEC_DEBUG__SHIFT 0x6
+#define AZALIA_F0_GTC_GROUP_OFFSET0__GTC_GROUP_OFFSET0_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET0__GTC_GROUP_OFFSET0__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET1__GTC_GROUP_OFFSET1_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET1__GTC_GROUP_OFFSET1__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET2__GTC_GROUP_OFFSET2_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET2__GTC_GROUP_OFFSET2__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET3__GTC_GROUP_OFFSET3_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET3__GTC_GROUP_OFFSET3__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET4__GTC_GROUP_OFFSET4_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET4__GTC_GROUP_OFFSET4__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET5__GTC_GROUP_OFFSET5_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET5__GTC_GROUP_OFFSET5__SHIFT 0x0
+#define AZALIA_F0_GTC_GROUP_OFFSET6__GTC_GROUP_OFFSET6_MASK 0xffffffff
+#define AZALIA_F0_GTC_GROUP_OFFSET6__GTC_GROUP_OFFSET6__SHIFT 0x0
+#define GLOBAL_CAPABILITIES__SIXTY_FOUR_BIT_ADDRESS_SUPPORTED_MASK 0x1
+#define GLOBAL_CAPABILITIES__SIXTY_FOUR_BIT_ADDRESS_SUPPORTED__SHIFT 0x0
+#define GLOBAL_CAPABILITIES__NUMBER_OF_SERIAL_DATA_OUTPUT_SIGNALS_MASK 0x6
+#define GLOBAL_CAPABILITIES__NUMBER_OF_SERIAL_DATA_OUTPUT_SIGNALS__SHIFT 0x1
+#define GLOBAL_CAPABILITIES__NUMBER_OF_BIDIRECTIONAL_STREAMS_SUPPORTED_MASK 0xf8
+#define GLOBAL_CAPABILITIES__NUMBER_OF_BIDIRECTIONAL_STREAMS_SUPPORTED__SHIFT 0x3
+#define GLOBAL_CAPABILITIES__NUMBER_OF_INPUT_STREAMS_SUPPORTED_MASK 0xf00
+#define GLOBAL_CAPABILITIES__NUMBER_OF_INPUT_STREAMS_SUPPORTED__SHIFT 0x8
+#define GLOBAL_CAPABILITIES__NUMBER_OF_OUTPUT_STREAMS_SUPPORTED_MASK 0xf000
+#define GLOBAL_CAPABILITIES__NUMBER_OF_OUTPUT_STREAMS_SUPPORTED__SHIFT 0xc
+#define MINOR_VERSION__MINOR_VERSION_MASK 0xff
+#define MINOR_VERSION__MINOR_VERSION__SHIFT 0x0
+#define MAJOR_VERSION__MAJOR_VERSION_MASK 0xff
+#define MAJOR_VERSION__MAJOR_VERSION__SHIFT 0x0
+#define OUTPUT_PAYLOAD_CAPABILITY__OUTPUT_PAYLOAD_CAPABILITY_MASK 0xffff
+#define OUTPUT_PAYLOAD_CAPABILITY__OUTPUT_PAYLOAD_CAPABILITY__SHIFT 0x0
+#define INPUT_PAYLOAD_CAPABILITY__INPUT_PAYLOAD_CAPABILITY_MASK 0xffff
+#define INPUT_PAYLOAD_CAPABILITY__INPUT_PAYLOAD_CAPABILITY__SHIFT 0x0
+#define GLOBAL_CONTROL__CONTROLLER_RESET_MASK 0x1
+#define GLOBAL_CONTROL__CONTROLLER_RESET__SHIFT 0x0
+#define GLOBAL_CONTROL__FLUSH_CONTROL_MASK 0x2
+#define GLOBAL_CONTROL__FLUSH_CONTROL__SHIFT 0x1
+#define GLOBAL_CONTROL__ACCEPT_UNSOLICITED_RESPONSE_ENABLE_MASK 0x100
+#define GLOBAL_CONTROL__ACCEPT_UNSOLICITED_RESPONSE_ENABLE__SHIFT 0x8
+#define WAKE_ENABLE__SDIN_WAKE_ENABLE_FLAG_MASK 0x1
+#define WAKE_ENABLE__SDIN_WAKE_ENABLE_FLAG__SHIFT 0x0
+#define STATE_CHANGE_STATUS__STATE_CHANGE_STATUS_MASK 0x1
+#define STATE_CHANGE_STATUS__STATE_CHANGE_STATUS__SHIFT 0x0
+#define GLOBAL_STATUS__FLUSH_STATUS_MASK 0x2
+#define GLOBAL_STATUS__FLUSH_STATUS__SHIFT 0x1
+#define OUTPUT_STREAM_PAYLOAD_CAPABILITY__OUTSTRMPAY_MASK 0xffff
+#define OUTPUT_STREAM_PAYLOAD_CAPABILITY__OUTSTRMPAY__SHIFT 0x0
+#define INPUT_STREAM_PAYLOAD_CAPABILITY__INSTRMPAY_MASK 0xffff
+#define INPUT_STREAM_PAYLOAD_CAPABILITY__INSTRMPAY__SHIFT 0x0
+#define INTERRUPT_CONTROL__STREAM_0_INTERRUPT_ENABLE_MASK 0x1
+#define INTERRUPT_CONTROL__STREAM_0_INTERRUPT_ENABLE__SHIFT 0x0
+#define INTERRUPT_CONTROL__STREAM_1_INTERRUPT_ENABLE_MASK 0x2
+#define INTERRUPT_CONTROL__STREAM_1_INTERRUPT_ENABLE__SHIFT 0x1
+#define INTERRUPT_CONTROL__STREAM_2_INTERRUPT_ENABLE_MASK 0x4
+#define INTERRUPT_CONTROL__STREAM_2_INTERRUPT_ENABLE__SHIFT 0x2
+#define INTERRUPT_CONTROL__STREAM_3_INTERRUPT_ENABLE_MASK 0x8
+#define INTERRUPT_CONTROL__STREAM_3_INTERRUPT_ENABLE__SHIFT 0x3
+#define INTERRUPT_CONTROL__STREAM_4_INTERRUPT_ENABLE_MASK 0x10
+#define INTERRUPT_CONTROL__STREAM_4_INTERRUPT_ENABLE__SHIFT 0x4
+#define INTERRUPT_CONTROL__STREAM_5_INTERRUPT_ENABLE_MASK 0x20
+#define INTERRUPT_CONTROL__STREAM_5_INTERRUPT_ENABLE__SHIFT 0x5
+#define INTERRUPT_CONTROL__STREAM_6_INTERRUPT_ENABLE_MASK 0x40
+#define INTERRUPT_CONTROL__STREAM_6_INTERRUPT_ENABLE__SHIFT 0x6
+#define INTERRUPT_CONTROL__STREAM_7_INTERRUPT_ENABLE_MASK 0x80
+#define INTERRUPT_CONTROL__STREAM_7_INTERRUPT_ENABLE__SHIFT 0x7
+#define INTERRUPT_CONTROL__STREAM_8_INTERRUPT_ENABLE_MASK 0x100
+#define INTERRUPT_CONTROL__STREAM_8_INTERRUPT_ENABLE__SHIFT 0x8
+#define INTERRUPT_CONTROL__STREAM_9_INTERRUPT_ENABLE_MASK 0x200
+#define INTERRUPT_CONTROL__STREAM_9_INTERRUPT_ENABLE__SHIFT 0x9
+#define INTERRUPT_CONTROL__STREAM_10_INTERRUPT_ENABLE_MASK 0x400
+#define INTERRUPT_CONTROL__STREAM_10_INTERRUPT_ENABLE__SHIFT 0xa
+#define INTERRUPT_CONTROL__STREAM_11_INTERRUPT_ENABLE_MASK 0x800
+#define INTERRUPT_CONTROL__STREAM_11_INTERRUPT_ENABLE__SHIFT 0xb
+#define INTERRUPT_CONTROL__STREAM_12_INTERRUPT_ENABLE_MASK 0x1000
+#define INTERRUPT_CONTROL__STREAM_12_INTERRUPT_ENABLE__SHIFT 0xc
+#define INTERRUPT_CONTROL__STREAM_13_INTERRUPT_ENABLE_MASK 0x2000
+#define INTERRUPT_CONTROL__STREAM_13_INTERRUPT_ENABLE__SHIFT 0xd
+#define INTERRUPT_CONTROL__STREAM_14_INTERRUPT_ENABLE_MASK 0x4000
+#define INTERRUPT_CONTROL__STREAM_14_INTERRUPT_ENABLE__SHIFT 0xe
+#define INTERRUPT_CONTROL__STREAM_15_INTERRUPT_ENABLE_MASK 0x8000
+#define INTERRUPT_CONTROL__STREAM_15_INTERRUPT_ENABLE__SHIFT 0xf
+#define INTERRUPT_CONTROL__CONTROLLER_INTERRUPT_ENABLE_MASK 0x40000000
+#define INTERRUPT_CONTROL__CONTROLLER_INTERRUPT_ENABLE__SHIFT 0x1e
+#define INTERRUPT_CONTROL__GLOBAL_INTERRUPT_ENABLE_MASK 0x80000000
+#define INTERRUPT_CONTROL__GLOBAL_INTERRUPT_ENABLE__SHIFT 0x1f
+#define INTERRUPT_STATUS__STREAM_0_INTERRUPT_STATUS_MASK 0x1
+#define INTERRUPT_STATUS__STREAM_0_INTERRUPT_STATUS__SHIFT 0x0
+#define INTERRUPT_STATUS__STREAM_1_INTERRUPT_STATUS_MASK 0x2
+#define INTERRUPT_STATUS__STREAM_1_INTERRUPT_STATUS__SHIFT 0x1
+#define INTERRUPT_STATUS__STREAM_2_INTERRUPT_STATUS_MASK 0x4
+#define INTERRUPT_STATUS__STREAM_2_INTERRUPT_STATUS__SHIFT 0x2
+#define INTERRUPT_STATUS__STREAM_3_INTERRUPT_STATUS_MASK 0x8
+#define INTERRUPT_STATUS__STREAM_3_INTERRUPT_STATUS__SHIFT 0x3
+#define INTERRUPT_STATUS__STREAM_4_INTERRUPT_STATUS_MASK 0x10
+#define INTERRUPT_STATUS__STREAM_4_INTERRUPT_STATUS__SHIFT 0x4
+#define INTERRUPT_STATUS__STREAM_5_INTERRUPT_STATUS_MASK 0x20
+#define INTERRUPT_STATUS__STREAM_5_INTERRUPT_STATUS__SHIFT 0x5
+#define INTERRUPT_STATUS__STREAM_6_INTERRUPT_STATUS_MASK 0x40
+#define INTERRUPT_STATUS__STREAM_6_INTERRUPT_STATUS__SHIFT 0x6
+#define INTERRUPT_STATUS__STREAM_7_INTERRUPT_STATUS_MASK 0x80
+#define INTERRUPT_STATUS__STREAM_7_INTERRUPT_STATUS__SHIFT 0x7
+#define INTERRUPT_STATUS__STREAM_8_INTERRUPT_STATUS_MASK 0x100
+#define INTERRUPT_STATUS__STREAM_8_INTERRUPT_STATUS__SHIFT 0x8
+#define INTERRUPT_STATUS__STREAM_9_INTERRUPT_STATUS_MASK 0x200
+#define INTERRUPT_STATUS__STREAM_9_INTERRUPT_STATUS__SHIFT 0x9
+#define INTERRUPT_STATUS__STREAM_10_INTERRUPT_STATUS_MASK 0x400
+#define INTERRUPT_STATUS__STREAM_10_INTERRUPT_STATUS__SHIFT 0xa
+#define INTERRUPT_STATUS__STREAM_11_INTERRUPT_STATUS_MASK 0x800
+#define INTERRUPT_STATUS__STREAM_11_INTERRUPT_STATUS__SHIFT 0xb
+#define INTERRUPT_STATUS__STREAM_12_INTERRUPT_STATUS_MASK 0x1000
+#define INTERRUPT_STATUS__STREAM_12_INTERRUPT_STATUS__SHIFT 0xc
+#define INTERRUPT_STATUS__STREAM_13_INTERRUPT_STATUS_MASK 0x2000
+#define INTERRUPT_STATUS__STREAM_13_INTERRUPT_STATUS__SHIFT 0xd
+#define INTERRUPT_STATUS__STREAM_14_INTERRUPT_STATUS_MASK 0x4000
+#define INTERRUPT_STATUS__STREAM_14_INTERRUPT_STATUS__SHIFT 0xe
+#define INTERRUPT_STATUS__STREAM_15_INTERRUPT_STATUS_MASK 0x8000
+#define INTERRUPT_STATUS__STREAM_15_INTERRUPT_STATUS__SHIFT 0xf
+#define INTERRUPT_STATUS__CONTROLLER_INTERRUPT_STATUS_MASK 0x40000000
+#define INTERRUPT_STATUS__CONTROLLER_INTERRUPT_STATUS__SHIFT 0x1e
+#define INTERRUPT_STATUS__GLOBAL_INTERRUPT_STATUS_MASK 0x80000000
+#define INTERRUPT_STATUS__GLOBAL_INTERRUPT_STATUS__SHIFT 0x1f
+#define WALL_CLOCK_COUNTER__WALL_CLOCK_COUNTER_MASK 0xffffffff
+#define WALL_CLOCK_COUNTER__WALL_CLOCK_COUNTER__SHIFT 0x0
+#define STREAM_SYNCHRONIZATION__STREAM_0_SYNCHRONIZATION_MASK 0x1
+#define STREAM_SYNCHRONIZATION__STREAM_0_SYNCHRONIZATION__SHIFT 0x0
+#define STREAM_SYNCHRONIZATION__STREAM_1_SYNCHRONIZATION_MASK 0x2
+#define STREAM_SYNCHRONIZATION__STREAM_1_SYNCHRONIZATION__SHIFT 0x1
+#define STREAM_SYNCHRONIZATION__STREAM_2_SYNCHRONIZATION_MASK 0x4
+#define STREAM_SYNCHRONIZATION__STREAM_2_SYNCHRONIZATION__SHIFT 0x2
+#define STREAM_SYNCHRONIZATION__STREAM_3_SYNCHRONIZATION_MASK 0x8
+#define STREAM_SYNCHRONIZATION__STREAM_3_SYNCHRONIZATION__SHIFT 0x3
+#define STREAM_SYNCHRONIZATION__STREAM_4_SYNCHRONIZATION_MASK 0x10
+#define STREAM_SYNCHRONIZATION__STREAM_4_SYNCHRONIZATION__SHIFT 0x4
+#define STREAM_SYNCHRONIZATION__STREAM_5_SYNCHRONIZATION_MASK 0x20
+#define STREAM_SYNCHRONIZATION__STREAM_5_SYNCHRONIZATION__SHIFT 0x5
+#define STREAM_SYNCHRONIZATION__STREAM_6_SYNCHRONIZATION_MASK 0x40
+#define STREAM_SYNCHRONIZATION__STREAM_6_SYNCHRONIZATION__SHIFT 0x6
+#define STREAM_SYNCHRONIZATION__STREAM_7_SYNCHRONIZATION_MASK 0x80
+#define STREAM_SYNCHRONIZATION__STREAM_7_SYNCHRONIZATION__SHIFT 0x7
+#define STREAM_SYNCHRONIZATION__STREAM_8_SYNCHRONIZATION_MASK 0x100
+#define STREAM_SYNCHRONIZATION__STREAM_8_SYNCHRONIZATION__SHIFT 0x8
+#define STREAM_SYNCHRONIZATION__STREAM_9_SYNCHRONIZATION_MASK 0x200
+#define STREAM_SYNCHRONIZATION__STREAM_9_SYNCHRONIZATION__SHIFT 0x9
+#define STREAM_SYNCHRONIZATION__STREAM_10_SYNCHRONIZATION_MASK 0x400
+#define STREAM_SYNCHRONIZATION__STREAM_10_SYNCHRONIZATION__SHIFT 0xa
+#define STREAM_SYNCHRONIZATION__STREAM_11_SYNCHRONIZATION_MASK 0x800
+#define STREAM_SYNCHRONIZATION__STREAM_11_SYNCHRONIZATION__SHIFT 0xb
+#define STREAM_SYNCHRONIZATION__STREAM_12_SYNCHRONIZATION_MASK 0x1000
+#define STREAM_SYNCHRONIZATION__STREAM_12_SYNCHRONIZATION__SHIFT 0xc
+#define STREAM_SYNCHRONIZATION__STREAM_13_SYNCHRONIZATION_MASK 0x2000
+#define STREAM_SYNCHRONIZATION__STREAM_13_SYNCHRONIZATION__SHIFT 0xd
+#define STREAM_SYNCHRONIZATION__STREAM_14_SYNCHRONIZATION_MASK 0x4000
+#define STREAM_SYNCHRONIZATION__STREAM_14_SYNCHRONIZATION__SHIFT 0xe
+#define STREAM_SYNCHRONIZATION__STREAM_15_SYNCHRONIZATION_MASK 0x8000
+#define STREAM_SYNCHRONIZATION__STREAM_15_SYNCHRONIZATION__SHIFT 0xf
+#define CORB_LOWER_BASE_ADDRESS__CORB_LOWER_BASE_UNIMPLEMENTED_BITS_MASK 0x7f
+#define CORB_LOWER_BASE_ADDRESS__CORB_LOWER_BASE_UNIMPLEMENTED_BITS__SHIFT 0x0
+#define CORB_LOWER_BASE_ADDRESS__CORB_LOWER_BASE_ADDRESS_MASK 0xffffff80
+#define CORB_LOWER_BASE_ADDRESS__CORB_LOWER_BASE_ADDRESS__SHIFT 0x7
+#define CORB_UPPER_BASE_ADDRESS__CORB_UPPER_BASE_ADDRESS_MASK 0xffffffff
+#define CORB_UPPER_BASE_ADDRESS__CORB_UPPER_BASE_ADDRESS__SHIFT 0x0
+#define CORB_WRITE_POINTER__CORB_WRITE_POINTER_MASK 0xff
+#define CORB_WRITE_POINTER__CORB_WRITE_POINTER__SHIFT 0x0
+#define CORB_READ_POINTER__CORB_READ_POINTER_MASK 0xff
+#define CORB_READ_POINTER__CORB_READ_POINTER__SHIFT 0x0
+#define CORB_READ_POINTER__CORB_READ_POINTER_RESET_MASK 0x8000
+#define CORB_READ_POINTER__CORB_READ_POINTER_RESET__SHIFT 0xf
+#define CORB_CONTROL__CORB_MEMORY_ERROR_INTERRUPT_ENABLE_MASK 0x1
+#define CORB_CONTROL__CORB_MEMORY_ERROR_INTERRUPT_ENABLE__SHIFT 0x0
+#define CORB_CONTROL__ENABLE_CORB_DMA_ENGINE_MASK 0x2
+#define CORB_CONTROL__ENABLE_CORB_DMA_ENGINE__SHIFT 0x1
+#define CORB_STATUS__CORB_MEMORY_ERROR_INDICATION_MASK 0x1
+#define CORB_STATUS__CORB_MEMORY_ERROR_INDICATION__SHIFT 0x0
+#define CORB_SIZE__CORB_SIZE_MASK 0x3
+#define CORB_SIZE__CORB_SIZE__SHIFT 0x0
+#define CORB_SIZE__CORB_SIZE_CAPABILITY_MASK 0xf0
+#define CORB_SIZE__CORB_SIZE_CAPABILITY__SHIFT 0x4
+#define RIRB_LOWER_BASE_ADDRESS__RIRB_LOWER_BASE_UNIMPLEMENTED_BITS_MASK 0x7f
+#define RIRB_LOWER_BASE_ADDRESS__RIRB_LOWER_BASE_UNIMPLEMENTED_BITS__SHIFT 0x0
+#define RIRB_LOWER_BASE_ADDRESS__RIRB_LOWER_BASE_ADDRESS_MASK 0xffffff80
+#define RIRB_LOWER_BASE_ADDRESS__RIRB_LOWER_BASE_ADDRESS__SHIFT 0x7
+#define RIRB_UPPER_BASE_ADDRESS__RIRB_UPPER_BASE_ADDRESS_MASK 0xffffffff
+#define RIRB_UPPER_BASE_ADDRESS__RIRB_UPPER_BASE_ADDRESS__SHIFT 0x0
+#define RIRB_WRITE_POINTER__RIRB_WRITE_POINTER_MASK 0xff
+#define RIRB_WRITE_POINTER__RIRB_WRITE_POINTER__SHIFT 0x0
+#define RIRB_WRITE_POINTER__RIRB_WRITE_POINTER_RESET_MASK 0x8000
+#define RIRB_WRITE_POINTER__RIRB_WRITE_POINTER_RESET__SHIFT 0xf
+#define RESPONSE_INTERRUPT_COUNT__N_RESPONSE_INTERRUPT_COUNT_MASK 0xff
+#define RESPONSE_INTERRUPT_COUNT__N_RESPONSE_INTERRUPT_COUNT__SHIFT 0x0
+#define RIRB_CONTROL__RESPONSE_INTERRUPT_CONTROL_MASK 0x1
+#define RIRB_CONTROL__RESPONSE_INTERRUPT_CONTROL__SHIFT 0x0
+#define RIRB_CONTROL__RIRB_DMA_ENABLE_MASK 0x2
+#define RIRB_CONTROL__RIRB_DMA_ENABLE__SHIFT 0x1
+#define RIRB_CONTROL__RESPONSE_OVERRUN_INTERRUPT_CONTROL_MASK 0x4
+#define RIRB_CONTROL__RESPONSE_OVERRUN_INTERRUPT_CONTROL__SHIFT 0x2
+#define RIRB_STATUS__RESPONSE_INTERRUPT_MASK 0x1
+#define RIRB_STATUS__RESPONSE_INTERRUPT__SHIFT 0x0
+#define RIRB_STATUS__RESPONSE_OVERRUN_INTERRUPT_STATUS_MASK 0x4
+#define RIRB_STATUS__RESPONSE_OVERRUN_INTERRUPT_STATUS__SHIFT 0x2
+#define RIRB_SIZE__RIRB_SIZE_MASK 0x3
+#define RIRB_SIZE__RIRB_SIZE__SHIFT 0x0
+#define RIRB_SIZE__RIRB_SIZE_CAPABILITY_MASK 0xf0
+#define RIRB_SIZE__RIRB_SIZE_CAPABILITY__SHIFT 0x4
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE__IMMEDIATE_COMMAND_WRITE_VERB_AND_PAYLOAD_MASK 0xfffffff
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE__IMMEDIATE_COMMAND_WRITE_VERB_AND_PAYLOAD__SHIFT 0x0
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE__IMMEDIATE_COMMAND_WRITE_CODEC_ADDRESS_MASK 0xf0000000
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE__IMMEDIATE_COMMAND_WRITE_CODEC_ADDRESS__SHIFT 0x1c
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE_MASK 0xffff
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE_MASK 0xffffffff
+#define IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define IMMEDIATE_RESPONSE_INPUT_INTERFACE__IMMEDIATE_RESPONSE_READ_MASK 0xffffffff
+#define IMMEDIATE_RESPONSE_INPUT_INTERFACE__IMMEDIATE_RESPONSE_READ__SHIFT 0x0
+#define IMMEDIATE_COMMAND_STATUS__IMMEDIATE_COMMAND_BUSY_MASK 0x1
+#define IMMEDIATE_COMMAND_STATUS__IMMEDIATE_COMMAND_BUSY__SHIFT 0x0
+#define IMMEDIATE_COMMAND_STATUS__IMMEDIATE_RESULT_VALID_MASK 0x2
+#define IMMEDIATE_COMMAND_STATUS__IMMEDIATE_RESULT_VALID__SHIFT 0x1
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_BUFFER_ENABLE_MASK 0x1
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_BUFFER_ENABLE__SHIFT 0x0
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_LOWER_BASE_UNIMPLEMENTED_BITS_MASK 0x7e
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_LOWER_BASE_UNIMPLEMENTED_BITS__SHIFT 0x1
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_LOWER_BASE_ADDRESS_MASK 0xffffff80
+#define DMA_POSITION_LOWER_BASE_ADDRESS__DMA_POSITION_LOWER_BASE_ADDRESS__SHIFT 0x7
+#define DMA_POSITION_UPPER_BASE_ADDRESS__DMA_POSITION_UPPER_BASE_ADDRESS_MASK 0xffffffff
+#define DMA_POSITION_UPPER_BASE_ADDRESS__DMA_POSITION_UPPER_BASE_ADDRESS__SHIFT 0x0
+#define WALL_CLOCK_COUNTER_ALIAS__WALL_CLOCK_COUNTER_ALIAS_MASK 0xffffffff
+#define WALL_CLOCK_COUNTER_ALIAS__WALL_CLOCK_COUNTER_ALIAS__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_RESET_MASK 0x1
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_RESET__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_RUN_MASK 0x2
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_RUN__SHIFT 0x1
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__INTERRUPT_ON_COMPLETION_ENABLE_MASK 0x4
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__INTERRUPT_ON_COMPLETION_ENABLE__SHIFT 0x2
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_ERROR_INTERRUPT_ENABLE_MASK 0x8
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_ERROR_INTERRUPT_ENABLE__SHIFT 0x3
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__DESCRIPTOR_ERROR_INTERRUPT_ENABLE_MASK 0x10
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__DESCRIPTOR_ERROR_INTERRUPT_ENABLE__SHIFT 0x4
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STRIPE_CONTROL_MASK 0x30000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STRIPE_CONTROL__SHIFT 0x10
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__TRAFFIC_PRIORITY_MASK 0x40000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__TRAFFIC_PRIORITY__SHIFT 0x12
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_NUMBER_MASK 0xf00000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__STREAM_NUMBER__SHIFT 0x14
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__BUFFER_COMPLETION_INTERRUPT_STATUS_MASK 0x4000000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__BUFFER_COMPLETION_INTERRUPT_STATUS__SHIFT 0x1a
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_ERROR_MASK 0x8000000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_ERROR__SHIFT 0x1b
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__DESCRIPTOR_ERROR_MASK 0x10000000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__DESCRIPTOR_ERROR__SHIFT 0x1c
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_READY_MASK 0x20000000
+#define OUTPUT_STREAM_DESCRIPTOR_CONTROL_AND_STATUS__FIFO_READY__SHIFT 0x1d
+#define OUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER__LINK_POSITION_IN_BUFFER_MASK 0xffffffff
+#define OUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER__LINK_POSITION_IN_BUFFER__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_CYCLIC_BUFFER_LENGTH__CYCLIC_BUFFER_LENGTH_MASK 0xffffffff
+#define OUTPUT_STREAM_DESCRIPTOR_CYCLIC_BUFFER_LENGTH__CYCLIC_BUFFER_LENGTH__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_LAST_VALID_INDEX__LAST_VALID_INDEX_MASK 0xff
+#define OUTPUT_STREAM_DESCRIPTOR_LAST_VALID_INDEX__LAST_VALID_INDEX__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_FIFO_SIZE__FIFO_SIZE_MASK 0xffff
+#define OUTPUT_STREAM_DESCRIPTOR_FIFO_SIZE__FIFO_SIZE__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__NUMBER_OF_CHANNELS_MASK 0xf
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__NUMBER_OF_CHANNELS__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__BITS_PER_SAMPLE_MASK 0x70
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__BITS_PER_SAMPLE__SHIFT 0x4
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_DIVISOR_MASK 0x700
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_DIVISOR__SHIFT 0x8
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_MULTIPLE_MASK 0x3800
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_MULTIPLE__SHIFT 0xb
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_RATE_MASK 0x4000
+#define OUTPUT_STREAM_DESCRIPTOR_FORMAT__SAMPLE_BASE_RATE__SHIFT 0xe
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_LOWER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_LOWER_BASE_ADDRESS_UNIMPLEMENTED_BITS_MASK 0x7f
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_LOWER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_LOWER_BASE_ADDRESS_UNIMPLEMENTED_BITS__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_LOWER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_LOWER_BASE_ADDRESS_MASK 0xffffff80
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_LOWER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_LOWER_BASE_ADDRESS__SHIFT 0x7
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_UPPER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_UPPER_BASE_ADDRESS_MASK 0xffffffff
+#define OUTPUT_STREAM_DESCRIPTOR_BDL_POINTER_UPPER_BASE_ADDRESS__BUFFER_DESCRIPTOR_LIST_UPPER_BASE_ADDRESS__SHIFT 0x0
+#define OUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER_ALIAS__LINK_POSITION_IN_BUFFER_ALIAS_MASK 0xffffffff
+#define OUTPUT_STREAM_DESCRIPTOR_LINK_POSITION_IN_CURRENT_BUFFER_ALIAS__LINK_POSITION_IN_BUFFER_ALIAS__SHIFT 0x0
+#define AZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE_MASK 0x1ffff
+#define AZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE_MASK 0xffffffff
+#define AZENDPOINT_IMMEDIATE_COMMAND_OUTPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE_MASK 0x10
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE__SHIFT 0x4
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F2_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS_MASK 0xf
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE_MASK 0x70
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR_MASK 0x700
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR__SHIFT 0x8
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE_MASK 0x3800
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE__SHIFT 0xb
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE_MASK 0x4000
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE__SHIFT 0xe
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_MASK 0x8000
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE__SHIFT 0xf
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_R_MASK 0x8000
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_R__SHIFT 0xf
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID_MASK 0xf
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN_MASK 0x1
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__V_MASK 0x2
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__V__SHIFT 0x1
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG_MASK 0x4
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG__SHIFT 0x2
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE_MASK 0x8
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE__SHIFT 0x3
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY_MASK 0x10
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY__SHIFT 0x4
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO_MASK 0x20
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO__SHIFT 0x5
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO_MASK 0x40
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO__SHIFT 0x6
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__L_MASK 0x80
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__L__SHIFT 0x7
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC_MASK 0x7f00
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC__SHIFT 0x8
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE_MASK 0x800000
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE__SHIFT 0x17
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_2__CC_MASK 0x7f
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_2__CC__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3__KEEPALIVE_MASK 0x80
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER_3__KEEPALIVE__SHIFT 0x7
+#define AZALIA_F2_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CONTROL_MASK 0x3
+#define AZALIA_F2_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CONTROL__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CAPABILITY_MASK 0x700000
+#define AZALIA_F2_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CAPABILITY__SHIFT 0x14
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_RAMP_RATE__RAMP_RATE_MASK 0xff
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_RAMP_RATE__RAMP_RATE__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_OFFSET_CHANGED_MASK 0x2
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_OFFSET_CHANGED__SHIFT 0x1
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_GROUP_MASK 0x70
+#define AZALIA_F2_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_GROUP__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F2_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY_MASK 0x4
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY__SHIFT 0x2
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE_MASK 0x8
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE__SHIFT 0x3
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE_MASK 0x10
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE_MASK 0x20
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE__SHIFT 0x5
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS_MASK 0x40
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS__SHIFT 0x6
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__HDMI_MASK 0x80
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__HDMI__SHIFT 0x7
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL_MASK 0xff00
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE_MASK 0x10000
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE__SHIFT 0x10
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__DP_MASK 0x1000000
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CAPABILITIES__DP__SHIFT 0x18
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CONNECTION_LIST_LENGTH__CONNECTION_LIST_LENGTH_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_PARAMETER_CONNECTION_LIST_LENGTH__CONNECTION_LIST_LENGTH__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONNECTION_LIST_ENTRY__CONNECTION_LIST_ENTRY_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONNECTION_LIST_ENTRY__CONNECTION_LIST_ENTRY__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL__OUT_ENABLE_MASK 0x40
+#define AZALIA_F2_CODEC_PIN_CONTROL_WIDGET_CONTROL__OUT_ENABLE__SHIFT 0x6
+#define AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG_MASK 0x3f
+#define AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE_MASK 0x80
+#define AZALIA_F2_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE__SHIFT 0x7
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE_MASK 0x7fffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__PRESENCE_DETECT_MASK 0x80000000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__PRESENCE_DETECT__SHIFT 0x1f
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE_MASK 0xf
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC_MASK 0xf00
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR_MASK 0xf000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR__SHIFT 0xc
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE_MASK 0xf0000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE__SHIFT 0x10
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE_MASK 0xf00000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE__SHIFT 0x14
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION_MASK 0x3f000000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION__SHIFT 0x18
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY_MASK 0xc0000000
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY__SHIFT 0x1e
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__MISC_MASK 0xf
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__MISC__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__COLOR_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__COLOR__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__CONNECTION_TYPE_MASK 0xf
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__CONNECTION_TYPE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__DEFAULT_DEVICE_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__DEFAULT_DEVICE__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__LOCATION_MASK 0x3f
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__LOCATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__PORT_CONNECTIVITY_MASK 0xc0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__PORT_CONNECTIVITY__SHIFT 0x6
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__SPEAKER_ALLOCATION_MASK 0x7f
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__SPEAKER_ALLOCATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__HDMI_CONNECTION_MASK 0x100
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__HDMI_CONNECTION__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__DP_CONNECTION_MASK 0x200
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__DP_CONNECTION__SHIFT 0x9
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__EXTRA_CONNECTION_INFO_MASK 0xfc00
+#define AZALIA_F2_CODEC_PIN_CONTROL_RESPONSE_SPEAKER_ALLOCATION__EXTRA_CONNECTION_INFO__SHIFT 0xa
+#define AZALIA_F2_CODEC_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION_MASK 0xff
+#define AZALIA_F2_CODEC_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__LFE_PLAYBACK_LEVEL_MASK 0x3
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__LFE_PLAYBACK_LEVEL__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__LEVEL_SHIFT_MASK 0x78
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__LEVEL_SHIFT__SHIFT 0x3
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__DOWN_MIX_INHIBIT_MASK 0x80
+#define AZALIA_F2_CODEC_PIN_CONTROL_DOWN_MIX_INFO__DOWN_MIX_INHIBIT__SHIFT 0x7
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__FORMAT_CODE_MASK 0x78
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__FORMAT_CODE__SHIFT 0x3
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR_DATA__DESCRIPTOR_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR_DATA__DESCRIPTOR__SHIFT 0x0
+#define AUDIO_DESCRIPTOR0__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR0__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR1__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR1__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR1__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR1__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR2__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR2__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR2__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR2__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR3__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR3__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR3__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR3__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR4__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR4__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR4__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR4__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR5__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR5__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR5__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR5__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR6__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR6__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR6__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR6__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR7__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR7__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR7__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR7__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR8__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR8__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR8__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR8__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR9__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR9__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR9__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR9__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR10__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR10__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR10__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR10__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR11__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR11__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR11__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR11__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR12__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR12__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR12__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR12__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AUDIO_DESCRIPTOR13__MAX_CHANNELS_MASK 0x7
+#define AUDIO_DESCRIPTOR13__MAX_CHANNELS__SHIFT 0x0
+#define AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AUDIO_DESCRIPTOR13__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AUDIO_DESCRIPTOR13__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL01_ENABLE__MULTICHANNEL01_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL23_ENABLE__MULTICHANNEL23_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL45_ENABLE__MULTICHANNEL45_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL67_ENABLE__MULTICHANNEL67_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_LIPSYNC__VIDEO_LIPSYNC_MASK 0xff
+#define AZALIA_F2_CODEC_PIN_CONTROL_LIPSYNC__VIDEO_LIPSYNC__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_LIPSYNC__AUDIO_LIPSYNC_MASK 0xff00
+#define AZALIA_F2_CODEC_PIN_CONTROL_LIPSYNC__AUDIO_LIPSYNC__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_HBR__HBR_CAPABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_HBR__HBR_CAPABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_HBR__HBR_ENABLE_MASK 0x10
+#define AZALIA_F2_CODEC_PIN_CONTROL_HBR__HBR_ENABLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_INDEX__SINK_INFO_INDEX_MASK 0xff
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_INDEX__SINK_INFO_INDEX__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_DATA__SINK_DATA_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_AUDIO_SINK_INFO_DATA__SINK_DATA__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MANUFACTURER_ID__MANUFACTURER_ID_MASK 0xffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_MANUFACTURER_ID__MANUFACTURER_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_PRODUCT_ID__PRODUCT_ID_MASK 0xffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_PRODUCT_ID__PRODUCT_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_SINK_DESCRIPTION_LEN__SINK_DESCRIPTION_LEN_MASK 0xff
+#define AZALIA_F2_CODEC_PIN_CONTROL_SINK_DESCRIPTION_LEN__SINK_DESCRIPTION_LEN__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_PORTID0__PORTID_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_PORTID0__PORTID__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_PORTID1__PORTID_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_PORTID1__PORTID__SHIFT 0x0
+#define SINK_DESCRIPTION0__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION0__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION1__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION1__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION2__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION2__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION3__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION3__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION4__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION4__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION5__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION5__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION6__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION6__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION7__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION7__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION8__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION8__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION9__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION9__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION10__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION10__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION11__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION11__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION12__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION12__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION13__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION13__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION14__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION14__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION15__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION15__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION16__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION16__DESCRIPTION__SHIFT 0x0
+#define SINK_DESCRIPTION17__DESCRIPTION_MASK 0xff
+#define SINK_DESCRIPTION17__DESCRIPTION__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE__MULTICHANNEL_MODE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_MULTICHANNEL_MODE__MULTICHANNEL_MODE__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_MODE_MASK 0x3
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_MODE__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_SOURCE_NUMBER_MASK 0x3c
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_SOURCE_NUMBER__SHIFT 0x2
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_MASK 0x3
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_OVRRD_EN_MASK 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_OVRRD_EN__SHIFT 0x2
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_MASK 0x78
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH__SHIFT 0x3
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_OVRRD_EN_MASK 0x80
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_OVRRD_EN__SHIFT 0x7
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_MASK 0x3f
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_OVRRD_EN_MASK 0x40
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_OVRRD_EN__SHIFT 0x6
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_OVRRD_EN_MASK 0x10
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_OVRRD_EN__SHIFT 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_SAMPLING_FREQUENCY_COEFF_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_SAMPLING_FREQUENCY_COEFF__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_MPEG_SURROUND_INFO_MASK 0x10
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_MPEG_SURROUND_INFO__SHIFT 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_MASK 0x60
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A__SHIFT 0x5
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_VALID_MASK 0x80
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_VALID__SHIFT 0x7
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_L_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_L__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_R_MASK 0xf0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_R__SHIFT 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_2_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_2__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_3_MASK 0xf0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_3__SHIFT 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_4_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_4__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_5_MASK 0xf0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_5__SHIFT 0x4
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_6_MASK 0xf
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_6__SHIFT 0x0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_7_MASK 0xf0
+#define AZALIA_F2_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_7__SHIFT 0x4
+#define AZALIA_F2_CODEC_PIN_ASSOCIATION_INFO__ASSOCIATION_INFO_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_ASSOCIATION_INFO__ASSOCIATION_INFO__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS__OUTPUT_ACTIVE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS__OUTPUT_ACTIVE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT_MASK 0xff00
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB__LPIB_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB__LPIB__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT_MASK 0xffffffff
+#define AZALIA_F2_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_CODING_TYPE__CODING_TYPE_MASK 0xff
+#define AZALIA_F2_CODEC_PIN_CONTROL_CODING_TYPE__CODING_TYPE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_ACK_UR_ENABLE_MASK 0x2
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_ACK_UR_ENABLE__SHIFT 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_REASON_MASK 0xff00
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_REASON__SHIFT 0x8
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_RESPONSE_MASK 0xff0000
+#define AZALIA_F2_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_RESPONSE__SHIFT 0x10
+#define AZALIA_F2_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION__WIRELESS_DISPLAY_IDENTIFICATION_MASK 0x3
+#define AZALIA_F2_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION__WIRELESS_DISPLAY_IDENTIFICATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_CAPABILITY_MASK 0x10
+#define AZALIA_F2_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_CAPABILITY__SHIFT 0x4
+#define AZALIA_CONTROLLER_CLOCK_GATING__ENABLE_CLOCK_GATING_MASK 0x1
+#define AZALIA_CONTROLLER_CLOCK_GATING__ENABLE_CLOCK_GATING__SHIFT 0x0
+#define AZALIA_CONTROLLER_CLOCK_GATING__CLOCK_ON_STATE_MASK 0x10
+#define AZALIA_CONTROLLER_CLOCK_GATING__CLOCK_ON_STATE__SHIFT 0x4
+#define AZALIA_AUDIO_DTO__AZALIA_AUDIO_DTO_PHASE_MASK 0xffff
+#define AZALIA_AUDIO_DTO__AZALIA_AUDIO_DTO_PHASE__SHIFT 0x0
+#define AZALIA_AUDIO_DTO__AZALIA_AUDIO_DTO_MODULE_MASK 0xffff0000
+#define AZALIA_AUDIO_DTO__AZALIA_AUDIO_DTO_MODULE__SHIFT 0x10
+#define AZALIA_AUDIO_DTO_CONTROL__AZALIA_AUDIO_FORCE_DTO_MASK 0x300
+#define AZALIA_AUDIO_DTO_CONTROL__AZALIA_AUDIO_FORCE_DTO__SHIFT 0x8
+#define AZALIA_SCLK_CONTROL__AUDIO_SCLK_CONTROL_MASK 0x30
+#define AZALIA_SCLK_CONTROL__AUDIO_SCLK_CONTROL__SHIFT 0x4
+#define AZALIA_UNDERFLOW_FILLER_SAMPLE__AZALIA_UNDERFLOW_FILLER_SAMPLE_MASK 0xffffffff
+#define AZALIA_UNDERFLOW_FILLER_SAMPLE__AZALIA_UNDERFLOW_FILLER_SAMPLE__SHIFT 0x0
+#define AZALIA_DATA_DMA_CONTROL__DATA_DMA_NON_SNOOP_MASK 0x3
+#define AZALIA_DATA_DMA_CONTROL__DATA_DMA_NON_SNOOP__SHIFT 0x0
+#define AZALIA_DATA_DMA_CONTROL__INPUT_DATA_DMA_NON_SNOOP_MASK 0xc
+#define AZALIA_DATA_DMA_CONTROL__INPUT_DATA_DMA_NON_SNOOP__SHIFT 0x2
+#define AZALIA_DATA_DMA_CONTROL__DATA_DMA_ISOCHRONOUS_MASK 0x30
+#define AZALIA_DATA_DMA_CONTROL__DATA_DMA_ISOCHRONOUS__SHIFT 0x4
+#define AZALIA_DATA_DMA_CONTROL__INPUT_DATA_DMA_ISOCHRONOUS_MASK 0xc0
+#define AZALIA_DATA_DMA_CONTROL__INPUT_DATA_DMA_ISOCHRONOUS__SHIFT 0x6
+#define AZALIA_DATA_DMA_CONTROL__AZALIA_IOC_GENERATION_METHOD_MASK 0x10000
+#define AZALIA_DATA_DMA_CONTROL__AZALIA_IOC_GENERATION_METHOD__SHIFT 0x10
+#define AZALIA_DATA_DMA_CONTROL__AZALIA_UNDERFLOW_CONTROL_MASK 0x20000
+#define AZALIA_DATA_DMA_CONTROL__AZALIA_UNDERFLOW_CONTROL__SHIFT 0x11
+#define AZALIA_BDL_DMA_CONTROL__BDL_DMA_NON_SNOOP_MASK 0x3
+#define AZALIA_BDL_DMA_CONTROL__BDL_DMA_NON_SNOOP__SHIFT 0x0
+#define AZALIA_BDL_DMA_CONTROL__INPUT_BDL_DMA_NON_SNOOP_MASK 0xc
+#define AZALIA_BDL_DMA_CONTROL__INPUT_BDL_DMA_NON_SNOOP__SHIFT 0x2
+#define AZALIA_BDL_DMA_CONTROL__BDL_DMA_ISOCHRONOUS_MASK 0x30
+#define AZALIA_BDL_DMA_CONTROL__BDL_DMA_ISOCHRONOUS__SHIFT 0x4
+#define AZALIA_BDL_DMA_CONTROL__INPUT_BDL_DMA_ISOCHRONOUS_MASK 0xc0
+#define AZALIA_BDL_DMA_CONTROL__INPUT_BDL_DMA_ISOCHRONOUS__SHIFT 0x6
+#define AZALIA_RIRB_AND_DP_CONTROL__RIRB_NON_SNOOP_MASK 0x1
+#define AZALIA_RIRB_AND_DP_CONTROL__RIRB_NON_SNOOP__SHIFT 0x0
+#define AZALIA_RIRB_AND_DP_CONTROL__DP_DMA_NON_SNOOP_MASK 0x10
+#define AZALIA_RIRB_AND_DP_CONTROL__DP_DMA_NON_SNOOP__SHIFT 0x4
+#define AZALIA_RIRB_AND_DP_CONTROL__DP_UPDATE_FREQ_DIVIDER_MASK 0x1e0
+#define AZALIA_RIRB_AND_DP_CONTROL__DP_UPDATE_FREQ_DIVIDER__SHIFT 0x5
+#define AZALIA_CORB_DMA_CONTROL__CORB_DMA_NON_SNOOP_MASK 0x1
+#define AZALIA_CORB_DMA_CONTROL__CORB_DMA_NON_SNOOP__SHIFT 0x0
+#define AZALIA_CORB_DMA_CONTROL__CORB_DMA_ISOCHRONOUS_MASK 0x10
+#define AZALIA_CORB_DMA_CONTROL__CORB_DMA_ISOCHRONOUS__SHIFT 0x4
+#define AZALIA_APPLICATION_POSITION_IN_CYCLIC_BUFFER__APPLICATION_POSITION_IN_CYCLIC_BUFFER_MASK 0xffffffff
+#define AZALIA_APPLICATION_POSITION_IN_CYCLIC_BUFFER__APPLICATION_POSITION_IN_CYCLIC_BUFFER__SHIFT 0x0
+#define AZALIA_CYCLIC_BUFFER_SYNC__CYCLIC_BUFFER_SYNC_ENABLE_MASK 0x1
+#define AZALIA_CYCLIC_BUFFER_SYNC__CYCLIC_BUFFER_SYNC_ENABLE__SHIFT 0x0
+#define AZALIA_GLOBAL_CAPABILITIES__NUMBER_OF_SERIAL_DATA_OUTPUT_SIGNALS_MASK 0x6
+#define AZALIA_GLOBAL_CAPABILITIES__NUMBER_OF_SERIAL_DATA_OUTPUT_SIGNALS__SHIFT 0x1
+#define AZALIA_OUTPUT_PAYLOAD_CAPABILITY__OUTPUT_PAYLOAD_CAPABILITY_MASK 0xffff
+#define AZALIA_OUTPUT_PAYLOAD_CAPABILITY__OUTPUT_PAYLOAD_CAPABILITY__SHIFT 0x0
+#define AZALIA_OUTPUT_PAYLOAD_CAPABILITY__OUTSTRMPAY_MASK 0xffff0000
+#define AZALIA_OUTPUT_PAYLOAD_CAPABILITY__OUTSTRMPAY__SHIFT 0x10
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__LATENCY_HIDING_LEVEL_MASK 0xff
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__LATENCY_HIDING_LEVEL__SHIFT 0x0
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__SYS_MEM_ACTIVE_ENABLE_MASK 0x100
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__SYS_MEM_ACTIVE_ENABLE__SHIFT 0x8
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__INPUT_LATENCY_HIDING_LEVEL_MASK 0xff0000
+#define AZALIA_OUTPUT_STREAM_ARBITER_CONTROL__INPUT_LATENCY_HIDING_LEVEL__SHIFT 0x10
+#define AZALIA_INPUT_PAYLOAD_CAPABILITY__INPUT_PAYLOAD_CAPABILITY_MASK 0xffff
+#define AZALIA_INPUT_PAYLOAD_CAPABILITY__INPUT_PAYLOAD_CAPABILITY__SHIFT 0x0
+#define AZALIA_INPUT_PAYLOAD_CAPABILITY__INSTRMPAY_MASK 0xffff0000
+#define AZALIA_INPUT_PAYLOAD_CAPABILITY__INSTRMPAY__SHIFT 0x10
+#define AZALIA_CONTROLLER_DEBUG__CONTROLLER_DEBUG_MASK 0xffffffff
+#define AZALIA_CONTROLLER_DEBUG__CONTROLLER_DEBUG__SHIFT 0x0
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_FORCE_MASK 0x3
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_FORCE__SHIFT 0x0
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_DIS_MASK 0x4
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_DIS__SHIFT 0x2
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM0_MEM_PWR_FORCE_MASK 0x18
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM0_MEM_PWR_FORCE__SHIFT 0x3
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM0_MEM_PWR_DIS_MASK 0x20
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM0_MEM_PWR_DIS__SHIFT 0x5
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM1_MEM_PWR_FORCE_MASK 0xc0
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM1_MEM_PWR_FORCE__SHIFT 0x6
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM1_MEM_PWR_DIS_MASK 0x100
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM1_MEM_PWR_DIS__SHIFT 0x8
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM2_MEM_PWR_FORCE_MASK 0x600
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM2_MEM_PWR_FORCE__SHIFT 0x9
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM2_MEM_PWR_DIS_MASK 0x800
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM2_MEM_PWR_DIS__SHIFT 0xb
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM3_MEM_PWR_FORCE_MASK 0x3000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM3_MEM_PWR_FORCE__SHIFT 0xc
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM3_MEM_PWR_DIS_MASK 0x4000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM3_MEM_PWR_DIS__SHIFT 0xe
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM4_MEM_PWR_FORCE_MASK 0x18000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM4_MEM_PWR_FORCE__SHIFT 0xf
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM4_MEM_PWR_DIS_MASK 0x20000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM4_MEM_PWR_DIS__SHIFT 0x11
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM5_MEM_PWR_FORCE_MASK 0xc0000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM5_MEM_PWR_FORCE__SHIFT 0x12
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM5_MEM_PWR_DIS_MASK 0x100000
+#define AZALIA_MEM_PWR_CTRL__AZ_INPUT_STREAM5_MEM_PWR_DIS__SHIFT 0x14
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_MODE_SEL_MASK 0x30000000
+#define AZALIA_MEM_PWR_CTRL__AZ_MEM_PWR_MODE_SEL__SHIFT 0x1c
+#define AZALIA_MEM_PWR_STATUS__AZ_MEM_PWR_STATE_MASK 0x3
+#define AZALIA_MEM_PWR_STATUS__AZ_MEM_PWR_STATE__SHIFT 0x0
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM0_MEM_PWR_STATE_MASK 0xc
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM0_MEM_PWR_STATE__SHIFT 0x2
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM1_MEM_PWR_STATE_MASK 0x30
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM1_MEM_PWR_STATE__SHIFT 0x4
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM2_MEM_PWR_STATE_MASK 0xc0
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM2_MEM_PWR_STATE__SHIFT 0x6
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM3_MEM_PWR_STATE_MASK 0x300
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM3_MEM_PWR_STATE__SHIFT 0x8
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM4_MEM_PWR_STATE_MASK 0xc00
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM4_MEM_PWR_STATE__SHIFT 0xa
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM5_MEM_PWR_STATE_MASK 0x3000
+#define AZALIA_MEM_PWR_STATUS__AZ_INPUT_STREAM5_MEM_PWR_STATE__SHIFT 0xc
+#define DCI_PG_DEBUG_CONFIG__DCI_PG_DBG_EN_MASK 0x1
+#define DCI_PG_DEBUG_CONFIG__DCI_PG_DBG_EN__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_EN_MASK 0x1
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_EN__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_BLOCK_MODE_MASK 0x10
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_BLOCK_MODE__SHIFT 0x4
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_INSTANCE_SEL_MASK 0x700
+#define AZALIA_INPUT_CRC0_CONTROL0__INPUT_CRC_INSTANCE_SEL__SHIFT 0x8
+#define AZALIA_INPUT_CRC0_CONTROL1__INPUT_CRC_BLOCK_SIZE_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CONTROL1__INPUT_CRC_BLOCK_SIZE__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CONTROL2__INPUT_CRC_BLOCK_ITERATION_MASK 0xffff
+#define AZALIA_INPUT_CRC0_CONTROL2__INPUT_CRC_BLOCK_ITERATION__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_COMPLETE_MASK 0x1
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_COMPLETE__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_BLOCK_COMPLETE_PHASE_MASK 0x10
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_BLOCK_COMPLETE_PHASE__SHIFT 0x4
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_CHANNEL_RESULT_SEL_MASK 0x700
+#define AZALIA_INPUT_CRC0_CONTROL3__INPUT_CRC_CHANNEL_RESULT_SEL__SHIFT 0x8
+#define AZALIA_INPUT_CRC0_RESULT__INPUT_CRC_RESULT_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_RESULT__INPUT_CRC_RESULT__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL0__INPUT_CRC_CHANNEL0_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL0__INPUT_CRC_CHANNEL0__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL1__INPUT_CRC_CHANNEL1_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL1__INPUT_CRC_CHANNEL1__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL2__INPUT_CRC_CHANNEL2_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL2__INPUT_CRC_CHANNEL2__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL3__INPUT_CRC_CHANNEL3_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL3__INPUT_CRC_CHANNEL3__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL4__INPUT_CRC_CHANNEL4_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL4__INPUT_CRC_CHANNEL4__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL5__INPUT_CRC_CHANNEL5_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL5__INPUT_CRC_CHANNEL5__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL6__INPUT_CRC_CHANNEL6_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL6__INPUT_CRC_CHANNEL6__SHIFT 0x0
+#define AZALIA_INPUT_CRC0_CHANNEL7__INPUT_CRC_CHANNEL7_MASK 0xffffffff
+#define AZALIA_INPUT_CRC0_CHANNEL7__INPUT_CRC_CHANNEL7__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_EN_MASK 0x1
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_EN__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_BLOCK_MODE_MASK 0x10
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_BLOCK_MODE__SHIFT 0x4
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_INSTANCE_SEL_MASK 0x700
+#define AZALIA_INPUT_CRC1_CONTROL0__INPUT_CRC_INSTANCE_SEL__SHIFT 0x8
+#define AZALIA_INPUT_CRC1_CONTROL1__INPUT_CRC_BLOCK_SIZE_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CONTROL1__INPUT_CRC_BLOCK_SIZE__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CONTROL2__INPUT_CRC_BLOCK_ITERATION_MASK 0xffff
+#define AZALIA_INPUT_CRC1_CONTROL2__INPUT_CRC_BLOCK_ITERATION__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_COMPLETE_MASK 0x1
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_COMPLETE__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_BLOCK_COMPLETE_PHASE_MASK 0x10
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_BLOCK_COMPLETE_PHASE__SHIFT 0x4
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_CHANNEL_RESULT_SEL_MASK 0x700
+#define AZALIA_INPUT_CRC1_CONTROL3__INPUT_CRC_CHANNEL_RESULT_SEL__SHIFT 0x8
+#define AZALIA_INPUT_CRC1_RESULT__INPUT_CRC_RESULT_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_RESULT__INPUT_CRC_RESULT__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL0__INPUT_CRC_CHANNEL0_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL0__INPUT_CRC_CHANNEL0__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL1__INPUT_CRC_CHANNEL1_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL1__INPUT_CRC_CHANNEL1__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL2__INPUT_CRC_CHANNEL2_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL2__INPUT_CRC_CHANNEL2__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL3__INPUT_CRC_CHANNEL3_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL3__INPUT_CRC_CHANNEL3__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL4__INPUT_CRC_CHANNEL4_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL4__INPUT_CRC_CHANNEL4__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL5__INPUT_CRC_CHANNEL5_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL5__INPUT_CRC_CHANNEL5__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL6__INPUT_CRC_CHANNEL6_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL6__INPUT_CRC_CHANNEL6__SHIFT 0x0
+#define AZALIA_INPUT_CRC1_CHANNEL7__INPUT_CRC_CHANNEL7_MASK 0xffffffff
+#define AZALIA_INPUT_CRC1_CHANNEL7__INPUT_CRC_CHANNEL7__SHIFT 0x0
+#define AZALIA_CRC0_CONTROL0__CRC_EN_MASK 0x1
+#define AZALIA_CRC0_CONTROL0__CRC_EN__SHIFT 0x0
+#define AZALIA_CRC0_CONTROL0__CRC_BLOCK_MODE_MASK 0x10
+#define AZALIA_CRC0_CONTROL0__CRC_BLOCK_MODE__SHIFT 0x4
+#define AZALIA_CRC0_CONTROL0__CRC_INSTANCE_SEL_MASK 0x700
+#define AZALIA_CRC0_CONTROL0__CRC_INSTANCE_SEL__SHIFT 0x8
+#define AZALIA_CRC0_CONTROL0__CRC_SOURCE_SEL_MASK 0x1000
+#define AZALIA_CRC0_CONTROL0__CRC_SOURCE_SEL__SHIFT 0xc
+#define AZALIA_CRC0_CONTROL1__CRC_BLOCK_SIZE_MASK 0xffffffff
+#define AZALIA_CRC0_CONTROL1__CRC_BLOCK_SIZE__SHIFT 0x0
+#define AZALIA_CRC0_CONTROL2__CRC_BLOCK_ITERATION_MASK 0xffff
+#define AZALIA_CRC0_CONTROL2__CRC_BLOCK_ITERATION__SHIFT 0x0
+#define AZALIA_CRC0_CONTROL3__CRC_COMPLETE_MASK 0x1
+#define AZALIA_CRC0_CONTROL3__CRC_COMPLETE__SHIFT 0x0
+#define AZALIA_CRC0_CONTROL3__CRC_BLOCK_COMPLETE_PHASE_MASK 0x10
+#define AZALIA_CRC0_CONTROL3__CRC_BLOCK_COMPLETE_PHASE__SHIFT 0x4
+#define AZALIA_CRC0_CONTROL3__CRC_CHANNEL_RESULT_SEL_MASK 0x700
+#define AZALIA_CRC0_CONTROL3__CRC_CHANNEL_RESULT_SEL__SHIFT 0x8
+#define AZALIA_CRC0_RESULT__CRC_RESULT_MASK 0xffffffff
+#define AZALIA_CRC0_RESULT__CRC_RESULT__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL0__CRC_CHANNEL0_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL0__CRC_CHANNEL0__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL1__CRC_CHANNEL1_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL1__CRC_CHANNEL1__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL2__CRC_CHANNEL2_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL2__CRC_CHANNEL2__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL3__CRC_CHANNEL3_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL3__CRC_CHANNEL3__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL4__CRC_CHANNEL4_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL4__CRC_CHANNEL4__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL5__CRC_CHANNEL5_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL5__CRC_CHANNEL5__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL6__CRC_CHANNEL6_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL6__CRC_CHANNEL6__SHIFT 0x0
+#define AZALIA_CRC0_CHANNEL7__CRC_CHANNEL7_MASK 0xffffffff
+#define AZALIA_CRC0_CHANNEL7__CRC_CHANNEL7__SHIFT 0x0
+#define AZALIA_CRC1_CONTROL0__CRC_EN_MASK 0x1
+#define AZALIA_CRC1_CONTROL0__CRC_EN__SHIFT 0x0
+#define AZALIA_CRC1_CONTROL0__CRC_BLOCK_MODE_MASK 0x10
+#define AZALIA_CRC1_CONTROL0__CRC_BLOCK_MODE__SHIFT 0x4
+#define AZALIA_CRC1_CONTROL0__CRC_INSTANCE_SEL_MASK 0x700
+#define AZALIA_CRC1_CONTROL0__CRC_INSTANCE_SEL__SHIFT 0x8
+#define AZALIA_CRC1_CONTROL0__CRC_SOURCE_SEL_MASK 0x1000
+#define AZALIA_CRC1_CONTROL0__CRC_SOURCE_SEL__SHIFT 0xc
+#define AZALIA_CRC1_CONTROL1__CRC_BLOCK_SIZE_MASK 0xffffffff
+#define AZALIA_CRC1_CONTROL1__CRC_BLOCK_SIZE__SHIFT 0x0
+#define AZALIA_CRC1_CONTROL2__CRC_BLOCK_ITERATION_MASK 0xffff
+#define AZALIA_CRC1_CONTROL2__CRC_BLOCK_ITERATION__SHIFT 0x0
+#define AZALIA_CRC1_CONTROL3__CRC_COMPLETE_MASK 0x1
+#define AZALIA_CRC1_CONTROL3__CRC_COMPLETE__SHIFT 0x0
+#define AZALIA_CRC1_CONTROL3__CRC_BLOCK_COMPLETE_PHASE_MASK 0x10
+#define AZALIA_CRC1_CONTROL3__CRC_BLOCK_COMPLETE_PHASE__SHIFT 0x4
+#define AZALIA_CRC1_CONTROL3__CRC_CHANNEL_RESULT_SEL_MASK 0x700
+#define AZALIA_CRC1_CONTROL3__CRC_CHANNEL_RESULT_SEL__SHIFT 0x8
+#define AZALIA_CRC1_RESULT__CRC_RESULT_MASK 0xffffffff
+#define AZALIA_CRC1_RESULT__CRC_RESULT__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL0__CRC_CHANNEL0_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL0__CRC_CHANNEL0__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL1__CRC_CHANNEL1_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL1__CRC_CHANNEL1__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL2__CRC_CHANNEL2_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL2__CRC_CHANNEL2__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL3__CRC_CHANNEL3_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL3__CRC_CHANNEL3__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL4__CRC_CHANNEL4_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL4__CRC_CHANNEL4__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL5__CRC_CHANNEL5_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL5__CRC_CHANNEL5__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL6__CRC_CHANNEL6_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL6__CRC_CHANNEL6__SHIFT 0x0
+#define AZALIA_CRC1_CHANNEL7__CRC_CHANNEL7_MASK 0xffffffff
+#define AZALIA_CRC1_CHANNEL7__CRC_CHANNEL7__SHIFT 0x0
+#define AZ_TEST_DEBUG_INDEX__AZ_TEST_DEBUG_INDEX_MASK 0xff
+#define AZ_TEST_DEBUG_INDEX__AZ_TEST_DEBUG_INDEX__SHIFT 0x0
+#define AZ_TEST_DEBUG_INDEX__AZ_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define AZ_TEST_DEBUG_INDEX__AZ_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define AZ_TEST_DEBUG_DATA__AZ_TEST_DEBUG_DATA_MASK 0xffffffff
+#define AZ_TEST_DEBUG_DATA__AZ_TEST_DEBUG_DATA__SHIFT 0x0
+#define AZALIA_STREAM_INDEX__AZALIA_STREAM_REG_INDEX_MASK 0xff
+#define AZALIA_STREAM_INDEX__AZALIA_STREAM_REG_INDEX__SHIFT 0x0
+#define AZALIA_STREAM_INDEX__AZALIA_STREAM_REG_WRITE_EN_MASK 0x100
+#define AZALIA_STREAM_INDEX__AZALIA_STREAM_REG_WRITE_EN__SHIFT 0x8
+#define AZALIA_STREAM_DATA__AZALIA_STREAM_REG_DATA_MASK 0xffffffff
+#define AZALIA_STREAM_DATA__AZALIA_STREAM_REG_DATA__SHIFT 0x0
+#define AZALIA_FIFO_SIZE_CONTROL__MIN_FIFO_SIZE_MASK 0x7f
+#define AZALIA_FIFO_SIZE_CONTROL__MIN_FIFO_SIZE__SHIFT 0x0
+#define AZALIA_FIFO_SIZE_CONTROL__MAX_FIFO_SIZE_MASK 0x7f00
+#define AZALIA_FIFO_SIZE_CONTROL__MAX_FIFO_SIZE__SHIFT 0x8
+#define AZALIA_FIFO_SIZE_CONTROL__MAX_LATENCY_SUPPORT_MASK 0xff0000
+#define AZALIA_FIFO_SIZE_CONTROL__MAX_LATENCY_SUPPORT__SHIFT 0x10
+#define AZALIA_LATENCY_COUNTER_CONTROL__AZALIA_LATENCY_COUNTER_RESET_MASK 0x1
+#define AZALIA_LATENCY_COUNTER_CONTROL__AZALIA_LATENCY_COUNTER_RESET__SHIFT 0x0
+#define AZALIA_WORSTCASE_LATENCY_COUNT__AZALIA_WORSTCASE_LATENCY_COUNT_MASK 0xffffffff
+#define AZALIA_WORSTCASE_LATENCY_COUNT__AZALIA_WORSTCASE_LATENCY_COUNT__SHIFT 0x0
+#define AZALIA_CUMULATIVE_LATENCY_COUNT__AZALIA_CUMULATIVE_LATENCY_COUNT_MASK 0xffffffff
+#define AZALIA_CUMULATIVE_LATENCY_COUNT__AZALIA_CUMULATIVE_LATENCY_COUNT__SHIFT 0x0
+#define AZALIA_CUMULATIVE_REQUEST_COUNT__AZALIA_CUMULATIVE_REQUEST_COUNT_MASK 0xffffffff
+#define AZALIA_CUMULATIVE_REQUEST_COUNT__AZALIA_CUMULATIVE_REQUEST_COUNT__SHIFT 0x0
+#define AZALIA_STREAM_DEBUG__STREAM_DEBUG_DATA_MASK 0xffffffff
+#define AZALIA_STREAM_DEBUG__STREAM_DEBUG_DATA__SHIFT 0x0
+#define AZALIA_F0_CODEC_ENDPOINT_INDEX__AZALIA_ENDPOINT_REG_INDEX_MASK 0x3fff
+#define AZALIA_F0_CODEC_ENDPOINT_INDEX__AZALIA_ENDPOINT_REG_INDEX__SHIFT 0x0
+#define AZALIA_F0_CODEC_ENDPOINT_DATA__AZALIA_ENDPOINT_REG_DATA_MASK 0xffffffff
+#define AZALIA_F0_CODEC_ENDPOINT_DATA__AZALIA_ENDPOINT_REG_DATA__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_PIN_DEBUG__AZALIA_DEBUG__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE_MASK 0x10
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE__SHIFT 0x4
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS_MASK 0xf
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE_MASK 0x70
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR_MASK 0x700
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR__SHIFT 0x8
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE_MASK 0x3800
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE__SHIFT 0xb
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE_MASK 0x4000
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE__SHIFT 0xe
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_MASK 0x8000
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE__SHIFT 0xf
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID_MASK 0xf
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN_MASK 0x1
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__V_MASK 0x2
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__V__SHIFT 0x1
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG_MASK 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG__SHIFT 0x2
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE_MASK 0x8
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE__SHIFT 0x3
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY_MASK 0x10
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY__SHIFT 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO_MASK 0x20
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO__SHIFT 0x5
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO_MASK 0x40
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO__SHIFT 0x6
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__L_MASK 0x80
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__L__SHIFT 0x7
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC_MASK 0x7f00
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC__SHIFT 0x8
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE_MASK 0x800000
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE__SHIFT 0x17
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F0_CODEC_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F0_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CONTROL_MASK 0x3
+#define AZALIA_F0_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CONTROL__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CAPABILITY_MASK 0x700000
+#define AZALIA_F0_CODEC_CONVERTER_STRIPE_CONTROL__STRIPE_CAPABILITY__SHIFT 0x14
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_RAMP_RATE__RAMP_RATE_MASK 0xff
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_RAMP_RATE__RAMP_RATE__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_OFFSET_CHANGED_MASK 0x2
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_OFFSET_CHANGED__SHIFT 0x1
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__CLEAR_GTC_COUNTER_MIN_MAX_DELTA_MASK 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__CLEAR_GTC_COUNTER_MIN_MAX_DELTA__SHIFT 0x2
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_GROUP_MASK 0x70
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_EMBEDDING__PRESENTATION_TIME_EMBEDDING_GROUP__SHIFT 0x4
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_OFFSET_DEBUG__PRESENTATION_TIME_OFFSET_DEBUG_MASK 0xffffffff
+#define AZALIA_F0_CODEC_CONVERTER_CONTROL_GTC_OFFSET_DEBUG__PRESENTATION_TIME_OFFSET_DEBUG__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA__GTC_COUNTER_DELTA_MASK 0xffffffff
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA__GTC_COUNTER_DELTA__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MIN__GTC_COUNTER_DELTA_MIN_MASK 0xffffffff
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MIN__GTC_COUNTER_DELTA_MIN__SHIFT 0x0
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MAX__GTC_COUNTER_DELTA_MAX_MASK 0xffffffff
+#define AZALIA_F0_CODEC_CONVERTER_GTC_COUNTER_DELTA_MAX__GTC_COUNTER_DELTA_MAX__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F0_CODEC_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED_MASK 0x2
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED__SHIFT 0x1
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY_MASK 0x4
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY__SHIFT 0x2
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE_MASK 0x8
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE__SHIFT 0x3
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE_MASK 0x10
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE_MASK 0x20
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE__SHIFT 0x5
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS_MASK 0x40
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS__SHIFT 0x6
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__HDMI_MASK 0x80
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__HDMI__SHIFT 0x7
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__DP_MASK 0x1000000
+#define AZALIA_F0_CODEC_PIN_PARAMETER_CAPABILITIES__DP__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG_MASK 0x3f
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE_MASK 0x80
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE__SHIFT 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE_MASK 0x7fffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_WIDGET_CONTROL__OUT_ENABLE_MASK 0x40
+#define AZALIA_F0_CODEC_PIN_CONTROL_WIDGET_CONTROL__OUT_ENABLE__SHIFT 0x6
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__SPEAKER_ALLOCATION_MASK 0x7f
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__SPEAKER_ALLOCATION__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__CHANNEL_ALLOCATION_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__CHANNEL_ALLOCATION__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__HDMI_CONNECTION_MASK 0x10000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__HDMI_CONNECTION__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__DP_CONNECTION_MASK 0x20000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__DP_CONNECTION__SHIFT 0x11
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__EXTRA_CONNECTION_INFO_MASK 0xfc0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__EXTRA_CONNECTION_INFO__SHIFT 0x12
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__LFE_PLAYBACK_LEVEL_MASK 0x3000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__LFE_PLAYBACK_LEVEL__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__LEVEL_SHIFT_MASK 0x78000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__LEVEL_SHIFT__SHIFT 0x1b
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__DOWN_MIX_INHIBIT_MASK 0x80000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_CHANNEL_SPEAKER__DOWN_MIX_INHIBIT__SHIFT 0x1f
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_STEREO_MASK 0xff000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR0__SUPPORTED_FREQUENCIES_STEREO__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR1__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR2__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR3__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR4__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR5__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR6__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR7__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR8__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR9__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR10__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR11__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR12__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__MAX_CHANNELS_MASK 0x7
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__MAX_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__SUPPORTED_FREQUENCIES__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__DESCRIPTOR_BYTE_2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_AUDIO_DESCRIPTOR13__DESCRIPTOR_BYTE_2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_MUTE_MASK 0x2
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_MUTE__SHIFT 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL01_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_ENABLE_MASK 0x100
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_ENABLE__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_MUTE_MASK 0x200
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_MUTE__SHIFT 0x9
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_CHANNEL_ID_MASK 0xf000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL23_CHANNEL_ID__SHIFT 0xc
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_ENABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_ENABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_MUTE_MASK 0x20000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_MUTE__SHIFT 0x11
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_CHANNEL_ID_MASK 0xf00000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL45_CHANNEL_ID__SHIFT 0x14
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_ENABLE_MASK 0x1000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_ENABLE__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_MUTE_MASK 0x2000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_MUTE__SHIFT 0x19
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_CHANNEL_ID_MASK 0xf0000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL67_CHANNEL_ID__SHIFT 0x1c
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_MUTE_MASK 0x2
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_MUTE__SHIFT 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL1_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_ENABLE_MASK 0x100
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_ENABLE__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_MUTE_MASK 0x200
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_MUTE__SHIFT 0x9
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_CHANNEL_ID_MASK 0xf000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL3_CHANNEL_ID__SHIFT 0xc
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_ENABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_ENABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_MUTE_MASK 0x20000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_MUTE__SHIFT 0x11
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_CHANNEL_ID_MASK 0xf00000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_CHANNEL_ID__SHIFT 0x14
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_ENABLE_MASK 0x1000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_ENABLE__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_MUTE_MASK 0x2000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_MUTE__SHIFT 0x19
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_CHANNEL_ID_MASK 0xf0000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_CHANNEL_ID__SHIFT 0x1c
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE__MULTICHANNEL_MODE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_MULTICHANNEL_MODE__MULTICHANNEL_MODE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC__VIDEO_LIPSYNC_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC__VIDEO_LIPSYNC__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC__AUDIO_LIPSYNC_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_LIPSYNC__AUDIO_LIPSYNC__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR__HBR_CAPABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR__HBR_CAPABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR__HBR_ENABLE_MASK 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_HBR__HBR_ENABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0__MANUFACTURER_ID_MASK 0xffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0__MANUFACTURER_ID__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0__PRODUCT_ID_MASK 0xffff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO0__PRODUCT_ID__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1__SINK_DESCRIPTION_LEN_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO1__SINK_DESCRIPTION_LEN__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2__PORT_ID0_MASK 0xffffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO2__PORT_ID0__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3__PORT_ID1_MASK 0xffffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO3__PORT_ID1__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION0_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION0__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION1_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION1__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION2_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION2__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION3_MASK 0xff000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO4__DESCRIPTION3__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION4_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION4__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION5_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION5__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION6_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION6__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION7_MASK 0xff000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO5__DESCRIPTION7__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION8_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION8__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION9_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION9__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION10_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION10__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION11_MASK 0xff000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO6__DESCRIPTION11__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION12_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION12__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION13_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION13__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION14_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION14__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION15_MASK 0xff000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO7__DESCRIPTION15__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8__DESCRIPTION16_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8__DESCRIPTION16__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8__DESCRIPTION17_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_SINK_INFO8__DESCRIPTION17__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_GATING_DISABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_GATING_DISABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_ON_STATE_MASK 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_ON_STATE__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__AUDIO_ENABLED_MASK 0x80000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL__AUDIO_ENABLED__SHIFT 0x1f
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_PAYLOAD_MASK 0x3ffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_PAYLOAD__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_FORCE_MASK 0x10000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_FORCE__SHIFT 0x1c
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE_MASK 0xf
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION_MASK 0xf0
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC_MASK 0xf00
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR_MASK 0xf000
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR__SHIFT 0xc
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE_MASK 0xf0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE_MASK 0xf00000
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE__SHIFT 0x14
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION_MASK 0x3f000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION__SHIFT 0x18
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY_MASK 0xc0000000
+#define AZALIA_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY__SHIFT 0x1e
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_MODE_MASK 0x3
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_MODE__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_SOURCE_NUMBER_MASK 0x3c
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_0__IEC_60958_CS_SOURCE_NUMBER__SHIFT 0x2
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_MASK 0x3
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_OVRRD_EN_MASK 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_CLOCK_ACCURACY_OVRRD_EN__SHIFT 0x2
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_MASK 0x78
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH__SHIFT 0x3
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_OVRRD_EN_MASK 0x80
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_1__IEC_60958_CS_WORD_LENGTH_OVRRD_EN__SHIFT 0x7
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_MASK 0x3f
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_OVRRD_EN_MASK 0x40
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_2__IEC_60958_CS_SAMPLING_FREQUENCY_OVRRD_EN__SHIFT 0x6
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_OVRRD_EN_MASK 0x10
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_3__IEC_60958_CS_ORIGINAL_SAMPLING_FREQUENCY_OVRRD_EN__SHIFT 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_SAMPLING_FREQUENCY_COEFF_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_SAMPLING_FREQUENCY_COEFF__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_MPEG_SURROUND_INFO_MASK 0x10
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_MPEG_SURROUND_INFO__SHIFT 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_MASK 0x60
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A__SHIFT 0x5
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_VALID_MASK 0x80
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_4__IEC_60958_CS_CGMS_A_VALID__SHIFT 0x7
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_L_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_L__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_R_MASK 0xf0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_5__IEC_60958_CS_CHANNEL_NUMBER_R__SHIFT 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_2_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_2__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_3_MASK 0xf0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_6__IEC_60958_CS_CHANNEL_NUMBER_3__SHIFT 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_4_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_4__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_5_MASK 0xf0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_7__IEC_60958_CS_CHANNEL_NUMBER_5__SHIFT 0x4
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_6_MASK 0xf
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_6__SHIFT 0x0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_7_MASK 0xf0
+#define AZALIA_F0_PIN_CONTROL_CODEC_CS_OVERRIDE_8__IEC_60958_CS_CHANNEL_NUMBER_7__SHIFT 0x4
+#define AZALIA_F0_CODEC_PIN_ASSOCIATION_INFO__ASSOCIATION_INFO_MASK 0xffffffff
+#define AZALIA_F0_CODEC_PIN_ASSOCIATION_INFO__ASSOCIATION_INFO__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS__OUTPUT_ACTIVE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_DIGITAL_OUTPUT_STATUS__OUTPUT_ACTIVE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB__LPIB_MASK 0xffffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB__LPIB__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT_MASK 0xffffffff
+#define AZALIA_F0_CODEC_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_CODING_TYPE__CODING_TYPE_MASK 0xff
+#define AZALIA_F0_CODEC_PIN_CONTROL_CODING_TYPE__CODING_TYPE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_ACK_UR_ENABLE_MASK 0x2
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGED_ACK_UR_ENABLE__SHIFT 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_REASON_MASK 0xff00
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_REASON__SHIFT 0x8
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_RESPONSE_MASK 0xff0000
+#define AZALIA_F0_CODEC_PIN_CONTROL_FORMAT_CHANGED__FORMAT_CHANGE_RESPONSE__SHIFT 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION__WIRELESS_DISPLAY_IDENTIFICATION_MASK 0x3
+#define AZALIA_F0_CODEC_PIN_CONTROL_WIRELESS_DISPLAY_IDENTIFICATION__WIRELESS_DISPLAY_IDENTIFICATION__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_CAPABILITY_MASK 0x10
+#define AZALIA_F0_CODEC_PIN_CONTROL_REMOTE_KEEPALIVE__REMOTE_KEEP_ALIVE_CAPABILITY__SHIFT 0x4
+#define AZALIA_F0_AUDIO_ENABLE_STATUS__AUDIO_ENABLE_STATUS_MASK 0x1
+#define AZALIA_F0_AUDIO_ENABLE_STATUS__AUDIO_ENABLE_STATUS__SHIFT 0x0
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_FLAG_MASK 0x1
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_FLAG__SHIFT 0x0
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_MASK_MASK 0x10
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_MASK__SHIFT 0x4
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_TYPE_MASK 0x100
+#define AZALIA_F0_AUDIO_ENABLED_INT_STATUS__AUDIO_ENABLED_TYPE__SHIFT 0x8
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_FLAG_MASK 0x1
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_FLAG__SHIFT 0x0
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_MASK_MASK 0x10
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_MASK__SHIFT 0x4
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_TYPE_MASK 0x100
+#define AZALIA_F0_AUDIO_DISABLED_INT_STATUS__AUDIO_DISABLED_TYPE__SHIFT 0x8
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_FLAG_MASK 0x1
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_FLAG__SHIFT 0x0
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_MASK_MASK 0x10
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_MASK__SHIFT 0x4
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_TYPE_MASK 0x100
+#define AZALIA_F0_AUDIO_FORMAT_CHANGED_INT_STATUS__AUDIO_FORMAT_CHANGED_TYPE__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__AZALIA_INPUT_ENDPOINT_REG_INDEX_MASK 0x3fff
+#define AZALIA_F0_CODEC_INPUT_ENDPOINT_INDEX__AZALIA_INPUT_ENDPOINT_REG_INDEX__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__AZALIA_INPUT_ENDPOINT_REG_DATA_MASK 0xffffffff
+#define AZALIA_F0_CODEC_INPUT_ENDPOINT_DATA__AZALIA_INPUT_ENDPOINT_REG_DATA__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PIN_DEBUG__AZALIA_INPUT_DEBUG_MASK 0xffffffff
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PIN_DEBUG__AZALIA_INPUT_DEBUG__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS_MASK 0xf
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE_MASK 0x70
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR_MASK 0x700
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE_MASK 0x3800
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE__SHIFT 0xb
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE_MASK 0x4000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE__SHIFT 0xe
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_MASK 0x8000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE__SHIFT 0xf
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID_MASK 0xf
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__V_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__V__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG_MASK 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG__SHIFT 0x2
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE_MASK 0x8
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE__SHIFT 0x3
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO_MASK 0x40
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO__SHIFT 0x6
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__L_MASK 0x80
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__L__SHIFT 0x7
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC_MASK 0x7f00
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE_MASK 0x800000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE__SHIFT 0x17
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F0_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY_MASK 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY__SHIFT 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE_MASK 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE__SHIFT 0x3
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS_MASK 0x40
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS__SHIFT 0x6
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HDMI_MASK 0x80
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HDMI__SHIFT 0x7
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL_MASK 0xff00
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__DP_MASK 0x1000000
+#define AZALIA_F0_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__DP__SHIFT 0x18
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG_MASK 0x3f
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE_MASK 0x80
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE__SHIFT 0x7
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_INPUT_PIN_SENSE__IMPEDANCE_SENSE_MASK 0x7fffffff
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_INPUT_PIN_SENSE__IMPEDANCE_SENSE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_INPUT_PIN_SENSE__PRESENCE_DETECT_MASK 0x80000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_INPUT_PIN_SENSE__PRESENCE_DETECT__SHIFT 0x1f
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL__IN_ENABLE_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL__IN_ENABLE__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_MUTE_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_MUTE__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL0_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_ENABLE_MASK 0x100
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_ENABLE__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_MUTE_MASK 0x200
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_MUTE__SHIFT 0x9
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_CHANNEL_ID_MASK 0xf000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL1_CHANNEL_ID__SHIFT 0xc
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_ENABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_ENABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_MUTE_MASK 0x20000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_MUTE__SHIFT 0x11
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_CHANNEL_ID_MASK 0xf00000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL2_CHANNEL_ID__SHIFT 0x14
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_ENABLE_MASK 0x1000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_ENABLE__SHIFT 0x18
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_MUTE_MASK 0x2000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_MUTE__SHIFT 0x19
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_CHANNEL_ID_MASK 0xf0000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE__MULTICHANNEL3_CHANNEL_ID__SHIFT 0x1c
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_ENABLE_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_ENABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_MUTE_MASK 0x2
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_MUTE__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL4_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_ENABLE_MASK 0x100
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_ENABLE__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_MUTE_MASK 0x200
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_MUTE__SHIFT 0x9
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_CHANNEL_ID_MASK 0xf000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL5_CHANNEL_ID__SHIFT 0xc
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_ENABLE_MASK 0x10000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_ENABLE__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_MUTE_MASK 0x20000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_MUTE__SHIFT 0x11
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_CHANNEL_ID_MASK 0xf00000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL6_CHANNEL_ID__SHIFT 0x14
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_ENABLE_MASK 0x1000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_ENABLE__SHIFT 0x18
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_MUTE_MASK 0x2000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_MUTE__SHIFT 0x19
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_CHANNEL_ID_MASK 0xf0000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL_ENABLE2__MULTICHANNEL7_CHANNEL_ID__SHIFT 0x1c
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR__HBR_CAPABLE_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR__HBR_CAPABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR__HBR_ENABLE_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_HBR__HBR_ENABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION_MASK 0xff
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_GATING_DISABLE_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_GATING_DISABLE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_ON_STATE_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__CLOCK_ON_STATE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__AUDIO_ENABLED_MASK 0x80000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_HOT_PLUG_CONTROL__AUDIO_ENABLED__SHIFT 0x1f
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_PAYLOAD_MASK 0x3ffffff
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_PAYLOAD__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_FORCE_MASK 0x10000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE_FORCE__UNSOLICITED_RESPONSE_FORCE__SHIFT 0x1c
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE_MASK 0xf
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION_MASK 0xf0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC_MASK 0xf00
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR_MASK 0xf000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR__SHIFT 0xc
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE_MASK 0xf0000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE_MASK 0xf00000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE__SHIFT 0x14
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION_MASK 0x3f000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION__SHIFT 0x18
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY_MASK 0xc0000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY__SHIFT 0x1e
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__CHANNEL_LAYOUT_MASK 0x6
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__CHANNEL_LAYOUT__SHIFT 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_UR_ENABLE_MASK 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_UR_ENABLE__SHIFT 0x4
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_CL_CS_INFOFRAME_CHANGE_UR_ENABLE_MASK 0x20
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_CL_CS_INFOFRAME_CHANGE_UR_ENABLE__SHIFT 0x5
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_COUNT_MASK 0x7
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_COUNT__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_ALLOCATION_MASK 0xff00
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_ALLOCATION__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_BYTE_5_MASK 0xff0000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_BYTE_5__SHIFT 0x10
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_VALID_MASK 0x80000000
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_VALID__SHIFT 0x1f
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK_MASK 0x1
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT_MASK 0xff00
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT__SHIFT 0x8
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB__LPIB_MASK 0xffffffff
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB__LPIB__SHIFT 0x0
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT_MASK 0xffffffff
+#define AZALIA_F0_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT__SHIFT 0x0
+#define AZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE_MASK 0x1ffff
+#define AZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_INDEX__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE_MASK 0xffffffff
+#define AZENDPOINT_IMMEDIATE_COMMAND_INPUT_INTERFACE_DATA__IMMEDIATE_COMMAND_WRITE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE_MASK 0x10
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__FORMAT_OVERRIDE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES_MASK 0xfff
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_RATE_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES_MASK 0x1f0000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_SUPPORTED_SIZE_RATES__AUDIO_BIT_CAPABILITIES__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS_MASK 0xffffffff
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_PARAMETER_STREAM_FORMATS__STREAM_FORMATS__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS_MASK 0xf
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__NUMBER_OF_CHANNELS__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE_MASK 0x70
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__BITS_PER_SAMPLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR_MASK 0x700
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_DIVISOR__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE_MASK 0x3800
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_MULTIPLE__SHIFT 0xb
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE_MASK 0x4000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__SAMPLE_BASE_RATE__SHIFT 0xe
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE_MASK 0x8000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CONVERTER_FORMAT__STREAM_TYPE__SHIFT 0xf
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID_MASK 0xf
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__CHANNEL_ID__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_CHANNEL_STREAM_ID__STREAM_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__DIGEN__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__V_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__V__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG_MASK 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__VCFG__SHIFT 0x2
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE_MASK 0x8
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRE__SHIFT 0x3
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY_MASK 0x10
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__COPY__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__NON_AUDIO__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO_MASK 0x40
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__PRO__SHIFT 0x6
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__L_MASK 0x80
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__L__SHIFT 0x7
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC_MASK 0x7f00
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__CC__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE_MASK 0x800000
+#define AZALIA_F2_CODEC_INPUT_CONVERTER_CONTROL_DIGITAL_CONVERTER__KEEPALIVE__SHIFT 0x17
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_CHANNEL_CAPABILITIES__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__INPUT_AMPLIFIER_PRESENT__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT_MASK 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__OUTPUT_AMPLIFIER_PRESENT__SHIFT 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE_MASK 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AMPLIFIER_PARAMETER_OVERRIDE__SHIFT 0x3
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__STRIPE__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET_MASK 0x40
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__PROCESSING_WIDGET__SHIFT 0x6
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY_MASK 0x80
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__UNSOLICITED_RESPONSE_CAPABILITY__SHIFT 0x7
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST_MASK 0x100
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__CONNECTION_LIST__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL_MASK 0x200
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__DIGITAL__SHIFT 0x9
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL_MASK 0x400
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__POWER_CONTROL__SHIFT 0xa
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP_MASK 0x800
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__LR_SWAP__SHIFT 0xb
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY_MASK 0xf0000
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__AUDIO_WIDGET_CAPABILITIES_DELAY__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE_MASK 0xf00000
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_AUDIO_WIDGET_CAPABILITIES__TYPE__SHIFT 0x14
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__IMPEDANCE_SENSE_CAPABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__TRIGGER_REQUIRED__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY_MASK 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__JACK_DETECTION_CAPABILITY__SHIFT 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE_MASK 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HEADPHONE_DRIVE_CAPABLE__SHIFT 0x3
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE_MASK 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__OUTPUT_CAPABLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__INPUT_CAPABLE__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS_MASK 0x40
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__BALANCED_I_O_PINS__SHIFT 0x6
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HDMI_MASK 0x80
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__HDMI__SHIFT 0x7
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL_MASK 0xff00
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__VREF_CONTROL__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE_MASK 0x10000
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__EAPD_CAPABLE__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__DP_MASK 0x1000000
+#define AZALIA_F2_CODEC_INPUT_PIN_PARAMETER_CAPABILITIES__DP__SHIFT 0x18
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL__IN_ENABLE_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_WIDGET_CONTROL__IN_ENABLE__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG_MASK 0x3f
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__TAG__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE_MASK 0x80
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_UNSOLICITED_RESPONSE__ENABLE__SHIFT 0x7
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE_MASK 0x7fffffff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_PIN_SENSE__IMPEDANCE_SENSE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_PIN_SENSE__PRESENCE_DETECT_MASK 0x80000000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_PIN_SENSE__PRESENCE_DETECT__SHIFT 0x1f
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE_MASK 0xf
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__SEQUENCE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_ASSOCIATION__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC_MASK 0xf00
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__MISC__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR_MASK 0xf000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__COLOR__SHIFT 0xc
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE_MASK 0xf0000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__CONNECTION_TYPE__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE_MASK 0xf00000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__DEFAULT_DEVICE__SHIFT 0x14
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION_MASK 0x3f000000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__LOCATION__SHIFT 0x18
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY_MASK 0xc0000000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT__PORT_CONNECTIVITY__SHIFT 0x1e
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__MISC_MASK 0xf
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__MISC__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__COLOR_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_2__COLOR__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__CONNECTION_TYPE_MASK 0xf
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__CONNECTION_TYPE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__DEFAULT_DEVICE_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_3__DEFAULT_DEVICE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__LOCATION_MASK 0x3f
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__LOCATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__PORT_CONNECTIVITY_MASK 0xc0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT_4__PORT_CONNECTIVITY__SHIFT 0x6
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL0_ENABLE__MULTICHANNEL0_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL1_ENABLE__MULTICHANNEL1_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL2_ENABLE__MULTICHANNEL2_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL3_ENABLE__MULTICHANNEL3_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_HBR__HBR_CAPABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_HBR__HBR_CAPABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_HBR__HBR_ENABLE_MASK 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_HBR__HBR_ENABLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL4_ENABLE__MULTICHANNEL4_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL5_ENABLE__MULTICHANNEL5_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL6_ENABLE__MULTICHANNEL6_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_ENABLE_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_ENABLE__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_MUTE_MASK 0x2
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_MUTE__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_CHANNEL_ID_MASK 0xf0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_MULTICHANNEL7_ENABLE__MULTICHANNEL7_CHANNEL_ID__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION_MASK 0xff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_ALLOCATION__CHANNEL_ALLOCATION__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__CHANNEL_LAYOUT_MASK 0x6
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__CHANNEL_LAYOUT__SHIFT 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_UR_ENABLE_MASK 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_ACTIVITY_UR_ENABLE__SHIFT 0x4
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_CL_CS_INFOFRAME_CHANGE_UR_ENABLE_MASK 0x20
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INPUT_STATUS_CONTROL__INPUT_CL_CS_INFOFRAME_CHANGE_UR_ENABLE__SHIFT 0x5
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_COUNT_MASK 0x7
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_COUNT__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_ALLOCATION_MASK 0xff00
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__CHANNEL_ALLOCATION__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_BYTE_5_MASK 0xff0000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_BYTE_5__SHIFT 0x10
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_VALID_MASK 0x80000000
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_INFOFRAME__INFOFRAME_VALID__SHIFT 0x1f
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_L__CHANNEL_STATUS_L_MASK 0xffffffff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_L__CHANNEL_STATUS_L__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_H__CHANNEL_STATUS_H_MASK 0xffffffff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_CHANNEL_STATUS_H__CHANNEL_STATUS_H__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK_MASK 0x1
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__LPIB_SNAPSHOT_LOCK__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT_MASK 0xff00
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_SNAPSHOT_CONTROL__CYCLIC_BUFFER_WRAP_COUNT__SHIFT 0x8
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB__LPIB_MASK 0xffffffff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB__LPIB__SHIFT 0x0
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT_MASK 0xffffffff
+#define AZALIA_F2_CODEC_INPUT_PIN_CONTROL_LPIB_TIMER_SNAPSHOT__LPIB_TIMER_SNAPSHOT__SHIFT 0x0
+#define BLND_CONTROL__BLND_GLOBAL_GAIN_MASK 0xff
+#define BLND_CONTROL__BLND_GLOBAL_GAIN__SHIFT 0x0
+#define BLND_CONTROL__BLND_MODE_MASK 0x300
+#define BLND_CONTROL__BLND_MODE__SHIFT 0x8
+#define BLND_CONTROL__BLND_STEREO_TYPE_MASK 0xc00
+#define BLND_CONTROL__BLND_STEREO_TYPE__SHIFT 0xa
+#define BLND_CONTROL__BLND_STEREO_POLARITY_MASK 0x1000
+#define BLND_CONTROL__BLND_STEREO_POLARITY__SHIFT 0xc
+#define BLND_CONTROL__BLND_FEEDTHROUGH_EN_MASK 0x2000
+#define BLND_CONTROL__BLND_FEEDTHROUGH_EN__SHIFT 0xd
+#define BLND_CONTROL__BLND_ALPHA_MODE_MASK 0x30000
+#define BLND_CONTROL__BLND_ALPHA_MODE__SHIFT 0x10
+#define BLND_CONTROL__BLND_ACTIVE_OVERLAP_ONLY_MASK 0x40000
+#define BLND_CONTROL__BLND_ACTIVE_OVERLAP_ONLY__SHIFT 0x12
+#define BLND_CONTROL__BLND_MULTIPLIED_MODE_MASK 0x100000
+#define BLND_CONTROL__BLND_MULTIPLIED_MODE__SHIFT 0x14
+#define BLND_CONTROL__BLND_GLOBAL_ALPHA_MASK 0xff000000
+#define BLND_CONTROL__BLND_GLOBAL_ALPHA__SHIFT 0x18
+#define BLND_SM_CONTROL2__SM_MODE_MASK 0x7
+#define BLND_SM_CONTROL2__SM_MODE__SHIFT 0x0
+#define BLND_SM_CONTROL2__SM_FRAME_ALTERNATE_MASK 0x10
+#define BLND_SM_CONTROL2__SM_FRAME_ALTERNATE__SHIFT 0x4
+#define BLND_SM_CONTROL2__SM_FIELD_ALTERNATE_MASK 0x20
+#define BLND_SM_CONTROL2__SM_FIELD_ALTERNATE__SHIFT 0x5
+#define BLND_SM_CONTROL2__SM_FORCE_NEXT_FRAME_POL_MASK 0x300
+#define BLND_SM_CONTROL2__SM_FORCE_NEXT_FRAME_POL__SHIFT 0x8
+#define BLND_SM_CONTROL2__SM_FORCE_NEXT_TOP_POL_MASK 0x30000
+#define BLND_SM_CONTROL2__SM_FORCE_NEXT_TOP_POL__SHIFT 0x10
+#define BLND_SM_CONTROL2__SM_CURRENT_FRAME_POL_MASK 0x1000000
+#define BLND_SM_CONTROL2__SM_CURRENT_FRAME_POL__SHIFT 0x18
+#define BLND_CONTROL2__PTI_ENABLE_MASK 0x1
+#define BLND_CONTROL2__PTI_ENABLE__SHIFT 0x0
+#define BLND_CONTROL2__PTI_NEW_PIXEL_GAP_MASK 0x30
+#define BLND_CONTROL2__PTI_NEW_PIXEL_GAP__SHIFT 0x4
+#define BLND_CONTROL2__BLND_NEW_PIXEL_MODE_MASK 0x40
+#define BLND_CONTROL2__BLND_NEW_PIXEL_MODE__SHIFT 0x6
+#define BLND_CONTROL2__BLND_SUPERAA_DEGAMMA_EN_MASK 0x80
+#define BLND_CONTROL2__BLND_SUPERAA_DEGAMMA_EN__SHIFT 0x7
+#define BLND_CONTROL2__BLND_SUPERAA_REGAMMA_EN_MASK 0x100
+#define BLND_CONTROL2__BLND_SUPERAA_REGAMMA_EN__SHIFT 0x8
+#define BLND_UPDATE__BLND_UPDATE_PENDING_MASK 0x1
+#define BLND_UPDATE__BLND_UPDATE_PENDING__SHIFT 0x0
+#define BLND_UPDATE__BLND_UPDATE_TAKEN_MASK 0x100
+#define BLND_UPDATE__BLND_UPDATE_TAKEN__SHIFT 0x8
+#define BLND_UPDATE__BLND_UPDATE_LOCK_MASK 0x10000
+#define BLND_UPDATE__BLND_UPDATE_LOCK__SHIFT 0x10
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_OCCURED_MASK 0x1
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_OCCURED__SHIFT 0x0
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_ACK_MASK 0x100
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_ACK__SHIFT 0x8
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_MASK_MASK 0x1000
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_MASK__SHIFT 0xc
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_PIPE_INDEX_MASK 0x30000
+#define BLND_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_PIPE_INDEX__SHIFT 0x10
+#define BLND_V_UPDATE_LOCK__BLND_DCP_GRPH_V_UPDATE_LOCK_MASK 0x1
+#define BLND_V_UPDATE_LOCK__BLND_DCP_GRPH_V_UPDATE_LOCK__SHIFT 0x0
+#define BLND_V_UPDATE_LOCK__BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_MASK 0x2
+#define BLND_V_UPDATE_LOCK__BLND_DCP_GRPH_SURF_V_UPDATE_LOCK__SHIFT 0x1
+#define BLND_V_UPDATE_LOCK__BLND_DCP_CUR_V_UPDATE_LOCK_MASK 0x10000
+#define BLND_V_UPDATE_LOCK__BLND_DCP_CUR_V_UPDATE_LOCK__SHIFT 0x10
+#define BLND_V_UPDATE_LOCK__BLND_DCP_CUR2_V_UPDATE_LOCK_MASK 0x1000000
+#define BLND_V_UPDATE_LOCK__BLND_DCP_CUR2_V_UPDATE_LOCK__SHIFT 0x18
+#define BLND_V_UPDATE_LOCK__BLND_SCL_V_UPDATE_LOCK_MASK 0x10000000
+#define BLND_V_UPDATE_LOCK__BLND_SCL_V_UPDATE_LOCK__SHIFT 0x1c
+#define BLND_V_UPDATE_LOCK__BLND_BLND_V_UPDATE_LOCK_MASK 0x20000000
+#define BLND_V_UPDATE_LOCK__BLND_BLND_V_UPDATE_LOCK__SHIFT 0x1d
+#define BLND_V_UPDATE_LOCK__BLND_V_UPDATE_LOCK_MODE_MASK 0x80000000
+#define BLND_V_UPDATE_LOCK__BLND_V_UPDATE_LOCK_MODE__SHIFT 0x1f
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_UPDATE_PENDING_MASK 0x1
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_UPDATE_PENDING__SHIFT 0x0
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_UPDATE_PENDING_MASK 0x2
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_UPDATE_PENDING__SHIFT 0x1
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_SURF_UPDATE_PENDING_MASK 0x4
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_SURF_UPDATE_PENDING__SHIFT 0x2
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_SURF_UPDATE_PENDING_MASK 0x8
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_SURF_UPDATE_PENDING__SHIFT 0x3
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_CUR_UPDATE_PENDING_MASK 0x40
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDC_CUR_UPDATE_PENDING__SHIFT 0x6
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_CUR_UPDATE_PENDING_MASK 0x80
+#define BLND_REG_UPDATE_STATUS__DCP_BLNDO_CUR_UPDATE_PENDING__SHIFT 0x7
+#define BLND_REG_UPDATE_STATUS__SCL_BLNDC_UPDATE_PENDING_MASK 0x100
+#define BLND_REG_UPDATE_STATUS__SCL_BLNDC_UPDATE_PENDING__SHIFT 0x8
+#define BLND_REG_UPDATE_STATUS__SCL_BLNDO_UPDATE_PENDING_MASK 0x200
+#define BLND_REG_UPDATE_STATUS__SCL_BLNDO_UPDATE_PENDING__SHIFT 0x9
+#define BLND_REG_UPDATE_STATUS__BLND_BLNDC_UPDATE_PENDING_MASK 0x400
+#define BLND_REG_UPDATE_STATUS__BLND_BLNDC_UPDATE_PENDING__SHIFT 0xa
+#define BLND_REG_UPDATE_STATUS__BLND_BLNDO_UPDATE_PENDING_MASK 0x800
+#define BLND_REG_UPDATE_STATUS__BLND_BLNDO_UPDATE_PENDING__SHIFT 0xb
+#define BLND_DEBUG__BLND_CNV_MUX_SELECT_MASK 0x1
+#define BLND_DEBUG__BLND_CNV_MUX_SELECT__SHIFT 0x0
+#define BLND_DEBUG__BLND_DEBUG_MASK 0xfffffffe
+#define BLND_DEBUG__BLND_DEBUG__SHIFT 0x1
+#define BLND_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_INDEX_MASK 0xff
+#define BLND_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_INDEX__SHIFT 0x0
+#define BLND_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define BLND_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define BLND_TEST_DEBUG_DATA__BLND_TEST_DEBUG_DATA_MASK 0xffffffff
+#define BLND_TEST_DEBUG_DATA__BLND_TEST_DEBUG_DATA__SHIFT 0x0
+#define WB_ENABLE__WB_ENABLE_MASK 0x1
+#define WB_ENABLE__WB_ENABLE__SHIFT 0x0
+#define WB_EC_CONFIG__DISPCLK_R_WB_GATE_DIS_MASK 0x1
+#define WB_EC_CONFIG__DISPCLK_R_WB_GATE_DIS__SHIFT 0x0
+#define WB_EC_CONFIG__DISPCLK_G_WB_GATE_DIS_MASK 0x2
+#define WB_EC_CONFIG__DISPCLK_G_WB_GATE_DIS__SHIFT 0x1
+#define WB_EC_CONFIG__DISPCLK_G_WBSCL_GATE_DIS_MASK 0x4
+#define WB_EC_CONFIG__DISPCLK_G_WBSCL_GATE_DIS__SHIFT 0x2
+#define WB_EC_CONFIG__WB_TEST_CLK_SEL_MASK 0x78
+#define WB_EC_CONFIG__WB_TEST_CLK_SEL__SHIFT 0x3
+#define WB_EC_CONFIG__WB_LB_LS_DIS_MASK 0x80
+#define WB_EC_CONFIG__WB_LB_LS_DIS__SHIFT 0x7
+#define WB_EC_CONFIG__WB_LB_SD_DIS_MASK 0x100
+#define WB_EC_CONFIG__WB_LB_SD_DIS__SHIFT 0x8
+#define WB_EC_CONFIG__WB_LUT_LS_DIS_MASK 0x200
+#define WB_EC_CONFIG__WB_LUT_LS_DIS__SHIFT 0x9
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_MODE_SEL_MASK 0x3000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_MODE_SEL__SHIFT 0xc
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_DIS_MASK 0x4000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_DIS__SHIFT 0xe
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_FORCE_MASK 0x18000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_FORCE__SHIFT 0xf
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE_SM_MASK 0x60000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE_SM__SHIFT 0x11
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE_BG_MASK 0x180000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE_BG__SHIFT 0x13
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE_MASK 0x600000
+#define WB_EC_CONFIG__WBSCL_LB_MEM_PWR_STATE__SHIFT 0x15
+#define WB_EC_CONFIG__WB_RAM_PW_SAVE_MODE_MASK 0x800000
+#define WB_EC_CONFIG__WB_RAM_PW_SAVE_MODE__SHIFT 0x17
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE_SM_MASK 0x3000000
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE_SM__SHIFT 0x18
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE_BG_MASK 0xc000000
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE_BG__SHIFT 0x1a
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE_MASK 0x30000000
+#define WB_EC_CONFIG__LB_MEM_PWR_STATE__SHIFT 0x1c
+#define WB_EC_CONFIG__LUT_MEM_PWR_STATE_MASK 0xc0000000
+#define WB_EC_CONFIG__LUT_MEM_PWR_STATE__SHIFT 0x1e
+#define CNV_MODE__CNV_FRAME_CAPTURE_RATE_MASK 0x300
+#define CNV_MODE__CNV_FRAME_CAPTURE_RATE__SHIFT 0x8
+#define CNV_MODE__CNV_WINDOW_CROP_EN_MASK 0x1000
+#define CNV_MODE__CNV_WINDOW_CROP_EN__SHIFT 0xc
+#define CNV_MODE__CNV_STEREO_TYPE_MASK 0x6000
+#define CNV_MODE__CNV_STEREO_TYPE__SHIFT 0xd
+#define CNV_MODE__CNV_INTERLACED_MODE_MASK 0x8000
+#define CNV_MODE__CNV_INTERLACED_MODE__SHIFT 0xf
+#define CNV_MODE__CNV_EYE_SELECTION_MASK 0x30000
+#define CNV_MODE__CNV_EYE_SELECTION__SHIFT 0x10
+#define CNV_MODE__CNV_STEREO_POLARITY_MASK 0x40000
+#define CNV_MODE__CNV_STEREO_POLARITY__SHIFT 0x12
+#define CNV_MODE__CNV_INTERLACED_FIELD_ORDER_MASK 0x80000
+#define CNV_MODE__CNV_INTERLACED_FIELD_ORDER__SHIFT 0x13
+#define CNV_MODE__CNV_STEREO_SPLIT_MASK 0x100000
+#define CNV_MODE__CNV_STEREO_SPLIT__SHIFT 0x14
+#define CNV_MODE__CNV_NEW_CONTENT_MASK 0x1000000
+#define CNV_MODE__CNV_NEW_CONTENT__SHIFT 0x18
+#define CNV_MODE__CNV_FRAME_CAPTURE_EN_MASK 0x80000000
+#define CNV_MODE__CNV_FRAME_CAPTURE_EN__SHIFT 0x1f
+#define CNV_WINDOW_START__CNV_WINDOW_START_X_MASK 0xfff
+#define CNV_WINDOW_START__CNV_WINDOW_START_X__SHIFT 0x0
+#define CNV_WINDOW_START__CNV_WINDOW_START_Y_MASK 0xfff0000
+#define CNV_WINDOW_START__CNV_WINDOW_START_Y__SHIFT 0x10
+#define CNV_WINDOW_SIZE__CNV_WINDOW_WIDTH_MASK 0xfff
+#define CNV_WINDOW_SIZE__CNV_WINDOW_WIDTH__SHIFT 0x0
+#define CNV_WINDOW_SIZE__CNV_WINDOW_HEIGHT_MASK 0xfff0000
+#define CNV_WINDOW_SIZE__CNV_WINDOW_HEIGHT__SHIFT 0x10
+#define CNV_UPDATE__CNV_UPDATE_PENDING_MASK 0x1
+#define CNV_UPDATE__CNV_UPDATE_PENDING__SHIFT 0x0
+#define CNV_UPDATE__CNV_UPDATE_TAKEN_MASK 0x100
+#define CNV_UPDATE__CNV_UPDATE_TAKEN__SHIFT 0x8
+#define CNV_UPDATE__CNV_UPDATE_LOCK_MASK 0x10000
+#define CNV_UPDATE__CNV_UPDATE_LOCK__SHIFT 0x10
+#define CNV_SOURCE_SIZE__CNV_SOURCE_WIDTH_MASK 0x7fff
+#define CNV_SOURCE_SIZE__CNV_SOURCE_WIDTH__SHIFT 0x0
+#define CNV_SOURCE_SIZE__CNV_SOURCE_HEIGHT_MASK 0x7fff0000
+#define CNV_SOURCE_SIZE__CNV_SOURCE_HEIGHT__SHIFT 0x10
+#define CNV_CSC_CONTROL__CNV_CSC_BYPASS_MASK 0x1
+#define CNV_CSC_CONTROL__CNV_CSC_BYPASS__SHIFT 0x0
+#define CNV_CSC_C11_C12__CNV_CSC_C11_MASK 0x1fff
+#define CNV_CSC_C11_C12__CNV_CSC_C11__SHIFT 0x0
+#define CNV_CSC_C11_C12__CNV_CSC_C12_MASK 0x1fff0000
+#define CNV_CSC_C11_C12__CNV_CSC_C12__SHIFT 0x10
+#define CNV_CSC_C13_C14__CNV_CSC_C13_MASK 0x1fff
+#define CNV_CSC_C13_C14__CNV_CSC_C13__SHIFT 0x0
+#define CNV_CSC_C13_C14__CNV_CSC_C14_MASK 0x7fff0000
+#define CNV_CSC_C13_C14__CNV_CSC_C14__SHIFT 0x10
+#define CNV_CSC_C21_C22__CNV_CSC_C21_MASK 0x1fff
+#define CNV_CSC_C21_C22__CNV_CSC_C21__SHIFT 0x0
+#define CNV_CSC_C21_C22__CNV_CSC_C22_MASK 0x1fff0000
+#define CNV_CSC_C21_C22__CNV_CSC_C22__SHIFT 0x10
+#define CNV_CSC_C23_C24__CNV_CSC_C23_MASK 0x1fff
+#define CNV_CSC_C23_C24__CNV_CSC_C23__SHIFT 0x0
+#define CNV_CSC_C23_C24__CNV_CSC_C24_MASK 0x7fff0000
+#define CNV_CSC_C23_C24__CNV_CSC_C24__SHIFT 0x10
+#define CNV_CSC_C31_C32__CNV_CSC_C31_MASK 0x1fff
+#define CNV_CSC_C31_C32__CNV_CSC_C31__SHIFT 0x0
+#define CNV_CSC_C31_C32__CNV_CSC_C32_MASK 0x1fff0000
+#define CNV_CSC_C31_C32__CNV_CSC_C32__SHIFT 0x10
+#define CNV_CSC_C33_C34__CNV_CSC_C33_MASK 0x1fff
+#define CNV_CSC_C33_C34__CNV_CSC_C33__SHIFT 0x0
+#define CNV_CSC_C33_C34__CNV_CSC_C34_MASK 0x7fff0000
+#define CNV_CSC_C33_C34__CNV_CSC_C34__SHIFT 0x10
+#define CNV_CSC_ROUND_OFFSET_R__CNV_CSC_ROUND_OFFSET_R_MASK 0xffff
+#define CNV_CSC_ROUND_OFFSET_R__CNV_CSC_ROUND_OFFSET_R__SHIFT 0x0
+#define CNV_CSC_ROUND_OFFSET_G__CNV_CSC_ROUND_OFFSET_G_MASK 0xffff
+#define CNV_CSC_ROUND_OFFSET_G__CNV_CSC_ROUND_OFFSET_G__SHIFT 0x0
+#define CNV_CSC_ROUND_OFFSET_B__CNV_CSC_ROUND_OFFSET_B_MASK 0xffff
+#define CNV_CSC_ROUND_OFFSET_B__CNV_CSC_ROUND_OFFSET_B__SHIFT 0x0
+#define CNV_CSC_CLAMP_R__CNV_CSC_CLAMP_UPPER_R_MASK 0xffff
+#define CNV_CSC_CLAMP_R__CNV_CSC_CLAMP_UPPER_R__SHIFT 0x0
+#define CNV_CSC_CLAMP_R__CNV_CSC_CLAMP_LOWER_R_MASK 0xffff0000
+#define CNV_CSC_CLAMP_R__CNV_CSC_CLAMP_LOWER_R__SHIFT 0x10
+#define CNV_CSC_CLAMP_G__CNV_CSC_CLAMP_UPPER_G_MASK 0xffff
+#define CNV_CSC_CLAMP_G__CNV_CSC_CLAMP_UPPER_G__SHIFT 0x0
+#define CNV_CSC_CLAMP_G__CNV_CSC_CLAMP_LOWER_G_MASK 0xffff0000
+#define CNV_CSC_CLAMP_G__CNV_CSC_CLAMP_LOWER_G__SHIFT 0x10
+#define CNV_CSC_CLAMP_B__CNV_CSC_CLAMP_UPPER_B_MASK 0xffff
+#define CNV_CSC_CLAMP_B__CNV_CSC_CLAMP_UPPER_B__SHIFT 0x0
+#define CNV_CSC_CLAMP_B__CNV_CSC_CLAMP_LOWER_B_MASK 0xffff0000
+#define CNV_CSC_CLAMP_B__CNV_CSC_CLAMP_LOWER_B__SHIFT 0x10
+#define CNV_TEST_CNTL__CNV_TEST_CRC_EN_MASK 0x10
+#define CNV_TEST_CNTL__CNV_TEST_CRC_EN__SHIFT 0x4
+#define CNV_TEST_CNTL__CNV_TEST_CRC_CONT_EN_MASK 0x100
+#define CNV_TEST_CNTL__CNV_TEST_CRC_CONT_EN__SHIFT 0x8
+#define CNV_TEST_CNTL__CNV_TEST_CRC_DE_ONLY_MASK 0x10000
+#define CNV_TEST_CNTL__CNV_TEST_CRC_DE_ONLY__SHIFT 0x10
+#define CNV_TEST_CRC_RED__CNV_TEST_CRC_RED_MASK_MASK 0xfff0
+#define CNV_TEST_CRC_RED__CNV_TEST_CRC_RED_MASK__SHIFT 0x4
+#define CNV_TEST_CRC_RED__CNV_TEST_CRC_SIG_RED_MASK 0xffff0000
+#define CNV_TEST_CRC_RED__CNV_TEST_CRC_SIG_RED__SHIFT 0x10
+#define CNV_TEST_CRC_GREEN__CNV_TEST_CRC_GREEN_MASK_MASK 0xfff0
+#define CNV_TEST_CRC_GREEN__CNV_TEST_CRC_GREEN_MASK__SHIFT 0x4
+#define CNV_TEST_CRC_GREEN__CNV_TEST_CRC_SIG_GREEN_MASK 0xffff0000
+#define CNV_TEST_CRC_GREEN__CNV_TEST_CRC_SIG_GREEN__SHIFT 0x10
+#define CNV_TEST_CRC_BLUE__CNV_TEST_CRC_BLUE_MASK_MASK 0xfff0
+#define CNV_TEST_CRC_BLUE__CNV_TEST_CRC_BLUE_MASK__SHIFT 0x4
+#define CNV_TEST_CRC_BLUE__CNV_TEST_CRC_SIG_BLUE_MASK 0xffff0000
+#define CNV_TEST_CRC_BLUE__CNV_TEST_CRC_SIG_BLUE__SHIFT 0x10
+#define WB_DEBUG_CTRL__WB_DEBUG_EN_MASK 0x1
+#define WB_DEBUG_CTRL__WB_DEBUG_EN__SHIFT 0x0
+#define WB_DEBUG_CTRL__WB_DEBUG_SEL_MASK 0xc0
+#define WB_DEBUG_CTRL__WB_DEBUG_SEL__SHIFT 0x6
+#define WB_DBG_MODE__WB_DBG_MODE_EN_MASK 0x1
+#define WB_DBG_MODE__WB_DBG_MODE_EN__SHIFT 0x0
+#define WB_DBG_MODE__WB_DBG_DIN_FMT_MASK 0x2
+#define WB_DBG_MODE__WB_DBG_DIN_FMT__SHIFT 0x1
+#define WB_DBG_MODE__WB_DBG_36MODE_MASK 0x4
+#define WB_DBG_MODE__WB_DBG_36MODE__SHIFT 0x2
+#define WB_DBG_MODE__WB_DBG_CMAP_MASK 0x8
+#define WB_DBG_MODE__WB_DBG_CMAP__SHIFT 0x3
+#define WB_DBG_MODE__WB_DBG_PXLRATE_ERROR_MASK 0x100
+#define WB_DBG_MODE__WB_DBG_PXLRATE_ERROR__SHIFT 0x8
+#define WB_DBG_MODE__WB_DBG_SOURCE_WIDTH_MASK 0x7fff0000
+#define WB_DBG_MODE__WB_DBG_SOURCE_WIDTH__SHIFT 0x10
+#define WB_HW_DEBUG__WB_HW_DEBUG_MASK 0xffffffff
+#define WB_HW_DEBUG__WB_HW_DEBUG__SHIFT 0x0
+#define CNV_INPUT_SELECT__CNV_INPUT_SRC_SELECT_MASK 0x3
+#define CNV_INPUT_SELECT__CNV_INPUT_SRC_SELECT__SHIFT 0x0
+#define CNV_INPUT_SELECT__CNV_INPUT_PIPE_SELECT_MASK 0x1c
+#define CNV_INPUT_SELECT__CNV_INPUT_PIPE_SELECT__SHIFT 0x2
+#define WB_SOFT_RESET__WB_SOFT_RESET_MASK 0x1
+#define WB_SOFT_RESET__WB_SOFT_RESET__SHIFT 0x0
+#define WB_WARM_UP_MODE_CTL1__WIDTH_WARMUP_MASK 0x7fff
+#define WB_WARM_UP_MODE_CTL1__WIDTH_WARMUP__SHIFT 0x0
+#define WB_WARM_UP_MODE_CTL1__HEIGHT_WARMUP_MASK 0x7fff0000
+#define WB_WARM_UP_MODE_CTL1__HEIGHT_WARMUP__SHIFT 0x10
+#define WB_WARM_UP_MODE_CTL1__GMC_WARM_UP_ENABLE_MASK 0x80000000
+#define WB_WARM_UP_MODE_CTL1__GMC_WARM_UP_ENABLE__SHIFT 0x1f
+#define WB_WARM_UP_MODE_CTL2__DATA_VALUE_WARMUP_MASK 0xff
+#define WB_WARM_UP_MODE_CTL2__DATA_VALUE_WARMUP__SHIFT 0x0
+#define WB_WARM_UP_MODE_CTL2__MODE_WARMUP_MASK 0x100
+#define WB_WARM_UP_MODE_CTL2__MODE_WARMUP__SHIFT 0x8
+#define CNV_TEST_DEBUG_INDEX__CNV_TEST_DEBUG_INDEX_MASK 0xff
+#define CNV_TEST_DEBUG_INDEX__CNV_TEST_DEBUG_INDEX__SHIFT 0x0
+#define CNV_TEST_DEBUG_INDEX__CNV_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define CNV_TEST_DEBUG_INDEX__CNV_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define CNV_TEST_DEBUG_DATA__CNV_TEST_DEBUG_DATA_MASK 0xffffffff
+#define CNV_TEST_DEBUG_DATA__CNV_TEST_DEBUG_DATA__SHIFT 0x0
+#define DCFE_CLOCK_CONTROL__DISPCLK_R_DCFE_GATE_DISABLE_MASK 0x10
+#define DCFE_CLOCK_CONTROL__DISPCLK_R_DCFE_GATE_DISABLE__SHIFT 0x4
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_DCP_GATE_DISABLE_MASK 0x100
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_DCP_GATE_DISABLE__SHIFT 0x8
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_SCL_GATE_DISABLE_MASK 0x1000
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_SCL_GATE_DISABLE__SHIFT 0xc
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_PSCL_GATE_DISABLE_MASK 0x8000
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_PSCL_GATE_DISABLE__SHIFT 0xf
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_PIPE_REQUEST_DIS_GATE_DISABLE_MASK 0x20000
+#define DCFE_CLOCK_CONTROL__DISPCLK_G_PIPE_REQUEST_DIS_GATE_DISABLE__SHIFT 0x11
+#define DCFE_CLOCK_CONTROL__DCFE_TEST_CLK_SEL_MASK 0x1f000000
+#define DCFE_CLOCK_CONTROL__DCFE_TEST_CLK_SEL__SHIFT 0x18
+#define DCFE_CLOCK_CONTROL__DCFE_CLOCK_ENABLE_MASK 0x80000000
+#define DCFE_CLOCK_CONTROL__DCFE_CLOCK_ENABLE__SHIFT 0x1f
+#define DCFE_SOFT_RESET__DCP_PIXPIPE_SOFT_RESET_MASK 0x1
+#define DCFE_SOFT_RESET__DCP_PIXPIPE_SOFT_RESET__SHIFT 0x0
+#define DCFE_SOFT_RESET__DCP_REQ_SOFT_RESET_MASK 0x2
+#define DCFE_SOFT_RESET__DCP_REQ_SOFT_RESET__SHIFT 0x1
+#define DCFE_SOFT_RESET__SCL_ALU_SOFT_RESET_MASK 0x4
+#define DCFE_SOFT_RESET__SCL_ALU_SOFT_RESET__SHIFT 0x2
+#define DCFE_SOFT_RESET__SCL_SOFT_RESET_MASK 0x8
+#define DCFE_SOFT_RESET__SCL_SOFT_RESET__SHIFT 0x3
+#define DCFE_SOFT_RESET__CRTC_SOFT_RESET_MASK 0x10
+#define DCFE_SOFT_RESET__CRTC_SOFT_RESET__SHIFT 0x4
+#define DCFE_SOFT_RESET__PSCL_SOFT_RESET_MASK 0x20
+#define DCFE_SOFT_RESET__PSCL_SOFT_RESET__SHIFT 0x5
+#define DCFE_DBG_CONFIG__DCFE_DBG_EN_MASK 0x1
+#define DCFE_DBG_CONFIG__DCFE_DBG_EN__SHIFT 0x0
+#define DCFE_DBG_CONFIG__DCFE_DBG_SEL_MASK 0xf0
+#define DCFE_DBG_CONFIG__DCFE_DBG_SEL__SHIFT 0x4
+#define DCFE_MEM_PWR_CTRL__DCP_LUT_MEM_PWR_FORCE_MASK 0x3
+#define DCFE_MEM_PWR_CTRL__DCP_LUT_MEM_PWR_FORCE__SHIFT 0x0
+#define DCFE_MEM_PWR_CTRL__DCP_LUT_MEM_PWR_DIS_MASK 0x4
+#define DCFE_MEM_PWR_CTRL__DCP_LUT_MEM_PWR_DIS__SHIFT 0x2
+#define DCFE_MEM_PWR_CTRL__DCP_REGAMMA_MEM_PWR_FORCE_MASK 0x18
+#define DCFE_MEM_PWR_CTRL__DCP_REGAMMA_MEM_PWR_FORCE__SHIFT 0x3
+#define DCFE_MEM_PWR_CTRL__DCP_REGAMMA_MEM_PWR_DIS_MASK 0x20
+#define DCFE_MEM_PWR_CTRL__DCP_REGAMMA_MEM_PWR_DIS__SHIFT 0x5
+#define DCFE_MEM_PWR_CTRL__SCL_COEFF_MEM_PWR_FORCE_MASK 0xc0
+#define DCFE_MEM_PWR_CTRL__SCL_COEFF_MEM_PWR_FORCE__SHIFT 0x6
+#define DCFE_MEM_PWR_CTRL__SCL_COEFF_MEM_PWR_DIS_MASK 0x100
+#define DCFE_MEM_PWR_CTRL__SCL_COEFF_MEM_PWR_DIS__SHIFT 0x8
+#define DCFE_MEM_PWR_CTRL__DCP_CURSOR_MEM_PWR_FORCE_MASK 0x600
+#define DCFE_MEM_PWR_CTRL__DCP_CURSOR_MEM_PWR_FORCE__SHIFT 0x9
+#define DCFE_MEM_PWR_CTRL__DCP_CURSOR_MEM_PWR_DIS_MASK 0x800
+#define DCFE_MEM_PWR_CTRL__DCP_CURSOR_MEM_PWR_DIS__SHIFT 0xb
+#define DCFE_MEM_PWR_CTRL__LB0_ALPHA_MEM_PWR_FORCE_MASK 0x3000
+#define DCFE_MEM_PWR_CTRL__LB0_ALPHA_MEM_PWR_FORCE__SHIFT 0xc
+#define DCFE_MEM_PWR_CTRL__LB0_ALPHA_MEM_PWR_DIS_MASK 0x4000
+#define DCFE_MEM_PWR_CTRL__LB0_ALPHA_MEM_PWR_DIS__SHIFT 0xe
+#define DCFE_MEM_PWR_CTRL__LB1_ALPHA_MEM_PWR_FORCE_MASK 0x18000
+#define DCFE_MEM_PWR_CTRL__LB1_ALPHA_MEM_PWR_FORCE__SHIFT 0xf
+#define DCFE_MEM_PWR_CTRL__LB1_ALPHA_MEM_PWR_DIS_MASK 0x20000
+#define DCFE_MEM_PWR_CTRL__LB1_ALPHA_MEM_PWR_DIS__SHIFT 0x11
+#define DCFE_MEM_PWR_CTRL__LB2_ALPHA_MEM_PWR_FORCE_MASK 0xc0000
+#define DCFE_MEM_PWR_CTRL__LB2_ALPHA_MEM_PWR_FORCE__SHIFT 0x12
+#define DCFE_MEM_PWR_CTRL__LB2_ALPHA_MEM_PWR_DIS_MASK 0x100000
+#define DCFE_MEM_PWR_CTRL__LB2_ALPHA_MEM_PWR_DIS__SHIFT 0x14
+#define DCFE_MEM_PWR_CTRL__LB0_MEM_PWR_FORCE_MASK 0x600000
+#define DCFE_MEM_PWR_CTRL__LB0_MEM_PWR_FORCE__SHIFT 0x15
+#define DCFE_MEM_PWR_CTRL__LB0_MEM_PWR_DIS_MASK 0x800000
+#define DCFE_MEM_PWR_CTRL__LB0_MEM_PWR_DIS__SHIFT 0x17
+#define DCFE_MEM_PWR_CTRL__LB1_MEM_PWR_FORCE_MASK 0x3000000
+#define DCFE_MEM_PWR_CTRL__LB1_MEM_PWR_FORCE__SHIFT 0x18
+#define DCFE_MEM_PWR_CTRL__LB1_MEM_PWR_DIS_MASK 0x4000000
+#define DCFE_MEM_PWR_CTRL__LB1_MEM_PWR_DIS__SHIFT 0x1a
+#define DCFE_MEM_PWR_CTRL__LB2_MEM_PWR_FORCE_MASK 0x18000000
+#define DCFE_MEM_PWR_CTRL__LB2_MEM_PWR_FORCE__SHIFT 0x1b
+#define DCFE_MEM_PWR_CTRL__LB2_MEM_PWR_DIS_MASK 0x20000000
+#define DCFE_MEM_PWR_CTRL__LB2_MEM_PWR_DIS__SHIFT 0x1d
+#define DCFE_MEM_PWR_CTRL2__DCP_LUT_MEM_PWR_MODE_SEL_MASK 0x3
+#define DCFE_MEM_PWR_CTRL2__DCP_LUT_MEM_PWR_MODE_SEL__SHIFT 0x0
+#define DCFE_MEM_PWR_CTRL2__DCP_REGAMMA_MEM_PWR_MODE_SEL_MASK 0xc
+#define DCFE_MEM_PWR_CTRL2__DCP_REGAMMA_MEM_PWR_MODE_SEL__SHIFT 0x2
+#define DCFE_MEM_PWR_CTRL2__SCL_COEFF_MEM_PWR_MODE_SEL_MASK 0x30
+#define DCFE_MEM_PWR_CTRL2__SCL_COEFF_MEM_PWR_MODE_SEL__SHIFT 0x4
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR_MEM_PWR_MODE_SEL_MASK 0xc0
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR_MEM_PWR_MODE_SEL__SHIFT 0x6
+#define DCFE_MEM_PWR_CTRL2__LB_ALPHA_MEM_PWR_MODE_SEL_MASK 0x300
+#define DCFE_MEM_PWR_CTRL2__LB_ALPHA_MEM_PWR_MODE_SEL__SHIFT 0x8
+#define DCFE_MEM_PWR_CTRL2__LB_MEM_PWR_MODE_SEL_MASK 0xc00
+#define DCFE_MEM_PWR_CTRL2__LB_MEM_PWR_MODE_SEL__SHIFT 0xa
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_MODE_SEL_MASK 0x3000
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_MODE_SEL__SHIFT 0xc
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_MODE_SEL_MASK 0xc000
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_MODE_SEL__SHIFT 0xe
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_FORCE_MASK 0x30000
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_FORCE__SHIFT 0x10
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_DIS_MASK 0x40000
+#define DCFE_MEM_PWR_CTRL2__BLND_MEM_PWR_DIS__SHIFT 0x12
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_FORCE_MASK 0x600000
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_FORCE__SHIFT 0x15
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_DIS_MASK 0x800000
+#define DCFE_MEM_PWR_CTRL2__DCP_CURSOR2_MEM_PWR_DIS__SHIFT 0x17
+#define DCFE_MEM_PWR_STATUS__DCP_LUT_MEM_PWR_STATE_MASK 0x3
+#define DCFE_MEM_PWR_STATUS__DCP_LUT_MEM_PWR_STATE__SHIFT 0x0
+#define DCFE_MEM_PWR_STATUS__DCP_REGAMMA_MEM_PWR_STATE_MASK 0xc
+#define DCFE_MEM_PWR_STATUS__DCP_REGAMMA_MEM_PWR_STATE__SHIFT 0x2
+#define DCFE_MEM_PWR_STATUS__SCL_COEFF_MEM_PWR_STATE_MASK 0x30
+#define DCFE_MEM_PWR_STATUS__SCL_COEFF_MEM_PWR_STATE__SHIFT 0x4
+#define DCFE_MEM_PWR_STATUS__DCP_CURSOR_MEM_PWR_STATE_MASK 0xc0
+#define DCFE_MEM_PWR_STATUS__DCP_CURSOR_MEM_PWR_STATE__SHIFT 0x6
+#define DCFE_MEM_PWR_STATUS__DCP_CURSOR2_MEM_PWR_STATE_MASK 0x300
+#define DCFE_MEM_PWR_STATUS__DCP_CURSOR2_MEM_PWR_STATE__SHIFT 0x8
+#define DCFE_MEM_PWR_STATUS__LB0_ALPHA_MEM_PWR_STATE_MASK 0xc00
+#define DCFE_MEM_PWR_STATUS__LB0_ALPHA_MEM_PWR_STATE__SHIFT 0xa
+#define DCFE_MEM_PWR_STATUS__LB1_ALPHA_MEM_PWR_STATE_MASK 0x3000
+#define DCFE_MEM_PWR_STATUS__LB1_ALPHA_MEM_PWR_STATE__SHIFT 0xc
+#define DCFE_MEM_PWR_STATUS__LB2_ALPHA_MEM_PWR_STATE_MASK 0xc000
+#define DCFE_MEM_PWR_STATUS__LB2_ALPHA_MEM_PWR_STATE__SHIFT 0xe
+#define DCFE_MEM_PWR_STATUS__LB0_MEM_PWR_STATE_MASK 0x30000
+#define DCFE_MEM_PWR_STATUS__LB0_MEM_PWR_STATE__SHIFT 0x10
+#define DCFE_MEM_PWR_STATUS__LB1_MEM_PWR_STATE_MASK 0xc0000
+#define DCFE_MEM_PWR_STATUS__LB1_MEM_PWR_STATE__SHIFT 0x12
+#define DCFE_MEM_PWR_STATUS__LB2_MEM_PWR_STATE_MASK 0x300000
+#define DCFE_MEM_PWR_STATUS__LB2_MEM_PWR_STATE__SHIFT 0x14
+#define DCFE_MEM_PWR_STATUS__BLND_MEM_PWR_STATE_MASK 0xc00000
+#define DCFE_MEM_PWR_STATUS__BLND_MEM_PWR_STATE__SHIFT 0x16
+#define DCFE_MISC__DCFE_DPG_ALLOW_SR_ECO_EN_MASK 0x1
+#define DCFE_MISC__DCFE_DPG_ALLOW_SR_ECO_EN__SHIFT 0x0
+#define DCFE_FLUSH__FLUSH_OCCURED_MASK 0x1
+#define DCFE_FLUSH__FLUSH_OCCURED__SHIFT 0x0
+#define DCFE_FLUSH__CLEAR_FLUSH_OCCURED_MASK 0x2
+#define DCFE_FLUSH__CLEAR_FLUSH_OCCURED__SHIFT 0x1
+#define DCFE_FLUSH__FLUSH_DEEP_MASK 0x4
+#define DCFE_FLUSH__FLUSH_DEEP__SHIFT 0x2
+#define DCFE_FLUSH__CLEAR_FLUSH_DEEP_MASK 0x8
+#define DCFE_FLUSH__CLEAR_FLUSH_DEEP__SHIFT 0x3
+#define DCFE_FLUSH__ALL_MC_REQ_RET_MASK 0x10
+#define DCFE_FLUSH__ALL_MC_REQ_RET__SHIFT 0x4
+#define DCFEV_CLOCK_CONTROL__DISPCLK_R_DCFEV_GATE_DISABLE_MASK 0x8
+#define DCFEV_CLOCK_CONTROL__DISPCLK_R_DCFEV_GATE_DISABLE__SHIFT 0x3
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_UNP_GATE_DISABLE_MASK 0x80
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_UNP_GATE_DISABLE__SHIFT 0x7
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_SCLV_GATE_DISABLE_MASK 0x200
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_SCLV_GATE_DISABLE__SHIFT 0x9
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_COL_MAN_GATE_DISABLE_MASK 0x800
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_COL_MAN_GATE_DISABLE__SHIFT 0xb
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_PSCLV_GATE_DISABLE_MASK 0x2000
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_PSCLV_GATE_DISABLE__SHIFT 0xd
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_CRTC_GATE_DISABLE_MASK 0x8000
+#define DCFEV_CLOCK_CONTROL__DISPCLK_G_CRTC_GATE_DISABLE__SHIFT 0xf
+#define DCFEV_CLOCK_CONTROL__DCFEV_TEST_CLK_SEL_MASK 0x1f000000
+#define DCFEV_CLOCK_CONTROL__DCFEV_TEST_CLK_SEL__SHIFT 0x18
+#define DCFEV_CLOCK_CONTROL__DCFEV_CLOCK_ENABLE_MASK 0x80000000
+#define DCFEV_CLOCK_CONTROL__DCFEV_CLOCK_ENABLE__SHIFT 0x1f
+#define DCFEV_SOFT_RESET__UNP_PIXPIPE_SOFT_RESET_MASK 0x1
+#define DCFEV_SOFT_RESET__UNP_PIXPIPE_SOFT_RESET__SHIFT 0x0
+#define DCFEV_SOFT_RESET__UNP_REQ_SOFT_RESET_MASK 0x2
+#define DCFEV_SOFT_RESET__UNP_REQ_SOFT_RESET__SHIFT 0x1
+#define DCFEV_SOFT_RESET__SCLV_ALU_SOFT_RESET_MASK 0x4
+#define DCFEV_SOFT_RESET__SCLV_ALU_SOFT_RESET__SHIFT 0x2
+#define DCFEV_SOFT_RESET__SCLV_SOFT_RESET_MASK 0x8
+#define DCFEV_SOFT_RESET__SCLV_SOFT_RESET__SHIFT 0x3
+#define DCFEV_SOFT_RESET__CRTC_SOFT_RESET_MASK 0x10
+#define DCFEV_SOFT_RESET__CRTC_SOFT_RESET__SHIFT 0x4
+#define DCFEV_SOFT_RESET__PSCLV_SOFT_RESET_MASK 0x20
+#define DCFEV_SOFT_RESET__PSCLV_SOFT_RESET__SHIFT 0x5
+#define DCFEV_SOFT_RESET__COL_MAN_SOFT_RESET_MASK 0x40
+#define DCFEV_SOFT_RESET__COL_MAN_SOFT_RESET__SHIFT 0x6
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_SCLK_G_DMIFTRK_GATE_DIS_MASK 0x8
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_SCLK_G_DMIFTRK_GATE_DIS__SHIFT 0x3
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_DISPCLK_G_DMIFVL_GATE_DIS_MASK 0x10
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_DISPCLK_G_DMIFVL_GATE_DIS__SHIFT 0x4
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_DISPCLK_G_DMIFVC_GATE_DIS_MASK 0x20
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_DISPCLK_G_DMIFVC_GATE_DIS__SHIFT 0x5
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_SOFT_RESET_MASK 0x40
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_SOFT_RESET__SHIFT 0x6
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_TEST_CLK_SEL_MASK 0x1f000000
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_TEST_CLK_SEL__SHIFT 0x18
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_BUFFER_MODE_MASK 0x80000000
+#define DCFEV_DMIFV_CLOCK_CONTROL__DMIFV_BUFFER_MODE__SHIFT 0x1f
+#define DCFEV_DBG_CONFIG__DCFEV_DBG_EN_MASK 0x1
+#define DCFEV_DBG_CONFIG__DCFEV_DBG_EN__SHIFT 0x0
+#define DCFEV_DBG_CONFIG__DCFEV_DBG_SEL_MASK 0xf0
+#define DCFEV_DBG_CONFIG__DCFEV_DBG_SEL__SHIFT 0x4
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_SEL_MASK 0x3
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_SEL__SHIFT 0x0
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_0_FORCE_MASK 0x4
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_0_FORCE__SHIFT 0x2
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_1_FORCE_MASK 0x8
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_1_FORCE__SHIFT 0x3
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_2_FORCE_MASK 0x10
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_2_FORCE__SHIFT 0x4
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_3_FORCE_MASK 0x20
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_3_FORCE__SHIFT 0x5
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_4_FORCE_MASK 0x40
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_LUMA_4_FORCE__SHIFT 0x6
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_0_FORCE_MASK 0x80
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_0_FORCE__SHIFT 0x7
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_1_FORCE_MASK 0x100
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_1_FORCE__SHIFT 0x8
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_2_FORCE_MASK 0x200
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_2_FORCE__SHIFT 0x9
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_3_FORCE_MASK 0x400
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_3_FORCE__SHIFT 0xa
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_4_FORCE_MASK 0x800
+#define DCFEV_DMIFV_MEM_PWR_CTRL__DMIFV_MEM_PWR_CHROMA_4_FORCE__SHIFT 0xb
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_0_STATE_MASK 0x3
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_0_STATE__SHIFT 0x0
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_1_STATE_MASK 0xc
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_1_STATE__SHIFT 0x2
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_2_STATE_MASK 0x30
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_2_STATE__SHIFT 0x4
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_3_STATE_MASK 0xc0
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_3_STATE__SHIFT 0x6
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_4_STATE_MASK 0x300
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_LUMA_4_STATE__SHIFT 0x8
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_0_STATE_MASK 0xc00
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_0_STATE__SHIFT 0xa
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_1_STATE_MASK 0x3000
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_1_STATE__SHIFT 0xc
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_2_STATE_MASK 0xc000
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_2_STATE__SHIFT 0xe
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_3_STATE_MASK 0x30000
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_3_STATE__SHIFT 0x10
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_4_STATE_MASK 0xc0000
+#define DCFEV_DMIFV_MEM_PWR_STATUS__DMIFV_MEM_PWR_CHROMA_4_STATE__SHIFT 0x12
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_GAMMA_CORR_MEM_PWR_FORCE_MASK 0x3
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_GAMMA_CORR_MEM_PWR_FORCE__SHIFT 0x0
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_GAMMA_CORR_MEM_PWR_DIS_MASK 0x4
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_GAMMA_CORR_MEM_PWR_DIS__SHIFT 0x2
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_INPUT_GAMMA_MEM_PWR_FORCE_MASK 0x18
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_INPUT_GAMMA_MEM_PWR_FORCE__SHIFT 0x3
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_INPUT_GAMMA_MEM_PWR_DIS_MASK 0x20
+#define DCFEV_MEM_PWR_CTRL__COL_MAN_INPUT_GAMMA_MEM_PWR_DIS__SHIFT 0x5
+#define DCFEV_MEM_PWR_CTRL__SCLV_COEFF_MEM_PWR_FORCE_MASK 0xc0
+#define DCFEV_MEM_PWR_CTRL__SCLV_COEFF_MEM_PWR_FORCE__SHIFT 0x6
+#define DCFEV_MEM_PWR_CTRL__SCLV_COEFF_MEM_PWR_DIS_MASK 0x100
+#define DCFEV_MEM_PWR_CTRL__SCLV_COEFF_MEM_PWR_DIS__SHIFT 0x8
+#define DCFEV_MEM_PWR_CTRL__LBV0_MEM_PWR_FORCE_MASK 0x600
+#define DCFEV_MEM_PWR_CTRL__LBV0_MEM_PWR_FORCE__SHIFT 0x9
+#define DCFEV_MEM_PWR_CTRL__LBV0_MEM_PWR_DIS_MASK 0x800
+#define DCFEV_MEM_PWR_CTRL__LBV0_MEM_PWR_DIS__SHIFT 0xb
+#define DCFEV_MEM_PWR_CTRL__LBV1_MEM_PWR_FORCE_MASK 0x3000
+#define DCFEV_MEM_PWR_CTRL__LBV1_MEM_PWR_FORCE__SHIFT 0xc
+#define DCFEV_MEM_PWR_CTRL__LBV1_MEM_PWR_DIS_MASK 0x4000
+#define DCFEV_MEM_PWR_CTRL__LBV1_MEM_PWR_DIS__SHIFT 0xe
+#define DCFEV_MEM_PWR_CTRL__LBV2_MEM_PWR_FORCE_MASK 0x18000
+#define DCFEV_MEM_PWR_CTRL__LBV2_MEM_PWR_FORCE__SHIFT 0xf
+#define DCFEV_MEM_PWR_CTRL__LBV2_MEM_PWR_DIS_MASK 0x20000
+#define DCFEV_MEM_PWR_CTRL__LBV2_MEM_PWR_DIS__SHIFT 0x11
+#define DCFEV_MEM_PWR_CTRL2__COL_MAN_GAMMA_CORR_MEM_PWR_MODE_SEL_MASK 0x3
+#define DCFEV_MEM_PWR_CTRL2__COL_MAN_GAMMA_CORR_MEM_PWR_MODE_SEL__SHIFT 0x0
+#define DCFEV_MEM_PWR_CTRL2__COL_MAN_INPUT_GAMMA_MEM_PWR_MODE_SEL_MASK 0xc
+#define DCFEV_MEM_PWR_CTRL2__COL_MAN_INPUT_GAMMA_MEM_PWR_MODE_SEL__SHIFT 0x2
+#define DCFEV_MEM_PWR_CTRL2__SCLV_COEFF_MEM_PWR_MODE_SEL_MASK 0x30
+#define DCFEV_MEM_PWR_CTRL2__SCLV_COEFF_MEM_PWR_MODE_SEL__SHIFT 0x4
+#define DCFEV_MEM_PWR_CTRL2__LBV_MEM_PWR_MODE_SEL_MASK 0xc0
+#define DCFEV_MEM_PWR_CTRL2__LBV_MEM_PWR_MODE_SEL__SHIFT 0x6
+#define DCFEV_MEM_PWR_STATUS__COL_MAN_GAMMA_CORR_MEM_PWR_STATE_MASK 0x3
+#define DCFEV_MEM_PWR_STATUS__COL_MAN_GAMMA_CORR_MEM_PWR_STATE__SHIFT 0x0
+#define DCFEV_MEM_PWR_STATUS__COL_MAN_INPUT_GAMMA_MEM_PWR_STATE_MASK 0xc
+#define DCFEV_MEM_PWR_STATUS__COL_MAN_INPUT_GAMMA_MEM_PWR_STATE__SHIFT 0x2
+#define DCFEV_MEM_PWR_STATUS__SCLV_COEFF_MEM_PWR_STATE_MASK 0x30
+#define DCFEV_MEM_PWR_STATUS__SCLV_COEFF_MEM_PWR_STATE__SHIFT 0x4
+#define DCFEV_MEM_PWR_STATUS__LBV0_MEM_PWR_STATE_MASK 0xc0
+#define DCFEV_MEM_PWR_STATUS__LBV0_MEM_PWR_STATE__SHIFT 0x6
+#define DCFEV_MEM_PWR_STATUS__LBV1_MEM_PWR_STATE_MASK 0x300
+#define DCFEV_MEM_PWR_STATUS__LBV1_MEM_PWR_STATE__SHIFT 0x8
+#define DCFEV_MEM_PWR_STATUS__LBV2_MEM_PWR_STATE_MASK 0xc00
+#define DCFEV_MEM_PWR_STATUS__LBV2_MEM_PWR_STATE__SHIFT 0xa
+#define DCFEV_MEM_PWR_STATUS__LBV3_MEM_PWR_STATE_MASK 0x3000
+#define DCFEV_MEM_PWR_STATUS__LBV3_MEM_PWR_STATE__SHIFT 0xc
+#define DCFEV_L_FLUSH__FLUSH_OCCURED_MASK 0x1
+#define DCFEV_L_FLUSH__FLUSH_OCCURED__SHIFT 0x0
+#define DCFEV_L_FLUSH__CLEAR_FLUSH_OCCURED_MASK 0x2
+#define DCFEV_L_FLUSH__CLEAR_FLUSH_OCCURED__SHIFT 0x1
+#define DCFEV_L_FLUSH__FLUSH_DEEP_MASK 0x4
+#define DCFEV_L_FLUSH__FLUSH_DEEP__SHIFT 0x2
+#define DCFEV_L_FLUSH__CLEAR_FLUSH_DEEP_MASK 0x8
+#define DCFEV_L_FLUSH__CLEAR_FLUSH_DEEP__SHIFT 0x3
+#define DCFEV_L_FLUSH__ALL_MC_REQ_RET_MASK 0x10
+#define DCFEV_L_FLUSH__ALL_MC_REQ_RET__SHIFT 0x4
+#define DCFEV_C_FLUSH__FLUSH_OCCURED_MASK 0x1
+#define DCFEV_C_FLUSH__FLUSH_OCCURED__SHIFT 0x0
+#define DCFEV_C_FLUSH__CLEAR_FLUSH_OCCURED_MASK 0x2
+#define DCFEV_C_FLUSH__CLEAR_FLUSH_OCCURED__SHIFT 0x1
+#define DCFEV_C_FLUSH__FLUSH_DEEP_MASK 0x4
+#define DCFEV_C_FLUSH__FLUSH_DEEP__SHIFT 0x2
+#define DCFEV_C_FLUSH__CLEAR_FLUSH_DEEP_MASK 0x8
+#define DCFEV_C_FLUSH__CLEAR_FLUSH_DEEP__SHIFT 0x3
+#define DCFEV_C_FLUSH__ALL_MC_REQ_RET_MASK 0x10
+#define DCFEV_C_FLUSH__ALL_MC_REQ_RET__SHIFT 0x4
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_BUS_SEL_MASK 0xf
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_BUS_SEL__SHIFT 0x0
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_LUMA_VS_CHROMA_MASK 0x10
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_LUMA_VS_CHROMA__SHIFT 0x4
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_LOWER_UPPER_MASK 0x20
+#define DCFEV_DMIFV_DEBUG__DMIFV_DEBUG_LOWER_UPPER__SHIFT 0x5
+#define DCFEV_MISC__DCFEV_DPG_ALLOW_SR_ECO_EN_MASK 0x1
+#define DCFEV_MISC__DCFEV_DPG_ALLOW_SR_ECO_EN__SHIFT 0x0
+#define DC_HPD_INT_STATUS__DC_HPD_INT_STATUS_MASK 0x1
+#define DC_HPD_INT_STATUS__DC_HPD_INT_STATUS__SHIFT 0x0
+#define DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK 0x2
+#define DC_HPD_INT_STATUS__DC_HPD_SENSE__SHIFT 0x1
+#define DC_HPD_INT_STATUS__DC_HPD_SENSE_DELAYED_MASK 0x10
+#define DC_HPD_INT_STATUS__DC_HPD_SENSE_DELAYED__SHIFT 0x4
+#define DC_HPD_INT_STATUS__DC_HPD_RX_INT_STATUS_MASK 0x100
+#define DC_HPD_INT_STATUS__DC_HPD_RX_INT_STATUS__SHIFT 0x8
+#define DC_HPD_INT_STATUS__DC_HPD_TOGGLE_FILT_CON_TIMER_VAL_MASK 0xff000
+#define DC_HPD_INT_STATUS__DC_HPD_TOGGLE_FILT_CON_TIMER_VAL__SHIFT 0xc
+#define DC_HPD_INT_STATUS__DC_HPD_TOGGLE_FILT_DISCON_TIMER_VAL_MASK 0xff000000
+#define DC_HPD_INT_STATUS__DC_HPD_TOGGLE_FILT_DISCON_TIMER_VAL__SHIFT 0x18
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_ACK_MASK 0x1
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_ACK__SHIFT 0x0
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_POLARITY_MASK 0x100
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_POLARITY__SHIFT 0x8
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_EN_MASK 0x10000
+#define DC_HPD_INT_CONTROL__DC_HPD_INT_EN__SHIFT 0x10
+#define DC_HPD_INT_CONTROL__DC_HPD_RX_INT_ACK_MASK 0x100000
+#define DC_HPD_INT_CONTROL__DC_HPD_RX_INT_ACK__SHIFT 0x14
+#define DC_HPD_INT_CONTROL__DC_HPD_RX_INT_EN_MASK 0x1000000
+#define DC_HPD_INT_CONTROL__DC_HPD_RX_INT_EN__SHIFT 0x18
+#define DC_HPD_CONTROL__DC_HPD_CONNECTION_TIMER_MASK 0x1fff
+#define DC_HPD_CONTROL__DC_HPD_CONNECTION_TIMER__SHIFT 0x0
+#define DC_HPD_CONTROL__DC_HPD_RX_INT_TIMER_MASK 0x3ff0000
+#define DC_HPD_CONTROL__DC_HPD_RX_INT_TIMER__SHIFT 0x10
+#define DC_HPD_CONTROL__DC_HPD_EN_MASK 0x10000000
+#define DC_HPD_CONTROL__DC_HPD_EN__SHIFT 0x1c
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_AUX_TX_DELAY_MASK 0xff
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_AUX_TX_DELAY__SHIFT 0x0
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_FAST_TRAIN_DELAY_MASK 0xff000
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_FAST_TRAIN_DELAY__SHIFT 0xc
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_AUX_TX_EN_MASK 0x1000000
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_AUX_TX_EN__SHIFT 0x18
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_FAST_TRAIN_EN_MASK 0x10000000
+#define DC_HPD_FAST_TRAIN_CNTL__DC_HPD_CONNECT_FAST_TRAIN_EN__SHIFT 0x1c
+#define DC_HPD_TOGGLE_FILT_CNTL__DC_HPD_CONNECT_INT_DELAY_MASK 0xff
+#define DC_HPD_TOGGLE_FILT_CNTL__DC_HPD_CONNECT_INT_DELAY__SHIFT 0x0
+#define DC_HPD_TOGGLE_FILT_CNTL__DC_HPD_DISCONNECT_INT_DELAY_MASK 0xff00000
+#define DC_HPD_TOGGLE_FILT_CNTL__DC_HPD_DISCONNECT_INT_DELAY__SHIFT 0x14
+#define DCO_SCRATCH0__DCO_SCRATCH0_MASK 0xffffffff
+#define DCO_SCRATCH0__DCO_SCRATCH0__SHIFT 0x0
+#define DCO_SCRATCH1__DCO_SCRATCH1_MASK 0xffffffff
+#define DCO_SCRATCH1__DCO_SCRATCH1__SHIFT 0x0
+#define DCO_SCRATCH2__DCO_SCRATCH2_MASK 0xffffffff
+#define DCO_SCRATCH2__DCO_SCRATCH2__SHIFT 0x0
+#define DCO_SCRATCH3__DCO_SCRATCH3_MASK 0xffffffff
+#define DCO_SCRATCH3__DCO_SCRATCH3__SHIFT 0x0
+#define DCO_SCRATCH4__DCO_SCRATCH4_MASK 0xffffffff
+#define DCO_SCRATCH4__DCO_SCRATCH4__SHIFT 0x0
+#define DCO_SCRATCH5__DCO_SCRATCH5_MASK 0xffffffff
+#define DCO_SCRATCH5__DCO_SCRATCH5__SHIFT 0x0
+#define DCO_SCRATCH6__DCO_SCRATCH6_MASK 0xffffffff
+#define DCO_SCRATCH6__DCO_SCRATCH6__SHIFT 0x0
+#define DCO_SCRATCH7__DCO_SCRATCH7_MASK 0xffffffff
+#define DCO_SCRATCH7__DCO_SCRATCH7__SHIFT 0x0
+#define DCE_VCE_CONTROL__DC_VCE_VIDEO_PIPE_SELECT_MASK 0x7
+#define DCE_VCE_CONTROL__DC_VCE_VIDEO_PIPE_SELECT__SHIFT 0x0
+#define DCE_VCE_CONTROL__DC_VCE_AUDIO_STREAM_SELECT_MASK 0x70
+#define DCE_VCE_CONTROL__DC_VCE_AUDIO_STREAM_SELECT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS__SCL_DISP1_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS__SCL_DISP1_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS__D1BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS__D1BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS__LB_D1_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS__LB_D1_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS__LB_D1_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS__LB_D1_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS__CRTC1_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS__CRTC1_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS__CRTC1_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS__CRTC1_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS__CRTC1_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS__CRTC1_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS__CRTC1_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS__CRTC1_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS__CRTC1_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS__CRTC1_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS__CRTC1_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS__CRTC1_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS__CRTC1_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS__CRTC1_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS__DIGA_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS__DIGA_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS__DIGA_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS__DIGA_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS__DC_HPD1_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS__DC_HPD1_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS__DC_HPD1_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS__DC_HPD1_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS__AUX1_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS__AUX1_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS__AUX1_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS__AUX1_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS__DIGA_DISPCLK_SWITCH_ALLOWED_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS__DIGA_DISPCLK_SWITCH_ALLOWED_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS__DACA_AUTODETECT_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS__DACA_AUTODETECT_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS__DACB_AUTODETECT_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS__DACB_AUTODETECT_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS__DC_I2C_SW_DONE_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS__DC_I2C_SW_DONE_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS__DC_I2C_HW_DONE_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS__DC_I2C_HW_DONE_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS__DMCU_UC_INTERNAL_INT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS__DMCU_UC_INTERNAL_INT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS__DMCU_SCP_INT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS__DMCU_SCP_INT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS__ABM1_HG_READY_INT_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS__ABM1_HG_READY_INT__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS__ABM1_LS_READY_INT_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS__ABM1_LS_READY_INT__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS__ABM1_BL_UPDATE_INT__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS__DISP_INTERRUPT_STATUS_CONTINUE_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS__DISP_INTERRUPT_STATUS_CONTINUE__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE__SCL_DISP2_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE__SCL_DISP2_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE__D2BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE__D2BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC2_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE__DIGB_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE__DIGB_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE__DIGB_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE__DIGB_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE__DC_HPD2_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE__AUX2_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE__AUX2_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE__AUX2_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE__AUX2_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D1_VLINE2_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D1_VLINE2_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE2_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D2_VLINE2_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D3_VLINE2_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE__LB_D3_VLINE2_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT0_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT0__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT1_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT1__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT2_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__CRTC1_VERTICAL_INTERRUPT2__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE__DISP_INTERRUPT_STATUS_CONTINUE2_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE__DISP_INTERRUPT_STATUS_CONTINUE2__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE2__SCL_DISP3_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE2__SCL_DISP3_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE2__D3BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE2__D3BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D3_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC3_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DIGC_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DIGC_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DIGC_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DIGC_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DC_HPD3_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE2__AUX3_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__AUX3_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE2__AUX3_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__AUX3_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D4_VLINE2_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D4_VLINE2_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D5_VLINE2_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D5_VLINE2_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D6_VLINE2_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__LB_D6_VLINE2_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT0_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT0__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT1_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT1__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT2_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__CRTC2_VERTICAL_INTERRUPT2__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DISP_INTERRUPT_STATUS_CONTINUE3_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE2__DISP_INTERRUPT_STATUS_CONTINUE3__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE3__SCL_DISP4_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE3__SCL_DISP4_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE3__D4BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE3__D4BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE3__LB_D4_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC4_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DIGD_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DIGD_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DIGD_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DIGD_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DC_HPD4_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE3__AUX4_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__AUX4_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE3__AUX4_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__AUX4_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE3__BUFMGR_IHIF_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__BUFMGR_IHIF_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE3__WBSCL_HOST_CONFLICT_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__WBSCL_HOST_CONFLICT_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE3__WBSCL_DATA_OVERFLOW_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__WBSCL_DATA_OVERFLOW_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT0_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT0__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT1_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT1__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT2_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__CRTC3_VERTICAL_INTERRUPT2__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DISP_INTERRUPT_STATUS_CONTINUE4_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE3__DISP_INTERRUPT_STATUS_CONTINUE4__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE4__SCL_DISP5_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE4__SCL_DISP5_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE4__D5BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE4__D5BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE4__LB_D5_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DIGE_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DIGE_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DIGE_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DIGE_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DC_HPD5_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE4__AUX5_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__AUX5_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE4__AUX5_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__AUX5_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC5_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT0_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT0__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT1_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT1__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT2_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__CRTC4_VERTICAL_INTERRUPT2__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DISP_INTERRUPT_STATUS_CONTINUE5_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE4__DISP_INTERRUPT_STATUS_CONTINUE5__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE5__SCL_DISP6_MODE_CHANGE_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE5__SCL_DISP6_MODE_CHANGE_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE5__D6BLND_DATA_UNDERFLOW_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE5__D6BLND_DATA_UNDERFLOW_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VBLANK_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VBLANK_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_SNAPSHOT_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_SNAPSHOT_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_FORCE_VSYNC_NEXT_LINE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_FORCE_VSYNC_NEXT_LINE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_FORCE_COUNT_NOW_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_FORCE_COUNT_NOW_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_TRIGA_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_TRIGA_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_TRIGB_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_TRIGB_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VSYNC_NOM_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VSYNC_NOM_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_SET_V_TOTAL_MIN_EVENT_OCCURED_INT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_SET_V_TOTAL_MIN_EVENT_OCCURED_INT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DIGF_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DIGF_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DIGF_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DIGF_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_RX_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_RX_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE5__AUX6_SW_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__AUX6_SW_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE5__AUX6_LS_DONE_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__AUX6_LS_DONE_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_LOSS_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_LOSS_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_SIGNAL_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_EXT_TIMING_SYNC_SIGNAL_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT0_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT0__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT1_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT1__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT2_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC5_VERTICAL_INTERRUPT2__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT0_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT0__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT1_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT1__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT2_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__CRTC6_VERTICAL_INTERRUPT2__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DISP_INTERRUPT_STATUS_CONTINUE6_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE5__DISP_INTERRUPT_STATUS_CONTINUE6__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER0_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER1_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER2_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER3_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER4_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER5_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER6_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER7_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DCRX_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE6__BUFMGR_CWB0_IHIF_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE6__BUFMGR_CWB0_IHIF_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE6__BUFMGR_CWB1_IHIF_INTERRUPT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE6__BUFMGR_CWB1_IHIF_INTERRUPT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DIGG_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DIGG_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DIGG_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DIGG_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX1_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX1_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX1_GTC_SYNC_ERROR_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX1_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX2_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX2_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX2_GTC_SYNC_ERROR_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX2_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX3_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX3_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX3_GTC_SYNC_ERROR_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX3_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX4_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX4_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX4_GTC_SYNC_ERROR_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX4_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX5_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX5_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX5_GTC_SYNC_ERROR_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX5_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX6_GTC_SYNC_LOCK_DONE_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX6_GTC_SYNC_LOCK_DONE_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX6_GTC_SYNC_ERROR_INTERRUPT_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__AUX6_GTC_SYNC_ERROR_INTERRUPT__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DISP_INTERRUPT_STATUS_CONTINUE7_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE6__DISP_INTERRUPT_STATUS_CONTINUE7__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER0_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER1_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER2_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER3_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER4_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER5_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER6_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER7_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCCG_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER0_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER1_INTERRUPT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER1_INTERRUPT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER2_INTERRUPT_MASK 0x800
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER2_INTERRUPT__SHIFT 0xb
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER3_INTERRUPT_MASK 0x1000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER3_INTERRUPT__SHIFT 0xc
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER4_INTERRUPT_MASK 0x2000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER4_INTERRUPT__SHIFT 0xd
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER5_INTERRUPT_MASK 0x4000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER5_INTERRUPT__SHIFT 0xe
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER6_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER6_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER7_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCI_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER0_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER1_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER2_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER3_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER4_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER5_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER6_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER7_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DCO_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER0_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER1_INTERRUPT_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER2_INTERRUPT_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER3_INTERRUPT_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__WB_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DISP_INTERRUPT_STATUS_CONTINUE8_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE7__DISP_INTERRUPT_STATUS_CONTINUE8__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER0_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER1_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER2_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER3_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER4_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER5_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER6_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER7_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE0_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER0_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER1_INTERRUPT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER1_INTERRUPT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER2_INTERRUPT_MASK 0x800
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER2_INTERRUPT__SHIFT 0xb
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER3_INTERRUPT_MASK 0x1000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER3_INTERRUPT__SHIFT 0xc
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER4_INTERRUPT_MASK 0x2000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER4_INTERRUPT__SHIFT 0xd
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER5_INTERRUPT_MASK 0x4000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER5_INTERRUPT__SHIFT 0xe
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER6_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER6_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER7_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE1_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER0_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER1_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER2_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER3_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER4_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER5_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER6_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER7_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DCFE2_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER4_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER5_INTERRUPT_MASK 0x10000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x1c
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER6_INTERRUPT_MASK 0x20000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x1d
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER7_INTERRUPT_MASK 0x40000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__WB_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x1e
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DISP_INTERRUPT_STATUS_CONTINUE9_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE8__DISP_INTERRUPT_STATUS_CONTINUE9__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER0_INTERRUPT_MASK 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x0
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER1_INTERRUPT_MASK 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x1
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER2_INTERRUPT_MASK 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x2
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER3_INTERRUPT_MASK 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x3
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER4_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER5_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER6_INTERRUPT_MASK 0x40
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x6
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER7_INTERRUPT_MASK 0x80
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x7
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x100
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE3_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x8
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER0_INTERRUPT_MASK 0x200
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x9
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER1_INTERRUPT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER1_INTERRUPT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER2_INTERRUPT_MASK 0x800
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER2_INTERRUPT__SHIFT 0xb
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER3_INTERRUPT_MASK 0x1000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER3_INTERRUPT__SHIFT 0xc
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER4_INTERRUPT_MASK 0x2000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER4_INTERRUPT__SHIFT 0xd
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER5_INTERRUPT_MASK 0x4000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER5_INTERRUPT__SHIFT 0xe
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER6_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER6_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER7_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE4_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER0_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER0_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER1_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER1_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER2_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER2_INTERRUPT__SHIFT 0x14
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER3_INTERRUPT_MASK 0x200000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER3_INTERRUPT__SHIFT 0x15
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER4_INTERRUPT_MASK 0x400000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER4_INTERRUPT__SHIFT 0x16
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER5_INTERRUPT_MASK 0x800000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER5_INTERRUPT__SHIFT 0x17
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER6_INTERRUPT_MASK 0x1000000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER6_INTERRUPT__SHIFT 0x18
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER7_INTERRUPT_MASK 0x2000000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER7_INTERRUPT__SHIFT 0x19
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x4000000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DCFE5_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x1a
+#define DISP_INTERRUPT_STATUS_CONTINUE9__WB_PERFMON_COUNTER_OFF_INTERRUPT_MASK 0x8000000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__WB_PERFMON_COUNTER_OFF_INTERRUPT__SHIFT 0x1b
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DISP_INTERRUPT_STATUS_CONTINUE10_MASK 0x80000000
+#define DISP_INTERRUPT_STATUS_CONTINUE9__DISP_INTERRUPT_STATUS_CONTINUE10__SHIFT 0x1f
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPA_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPA_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0x4
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPA_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x20
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPA_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0x5
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPB_DP_FAST_TRAINING_COMPLETE_INTERRUPT_MASK 0x400
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPB_DP_FAST_TRAINING_COMPLETE_INTERRUPT__SHIFT 0xa
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPB_DP_VID_STREAM_DISABLE_INTERRUPT_MASK 0x800
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DIGLPB_DP_VID_STREAM_DISABLE_INTERRUPT__SHIFT 0xb
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER0_INTERRUPT_MASK 0x1000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER0_INTERRUPT__SHIFT 0xc
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER1_INTERRUPT_MASK 0x2000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER1_INTERRUPT__SHIFT 0xd
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER2_INTERRUPT_MASK 0x4000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER2_INTERRUPT__SHIFT 0xe
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER3_INTERRUPT_MASK 0x8000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER3_INTERRUPT__SHIFT 0xf
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER4_INTERRUPT_MASK 0x10000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER4_INTERRUPT__SHIFT 0x10
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER5_INTERRUPT_MASK 0x20000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER5_INTERRUPT__SHIFT 0x11
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER6_INTERRUPT_MASK 0x40000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER6_INTERRUPT__SHIFT 0x12
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER7_INTERRUPT_MASK 0x80000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER7_INTERRUPT__SHIFT 0x13
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER_OFF_INTERRUPT_MASK 0x100000
+#define DISP_INTERRUPT_STATUS_CONTINUE10__DCCG_PERFMON2_COUNTER_OFF_INTERRUPT__SHIFT 0x14
+#define DCO_MEM_PWR_STATUS__I2C_MEM_PWR_STATE_MASK 0x1
+#define DCO_MEM_PWR_STATUS__I2C_MEM_PWR_STATE__SHIFT 0x0
+#define DCO_MEM_PWR_STATUS__MVP_MEM_PWR_STATE_MASK 0x4
+#define DCO_MEM_PWR_STATUS__MVP_MEM_PWR_STATE__SHIFT 0x2
+#define DCO_MEM_PWR_STATUS__DPA_MEM_PWR_STATE_MASK 0x8
+#define DCO_MEM_PWR_STATUS__DPA_MEM_PWR_STATE__SHIFT 0x3
+#define DCO_MEM_PWR_STATUS__DPB_MEM_PWR_STATE_MASK 0x10
+#define DCO_MEM_PWR_STATUS__DPB_MEM_PWR_STATE__SHIFT 0x4
+#define DCO_MEM_PWR_STATUS__DPC_MEM_PWR_STATE_MASK 0x20
+#define DCO_MEM_PWR_STATUS__DPC_MEM_PWR_STATE__SHIFT 0x5
+#define DCO_MEM_PWR_STATUS__DPD_MEM_PWR_STATE_MASK 0x40
+#define DCO_MEM_PWR_STATUS__DPD_MEM_PWR_STATE__SHIFT 0x6
+#define DCO_MEM_PWR_STATUS__DPE_MEM_PWR_STATE_MASK 0x80
+#define DCO_MEM_PWR_STATUS__DPE_MEM_PWR_STATE__SHIFT 0x7
+#define DCO_MEM_PWR_STATUS__DPF_MEM_PWR_STATE_MASK 0x100
+#define DCO_MEM_PWR_STATUS__DPF_MEM_PWR_STATE__SHIFT 0x8
+#define DCO_MEM_PWR_STATUS__DPG_MEM_PWR_STATE_MASK 0x200
+#define DCO_MEM_PWR_STATUS__DPG_MEM_PWR_STATE__SHIFT 0x9
+#define DCO_MEM_PWR_STATUS__HDMI0_MEM_PWR_STATE_MASK 0xc00
+#define DCO_MEM_PWR_STATUS__HDMI0_MEM_PWR_STATE__SHIFT 0xa
+#define DCO_MEM_PWR_STATUS__HDMI1_MEM_PWR_STATE_MASK 0x3000
+#define DCO_MEM_PWR_STATUS__HDMI1_MEM_PWR_STATE__SHIFT 0xc
+#define DCO_MEM_PWR_STATUS__HDMI2_MEM_PWR_STATE_MASK 0xc000
+#define DCO_MEM_PWR_STATUS__HDMI2_MEM_PWR_STATE__SHIFT 0xe
+#define DCO_MEM_PWR_STATUS__HDMI3_MEM_PWR_STATE_MASK 0x30000
+#define DCO_MEM_PWR_STATUS__HDMI3_MEM_PWR_STATE__SHIFT 0x10
+#define DCO_MEM_PWR_STATUS__HDMI4_MEM_PWR_STATE_MASK 0xc0000
+#define DCO_MEM_PWR_STATUS__HDMI4_MEM_PWR_STATE__SHIFT 0x12
+#define DCO_MEM_PWR_STATUS__HDMI5_MEM_PWR_STATE_MASK 0x300000
+#define DCO_MEM_PWR_STATUS__HDMI5_MEM_PWR_STATE__SHIFT 0x14
+#define DCO_MEM_PWR_STATUS__HDMI6_MEM_PWR_STATE_MASK 0xc00000
+#define DCO_MEM_PWR_STATUS__HDMI6_MEM_PWR_STATE__SHIFT 0x16
+#define DCO_MEM_PWR_STATUS1__DPLPA_MEM_PWR_STATE_MASK 0x1
+#define DCO_MEM_PWR_STATUS1__DPLPA_MEM_PWR_STATE__SHIFT 0x0
+#define DCO_MEM_PWR_STATUS1__DPLPB_MEM_PWR_STATE_MASK 0x2
+#define DCO_MEM_PWR_STATUS1__DPLPB_MEM_PWR_STATE__SHIFT 0x1
+#define DCO_MEM_PWR_STATUS1__HDMILP0_MEM_PWR_STATE_MASK 0xc00
+#define DCO_MEM_PWR_STATUS1__HDMILP0_MEM_PWR_STATE__SHIFT 0xa
+#define DCO_MEM_PWR_STATUS1__HDMILP1_MEM_PWR_STATE_MASK 0x3000
+#define DCO_MEM_PWR_STATUS1__HDMILP1_MEM_PWR_STATE__SHIFT 0xc
+#define DCO_MEM_PWR_CTRL__I2C_LIGHT_SLEEP_FORCE_MASK 0x1
+#define DCO_MEM_PWR_CTRL__I2C_LIGHT_SLEEP_FORCE__SHIFT 0x0
+#define DCO_MEM_PWR_CTRL__I2C_LIGHT_SLEEP_DIS_MASK 0x2
+#define DCO_MEM_PWR_CTRL__I2C_LIGHT_SLEEP_DIS__SHIFT 0x1
+#define DCO_MEM_PWR_CTRL__MVP_LIGHT_SLEEP_DIS_MASK 0x8
+#define DCO_MEM_PWR_CTRL__MVP_LIGHT_SLEEP_DIS__SHIFT 0x3
+#define DCO_MEM_PWR_CTRL__DPA_LIGHT_SLEEP_DIS_MASK 0x10
+#define DCO_MEM_PWR_CTRL__DPA_LIGHT_SLEEP_DIS__SHIFT 0x4
+#define DCO_MEM_PWR_CTRL__DPB_LIGHT_SLEEP_DIS_MASK 0x20
+#define DCO_MEM_PWR_CTRL__DPB_LIGHT_SLEEP_DIS__SHIFT 0x5
+#define DCO_MEM_PWR_CTRL__DPC_LIGHT_SLEEP_DIS_MASK 0x40
+#define DCO_MEM_PWR_CTRL__DPC_LIGHT_SLEEP_DIS__SHIFT 0x6
+#define DCO_MEM_PWR_CTRL__DPD_LIGHT_SLEEP_DIS_MASK 0x80
+#define DCO_MEM_PWR_CTRL__DPD_LIGHT_SLEEP_DIS__SHIFT 0x7
+#define DCO_MEM_PWR_CTRL__DPE_LIGHT_SLEEP_DIS_MASK 0x100
+#define DCO_MEM_PWR_CTRL__DPE_LIGHT_SLEEP_DIS__SHIFT 0x8
+#define DCO_MEM_PWR_CTRL__DPF_LIGHT_SLEEP_DIS_MASK 0x200
+#define DCO_MEM_PWR_CTRL__DPF_LIGHT_SLEEP_DIS__SHIFT 0x9
+#define DCO_MEM_PWR_CTRL__DPG_LIGHT_SLEEP_DIS_MASK 0x400
+#define DCO_MEM_PWR_CTRL__DPG_LIGHT_SLEEP_DIS__SHIFT 0xa
+#define DCO_MEM_PWR_CTRL__HDMI0_MEM_PWR_FORCE_MASK 0x1800
+#define DCO_MEM_PWR_CTRL__HDMI0_MEM_PWR_FORCE__SHIFT 0xb
+#define DCO_MEM_PWR_CTRL__HDMI0_MEM_PWR_DIS_MASK 0x2000
+#define DCO_MEM_PWR_CTRL__HDMI0_MEM_PWR_DIS__SHIFT 0xd
+#define DCO_MEM_PWR_CTRL__HDMI1_MEM_PWR_FORCE_MASK 0xc000
+#define DCO_MEM_PWR_CTRL__HDMI1_MEM_PWR_FORCE__SHIFT 0xe
+#define DCO_MEM_PWR_CTRL__HDMI1_MEM_PWR_DIS_MASK 0x10000
+#define DCO_MEM_PWR_CTRL__HDMI1_MEM_PWR_DIS__SHIFT 0x10
+#define DCO_MEM_PWR_CTRL__HDMI2_MEM_PWR_FORCE_MASK 0x60000
+#define DCO_MEM_PWR_CTRL__HDMI2_MEM_PWR_FORCE__SHIFT 0x11
+#define DCO_MEM_PWR_CTRL__HDMI2_MEM_PWR_DIS_MASK 0x80000
+#define DCO_MEM_PWR_CTRL__HDMI2_MEM_PWR_DIS__SHIFT 0x13
+#define DCO_MEM_PWR_CTRL__HDMI3_MEM_PWR_FORCE_MASK 0x300000
+#define DCO_MEM_PWR_CTRL__HDMI3_MEM_PWR_FORCE__SHIFT 0x14
+#define DCO_MEM_PWR_CTRL__HDMI3_MEM_PWR_DIS_MASK 0x400000
+#define DCO_MEM_PWR_CTRL__HDMI3_MEM_PWR_DIS__SHIFT 0x16
+#define DCO_MEM_PWR_CTRL__HDMI4_MEM_PWR_FORCE_MASK 0x1800000
+#define DCO_MEM_PWR_CTRL__HDMI4_MEM_PWR_FORCE__SHIFT 0x17
+#define DCO_MEM_PWR_CTRL__HDMI4_MEM_PWR_DIS_MASK 0x2000000
+#define DCO_MEM_PWR_CTRL__HDMI4_MEM_PWR_DIS__SHIFT 0x19
+#define DCO_MEM_PWR_CTRL__HDMI5_MEM_PWR_FORCE_MASK 0xc000000
+#define DCO_MEM_PWR_CTRL__HDMI5_MEM_PWR_FORCE__SHIFT 0x1a
+#define DCO_MEM_PWR_CTRL__HDMI5_MEM_PWR_DIS_MASK 0x10000000
+#define DCO_MEM_PWR_CTRL__HDMI5_MEM_PWR_DIS__SHIFT 0x1c
+#define DCO_MEM_PWR_CTRL__HDMI6_MEM_PWR_FORCE_MASK 0x60000000
+#define DCO_MEM_PWR_CTRL__HDMI6_MEM_PWR_FORCE__SHIFT 0x1d
+#define DCO_MEM_PWR_CTRL__HDMI6_MEM_PWR_DIS_MASK 0x80000000
+#define DCO_MEM_PWR_CTRL__HDMI6_MEM_PWR_DIS__SHIFT 0x1f
+#define DCO_MEM_PWR_CTRL2__HDMI_MEM_PWR_MODE_SEL_MASK 0x3
+#define DCO_MEM_PWR_CTRL2__HDMI_MEM_PWR_MODE_SEL__SHIFT 0x0
+#define DCO_MEM_PWR_CTRL2__DPLPA_LIGHT_SLEEP_DIS_MASK 0x4
+#define DCO_MEM_PWR_CTRL2__DPLPA_LIGHT_SLEEP_DIS__SHIFT 0x2
+#define DCO_MEM_PWR_CTRL2__DPLPB_LIGHT_SLEEP_DIS_MASK 0x8
+#define DCO_MEM_PWR_CTRL2__DPLPB_LIGHT_SLEEP_DIS__SHIFT 0x3
+#define DCO_MEM_PWR_CTRL2__HDMILP0_MEM_PWR_FORCE_MASK 0x30000
+#define DCO_MEM_PWR_CTRL2__HDMILP0_MEM_PWR_FORCE__SHIFT 0x10
+#define DCO_MEM_PWR_CTRL2__HDMILP0_MEM_PWR_DIS_MASK 0x40000
+#define DCO_MEM_PWR_CTRL2__HDMILP0_MEM_PWR_DIS__SHIFT 0x12
+#define DCO_MEM_PWR_CTRL2__HDMILP1_MEM_PWR_FORCE_MASK 0x180000
+#define DCO_MEM_PWR_CTRL2__HDMILP1_MEM_PWR_FORCE__SHIFT 0x13
+#define DCO_MEM_PWR_CTRL2__HDMILP1_MEM_PWR_DIS_MASK 0x200000
+#define DCO_MEM_PWR_CTRL2__HDMILP1_MEM_PWR_DIS__SHIFT 0x15
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_DIS_MASK 0x100
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY0_CONTROL__FMT420_MEM0_PWR_STATE__SHIFT 0xc
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_DIS_MASK 0x100
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY1_CONTROL__FMT420_MEM1_PWR_STATE__SHIFT 0xc
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_DIS_MASK 0x100
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY2_CONTROL__FMT420_MEM2_PWR_STATE__SHIFT 0xc
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_DIS_MASK 0x100
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY3_CONTROL__FMT420_MEM3_PWR_STATE__SHIFT 0xc
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_DIS_MASK 0x100
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY4_CONTROL__FMT420_MEM4_PWR_STATE__SHIFT 0xc
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_SOURCE_SEL_MASK 0x7
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_SOURCE_SEL__SHIFT 0x0
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_FORCE_MASK 0x30
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_FORCE__SHIFT 0x4
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_DIS_MASK 0x100
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_DIS__SHIFT 0x8
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_STATE_MASK 0x3000
+#define FMT_MEMORY5_CONTROL__FMT420_MEM5_PWR_STATE__SHIFT 0xc
+#define DCO_CLK_CNTL__DISPCLK_R_DCO_GATE_DIS_MASK 0x20
+#define DCO_CLK_CNTL__DISPCLK_R_DCO_GATE_DIS__SHIFT 0x5
+#define DCO_CLK_CNTL__DISPCLK_G_ABM_GATE_DIS_MASK 0x40
+#define DCO_CLK_CNTL__DISPCLK_G_ABM_GATE_DIS__SHIFT 0x6
+#define DCO_CLK_CNTL__DISPCLK_G_DVO_GATE_DIS_MASK 0x80
+#define DCO_CLK_CNTL__DISPCLK_G_DVO_GATE_DIS__SHIFT 0x7
+#define DCO_CLK_CNTL__DISPCLK_G_DACA_GATE_DIS_MASK 0x100
+#define DCO_CLK_CNTL__DISPCLK_G_DACA_GATE_DIS__SHIFT 0x8
+#define DCO_CLK_CNTL__DISPCLK_G_DACB_GATE_DIS_MASK 0x200
+#define DCO_CLK_CNTL__DISPCLK_G_DACB_GATE_DIS__SHIFT 0x9
+#define DCO_CLK_CNTL__REFCLK_R_DCO_GATE_DIS_MASK 0x400
+#define DCO_CLK_CNTL__REFCLK_R_DCO_GATE_DIS__SHIFT 0xa
+#define DCO_CLK_CNTL__DISPCLK_G_FMT0_GATE_DIS_MASK 0x10000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT0_GATE_DIS__SHIFT 0x10
+#define DCO_CLK_CNTL__DISPCLK_G_FMT1_GATE_DIS_MASK 0x20000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT1_GATE_DIS__SHIFT 0x11
+#define DCO_CLK_CNTL__DISPCLK_G_FMT2_GATE_DIS_MASK 0x40000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT2_GATE_DIS__SHIFT 0x12
+#define DCO_CLK_CNTL__DISPCLK_G_FMT3_GATE_DIS_MASK 0x80000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT3_GATE_DIS__SHIFT 0x13
+#define DCO_CLK_CNTL__DISPCLK_G_FMT4_GATE_DIS_MASK 0x100000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT4_GATE_DIS__SHIFT 0x14
+#define DCO_CLK_CNTL__DISPCLK_G_FMT5_GATE_DIS_MASK 0x200000
+#define DCO_CLK_CNTL__DISPCLK_G_FMT5_GATE_DIS__SHIFT 0x15
+#define DCO_CLK_CNTL__DISPCLK_G_DIGLPA_GATE_DIS_MASK 0x400000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGLPA_GATE_DIS__SHIFT 0x16
+#define DCO_CLK_CNTL__DISPCLK_G_DIGLPB_GATE_DIS_MASK 0x800000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGLPB_GATE_DIS__SHIFT 0x17
+#define DCO_CLK_CNTL__DISPCLK_G_DIGA_GATE_DIS_MASK 0x1000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGA_GATE_DIS__SHIFT 0x18
+#define DCO_CLK_CNTL__DISPCLK_G_DIGB_GATE_DIS_MASK 0x2000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGB_GATE_DIS__SHIFT 0x19
+#define DCO_CLK_CNTL__DISPCLK_G_DIGC_GATE_DIS_MASK 0x4000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGC_GATE_DIS__SHIFT 0x1a
+#define DCO_CLK_CNTL__DISPCLK_G_DIGD_GATE_DIS_MASK 0x8000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGD_GATE_DIS__SHIFT 0x1b
+#define DCO_CLK_CNTL__DISPCLK_G_DIGE_GATE_DIS_MASK 0x10000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGE_GATE_DIS__SHIFT 0x1c
+#define DCO_CLK_CNTL__DISPCLK_G_DIGF_GATE_DIS_MASK 0x20000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGF_GATE_DIS__SHIFT 0x1d
+#define DCO_CLK_CNTL__DISPCLK_G_DIGG_GATE_DIS_MASK 0x40000000
+#define DCO_CLK_CNTL__DISPCLK_G_DIGG_GATE_DIS__SHIFT 0x1e
+#define DCO_CLK_CNTL2__DCO_TEST_CLK_SEL_MASK 0x7f
+#define DCO_CLK_CNTL2__DCO_TEST_CLK_SEL__SHIFT 0x0
+#define DCO_CLK_CNTL2__SCLK_G_AFMTA_GATE_DIS_MASK 0x80
+#define DCO_CLK_CNTL2__SCLK_G_AFMTA_GATE_DIS__SHIFT 0x7
+#define DCO_CLK_CNTL2__SCLK_G_AFMTB_GATE_DIS_MASK 0x100
+#define DCO_CLK_CNTL2__SCLK_G_AFMTB_GATE_DIS__SHIFT 0x8
+#define DCO_CLK_CNTL2__SCLK_G_AFMTC_GATE_DIS_MASK 0x200
+#define DCO_CLK_CNTL2__SCLK_G_AFMTC_GATE_DIS__SHIFT 0x9
+#define DCO_CLK_CNTL2__SCLK_G_AFMTD_GATE_DIS_MASK 0x400
+#define DCO_CLK_CNTL2__SCLK_G_AFMTD_GATE_DIS__SHIFT 0xa
+#define DCO_CLK_CNTL2__SCLK_G_AFMTE_GATE_DIS_MASK 0x800
+#define DCO_CLK_CNTL2__SCLK_G_AFMTE_GATE_DIS__SHIFT 0xb
+#define DCO_CLK_CNTL2__SCLK_G_AFMTF_GATE_DIS_MASK 0x1000
+#define DCO_CLK_CNTL2__SCLK_G_AFMTF_GATE_DIS__SHIFT 0xc
+#define DCO_CLK_CNTL2__SCLK_G_AFMTG_GATE_DIS_MASK 0x2000
+#define DCO_CLK_CNTL2__SCLK_G_AFMTG_GATE_DIS__SHIFT 0xd
+#define DCO_CLK_CNTL2__SCLK_G_AFMTLPA_GATE_DIS_MASK 0x8000
+#define DCO_CLK_CNTL2__SCLK_G_AFMTLPA_GATE_DIS__SHIFT 0xf
+#define DCO_CLK_CNTL2__SCLK_G_AFMTLPB_GATE_DIS_MASK 0x10000
+#define DCO_CLK_CNTL2__SCLK_G_AFMTLPB_GATE_DIS__SHIFT 0x10
+#define DCO_CLK_CNTL2__SYMCLKA_FE_G_AFMT_GATE_DIS_MASK 0x20000
+#define DCO_CLK_CNTL2__SYMCLKA_FE_G_AFMT_GATE_DIS__SHIFT 0x11
+#define DCO_CLK_CNTL2__SYMCLKB_FE_G_AFMT_GATE_DIS_MASK 0x40000
+#define DCO_CLK_CNTL2__SYMCLKB_FE_G_AFMT_GATE_DIS__SHIFT 0x12
+#define DCO_CLK_CNTL2__SYMCLKC_FE_G_AFMT_GATE_DIS_MASK 0x80000
+#define DCO_CLK_CNTL2__SYMCLKC_FE_G_AFMT_GATE_DIS__SHIFT 0x13
+#define DCO_CLK_CNTL2__SYMCLKD_FE_G_AFMT_GATE_DIS_MASK 0x100000
+#define DCO_CLK_CNTL2__SYMCLKD_FE_G_AFMT_GATE_DIS__SHIFT 0x14
+#define DCO_CLK_CNTL2__SYMCLKE_FE_G_AFMT_GATE_DIS_MASK 0x200000
+#define DCO_CLK_CNTL2__SYMCLKE_FE_G_AFMT_GATE_DIS__SHIFT 0x15
+#define DCO_CLK_CNTL2__SYMCLKF_FE_G_AFMT_GATE_DIS_MASK 0x400000
+#define DCO_CLK_CNTL2__SYMCLKF_FE_G_AFMT_GATE_DIS__SHIFT 0x16
+#define DCO_CLK_CNTL2__SYMCLKG_FE_G_AFMT_GATE_DIS_MASK 0x800000
+#define DCO_CLK_CNTL2__SYMCLKG_FE_G_AFMT_GATE_DIS__SHIFT 0x17
+#define DCO_CLK_CNTL2__SYMCLKLPA_FE_G_AFMT_GATE_DIS_MASK 0x2000000
+#define DCO_CLK_CNTL2__SYMCLKLPA_FE_G_AFMT_GATE_DIS__SHIFT 0x19
+#define DCO_CLK_CNTL2__SYMCLKLPB_FE_G_AFMT_GATE_DIS_MASK 0x4000000
+#define DCO_CLK_CNTL2__SYMCLKLPB_FE_G_AFMT_GATE_DIS__SHIFT 0x1a
+#define DCO_CLK_CNTL3__SYMCLKA_FE_G_TMDS_GATE_DIS_MASK 0x1
+#define DCO_CLK_CNTL3__SYMCLKA_FE_G_TMDS_GATE_DIS__SHIFT 0x0
+#define DCO_CLK_CNTL3__SYMCLKB_FE_G_TMDS_GATE_DIS_MASK 0x2
+#define DCO_CLK_CNTL3__SYMCLKB_FE_G_TMDS_GATE_DIS__SHIFT 0x1
+#define DCO_CLK_CNTL3__SYMCLKC_FE_G_TMDS_GATE_DIS_MASK 0x4
+#define DCO_CLK_CNTL3__SYMCLKC_FE_G_TMDS_GATE_DIS__SHIFT 0x2
+#define DCO_CLK_CNTL3__SYMCLKD_FE_G_TMDS_GATE_DIS_MASK 0x8
+#define DCO_CLK_CNTL3__SYMCLKD_FE_G_TMDS_GATE_DIS__SHIFT 0x3
+#define DCO_CLK_CNTL3__SYMCLKE_FE_G_TMDS_GATE_DIS_MASK 0x10
+#define DCO_CLK_CNTL3__SYMCLKE_FE_G_TMDS_GATE_DIS__SHIFT 0x4
+#define DCO_CLK_CNTL3__SYMCLKF_FE_G_TMDS_GATE_DIS_MASK 0x20
+#define DCO_CLK_CNTL3__SYMCLKF_FE_G_TMDS_GATE_DIS__SHIFT 0x5
+#define DCO_CLK_CNTL3__SYMCLKG_FE_G_TMDS_GATE_DIS_MASK 0x40
+#define DCO_CLK_CNTL3__SYMCLKG_FE_G_TMDS_GATE_DIS__SHIFT 0x6
+#define DCO_CLK_CNTL3__SYMCLKLPA_FE_G_TMDS_GATE_DIS_MASK 0x100
+#define DCO_CLK_CNTL3__SYMCLKLPA_FE_G_TMDS_GATE_DIS__SHIFT 0x8
+#define DCO_CLK_CNTL3__SYMCLKLPB_FE_G_TMDS_GATE_DIS_MASK 0x200
+#define DCO_CLK_CNTL3__SYMCLKLPB_FE_G_TMDS_GATE_DIS__SHIFT 0x9
+#define DCO_CLK_CNTL3__SYMCLKA_G_TMDS_GATE_DIS_MASK 0x400
+#define DCO_CLK_CNTL3__SYMCLKA_G_TMDS_GATE_DIS__SHIFT 0xa
+#define DCO_CLK_CNTL3__SYMCLKB_G_TMDS_GATE_DIS_MASK 0x800
+#define DCO_CLK_CNTL3__SYMCLKB_G_TMDS_GATE_DIS__SHIFT 0xb
+#define DCO_CLK_CNTL3__SYMCLKC_G_TMDS_GATE_DIS_MASK 0x1000
+#define DCO_CLK_CNTL3__SYMCLKC_G_TMDS_GATE_DIS__SHIFT 0xc
+#define DCO_CLK_CNTL3__SYMCLKD_G_TMDS_GATE_DIS_MASK 0x2000
+#define DCO_CLK_CNTL3__SYMCLKD_G_TMDS_GATE_DIS__SHIFT 0xd
+#define DCO_CLK_CNTL3__SYMCLKE_G_TMDS_GATE_DIS_MASK 0x4000
+#define DCO_CLK_CNTL3__SYMCLKE_G_TMDS_GATE_DIS__SHIFT 0xe
+#define DCO_CLK_CNTL3__SYMCLKF_G_TMDS_GATE_DIS_MASK 0x8000
+#define DCO_CLK_CNTL3__SYMCLKF_G_TMDS_GATE_DIS__SHIFT 0xf
+#define DCO_CLK_CNTL3__SYMCLKG_G_TMDS_GATE_DIS_MASK 0x10000
+#define DCO_CLK_CNTL3__SYMCLKG_G_TMDS_GATE_DIS__SHIFT 0x10
+#define DCO_CLK_CNTL3__SYMCLKLPA_G_TMDS_GATE_DIS_MASK 0x40000
+#define DCO_CLK_CNTL3__SYMCLKLPA_G_TMDS_GATE_DIS__SHIFT 0x12
+#define DCO_CLK_CNTL3__SYMCLKLPB_G_TMDS_GATE_DIS_MASK 0x80000
+#define DCO_CLK_CNTL3__SYMCLKLPB_G_TMDS_GATE_DIS__SHIFT 0x13
+#define DPDBG_CNTL__DPDBG_ENABLE_MASK 0x1
+#define DPDBG_CNTL__DPDBG_ENABLE__SHIFT 0x0
+#define DPDBG_CNTL__DPDBG_INPUT_ENABLE_MASK 0x2
+#define DPDBG_CNTL__DPDBG_INPUT_ENABLE__SHIFT 0x1
+#define DPDBG_CNTL__DPDBG_SYMCLK_ON_MASK 0x10
+#define DPDBG_CNTL__DPDBG_SYMCLK_ON__SHIFT 0x4
+#define DPDBG_CNTL__DPDBG_ERROR_DETECTION_MODE_MASK 0x100
+#define DPDBG_CNTL__DPDBG_ERROR_DETECTION_MODE__SHIFT 0x8
+#define DPDBG_CNTL__DPDBG_LINE_LENGTH_MASK 0xffff0000
+#define DPDBG_CNTL__DPDBG_LINE_LENGTH__SHIFT 0x10
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_MASK_MASK 0x1
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_MASK__SHIFT 0x0
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_TYPE_MASK 0x2
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_TYPE__SHIFT 0x1
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_ACK_MASK 0x100
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_ACK__SHIFT 0x8
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_OCCURRED_MASK 0x10000
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_OCCURRED__SHIFT 0x10
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_STATUS_MASK 0x1000000
+#define DPDBG_INTERRUPT__DPDBG_FIFO_OVERFLOW_INT_STATUS__SHIFT 0x18
+#define DCO_POWER_MANAGEMENT_CNTL__PM_ASSERT_RESET_MASK 0x1
+#define DCO_POWER_MANAGEMENT_CNTL__PM_ASSERT_RESET__SHIFT 0x0
+#define DCO_POWER_MANAGEMENT_CNTL__PM_ALL_BUSY_OFF_MASK 0x100
+#define DCO_POWER_MANAGEMENT_CNTL__PM_ALL_BUSY_OFF__SHIFT 0x8
+#define DCO_SOFT_RESET__DACA_SOFT_RESET_MASK 0x1
+#define DCO_SOFT_RESET__DACA_SOFT_RESET__SHIFT 0x0
+#define DCO_SOFT_RESET__I2S0_SPDIF0_SOFT_RESET_MASK 0x10
+#define DCO_SOFT_RESET__I2S0_SPDIF0_SOFT_RESET__SHIFT 0x4
+#define DCO_SOFT_RESET__I2S1_SOFT_RESET_MASK 0x20
+#define DCO_SOFT_RESET__I2S1_SOFT_RESET__SHIFT 0x5
+#define DCO_SOFT_RESET__SPDIF1_SOFT_RESET_MASK 0x40
+#define DCO_SOFT_RESET__SPDIF1_SOFT_RESET__SHIFT 0x6
+#define DCO_SOFT_RESET__DB_CLK_SOFT_RESET_MASK 0x1000
+#define DCO_SOFT_RESET__DB_CLK_SOFT_RESET__SHIFT 0xc
+#define DCO_SOFT_RESET__FMT0_SOFT_RESET_MASK 0x10000
+#define DCO_SOFT_RESET__FMT0_SOFT_RESET__SHIFT 0x10
+#define DCO_SOFT_RESET__FMT1_SOFT_RESET_MASK 0x20000
+#define DCO_SOFT_RESET__FMT1_SOFT_RESET__SHIFT 0x11
+#define DCO_SOFT_RESET__FMT2_SOFT_RESET_MASK 0x40000
+#define DCO_SOFT_RESET__FMT2_SOFT_RESET__SHIFT 0x12
+#define DCO_SOFT_RESET__FMT3_SOFT_RESET_MASK 0x80000
+#define DCO_SOFT_RESET__FMT3_SOFT_RESET__SHIFT 0x13
+#define DCO_SOFT_RESET__FMT4_SOFT_RESET_MASK 0x100000
+#define DCO_SOFT_RESET__FMT4_SOFT_RESET__SHIFT 0x14
+#define DCO_SOFT_RESET__FMT5_SOFT_RESET_MASK 0x200000
+#define DCO_SOFT_RESET__FMT5_SOFT_RESET__SHIFT 0x15
+#define DCO_SOFT_RESET__MVP_SOFT_RESET_MASK 0x1000000
+#define DCO_SOFT_RESET__MVP_SOFT_RESET__SHIFT 0x18
+#define DCO_SOFT_RESET__ABM_SOFT_RESET_MASK 0x2000000
+#define DCO_SOFT_RESET__ABM_SOFT_RESET__SHIFT 0x19
+#define DCO_SOFT_RESET__DVO_SOFT_RESET_MASK 0x8000000
+#define DCO_SOFT_RESET__DVO_SOFT_RESET__SHIFT 0x1b
+#define DIG_SOFT_RESET__DIGA_FE_SOFT_RESET_MASK 0x1
+#define DIG_SOFT_RESET__DIGA_FE_SOFT_RESET__SHIFT 0x0
+#define DIG_SOFT_RESET__DIGA_BE_SOFT_RESET_MASK 0x2
+#define DIG_SOFT_RESET__DIGA_BE_SOFT_RESET__SHIFT 0x1
+#define DIG_SOFT_RESET__DIGB_FE_SOFT_RESET_MASK 0x10
+#define DIG_SOFT_RESET__DIGB_FE_SOFT_RESET__SHIFT 0x4
+#define DIG_SOFT_RESET__DIGB_BE_SOFT_RESET_MASK 0x20
+#define DIG_SOFT_RESET__DIGB_BE_SOFT_RESET__SHIFT 0x5
+#define DIG_SOFT_RESET__DIGC_FE_SOFT_RESET_MASK 0x100
+#define DIG_SOFT_RESET__DIGC_FE_SOFT_RESET__SHIFT 0x8
+#define DIG_SOFT_RESET__DIGC_BE_SOFT_RESET_MASK 0x200
+#define DIG_SOFT_RESET__DIGC_BE_SOFT_RESET__SHIFT 0x9
+#define DIG_SOFT_RESET__DIGD_FE_SOFT_RESET_MASK 0x1000
+#define DIG_SOFT_RESET__DIGD_FE_SOFT_RESET__SHIFT 0xc
+#define DIG_SOFT_RESET__DIGD_BE_SOFT_RESET_MASK 0x2000
+#define DIG_SOFT_RESET__DIGD_BE_SOFT_RESET__SHIFT 0xd
+#define DIG_SOFT_RESET__DIGE_FE_SOFT_RESET_MASK 0x10000
+#define DIG_SOFT_RESET__DIGE_FE_SOFT_RESET__SHIFT 0x10
+#define DIG_SOFT_RESET__DIGE_BE_SOFT_RESET_MASK 0x20000
+#define DIG_SOFT_RESET__DIGE_BE_SOFT_RESET__SHIFT 0x11
+#define DIG_SOFT_RESET__DIGF_FE_SOFT_RESET_MASK 0x100000
+#define DIG_SOFT_RESET__DIGF_FE_SOFT_RESET__SHIFT 0x14
+#define DIG_SOFT_RESET__DIGF_BE_SOFT_RESET_MASK 0x200000
+#define DIG_SOFT_RESET__DIGF_BE_SOFT_RESET__SHIFT 0x15
+#define DIG_SOFT_RESET__DIGG_FE_SOFT_RESET_MASK 0x1000000
+#define DIG_SOFT_RESET__DIGG_FE_SOFT_RESET__SHIFT 0x18
+#define DIG_SOFT_RESET__DIGG_BE_SOFT_RESET_MASK 0x2000000
+#define DIG_SOFT_RESET__DIGG_BE_SOFT_RESET__SHIFT 0x19
+#define DIG_SOFT_RESET__DPDBG_SOFT_RESET_MASK 0x80000000
+#define DIG_SOFT_RESET__DPDBG_SOFT_RESET__SHIFT 0x1f
+#define DIG_SOFT_RESET_2__DIGLPA_FE_SOFT_RESET_MASK 0x1
+#define DIG_SOFT_RESET_2__DIGLPA_FE_SOFT_RESET__SHIFT 0x0
+#define DIG_SOFT_RESET_2__DIGLPA_BE_SOFT_RESET_MASK 0x2
+#define DIG_SOFT_RESET_2__DIGLPA_BE_SOFT_RESET__SHIFT 0x1
+#define DIG_SOFT_RESET_2__DIGLPB_FE_SOFT_RESET_MASK 0x10
+#define DIG_SOFT_RESET_2__DIGLPB_FE_SOFT_RESET__SHIFT 0x4
+#define DIG_SOFT_RESET_2__DIGLPB_BE_SOFT_RESET_MASK 0x20
+#define DIG_SOFT_RESET_2__DIGLPB_BE_SOFT_RESET__SHIFT 0x5
+#define DCO_STEREOSYNC_SEL__GENERICA_STEREOSYNC_SEL_MASK 0x7
+#define DCO_STEREOSYNC_SEL__GENERICA_STEREOSYNC_SEL__SHIFT 0x0
+#define DCO_STEREOSYNC_SEL__GENERICB_STEREOSYNC_SEL_MASK 0x70000
+#define DCO_STEREOSYNC_SEL__GENERICB_STEREOSYNC_SEL__SHIFT 0x10
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_ENABLE_MASK 0x1
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_ENABLE__SHIFT 0x0
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_TYPE_MASK 0x10
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_TYPE__SHIFT 0x4
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_STATUS_MASK 0x100
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_STATUS__SHIFT 0x8
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_MASK_MASK 0x1000
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_MASK__SHIFT 0xc
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_INTERVAL_MASK 0xfff0000
+#define DCO_HDMI_RXSTATUS_TIMER_CONTROL__DCO_HDMI_RXSTATUS_TIMER_INTERVAL__SHIFT 0x10
+#define DCO_PSP_INTERRUPT_STATUS__DCO_PSP_INTERRUPT_STATUS_MASK 0x1
+#define DCO_PSP_INTERRUPT_STATUS__DCO_PSP_INTERRUPT_STATUS__SHIFT 0x0
+#define DCO_PSP_INTERRUPT_STATUS__DCO_PSP_INTERRUPT_MESSAGE_MASK 0xfffffffe
+#define DCO_PSP_INTERRUPT_STATUS__DCO_PSP_INTERRUPT_MESSAGE__SHIFT 0x1
+#define DCO_PSP_INTERRUPT_CLEAR__DCO_PSP_INTERRUPT_CLEAR_MASK 0x1
+#define DCO_PSP_INTERRUPT_CLEAR__DCO_PSP_INTERRUPT_CLEAR__SHIFT 0x0
+#define DCO_GENERIC_INTERRUPT_MESSAGE__DCO_GENERIC_INTERRUPT_STATUS_MASK 0x1
+#define DCO_GENERIC_INTERRUPT_MESSAGE__DCO_GENERIC_INTERRUPT_STATUS__SHIFT 0x0
+#define DCO_GENERIC_INTERRUPT_MESSAGE__DCO_GENERIC_INTERRUPT_MESSAGE_MASK 0xfffffffe
+#define DCO_GENERIC_INTERRUPT_MESSAGE__DCO_GENERIC_INTERRUPT_MESSAGE__SHIFT 0x1
+#define DCO_GENERIC_INTERRUPT_CLEAR__DCO_GENERIC_INTERRUPT_CLEAR_MASK 0x1
+#define DCO_GENERIC_INTERRUPT_CLEAR__DCO_GENERIC_INTERRUPT_CLEAR__SHIFT 0x0
+#define DCO_TEST_DEBUG_INDEX__DCO_TEST_DEBUG_INDEX_MASK 0xff
+#define DCO_TEST_DEBUG_INDEX__DCO_TEST_DEBUG_INDEX__SHIFT 0x0
+#define DCO_TEST_DEBUG_INDEX__DCO_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define DCO_TEST_DEBUG_INDEX__DCO_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define DCO_TEST_DEBUG_DATA__DCO_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DCO_TEST_DEBUG_DATA__DCO_TEST_DEBUG_DATA__SHIFT 0x0
+#define DC_I2C_CONTROL__DC_I2C_GO_MASK 0x1
+#define DC_I2C_CONTROL__DC_I2C_GO__SHIFT 0x0
+#define DC_I2C_CONTROL__DC_I2C_SOFT_RESET_MASK 0x2
+#define DC_I2C_CONTROL__DC_I2C_SOFT_RESET__SHIFT 0x1
+#define DC_I2C_CONTROL__DC_I2C_SEND_RESET_MASK 0x4
+#define DC_I2C_CONTROL__DC_I2C_SEND_RESET__SHIFT 0x2
+#define DC_I2C_CONTROL__DC_I2C_SW_STATUS_RESET_MASK 0x8
+#define DC_I2C_CONTROL__DC_I2C_SW_STATUS_RESET__SHIFT 0x3
+#define DC_I2C_CONTROL__DC_I2C_DDC_SELECT_MASK 0x700
+#define DC_I2C_CONTROL__DC_I2C_DDC_SELECT__SHIFT 0x8
+#define DC_I2C_CONTROL__DC_I2C_TRANSACTION_COUNT_MASK 0x300000
+#define DC_I2C_CONTROL__DC_I2C_TRANSACTION_COUNT__SHIFT 0x14
+#define DC_I2C_CONTROL__DC_I2C_DBG_REF_SEL_MASK 0x80000000
+#define DC_I2C_CONTROL__DC_I2C_DBG_REF_SEL__SHIFT 0x1f
+#define DC_I2C_ARBITRATION__DC_I2C_SW_PRIORITY_MASK 0x3
+#define DC_I2C_ARBITRATION__DC_I2C_SW_PRIORITY__SHIFT 0x0
+#define DC_I2C_ARBITRATION__DC_I2C_REG_RW_CNTL_STATUS_MASK 0xc
+#define DC_I2C_ARBITRATION__DC_I2C_REG_RW_CNTL_STATUS__SHIFT 0x2
+#define DC_I2C_ARBITRATION__DC_I2C_NO_QUEUED_SW_GO_MASK 0x10
+#define DC_I2C_ARBITRATION__DC_I2C_NO_QUEUED_SW_GO__SHIFT 0x4
+#define DC_I2C_ARBITRATION__DC_I2C_ABORT_HW_XFER_MASK 0x100
+#define DC_I2C_ARBITRATION__DC_I2C_ABORT_HW_XFER__SHIFT 0x8
+#define DC_I2C_ARBITRATION__DC_I2C_ABORT_SW_XFER_MASK 0x1000
+#define DC_I2C_ARBITRATION__DC_I2C_ABORT_SW_XFER__SHIFT 0xc
+#define DC_I2C_ARBITRATION__DC_I2C_SW_USE_I2C_REG_REQ_MASK 0x100000
+#define DC_I2C_ARBITRATION__DC_I2C_SW_USE_I2C_REG_REQ__SHIFT 0x14
+#define DC_I2C_ARBITRATION__DC_I2C_SW_DONE_USING_I2C_REG_MASK 0x200000
+#define DC_I2C_ARBITRATION__DC_I2C_SW_DONE_USING_I2C_REG__SHIFT 0x15
+#define DC_I2C_ARBITRATION__DC_I2C_DMCU_USE_I2C_REG_REQ_MASK 0x1000000
+#define DC_I2C_ARBITRATION__DC_I2C_DMCU_USE_I2C_REG_REQ__SHIFT 0x18
+#define DC_I2C_ARBITRATION__DC_I2C_DMCU_DONE_USING_I2C_REG_MASK 0x2000000
+#define DC_I2C_ARBITRATION__DC_I2C_DMCU_DONE_USING_I2C_REG__SHIFT 0x19
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_INT_MASK 0x1
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_INT__SHIFT 0x0
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_ACK_MASK 0x2
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_ACK__SHIFT 0x1
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_MASK_MASK 0x4
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_SW_DONE_MASK__SHIFT 0x2
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_INT_MASK 0x10
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_INT__SHIFT 0x4
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_ACK_MASK 0x20
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_ACK__SHIFT 0x5
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_MASK_MASK 0x40
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC1_HW_DONE_MASK__SHIFT 0x6
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_INT_MASK 0x100
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_INT__SHIFT 0x8
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_ACK_MASK 0x200
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_ACK__SHIFT 0x9
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_MASK_MASK 0x400
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC2_HW_DONE_MASK__SHIFT 0xa
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_INT_MASK 0x1000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_INT__SHIFT 0xc
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_ACK_MASK 0x2000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_ACK__SHIFT 0xd
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_MASK_MASK 0x4000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC3_HW_DONE_MASK__SHIFT 0xe
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_INT_MASK 0x10000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_INT__SHIFT 0x10
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_ACK_MASK 0x20000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_ACK__SHIFT 0x11
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_MASK_MASK 0x40000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC4_HW_DONE_MASK__SHIFT 0x12
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_INT_MASK 0x100000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_INT__SHIFT 0x14
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_ACK_MASK 0x200000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_ACK__SHIFT 0x15
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_MASK_MASK 0x400000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC5_HW_DONE_MASK__SHIFT 0x16
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_INT_MASK 0x1000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_INT__SHIFT 0x18
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_ACK_MASK 0x2000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_ACK__SHIFT 0x19
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_MASK_MASK 0x4000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDC6_HW_DONE_MASK__SHIFT 0x1a
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_INT_MASK 0x8000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_INT__SHIFT 0x1b
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_ACK_MASK 0x10000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_ACK__SHIFT 0x1c
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_MASK_MASK 0x20000000
+#define DC_I2C_INTERRUPT_CONTROL__DC_I2C_DDCVGA_HW_DONE_MASK__SHIFT 0x1d
+#define DC_I2C_SW_STATUS__DC_I2C_SW_STATUS_MASK 0x3
+#define DC_I2C_SW_STATUS__DC_I2C_SW_STATUS__SHIFT 0x0
+#define DC_I2C_SW_STATUS__DC_I2C_SW_DONE_MASK 0x4
+#define DC_I2C_SW_STATUS__DC_I2C_SW_DONE__SHIFT 0x2
+#define DC_I2C_SW_STATUS__DC_I2C_SW_ABORTED_MASK 0x10
+#define DC_I2C_SW_STATUS__DC_I2C_SW_ABORTED__SHIFT 0x4
+#define DC_I2C_SW_STATUS__DC_I2C_SW_TIMEOUT_MASK 0x20
+#define DC_I2C_SW_STATUS__DC_I2C_SW_TIMEOUT__SHIFT 0x5
+#define DC_I2C_SW_STATUS__DC_I2C_SW_INTERRUPTED_MASK 0x40
+#define DC_I2C_SW_STATUS__DC_I2C_SW_INTERRUPTED__SHIFT 0x6
+#define DC_I2C_SW_STATUS__DC_I2C_SW_BUFFER_OVERFLOW_MASK 0x80
+#define DC_I2C_SW_STATUS__DC_I2C_SW_BUFFER_OVERFLOW__SHIFT 0x7
+#define DC_I2C_SW_STATUS__DC_I2C_SW_STOPPED_ON_NACK_MASK 0x100
+#define DC_I2C_SW_STATUS__DC_I2C_SW_STOPPED_ON_NACK__SHIFT 0x8
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK0_MASK 0x1000
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK0__SHIFT 0xc
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK1_MASK 0x2000
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK1__SHIFT 0xd
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK2_MASK 0x4000
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK2__SHIFT 0xe
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK3_MASK 0x8000
+#define DC_I2C_SW_STATUS__DC_I2C_SW_NACK3__SHIFT 0xf
+#define DC_I2C_SW_STATUS__DC_I2C_SW_REQ_MASK 0x40000
+#define DC_I2C_SW_STATUS__DC_I2C_SW_REQ__SHIFT 0x12
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_DONE_MASK 0x8
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_URG_MASK 0x20000
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC1_HW_STATUS__DC_I2C_DDC1_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_DONE_MASK 0x8
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_URG_MASK 0x20000
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC2_HW_STATUS__DC_I2C_DDC2_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_DONE_MASK 0x8
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_URG_MASK 0x20000
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC3_HW_STATUS__DC_I2C_DDC3_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_DONE_MASK 0x8
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_URG_MASK 0x20000
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC4_HW_STATUS__DC_I2C_DDC4_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_DONE_MASK 0x8
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_URG_MASK 0x20000
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC5_HW_STATUS__DC_I2C_DDC5_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_STATUS_MASK 0x3
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_DONE_MASK 0x8
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_REQ_MASK 0x10000
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_URG_MASK 0x20000
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_HW_URG__SHIFT 0x11
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDC6_HW_STATUS__DC_I2C_DDC6_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC1_SPEED__DC_I2C_DDC1_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_ENABLE_MASK 0x40
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC1_SETUP__DC_I2C_DDC1_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC2_SPEED__DC_I2C_DDC2_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_ENABLE_MASK 0x40
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC2_SETUP__DC_I2C_DDC2_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC3_SPEED__DC_I2C_DDC3_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_ENABLE_MASK 0x40
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC3_SETUP__DC_I2C_DDC3_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC4_SPEED__DC_I2C_DDC4_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_ENABLE_MASK 0x40
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC4_SETUP__DC_I2C_DDC4_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC5_SPEED__DC_I2C_DDC5_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_ENABLE_MASK 0x40
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC5_SETUP__DC_I2C_DDC5_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_THRESHOLD_MASK 0x3
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDC6_SPEED__DC_I2C_DDC6_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_ENABLE_MASK 0x40
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_ENABLE__SHIFT 0x6
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDC6_SETUP__DC_I2C_DDC6_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_TRANSACTION0__DC_I2C_RW0_MASK 0x1
+#define DC_I2C_TRANSACTION0__DC_I2C_RW0__SHIFT 0x0
+#define DC_I2C_TRANSACTION0__DC_I2C_STOP_ON_NACK0_MASK 0x100
+#define DC_I2C_TRANSACTION0__DC_I2C_STOP_ON_NACK0__SHIFT 0x8
+#define DC_I2C_TRANSACTION0__DC_I2C_START0_MASK 0x1000
+#define DC_I2C_TRANSACTION0__DC_I2C_START0__SHIFT 0xc
+#define DC_I2C_TRANSACTION0__DC_I2C_STOP0_MASK 0x2000
+#define DC_I2C_TRANSACTION0__DC_I2C_STOP0__SHIFT 0xd
+#define DC_I2C_TRANSACTION0__DC_I2C_COUNT0_MASK 0x3ff0000
+#define DC_I2C_TRANSACTION0__DC_I2C_COUNT0__SHIFT 0x10
+#define DC_I2C_TRANSACTION1__DC_I2C_RW1_MASK 0x1
+#define DC_I2C_TRANSACTION1__DC_I2C_RW1__SHIFT 0x0
+#define DC_I2C_TRANSACTION1__DC_I2C_STOP_ON_NACK1_MASK 0x100
+#define DC_I2C_TRANSACTION1__DC_I2C_STOP_ON_NACK1__SHIFT 0x8
+#define DC_I2C_TRANSACTION1__DC_I2C_START1_MASK 0x1000
+#define DC_I2C_TRANSACTION1__DC_I2C_START1__SHIFT 0xc
+#define DC_I2C_TRANSACTION1__DC_I2C_STOP1_MASK 0x2000
+#define DC_I2C_TRANSACTION1__DC_I2C_STOP1__SHIFT 0xd
+#define DC_I2C_TRANSACTION1__DC_I2C_COUNT1_MASK 0x3ff0000
+#define DC_I2C_TRANSACTION1__DC_I2C_COUNT1__SHIFT 0x10
+#define DC_I2C_TRANSACTION2__DC_I2C_RW2_MASK 0x1
+#define DC_I2C_TRANSACTION2__DC_I2C_RW2__SHIFT 0x0
+#define DC_I2C_TRANSACTION2__DC_I2C_STOP_ON_NACK2_MASK 0x100
+#define DC_I2C_TRANSACTION2__DC_I2C_STOP_ON_NACK2__SHIFT 0x8
+#define DC_I2C_TRANSACTION2__DC_I2C_START2_MASK 0x1000
+#define DC_I2C_TRANSACTION2__DC_I2C_START2__SHIFT 0xc
+#define DC_I2C_TRANSACTION2__DC_I2C_STOP2_MASK 0x2000
+#define DC_I2C_TRANSACTION2__DC_I2C_STOP2__SHIFT 0xd
+#define DC_I2C_TRANSACTION2__DC_I2C_COUNT2_MASK 0x3ff0000
+#define DC_I2C_TRANSACTION2__DC_I2C_COUNT2__SHIFT 0x10
+#define DC_I2C_TRANSACTION3__DC_I2C_RW3_MASK 0x1
+#define DC_I2C_TRANSACTION3__DC_I2C_RW3__SHIFT 0x0
+#define DC_I2C_TRANSACTION3__DC_I2C_STOP_ON_NACK3_MASK 0x100
+#define DC_I2C_TRANSACTION3__DC_I2C_STOP_ON_NACK3__SHIFT 0x8
+#define DC_I2C_TRANSACTION3__DC_I2C_START3_MASK 0x1000
+#define DC_I2C_TRANSACTION3__DC_I2C_START3__SHIFT 0xc
+#define DC_I2C_TRANSACTION3__DC_I2C_STOP3_MASK 0x2000
+#define DC_I2C_TRANSACTION3__DC_I2C_STOP3__SHIFT 0xd
+#define DC_I2C_TRANSACTION3__DC_I2C_COUNT3_MASK 0x3ff0000
+#define DC_I2C_TRANSACTION3__DC_I2C_COUNT3__SHIFT 0x10
+#define DC_I2C_DATA__DC_I2C_DATA_RW_MASK 0x1
+#define DC_I2C_DATA__DC_I2C_DATA_RW__SHIFT 0x0
+#define DC_I2C_DATA__DC_I2C_DATA_MASK 0xff00
+#define DC_I2C_DATA__DC_I2C_DATA__SHIFT 0x8
+#define DC_I2C_DATA__DC_I2C_INDEX_MASK 0x3ff0000
+#define DC_I2C_DATA__DC_I2C_INDEX__SHIFT 0x10
+#define DC_I2C_DATA__DC_I2C_INDEX_WRITE_MASK 0x80000000
+#define DC_I2C_DATA__DC_I2C_INDEX_WRITE__SHIFT 0x1f
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_STATUS_MASK 0x3
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_STATUS__SHIFT 0x0
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_DONE_MASK 0x8
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_DONE__SHIFT 0x3
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_REQ_MASK 0x10000
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_REQ__SHIFT 0x10
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_URG_MASK 0x20000
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_HW_URG__SHIFT 0x11
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_STATUS_MASK 0x100000
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_STATUS__SHIFT 0x14
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_NUM_VALID_TRIES_MASK 0xf000000
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_NUM_VALID_TRIES__SHIFT 0x18
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_STATE_MASK 0x70000000
+#define DC_I2C_DDCVGA_HW_STATUS__DC_I2C_DDCVGA_EDID_DETECT_STATE__SHIFT 0x1c
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_THRESHOLD_MASK 0x3
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_THRESHOLD__SHIFT 0x0
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_START_STOP_TIMING_CNTL_MASK 0x300
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_PRESCALE_MASK 0xffff0000
+#define DC_I2C_DDCVGA_SPEED__DC_I2C_DDCVGA_PRESCALE__SHIFT 0x10
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_DATA_DRIVE_EN_MASK 0x1
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_DATA_DRIVE_EN__SHIFT 0x0
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_DATA_DRIVE_SEL_MASK 0x2
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_DATA_DRIVE_SEL__SHIFT 0x1
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_EDID_DETECT_ENABLE_MASK 0x10
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_EDID_DETECT_ENABLE__SHIFT 0x4
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_EDID_DETECT_MODE_MASK 0x20
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_EDID_DETECT_MODE__SHIFT 0x5
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_ENABLE_MASK 0x40
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_ENABLE__SHIFT 0x6
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_CLK_DRIVE_EN_MASK 0x80
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_CLK_DRIVE_EN__SHIFT 0x7
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_INTRA_BYTE_DELAY_MASK 0xff00
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_INTRA_BYTE_DELAY__SHIFT 0x8
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_INTRA_TRANSACTION_DELAY_MASK 0xff0000
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_INTRA_TRANSACTION_DELAY__SHIFT 0x10
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_TIME_LIMIT_MASK 0xff000000
+#define DC_I2C_DDCVGA_SETUP__DC_I2C_DDCVGA_TIME_LIMIT__SHIFT 0x18
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_WAIT_TIME_MASK 0xffff
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_WAIT_TIME__SHIFT 0x0
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_NUM_TRIES_UNTIL_VALID_MASK 0xf00000
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_NUM_TRIES_UNTIL_VALID__SHIFT 0x14
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_SEND_RESET_MASK 0x10000000
+#define DC_I2C_EDID_DETECT_CTRL__DC_I2C_EDID_DETECT_SEND_RESET__SHIFT 0x1c
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_OCCURRED_MASK 0x1
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_OCCURRED__SHIFT 0x0
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_INT_MASK 0x2
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_INT__SHIFT 0x1
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_ACK_MASK 0x4
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_ACK__SHIFT 0x2
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_MASK_MASK 0x8
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC1_READ_REQUEST_MASK__SHIFT 0x3
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_OCCURRED_MASK 0x10
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_OCCURRED__SHIFT 0x4
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_INT_MASK 0x20
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_INT__SHIFT 0x5
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_ACK_MASK 0x40
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_ACK__SHIFT 0x6
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_MASK_MASK 0x80
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC2_READ_REQUEST_MASK__SHIFT 0x7
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_OCCURRED_MASK 0x100
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_OCCURRED__SHIFT 0x8
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_INT_MASK 0x200
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_INT__SHIFT 0x9
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_ACK_MASK 0x400
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_ACK__SHIFT 0xa
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_MASK_MASK 0x800
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC3_READ_REQUEST_MASK__SHIFT 0xb
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_OCCURRED_MASK 0x1000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_OCCURRED__SHIFT 0xc
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_INT_MASK 0x2000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_INT__SHIFT 0xd
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_ACK_MASK 0x4000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_ACK__SHIFT 0xe
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_MASK_MASK 0x8000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC4_READ_REQUEST_MASK__SHIFT 0xf
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_OCCURRED_MASK 0x10000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_OCCURRED__SHIFT 0x10
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_INT_MASK 0x20000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_INT__SHIFT 0x11
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_ACK_MASK 0x40000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_ACK__SHIFT 0x12
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_MASK_MASK 0x80000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC5_READ_REQUEST_MASK__SHIFT 0x13
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_OCCURRED_MASK 0x100000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_OCCURRED__SHIFT 0x14
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_INT_MASK 0x200000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_INT__SHIFT 0x15
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_ACK_MASK 0x400000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_ACK__SHIFT 0x16
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_MASK_MASK 0x800000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC6_READ_REQUEST_MASK__SHIFT 0x17
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_OCCURRED_MASK 0x1000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_OCCURRED__SHIFT 0x18
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_INT_MASK 0x2000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_INT__SHIFT 0x19
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_ACK_MASK 0x4000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_ACK__SHIFT 0x1a
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_MASK_MASK 0x8000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDCVGA_READ_REQUEST_MASK__SHIFT 0x1b
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC_READ_REQUEST_ACK_ENABLE_MASK 0x40000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC_READ_REQUEST_ACK_ENABLE__SHIFT 0x1e
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC_READ_REQUEST_INT_TYPE_MASK 0x80000000
+#define DC_I2C_READ_REQUEST_INTERRUPT__DC_I2C_DDC_READ_REQUEST_INT_TYPE__SHIFT 0x1f
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_GO_MASK 0x1
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_GO__SHIFT 0x0
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_SOFT_RESET_MASK 0x2
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_SOFT_RESET__SHIFT 0x1
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_SEND_RESET_MASK 0x4
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_SEND_RESET__SHIFT 0x2
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_ENABLE_MASK 0x8
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_ENABLE__SHIFT 0x3
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_DBG_REF_SEL_MASK 0x80000000
+#define GENERIC_I2C_CONTROL__GENERIC_I2C_DBG_REF_SEL__SHIFT 0x1f
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_INT_MASK 0x1
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_INT__SHIFT 0x0
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_ACK_MASK 0x2
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_ACK__SHIFT 0x1
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_MASK_MASK 0x4
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DONE_MASK__SHIFT 0x2
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_OCCURRED_MASK 0x100
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_OCCURRED__SHIFT 0x8
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_INT_MASK 0x200
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_INT__SHIFT 0x9
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_ACK_MASK 0x400
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_ACK__SHIFT 0xa
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_MASK_MASK 0x800
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_MASK__SHIFT 0xb
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_INT_TYPE_MASK 0x1000
+#define GENERIC_I2C_INTERRUPT_CONTROL__GENERIC_I2C_DDC_READ_REQUEST_INT_TYPE__SHIFT 0xc
+#define GENERIC_I2C_STATUS__GENERIC_I2C_STATUS_MASK 0xf
+#define GENERIC_I2C_STATUS__GENERIC_I2C_STATUS__SHIFT 0x0
+#define GENERIC_I2C_STATUS__GENERIC_I2C_DONE_MASK 0x10
+#define GENERIC_I2C_STATUS__GENERIC_I2C_DONE__SHIFT 0x4
+#define GENERIC_I2C_STATUS__GENERIC_I2C_ABORTED_MASK 0x20
+#define GENERIC_I2C_STATUS__GENERIC_I2C_ABORTED__SHIFT 0x5
+#define GENERIC_I2C_STATUS__GENERIC_I2C_TIMEOUT_MASK 0x40
+#define GENERIC_I2C_STATUS__GENERIC_I2C_TIMEOUT__SHIFT 0x6
+#define GENERIC_I2C_STATUS__GENERIC_I2C_STOPPED_ON_NACK_MASK 0x200
+#define GENERIC_I2C_STATUS__GENERIC_I2C_STOPPED_ON_NACK__SHIFT 0x9
+#define GENERIC_I2C_STATUS__GENERIC_I2C_NACK_MASK 0x400
+#define GENERIC_I2C_STATUS__GENERIC_I2C_NACK__SHIFT 0xa
+#define GENERIC_I2C_SPEED__GENERIC_I2C_THRESHOLD_MASK 0x3
+#define GENERIC_I2C_SPEED__GENERIC_I2C_THRESHOLD__SHIFT 0x0
+#define GENERIC_I2C_SPEED__GENERIC_I2C_DISABLE_FILTER_DURING_STALL_MASK 0x10
+#define GENERIC_I2C_SPEED__GENERIC_I2C_DISABLE_FILTER_DURING_STALL__SHIFT 0x4
+#define GENERIC_I2C_SPEED__GENERIC_I2C_START_STOP_TIMING_CNTL_MASK 0x300
+#define GENERIC_I2C_SPEED__GENERIC_I2C_START_STOP_TIMING_CNTL__SHIFT 0x8
+#define GENERIC_I2C_SPEED__GENERIC_I2C_PRESCALE_MASK 0xffff0000
+#define GENERIC_I2C_SPEED__GENERIC_I2C_PRESCALE__SHIFT 0x10
+#define GENERIC_I2C_SETUP__GENERIC_I2C_DATA_DRIVE_EN_MASK 0x1
+#define GENERIC_I2C_SETUP__GENERIC_I2C_DATA_DRIVE_EN__SHIFT 0x0
+#define GENERIC_I2C_SETUP__GENERIC_I2C_DATA_DRIVE_SEL_MASK 0x2
+#define GENERIC_I2C_SETUP__GENERIC_I2C_DATA_DRIVE_SEL__SHIFT 0x1
+#define GENERIC_I2C_SETUP__GENERIC_I2C_CLK_DRIVE_EN_MASK 0x80
+#define GENERIC_I2C_SETUP__GENERIC_I2C_CLK_DRIVE_EN__SHIFT 0x7
+#define GENERIC_I2C_SETUP__GENERIC_I2C_INTRA_BYTE_DELAY_MASK 0xff00
+#define GENERIC_I2C_SETUP__GENERIC_I2C_INTRA_BYTE_DELAY__SHIFT 0x8
+#define GENERIC_I2C_SETUP__GENERIC_I2C_TIME_LIMIT_MASK 0xff000000
+#define GENERIC_I2C_SETUP__GENERIC_I2C_TIME_LIMIT__SHIFT 0x18
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_RW_MASK 0x1
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_RW__SHIFT 0x0
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_STOP_ON_NACK_MASK 0x100
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_STOP_ON_NACK__SHIFT 0x8
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_ACK_ON_READ_MASK 0x200
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_ACK_ON_READ__SHIFT 0x9
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_START_MASK 0x1000
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_START__SHIFT 0xc
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_STOP_MASK 0x2000
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_STOP__SHIFT 0xd
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_COUNT_MASK 0xf0000
+#define GENERIC_I2C_TRANSACTION__GENERIC_I2C_COUNT__SHIFT 0x10
+#define GENERIC_I2C_DATA__GENERIC_I2C_DATA_RW_MASK 0x1
+#define GENERIC_I2C_DATA__GENERIC_I2C_DATA_RW__SHIFT 0x0
+#define GENERIC_I2C_DATA__GENERIC_I2C_DATA_MASK 0xff00
+#define GENERIC_I2C_DATA__GENERIC_I2C_DATA__SHIFT 0x8
+#define GENERIC_I2C_DATA__GENERIC_I2C_INDEX_MASK 0xf0000
+#define GENERIC_I2C_DATA__GENERIC_I2C_INDEX__SHIFT 0x10
+#define GENERIC_I2C_DATA__GENERIC_I2C_INDEX_WRITE_MASK 0x80000000
+#define GENERIC_I2C_DATA__GENERIC_I2C_INDEX_WRITE__SHIFT 0x1f
+#define GENERIC_I2C_PIN_SELECTION__GENERIC_I2C_SCL_PIN_SEL_MASK 0x7f
+#define GENERIC_I2C_PIN_SELECTION__GENERIC_I2C_SCL_PIN_SEL__SHIFT 0x0
+#define GENERIC_I2C_PIN_SELECTION__GENERIC_I2C_SDA_PIN_SEL_MASK 0x7f00
+#define GENERIC_I2C_PIN_SELECTION__GENERIC_I2C_SDA_PIN_SEL__SHIFT 0x8
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_OUTPUT_MASK 0x1
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_OUTPUT__SHIFT 0x0
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_INPUT_MASK 0x2
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_INPUT__SHIFT 0x1
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_EN_MASK 0x4
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SCL_EN__SHIFT 0x2
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_OUTPUT_MASK 0x10
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_OUTPUT__SHIFT 0x4
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_INPUT_MASK 0x20
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_INPUT__SHIFT 0x5
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_EN_MASK 0x40
+#define GENERIC_I2C_PIN_DEBUG__GENERIC_I2C_SDA_EN__SHIFT 0x6
+#define BLNDV_CONTROL__BLND_GLOBAL_GAIN_MASK 0xff
+#define BLNDV_CONTROL__BLND_GLOBAL_GAIN__SHIFT 0x0
+#define BLNDV_CONTROL__BLND_MODE_MASK 0x300
+#define BLNDV_CONTROL__BLND_MODE__SHIFT 0x8
+#define BLNDV_CONTROL__BLND_STEREO_TYPE_MASK 0xc00
+#define BLNDV_CONTROL__BLND_STEREO_TYPE__SHIFT 0xa
+#define BLNDV_CONTROL__BLND_STEREO_POLARITY_MASK 0x1000
+#define BLNDV_CONTROL__BLND_STEREO_POLARITY__SHIFT 0xc
+#define BLNDV_CONTROL__BLND_FEEDTHROUGH_EN_MASK 0x2000
+#define BLNDV_CONTROL__BLND_FEEDTHROUGH_EN__SHIFT 0xd
+#define BLNDV_CONTROL__BLND_ALPHA_MODE_MASK 0x30000
+#define BLNDV_CONTROL__BLND_ALPHA_MODE__SHIFT 0x10
+#define BLNDV_CONTROL__BLND_ACTIVE_OVERLAP_ONLY_MASK 0x40000
+#define BLNDV_CONTROL__BLND_ACTIVE_OVERLAP_ONLY__SHIFT 0x12
+#define BLNDV_CONTROL__BLND_MULTIPLIED_MODE_MASK 0x100000
+#define BLNDV_CONTROL__BLND_MULTIPLIED_MODE__SHIFT 0x14
+#define BLNDV_CONTROL__BLND_GLOBAL_ALPHA_MASK 0xff000000
+#define BLNDV_CONTROL__BLND_GLOBAL_ALPHA__SHIFT 0x18
+#define BLNDV_SM_CONTROL2__SM_MODE_MASK 0x7
+#define BLNDV_SM_CONTROL2__SM_MODE__SHIFT 0x0
+#define BLNDV_SM_CONTROL2__SM_FRAME_ALTERNATE_MASK 0x10
+#define BLNDV_SM_CONTROL2__SM_FRAME_ALTERNATE__SHIFT 0x4
+#define BLNDV_SM_CONTROL2__SM_FIELD_ALTERNATE_MASK 0x20
+#define BLNDV_SM_CONTROL2__SM_FIELD_ALTERNATE__SHIFT 0x5
+#define BLNDV_SM_CONTROL2__SM_FORCE_NEXT_FRAME_POL_MASK 0x300
+#define BLNDV_SM_CONTROL2__SM_FORCE_NEXT_FRAME_POL__SHIFT 0x8
+#define BLNDV_SM_CONTROL2__SM_FORCE_NEXT_TOP_POL_MASK 0x30000
+#define BLNDV_SM_CONTROL2__SM_FORCE_NEXT_TOP_POL__SHIFT 0x10
+#define BLNDV_SM_CONTROL2__SM_CURRENT_FRAME_POL_MASK 0x1000000
+#define BLNDV_SM_CONTROL2__SM_CURRENT_FRAME_POL__SHIFT 0x18
+#define BLNDV_CONTROL2__PTI_ENABLE_MASK 0x1
+#define BLNDV_CONTROL2__PTI_ENABLE__SHIFT 0x0
+#define BLNDV_CONTROL2__PTI_NEW_PIXEL_GAP_MASK 0x30
+#define BLNDV_CONTROL2__PTI_NEW_PIXEL_GAP__SHIFT 0x4
+#define BLNDV_CONTROL2__BLND_NEW_PIXEL_MODE_MASK 0x40
+#define BLNDV_CONTROL2__BLND_NEW_PIXEL_MODE__SHIFT 0x6
+#define BLNDV_CONTROL2__BLND_SUPERAA_DEGAMMA_EN_MASK 0x80
+#define BLNDV_CONTROL2__BLND_SUPERAA_DEGAMMA_EN__SHIFT 0x7
+#define BLNDV_CONTROL2__BLND_SUPERAA_REGAMMA_EN_MASK 0x100
+#define BLNDV_CONTROL2__BLND_SUPERAA_REGAMMA_EN__SHIFT 0x8
+#define BLNDV_UPDATE__BLND_UPDATE_PENDING_MASK 0x1
+#define BLNDV_UPDATE__BLND_UPDATE_PENDING__SHIFT 0x0
+#define BLNDV_UPDATE__BLND_UPDATE_TAKEN_MASK 0x100
+#define BLNDV_UPDATE__BLND_UPDATE_TAKEN__SHIFT 0x8
+#define BLNDV_UPDATE__BLND_UPDATE_LOCK_MASK 0x10000
+#define BLNDV_UPDATE__BLND_UPDATE_LOCK__SHIFT 0x10
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_OCCURED_MASK 0x1
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_OCCURED__SHIFT 0x0
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_ACK_MASK 0x100
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_ACK__SHIFT 0x8
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_MASK_MASK 0x1000
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_MASK__SHIFT 0xc
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_PIPE_INDEX_MASK 0x30000
+#define BLNDV_UNDERFLOW_INTERRUPT__BLND_UNDERFLOW_INT_PIPE_INDEX__SHIFT 0x10
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_GRPH_V_UPDATE_LOCK_MASK 0x1
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_GRPH_V_UPDATE_LOCK__SHIFT 0x0
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_GRPH_SURF_V_UPDATE_LOCK_MASK 0x2
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_GRPH_SURF_V_UPDATE_LOCK__SHIFT 0x1
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_CUR_V_UPDATE_LOCK_MASK 0x10000
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_CUR_V_UPDATE_LOCK__SHIFT 0x10
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_CUR2_V_UPDATE_LOCK_MASK 0x1000000
+#define BLNDV_V_UPDATE_LOCK__BLND_DCP_CUR2_V_UPDATE_LOCK__SHIFT 0x18
+#define BLNDV_V_UPDATE_LOCK__BLND_SCL_V_UPDATE_LOCK_MASK 0x10000000
+#define BLNDV_V_UPDATE_LOCK__BLND_SCL_V_UPDATE_LOCK__SHIFT 0x1c
+#define BLNDV_V_UPDATE_LOCK__BLND_BLND_V_UPDATE_LOCK_MASK 0x20000000
+#define BLNDV_V_UPDATE_LOCK__BLND_BLND_V_UPDATE_LOCK__SHIFT 0x1d
+#define BLNDV_V_UPDATE_LOCK__BLND_V_UPDATE_LOCK_MODE_MASK 0x80000000
+#define BLNDV_V_UPDATE_LOCK__BLND_V_UPDATE_LOCK_MODE__SHIFT 0x1f
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_UPDATE_PENDING_MASK 0x1
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_UPDATE_PENDING__SHIFT 0x0
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_UPDATE_PENDING_MASK 0x2
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_UPDATE_PENDING__SHIFT 0x1
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_SURF_UPDATE_PENDING_MASK 0x4
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_GRPH_SURF_UPDATE_PENDING__SHIFT 0x2
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_SURF_UPDATE_PENDING_MASK 0x8
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_GRPH_SURF_UPDATE_PENDING__SHIFT 0x3
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_CUR_UPDATE_PENDING_MASK 0x40
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDC_CUR_UPDATE_PENDING__SHIFT 0x6
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_CUR_UPDATE_PENDING_MASK 0x80
+#define BLNDV_REG_UPDATE_STATUS__DCP_BLNDO_CUR_UPDATE_PENDING__SHIFT 0x7
+#define BLNDV_REG_UPDATE_STATUS__SCL_BLNDC_UPDATE_PENDING_MASK 0x100
+#define BLNDV_REG_UPDATE_STATUS__SCL_BLNDC_UPDATE_PENDING__SHIFT 0x8
+#define BLNDV_REG_UPDATE_STATUS__SCL_BLNDO_UPDATE_PENDING_MASK 0x200
+#define BLNDV_REG_UPDATE_STATUS__SCL_BLNDO_UPDATE_PENDING__SHIFT 0x9
+#define BLNDV_REG_UPDATE_STATUS__BLND_BLNDC_UPDATE_PENDING_MASK 0x400
+#define BLNDV_REG_UPDATE_STATUS__BLND_BLNDC_UPDATE_PENDING__SHIFT 0xa
+#define BLNDV_REG_UPDATE_STATUS__BLND_BLNDO_UPDATE_PENDING_MASK 0x800
+#define BLNDV_REG_UPDATE_STATUS__BLND_BLNDO_UPDATE_PENDING__SHIFT 0xb
+#define BLNDV_DEBUG__BLND_CNV_MUX_SELECT_MASK 0x1
+#define BLNDV_DEBUG__BLND_CNV_MUX_SELECT__SHIFT 0x0
+#define BLNDV_DEBUG__BLND_DEBUG_MASK 0xfffffffe
+#define BLNDV_DEBUG__BLND_DEBUG__SHIFT 0x1
+#define BLNDV_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_INDEX_MASK 0xff
+#define BLNDV_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_INDEX__SHIFT 0x0
+#define BLNDV_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define BLNDV_TEST_DEBUG_INDEX__BLND_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define BLNDV_TEST_DEBUG_DATA__BLND_TEST_DEBUG_DATA_MASK 0xffffffff
+#define BLNDV_TEST_DEBUG_DATA__BLND_TEST_DEBUG_DATA__SHIFT 0x0
+#define CRTCV_H_TOTAL__CRTC_H_TOTAL_MASK 0x3fff
+#define CRTCV_H_TOTAL__CRTC_H_TOTAL__SHIFT 0x0
+#define CRTCV_H_BLANK_START_END__CRTC_H_BLANK_START_MASK 0x3fff
+#define CRTCV_H_BLANK_START_END__CRTC_H_BLANK_START__SHIFT 0x0
+#define CRTCV_H_BLANK_START_END__CRTC_H_BLANK_END_MASK 0x3fff0000
+#define CRTCV_H_BLANK_START_END__CRTC_H_BLANK_END__SHIFT 0x10
+#define CRTCV_H_SYNC_A__CRTC_H_SYNC_A_START_MASK 0x3fff
+#define CRTCV_H_SYNC_A__CRTC_H_SYNC_A_START__SHIFT 0x0
+#define CRTCV_H_SYNC_A__CRTC_H_SYNC_A_END_MASK 0x3fff0000
+#define CRTCV_H_SYNC_A__CRTC_H_SYNC_A_END__SHIFT 0x10
+#define CRTCV_V_TOTAL__CRTC_V_TOTAL_MASK 0x3fff
+#define CRTCV_V_TOTAL__CRTC_V_TOTAL__SHIFT 0x0
+#define CRTCV_V_BLANK_START_END__CRTC_V_BLANK_START_MASK 0x3fff
+#define CRTCV_V_BLANK_START_END__CRTC_V_BLANK_START__SHIFT 0x0
+#define CRTCV_V_BLANK_START_END__CRTC_V_BLANK_END_MASK 0x3fff0000
+#define CRTCV_V_BLANK_START_END__CRTC_V_BLANK_END__SHIFT 0x10
+#define CRTCV_V_SYNC_A__CRTC_V_SYNC_A_START_MASK 0x3fff
+#define CRTCV_V_SYNC_A__CRTC_V_SYNC_A_START__SHIFT 0x0
+#define CRTCV_V_SYNC_A__CRTC_V_SYNC_A_END_MASK 0x3fff0000
+#define CRTCV_V_SYNC_A__CRTC_V_SYNC_A_END__SHIFT 0x10
+#define CRTCV_CONTROL__CRTC_MASTER_EN_MASK 0x1
+#define CRTCV_CONTROL__CRTC_MASTER_EN__SHIFT 0x0
+#define CRTCV_CONTROL__CRTC_SYNC_RESET_SEL_MASK 0x10
+#define CRTCV_CONTROL__CRTC_SYNC_RESET_SEL__SHIFT 0x4
+#define CRTCV_CONTROL__CRTC_DISABLE_POINT_CNTL_MASK 0x300
+#define CRTCV_CONTROL__CRTC_DISABLE_POINT_CNTL__SHIFT 0x8
+#define CRTCV_CONTROL__CRTC_START_POINT_CNTL_MASK 0x1000
+#define CRTCV_CONTROL__CRTC_START_POINT_CNTL__SHIFT 0xc
+#define CRTCV_CONTROL__CRTC_FIELD_NUMBER_CNTL_MASK 0x2000
+#define CRTCV_CONTROL__CRTC_FIELD_NUMBER_CNTL__SHIFT 0xd
+#define CRTCV_CONTROL__CRTC_FIELD_NUMBER_POLARITY_MASK 0x4000
+#define CRTCV_CONTROL__CRTC_FIELD_NUMBER_POLARITY__SHIFT 0xe
+#define CRTCV_CONTROL__CRTC_CURRENT_MASTER_EN_STATE_MASK 0x10000
+#define CRTCV_CONTROL__CRTC_CURRENT_MASTER_EN_STATE__SHIFT 0x10
+#define CRTCV_CONTROL__CRTC_HBLANK_EARLY_CONTROL_MASK 0x700000
+#define CRTCV_CONTROL__CRTC_HBLANK_EARLY_CONTROL__SHIFT 0x14
+#define CRTCV_CONTROL__CRTC_DISP_READ_REQUEST_DISABLE_MASK 0x1000000
+#define CRTCV_CONTROL__CRTC_DISP_READ_REQUEST_DISABLE__SHIFT 0x18
+#define CRTCV_CONTROL__CRTC_SOF_PULL_EN_MASK 0x20000000
+#define CRTCV_CONTROL__CRTC_SOF_PULL_EN__SHIFT 0x1d
+#define CRTCV_CONTROL__CRTC_AVSYNC_LOCK_SNAPSHOT_MASK 0x40000000
+#define CRTCV_CONTROL__CRTC_AVSYNC_LOCK_SNAPSHOT__SHIFT 0x1e
+#define CRTCV_CONTROL__CRTC_AVSYNC_VSYNC_N_HSYNC_MODE_MASK 0x80000000
+#define CRTCV_CONTROL__CRTC_AVSYNC_VSYNC_N_HSYNC_MODE__SHIFT 0x1f
+#define CRTCV_START_LINE_CONTROL__CRTC_PROGRESSIVE_START_LINE_EARLY_MASK 0x1
+#define CRTCV_START_LINE_CONTROL__CRTC_PROGRESSIVE_START_LINE_EARLY__SHIFT 0x0
+#define CRTCV_START_LINE_CONTROL__CRTC_INTERLACE_START_LINE_EARLY_MASK 0x2
+#define CRTCV_START_LINE_CONTROL__CRTC_INTERLACE_START_LINE_EARLY__SHIFT 0x1
+#define CRTCV_START_LINE_CONTROL__CRTC_PREFETCH_EN_MASK 0x4
+#define CRTCV_START_LINE_CONTROL__CRTC_PREFETCH_EN__SHIFT 0x2
+#define CRTCV_START_LINE_CONTROL__CRTC_LEGACY_REQUESTOR_EN_MASK 0x100
+#define CRTCV_START_LINE_CONTROL__CRTC_LEGACY_REQUESTOR_EN__SHIFT 0x8
+#define CRTCV_START_LINE_CONTROL__CRTC_ADVANCED_START_LINE_POSITION_MASK 0xff000
+#define CRTCV_START_LINE_CONTROL__CRTC_ADVANCED_START_LINE_POSITION__SHIFT 0xc
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_BLUE_MASK 0x3ff
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_BLUE__SHIFT 0x0
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_GREEN_MASK 0xffc00
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_GREEN__SHIFT 0xa
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_RED_MASK 0x3ff00000
+#define CRTCV_OVERSCAN_COLOR__CRTC_OVERSCAN_COLOR_RED__SHIFT 0x14
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_BLUE_EXT_MASK 0x3
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_BLUE_EXT__SHIFT 0x0
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_GREEN_EXT_MASK 0x300
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_GREEN_EXT__SHIFT 0x8
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_RED_EXT_MASK 0x30000
+#define CRTCV_OVERSCAN_COLOR_EXT__CRTC_OVERSCAN_COLOR_RED_EXT__SHIFT 0x10
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_B_CB_MASK 0x3ff
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_B_CB__SHIFT 0x0
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_G_Y_MASK 0xffc00
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_G_Y__SHIFT 0xa
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_R_CR_MASK 0x3ff00000
+#define CRTCV_BLACK_COLOR__CRTC_BLACK_COLOR_R_CR__SHIFT 0x14
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_B_CB_EXT_MASK 0x3
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_B_CB_EXT__SHIFT 0x0
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_G_Y_EXT_MASK 0x300
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_G_Y_EXT__SHIFT 0x8
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_R_CR_EXT_MASK 0x30000
+#define CRTCV_BLACK_COLOR_EXT__CRTC_BLACK_COLOR_R_CR_EXT__SHIFT 0x10
+#define CRTCV_CRC_CNTL__CRTC_CRC_EN_MASK 0x1
+#define CRTCV_CRC_CNTL__CRTC_CRC_EN__SHIFT 0x0
+#define CRTCV_CRC_CNTL__CRTC_CRC_CONT_EN_MASK 0x10
+#define CRTCV_CRC_CNTL__CRTC_CRC_CONT_EN__SHIFT 0x4
+#define CRTCV_CRC_CNTL__CRTC_CRC_STEREO_MODE_MASK 0x300
+#define CRTCV_CRC_CNTL__CRTC_CRC_STEREO_MODE__SHIFT 0x8
+#define CRTCV_CRC_CNTL__CRTC_CRC_INTERLACE_MODE_MASK 0x3000
+#define CRTCV_CRC_CNTL__CRTC_CRC_INTERLACE_MODE__SHIFT 0xc
+#define CRTCV_CRC_CNTL__CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS_MASK 0x10000
+#define CRTCV_CRC_CNTL__CRTC_CRC_USE_NEW_AND_REPEATED_PIXELS__SHIFT 0x10
+#define CRTCV_CRC_CNTL__CRTC_CRC0_SELECT_MASK 0x700000
+#define CRTCV_CRC_CNTL__CRTC_CRC0_SELECT__SHIFT 0x14
+#define CRTCV_CRC_CNTL__CRTC_CRC1_SELECT_MASK 0x7000000
+#define CRTCV_CRC_CNTL__CRTC_CRC1_SELECT__SHIFT 0x18
+#define CRTCV_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_START_MASK 0x3fff
+#define CRTCV_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_START__SHIFT 0x0
+#define CRTCV_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_END_MASK 0x3fff0000
+#define CRTCV_CRC0_WINDOWA_X_CONTROL__CRTC_CRC0_WINDOWA_X_END__SHIFT 0x10
+#define CRTCV_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_START_MASK 0x3fff
+#define CRTCV_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_START__SHIFT 0x0
+#define CRTCV_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_END_MASK 0x3fff0000
+#define CRTCV_CRC0_WINDOWA_Y_CONTROL__CRTC_CRC0_WINDOWA_Y_END__SHIFT 0x10
+#define CRTCV_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_START_MASK 0x3fff
+#define CRTCV_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_START__SHIFT 0x0
+#define CRTCV_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_END_MASK 0x3fff0000
+#define CRTCV_CRC0_WINDOWB_X_CONTROL__CRTC_CRC0_WINDOWB_X_END__SHIFT 0x10
+#define CRTCV_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_START_MASK 0x3fff
+#define CRTCV_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_START__SHIFT 0x0
+#define CRTCV_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_END_MASK 0x3fff0000
+#define CRTCV_CRC0_WINDOWB_Y_CONTROL__CRTC_CRC0_WINDOWB_Y_END__SHIFT 0x10
+#define CRTCV_CRC0_DATA_RG__CRC0_R_CR_MASK 0xffff
+#define CRTCV_CRC0_DATA_RG__CRC0_R_CR__SHIFT 0x0
+#define CRTCV_CRC0_DATA_RG__CRC0_G_Y_MASK 0xffff0000
+#define CRTCV_CRC0_DATA_RG__CRC0_G_Y__SHIFT 0x10
+#define CRTCV_CRC0_DATA_B__CRC0_B_CB_MASK 0xffff
+#define CRTCV_CRC0_DATA_B__CRC0_B_CB__SHIFT 0x0
+#define CRTCV_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_START_MASK 0x3fff
+#define CRTCV_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_START__SHIFT 0x0
+#define CRTCV_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_END_MASK 0x3fff0000
+#define CRTCV_CRC1_WINDOWA_X_CONTROL__CRTC_CRC1_WINDOWA_X_END__SHIFT 0x10
+#define CRTCV_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_START_MASK 0x3fff
+#define CRTCV_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_START__SHIFT 0x0
+#define CRTCV_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_END_MASK 0x3fff0000
+#define CRTCV_CRC1_WINDOWA_Y_CONTROL__CRTC_CRC1_WINDOWA_Y_END__SHIFT 0x10
+#define CRTCV_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_START_MASK 0x3fff
+#define CRTCV_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_START__SHIFT 0x0
+#define CRTCV_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_END_MASK 0x3fff0000
+#define CRTCV_CRC1_WINDOWB_X_CONTROL__CRTC_CRC1_WINDOWB_X_END__SHIFT 0x10
+#define CRTCV_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_START_MASK 0x3fff
+#define CRTCV_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_START__SHIFT 0x0
+#define CRTCV_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_END_MASK 0x3fff0000
+#define CRTCV_CRC1_WINDOWB_Y_CONTROL__CRTC_CRC1_WINDOWB_Y_END__SHIFT 0x10
+#define CRTCV_CRC1_DATA_RG__CRC1_R_CR_MASK 0xffff
+#define CRTCV_CRC1_DATA_RG__CRC1_R_CR__SHIFT 0x0
+#define CRTCV_CRC1_DATA_RG__CRC1_G_Y_MASK 0xffff0000
+#define CRTCV_CRC1_DATA_RG__CRC1_G_Y__SHIFT 0x10
+#define CRTCV_CRC1_DATA_B__CRC1_B_CB_MASK 0xffff
+#define CRTCV_CRC1_DATA_B__CRC1_B_CB__SHIFT 0x0
+#define CRTCV_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_INDEX_MASK 0xff
+#define CRTCV_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_INDEX__SHIFT 0x0
+#define CRTCV_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define CRTCV_TEST_DEBUG_INDEX__CRTC_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define CRTCV_TEST_DEBUG_DATA__CRTC_TEST_DEBUG_DATA_MASK 0xffffffff
+#define CRTCV_TEST_DEBUG_DATA__CRTC_TEST_DEBUG_DATA__SHIFT 0x0
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_SWAP_MASK 0x300
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_SWAP__SHIFT 0x8
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_VMID_MASK 0xf000
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_VMID__SHIFT 0xc
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_PRIV_MASK 0x10000
+#define XDMA_MC_PCIE_CLIENT_CONFIG__XDMA_MC_PCIE_PRIV__SHIFT 0x10
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_ARRAY_MODE_MASK 0xf
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_ARRAY_MODE__SHIFT 0x0
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_TILE_SPLIT_MASK 0x70
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_TILE_SPLIT__SHIFT 0x4
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_BANK_WIDTH_MASK 0x300
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_BANK_WIDTH__SHIFT 0x8
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_BANK_HEIGHT_MASK 0xc00
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_BANK_HEIGHT__SHIFT 0xa
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_MACRO_TILE_ASPECT_MASK 0x3000
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_MACRO_TILE_ASPECT__SHIFT 0xc
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_NUM_BANKS_MASK 0x300000
+#define XDMA_LOCAL_SURFACE_TILING1__XDMA_LOCAL_NUM_BANKS__SHIFT 0x14
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_PIPE_INTERLEAVE_SIZE_MASK 0x7
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_PIPE_INTERLEAVE_SIZE__SHIFT 0x0
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_MICRO_TILE_MODE_MASK 0x700000
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_MICRO_TILE_MODE__SHIFT 0x14
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_PIPE_CONFIG_MASK 0xf8000000
+#define XDMA_LOCAL_SURFACE_TILING2__XDMA_LOCAL_PIPE_CONFIG__SHIFT 0x1b
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_STAT_MASK 0x100
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_STAT__SHIFT 0x8
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_MASK_MASK 0x200
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_MASK__SHIFT 0x9
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_ACK_MASK 0x400
+#define XDMA_INTERRUPT__XDMA_MSTR_MEM_URGENT_ACK__SHIFT 0xa
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_STAT_MASK 0x10000
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_STAT__SHIFT 0x10
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_MASK_MASK 0x20000
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_MASK__SHIFT 0x11
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_ACK_MASK 0x40000
+#define XDMA_INTERRUPT__XDMA_SLV_READ_URGENT_ACK__SHIFT 0x12
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_STAT_MASK 0x100000
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_STAT__SHIFT 0x14
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_MASK_MASK 0x200000
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_MASK__SHIFT 0x15
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_ACK_MASK 0x400000
+#define XDMA_INTERRUPT__XDMA_PERF_MEAS_ACK__SHIFT 0x16
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_TURN_ON_DELAY_MASK 0xf
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_TURN_ON_DELAY__SHIFT 0x0
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_TURN_OFF_DELAY_MASK 0xff0
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_TURN_OFF_DELAY__SHIFT 0x4
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_GATE_DIS_MASK 0x8000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_GATE_DIS__SHIFT 0xf
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_REG_GATE_DIS_MASK 0x10000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_REG_GATE_DIS__SHIFT 0x10
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_0_MASK 0x20000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_0__SHIFT 0x11
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_1_MASK 0x40000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_1__SHIFT 0x12
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_2_MASK 0x80000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_2__SHIFT 0x13
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_3_MASK 0x100000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_3__SHIFT 0x14
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_4_MASK 0x200000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_4__SHIFT 0x15
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_5_MASK 0x400000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MDYN_GATE_DIS_PIPE_5__SHIFT 0x16
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_SDYN_GATE_DIS_MASK 0x800000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_SDYN_GATE_DIS__SHIFT 0x17
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MSTAT_GATE_DIS_MASK 0x1000000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_MSTAT_GATE_DIS__SHIFT 0x18
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_SSTAT_GATE_DIS_MASK 0x2000000
+#define XDMA_CLOCK_GATING_CNTL__XDMA_SCLK_G_SSTAT_GATE_DIS__SHIFT 0x19
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_CORE_IDLE_STATE_MASK 0x3
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_CORE_IDLE_STATE__SHIFT 0x0
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_IDLE_STATE_MASK 0xc
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_IDLE_STATE__SHIFT 0x2
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_PCIE_STATE_MASK 0x180000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_PCIE_STATE__SHIFT 0x13
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_PCIE_TRANS_MASK 0x200000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_PCIE_TRANS__SHIFT 0x15
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_RD_STATE_MASK 0xc00000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_RD_STATE__SHIFT 0x16
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_RD_TRANS_MASK 0x2000000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_RD_TRANS__SHIFT 0x19
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_WR_STATE_MASK 0xc000000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_WR_STATE__SHIFT 0x1a
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_WR_TRANS_MASK 0x10000000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_WR_TRANS__SHIFT 0x1c
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_BIF_STATE_MASK 0x60000000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_BIF_STATE__SHIFT 0x1d
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_BIF_TRANS_MASK 0x80000000
+#define XDMA_MEM_POWER_CNTL__XDMA_MEM_IF_BIF_TRANS__SHIFT 0x1f
+#define XDMA_IF_BIF_STATUS__XDMA_IF_BIF_ERROR_STATUS_MASK 0xf
+#define XDMA_IF_BIF_STATUS__XDMA_IF_BIF_ERROR_STATUS__SHIFT 0x0
+#define XDMA_IF_BIF_STATUS__XDMA_IF_BIF_ERROR_CLEAR_MASK 0x100
+#define XDMA_IF_BIF_STATUS__XDMA_IF_BIF_ERROR_CLEAR__SHIFT 0x8
+#define XDMA_PERF_MEAS_STATUS__XDMA_PERF_MEAS_STATUS_MASK 0xff
+#define XDMA_PERF_MEAS_STATUS__XDMA_PERF_MEAS_STATUS__SHIFT 0x0
+#define XDMA_IF_STATUS__XDMA_MC_PCIEWR_BUSY_MASK 0x1
+#define XDMA_IF_STATUS__XDMA_MC_PCIEWR_BUSY__SHIFT 0x0
+#define XDMA_TEST_DEBUG_INDEX__XDMA_TEST_DEBUG_INDEX_MASK 0xff
+#define XDMA_TEST_DEBUG_INDEX__XDMA_TEST_DEBUG_INDEX__SHIFT 0x0
+#define XDMA_TEST_DEBUG_INDEX__XDMA_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define XDMA_TEST_DEBUG_INDEX__XDMA_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define XDMA_TEST_DEBUG_DATA__XDMA_TEST_DEBUG_DATA_MASK 0xffffffff
+#define XDMA_TEST_DEBUG_DATA__XDMA_TEST_DEBUG_DATA__SHIFT 0x0
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_RDWR_DELAY_MASK 0x7
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_RDWR_DELAY__SHIFT 0x0
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_RDWR_TIMEOUT_DIS_MASK 0x8
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_RDWR_TIMEOUT_DIS__SHIFT 0x3
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_TIMEOUT_DELAY_MASK 0xffff8000
+#define XDMA_RBBMIF_RDWR_CNTL__XDMA_RBBMIF_TIMEOUT_DELAY__SHIFT 0xf
+#define XDMA_PG_CONTROL__XDMA_PG_CONTROL_MASK 0xffffffff
+#define XDMA_PG_CONTROL__XDMA_PG_CONTROL__SHIFT 0x0
+#define XDMA_PG_WDATA__XDMA_PG_WDATA_MASK 0xffffffff
+#define XDMA_PG_WDATA__XDMA_PG_WDATA__SHIFT 0x0
+#define XDMA_PG_STATUS__XDMA_SERDES_RDATA_MASK 0xffffff
+#define XDMA_PG_STATUS__XDMA_SERDES_RDATA__SHIFT 0x0
+#define XDMA_PG_STATUS__XDMA_PGFSM_READ_READY_MASK 0x1000000
+#define XDMA_PG_STATUS__XDMA_PGFSM_READ_READY__SHIFT 0x18
+#define XDMA_PG_STATUS__XDMA_SERDES_BUSY_MASK 0x2000000
+#define XDMA_PG_STATUS__XDMA_SERDES_BUSY__SHIFT 0x19
+#define XDMA_PG_STATUS__XDMA_SERDES_SMU_POWER_STATUS_MASK 0x4000000
+#define XDMA_PG_STATUS__XDMA_SERDES_SMU_POWER_STATUS__SHIFT 0x1a
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_AON_TEST_DEBUG_INDEX_MASK 0xff
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_AON_TEST_DEBUG_INDEX__SHIFT 0x0
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_AON_TEST_DEBUG_WRITE_EN_MASK 0x100
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_AON_TEST_DEBUG_WRITE_EN__SHIFT 0x8
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_DEBUG_SEL_MASK 0x200
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_DEBUG_SEL__SHIFT 0x9
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_DEBUG_OUT_EN_MASK 0x400
+#define XDMA_AON_TEST_DEBUG_INDEX__XDMA_DEBUG_OUT_EN__SHIFT 0xa
+#define XDMA_AON_TEST_DEBUG_DATA__XDMA_AON_TEST_DEBUG_DATA_MASK 0xffffffff
+#define XDMA_AON_TEST_DEBUG_DATA__XDMA_AON_TEST_DEBUG_DATA__SHIFT 0x0
+#define XDMA_MSTR_CNTL__XDMA_MSTR_ALPHA_POSITION_MASK 0x3000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_ALPHA_POSITION__SHIFT 0xc
+#define XDMA_MSTR_CNTL__XDMA_MSTR_MEM_READY_MASK 0x4000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_MEM_READY__SHIFT 0xe
+#define XDMA_MSTR_CNTL__XDMA_MSTR_ENABLE_MASK 0x10000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_ENABLE__SHIFT 0x10
+#define XDMA_MSTR_CNTL__XDMA_MSTR_DEBUG_MODE_MASK 0x40000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_DEBUG_MODE__SHIFT 0x12
+#define XDMA_MSTR_CNTL__XDMA_MSTR_SOFT_RESET_MASK 0x100000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_SOFT_RESET__SHIFT 0x14
+#define XDMA_MSTR_CNTL__XDMA_MSTR_BIF_STALL_EN_MASK 0x200000
+#define XDMA_MSTR_CNTL__XDMA_MSTR_BIF_STALL_EN__SHIFT 0x15
+#define XDMA_MSTR_STATUS__XDMA_MSTR_VCOUNT_CURRENT_MASK 0x3fff
+#define XDMA_MSTR_STATUS__XDMA_MSTR_VCOUNT_CURRENT__SHIFT 0x0
+#define XDMA_MSTR_STATUS__XDMA_MSTR_WRITE_LINE_CURRENT_MASK 0xfff0000
+#define XDMA_MSTR_STATUS__XDMA_MSTR_WRITE_LINE_CURRENT__SHIFT 0x10
+#define XDMA_MSTR_STATUS__XDMA_MSTR_STATUS_SELECT_MASK 0x70000000
+#define XDMA_MSTR_STATUS__XDMA_MSTR_STATUS_SELECT__SHIFT 0x1c
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_SWAP_MASK 0x300
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_SWAP__SHIFT 0x8
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_VMID_MASK 0xf000
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_VMID__SHIFT 0xc
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_PRIV_MASK 0x10000
+#define XDMA_MSTR_MEM_CLIENT_CONFIG__XDMA_MSTR_MEM_CLIENT_PRIV__SHIFT 0x10
+#define XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR__XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_MASK 0xffffffff
+#define XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR__XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR__SHIFT 0x0
+#define XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH__XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH_MASK 0xff
+#define XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH__XDMA_MSTR_LOCAL_SURFACE_BASE_ADDR_HIGH__SHIFT 0x0
+#define XDMA_MSTR_LOCAL_SURFACE_PITCH__XDMA_MSTR_LOCAL_SURFACE_PITCH_MASK 0x3fff
+#define XDMA_MSTR_LOCAL_SURFACE_PITCH__XDMA_MSTR_LOCAL_SURFACE_PITCH__SHIFT 0x0
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_CLIENT_STALL_MASK 0x1
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_CLIENT_STALL__SHIFT 0x0
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_URGENT_LEVEL_MASK 0xf00
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_URGENT_LEVEL__SHIFT 0x8
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_STALL_DELAY_MASK 0xf000
+#define XDMA_MSTR_CMD_URGENT_CNTL__XDMA_MSTR_CMD_STALL_DELAY__SHIFT 0xc
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_CLIENT_STALL_MASK 0x1
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_CLIENT_STALL__SHIFT 0x0
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_LIMIT_MASK 0xf0
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_LIMIT__SHIFT 0x4
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_LEVEL_MASK 0xf00
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_LEVEL__SHIFT 0x8
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_STALL_DELAY_MASK 0xf000
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_STALL_DELAY__SHIFT 0xc
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_TIMER_MASK 0xffff0000
+#define XDMA_MSTR_MEM_URGENT_CNTL__XDMA_MSTR_MEM_URGENT_TIMER__SHIFT 0x10
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK_TAG_MASK 0x3ff
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK_TAG__SHIFT 0x0
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK_MASK 0x3000
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK__SHIFT 0xc
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK_CLR_MASK 0x10000
+#define XDMA_MSTR_PCIE_NACK_STATUS__XDMA_MSTR_PCIE_NACK_CLR__SHIFT 0x10
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK_TAG_MASK 0x3ff
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK_TAG__SHIFT 0x0
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK_MASK 0x3000
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK__SHIFT 0xc
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK_CLR_MASK 0x10000
+#define XDMA_MSTR_MEM_NACK_STATUS__XDMA_MSTR_MEM_NACK_CLR__SHIFT 0x10
+#define XDMA_MSTR_VSYNC_GSL_CHECK__XDMA_MSTR_VSYNC_GSL_CHECK_SEL_MASK 0x7
+#define XDMA_MSTR_VSYNC_GSL_CHECK__XDMA_MSTR_VSYNC_GSL_CHECK_SEL__SHIFT 0x0
+#define XDMA_MSTR_VSYNC_GSL_CHECK__XDMA_MSTR_VSYNC_GSL_CHECK_V_COUNT_MASK 0x3fff00
+#define XDMA_MSTR_VSYNC_GSL_CHECK__XDMA_MSTR_VSYNC_GSL_CHECK_V_COUNT__SHIFT 0x8
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_CACHE_LINES_MASK 0xff
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_CACHE_LINES__SHIFT 0x0
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_READ_REQUEST_MASK 0x100
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_READ_REQUEST__SHIFT 0x8
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FRAME_MODE_MASK 0x200
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FRAME_MODE__SHIFT 0x9
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_SOFT_RESET_MASK 0x400
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_SOFT_RESET__SHIFT 0xa
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_CACHE_INVALIDATE_MASK 0x800
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_CACHE_INVALIDATE__SHIFT 0xb
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_REQUEST_CHANNEL_ID_MASK 0x7000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_REQUEST_CHANNEL_ID__SHIFT 0xc
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_FLIP_MODE_MASK 0x8000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_FLIP_MODE__SHIFT 0xf
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_REQUEST_MIN_MASK 0xff0000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_REQUEST_MIN__SHIFT 0x10
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_ACTIVE_MASK 0x1000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_ACTIVE__SHIFT 0x18
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FLUSHING_MASK 0x2000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FLUSHING__SHIFT 0x19
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FLIP_PENDING_MASK 0x4000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_PIPE_FLIP_PENDING__SHIFT 0x1a
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_VSYNC_GSL_ENABLE_MASK 0x8000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_VSYNC_GSL_ENABLE__SHIFT 0x1b
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_SUPERAA_ENABLE_MASK 0x10000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_SUPERAA_ENABLE__SHIFT 0x1c
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_HSYNC_GSL_GROUP_MASK 0x60000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_HSYNC_GSL_GROUP__SHIFT 0x1d
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_GSL_GROUP_MASTER_MASK 0x80000000
+#define XDMA_MSTR_PIPE_CNTL__XDMA_MSTR_GSL_GROUP_MASTER__SHIFT 0x1f
+#define XDMA_MSTR_READ_COMMAND__XDMA_MSTR_REQUEST_SIZE_MASK 0x3fff
+#define XDMA_MSTR_READ_COMMAND__XDMA_MSTR_REQUEST_SIZE__SHIFT 0x0
+#define XDMA_MSTR_READ_COMMAND__XDMA_MSTR_REQUEST_PREFETCH_MASK 0x3fff0000
+#define XDMA_MSTR_READ_COMMAND__XDMA_MSTR_REQUEST_PREFETCH__SHIFT 0x10
+#define XDMA_MSTR_CHANNEL_DIM__XDMA_MSTR_CHANNEL_WIDTH_MASK 0x3fff
+#define XDMA_MSTR_CHANNEL_DIM__XDMA_MSTR_CHANNEL_WIDTH__SHIFT 0x0
+#define XDMA_MSTR_CHANNEL_DIM__XDMA_MSTR_CHANNEL_HEIGHT_MASK 0x3fff0000
+#define XDMA_MSTR_CHANNEL_DIM__XDMA_MSTR_CHANNEL_HEIGHT__SHIFT 0x10
+#define XDMA_MSTR_HEIGHT__XDMA_MSTR_ACTIVE_HEIGHT_MASK 0x3fff
+#define XDMA_MSTR_HEIGHT__XDMA_MSTR_ACTIVE_HEIGHT__SHIFT 0x0
+#define XDMA_MSTR_HEIGHT__XDMA_MSTR_FRAME_HEIGHT_MASK 0x3fff0000
+#define XDMA_MSTR_HEIGHT__XDMA_MSTR_FRAME_HEIGHT__SHIFT 0x10
+#define XDMA_MSTR_REMOTE_SURFACE_BASE__XDMA_MSTR_REMOTE_SURFACE_BASE_MASK 0xffffffff
+#define XDMA_MSTR_REMOTE_SURFACE_BASE__XDMA_MSTR_REMOTE_SURFACE_BASE__SHIFT 0x0
+#define XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH_MASK 0xff
+#define XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__XDMA_MSTR_REMOTE_SURFACE_BASE_HIGH__SHIFT 0x0
+#define XDMA_MSTR_REMOTE_GPU_ADDRESS__XDMA_MSTR_REMOTE_GPU_ADDRESS_MASK 0xffffffff
+#define XDMA_MSTR_REMOTE_GPU_ADDRESS__XDMA_MSTR_REMOTE_GPU_ADDRESS__SHIFT 0x0
+#define XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH_MASK 0xff
+#define XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__XDMA_MSTR_REMOTE_GPU_ADDRESS_HIGH__SHIFT 0x0
+#define XDMA_MSTR_CACHE_BASE_ADDR__XDMA_MSTR_CACHE_BASE_ADDR_MASK 0xffffffff
+#define XDMA_MSTR_CACHE_BASE_ADDR__XDMA_MSTR_CACHE_BASE_ADDR__SHIFT 0x0
+#define XDMA_MSTR_CACHE_BASE_ADDR_HIGH__XDMA_MSTR_CACHE_BASE_ADDR_HIGH_MASK 0xff
+#define XDMA_MSTR_CACHE_BASE_ADDR_HIGH__XDMA_MSTR_CACHE_BASE_ADDR_HIGH__SHIFT 0x0
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_PITCH_MASK 0x3fff
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_PITCH__SHIFT 0x0
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_TLB_PG_STATE_MASK 0x60000000
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_TLB_PG_STATE__SHIFT 0x1d
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_TLB_PG_TRANS_MASK 0x80000000
+#define XDMA_MSTR_CACHE__XDMA_MSTR_CACHE_TLB_PG_TRANS__SHIFT 0x1f
+#define XDMA_MSTR_CHANNEL_START__XDMA_MSTR_CHANNEL_START_X_MASK 0x3fff
+#define XDMA_MSTR_CHANNEL_START__XDMA_MSTR_CHANNEL_START_X__SHIFT 0x0
+#define XDMA_MSTR_CHANNEL_START__XDMA_MSTR_CHANNEL_START_Y_MASK 0x3fff0000
+#define XDMA_MSTR_CHANNEL_START__XDMA_MSTR_CHANNEL_START_Y__SHIFT 0x10
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_DATA_MASK 0xffffff
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_DATA__SHIFT 0x0
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_INDEX_MASK 0x7000000
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_INDEX__SHIFT 0x18
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_INDEX_MODE_MASK 0xc0000000
+#define XDMA_MSTR_PERFMEAS_STATUS__XDMA_MSTR_PERFMEAS_INDEX_MODE__SHIFT 0x1e
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_MEAS_ITER_MASK 0xfff
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_MEAS_ITER__SHIFT 0x0
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_SEGID_SEL_MASK 0x1f000
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_SEGID_SEL__SHIFT 0xc
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_COUNTER_RST_MASK 0x20000
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_CACHE_BW_COUNTER_RST__SHIFT 0x11
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_LT_MEAS_ITER_MASK 0x7ff80000
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_LT_MEAS_ITER__SHIFT 0x13
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_LT_COUNTER_RST_MASK 0x80000000
+#define XDMA_MSTR_PERFMEAS_CNTL__XDMA_MSTR_LT_COUNTER_RST__SHIFT 0x1f
+#define XDMA_SLV_CNTL__XDMA_SLV_READ_LINES_MASK 0x1
+#define XDMA_SLV_CNTL__XDMA_SLV_READ_LINES__SHIFT 0x0
+#define XDMA_SLV_CNTL__XDMA_SLV_MEM_READY_MASK 0x200
+#define XDMA_SLV_CNTL__XDMA_SLV_MEM_READY__SHIFT 0x9
+#define XDMA_SLV_CNTL__XDMA_SLV_ACTIVE_MASK 0x400
+#define XDMA_SLV_CNTL__XDMA_SLV_ACTIVE__SHIFT 0xa
+#define XDMA_SLV_CNTL__XDMA_SLV_ALPHA_POSITION_MASK 0x3000
+#define XDMA_SLV_CNTL__XDMA_SLV_ALPHA_POSITION__SHIFT 0xc
+#define XDMA_SLV_CNTL__XDMA_SLV_ENABLE_MASK 0x10000
+#define XDMA_SLV_CNTL__XDMA_SLV_ENABLE__SHIFT 0x10
+#define XDMA_SLV_CNTL__XDMA_SLV_READ_LAT_TEST_EN_MASK 0x80000
+#define XDMA_SLV_CNTL__XDMA_SLV_READ_LAT_TEST_EN__SHIFT 0x13
+#define XDMA_SLV_CNTL__XDMA_SLV_SOFT_RESET_MASK 0x100000
+#define XDMA_SLV_CNTL__XDMA_SLV_SOFT_RESET__SHIFT 0x14
+#define XDMA_SLV_CNTL__XDMA_SLV_REQ_MAXED_OUT_MASK 0x1000000
+#define XDMA_SLV_CNTL__XDMA_SLV_REQ_MAXED_OUT__SHIFT 0x18
+#define XDMA_SLV_CNTL__XDMA_SLV_WB_BURST_RESET_MASK 0x2000000
+#define XDMA_SLV_CNTL__XDMA_SLV_WB_BURST_RESET__SHIFT 0x19
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_SWAP_MASK 0x300
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_SWAP__SHIFT 0x8
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_VMID_MASK 0xf000
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_VMID__SHIFT 0xc
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_PRIV_MASK 0x10000
+#define XDMA_SLV_MEM_CLIENT_CONFIG__XDMA_SLV_MEM_CLIENT_PRIV__SHIFT 0x10
+#define XDMA_SLV_SLS_PITCH__XDMA_SLV_SLS_PITCH_MASK 0x3fff
+#define XDMA_SLV_SLS_PITCH__XDMA_SLV_SLS_PITCH__SHIFT 0x0
+#define XDMA_SLV_SLS_PITCH__XDMA_SLV_SLS_WIDTH_MASK 0x3fff0000
+#define XDMA_SLV_SLS_PITCH__XDMA_SLV_SLS_WIDTH__SHIFT 0x10
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_CLIENT_STALL_MASK 0x1
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_CLIENT_STALL__SHIFT 0x0
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_LIMIT_MASK 0xf0
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_LIMIT__SHIFT 0x4
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_LEVEL_MASK 0xf00
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_LEVEL__SHIFT 0x8
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_STALL_DELAY_MASK 0xf000
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_STALL_DELAY__SHIFT 0xc
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_TIMER_MASK 0xffff0000
+#define XDMA_SLV_READ_URGENT_CNTL__XDMA_SLV_READ_URGENT_TIMER__SHIFT 0x10
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_STALL_MASK 0x1
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_STALL__SHIFT 0x0
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_URGENT_LEVEL_MASK 0xf00
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_URGENT_LEVEL__SHIFT 0x8
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_STALL_DELAY_MASK 0xf000
+#define XDMA_SLV_WRITE_URGENT_CNTL__XDMA_SLV_WRITE_STALL_DELAY__SHIFT 0xc
+#define XDMA_SLV_WB_RATE_CNTL__XDMA_SLV_WB_BURST_SIZE_MASK 0x1ff
+#define XDMA_SLV_WB_RATE_CNTL__XDMA_SLV_WB_BURST_SIZE__SHIFT 0x0
+#define XDMA_SLV_WB_RATE_CNTL__XDMA_SLV_WB_BURST_PERIOD_MASK 0xffff0000
+#define XDMA_SLV_WB_RATE_CNTL__XDMA_SLV_WB_BURST_PERIOD__SHIFT 0x10
+#define XDMA_SLV_READ_LATENCY_MINMAX__XDMA_SLV_READ_LATENCY_MIN_MASK 0xffff
+#define XDMA_SLV_READ_LATENCY_MINMAX__XDMA_SLV_READ_LATENCY_MIN__SHIFT 0x0
+#define XDMA_SLV_READ_LATENCY_MINMAX__XDMA_SLV_READ_LATENCY_MAX_MASK 0xffff0000
+#define XDMA_SLV_READ_LATENCY_MINMAX__XDMA_SLV_READ_LATENCY_MAX__SHIFT 0x10
+#define XDMA_SLV_READ_LATENCY_AVE__XDMA_SLV_READ_LATENCY_ACC_MASK 0xfffff
+#define XDMA_SLV_READ_LATENCY_AVE__XDMA_SLV_READ_LATENCY_ACC__SHIFT 0x0
+#define XDMA_SLV_READ_LATENCY_AVE__XDMA_SLV_READ_LATENCY_COUNT_MASK 0xfff00000
+#define XDMA_SLV_READ_LATENCY_AVE__XDMA_SLV_READ_LATENCY_COUNT__SHIFT 0x14
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK_TAG_MASK 0x3ff
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK_TAG__SHIFT 0x0
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK_MASK 0x3000
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK__SHIFT 0xc
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK_CLR_MASK 0x10000
+#define XDMA_SLV_PCIE_NACK_STATUS__XDMA_SLV_PCIE_NACK_CLR__SHIFT 0x10
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK_TAG_MASK 0xffff
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK_TAG__SHIFT 0x0
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK_MASK 0x30000
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK__SHIFT 0x10
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK_CLR_MASK 0x80000000
+#define XDMA_SLV_MEM_NACK_STATUS__XDMA_SLV_MEM_NACK_CLR__SHIFT 0x1f
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_FREE_ENTRIES_MASK 0x3ff
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_FREE_ENTRIES__SHIFT 0x0
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_BUF_SIZE_MASK 0x3ff000
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_BUF_SIZE__SHIFT 0xc
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_PG_STATE_MASK 0xc00000
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_PG_STATE__SHIFT 0x16
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_PG_TRANS_MASK 0x1000000
+#define XDMA_SLV_RDRET_BUF_STATUS__XDMA_SLV_RDRET_PG_TRANS__SHIFT 0x18
+#define XDMA_SLV_READ_LATENCY_TIMER__XDMA_SLV_READ_LATENCY_TIMER_MASK 0xffff
+#define XDMA_SLV_READ_LATENCY_TIMER__XDMA_SLV_READ_LATENCY_TIMER__SHIFT 0x0
+#define XDMA_SLV_FLIP_PENDING__XDMA_SLV_FLIP_PENDING_MASK 0x1
+#define XDMA_SLV_FLIP_PENDING__XDMA_SLV_FLIP_PENDING__SHIFT 0x0
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_WEIGHT_MASK 0x1ff
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_WEIGHT__SHIFT 0x0
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_STOP_TRANSFER_MASK 0x10000
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_STOP_TRANSFER__SHIFT 0x10
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_SOFT_RESET_MASK 0x20000
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_SOFT_RESET__SHIFT 0x11
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_ACTIVE_MASK 0x1000000
+#define XDMA_SLV_CHANNEL_CNTL__XDMA_SLV_CHANNEL_ACTIVE__SHIFT 0x18
+#define XDMA_SLV_REMOTE_GPU_ADDRESS__XDMA_SLV_REMOTE_GPU_ADDRESS_MASK 0xffffffff
+#define XDMA_SLV_REMOTE_GPU_ADDRESS__XDMA_SLV_REMOTE_GPU_ADDRESS__SHIFT 0x0
+#define XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH_MASK 0xff
+#define XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__XDMA_SLV_REMOTE_GPU_ADDRESS_HIGH__SHIFT 0x0
+#define CMD_BUS_TX_CONTROL_LANE0__tx_pwr_MASK 0x7
+#define CMD_BUS_TX_CONTROL_LANE0__tx_pwr__SHIFT 0x0
+#define CMD_BUS_TX_CONTROL_LANE0__tx_pg_en_MASK 0x18
+#define CMD_BUS_TX_CONTROL_LANE0__tx_pg_en__SHIFT 0x3
+#define CMD_BUS_TX_CONTROL_LANE0__tx_rdy_MASK 0x100
+#define CMD_BUS_TX_CONTROL_LANE0__tx_rdy__SHIFT 0x8
+#define CMD_BUS_TX_CONTROL_LANE1__tx_pwr_MASK 0x7
+#define CMD_BUS_TX_CONTROL_LANE1__tx_pwr__SHIFT 0x0
+#define CMD_BUS_TX_CONTROL_LANE1__tx_pg_en_MASK 0x18
+#define CMD_BUS_TX_CONTROL_LANE1__tx_pg_en__SHIFT 0x3
+#define CMD_BUS_TX_CONTROL_LANE1__tx_rdy_MASK 0x100
+#define CMD_BUS_TX_CONTROL_LANE1__tx_rdy__SHIFT 0x8
+#define CMD_BUS_TX_CONTROL_LANE2__tx_pwr_MASK 0x7
+#define CMD_BUS_TX_CONTROL_LANE2__tx_pwr__SHIFT 0x0
+#define CMD_BUS_TX_CONTROL_LANE2__tx_pg_en_MASK 0x18
+#define CMD_BUS_TX_CONTROL_LANE2__tx_pg_en__SHIFT 0x3
+#define CMD_BUS_TX_CONTROL_LANE2__tx_rdy_MASK 0x100
+#define CMD_BUS_TX_CONTROL_LANE2__tx_rdy__SHIFT 0x8
+#define CMD_BUS_TX_CONTROL_LANE3__tx_pwr_MASK 0x7
+#define CMD_BUS_TX_CONTROL_LANE3__tx_pwr__SHIFT 0x0
+#define CMD_BUS_TX_CONTROL_LANE3__tx_pg_en_MASK 0x18
+#define CMD_BUS_TX_CONTROL_LANE3__tx_pg_en__SHIFT 0x3
+#define CMD_BUS_TX_CONTROL_LANE3__tx_rdy_MASK 0x100
+#define CMD_BUS_TX_CONTROL_LANE3__tx_rdy__SHIFT 0x8
+#define MARGIN_DEEMPH_LANE0__txmarg_sel_MASK 0x7
+#define MARGIN_DEEMPH_LANE0__txmarg_sel__SHIFT 0x0
+#define MARGIN_DEEMPH_LANE0__deemph_sel_MASK 0x18
+#define MARGIN_DEEMPH_LANE0__deemph_sel__SHIFT 0x3
+#define MARGIN_DEEMPH_LANE0__tx_margin_en_MASK 0x20
+#define MARGIN_DEEMPH_LANE0__tx_margin_en__SHIFT 0x5
+#define MARGIN_DEEMPH_LANE1__txmarg_sel_MASK 0x7
+#define MARGIN_DEEMPH_LANE1__txmarg_sel__SHIFT 0x0
+#define MARGIN_DEEMPH_LANE1__deemph_sel_MASK 0x18
+#define MARGIN_DEEMPH_LANE1__deemph_sel__SHIFT 0x3
+#define MARGIN_DEEMPH_LANE1__tx_margin_en_MASK 0x20
+#define MARGIN_DEEMPH_LANE1__tx_margin_en__SHIFT 0x5
+#define MARGIN_DEEMPH_LANE2__txmarg_sel_MASK 0x7
+#define MARGIN_DEEMPH_LANE2__txmarg_sel__SHIFT 0x0
+#define MARGIN_DEEMPH_LANE2__deemph_sel_MASK 0x18
+#define MARGIN_DEEMPH_LANE2__deemph_sel__SHIFT 0x3
+#define MARGIN_DEEMPH_LANE2__tx_margin_en_MASK 0x20
+#define MARGIN_DEEMPH_LANE2__tx_margin_en__SHIFT 0x5
+#define MARGIN_DEEMPH_LANE3__txmarg_sel_MASK 0x7
+#define MARGIN_DEEMPH_LANE3__txmarg_sel__SHIFT 0x0
+#define MARGIN_DEEMPH_LANE3__deemph_sel_MASK 0x18
+#define MARGIN_DEEMPH_LANE3__deemph_sel__SHIFT 0x3
+#define MARGIN_DEEMPH_LANE3__tx_margin_en_MASK 0x20
+#define MARGIN_DEEMPH_LANE3__tx_margin_en__SHIFT 0x5
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__twosym_en_MASK 0x6
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__twosym_en__SHIFT 0x1
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__link_speed_MASK 0x18
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__link_speed__SHIFT 0x3
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__gang_mode_MASK 0xe0
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__gang_mode__SHIFT 0x5
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__max_linkrate_MASK 0x300
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__max_linkrate__SHIFT 0x8
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_freq_MASK 0xc00
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_freq__SHIFT 0xa
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_clken_MASK 0x1000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_clken__SHIFT 0xc
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_clkdone_MASK 0x2000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pcs_clkdone__SHIFT 0xd
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pll1_always_on_MASK 0x4000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__pll1_always_on__SHIFT 0xe
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__rdclk_div2_en_MASK 0x8000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__rdclk_div2_en__SHIFT 0xf
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_boost_adj_MASK 0xf0000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_boost_adj__SHIFT 0x10
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_boost_en_MASK 0x100000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_boost_en__SHIFT 0x14
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_binary_ron_code_offset_MASK 0xc00000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE0__tx_binary_ron_code_offset__SHIFT 0x16
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__twosym_en_MASK 0x6
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__twosym_en__SHIFT 0x1
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__link_speed_MASK 0x18
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__link_speed__SHIFT 0x3
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__gang_mode_MASK 0xe0
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__gang_mode__SHIFT 0x5
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__max_linkrate_MASK 0x300
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__max_linkrate__SHIFT 0x8
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_freq_MASK 0xc00
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_freq__SHIFT 0xa
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_clken_MASK 0x1000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_clken__SHIFT 0xc
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_clkdone_MASK 0x2000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pcs_clkdone__SHIFT 0xd
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pll1_always_on_MASK 0x4000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__pll1_always_on__SHIFT 0xe
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__rdclk_div2_en_MASK 0x8000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__rdclk_div2_en__SHIFT 0xf
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_boost_adj_MASK 0xf0000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_boost_adj__SHIFT 0x10
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_boost_en_MASK 0x100000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_boost_en__SHIFT 0x14
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_binary_ron_code_offset_MASK 0xc00000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE1__tx_binary_ron_code_offset__SHIFT 0x16
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__twosym_en_MASK 0x6
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__twosym_en__SHIFT 0x1
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__link_speed_MASK 0x18
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__link_speed__SHIFT 0x3
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__gang_mode_MASK 0xe0
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__gang_mode__SHIFT 0x5
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__max_linkrate_MASK 0x300
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__max_linkrate__SHIFT 0x8
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_freq_MASK 0xc00
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_freq__SHIFT 0xa
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_clken_MASK 0x1000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_clken__SHIFT 0xc
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_clkdone_MASK 0x2000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pcs_clkdone__SHIFT 0xd
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pll1_always_on_MASK 0x4000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__pll1_always_on__SHIFT 0xe
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__rdclk_div2_en_MASK 0x8000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__rdclk_div2_en__SHIFT 0xf
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_boost_adj_MASK 0xf0000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_boost_adj__SHIFT 0x10
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_boost_en_MASK 0x100000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_boost_en__SHIFT 0x14
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_binary_ron_code_offset_MASK 0xc00000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE2__tx_binary_ron_code_offset__SHIFT 0x16
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__twosym_en_MASK 0x6
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__twosym_en__SHIFT 0x1
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__link_speed_MASK 0x18
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__link_speed__SHIFT 0x3
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__gang_mode_MASK 0xe0
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__gang_mode__SHIFT 0x5
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__max_linkrate_MASK 0x300
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__max_linkrate__SHIFT 0x8
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_freq_MASK 0xc00
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_freq__SHIFT 0xa
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_clken_MASK 0x1000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_clken__SHIFT 0xc
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_clkdone_MASK 0x2000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pcs_clkdone__SHIFT 0xd
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pll1_always_on_MASK 0x4000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__pll1_always_on__SHIFT 0xe
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__rdclk_div2_en_MASK 0x8000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__rdclk_div2_en__SHIFT 0xf
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_boost_adj_MASK 0xf0000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_boost_adj__SHIFT 0x10
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_boost_en_MASK 0x100000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_boost_en__SHIFT 0x14
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_binary_ron_code_offset_MASK 0xc00000
+#define CMD_BUS_GLOBAL_FOR_TX_LANE3__tx_binary_ron_code_offset__SHIFT 0x16
+#define TX_DISP_RFU0_LANE0__rfu_value0_MASK 0xffffffff
+#define TX_DISP_RFU0_LANE0__rfu_value0__SHIFT 0x0
+#define TX_DISP_RFU0_LANE1__rfu_value0_MASK 0xffffffff
+#define TX_DISP_RFU0_LANE1__rfu_value0__SHIFT 0x0
+#define TX_DISP_RFU0_LANE2__rfu_value0_MASK 0xffffffff
+#define TX_DISP_RFU0_LANE2__rfu_value0__SHIFT 0x0
+#define TX_DISP_RFU0_LANE3__rfu_value0_MASK 0xffffffff
+#define TX_DISP_RFU0_LANE3__rfu_value0__SHIFT 0x0
+#define TX_DISP_RFU1_LANE0__rfu_value1_MASK 0xffffffff
+#define TX_DISP_RFU1_LANE0__rfu_value1__SHIFT 0x0
+#define TX_DISP_RFU1_LANE1__rfu_value1_MASK 0xffffffff
+#define TX_DISP_RFU1_LANE1__rfu_value1__SHIFT 0x0
+#define TX_DISP_RFU1_LANE2__rfu_value1_MASK 0xffffffff
+#define TX_DISP_RFU1_LANE2__rfu_value1__SHIFT 0x0
+#define TX_DISP_RFU1_LANE3__rfu_value1_MASK 0xffffffff
+#define TX_DISP_RFU1_LANE3__rfu_value1__SHIFT 0x0
+#define TX_DISP_RFU2_LANE0__rfu_value2_MASK 0xffffffff
+#define TX_DISP_RFU2_LANE0__rfu_value2__SHIFT 0x0
+#define TX_DISP_RFU2_LANE1__rfu_value2_MASK 0xffffffff
+#define TX_DISP_RFU2_LANE1__rfu_value2__SHIFT 0x0
+#define TX_DISP_RFU2_LANE2__rfu_value2_MASK 0xffffffff
+#define TX_DISP_RFU2_LANE2__rfu_value2__SHIFT 0x0
+#define TX_DISP_RFU2_LANE3__rfu_value2_MASK 0xffffffff
+#define TX_DISP_RFU2_LANE3__rfu_value2__SHIFT 0x0
+#define TX_DISP_RFU3_LANE0__rfu_value3_MASK 0xffffffff
+#define TX_DISP_RFU3_LANE0__rfu_value3__SHIFT 0x0
+#define TX_DISP_RFU3_LANE1__rfu_value3_MASK 0xffffffff
+#define TX_DISP_RFU3_LANE1__rfu_value3__SHIFT 0x0
+#define TX_DISP_RFU3_LANE2__rfu_value3_MASK 0xffffffff
+#define TX_DISP_RFU3_LANE2__rfu_value3__SHIFT 0x0
+#define TX_DISP_RFU3_LANE3__rfu_value3_MASK 0xffffffff
+#define TX_DISP_RFU3_LANE3__rfu_value3__SHIFT 0x0
+#define TX_DISP_RFU4_LANE0__rfu_value4_MASK 0xffffffff
+#define TX_DISP_RFU4_LANE0__rfu_value4__SHIFT 0x0
+#define TX_DISP_RFU4_LANE1__rfu_value4_MASK 0xffffffff
+#define TX_DISP_RFU4_LANE1__rfu_value4__SHIFT 0x0
+#define TX_DISP_RFU4_LANE2__rfu_value4_MASK 0xffffffff
+#define TX_DISP_RFU4_LANE2__rfu_value4__SHIFT 0x0
+#define TX_DISP_RFU4_LANE3__rfu_value4_MASK 0xffffffff
+#define TX_DISP_RFU4_LANE3__rfu_value4__SHIFT 0x0
+#define TX_DISP_RFU5_LANE0__rfu_value5_MASK 0xffffffff
+#define TX_DISP_RFU5_LANE0__rfu_value5__SHIFT 0x0
+#define TX_DISP_RFU5_LANE1__rfu_value5_MASK 0xffffffff
+#define TX_DISP_RFU5_LANE1__rfu_value5__SHIFT 0x0
+#define TX_DISP_RFU5_LANE2__rfu_value5_MASK 0xffffffff
+#define TX_DISP_RFU5_LANE2__rfu_value5__SHIFT 0x0
+#define TX_DISP_RFU5_LANE3__rfu_value5_MASK 0xffffffff
+#define TX_DISP_RFU5_LANE3__rfu_value5__SHIFT 0x0
+#define TX_DISP_RFU6_LANE0__rfu_value6_MASK 0xffffffff
+#define TX_DISP_RFU6_LANE0__rfu_value6__SHIFT 0x0
+#define TX_DISP_RFU6_LANE1__rfu_value6_MASK 0xffffffff
+#define TX_DISP_RFU6_LANE1__rfu_value6__SHIFT 0x0
+#define TX_DISP_RFU6_LANE2__rfu_value6_MASK 0xffffffff
+#define TX_DISP_RFU6_LANE2__rfu_value6__SHIFT 0x0
+#define TX_DISP_RFU6_LANE3__rfu_value6_MASK 0xffffffff
+#define TX_DISP_RFU6_LANE3__rfu_value6__SHIFT 0x0
+#define TX_DISP_RFU7_LANE0__rfu_value7_MASK 0xffffffff
+#define TX_DISP_RFU7_LANE0__rfu_value7__SHIFT 0x0
+#define TX_DISP_RFU7_LANE1__rfu_value7_MASK 0xffffffff
+#define TX_DISP_RFU7_LANE1__rfu_value7__SHIFT 0x0
+#define TX_DISP_RFU7_LANE2__rfu_value7_MASK 0xffffffff
+#define TX_DISP_RFU7_LANE2__rfu_value7__SHIFT 0x0
+#define TX_DISP_RFU7_LANE3__rfu_value7_MASK 0xffffffff
+#define TX_DISP_RFU7_LANE3__rfu_value7__SHIFT 0x0
+#define TX_DISP_RFU8_LANE0__rfu_value8_MASK 0xffffffff
+#define TX_DISP_RFU8_LANE0__rfu_value8__SHIFT 0x0
+#define TX_DISP_RFU8_LANE1__rfu_value8_MASK 0xffffffff
+#define TX_DISP_RFU8_LANE1__rfu_value8__SHIFT 0x0
+#define TX_DISP_RFU8_LANE2__rfu_value8_MASK 0xffffffff
+#define TX_DISP_RFU8_LANE2__rfu_value8__SHIFT 0x0
+#define TX_DISP_RFU8_LANE3__rfu_value8_MASK 0xffffffff
+#define TX_DISP_RFU8_LANE3__rfu_value8__SHIFT 0x0
+#define TX_DISP_RFU9_LANE0__rfu_value9_MASK 0xffffffff
+#define TX_DISP_RFU9_LANE0__rfu_value9__SHIFT 0x0
+#define TX_DISP_RFU9_LANE1__rfu_value9_MASK 0xffffffff
+#define TX_DISP_RFU9_LANE1__rfu_value9__SHIFT 0x0
+#define TX_DISP_RFU9_LANE2__rfu_value9_MASK 0xffffffff
+#define TX_DISP_RFU9_LANE2__rfu_value9__SHIFT 0x0
+#define TX_DISP_RFU9_LANE3__rfu_value9_MASK 0xffffffff
+#define TX_DISP_RFU9_LANE3__rfu_value9__SHIFT 0x0
+#define TX_DISP_RFU10_LANE0__rfu_value10_MASK 0xffffffff
+#define TX_DISP_RFU10_LANE0__rfu_value10__SHIFT 0x0
+#define TX_DISP_RFU10_LANE1__rfu_value10_MASK 0xffffffff
+#define TX_DISP_RFU10_LANE1__rfu_value10__SHIFT 0x0
+#define TX_DISP_RFU10_LANE2__rfu_value10_MASK 0xffffffff
+#define TX_DISP_RFU10_LANE2__rfu_value10__SHIFT 0x0
+#define TX_DISP_RFU10_LANE3__rfu_value10_MASK 0xffffffff
+#define TX_DISP_RFU10_LANE3__rfu_value10__SHIFT 0x0
+#define TX_DISP_RFU11_LANE0__rfu_value11_MASK 0xffffffff
+#define TX_DISP_RFU11_LANE0__rfu_value11__SHIFT 0x0
+#define TX_DISP_RFU11_LANE1__rfu_value11_MASK 0xffffffff
+#define TX_DISP_RFU11_LANE1__rfu_value11__SHIFT 0x0
+#define TX_DISP_RFU11_LANE2__rfu_value11_MASK 0xffffffff
+#define TX_DISP_RFU11_LANE2__rfu_value11__SHIFT 0x0
+#define TX_DISP_RFU11_LANE3__rfu_value11_MASK 0xffffffff
+#define TX_DISP_RFU11_LANE3__rfu_value11__SHIFT 0x0
+#define TX_DISP_RFU12_LANE0__rfu_value12_MASK 0xffffffff
+#define TX_DISP_RFU12_LANE0__rfu_value12__SHIFT 0x0
+#define TX_DISP_RFU12_LANE1__rfu_value12_MASK 0xffffffff
+#define TX_DISP_RFU12_LANE1__rfu_value12__SHIFT 0x0
+#define TX_DISP_RFU12_LANE2__rfu_value12_MASK 0xffffffff
+#define TX_DISP_RFU12_LANE2__rfu_value12__SHIFT 0x0
+#define TX_DISP_RFU12_LANE3__rfu_value12_MASK 0xffffffff
+#define TX_DISP_RFU12_LANE3__rfu_value12__SHIFT 0x0
+#define COMMON_MAR_DEEMPH_NOM__tx_margin_nom_MASK 0xff
+#define COMMON_MAR_DEEMPH_NOM__tx_margin_nom__SHIFT 0x0
+#define COMMON_MAR_DEEMPH_NOM__deemph_gen1_nom_MASK 0xff00
+#define COMMON_MAR_DEEMPH_NOM__deemph_gen1_nom__SHIFT 0x8
+#define COMMON_MAR_DEEMPH_NOM__deemph35_gen2_nom_MASK 0xff0000
+#define COMMON_MAR_DEEMPH_NOM__deemph35_gen2_nom__SHIFT 0x10
+#define COMMON_MAR_DEEMPH_NOM__deemph60_gen2_nom_MASK 0xff000000
+#define COMMON_MAR_DEEMPH_NOM__deemph60_gen2_nom__SHIFT 0x18
+#define COMMON_LANE_PWRMGMT__pgdelay_MASK 0xf
+#define COMMON_LANE_PWRMGMT__pgdelay__SHIFT 0x0
+#define COMMON_LANE_PWRMGMT__pgmask_MASK 0x3f0
+#define COMMON_LANE_PWRMGMT__pgmask__SHIFT 0x4
+#define COMMON_LANE_PWRMGMT__vprot_en_MASK 0x800
+#define COMMON_LANE_PWRMGMT__vprot_en__SHIFT 0xb
+#define COMMON_TXCNTRL__rdptr_rst_val_gen3_MASK 0x1f
+#define COMMON_TXCNTRL__rdptr_rst_val_gen3__SHIFT 0x0
+#define COMMON_TXCNTRL__clkgate_dis_MASK 0x20
+#define COMMON_TXCNTRL__clkgate_dis__SHIFT 0x5
+#define COMMON_TXCNTRL__slew_rate_ctl_gen1_MASK 0x1c0
+#define COMMON_TXCNTRL__slew_rate_ctl_gen1__SHIFT 0x6
+#define COMMON_TXCNTRL__slew_rate_ctl_gen2_MASK 0xe00
+#define COMMON_TXCNTRL__slew_rate_ctl_gen2__SHIFT 0x9
+#define COMMON_TXCNTRL__slew_rate_ctl_gen3_MASK 0x7000
+#define COMMON_TXCNTRL__slew_rate_ctl_gen3__SHIFT 0xc
+#define COMMON_TXCNTRL__dual_dvi_mstr_en_MASK 0x8000
+#define COMMON_TXCNTRL__dual_dvi_mstr_en__SHIFT 0xf
+#define COMMON_TXCNTRL__dual_dvi_en_MASK 0x10000
+#define COMMON_TXCNTRL__dual_dvi_en__SHIFT 0x10
+#define COMMON_TMDP__tmdp_spare_MASK 0xffffffff
+#define COMMON_TMDP__tmdp_spare__SHIFT 0x0
+#define COMMON_LANE_RESETS__lane_0_reset_l_MASK 0x1
+#define COMMON_LANE_RESETS__lane_0_reset_l__SHIFT 0x0
+#define COMMON_LANE_RESETS__lane_1_reset_l_MASK 0x2
+#define COMMON_LANE_RESETS__lane_1_reset_l__SHIFT 0x1
+#define COMMON_LANE_RESETS__lane_2_reset_l_MASK 0x4
+#define COMMON_LANE_RESETS__lane_2_reset_l__SHIFT 0x2
+#define COMMON_LANE_RESETS__lane_3_reset_l_MASK 0x8
+#define COMMON_LANE_RESETS__lane_3_reset_l__SHIFT 0x3
+#define COMMON_LANE_RESETS__lane_4_reset_l_MASK 0x10
+#define COMMON_LANE_RESETS__lane_4_reset_l__SHIFT 0x4
+#define COMMON_LANE_RESETS__lane_5_reset_l_MASK 0x20
+#define COMMON_LANE_RESETS__lane_5_reset_l__SHIFT 0x5
+#define COMMON_LANE_RESETS__lane_6_reset_l_MASK 0x40
+#define COMMON_LANE_RESETS__lane_6_reset_l__SHIFT 0x6
+#define COMMON_LANE_RESETS__lane_7_reset_l_MASK 0x80
+#define COMMON_LANE_RESETS__lane_7_reset_l__SHIFT 0x7
+#define COMMON_ZCALCODE_CTRL__zcalcode_override_MASK 0x1
+#define COMMON_ZCALCODE_CTRL__zcalcode_override__SHIFT 0x0
+#define COMMON_ZCALCODE_CTRL__tx_binary_code_override_val_MASK 0x3e
+#define COMMON_ZCALCODE_CTRL__tx_binary_code_override_val__SHIFT 0x1
+#define COMMON_ZCALCODE_CTRL__tx_driver_fifty_ohms_MASK 0x200000
+#define COMMON_ZCALCODE_CTRL__tx_driver_fifty_ohms__SHIFT 0x15
+#define COMMON_DISP_RFU1__rfu_value1_MASK 0xffffffff
+#define COMMON_DISP_RFU1__rfu_value1__SHIFT 0x0
+#define COMMON_DISP_RFU2__rfu_value2_MASK 0xffffffff
+#define COMMON_DISP_RFU2__rfu_value2__SHIFT 0x0
+#define COMMON_DISP_RFU3__rfu_value3_MASK 0xffffffff
+#define COMMON_DISP_RFU3__rfu_value3__SHIFT 0x0
+#define COMMON_DISP_RFU4__rfu_value4_MASK 0xffffffff
+#define COMMON_DISP_RFU4__rfu_value4__SHIFT 0x0
+#define COMMON_DISP_RFU5__rfu_value5_MASK 0xffffffff
+#define COMMON_DISP_RFU5__rfu_value5__SHIFT 0x0
+#define COMMON_DISP_RFU6__rfu_value6_MASK 0xffffffff
+#define COMMON_DISP_RFU6__rfu_value6__SHIFT 0x0
+#define COMMON_DISP_RFU7__rfu_value7_MASK 0xffffffff
+#define COMMON_DISP_RFU7__rfu_value7__SHIFT 0x0
+#define FREQ_CTRL0__fcw0_frac_MASK 0xffff
+#define FREQ_CTRL0__fcw0_frac__SHIFT 0x0
+#define FREQ_CTRL0__fcw0_int_MASK 0x1ff0000
+#define FREQ_CTRL0__fcw0_int__SHIFT 0x10
+#define FREQ_CTRL1__fcw1_frac_MASK 0xffff
+#define FREQ_CTRL1__fcw1_frac__SHIFT 0x0
+#define FREQ_CTRL1__fcw1_int_MASK 0x1ff0000
+#define FREQ_CTRL1__fcw1_int__SHIFT 0x10
+#define FREQ_CTRL2__fcw_denom_MASK 0xffff
+#define FREQ_CTRL2__fcw_denom__SHIFT 0x0
+#define FREQ_CTRL2__fcw_slew_frac_MASK 0xffff0000
+#define FREQ_CTRL2__fcw_slew_frac__SHIFT 0x10
+#define FREQ_CTRL3__refclk_div_MASK 0x3
+#define FREQ_CTRL3__refclk_div__SHIFT 0x0
+#define FREQ_CTRL3__vco_pre_div_MASK 0x18
+#define FREQ_CTRL3__vco_pre_div__SHIFT 0x3
+#define FREQ_CTRL3__fracn_en_MASK 0x40
+#define FREQ_CTRL3__fracn_en__SHIFT 0x6
+#define FREQ_CTRL3__ssc_en_MASK 0x100
+#define FREQ_CTRL3__ssc_en__SHIFT 0x8
+#define FREQ_CTRL3__fcw_sel_MASK 0x400
+#define FREQ_CTRL3__fcw_sel__SHIFT 0xa
+#define FREQ_CTRL3__freq_jump_en_MASK 0x1000
+#define FREQ_CTRL3__freq_jump_en__SHIFT 0xc
+#define FREQ_CTRL3__tdc_resolution_MASK 0xff0000
+#define FREQ_CTRL3__tdc_resolution__SHIFT 0x10
+#define FREQ_CTRL3__dpll_cfg_1_MASK 0xff000000
+#define FREQ_CTRL3__dpll_cfg_1__SHIFT 0x18
+#define BW_CTRL_COARSE__gi_coarse_mant_MASK 0x3
+#define BW_CTRL_COARSE__gi_coarse_mant__SHIFT 0x0
+#define BW_CTRL_COARSE__gi_coarse_exp_MASK 0x3c
+#define BW_CTRL_COARSE__gi_coarse_exp__SHIFT 0x2
+#define BW_CTRL_COARSE__gp_coarse_mant_MASK 0x780
+#define BW_CTRL_COARSE__gp_coarse_mant__SHIFT 0x7
+#define BW_CTRL_COARSE__gp_coarse_exp_MASK 0xf000
+#define BW_CTRL_COARSE__gp_coarse_exp__SHIFT 0xc
+#define BW_CTRL_COARSE__nctl_coarse_res_MASK 0x7e0000
+#define BW_CTRL_COARSE__nctl_coarse_res__SHIFT 0x11
+#define BW_CTRL_COARSE__nctl_coarse_frac_res_MASK 0x3000000
+#define BW_CTRL_COARSE__nctl_coarse_frac_res__SHIFT 0x18
+#define BW_CTRL_FINE__dpll_cfg_3_MASK 0x3ff
+#define BW_CTRL_FINE__dpll_cfg_3__SHIFT 0x0
+#define CAL_CTRL__bypass_freq_lock_MASK 0x1
+#define CAL_CTRL__bypass_freq_lock__SHIFT 0x0
+#define CAL_CTRL__tdc_cal_en_MASK 0x2
+#define CAL_CTRL__tdc_cal_en__SHIFT 0x1
+#define CAL_CTRL__tdc_cal_ctrl_MASK 0x1f8
+#define CAL_CTRL__tdc_cal_ctrl__SHIFT 0x3
+#define CAL_CTRL__meas_win_sel_MASK 0x600
+#define CAL_CTRL__meas_win_sel__SHIFT 0x9
+#define CAL_CTRL__kdco_cal_dis_MASK 0x800
+#define CAL_CTRL__kdco_cal_dis__SHIFT 0xb
+#define CAL_CTRL__kdco_ratio_MASK 0x1fe000
+#define CAL_CTRL__kdco_ratio__SHIFT 0xd
+#define CAL_CTRL__kdco_incr_cal_dis_MASK 0x400000
+#define CAL_CTRL__kdco_incr_cal_dis__SHIFT 0x16
+#define CAL_CTRL__nctl_adj_dis_MASK 0x800000
+#define CAL_CTRL__nctl_adj_dis__SHIFT 0x17
+#define CAL_CTRL__refclk_rate_MASK 0xff000000
+#define CAL_CTRL__refclk_rate__SHIFT 0x18
+#define LOOP_CTRL__fbdiv_mask_en_MASK 0x1
+#define LOOP_CTRL__fbdiv_mask_en__SHIFT 0x0
+#define LOOP_CTRL__fb_slip_dis_MASK 0x4
+#define LOOP_CTRL__fb_slip_dis__SHIFT 0x2
+#define LOOP_CTRL__clk_tdc_sel_MASK 0x30
+#define LOOP_CTRL__clk_tdc_sel__SHIFT 0x4
+#define LOOP_CTRL__clk_nctl_sel_MASK 0x180
+#define LOOP_CTRL__clk_nctl_sel__SHIFT 0x7
+#define LOOP_CTRL__sig_del_patt_sel_MASK 0x400
+#define LOOP_CTRL__sig_del_patt_sel__SHIFT 0xa
+#define LOOP_CTRL__nctl_sig_del_dis_MASK 0x1000
+#define LOOP_CTRL__nctl_sig_del_dis__SHIFT 0xc
+#define LOOP_CTRL__fbclk_track_refclk_MASK 0x4000
+#define LOOP_CTRL__fbclk_track_refclk__SHIFT 0xe
+#define LOOP_CTRL__prbs_en_MASK 0x10000
+#define LOOP_CTRL__prbs_en__SHIFT 0x10
+#define LOOP_CTRL__tdc_clk_gate_en_MASK 0x40000
+#define LOOP_CTRL__tdc_clk_gate_en__SHIFT 0x12
+#define LOOP_CTRL__phase_offset_MASK 0x7f00000
+#define LOOP_CTRL__phase_offset__SHIFT 0x14
+#define VREG_CFG__bleeder_ac_MASK 0x1
+#define VREG_CFG__bleeder_ac__SHIFT 0x0
+#define VREG_CFG__bleeder_en_MASK 0x2
+#define VREG_CFG__bleeder_en__SHIFT 0x1
+#define VREG_CFG__is_1p2_MASK 0x4
+#define VREG_CFG__is_1p2__SHIFT 0x2
+#define VREG_CFG__reg_obs_sel_MASK 0x18
+#define VREG_CFG__reg_obs_sel__SHIFT 0x3
+#define VREG_CFG__reg_on_mode_MASK 0x60
+#define VREG_CFG__reg_on_mode__SHIFT 0x5
+#define VREG_CFG__rlad_tap_sel_MASK 0x780
+#define VREG_CFG__rlad_tap_sel__SHIFT 0x7
+#define VREG_CFG__reg_off_hi_MASK 0x800
+#define VREG_CFG__reg_off_hi__SHIFT 0xb
+#define VREG_CFG__reg_off_lo_MASK 0x1000
+#define VREG_CFG__reg_off_lo__SHIFT 0xc
+#define VREG_CFG__scale_driver_MASK 0x6000
+#define VREG_CFG__scale_driver__SHIFT 0xd
+#define VREG_CFG__sel_bump_MASK 0x8000
+#define VREG_CFG__sel_bump__SHIFT 0xf
+#define VREG_CFG__sel_rladder_x_MASK 0x10000
+#define VREG_CFG__sel_rladder_x__SHIFT 0x10
+#define VREG_CFG__short_rc_filt_x_MASK 0x20000
+#define VREG_CFG__short_rc_filt_x__SHIFT 0x11
+#define VREG_CFG__vref_pwr_on_MASK 0x40000
+#define VREG_CFG__vref_pwr_on__SHIFT 0x12
+#define VREG_CFG__dpll_cfg_2_MASK 0xff00000
+#define VREG_CFG__dpll_cfg_2__SHIFT 0x14
+#define OBSERVE0__lock_det_tdc_steps_MASK 0x1f
+#define OBSERVE0__lock_det_tdc_steps__SHIFT 0x0
+#define OBSERVE0__clear_sticky_lock_MASK 0x40
+#define OBSERVE0__clear_sticky_lock__SHIFT 0x6
+#define OBSERVE0__lock_det_dis_MASK 0x100
+#define OBSERVE0__lock_det_dis__SHIFT 0x8
+#define OBSERVE0__dco_cfg_MASK 0x3fc00
+#define OBSERVE0__dco_cfg__SHIFT 0xa
+#define OBSERVE0__anaobs_sel_MASK 0xe00000
+#define OBSERVE0__anaobs_sel__SHIFT 0x15
+#define OBSERVE1__digobs_sel_MASK 0xf
+#define OBSERVE1__digobs_sel__SHIFT 0x0
+#define OBSERVE1__digobs_trig_sel_MASK 0x1e0
+#define OBSERVE1__digobs_trig_sel__SHIFT 0x5
+#define OBSERVE1__digobs_div_MASK 0xc00
+#define OBSERVE1__digobs_div__SHIFT 0xa
+#define OBSERVE1__digobs_trig_div_MASK 0x6000
+#define OBSERVE1__digobs_trig_div__SHIFT 0xd
+#define OBSERVE1__lock_timer_MASK 0x3fff0000
+#define OBSERVE1__lock_timer__SHIFT 0x10
+#define DFT_OUT__dft_data_MASK 0xffffffff
+#define DFT_OUT__dft_data__SHIFT 0x0
+#define PLL_WRAP_CNTRL1__wrap_cfg_sel_clk_MASK 0x3
+#define PLL_WRAP_CNTRL1__wrap_cfg_sel_clk__SHIFT 0x0
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_freq_programming_ovveride_MASK 0x1
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_freq_programming_ovveride__SHIFT 0x0
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_pwr_state_ovrride_MASK 0x2
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_pwr_state_ovrride__SHIFT 0x1
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_pwr_state_MASK 0xc
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_pwr_state__SHIFT 0x2
+#define PLL_WRAP_CNTRL__wrap_cfg_tx_pdiv_val_MASK 0xe0
+#define PLL_WRAP_CNTRL__wrap_cfg_tx_pdiv_val__SHIFT 0x5
+#define PLL_WRAP_CNTRL__wrap_cfg_tx_pixdiv_val_MASK 0x100
+#define PLL_WRAP_CNTRL__wrap_cfg_tx_pixdiv_val__SHIFT 0x8
+#define PLL_WRAP_CNTRL__wrap_cfg_cml_cmos_sel_MASK 0x400
+#define PLL_WRAP_CNTRL__wrap_cfg_cml_cmos_sel__SHIFT 0xa
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_rdy_MASK 0x2000
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_rdy__SHIFT 0xd
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_update_MASK 0x4000
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_update__SHIFT 0xe
+#define PLL_WRAP_CNTRL__wrap_cfg_ref_values_chg_MASK 0x8000
+#define PLL_WRAP_CNTRL__wrap_cfg_ref_values_chg__SHIFT 0xf
+#define PLL_WRAP_CNTRL__wrap_cfg_clk_gate_w_rdy_MASK 0x10000
+#define PLL_WRAP_CNTRL__wrap_cfg_clk_gate_w_rdy__SHIFT 0x10
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_dsm_sel_MASK 0xe0000
+#define PLL_WRAP_CNTRL__wrap_cfg_pll_dsm_sel__SHIFT 0x11
+#define PPLL_VREG_CFG__pw_pc_bleeder_ac_MASK 0x1
+#define PPLL_VREG_CFG__pw_pc_bleeder_ac__SHIFT 0x0
+#define PPLL_VREG_CFG__pw_pc_bleeder_en_MASK 0x2
+#define PPLL_VREG_CFG__pw_pc_bleeder_en__SHIFT 0x1
+#define PPLL_VREG_CFG__pw_pc_is_1p2_MASK 0x4
+#define PPLL_VREG_CFG__pw_pc_is_1p2__SHIFT 0x2
+#define PPLL_VREG_CFG__pw_pc_reg_obs_sel_MASK 0x18
+#define PPLL_VREG_CFG__pw_pc_reg_obs_sel__SHIFT 0x3
+#define PPLL_VREG_CFG__pw_pc_reg_on_mode_MASK 0x60
+#define PPLL_VREG_CFG__pw_pc_reg_on_mode__SHIFT 0x5
+#define PPLL_VREG_CFG__pw_pc_rlad_tap_sel_MASK 0x780
+#define PPLL_VREG_CFG__pw_pc_rlad_tap_sel__SHIFT 0x7
+#define PPLL_VREG_CFG__pw_pc_reg_off_hi_MASK 0x800
+#define PPLL_VREG_CFG__pw_pc_reg_off_hi__SHIFT 0xb
+#define PPLL_VREG_CFG__pw_pc_reg_off_lo_MASK 0x1000
+#define PPLL_VREG_CFG__pw_pc_reg_off_lo__SHIFT 0xc
+#define PPLL_VREG_CFG__pw_pc_scale_driver_MASK 0x6000
+#define PPLL_VREG_CFG__pw_pc_scale_driver__SHIFT 0xd
+#define PPLL_VREG_CFG__pw_pc_sel_bump_MASK 0x8000
+#define PPLL_VREG_CFG__pw_pc_sel_bump__SHIFT 0xf
+#define PPLL_VREG_CFG__pw_pc_sel_rladder_x_MASK 0x10000
+#define PPLL_VREG_CFG__pw_pc_sel_rladder_x__SHIFT 0x10
+#define PPLL_VREG_CFG__pw_pc_short_rc_filt_x_MASK 0x20000
+#define PPLL_VREG_CFG__pw_pc_short_rc_filt_x__SHIFT 0x11
+#define PPLL_VREG_CFG__pw_pc_vref_pwr_on_MASK 0x40000
+#define PPLL_VREG_CFG__pw_pc_vref_pwr_on__SHIFT 0x12
+#define PPLL_VREG_CFG__pw_pc_dpll_cfg_2_MASK 0xff00000
+#define PPLL_VREG_CFG__pw_pc_dpll_cfg_2__SHIFT 0x14
+#define PPLL_MODE_CNTL__pw_pc_refclk_gate_dis_MASK 0x1
+#define PPLL_MODE_CNTL__pw_pc_refclk_gate_dis__SHIFT 0x0
+#define PPLL_MODE_CNTL__pw_pc_multi_phase_en_MASK 0xf00
+#define PPLL_MODE_CNTL__pw_pc_multi_phase_en__SHIFT 0x8
+#define PPLL_MODE_CNTL__reg_tmg_pwr_state_MASK 0x30000
+#define PPLL_MODE_CNTL__reg_tmg_pwr_state__SHIFT 0x10
+#define PPLL_FREQ_CTRL0__reg_tmg_fcw0_frac_MASK 0xffff
+#define PPLL_FREQ_CTRL0__reg_tmg_fcw0_frac__SHIFT 0x0
+#define PPLL_FREQ_CTRL0__reg_tmg_fcw0_int_MASK 0x1ff0000
+#define PPLL_FREQ_CTRL0__reg_tmg_fcw0_int__SHIFT 0x10
+#define PPLL_FREQ_CTRL1__reg_tmg_fcw1_frac_MASK 0xffff
+#define PPLL_FREQ_CTRL1__reg_tmg_fcw1_frac__SHIFT 0x0
+#define PPLL_FREQ_CTRL1__reg_tmg_fcw1_int_MASK 0x1ff0000
+#define PPLL_FREQ_CTRL1__reg_tmg_fcw1_int__SHIFT 0x10
+#define PPLL_FREQ_CTRL2__reg_tmg_fcw_denom_MASK 0xffff
+#define PPLL_FREQ_CTRL2__reg_tmg_fcw_denom__SHIFT 0x0
+#define PPLL_FREQ_CTRL2__reg_tmg_fcw_slew_frac_MASK 0xffff0000
+#define PPLL_FREQ_CTRL2__reg_tmg_fcw_slew_frac__SHIFT 0x10
+#define PPLL_FREQ_CTRL3__reg_tmg_refclk_div_MASK 0x3
+#define PPLL_FREQ_CTRL3__reg_tmg_refclk_div__SHIFT 0x0
+#define PPLL_FREQ_CTRL3__reg_tmg_vco_pre_div_MASK 0x18
+#define PPLL_FREQ_CTRL3__reg_tmg_vco_pre_div__SHIFT 0x3
+#define PPLL_FREQ_CTRL3__reg_tmg_fracn_en_MASK 0x40
+#define PPLL_FREQ_CTRL3__reg_tmg_fracn_en__SHIFT 0x6
+#define PPLL_FREQ_CTRL3__reg_tmg_ssc_en_MASK 0x100
+#define PPLL_FREQ_CTRL3__reg_tmg_ssc_en__SHIFT 0x8
+#define PPLL_FREQ_CTRL3__reg_tmg_fcw_sel_MASK 0x400
+#define PPLL_FREQ_CTRL3__reg_tmg_fcw_sel__SHIFT 0xa
+#define PPLL_FREQ_CTRL3__reg_tmg_freq_jump_en_MASK 0x1000
+#define PPLL_FREQ_CTRL3__reg_tmg_freq_jump_en__SHIFT 0xc
+#define PPLL_FREQ_CTRL3__reg_tmg_tdc_resol_MASK 0xff0000
+#define PPLL_FREQ_CTRL3__reg_tmg_tdc_resol__SHIFT 0x10
+#define PPLL_FREQ_CTRL3__pw_pc_dpll_cfg_1_MASK 0xff000000
+#define PPLL_FREQ_CTRL3__pw_pc_dpll_cfg_1__SHIFT 0x18
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gi_crse_mant_MASK 0x3
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gi_crse_mant__SHIFT 0x0
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gi_crse_exp_MASK 0x3c
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gi_crse_exp__SHIFT 0x2
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gp_crse_mant_MASK 0x780
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gp_crse_mant__SHIFT 0x7
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gp_crse_exp_MASK 0xf000
+#define PPLL_BW_CTRL_COARSE__reg_tmg_gp_crse_exp__SHIFT 0xc
+#define PPLL_BW_CTRL_COARSE__reg_tmg_nctl_crse_res_MASK 0x7e0000
+#define PPLL_BW_CTRL_COARSE__reg_tmg_nctl_crse_res__SHIFT 0x11
+#define PPLL_BW_CTRL_COARSE__reg_tmg_nctl_crse_frac_res_MASK 0x3000000
+#define PPLL_BW_CTRL_COARSE__reg_tmg_nctl_crse_frac_res__SHIFT 0x18
+#define PPLL_BW_CTRL_FINE__pw_pc_dpll_cfg_3_MASK 0x3ff
+#define PPLL_BW_CTRL_FINE__pw_pc_dpll_cfg_3__SHIFT 0x0
+#define PPLL_CAL_CTRL__pw_pc_bypass_freq_lock_MASK 0x1
+#define PPLL_CAL_CTRL__pw_pc_bypass_freq_lock__SHIFT 0x0
+#define PPLL_CAL_CTRL__pw_pc_tdc_cal_en_MASK 0x2
+#define PPLL_CAL_CTRL__pw_pc_tdc_cal_en__SHIFT 0x1
+#define PPLL_CAL_CTRL__pw_pc_tdc_cal_ctrl_MASK 0x1f8
+#define PPLL_CAL_CTRL__pw_pc_tdc_cal_ctrl__SHIFT 0x3
+#define PPLL_CAL_CTRL__pw_pc_meas_win_sel_MASK 0x600
+#define PPLL_CAL_CTRL__pw_pc_meas_win_sel__SHIFT 0x9
+#define PPLL_CAL_CTRL__pw_pc_kdco_cal_dis_MASK 0x800
+#define PPLL_CAL_CTRL__pw_pc_kdco_cal_dis__SHIFT 0xb
+#define PPLL_CAL_CTRL__pw_pc_kdco_ratio_MASK 0x1fe000
+#define PPLL_CAL_CTRL__pw_pc_kdco_ratio__SHIFT 0xd
+#define PPLL_CAL_CTRL__pw_pc_kdco_incr_cal_dis_MASK 0x400000
+#define PPLL_CAL_CTRL__pw_pc_kdco_incr_cal_dis__SHIFT 0x16
+#define PPLL_CAL_CTRL__pw_pc_nctl_adj_dis_MASK 0x800000
+#define PPLL_CAL_CTRL__pw_pc_nctl_adj_dis__SHIFT 0x17
+#define PPLL_CAL_CTRL__pw_pc_refclk_rate_MASK 0xff000000
+#define PPLL_CAL_CTRL__pw_pc_refclk_rate__SHIFT 0x18
+#define PPLL_LOOP_CTRL__pw_pc_fbdiv_mask_en_MASK 0x1
+#define PPLL_LOOP_CTRL__pw_pc_fbdiv_mask_en__SHIFT 0x0
+#define PPLL_LOOP_CTRL__pw_pc_fb_slip_dis_MASK 0x4
+#define PPLL_LOOP_CTRL__pw_pc_fb_slip_dis__SHIFT 0x2
+#define PPLL_LOOP_CTRL__pw_pc_clk_tdc_sel_MASK 0x30
+#define PPLL_LOOP_CTRL__pw_pc_clk_tdc_sel__SHIFT 0x4
+#define PPLL_LOOP_CTRL__pw_pc_clk_nctl_sel_MASK 0x180
+#define PPLL_LOOP_CTRL__pw_pc_clk_nctl_sel__SHIFT 0x7
+#define PPLL_LOOP_CTRL__pw_pc_sig_del_patt_sel_MASK 0x400
+#define PPLL_LOOP_CTRL__pw_pc_sig_del_patt_sel__SHIFT 0xa
+#define PPLL_LOOP_CTRL__pw_pc_nctl_sig_del_dis_MASK 0x1000
+#define PPLL_LOOP_CTRL__pw_pc_nctl_sig_del_dis__SHIFT 0xc
+#define PPLL_LOOP_CTRL__pw_pc_fbclk_track_refclk_MASK 0x4000
+#define PPLL_LOOP_CTRL__pw_pc_fbclk_track_refclk__SHIFT 0xe
+#define PPLL_LOOP_CTRL__pw_pc_prbs_en_MASK 0x10000
+#define PPLL_LOOP_CTRL__pw_pc_prbs_en__SHIFT 0x10
+#define PPLL_LOOP_CTRL__pw_pc_tdc_clk_gate_en_MASK 0x40000
+#define PPLL_LOOP_CTRL__pw_pc_tdc_clk_gate_en__SHIFT 0x12
+#define PPLL_LOOP_CTRL__pw_pc_phase_offset_MASK 0x7f00000
+#define PPLL_LOOP_CTRL__pw_pc_phase_offset__SHIFT 0x14
+#define PPLL_REFCLK_CNTL__regs_pw_refclk0_recv_en_MASK 0x1
+#define PPLL_REFCLK_CNTL__regs_pw_refclk0_recv_en__SHIFT 0x0
+#define PPLL_REFCLK_CNTL__regs_pw_refclk1_recv_en_MASK 0x2
+#define PPLL_REFCLK_CNTL__regs_pw_refclk1_recv_en__SHIFT 0x1
+#define PPLL_REFCLK_CNTL__regs_pw_refclk2_recv_en_MASK 0x4
+#define PPLL_REFCLK_CNTL__regs_pw_refclk2_recv_en__SHIFT 0x2
+#define PPLL_REFCLK_CNTL__regs_pw_refclk3_recv_en_MASK 0x8
+#define PPLL_REFCLK_CNTL__regs_pw_refclk3_recv_en__SHIFT 0x3
+#define PPLL_REFCLK_CNTL__regs_pw_refclk0_recv_sel_MASK 0x100
+#define PPLL_REFCLK_CNTL__regs_pw_refclk0_recv_sel__SHIFT 0x8
+#define PPLL_REFCLK_CNTL__regs_pw_refclk1_recv_sel_MASK 0x200
+#define PPLL_REFCLK_CNTL__regs_pw_refclk1_recv_sel__SHIFT 0x9
+#define PPLL_REFCLK_CNTL__regs_pw_refclk2_recv_sel_MASK 0x400
+#define PPLL_REFCLK_CNTL__regs_pw_refclk2_recv_sel__SHIFT 0xa
+#define PPLL_REFCLK_CNTL__regs_pw_refclk3_recv_sel_MASK 0x800
+#define PPLL_REFCLK_CNTL__regs_pw_refclk3_recv_sel__SHIFT 0xb
+#define PPLL_REFCLK_CNTL__regs_pw_refdivsrc_MASK 0xc000
+#define PPLL_REFCLK_CNTL__regs_pw_refdivsrc__SHIFT 0xe
+#define PPLL_REFCLK_CNTL__regs_pw_ref2core_sel_MASK 0x10000
+#define PPLL_REFCLK_CNTL__regs_pw_ref2core_sel__SHIFT 0x10
+#define PPLL_CLKOUT_CNTL__regs_pw_pixclk_pre_pdivsel_MASK 0x100
+#define PPLL_CLKOUT_CNTL__regs_pw_pixclk_pre_pdivsel__SHIFT 0x8
+#define PPLL_CLKOUT_CNTL__regs_pw_pixclk_pdivsel_MASK 0x200
+#define PPLL_CLKOUT_CNTL__regs_pw_pixclk_pdivsel__SHIFT 0x9
+#define PPLL_CLKOUT_CNTL__regs_pw_dvoclk_pre_pdivsel_MASK 0x400
+#define PPLL_CLKOUT_CNTL__regs_pw_dvoclk_pre_pdivsel__SHIFT 0xa
+#define PPLL_CLKOUT_CNTL__regs_pw_dvoclk_pdivsel_MASK 0x800
+#define PPLL_CLKOUT_CNTL__regs_pw_dvoclk_pdivsel__SHIFT 0xb
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_en_MASK 0x1000
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_en__SHIFT 0xc
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_pre_pdivsel_MASK 0x2000
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_pre_pdivsel__SHIFT 0xd
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_pdivsel_MASK 0x4000
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_pdivsel__SHIFT 0xe
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_obs_sel_MASK 0x8000
+#define PPLL_CLKOUT_CNTL__regs_pw_idclk_obs_sel__SHIFT 0xf
+#define PPLL_CLKOUT_CNTL__regs_pw_refclk_sel_MASK 0x30000
+#define PPLL_CLKOUT_CNTL__regs_pw_refclk_sel__SHIFT 0x10
+#define PPLL_CLKOUT_CNTL__regs_cc_resetb_MASK 0x100000
+#define PPLL_CLKOUT_CNTL__regs_cc_resetb__SHIFT 0x14
+#define PPLL_DFT_CNTL__regs_pw_obs_en_MASK 0x1
+#define PPLL_DFT_CNTL__regs_pw_obs_en__SHIFT 0x0
+#define PPLL_DFT_CNTL__regs_pw_obs_div_sel_1_MASK 0x6
+#define PPLL_DFT_CNTL__regs_pw_obs_div_sel_1__SHIFT 0x1
+#define PPLL_DFT_CNTL__regs_pw_obs_clk_sel_1_MASK 0xf0
+#define PPLL_DFT_CNTL__regs_pw_obs_clk_sel_1__SHIFT 0x4
+#define PPLL_DFT_CNTL__regs_pw_obs_clk_sel_2_MASK 0xf00
+#define PPLL_DFT_CNTL__regs_pw_obs_clk_sel_2__SHIFT 0x8
+#define PPLL_DFT_CNTL__regs_pw_obs_sel_MASK 0x3000
+#define PPLL_DFT_CNTL__regs_pw_obs_sel__SHIFT 0xc
+#define PPLL_ANALOG_CNTL__regs_pw_spare_MASK 0xff
+#define PPLL_ANALOG_CNTL__regs_pw_spare__SHIFT 0x0
+#define PPLL_POSTDIV__reg_tmg_postdiv_MASK 0xf00
+#define PPLL_POSTDIV__reg_tmg_postdiv__SHIFT 0x8
+#define PPLL_POSTDIV__reg_tmg_pixclk_pdiv2_MASK 0x1000
+#define PPLL_POSTDIV__reg_tmg_pixclk_pdiv2__SHIFT 0xc
+#define PPLL_DEBUG0__pw_pc_phase_jump_trig_MASK 0x2
+#define PPLL_DEBUG0__pw_pc_phase_jump_trig__SHIFT 0x1
+#define PPLL_DEBUG0__pw_pc_fine_tdc_dis_MASK 0x4
+#define PPLL_DEBUG0__pw_pc_fine_tdc_dis__SHIFT 0x2
+#define PPLL_DEBUG0__pw_pc_coarse_tdc_dis_MASK 0x8
+#define PPLL_DEBUG0__pw_pc_coarse_tdc_dis__SHIFT 0x3
+#define PPLL_DEBUG0__pw_pc_alt_nctl_en_MASK 0x10
+#define PPLL_DEBUG0__pw_pc_alt_nctl_en__SHIFT 0x4
+#define PPLL_DEBUG0__pw_pc_alt_nctl_MASK 0x1ffffe0
+#define PPLL_DEBUG0__pw_pc_alt_nctl__SHIFT 0x5
+#define PPLL_DEBUG0__pw_pc_nctl_coarse_step_dis_MASK 0x2000000
+#define PPLL_DEBUG0__pw_pc_nctl_coarse_step_dis__SHIFT 0x19
+#define PPLL_DEBUG0__pw_pc_trig_coarse_step_MASK 0x4000000
+#define PPLL_DEBUG0__pw_pc_trig_coarse_step__SHIFT 0x1a
+#define PPLL_DEBUG0__pw_pc_dft_sel_MASK 0x38000000
+#define PPLL_DEBUG0__pw_pc_dft_sel__SHIFT 0x1b
+#define PPLL_DEBUG0__pw_pc_dft_capture_MASK 0x40000000
+#define PPLL_DEBUG0__pw_pc_dft_capture__SHIFT 0x1e
+#define PPLL_OBSERVE0__pw_pc_lock_det_tdc_steps_MASK 0x1f
+#define PPLL_OBSERVE0__pw_pc_lock_det_tdc_steps__SHIFT 0x0
+#define PPLL_OBSERVE0__pw_pc_clear_sticky_lock_MASK 0x40
+#define PPLL_OBSERVE0__pw_pc_clear_sticky_lock__SHIFT 0x6
+#define PPLL_OBSERVE0__pw_pc_lock_det_dis_MASK 0x100
+#define PPLL_OBSERVE0__pw_pc_lock_det_dis__SHIFT 0x8
+#define PPLL_OBSERVE0__pw_pc_dco_cfg_MASK 0x3fc00
+#define PPLL_OBSERVE0__pw_pc_dco_cfg__SHIFT 0xa
+#define PPLL_OBSERVE0__pw_pc_anaobs_sel_MASK 0xe00000
+#define PPLL_OBSERVE0__pw_pc_anaobs_sel__SHIFT 0x15
+#define PPLL_OBSERVE1__pw_pc_digobs_sel_MASK 0xf
+#define PPLL_OBSERVE1__pw_pc_digobs_sel__SHIFT 0x0
+#define PPLL_OBSERVE1__pw_pc_digobs_trig_sel_MASK 0x1e0
+#define PPLL_OBSERVE1__pw_pc_digobs_trig_sel__SHIFT 0x5
+#define PPLL_OBSERVE1__pw_pc_digobs_div_MASK 0xc00
+#define PPLL_OBSERVE1__pw_pc_digobs_div__SHIFT 0xa
+#define PPLL_OBSERVE1__pw_pc_digobs_trig_div_MASK 0x3000
+#define PPLL_OBSERVE1__pw_pc_digobs_trig_div__SHIFT 0xc
+#define PPLL_OBSERVE1__reg_tmg_lock_timer_MASK 0x3fff0000
+#define PPLL_OBSERVE1__reg_tmg_lock_timer__SHIFT 0x10
+#define PPLL_UPDATE_CNTL__reg_tmg_PLL_UPDATE_LOCK_MASK 0x4
+#define PPLL_UPDATE_CNTL__reg_tmg_PLL_UPDATE_LOCK__SHIFT 0x2
+#define PPLL_UPDATE_CNTL__reg_tmg_PLL_UPDATE_POINT_MASK 0x8
+#define PPLL_UPDATE_CNTL__reg_tmg_PLL_UPDATE_POINT__SHIFT 0x3
+#define PPLL_UPDATE_CNTL__tmg_reg_UPDATE_PENDING_MASK 0x100
+#define PPLL_UPDATE_CNTL__tmg_reg_UPDATE_PENDING__SHIFT 0x8
+#define PPLL_UPDATE_CNTL__pc_pw_pll_rdy_MASK 0x200
+#define PPLL_UPDATE_CNTL__pc_pw_pll_rdy__SHIFT 0x9
+#define PPLL_UPDATE_CNTL__TieLow1_MASK 0x10000
+#define PPLL_UPDATE_CNTL__TieLow1__SHIFT 0x10
+#define PPLL_OBSERVE0_OUT__disppll_core_obsout_MASK 0xffffffff
+#define PPLL_OBSERVE0_OUT__disppll_core_obsout__SHIFT 0x0
+#define PPLL_STATUS_DEBUG1__dbg_pll_rdy_MASK 0x1
+#define PPLL_STATUS_DEBUG1__dbg_pll_rdy__SHIFT 0x0
+#define PPLL_STATUS_DEBUG1__core_disppll_pwr_ok_vddp_MASK 0x2
+#define PPLL_STATUS_DEBUG1__core_disppll_pwr_ok_vddp__SHIFT 0x1
+#define PPLL_STATUS_DEBUG1__core_disppll_rcu_dc_resetb_vddp_MASK 0x4
+#define PPLL_STATUS_DEBUG1__core_disppll_rcu_dc_resetb_vddp__SHIFT 0x2
+#define PPLL_DEBUG_MUX_CNTL__DEBUG_BUS_MUX_SEL_MASK 0x1f
+#define PPLL_DEBUG_MUX_CNTL__DEBUG_BUS_MUX_SEL__SHIFT 0x0
+#define PPLL_DIV_UPDATE_DEBUG__TieLow2_MASK 0x1
+#define PPLL_DIV_UPDATE_DEBUG__TieLow2__SHIFT 0x0
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_FB_DIV_CHANGED_MASK 0x2
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_FB_DIV_CHANGED__SHIFT 0x1
+#define PPLL_DIV_UPDATE_DEBUG__dbg_UPDATE_PENDING_MASK 0x4
+#define PPLL_DIV_UPDATE_DEBUG__dbg_UPDATE_PENDING__SHIFT 0x2
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_CURRENT_STATE_MASK 0x18
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_CURRENT_STATE__SHIFT 0x3
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_ENABLE_MASK 0x20
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_ENABLE__SHIFT 0x5
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_REQ_MASK 0x40
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_REQ__SHIFT 0x6
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_ACK_MASK 0x80
+#define PPLL_DIV_UPDATE_DEBUG__tmg_reg_UPDATE_ACK__SHIFT 0x7
+#define PPLL_STATUS_DEBUG0__obsout_MASK 0xffffffff
+#define PPLL_STATUS_DEBUG0__obsout__SHIFT 0x0
+#define COMP_EN_CTL__comp_en_MASK 0x1
+#define COMP_EN_CTL__comp_en__SHIFT 0x0
+#define COMP_EN_CTL__comp_en_override_MASK 0x4
+#define COMP_EN_CTL__comp_en_override__SHIFT 0x2
+#define COMP_EN_CTL__comp_done_MASK 0x10
+#define COMP_EN_CTL__comp_done__SHIFT 0x4
+#define COMP_EN_CTL__zcal_code_override_MASK 0x40
+#define COMP_EN_CTL__zcal_code_override__SHIFT 0x6
+#define COMP_EN_CTL__zcal_cal_rtt_MASK 0x80
+#define COMP_EN_CTL__zcal_cal_rtt__SHIFT 0x7
+#define COMP_EN_CTL__zcal_base_en_MASK 0x100
+#define COMP_EN_CTL__zcal_base_en__SHIFT 0x8
+#define COMP_EN_CTL__zcal_ht_rtt_sel_MASK 0x200
+#define COMP_EN_CTL__zcal_ht_rtt_sel__SHIFT 0x9
+#define COMP_EN_CTL__zcal_code_MASK 0x7c00
+#define COMP_EN_CTL__zcal_code__SHIFT 0xa
+#define COMP_EN_CTL__zcal_ron_cal_mode_MASK 0x10000
+#define COMP_EN_CTL__zcal_ron_cal_mode__SHIFT 0x10
+#define COMP_EN_CTL__zcal_ana_dbg_sel_MASK 0x60000
+#define COMP_EN_CTL__zcal_ana_dbg_sel__SHIFT 0x11
+#define COMP_EN_CTL__cfg_cml_cmos_sel_MASK 0x80000
+#define COMP_EN_CTL__cfg_cml_cmos_sel__SHIFT 0x13
+#define COMP_EN_CTL__dsm_sel_MASK 0xf00000
+#define COMP_EN_CTL__dsm_sel__SHIFT 0x14
+#define DPCSTX_PHY_CNTL__DPCS_PHY_RESET_MASK 0x1
+#define DPCSTX_PHY_CNTL__DPCS_PHY_RESET__SHIFT 0x0
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_GATE_DIS_MASK 0x1
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_GATE_DIS__SHIFT 0x0
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_EN_MASK 0x2
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_EN__SHIFT 0x1
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_CLOCK_ON_MASK 0x4
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_CLOCK_ON__SHIFT 0x2
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_CLOCK_ON_MASK 0x8
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_CLOCK_ON__SHIFT 0x3
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX0_EN_MASK 0x10
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX0_EN__SHIFT 0x4
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX1_EN_MASK 0x20
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX1_EN__SHIFT 0x5
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX2_EN_MASK 0x40
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX2_EN__SHIFT 0x6
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX3_EN_MASK 0x80
+#define DPCSTX_TX_CLOCK_CNTL__DPCS_SYMCLK_DIV2_TX3_EN__SHIFT 0x7
+#define DPCSTX_TX_CNTL__DPCS_TX_RESYNC_MASK 0x1
+#define DPCSTX_TX_CNTL__DPCS_TX_RESYNC__SHIFT 0x0
+#define DPCSTX_TX_CNTL__DPCS_TX_STAGGERING_EN_MASK 0x2
+#define DPCSTX_TX_CNTL__DPCS_TX_STAGGERING_EN__SHIFT 0x1
+#define DPCSTX_TX_CNTL__DPCS_TX_HIGH_IMP_IDLE_OVERRIDE_EN_MASK 0x4
+#define DPCSTX_TX_CNTL__DPCS_TX_HIGH_IMP_IDLE_OVERRIDE_EN__SHIFT 0x2
+#define DPCSTX_TX_CNTL__DPCS_TX_HIGH_IMP_IDLE_MASK 0xf0
+#define DPCSTX_TX_CNTL__DPCS_TX_HIGH_IMP_IDLE__SHIFT 0x4
+#define DPCSTX_TX_CNTL__DPCS_TX_STAGGERING_DELAY_MASK 0x700
+#define DPCSTX_TX_CNTL__DPCS_TX_STAGGERING_DELAY__SHIFT 0x8
+#define DPCSTX_TX_CNTL__DPCS_TX_PLL_UPDATE_REQ_MASK 0x1000
+#define DPCSTX_TX_CNTL__DPCS_TX_PLL_UPDATE_REQ__SHIFT 0xc
+#define DPCSTX_TX_CNTL__DPCS_TX_PLL_UPDATE_PENDING_MASK 0x2000
+#define DPCSTX_TX_CNTL__DPCS_TX_PLL_UPDATE_PENDING__SHIFT 0xd
+#define DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP_MASK 0x4000
+#define DPCSTX_TX_CNTL__DPCS_TX_DATA_SWAP__SHIFT 0xe
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_EN_MASK 0x10000
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_EN__SHIFT 0x10
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_START_MASK 0x20000
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_START__SHIFT 0x11
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_WR_START_DELAY_MASK 0xf00000
+#define DPCSTX_TX_CNTL__DPCS_TX_FIFO_WR_START_DELAY__SHIFT 0x14
+#define DPCSTX_TX_CNTL__DPCS_TX_DVI_LINK_MODE_MASK 0x3000000
+#define DPCSTX_TX_CNTL__DPCS_TX_DVI_LINK_MODE__SHIFT 0x18
+#define DPCSTX_TX_CNTL__DPCS_TX_SOFT_RESET_MASK 0x80000000
+#define DPCSTX_TX_CNTL__DPCS_TX_SOFT_RESET__SHIFT 0x1f
+#define DPCSTX_CBUS_CNTL__DPCS_CBUS_WR_CMD_DELAY_MASK 0xf
+#define DPCSTX_CBUS_CNTL__DPCS_CBUS_WR_CMD_DELAY__SHIFT 0x0
+#define DPCSTX_CBUS_CNTL__DPCS_PHY_MASTER_REQ_DELAY_MASK 0xff00
+#define DPCSTX_CBUS_CNTL__DPCS_PHY_MASTER_REQ_DELAY__SHIFT 0x8
+#define DPCSTX_CBUS_CNTL__DPCS_CBUS_SOFT_RESET_MASK 0x80000000
+#define DPCSTX_CBUS_CNTL__DPCS_CBUS_SOFT_RESET__SHIFT 0x1f
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_FIFO_OVERFLOW_MASK 0x1
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_FIFO_OVERFLOW__SHIFT 0x0
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_ERROR_CLR_MASK 0x2
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_ERROR_CLR__SHIFT 0x1
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_FIFO_ERROR_MASK_MASK 0x10
+#define DPCSTX_REG_ERROR_STATUS__DPCS_REG_FIFO_ERROR_MASK__SHIFT 0x4
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX0_FIFO_ERROR_MASK 0x1
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX0_FIFO_ERROR__SHIFT 0x0
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX1_FIFO_ERROR_MASK 0x2
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX1_FIFO_ERROR__SHIFT 0x1
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX2_FIFO_ERROR_MASK 0x4
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX2_FIFO_ERROR__SHIFT 0x2
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX3_FIFO_ERROR_MASK 0x8
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX3_FIFO_ERROR__SHIFT 0x3
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX_ERROR_CLR_MASK 0x100
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX_ERROR_CLR__SHIFT 0x8
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX_FIFO_ERROR_MASK_MASK 0x1000
+#define DPCSTX_TX_ERROR_STATUS__DPCS_TX_FIFO_ERROR_MASK__SHIFT 0xc
+#define DPCSTX_PLL_UPDATE_ADDR__DPCS_PLL_UPDATE_ADDR_MASK 0x3ffff
+#define DPCSTX_PLL_UPDATE_ADDR__DPCS_PLL_UPDATE_ADDR__SHIFT 0x0
+#define DPCSTX_PLL_UPDATE_DATA__DPCS_PLL_UPDATE_DATA_MASK 0xffffffff
+#define DPCSTX_PLL_UPDATE_DATA__DPCS_PLL_UPDATE_DATA__SHIFT 0x0
+#define DPCSTX_INDEX_MODE_ADDR__DPCS_INDEX_MODE_ADDR_MASK 0x3ffff
+#define DPCSTX_INDEX_MODE_ADDR__DPCS_INDEX_MODE_ADDR__SHIFT 0x0
+#define DPCSTX_INDEX_MODE_DATA__DPCS_INDEX_MODE_DATA_MASK 0xffffffff
+#define DPCSTX_INDEX_MODE_DATA__DPCS_INDEX_MODE_DATA__SHIFT 0x0
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_EN_MASK 0x1
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_EN__SHIFT 0x0
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CFGCLK_SEL_MASK 0x6
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CFGCLK_SEL__SHIFT 0x1
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_TX_SYMCLK_SEL_MASK 0x38
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_TX_SYMCLK_SEL__SHIFT 0x3
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CLOCK_SEL_MASK 0x700
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CLOCK_SEL__SHIFT 0x8
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_BLOCK_SEL_MASK 0x3800
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_BLOCK_SEL__SHIFT 0xb
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CBUS_DIS_MASK 0x4000
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_CBUS_DIS__SHIFT 0xe
+#define DPCSTX_DEBUG_CONFIG__DPCS_TEST_DEBUG_WRITE_EN_MASK 0x10000
+#define DPCSTX_DEBUG_CONFIG__DPCS_TEST_DEBUG_WRITE_EN__SHIFT 0x10
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_TX_SYMCLK_DIV2_SEL_MASK 0xe0000
+#define DPCSTX_DEBUG_CONFIG__DPCS_DBG_TX_SYMCLK_DIV2_SEL__SHIFT 0x11
+#define DPCSTX_DEBUG_CONFIG__DPCS_TEST_DEBUG_INDEX_MASK 0xff000000
+#define DPCSTX_DEBUG_CONFIG__DPCS_TEST_DEBUG_INDEX__SHIFT 0x18
+#define DPCSTX_TEST_DEBUG_DATA__DPCS_TEST_DEBUG_DATA_MASK 0xffffffff
+#define DPCSTX_TEST_DEBUG_DATA__DPCS_TEST_DEBUG_DATA__SHIFT 0x0
+
+#endif /* DCE_11_2_SH_MASK_H */
index a9b6923192eee358f51c202da74a483d19b4f3de..ebaf67bb1589bc8f85b77c822990d9cbc83f4a23 100644 (file)
 #define mmRLC_CGTT_MGCG_OVERRIDE                                                0xec48
 #define mmRLC_CGCG_CGLS_CTRL                                                    0xec49
 #define mmRLC_CGCG_RAMP_CTRL                                                    0xec4a
+#define mmRLC_CGCG_CGLS_CTRL_3D                                                 0xec9d
+#define mmRLC_CGCG_RAMP_CTRL_3D                                                 0xec9e
 #define mmRLC_DYN_PG_STATUS                                                     0xec4b
 #define mmRLC_DYN_PG_REQUEST                                                    0xec4c
 #define mmRLC_PG_DELAY                                                          0xec4d
index b2d4aaf045bcca565ce9537aefb4122712a4be99..6f6fb34742d299a46d2b8d50764a43f732d9de83 100644 (file)
 #define mmUVD_MIF_RECON1_ADDR_CONFIG                                            0x39c5
 #define ixUVD_MIF_SCLR_ADDR_CONFIG                                              0x4
 #define mmUVD_JPEG_ADDR_CONFIG                                                  0x3a1f
+#define mmUVD_GP_SCRATCH4                                                       0x3d38
 
 #endif /* UVD_6_0_D_H */
index eaf451e26643406118162d7868e36810b4d040e1..32f3e345de0809c8c04b62d59398b971c05be07e 100644 (file)
 #define ATOM_PPLL0            2
 #define ATOM_PPLL3            3
 
+#define ATOM_PHY_PLL0         4
+#define ATOM_PHY_PLL1         5
+
 #define ATOM_EXT_PLL1         8
+#define ATOM_GCK_DFS          8
 #define ATOM_EXT_PLL2         9
+#define ATOM_FCH_CLK          9
 #define ATOM_EXT_CLOCK        10
+#define ATOM_DP_DTO           11
+
+#define ATOM_COMBOPHY_PLL0    20
+#define ATOM_COMBOPHY_PLL1    21
+#define ATOM_COMBOPHY_PLL2    22
+#define ATOM_COMBOPHY_PLL3    23
+#define ATOM_COMBOPHY_PLL4    24
+#define ATOM_COMBOPHY_PLL5    25
+
 #define ATOM_PPLL_INVALID     0xFF
 
 #define ENCODER_REFCLK_SRC_P1PLL       0
@@ -224,6 +238,31 @@ typedef struct _ATOM_ROM_HEADER
   UCHAR  ucReserved;
 }ATOM_ROM_HEADER;
 
+
+typedef struct _ATOM_ROM_HEADER_V2_1
+{
+  ATOM_COMMON_TABLE_HEADER      sHeader;
+  UCHAR  uaFirmWareSignature[4];    //Signature to distinguish between Atombios and non-atombios,
+                                    //atombios should init it as "ATOM", don't change the position
+  USHORT usBiosRuntimeSegmentAddress;
+  USHORT usProtectedModeInfoOffset;
+  USHORT usConfigFilenameOffset;
+  USHORT usCRC_BlockOffset;
+  USHORT usBIOS_BootupMessageOffset;
+  USHORT usInt10Offset;
+  USHORT usPciBusDevInitCode;
+  USHORT usIoBaseAddress;
+  USHORT usSubsystemVendorID;
+  USHORT usSubsystemID;
+  USHORT usPCI_InfoOffset;
+  USHORT usMasterCommandTableOffset;//Offest for SW to get all command table offsets, Don't change the position
+  USHORT usMasterDataTableOffset;   //Offest for SW to get all data table offsets, Don't change the position
+  UCHAR  ucExtendedFunctionCode;
+  UCHAR  ucReserved;
+  ULONG  ulPSPDirTableOffset;
+}ATOM_ROM_HEADER_V2_1;
+
+
 //==============================Command Table Portion====================================
 
 
@@ -272,12 +311,12 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{
   USHORT GetSCLKOverMCLKRatio;                   //Atomic Table,  only used by Bios
   USHORT SetCRTC_Timing;                         //Atomic Table,  directly used by various SW components,latest version 1.1
   USHORT SetCRTC_OverScan;                       //Atomic Table,  used by various SW components,latest version 1.1
-  USHORT SetCRTC_Replication;                    //Atomic Table,  used only by Bios
+  USHORT GetSMUClockInfo;                         //Atomic Table,  used only by Bios
   USHORT SelectCRTC_Source;                      //Atomic Table,  directly used by various SW components,latest version 1.1
   USHORT EnableGraphSurfaces;                    //Atomic Table,  used only by Bios
   USHORT UpdateCRTC_DoubleBufferRegisters;       //Atomic Table,  used only by Bios
   USHORT LUT_AutoFill;                           //Atomic Table,  only used by Bios
-  USHORT EnableHW_IconCursor;                    //Atomic Table,  only used by Bios
+  USHORT SetDCEClock;                            //Atomic Table,  start from DCE11.1, shared by driver and VBIOS, change DISPCLK and DPREFCLK
   USHORT GetMemoryClock;                         //Atomic Table,  directly used by various SW components,latest version 1.1
   USHORT GetEngineClock;                         //Atomic Table,  directly used by various SW components,latest version 1.1
   USHORT SetCRTC_UsingDTDTiming;                 //Atomic Table,  directly used by various SW components,latest version 1.1
@@ -292,7 +331,7 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{
   USHORT PowerConnectorDetection;                //Atomic Table,  directly used by various SW components,latest version 1.1
   USHORT MC_Synchronization;                     //Atomic Table,  indirectly used by various SW components,called from SetMemoryClock
   USHORT ComputeMemoryEnginePLL;                 //Atomic Table,  indirectly used by various SW components,called from SetMemory/EngineClock
-  USHORT MemoryRefreshConversion;                //Atomic Table,  indirectly used by various SW components,called from SetMemory or SetEngineClock
+  USHORT Gfx_Init;                               //Atomic Table,  indirectly used by various SW components,called from SetMemory or SetEngineClock
   USHORT VRAM_GetCurrentInfoBlock;               //Atomic Table,  used only by Bios
   USHORT DynamicMemorySettings;                  //Atomic Table,  indirectly used by various SW components,called from SetMemoryClock
   USHORT MemoryTraining;                         //Atomic Table,  used only by Bios
@@ -333,6 +372,10 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{
 #define LCD1OutputControl                        HW_Misc_Operation
 #define TV1OutputControl                         Gfx_Harvesting
 #define TVEncoderControl                         SMC_Init
+#define EnableHW_IconCursor                      SetDCEClock
+#define SetCRTC_Replication                      GetSMUClockInfo
+
+#define MemoryRefreshConversion                  Gfx_Init
 
 typedef struct _ATOM_MASTER_COMMAND_TABLE
 {
@@ -425,6 +468,9 @@ typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2
 #define b3FIRST_TIME_CHANGE_CLOCK                 0x08       //Applicable to both memory and engine clock change,when set, it means this is 1st time to change clock after ASIC bootup
 #define b3SKIP_SW_PROGRAM_PLL                     0x10       //Applicable to both memory and engine clock change, when set, it means the table will not program SPLL/MPLL
 #define b3DRAM_SELF_REFRESH_EXIT                  0x20       //Applicable to DRAM self refresh exit only. when set, it means it will go to program DRAM self refresh exit path
+#define b3SRIOV_INIT_BOOT                         0x40       //Use by HV GPU driver only, to load uCode. for ASIC_InitTable SCLK parameter only
+#define b3SRIOV_LOAD_UCODE                        0x40       //Use by HV GPU driver only, to load uCode. for ASIC_InitTable SCLK parameter only
+#define b3SRIOV_SKIP_ASIC_INIT                    0x02       //Use by HV GPU driver only, skip ASIC_Init for primary adapter boot. for ASIC_InitTable SCLK parameter only
 
 typedef struct _ATOM_COMPUTE_CLOCK_FREQ
 {
@@ -518,6 +564,33 @@ typedef struct _COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_6
 //ucPllCntlFlag
 #define SPLL_CNTL_FLAG_VCO_MODE_MASK            0x03
 
+typedef struct _COMPUTE_GPU_CLOCK_INPUT_PARAMETERS_V1_7
+{
+  ATOM_COMPUTE_CLOCK_FREQ  ulClock;         //Input Parameter
+  ULONG   ulReserved[5];
+}COMPUTE_GPU_CLOCK_INPUT_PARAMETERS_V1_7;
+
+//ATOM_COMPUTE_CLOCK_FREQ.ulComputeClockFlag
+#define COMPUTE_GPUCLK_INPUT_FLAG_CLK_TYPE_MASK            0x0f
+#define COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK           0x00
+#define COMPUTE_GPUCLK_INPUT_FLAG_SCLK                     0x01
+
+typedef struct _COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_7
+{
+  COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4  ulClock;         //Output Parameter: ucPostDiv=DFS divider
+  USHORT  usSclk_fcw_frac;                  //fractional divider of fcw = usSclk_fcw_frac/65536
+  USHORT  usSclk_fcw_int;                   //integer divider of fcwc
+  UCHAR   ucSclkPostDiv;                    //PLL post divider = 2^ucSclkPostDiv
+  UCHAR   ucSclkVcoMode;                    //0: 4G~8Ghz, 1:3G~6Ghz,3: 2G~4Ghz, 2:Reserved
+  UCHAR   ucSclkPllRange;                   //GreenTable SCLK PLL range entry index ( 0~7 )
+  UCHAR   ucSscEnable;
+  USHORT  usSsc_fcw1_frac;                  //fcw1_frac when SSC enable
+  USHORT  usSsc_fcw1_int;                   //fcw1_int when SSC enable
+  USHORT  usReserved;
+  USHORT  usPcc_fcw_int;
+  USHORT  usSsc_fcw_slew_frac;              //fcw_slew_frac when SSC enable
+  USHORT  usPcc_fcw_slew_frac;
+}COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_7;
 
 // ucInputFlag
 #define ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN  1   // 1-StrobeMode, 0-PerformanceMode
@@ -557,12 +630,16 @@ typedef struct _COMPUTE_MEMORY_CLOCK_PARAM_PARAMETERS_V2_2
   ULONG ulReserved;
 }COMPUTE_MEMORY_CLOCK_PARAM_PARAMETERS_V2_2;
 
+//Input parameter of DynamicMemorySettingsTable
+//when ATOM_COMPUTE_CLOCK_FREQ.ulComputeClockFlag = COMPUTE_MEMORY_PLL_PARAM
 typedef struct _DYNAMICE_MEMORY_SETTINGS_PARAMETER
 {
   ATOM_COMPUTE_CLOCK_FREQ ulClock;
   ULONG ulReserved[2];
 }DYNAMICE_MEMORY_SETTINGS_PARAMETER;
 
+//Input parameter of DynamicMemorySettingsTable
+//when ATOM_COMPUTE_CLOCK_FREQ.ulComputeClockFlag == COMPUTE_ENGINE_PLL_PARAM
 typedef struct _DYNAMICE_ENGINE_SETTINGS_PARAMETER
 {
   ATOM_COMPUTE_CLOCK_FREQ ulClock;
@@ -570,6 +647,29 @@ typedef struct _DYNAMICE_ENGINE_SETTINGS_PARAMETER
   ULONG ulReserved;
 }DYNAMICE_ENGINE_SETTINGS_PARAMETER;
 
+//Input parameter of DynamicMemorySettingsTable ver2.1 and above
+//when ATOM_COMPUTE_CLOCK_FREQ.ulComputeClockFlag == ADJUST_MC_SETTING_PARAM
+typedef struct _DYNAMICE_MC_DPM_SETTINGS_PARAMETER
+{
+  ATOM_COMPUTE_CLOCK_FREQ ulClock;
+  UCHAR ucMclkDPMState;
+  UCHAR ucReserved[3];
+  ULONG ulReserved;
+}DYNAMICE_MC_DPM_SETTINGS_PARAMETER;
+
+//ucMclkDPMState
+#define DYNAMIC_MC_DPM_SETTING_LOW_DPM_STATE       0
+#define DYNAMIC_MC_DPM_SETTING_MEDIUM_DPM_STATE    1
+#define DYNAMIC_MC_DPM_SETTING_HIGH_DPM_STATE      2
+
+typedef union _DYNAMICE_MEMORY_SETTINGS_PARAMETER_V2_1
+{
+  DYNAMICE_MEMORY_SETTINGS_PARAMETER asMCReg;
+  DYNAMICE_ENGINE_SETTINGS_PARAMETER asMCArbReg;
+  DYNAMICE_MC_DPM_SETTINGS_PARAMETER asDPMMCReg;
+}DYNAMICE_MEMORY_SETTINGS_PARAMETER_V2_1;
+
+
 /****************************************************************************/
 // Structures used by SetEngineClockTable
 /****************************************************************************/
@@ -584,6 +684,13 @@ typedef struct _SET_ENGINE_CLOCK_PS_ALLOCATION
   COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_PS_ALLOCATION sReserved;
 }SET_ENGINE_CLOCK_PS_ALLOCATION;
 
+typedef struct _SET_ENGINE_CLOCK_PS_ALLOCATION_V1_2
+{
+  ULONG ulTargetEngineClock;          //In 10Khz unit
+  COMPUTE_GPU_CLOCK_INPUT_PARAMETERS_V1_7 sReserved;
+}SET_ENGINE_CLOCK_PS_ALLOCATION_V1_2;
+
+
 /****************************************************************************/
 // Structures used by SetMemoryClockTable
 /****************************************************************************/
@@ -827,6 +934,12 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V2
 #define ATOM_ENCODER_CMD_SETUP                        0x0f
 #define ATOM_ENCODER_CMD_SETUP_PANEL_MODE            0x10
 
+// New Command for DIGxEncoderControlTable v1.5
+#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN4    0x14
+#define ATOM_ENCODER_CMD_STREAM_SETUP                 0x0F      //change name ATOM_ENCODER_CMD_SETUP
+#define ATOM_ENCODER_CMD_LINK_SETUP                   0x11      //internal use, called by other Command Table
+#define ATOM_ENCODER_CMD_ENCODER_BLANK                0x12      //internal use, called by other Command Table
+
 // ucStatus
 #define ATOM_ENCODER_STATUS_LINK_TRAINING_COMPLETE    0x10
 #define ATOM_ENCODER_STATUS_LINK_TRAINING_INCOMPLETE  0x00
@@ -955,6 +1068,69 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V4
 #define DP_PANEL_MODE_INTERNAL_DP2_MODE                  0x01
 #define DP_PANEL_MODE_INTERNAL_DP1_MODE                  0x11
 
+
+typedef struct _ENCODER_STREAM_SETUP_PARAMETERS_V5
+{
+  UCHAR ucDigId;           // 0~6 map to DIG0~DIG6
+  UCHAR ucAction;          // =  ATOM_ENOCODER_CMD_STREAM_SETUP
+  UCHAR ucDigMode;         // ATOM_ENCODER_MODE_DP/ATOM_ENCODER_MODE_DVI/ATOM_ENCODER_MODE_HDMI
+  UCHAR ucLaneNum;         // Lane number
+  ULONG ulPixelClock;      // Pixel Clock in 10Khz
+  UCHAR ucBitPerColor;
+  UCHAR ucLinkRateIn270Mhz;//= DP link rate/270Mhz, =6: 1.62G  = 10: 2.7G, =20: 5.4Ghz, =30: 8.1Ghz etc
+  UCHAR ucReserved[2];
+}ENCODER_STREAM_SETUP_PARAMETERS_V5;
+
+typedef struct _ENCODER_LINK_SETUP_PARAMETERS_V5
+{
+  UCHAR ucDigId;           // 0~6 map to DIG0~DIG6
+  UCHAR ucAction;          // =  ATOM_ENOCODER_CMD_LINK_SETUP
+  UCHAR ucDigMode;         // ATOM_ENCODER_MODE_DP/ATOM_ENCODER_MODE_DVI/ATOM_ENCODER_MODE_HDMI
+  UCHAR ucLaneNum;         // Lane number
+  ULONG ulSymClock;        // Symbol Clock in 10Khz
+  UCHAR ucHPDSel;
+  UCHAR ucDigEncoderSel;   // DIG stream( front-end ) selection, bit0 means DIG0 FE is enable,
+  UCHAR ucReserved[2];
+}ENCODER_LINK_SETUP_PARAMETERS_V5;
+
+typedef struct _DP_PANEL_MODE_SETUP_PARAMETERS_V5
+{
+  UCHAR ucDigId;           // 0~6 map to DIG0~DIG6
+  UCHAR ucAction;          // = ATOM_ENCODER_CMD_DPLINK_SETUP
+  UCHAR ucPanelMode;       // =0:     external DP
+                           // =0x1:   internal DP2
+                           // =0x11:  internal DP1 NutMeg/Travis DP Translator
+  UCHAR ucReserved;
+  ULONG ulReserved[2];
+}DP_PANEL_MODE_SETUP_PARAMETERS_V5;
+
+typedef struct _ENCODER_GENERIC_CMD_PARAMETERS_V5
+{
+  UCHAR ucDigId;           // 0~6 map to DIG0~DIG6
+  UCHAR ucAction;          // = rest of generic encoder command which does not carry any parameters
+  UCHAR ucReserved[2];
+  ULONG ulReserved[2];
+}ENCODER_GENERIC_CMD_PARAMETERS_V5;
+
+//ucDigId
+#define ATOM_ENCODER_CONFIG_V5_DIG0_ENCODER                 0x00
+#define ATOM_ENCODER_CONFIG_V5_DIG1_ENCODER                 0x01
+#define ATOM_ENCODER_CONFIG_V5_DIG2_ENCODER                 0x02
+#define ATOM_ENCODER_CONFIG_V5_DIG3_ENCODER                 0x03
+#define ATOM_ENCODER_CONFIG_V5_DIG4_ENCODER                 0x04
+#define ATOM_ENCODER_CONFIG_V5_DIG5_ENCODER                 0x05
+#define ATOM_ENCODER_CONFIG_V5_DIG6_ENCODER                 0x06
+
+
+typedef union _DIG_ENCODER_CONTROL_PARAMETERS_V5
+{
+  ENCODER_GENERIC_CMD_PARAMETERS_V5  asCmdParam;
+  ENCODER_STREAM_SETUP_PARAMETERS_V5 asStreamParam;
+  ENCODER_LINK_SETUP_PARAMETERS_V5  asLinkParam;
+  DP_PANEL_MODE_SETUP_PARAMETERS_V5 asDPPanelModeParam;
+}DIG_ENCODER_CONTROL_PARAMETERS_V5;
+
+
 /****************************************************************************/
 // Structures used by UNIPHYTransmitterControlTable
 //                    LVTMATransmitterControlTable
@@ -1371,6 +1547,49 @@ typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5
 
 #define DIG_TRANSMITTER_CONTROL_PS_ALLOCATION_V1_5            DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5
 
+typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_6
+{
+  UCHAR ucPhyId;           // 0=UNIPHYA, 1=UNIPHYB, 2=UNIPHYC, 3=UNIPHYD, 4= UNIPHYE 5=UNIPHYF
+  UCHAR ucAction;          // define as ATOM_TRANSMITER_ACTION_xxx
+  union
+  {
+    UCHAR ucDigMode;       // ATOM_ENCODER_MODE_DP/ATOM_ENCODER_MODE_DVI/ATOM_ENCODER_MODE_HDMI
+    UCHAR ucDPLaneSet;     // DP voltage swing and pre-emphasis value defined in DPCD DP_LANE_SET, "DP_LANE_SET__xDB_y_zV"
+  };
+  UCHAR ucLaneNum;         // Lane number
+  ULONG ulSymClock;        // Symbol Clock in 10Khz
+  UCHAR ucHPDSel;          // =1: HPD1, =2: HPD2, .... =6: HPD6, =0: HPD is not assigned
+  UCHAR ucDigEncoderSel;   // DIG stream( front-end ) selection, bit0 means DIG0 FE is enable,
+  UCHAR ucConnObjId;       // Connector Object Id defined in ObjectId.h
+  UCHAR ucReserved;
+  ULONG ulReserved;
+}DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_6;
+
+
+// ucDigEncoderSel
+#define ATOM_TRANMSITTER_V6__DIGA_SEL                       0x01
+#define ATOM_TRANMSITTER_V6__DIGB_SEL                       0x02
+#define ATOM_TRANMSITTER_V6__DIGC_SEL                       0x04
+#define ATOM_TRANMSITTER_V6__DIGD_SEL                       0x08
+#define ATOM_TRANMSITTER_V6__DIGE_SEL                       0x10
+#define ATOM_TRANMSITTER_V6__DIGF_SEL                       0x20
+#define ATOM_TRANMSITTER_V6__DIGG_SEL                       0x40
+
+// ucDigMode
+#define ATOM_TRANSMITTER_DIGMODE_V6_DP                      0
+#define ATOM_TRANSMITTER_DIGMODE_V6_DVI                     2
+#define ATOM_TRANSMITTER_DIGMODE_V6_HDMI                    3
+#define ATOM_TRANSMITTER_DIGMODE_V6_DP_MST                  5
+
+//ucHPDSel
+#define ATOM_TRANSMITTER_V6_NO_HPD_SEL                      0x00
+#define ATOM_TRANSMITTER_V6_HPD1_SEL                        0x01
+#define ATOM_TRANSMITTER_V6_HPD2_SEL                        0x02
+#define ATOM_TRANSMITTER_V6_HPD3_SEL                        0x03
+#define ATOM_TRANSMITTER_V6_HPD4_SEL                        0x04
+#define ATOM_TRANSMITTER_V6_HPD5_SEL                        0x05
+#define ATOM_TRANSMITTER_V6_HPD6_SEL                        0x06
+
 
 /****************************************************************************/
 // Structures used by ExternalEncoderControlTable V1.3
@@ -1784,6 +2003,101 @@ typedef struct _GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V3
   PIXEL_CLOCK_PARAMETERS_V5 sDispClkInput;
 }GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V3;
 
+typedef struct _PIXEL_CLOCK_PARAMETERS_V7
+{
+    ULONG  ulPixelClock;               // target the pixel clock to drive the CRTC timing in unit of 100Hz.
+
+    UCHAR  ucPpll;                     // ATOM_PHY_PLL0/ATOM_PHY_PLL1/ATOM_PPLL0
+    UCHAR  ucTransmitterID;            // ASIC encoder id defined in objectId.h,
+                                       // indicate which graphic encoder will be used.
+    UCHAR  ucEncoderMode;              // Encoder mode:
+    UCHAR  ucMiscInfo;                 // bit[0]= Force program PLL for pixclk
+                                       // bit[1]= Force program PHY PLL only ( internally used by VBIOS only in DP case which PHYPLL is programmed for SYMCLK, not Pixclk )
+                                       // bit[5:4]= RefClock source for PPLL.
+                                       //          =0: XTLAIN( default mode )
+                                       //          =1: pcie
+                                       //          =2: GENLK
+    UCHAR  ucCRTC;                     // ATOM_CRTC1~6, indicate the CRTC controller to
+    UCHAR  ucDeepColorRatio;           // HDMI panel bit depth: =0: 24bpp =1:30bpp, =2:36bpp
+    UCHAR  ucReserved[2];
+    ULONG  ulReserved;
+}PIXEL_CLOCK_PARAMETERS_V7;
+
+//ucMiscInfo
+#define PIXEL_CLOCK_V7_MISC_FORCE_PROG_PPLL         0x01
+#define PIXEL_CLOCK_V7_MISC_PROG_PHYPLL             0x02
+#define PIXEL_CLOCK_V7_MISC_YUV420_MODE             0x04
+#define PIXEL_CLOCK_V7_MISC_DVI_DUALLINK_EN         0x08
+#define PIXEL_CLOCK_V7_MISC_REF_DIV_SRC             0x30
+#define PIXEL_CLOCK_V7_MISC_REF_DIV_SRC_XTALIN      0x00
+#define PIXEL_CLOCK_V7_MISC_REF_DIV_SRC_PCIE        0x10
+#define PIXEL_CLOCK_V7_MISC_REF_DIV_SRC_GENLK       0x20
+
+//ucDeepColorRatio
+#define PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_DIS          0x00      //00 - DCCG_DEEP_COLOR_DTO_DISABLE: Disable Deep Color DTO
+#define PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_5_4          0x01      //01 - DCCG_DEEP_COLOR_DTO_5_4_RATIO: Set Deep Color DTO to 5:4
+#define PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_3_2          0x02      //02 - DCCG_DEEP_COLOR_DTO_3_2_RATIO: Set Deep Color DTO to 3:2
+#define PIXEL_CLOCK_V7_DEEPCOLOR_RATIO_2_1          0x03      //03 - DCCG_DEEP_COLOR_DTO_2_1_RATIO: Set Deep Color DTO to 2:1
+
+// SetDCEClockTable input parameter for DCE11.1
+typedef struct _SET_DCE_CLOCK_PARAMETERS_V1_1
+{
+  ULONG  ulDISPClkFreq;       // target DISPCLK frquency in unit of 10kHz, return real DISPCLK frequency. when ucFlag[1]=1, in unit of 100Hz.
+  UCHAR  ucFlag;              // bit0=1: DPREFCLK bypass DFS bit0=0: DPREFCLK not bypass DFS
+  UCHAR  ucCrtc;              // use when enable DCCG pixel clock ucFlag[1]=1
+  UCHAR  ucPpllId;            // use when enable DCCG pixel clock ucFlag[1]=1
+  UCHAR  ucDeepColorRatio;    // use when enable DCCG pixel clock ucFlag[1]=1
+}SET_DCE_CLOCK_PARAMETERS_V1_1;
+
+
+typedef struct _SET_DCE_CLOCK_PS_ALLOCATION_V1_1
+{
+  SET_DCE_CLOCK_PARAMETERS_V1_1 asParam;
+  ULONG ulReserved[2];
+}SET_DCE_CLOCK_PS_ALLOCATION_V1_1;
+
+//SET_DCE_CLOCK_PARAMETERS_V1_1.ucFlag
+#define SET_DCE_CLOCK_FLAG_GEN_DPREFCLK            0x01
+#define SET_DCE_CLOCK_FLAG_DPREFCLK_BYPASS         0x01
+#define SET_DCE_CLOCK_FLAG_ENABLE_PIXCLK           0x02
+
+// SetDCEClockTable input parameter for DCE11.2( POLARIS10 and POLARIS11 ) and above
+typedef struct _SET_DCE_CLOCK_PARAMETERS_V2_1
+{
+  ULONG  ulDCEClkFreq;                               // target DCE frequency in unit of 10KHZ, return real DISPCLK/DPREFCLK frequency.
+  UCHAR  ucDCEClkType;                               // =0: DISPCLK  =1: DPREFCLK  =2: PIXCLK
+  UCHAR  ucDCEClkSrc;                                // ATOM_PLL0 or ATOM_GCK_DFS or ATOM_FCH_CLK or ATOM_COMBOPHY_PLLx
+  UCHAR  ucDCEClkFlag;                               // Bit [1:0] = PPLL ref clock source ( when ucDCEClkSrc= ATOM_PPLL0 )
+  UCHAR  ucCRTC;                                     // ucDisp Pipe Id, ATOM_CRTC0/1/2/..., use only when ucDCEClkType = PIXCLK
+}SET_DCE_CLOCK_PARAMETERS_V2_1;
+
+//ucDCEClkType
+#define DCE_CLOCK_TYPE_DISPCLK                        0
+#define DCE_CLOCK_TYPE_DPREFCLK                       1
+#define DCE_CLOCK_TYPE_PIXELCLK                       2        // used by VBIOS internally, called by SetPixelClockTable
+
+//ucDCEClkFlag when ucDCEClkType == DPREFCLK
+#define DCE_CLOCK_FLAG_PLL_REFCLK_SRC_MASK            0x03
+#define DCE_CLOCK_FLAG_PLL_REFCLK_SRC_GENERICA        0x00
+#define DCE_CLOCK_FLAG_PLL_REFCLK_SRC_GENLK           0x01
+#define DCE_CLOCK_FLAG_PLL_REFCLK_SRC_PCIE            0x02
+#define DCE_CLOCK_FLAG_PLL_REFCLK_SRC_XTALIN          0x03
+
+//ucDCEClkFlag when ucDCEClkType == PIXCLK
+#define DCE_CLOCK_FLAG_PCLK_DEEPCOLOR_RATIO_MASK      0x03
+#define DCE_CLOCK_FLAG_PCLK_DEEPCOLOR_RATIO_DIS       0x00      //00 - DCCG_DEEP_COLOR_DTO_DISABLE: Disable Deep Color DTO
+#define DCE_CLOCK_FLAG_PCLK_DEEPCOLOR_RATIO_5_4       0x01      //01 - DCCG_DEEP_COLOR_DTO_5_4_RATIO: Set Deep Color DTO to 5:4
+#define DCE_CLOCK_FLAG_PCLK_DEEPCOLOR_RATIO_3_2       0x02      //02 - DCCG_DEEP_COLOR_DTO_3_2_RATIO: Set Deep Color DTO to 3:2
+#define DCE_CLOCK_FLAG_PCLK_DEEPCOLOR_RATIO_2_1       0x03      //03 - DCCG_DEEP_COLOR_DTO_2_1_RATIO: Set Deep Color DTO to 2:1
+#define DCE_CLOCK_FLAG_PIXCLK_YUV420_MODE             0x04
+
+typedef struct _SET_DCE_CLOCK_PS_ALLOCATION_V2_1
+{
+  SET_DCE_CLOCK_PARAMETERS_V2_1 asParam;
+  ULONG ulReserved[2];
+}SET_DCE_CLOCK_PS_ALLOCATION_V2_1;
+
+
 
 /****************************************************************************/
 // Structures used by AdjustDisplayPllTable
@@ -2300,6 +2614,11 @@ typedef struct   _SET_VOLTAGE_PARAMETERS_V1_3
 #define VOLTAGE_TYPE_VDDCI                   4
 #define VOLTAGE_TYPE_VDDGFX                  5
 #define VOLTAGE_TYPE_PCC                     6
+#define VOLTAGE_TYPE_MVPP                    7
+#define VOLTAGE_TYPE_LEDDPM                  8
+#define VOLTAGE_TYPE_PCC_MVDD                9
+#define VOLTAGE_TYPE_PCIE_VDDC               10
+#define VOLTAGE_TYPE_PCIE_VDDR               11
 
 #define VOLTAGE_TYPE_GENERIC_I2C_1           0x11
 #define VOLTAGE_TYPE_GENERIC_I2C_2           0x12
@@ -2396,6 +2715,39 @@ typedef struct  _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2
   USHORT   usTDP_Power;                                  // TDP_Current in unit  of 0.1W
 }GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2;
 
+
+// New Added from CI Hawaii for GetVoltageInfoTable, input parameter structure
+typedef struct  _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_3
+{
+  UCHAR    ucVoltageType;               // Input: To tell which voltage to set up, VDDC/MVDDC/MVDDQ/VDDCI
+  UCHAR    ucVoltageMode;               // Input: Indicate action: Get voltage info
+  USHORT   usVoltageLevel;              // Input: real voltage level in unit of mv or Voltage Phase (0, 1, 2, .. ) or Leakage Id
+  ULONG    ulSCLKFreq;                  // Input: when ucVoltageMode= ATOM_GET_VOLTAGE_EVV_VOLTAGE, DPM state SCLK frequency, Define in PPTable SCLK/Voltage dependence table
+  ULONG    ulReserved[3];
+}GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_3;
+
+// New Added from CI Hawaii for EVV feature
+typedef struct  _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_3
+{
+  ULONG    ulVoltageLevel;                               // real voltage level in unit of 0.01mv
+  ULONG    ulReserved[4];
+}GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_3;
+
+
+/****************************************************************************/
+// Structures used by GetSMUClockInfo
+/****************************************************************************/
+typedef struct  _GET_SMU_CLOCK_INFO_INPUT_PARAMETER_V2_1
+{
+  ULONG ulDfsPllOutputFreq:24;
+  ULONG ucDfsDivider:8;
+}GET_SMU_CLOCK_INFO_INPUT_PARAMETER_V2_1;
+
+typedef struct  _GET_SMU_CLOCK_INFO_OUTPUT_PARAMETER_V2_1
+{
+  ULONG ulDfsOutputFreq;
+}GET_SMU_CLOCK_INFO_OUTPUT_PARAMETER_V2_1;
+
 /****************************************************************************/
 // Structures used by TVEncoderControlTable
 /****************************************************************************/
@@ -2429,13 +2781,13 @@ typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES
   USHORT        PaletteData;              // Only used by BIOS
   USHORT        LCD_Info;                 // Shared by various SW components,latest version 1.3, was called LVDS_Info
   USHORT        DIGTransmitterInfo;       // Internal used by VBIOS only version 3.1
-  USHORT        AnalogTV_Info;            // Shared by various SW components,latest version 1.1
+  USHORT        SMU_Info;                 // Shared by various SW components,latest version 1.1
   USHORT        SupportedDevicesInfo;     // Will be obsolete from R600
   USHORT        GPIO_I2C_Info;            // Shared by various SW components,latest version 1.2 will be used from R600
   USHORT        VRAM_UsageByFirmware;     // Shared by various SW components,latest version 1.3 will be used from R600
   USHORT        GPIO_Pin_LUT;             // Shared by various SW components,latest version 1.1
   USHORT        VESA_ToInternalModeLUT;   // Only used by Bios
-  USHORT        ComponentVideoInfo;       // Shared by various SW components,latest version 2.1 will be used from R600
+  USHORT        GFX_Info;                 // Shared by various SW components,latest version 2.1 will be used from R600
   USHORT        PowerPlayInfo;            // Shared by various SW components,latest version 2.1,new design from R600
   USHORT        GPUVirtualizationInfo;    // Will be obsolete from R600
   USHORT        SaveRestoreInfo;          // Only used by Bios
@@ -2455,7 +2807,7 @@ typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES
   USHORT        ASIC_ProfilingInfo;       // New table name from R600, used to be called "ASIC_VDDCI_Info" for pre-R600
   USHORT        VoltageObjectInfo;        // Shared by various SW components, latest version 1.1
   USHORT        PowerSourceInfo;          // Shared by various SW components, latest versoin 1.1
-  USHORT             ServiceInfo;
+  USHORT        ServiceInfo;
 }ATOM_MASTER_LIST_OF_DATA_TABLES;
 
 typedef struct _ATOM_MASTER_DATA_TABLE
@@ -2469,6 +2821,8 @@ typedef struct _ATOM_MASTER_DATA_TABLE
 #define DAC_Info                 PaletteData
 #define TMDS_Info                DIGTransmitterInfo
 #define CompassionateData        GPUVirtualizationInfo
+#define AnalogTV_Info            SMU_Info
+#define ComponentVideoInfo       GFX_Info
 
 /****************************************************************************/
 // Structure used in MultimediaCapabilityInfoTable
@@ -4278,10 +4632,15 @@ typedef struct _EXT_DISPLAY_PATH
 #define MAX_NUMBER_OF_EXT_DISPLAY_PATH    7
 
 //usCaps
-#define  EXT_DISPLAY_PATH_CAPS__HBR2_DISABLE               0x01
-#define  EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN             0x02
-#define  EXT_DISPLAY_PATH_CAPS__HDMI20_PI3EQX1204          0x04
-#define  EXT_DISPLAY_PATH_CAPS__HDMI20_TISN65DP159RSBT     0x08
+#define  EXT_DISPLAY_PATH_CAPS__HBR2_DISABLE               0x0001
+#define  EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN             0x0002
+#define  EXT_DISPLAY_PATH_CAPS__EXT_CHIP_MASK              0x007C
+#define  EXT_DISPLAY_PATH_CAPS__HDMI20_PI3EQX1204          (0x01 << 2 )     //PI redriver chip
+#define  EXT_DISPLAY_PATH_CAPS__HDMI20_TISN65DP159RSBT     (0x02 << 2 )     //TI retimer chip
+#define  EXT_DISPLAY_PATH_CAPS__HDMI20_PARADE_PS175        (0x03 << 2 )     //Parade DP->HDMI recoverter chip
+
+
+
 
 typedef  struct _ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO
 {
@@ -4325,10 +4684,10 @@ typedef struct _ATOM_COMMON_RECORD_HEADER
 #define ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE          19
 #define ATOM_ENCODER_CAP_RECORD_TYPE                   20
 #define ATOM_BRACKET_LAYOUT_RECORD_TYPE                21
-
+#define ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE     22
 
 //Must be updated when new record type is added,equal to that record definition!
-#define ATOM_MAX_OBJECT_RECORD_NUMBER             ATOM_ENCODER_CAP_RECORD_TYPE
+#define ATOM_MAX_OBJECT_RECORD_NUMBER                  ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD_TYPE
 
 typedef struct  _ATOM_I2C_RECORD
 {
@@ -4458,10 +4817,12 @@ typedef struct  _ATOM_ENCODER_DVO_CF_RECORD
   UCHAR                       ucPadding[2];
 }ATOM_ENCODER_DVO_CF_RECORD;
 
-// Bit maps for ATOM_ENCODER_CAP_RECORD.ucEncoderCap
-#define ATOM_ENCODER_CAP_RECORD_HBR2                  0x01         // DP1.2 HBR2 is supported by HW encoder
+// Bit maps for ATOM_ENCODER_CAP_RECORD.usEncoderCap
+#define ATOM_ENCODER_CAP_RECORD_HBR2                  0x01         // DP1.2 HBR2 is supported by HW encoder, it is retired in NI. the real meaning from SI is MST_EN
+#define ATOM_ENCODER_CAP_RECORD_MST_EN                0x01         // from SI, this bit means DP MST is enable or not.
 #define ATOM_ENCODER_CAP_RECORD_HBR2_EN               0x02         // DP1.2 HBR2 setting is qualified and HBR2 can be enabled
 #define ATOM_ENCODER_CAP_RECORD_HDMI6Gbps_EN          0x04         // HDMI2.0 6Gbps enable or not.
+#define ATOM_ENCODER_CAP_RECORD_HBR3_EN               0x08         // DP1.3 HBR3 is supported by board.
 
 typedef struct  _ATOM_ENCODER_CAP_RECORD
 {
@@ -4482,6 +4843,31 @@ typedef struct  _ATOM_ENCODER_CAP_RECORD
   };
 }ATOM_ENCODER_CAP_RECORD;
 
+// Used after SI
+typedef struct  _ATOM_ENCODER_CAP_RECORD_V2
+{
+  ATOM_COMMON_RECORD_HEADER   sheader;
+  union {
+    USHORT                    usEncoderCap;
+    struct {
+#if ATOM_BIG_ENDIAN
+      USHORT                  usReserved:12;        // Bit4-15 may be defined for other capability in future
+      USHORT                  usHBR3En:1;           // bit3 is for DP1.3 HBR3 enable
+      USHORT                  usHDMI6GEn:1;         // Bit2 is for HDMI6Gbps enable, this bit is used starting from CZ( APU) Ellemere (dGPU)
+      USHORT                  usHBR2En:1;           // Bit1 is for DP1.2 HBR2 enable
+      USHORT                  usMSTEn:1;            // Bit0 is for DP1.2 MST enable
+#else
+      USHORT                  usMSTEn:1;            // Bit0 is for DP1.2 MST enable
+      USHORT                  usHBR2En:1;           // Bit1 is for DP1.2 HBR2 enable
+      USHORT                  usHDMI6GEn:1;         // Bit2 is for HDMI6Gbps enable, this bit is used starting from CZ( APU) Ellemere (dGPU)
+      USHORT                  usHBR3En:1;           // bit3 is for DP1.3 HBR3 enable
+      USHORT                  usReserved:12;        // Bit4-15 may be defined for other capability in future
+#endif
+    };
+  };
+}ATOM_ENCODER_CAP_RECORD_V2;
+
+
 // value for ATOM_CONNECTOR_CF_RECORD.ucConnectedDvoBundle
 #define ATOM_CONNECTOR_CF_RECORD_CONNECTED_UPPER12BITBUNDLEA   1
 #define ATOM_CONNECTOR_CF_RECORD_CONNECTED_LOWER12BITBUNDLEB   2
@@ -4554,6 +4940,16 @@ typedef struct _ATOM_CONNECTOR_REMOTE_CAP_RECORD
   USHORT                      usReserved;
 }ATOM_CONNECTOR_REMOTE_CAP_RECORD;
 
+
+typedef struct  _ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD
+{
+  ATOM_COMMON_RECORD_HEADER   sheader;
+  // override TMDS capability on this connector when it operate in TMDS mode.  usMaxTmdsClkRate = max TMDS Clock in Mhz/2.5
+  UCHAR                       ucMaxTmdsClkRateIn2_5Mhz;
+  UCHAR                       ucReserved;
+} ATOM_CONNECTOR_FORCED_TMDS_CAP_RECORD;
+
+
 typedef struct  _ATOM_CONNECTOR_LAYOUT_INFO
 {
    USHORT usConnectorObjectId;
@@ -4657,12 +5053,12 @@ typedef struct _ATOM_VOLTAGE_CONTROL
 #define VOLTAGE_CONTROL_ID_UP1801             0x0C
 #define VOLTAGE_CONTROL_ID_ST6788A            0x0D
 #define VOLTAGE_CONTROL_ID_CHLIR3564SVI2      0x0E
-#define VOLTAGE_CONTROL_ID_AD527x                    0x0F
-#define VOLTAGE_CONTROL_ID_NCP81022                  0x10
-#define VOLTAGE_CONTROL_ID_LTC2635                       0x11
-#define VOLTAGE_CONTROL_ID_NCP4208               0x12
+#define VOLTAGE_CONTROL_ID_AD527x             0x0F
+#define VOLTAGE_CONTROL_ID_NCP81022           0x10
+#define VOLTAGE_CONTROL_ID_LTC2635            0x11
+#define VOLTAGE_CONTROL_ID_NCP4208            0x12
 #define VOLTAGE_CONTROL_ID_IR35xx             0x13
-#define VOLTAGE_CONTROL_ID_RT9403                0x14
+#define VOLTAGE_CONTROL_ID_RT9403             0x14
 
 #define VOLTAGE_CONTROL_ID_GENERIC_I2C        0x40
 
@@ -4784,11 +5180,38 @@ typedef struct  _ATOM_SVID2_VOLTAGE_OBJECT_V3
    ULONG    ulReserved;
 }ATOM_SVID2_VOLTAGE_OBJECT_V3;
 
+
+
+typedef struct  _ATOM_MERGED_VOLTAGE_OBJECT_V3
+{
+   ATOM_VOLTAGE_OBJECT_HEADER_V3 sHeader;    // voltage mode = VOLTAGE_OBJ_MERGED_POWER
+   UCHAR    ucMergedVType;                   // VDDC/VDCCI/....
+   UCHAR    ucReserved[3];
+}ATOM_MERGED_VOLTAGE_OBJECT_V3;
+
+
+typedef struct _ATOM_EVV_DPM_INFO
+{
+  ULONG ulDPMSclk;            // DPM state SCLK
+  USHORT usVAdjOffset;        // Adjust Voltage offset in unit of mv
+  UCHAR ucDPMTblVIndex;       // Voltage Index in SMC_DPM_Table structure VddcTable/VddGfxTable
+  UCHAR ucDPMState;           // DPMState0~7
+} ATOM_EVV_DPM_INFO;
+
+// ucVoltageMode = VOLTAGE_OBJ_EVV
+typedef struct  _ATOM_EVV_VOLTAGE_OBJECT_V3
+{
+  ATOM_VOLTAGE_OBJECT_HEADER_V3 sHeader;    // voltage mode = VOLTAGE_OBJ_SVID2
+  ATOM_EVV_DPM_INFO asEvvDpmList[8];
+}ATOM_EVV_VOLTAGE_OBJECT_V3;
+
+
 typedef union _ATOM_VOLTAGE_OBJECT_V3{
   ATOM_GPIO_VOLTAGE_OBJECT_V3 asGpioVoltageObj;
   ATOM_I2C_VOLTAGE_OBJECT_V3 asI2cVoltageObj;
   ATOM_LEAKAGE_VOLTAGE_OBJECT_V3 asLeakageObj;
   ATOM_SVID2_VOLTAGE_OBJECT_V3 asSVID2Obj;
+  ATOM_EVV_VOLTAGE_OBJECT_V3 asEvvObj;
 }ATOM_VOLTAGE_OBJECT_V3;
 
 typedef struct  _ATOM_VOLTAGE_OBJECT_INFO_V3_1
@@ -4963,7 +5386,11 @@ typedef struct  _ATOM_ASIC_PROFILING_INFO_V3_3
   ULONG  ulLkgEncodeMax;
   ULONG  ulLkgEncodeMin;
   ULONG  ulEfuseLogisticAlpha;
+
+  union{
   USHORT usPowerDpm0;
+  USHORT usParamNegFlag;          //bit0 =1 :indicate ulRoBeta is Negative, bit1=1 indicate Kv_m  max is postive
+  };
   USHORT usPowerDpm1;
   USHORT usPowerDpm2;
   USHORT usPowerDpm3;
@@ -5067,6 +5494,86 @@ typedef struct  _ATOM_ASIC_PROFILING_INFO_V3_4
   ULONG ulReserved[8];            // Reserved for future ASIC
 }ATOM_ASIC_PROFILING_INFO_V3_4;
 
+// for  Polaris10/Polaris11 speed EVV algorithm
+typedef struct  _ATOM_ASIC_PROFILING_INFO_V3_5
+{
+  ATOM_COMMON_TABLE_HEADER         asHeader;
+  ULONG  ulMaxVddc;               //Maximum voltage for all parts, in unit of 0.01mv
+  ULONG  ulMinVddc;               //Minimum voltage for all parts, in unit of 0.01mv
+  USHORT usLkgEuseIndex;          //Efuse Lkg_FT address ( BYTE address )
+  UCHAR  ucLkgEfuseBitLSB;        //Efuse Lkg_FT bit shift in 32bit DWORD
+  UCHAR  ucLkgEfuseLength;        //Efuse Lkg_FT length
+  ULONG  ulLkgEncodeLn_MaxDivMin; //value of ln(Max_Lkg_Ft/Min_Lkg_Ft ) in unit of 0.00001 ( unit=100000 )
+  ULONG  ulLkgEncodeMax;          //Maximum Lkg_Ft measured value ( or efuse decode value ), in unit of 0.00001 ( unit=100000 )
+  ULONG  ulLkgEncodeMin;          //Minimum Lkg_Ft measured value ( or efuse decode value ), in unit of 0.00001 ( unit=100000 )
+  EFUSE_LINEAR_FUNC_PARAM sRoFuse;//Efuse RO info: DWORD address, bit shift, length, max/min measure value. in unit of 1.
+  ULONG  ulEvvDefaultVddc;        //def="EVV_DEFAULT_VDDC" descr="return default VDDC(v) when Efuse not cut" unit="100000"/>
+  ULONG  ulEvvNoCalcVddc;         //def="EVV_NOCALC_VDDC" descr="return VDDC(v) when Calculation is bad" unit="100000"/>
+  ULONG  ulSpeed_Model;           //def="EVV_SPEED_MODEL" descr="0 = Greek model, 1 = multivariate model" unit="1"/>
+  ULONG  ulSM_A0;                 //def="EVV_SM_A0" descr="Leakage coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A1;                 //def="EVV_SM_A1" descr="Leakage/SCLK coeff(Multivariant Mode)." unit="1000000"/>
+  ULONG  ulSM_A2;                 //def="EVV_SM_A2" descr="Alpha( Greek Mode ) or VDDC/SCLK coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A3;                 //def="EVV_SM_A3" descr="Beta( Greek Mode ) or SCLK coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A4;                 //def="EVV_SM_A4" descr="VDDC^2/SCLK coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A5;                 //def="EVV_SM_A5" descr="VDDC^2 coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A6;                 //def="EVV_SM_A6" descr="Gamma( Greek Mode ) or VDDC coeff(Multivariant Mode)." unit="100000"/>
+  ULONG  ulSM_A7;                 //def="EVV_SM_A7" descr="Epsilon( Greek Mode ) or constant(Multivariant Mode)." unit="100000"/>
+  UCHAR  ucSM_A0_sign;            //def="EVV_SM_A0_SIGN" descr="=0 SM_A0 is postive. =1: SM_A0 is negative" unit="1"/>
+  UCHAR  ucSM_A1_sign;            //def="EVV_SM_A1_SIGN" descr="=0 SM_A1 is postive. =1: SM_A1 is negative" unit="1"/>
+  UCHAR  ucSM_A2_sign;            //def="EVV_SM_A2_SIGN" descr="=0 SM_A2 is postive. =1: SM_A2 is negative" unit="1"/>
+  UCHAR  ucSM_A3_sign;            //def="EVV_SM_A3_SIGN" descr="=0 SM_A3 is postive. =1: SM_A3 is negative" unit="1"/>
+  UCHAR  ucSM_A4_sign;            //def="EVV_SM_A4_SIGN" descr="=0 SM_A4 is postive. =1: SM_A4 is negative" unit="1"/>
+  UCHAR  ucSM_A5_sign;            //def="EVV_SM_A5_SIGN" descr="=0 SM_A5 is postive. =1: SM_A5 is negative" unit="1"/>
+  UCHAR  ucSM_A6_sign;            //def="EVV_SM_A6_SIGN" descr="=0 SM_A6 is postive. =1: SM_A6 is negative" unit="1"/>
+  UCHAR  ucSM_A7_sign;            //def="EVV_SM_A7_SIGN" descr="=0 SM_A7 is postive. =1: SM_A7 is negative" unit="1"/>
+  ULONG  ulMargin_RO_a;           //def="EVV_MARGIN_RO_A" descr="A Term to represent RO equation in Ax2+Bx+C, unit=1"
+  ULONG  ulMargin_RO_b;           //def="EVV_MARGIN_RO_B" descr="B Term to represent RO equation in Ax2+Bx+C, unit=1"
+  ULONG  ulMargin_RO_c;           //def="EVV_MARGIN_RO_C" descr="C Term to represent RO equation in Ax2+Bx+C, unit=1"
+  ULONG  ulMargin_fixed;          //def="EVV_MARGIN_FIXED" descr="Fixed MHz to add to SCLK margin, unit=1" unit="1"/>
+  ULONG  ulMargin_Fmax_mean;      //def="EVV_MARGIN_FMAX_MEAN" descr="Percentage to add for Fmas mean margin unit=10000" unit="10000"/>
+  ULONG  ulMargin_plat_mean;      //def="EVV_MARGIN_PLAT_MEAN" descr="Percentage to add for platform mean margin unit=10000" unit="10000"/>
+  ULONG  ulMargin_Fmax_sigma;     //def="EVV_MARGIN_FMAX_SIGMA" descr="Percentage to add for Fmax sigma margin unit=10000" unit="10000"/>
+  ULONG  ulMargin_plat_sigma;     //def="EVV_MARGIN_PLAT_SIGMA" descr="Percentage to add for platform sigma margin unit=10000" unit="10000"/>
+  ULONG  ulMargin_DC_sigma;       //def="EVV_MARGIN_DC_SIGMA" descr="Regulator DC tolerance margin (mV) unit=100" unit="100"/>
+  ULONG  ulReserved[12];
+}ATOM_ASIC_PROFILING_INFO_V3_5;
+
+
+typedef struct _ATOM_SCLK_FCW_RANGE_ENTRY_V1{
+  ULONG  ulMaxSclkFreq;
+  UCHAR  ucVco_setting;      // 1: 3-6GHz, 3: 2-4GHz
+  UCHAR  ucPostdiv;          // divide by 2^n
+  USHORT ucFcw_pcc;
+  USHORT ucFcw_trans_upper;
+  USHORT ucRcw_trans_lower;
+}ATOM_SCLK_FCW_RANGE_ENTRY_V1;
+
+
+// SMU_InfoTable for  Polaris10/Polaris11
+typedef struct  _ATOM_SMU_INFO_V2_1
+{
+  ATOM_COMMON_TABLE_HEADER         asHeader;
+  UCHAR ucSclkEntryNum;            // for potential future extend, indicate the number of ATOM_SCLK_FCW_RANGE_ENTRY_V1
+  UCHAR ucReserved[3];
+  ATOM_SCLK_FCW_RANGE_ENTRY_V1     asSclkFcwRangeEntry[8];
+}ATOM_SMU_INFO_V2_1;
+
+
+// GFX_InfoTable for Polaris10/Polaris11
+typedef struct  _ATOM_GFX_INFO_V2_1
+{
+  ATOM_COMMON_TABLE_HEADER asHeader;
+  UCHAR GfxIpMinVer;
+  UCHAR GfxIpMajVer;
+  UCHAR max_shader_engines;
+  UCHAR max_tile_pipes;
+  UCHAR max_cu_per_sh;
+  UCHAR max_sh_per_se;
+  UCHAR max_backends_per_se;
+  UCHAR max_texture_channel_caches;
+}ATOM_GFX_INFO_V2_1;
+
+
 typedef struct _ATOM_POWER_SOURCE_OBJECT
 {
    UCHAR  ucPwrSrcId;                                   // Power source
@@ -5765,14 +6272,6 @@ sExtDispConnInfo:                 Display connector information table provided t
 
 **********************************************************************************************************************/
 
-// this Table is used for Kaveri/Kabini APU
-typedef struct _ATOM_FUSION_SYSTEM_INFO_V2
-{
-  ATOM_INTEGRATED_SYSTEM_INFO_V1_8    sIntegratedSysInfo;       // refer to ATOM_INTEGRATED_SYSTEM_INFO_V1_8 definition
-  ULONG                               ulPowerplayTable[128];    // Update comments here to link new powerplay table definition structure
-}ATOM_FUSION_SYSTEM_INFO_V2;
-
-
 typedef struct _ATOM_I2C_REG_INFO
 {
   UCHAR ucI2cRegIndex;
@@ -5859,7 +6358,50 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_9
 #define EDP_VS_VARIABLE_PREM_MODE           5
 
 
-// this IntegrateSystemInfoTable is used for Carrizo
+// ulGPUCapInfo
+#define SYS_INFO_V1_9_GPUCAPSINFO_DISABLE_AUX_MODE_DETECT                         0x08
+#define SYS_INFO_V1_9_GPUCAPSINFO_ENABEL_DFS_BYPASS                               0x10
+//ulGPUCapInfo[16]=1 indicate SMC firmware is able to support GNB fast resume function, so that driver can call SMC to program most of GNB register during resuming, from ML
+#define SYS_INFO_V1_9_GPUCAPSINFO_GNB_FAST_RESUME_CAPABLE                         0x00010000
+//ulGPUCapInfo[18]=1 indicate the IOMMU is not available
+#define SYS_INFO_V1_9_GPUCAPINFO_IOMMU_DISABLE                                    0x00040000
+//ulGPUCapInfo[19]=1 indicate the MARC Aperture is opened.
+#define SYS_INFO_V1_9_GPUCAPINFO_MARC_APERTURE_ENABLE                             0x00080000
+
+
+typedef struct _DPHY_TIMING_PARA
+{
+    UCHAR  ucProfileID;       // SENSOR_PROFILES
+    ULONG  ucPara;
+} DPHY_TIMING_PARA;
+
+typedef struct _DPHY_ELEC_PARA
+{
+    USHORT  usPara[3];
+} DPHY_ELEC_PARA;
+
+typedef struct _CAMERA_MODULE_INFO
+{
+    UCHAR    ucID;                    // 0: Rear, 1: Front right of user, 2: Front left of user
+    UCHAR    strModuleName[8];
+    DPHY_TIMING_PARA asTimingPara[6]; // Exact number is under estimation and confirmation from sensor vendor
+} CAMERA_MODULE_INFO;
+
+typedef struct _FLASHLIGHT_INFO
+{
+    UCHAR    ucID;         // 0: Rear, 1: Front
+    UCHAR    strName[8];
+} FLASHLIGHT_INFO;
+
+typedef struct _CAMERA_DATA
+{
+    ULONG                   ulVersionCode;
+    CAMERA_MODULE_INFO      asCameraInfo[3];     // Assuming 3 camera sensors max
+    FLASHLIGHT_INFO         asFlashInfo;      // Assuming 1 flashlight max
+    DPHY_ELEC_PARA          asDphyElecPara;
+    ULONG                   ulCrcVal;         // CRC
+}CAMERA_DATA;
+
 typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_10
 {
   ATOM_COMMON_TABLE_HEADER   sHeader;
@@ -5883,7 +6425,7 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_10
   USHORT usPanelRefreshRateRange;
   UCHAR  ucMemoryType;
   UCHAR  ucUMAChannelNumber;
-  UCHAR  strVBIOSMsg[40];
+  ULONG  ulMsgReserved[10];
   ATOM_TDP_CONFIG  asTdpConfig;
   ULONG  ulReserved[7];
   ATOM_CLK_VOLT_CAPABILITY_V2   sDispClkVoltageMapping[8];
@@ -5925,8 +6467,27 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_10
   UCHAR  ucEDPv1_4VSMode;
   UCHAR  ucReserved2;
   ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO sExtDispConnInfo;
+  CAMERA_DATA asCameraInfo;
+  ULONG  ulReserved8[29];
 }ATOM_INTEGRATED_SYSTEM_INFO_V1_10;
 
+
+// this Table is used for Kaveri/Kabini APU
+typedef struct _ATOM_FUSION_SYSTEM_INFO_V2
+{
+  ATOM_INTEGRATED_SYSTEM_INFO_V1_8    sIntegratedSysInfo;       // refer to ATOM_INTEGRATED_SYSTEM_INFO_V1_8 definition
+  ULONG                               ulPowerplayTable[128];    // Update comments here to link new powerplay table definition structure
+}ATOM_FUSION_SYSTEM_INFO_V2;
+
+
+typedef struct _ATOM_FUSION_SYSTEM_INFO_V3
+{
+  ATOM_INTEGRATED_SYSTEM_INFO_V1_10   sIntegratedSysInfo;           // refer to ATOM_INTEGRATED_SYSTEM_INFO_V1_8 definition
+  ULONG                               ulPowerplayTable[192];        // Reserve 768 bytes space for PowerPlayInfoTable
+}ATOM_FUSION_SYSTEM_INFO_V3;
+
+#define FUSION_V3_OFFSET_FROM_TOP_OF_FB 0x800
+
 /**************************************************************************/
 // This portion is only used when ext thermal chip or engine/memory clock SS chip is populated on a design
 //Memory SS Info Table
@@ -6193,12 +6754,12 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
 #define ATOM_S3_DFP1_ACTIVE             0x00000008L
 #define ATOM_S3_CRT2_ACTIVE             0x00000010L
 #define ATOM_S3_LCD2_ACTIVE             0x00000020L
-#define ATOM_S3_DFP6_ACTIVE                     0x00000040L
+#define ATOM_S3_DFP6_ACTIVE             0x00000040L
 #define ATOM_S3_DFP2_ACTIVE             0x00000080L
 #define ATOM_S3_CV_ACTIVE               0x00000100L
-#define ATOM_S3_DFP3_ACTIVE                     0x00000200L
-#define ATOM_S3_DFP4_ACTIVE                     0x00000400L
-#define ATOM_S3_DFP5_ACTIVE                     0x00000800L
+#define ATOM_S3_DFP3_ACTIVE             0x00000200L
+#define ATOM_S3_DFP4_ACTIVE             0x00000400L
+#define ATOM_S3_DFP5_ACTIVE             0x00000800L
 
 
 #define ATOM_S3_DEVICE_ACTIVE_MASK      0x00000FFFL
@@ -6215,9 +6776,9 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
 #define ATOM_S3_DFP6_CRTC_ACTIVE        0x00400000L
 #define ATOM_S3_DFP2_CRTC_ACTIVE        0x00800000L
 #define ATOM_S3_CV_CRTC_ACTIVE          0x01000000L
-#define ATOM_S3_DFP3_CRTC_ACTIVE            0x02000000L
-#define ATOM_S3_DFP4_CRTC_ACTIVE            0x04000000L
-#define ATOM_S3_DFP5_CRTC_ACTIVE            0x08000000L
+#define ATOM_S3_DFP3_CRTC_ACTIVE        0x02000000L
+#define ATOM_S3_DFP4_CRTC_ACTIVE        0x04000000L
+#define ATOM_S3_DFP5_CRTC_ACTIVE        0x08000000L
 
 
 #define ATOM_S3_DEVICE_CRTC_ACTIVE_MASK 0x0FFF0000L
@@ -6238,9 +6799,9 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
 #define ATOM_S3_DFP6_ACTIVEb0           0x40
 #define ATOM_S3_DFP2_ACTIVEb0           0x80
 #define ATOM_S3_CV_ACTIVEb1             0x01
-#define ATOM_S3_DFP3_ACTIVEb1                  0x02
-#define ATOM_S3_DFP4_ACTIVEb1                  0x04
-#define ATOM_S3_DFP5_ACTIVEb1                  0x08
+#define ATOM_S3_DFP3_ACTIVEb1           0x02
+#define ATOM_S3_DFP4_ACTIVEb1           0x04
+#define ATOM_S3_DFP5_ACTIVEb1           0x08
 
 
 #define ATOM_S3_ACTIVE_CRTC1w0          0xFFF
@@ -6254,9 +6815,9 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3
 #define ATOM_S3_DFP6_CRTC_ACTIVEb2      0x40
 #define ATOM_S3_DFP2_CRTC_ACTIVEb2      0x80
 #define ATOM_S3_CV_CRTC_ACTIVEb3        0x01
-#define ATOM_S3_DFP3_CRTC_ACTIVEb3         0x02
-#define ATOM_S3_DFP4_CRTC_ACTIVEb3         0x04
-#define ATOM_S3_DFP5_CRTC_ACTIVEb3         0x08
+#define ATOM_S3_DFP3_CRTC_ACTIVEb3      0x02
+#define ATOM_S3_DFP4_CRTC_ACTIVEb3      0x04
+#define ATOM_S3_DFP5_CRTC_ACTIVEb3      0x08
 
 
 #define ATOM_S3_ACTIVE_CRTC2w1          0xFFF
@@ -6878,15 +7439,18 @@ typedef struct _ATOM_MC_INIT_PARAM_TABLE_V2_1
 #define _32Mx16             0x32
 #define _32Mx32             0x33
 #define _32Mx128            0x35
-#define _64Mx32             0x43
 #define _64Mx8              0x41
 #define _64Mx16             0x42
+#define _64Mx32             0x43
+#define _64Mx128            0x45
 #define _128Mx8             0x51
 #define _128Mx16            0x52
 #define _128Mx32            0x53
 #define _256Mx8             0x61
 #define _256Mx16            0x62
+#define _256Mx32            0x63
 #define _512Mx8             0x71
+#define _512Mx16            0x72
 
 
 #define SAMSUNG             0x1
@@ -7407,6 +7971,17 @@ typedef struct _ATOM_MEMORY_TRAINING_INFO
 }ATOM_MEMORY_TRAINING_INFO;
 
 
+typedef struct _ATOM_MEMORY_TRAINING_INFO_V3_1
+{
+   ATOM_COMMON_TABLE_HEADER   sHeader;
+   ULONG                      ulMCUcodeVersion;
+   USHORT                     usMCIOInitLen;         //len of ATOM_REG_INIT_SETTING array
+   USHORT                     usMCUcodeLen;          //len of ATOM_MC_UCODE_DATA array
+   USHORT                     usMCIORegInitOffset;   //point of offset of ATOM_REG_INIT_SETTING array
+   USHORT                     usMCUcodeOffset;       //point of offset of MC uCode ULONG array.
+}ATOM_MEMORY_TRAINING_INFO_V3_1;
+
+
 typedef struct SW_I2C_CNTL_DATA_PARAMETERS
 {
   UCHAR    ucControl;
@@ -7623,7 +8198,7 @@ typedef struct _ASIC_TRANSMITTER_INFO
 {
    USHORT usTransmitterObjId;
    USHORT usSupportDevice;
-  UCHAR  ucTransmitterCmdTblId;
+   UCHAR  ucTransmitterCmdTblId;
    UCHAR  ucConfig;
    UCHAR  ucEncoderID;                //available 1st encoder ( default )
    UCHAR  ucOptionEncoderID;    //available 2nd encoder ( optional )
index ab84d494724774d77100756c85c6d2a689b25516..a461e155a160240f7f127c156b902b56651c523b 100644 (file)
@@ -26,6 +26,8 @@
 
 #include "amd_shared.h"
 
+struct cgs_device;
+
 /**
  * enum cgs_gpu_mem_type - GPU memory types
  */
@@ -92,6 +94,7 @@ enum cgs_voltage_planes {
  */
 enum cgs_ucode_id {
        CGS_UCODE_ID_SMU = 0,
+       CGS_UCODE_ID_SMU_SK,
        CGS_UCODE_ID_SDMA0,
        CGS_UCODE_ID_SDMA1,
        CGS_UCODE_ID_CP_CE,
@@ -111,6 +114,7 @@ enum cgs_system_info_id {
        CGS_SYSTEM_INFO_PCIE_MLW,
        CGS_SYSTEM_INFO_CG_FLAGS,
        CGS_SYSTEM_INFO_PG_FLAGS,
+       CGS_SYSTEM_INFO_GFX_CU_INFO,
        CGS_SYSTEM_INFO_ID_MAXIMUM,
 };
 
@@ -223,7 +227,7 @@ struct cgs_acpi_method_info {
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_gpu_mem_info_t)(void *cgs_device, enum cgs_gpu_mem_type type,
+typedef int (*cgs_gpu_mem_info_t)(struct cgs_device *cgs_device, enum cgs_gpu_mem_type type,
                                  uint64_t *mc_start, uint64_t *mc_size,
                                  uint64_t *mem_size);
 
@@ -239,7 +243,7 @@ typedef int (*cgs_gpu_mem_info_t)(void *cgs_device, enum cgs_gpu_mem_type type,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_gmap_kmem_t)(void *cgs_device, void *kmem, uint64_t size,
+typedef int (*cgs_gmap_kmem_t)(struct cgs_device *cgs_device, void *kmem, uint64_t size,
                               uint64_t min_offset, uint64_t max_offset,
                               cgs_handle_t *kmem_handle, uint64_t *mcaddr);
 
@@ -250,7 +254,7 @@ typedef int (*cgs_gmap_kmem_t)(void *cgs_device, void *kmem, uint64_t size,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_gunmap_kmem_t)(void *cgs_device, cgs_handle_t kmem_handle);
+typedef int (*cgs_gunmap_kmem_t)(struct cgs_device *cgs_device, cgs_handle_t kmem_handle);
 
 /**
  * cgs_alloc_gpu_mem() - Allocate GPU memory
@@ -279,7 +283,7 @@ typedef int (*cgs_gunmap_kmem_t)(void *cgs_device, cgs_handle_t kmem_handle);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_alloc_gpu_mem_t)(void *cgs_device, enum cgs_gpu_mem_type type,
+typedef int (*cgs_alloc_gpu_mem_t)(struct cgs_device *cgs_device, enum cgs_gpu_mem_type type,
                                   uint64_t size, uint64_t align,
                                   uint64_t min_offset, uint64_t max_offset,
                                   cgs_handle_t *handle);
@@ -291,7 +295,7 @@ typedef int (*cgs_alloc_gpu_mem_t)(void *cgs_device, enum cgs_gpu_mem_type type,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_free_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
+typedef int (*cgs_free_gpu_mem_t)(struct cgs_device *cgs_device, cgs_handle_t handle);
 
 /**
  * cgs_gmap_gpu_mem() - GPU-map GPU memory
@@ -303,7 +307,7 @@ typedef int (*cgs_free_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_gmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle,
+typedef int (*cgs_gmap_gpu_mem_t)(struct cgs_device *cgs_device, cgs_handle_t handle,
                                  uint64_t *mcaddr);
 
 /**
@@ -315,7 +319,7 @@ typedef int (*cgs_gmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_gunmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
+typedef int (*cgs_gunmap_gpu_mem_t)(struct cgs_device *cgs_device, cgs_handle_t handle);
 
 /**
  * cgs_kmap_gpu_mem() - Kernel-map GPU memory
@@ -326,7 +330,7 @@ typedef int (*cgs_gunmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_kmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle,
+typedef int (*cgs_kmap_gpu_mem_t)(struct cgs_device *cgs_device, cgs_handle_t handle,
                                  void **map);
 
 /**
@@ -336,7 +340,7 @@ typedef int (*cgs_kmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_kunmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
+typedef int (*cgs_kunmap_gpu_mem_t)(struct cgs_device *cgs_device, cgs_handle_t handle);
 
 /**
  * cgs_read_register() - Read an MMIO register
@@ -345,7 +349,7 @@ typedef int (*cgs_kunmap_gpu_mem_t)(void *cgs_device, cgs_handle_t handle);
  *
  * Return:  register value
  */
-typedef uint32_t (*cgs_read_register_t)(void *cgs_device, unsigned offset);
+typedef uint32_t (*cgs_read_register_t)(struct cgs_device *cgs_device, unsigned offset);
 
 /**
  * cgs_write_register() - Write an MMIO register
@@ -353,7 +357,7 @@ typedef uint32_t (*cgs_read_register_t)(void *cgs_device, unsigned offset);
  * @offset:    register offset
  * @value:     register value
  */
-typedef void (*cgs_write_register_t)(void *cgs_device, unsigned offset,
+typedef void (*cgs_write_register_t)(struct cgs_device *cgs_device, unsigned offset,
                                     uint32_t value);
 
 /**
@@ -363,7 +367,7 @@ typedef void (*cgs_write_register_t)(void *cgs_device, unsigned offset,
  *
  * Return:  register value
  */
-typedef uint32_t (*cgs_read_ind_register_t)(void *cgs_device, enum cgs_ind_reg space,
+typedef uint32_t (*cgs_read_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
                                            unsigned index);
 
 /**
@@ -372,7 +376,7 @@ typedef uint32_t (*cgs_read_ind_register_t)(void *cgs_device, enum cgs_ind_reg s
  * @offset:    register offset
  * @value:     register value
  */
-typedef void (*cgs_write_ind_register_t)(void *cgs_device, enum cgs_ind_reg space,
+typedef void (*cgs_write_ind_register_t)(struct cgs_device *cgs_device, enum cgs_ind_reg space,
                                         unsigned index, uint32_t value);
 
 /**
@@ -382,7 +386,7 @@ typedef void (*cgs_write_ind_register_t)(void *cgs_device, enum cgs_ind_reg spac
  *
  * Return:  Value read
  */
-typedef uint8_t (*cgs_read_pci_config_byte_t)(void *cgs_device, unsigned addr);
+typedef uint8_t (*cgs_read_pci_config_byte_t)(struct cgs_device *cgs_device, unsigned addr);
 
 /**
  * cgs_read_pci_config_word() - Read word from PCI configuration space
@@ -391,7 +395,7 @@ typedef uint8_t (*cgs_read_pci_config_byte_t)(void *cgs_device, unsigned addr);
  *
  * Return:  Value read
  */
-typedef uint16_t (*cgs_read_pci_config_word_t)(void *cgs_device, unsigned addr);
+typedef uint16_t (*cgs_read_pci_config_word_t)(struct cgs_device *cgs_device, unsigned addr);
 
 /**
  * cgs_read_pci_config_dword() - Read dword from PCI configuration space
@@ -400,7 +404,7 @@ typedef uint16_t (*cgs_read_pci_config_word_t)(void *cgs_device, unsigned addr);
  *
  * Return:  Value read
  */
-typedef uint32_t (*cgs_read_pci_config_dword_t)(void *cgs_device,
+typedef uint32_t (*cgs_read_pci_config_dword_t)(struct cgs_device *cgs_device,
                                                unsigned addr);
 
 /**
@@ -409,7 +413,7 @@ typedef uint32_t (*cgs_read_pci_config_dword_t)(void *cgs_device,
  * @addr:      address
  * @value:     value to write
  */
-typedef void (*cgs_write_pci_config_byte_t)(void *cgs_device, unsigned addr,
+typedef void (*cgs_write_pci_config_byte_t)(struct cgs_device *cgs_device, unsigned addr,
                                            uint8_t value);
 
 /**
@@ -418,7 +422,7 @@ typedef void (*cgs_write_pci_config_byte_t)(void *cgs_device, unsigned addr,
  * @addr:      address, must be word-aligned
  * @value:     value to write
  */
-typedef void (*cgs_write_pci_config_word_t)(void *cgs_device, unsigned addr,
+typedef void (*cgs_write_pci_config_word_t)(struct cgs_device *cgs_device, unsigned addr,
                                            uint16_t value);
 
 /**
@@ -427,7 +431,7 @@ typedef void (*cgs_write_pci_config_word_t)(void *cgs_device, unsigned addr,
  * @addr:      address, must be dword-aligned
  * @value:     value to write
  */
-typedef void (*cgs_write_pci_config_dword_t)(void *cgs_device, unsigned addr,
+typedef void (*cgs_write_pci_config_dword_t)(struct cgs_device *cgs_device, unsigned addr,
                                             uint32_t value);
 
 
@@ -441,7 +445,7 @@ typedef void (*cgs_write_pci_config_dword_t)(void *cgs_device, unsigned addr,
  *
  * Return: 0 on success, -errno otherwise
  */
-typedef int (*cgs_get_pci_resource_t)(void *cgs_device,
+typedef int (*cgs_get_pci_resource_t)(struct cgs_device *cgs_device,
                                      enum cgs_resource_type resource_type,
                                      uint64_t size,
                                      uint64_t offset,
@@ -458,7 +462,7 @@ typedef int (*cgs_get_pci_resource_t)(void *cgs_device,
  * Return: Pointer to start of the table, or NULL on failure
  */
 typedef const void *(*cgs_atom_get_data_table_t)(
-       void *cgs_device, unsigned table,
+       struct cgs_device *cgs_device, unsigned table,
        uint16_t *size, uint8_t *frev, uint8_t *crev);
 
 /**
@@ -470,7 +474,7 @@ typedef const void *(*cgs_atom_get_data_table_t)(
  *
  * Return: 0 on success, -errno otherwise
  */
-typedef int (*cgs_atom_get_cmd_table_revs_t)(void *cgs_device, unsigned table,
+typedef int (*cgs_atom_get_cmd_table_revs_t)(struct cgs_device *cgs_device, unsigned table,
                                             uint8_t *frev, uint8_t *crev);
 
 /**
@@ -481,7 +485,7 @@ typedef int (*cgs_atom_get_cmd_table_revs_t)(void *cgs_device, unsigned table,
  *
  * Return: 0 on success, -errno otherwise
  */
-typedef int (*cgs_atom_exec_cmd_table_t)(void *cgs_device,
+typedef int (*cgs_atom_exec_cmd_table_t)(struct cgs_device *cgs_device,
                                         unsigned table, void *args);
 
 /**
@@ -491,7 +495,7 @@ typedef int (*cgs_atom_exec_cmd_table_t)(void *cgs_device,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_create_pm_request_t)(void *cgs_device, cgs_handle_t *request);
+typedef int (*cgs_create_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t *request);
 
 /**
  * cgs_destroy_pm_request() - Destroy a power management request
@@ -500,7 +504,7 @@ typedef int (*cgs_create_pm_request_t)(void *cgs_device, cgs_handle_t *request);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_destroy_pm_request_t)(void *cgs_device, cgs_handle_t request);
+typedef int (*cgs_destroy_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t request);
 
 /**
  * cgs_set_pm_request() - Activate or deactiveate a PM request
@@ -516,7 +520,7 @@ typedef int (*cgs_destroy_pm_request_t)(void *cgs_device, cgs_handle_t request);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_set_pm_request_t)(void *cgs_device, cgs_handle_t request,
+typedef int (*cgs_set_pm_request_t)(struct cgs_device *cgs_device, cgs_handle_t request,
                                    int active);
 
 /**
@@ -528,7 +532,7 @@ typedef int (*cgs_set_pm_request_t)(void *cgs_device, cgs_handle_t request,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_pm_request_clock_t)(void *cgs_device, cgs_handle_t request,
+typedef int (*cgs_pm_request_clock_t)(struct cgs_device *cgs_device, cgs_handle_t request,
                                      enum cgs_clock clock, unsigned freq);
 
 /**
@@ -540,7 +544,7 @@ typedef int (*cgs_pm_request_clock_t)(void *cgs_device, cgs_handle_t request,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_pm_request_engine_t)(void *cgs_device, cgs_handle_t request,
+typedef int (*cgs_pm_request_engine_t)(struct cgs_device *cgs_device, cgs_handle_t request,
                                       enum cgs_engine engine, int powered);
 
 /**
@@ -551,7 +555,7 @@ typedef int (*cgs_pm_request_engine_t)(void *cgs_device, cgs_handle_t request,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_pm_query_clock_limits_t)(void *cgs_device,
+typedef int (*cgs_pm_query_clock_limits_t)(struct cgs_device *cgs_device,
                                           enum cgs_clock clock,
                                           struct cgs_clock_limits *limits);
 
@@ -563,7 +567,7 @@ typedef int (*cgs_pm_query_clock_limits_t)(void *cgs_device,
  *
  * Return: 0 on success, -errno otherwise
  */
-typedef int (*cgs_set_camera_voltages_t)(void *cgs_device, uint32_t mask,
+typedef int (*cgs_set_camera_voltages_t)(struct cgs_device *cgs_device, uint32_t mask,
                                         const uint32_t *voltages);
 /**
  * cgs_get_firmware_info - Get the firmware information from core driver
@@ -573,25 +577,25 @@ typedef int (*cgs_set_camera_voltages_t)(void *cgs_device, uint32_t mask,
  *
  * Return: 0 on success, -errno otherwise
  */
-typedef int (*cgs_get_firmware_info)(void *cgs_device,
+typedef int (*cgs_get_firmware_info)(struct cgs_device *cgs_device,
                                     enum cgs_ucode_id type,
                                     struct cgs_firmware_info *info);
 
-typedef int(*cgs_set_powergating_state)(void *cgs_device,
+typedef int(*cgs_set_powergating_state)(struct cgs_device *cgs_device,
                                  enum amd_ip_block_type block_type,
                                  enum amd_powergating_state state);
 
-typedef int(*cgs_set_clockgating_state)(void *cgs_device,
+typedef int(*cgs_set_clockgating_state)(struct cgs_device *cgs_device,
                                  enum amd_ip_block_type block_type,
                                  enum amd_clockgating_state state);
 
 typedef int(*cgs_get_active_displays_info)(
-                                       void *cgs_device,
+                                       struct cgs_device *cgs_device,
                                        struct cgs_display_info *info);
 
-typedef int (*cgs_notify_dpm_enabled)(void *cgs_device, bool enabled);
+typedef int (*cgs_notify_dpm_enabled)(struct cgs_device *cgs_device, bool enabled);
 
-typedef int (*cgs_call_acpi_method)(void *cgs_device,
+typedef int (*cgs_call_acpi_method)(struct cgs_device *cgs_device,
                                        uint32_t acpi_method,
                                        uint32_t acpi_function,
                                        void *pinput, void *poutput,
@@ -599,7 +603,7 @@ typedef int (*cgs_call_acpi_method)(void *cgs_device,
                                        uint32_t input_size,
                                        uint32_t output_size);
 
-typedef int (*cgs_query_system_info)(void *cgs_device,
+typedef int (*cgs_query_system_info)(struct cgs_device *cgs_device,
                                struct cgs_system_info *sys_info);
 
 struct cgs_ops {
index 3b47ae313e36bc7a0385365c082a519207fd7470..ca4f6007a9b30661e1f7ffb6db0d1ee356b93c45 100644 (file)
@@ -66,7 +66,7 @@ typedef int (*cgs_irq_handler_func_t)(void *private_data,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_add_irq_source_t)(void *cgs_device, unsigned src_id,
+typedef int (*cgs_add_irq_source_t)(struct cgs_device *cgs_device, unsigned src_id,
                                    unsigned num_types,
                                    cgs_irq_source_set_func_t set,
                                    cgs_irq_handler_func_t handler,
@@ -83,7 +83,7 @@ typedef int (*cgs_add_irq_source_t)(void *cgs_device, unsigned src_id,
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned src_id, unsigned type);
+typedef int (*cgs_irq_get_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type);
 
 /**
  * cgs_irq_put() - Indicate IRQ source is no longer needed
@@ -98,7 +98,7 @@ typedef int (*cgs_irq_get_t)(void *cgs_device, unsigned src_id, unsigned type);
  *
  * Return:  0 on success, -errno otherwise
  */
-typedef int (*cgs_irq_put_t)(void *cgs_device, unsigned src_id, unsigned type);
+typedef int (*cgs_irq_put_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type);
 
 struct cgs_os_ops {
        /* IRQ handling */
index 9d2290044708d7f2119c702ddc45d15c77b6b808..8e345bfddb693033d08584d1093f254ef9619a38 100644 (file)
                        return -EINVAL;                                 \
        } while (0)
 
+#define PP_CHECK_HW(hwmgr)                                             \
+       do {                                                            \
+               if ((hwmgr) == NULL || (hwmgr)->hwmgr_func == NULL)     \
+                       return -EINVAL;                                 \
+       } while (0)
+
 static int pp_early_init(void *handle)
 {
        return 0;
@@ -54,22 +60,26 @@ static int pp_sw_init(void *handle)
        pp_handle = (struct pp_instance *)handle;
        hwmgr = pp_handle->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->pptable_func == NULL ||
-           hwmgr->hwmgr_func == NULL ||
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->pptable_func == NULL ||
            hwmgr->pptable_func->pptable_init == NULL ||
            hwmgr->hwmgr_func->backend_init == NULL)
                return -EINVAL;
 
        ret = hwmgr->pptable_func->pptable_init(hwmgr);
+       if (ret)
+               goto err;
 
-       if (ret == 0)
-               ret = hwmgr->hwmgr_func->backend_init(hwmgr);
-
+       ret = hwmgr->hwmgr_func->backend_init(hwmgr);
        if (ret)
-               printk("amdgpu: powerplay initialization failed\n");
-       else
-               printk("amdgpu: powerplay initialized\n");
+               goto err;
+
+       pr_info("amdgpu: powerplay initialized\n");
 
+       return 0;
+err:
+       pr_err("amdgpu: powerplay initialization failed\n");
        return ret;
 }
 
@@ -85,8 +95,9 @@ static int pp_sw_fini(void *handle)
        pp_handle = (struct pp_instance *)handle;
        hwmgr = pp_handle->hwmgr;
 
-       if (hwmgr != NULL || hwmgr->hwmgr_func != NULL ||
-           hwmgr->hwmgr_func->backend_fini != NULL)
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->backend_fini != NULL)
                ret = hwmgr->hwmgr_func->backend_fini(hwmgr);
 
        return ret;
@@ -172,21 +183,117 @@ static int pp_sw_reset(void *handle)
        return 0;
 }
 
-static void pp_print_status(void *handle)
-{
-
-}
 
 static int pp_set_clockgating_state(void *handle,
                                    enum amd_clockgating_state state)
 {
+       struct pp_hwmgr  *hwmgr;
+       uint32_t msg_id, pp_state;
+
+       if (handle == NULL)
+               return -EINVAL;
+
+       hwmgr = ((struct pp_instance *)handle)->hwmgr;
+
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->update_clock_gatings == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
+
+       if (state == AMD_CG_STATE_UNGATE)
+               pp_state = 0;
+       else
+               pp_state = PP_STATE_CG | PP_STATE_LS;
+
+       /* Enable/disable GFX blocks clock gating through SMU */
+       msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
+                       PP_BLOCK_GFX_CG,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
+                       PP_BLOCK_GFX_3D,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
+                       PP_BLOCK_GFX_RLC,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
+                       PP_BLOCK_GFX_CP,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_GFX,
+                       PP_BLOCK_GFX_MG,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+
+       /* Enable/disable System blocks clock gating through SMU */
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_BIF,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_BIF,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_MC,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_ROM,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_DRM,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_HDP,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+       msg_id = PP_CG_MSG_ID(PP_GROUP_SYS,
+                       PP_BLOCK_SYS_SDMA,
+                       PP_STATE_SUPPORT_CG | PP_STATE_SUPPORT_LS,
+                       pp_state);
+       hwmgr->hwmgr_func->update_clock_gatings(hwmgr, &msg_id);
+
        return 0;
 }
 
 static int pp_set_powergating_state(void *handle,
                                    enum amd_powergating_state state)
 {
-       return 0;
+       struct pp_hwmgr  *hwmgr;
+
+       if (handle == NULL)
+               return -EINVAL;
+
+       hwmgr = ((struct pp_instance *)handle)->hwmgr;
+
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->enable_per_cu_power_gating == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
+
+       /* Enable/disable GFX per cu powergating through SMU */
+       return hwmgr->hwmgr_func->enable_per_cu_power_gating(hwmgr,
+                       state == AMD_PG_STATE_GATE ? true : false);
 }
 
 static int pp_suspend(void *handle)
@@ -236,6 +343,7 @@ static int pp_resume(void *handle)
 }
 
 const struct amd_ip_funcs pp_ip_funcs = {
+       .name = "powerplay",
        .early_init = pp_early_init,
        .late_init = NULL,
        .sw_init = pp_sw_init,
@@ -247,7 +355,6 @@ const struct amd_ip_funcs pp_ip_funcs = {
        .is_idle = pp_is_idle,
        .wait_for_idle = pp_wait_for_idle,
        .soft_reset = pp_sw_reset,
-       .print_status = pp_print_status,
        .set_clockgating_state = pp_set_clockgating_state,
        .set_powergating_state = pp_set_powergating_state,
 };
@@ -275,9 +382,12 @@ static int pp_dpm_force_performance_level(void *handle,
 
        hwmgr = pp_handle->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-           hwmgr->hwmgr_func->force_dpm_level == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->force_dpm_level == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        hwmgr->hwmgr_func->force_dpm_level(hwmgr, level);
 
@@ -309,9 +419,12 @@ static int pp_dpm_get_sclk(void *handle, bool low)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-           hwmgr->hwmgr_func->get_sclk == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_sclk == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_sclk(hwmgr, low);
 }
@@ -325,9 +438,12 @@ static int pp_dpm_get_mclk(void *handle, bool low)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-           hwmgr->hwmgr_func->get_mclk == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_mclk == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_mclk(hwmgr, low);
 }
@@ -341,9 +457,12 @@ static int pp_dpm_powergate_vce(void *handle, bool gate)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-           hwmgr->hwmgr_func->powergate_vce == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->powergate_vce == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->powergate_vce(hwmgr, gate);
 }
@@ -357,9 +476,12 @@ static int pp_dpm_powergate_uvd(void *handle, bool gate)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-           hwmgr->hwmgr_func->powergate_uvd == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->powergate_uvd == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->powergate_uvd(hwmgr, gate);
 }
@@ -455,10 +577,14 @@ pp_debugfs_print_current_performance_level(void *handle,
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->print_current_perforce_level == NULL)
+       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL)
                return;
 
+       if (hwmgr->hwmgr_func->print_current_perforce_level == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return;
+       }
+
        hwmgr->hwmgr_func->print_current_perforce_level(hwmgr, m);
 }
 
@@ -471,9 +597,12 @@ static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->set_fan_control_mode == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->set_fan_control_mode == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->set_fan_control_mode(hwmgr, mode);
 }
@@ -487,9 +616,12 @@ static int pp_dpm_get_fan_control_mode(void *handle)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->get_fan_control_mode == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_fan_control_mode == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_fan_control_mode(hwmgr);
 }
@@ -503,9 +635,12 @@ static int pp_dpm_set_fan_speed_percent(void *handle, uint32_t percent)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->set_fan_speed_percent == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->set_fan_speed_percent == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->set_fan_speed_percent(hwmgr, percent);
 }
@@ -519,9 +654,12 @@ static int pp_dpm_get_fan_speed_percent(void *handle, uint32_t *speed)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->get_fan_speed_percent == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_fan_speed_percent == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_fan_speed_percent(hwmgr, speed);
 }
@@ -535,9 +673,12 @@ static int pp_dpm_get_temperature(void *handle)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-         hwmgr->hwmgr_func->get_temperature == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_temperature == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_temperature(hwmgr);
 }
@@ -591,9 +732,12 @@ static int pp_dpm_get_pp_table(void *handle, char **table)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-               hwmgr->hwmgr_func->get_pp_table == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->get_pp_table == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->get_pp_table(hwmgr, table);
 }
@@ -607,15 +751,18 @@ static int pp_dpm_set_pp_table(void *handle, const char *buf, size_t size)
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-               hwmgr->hwmgr_func->set_pp_table == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->set_pp_table == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
        return hwmgr->hwmgr_func->set_pp_table(hwmgr, buf, size);
 }
 
 static int pp_dpm_force_clock_level(void *handle,
-               enum pp_clock_type type, int level)
+               enum pp_clock_type type, uint32_t mask)
 {
        struct pp_hwmgr *hwmgr;
 
@@ -624,11 +771,14 @@ static int pp_dpm_force_clock_level(void *handle,
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-                       hwmgr->hwmgr_func->force_clock_level == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
+
+       if (hwmgr->hwmgr_func->force_clock_level == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
 
-       return hwmgr->hwmgr_func->force_clock_level(hwmgr, type, level);
+       return hwmgr->hwmgr_func->force_clock_level(hwmgr, type, mask);
 }
 
 static int pp_dpm_print_clock_levels(void *handle,
@@ -641,10 +791,12 @@ static int pp_dpm_print_clock_levels(void *handle,
 
        hwmgr = ((struct pp_instance *)handle)->hwmgr;
 
-       if (hwmgr == NULL || hwmgr->hwmgr_func == NULL ||
-                       hwmgr->hwmgr_func->print_clock_levels == NULL)
-               return -EINVAL;
+       PP_CHECK_HW(hwmgr);
 
+       if (hwmgr->hwmgr_func->print_clock_levels == NULL) {
+               printk(KERN_INFO "%s was not implemented.\n", __func__);
+               return 0;
+       }
        return hwmgr->hwmgr_func->print_clock_levels(hwmgr, type, buf);
 }
 
index 56856a2864d108c89cb2a961398f8f3613159fcc..d6635cc4b0fc046bcee3ebf5885dfd9b23229f6b 100644 (file)
@@ -24,7 +24,7 @@
 #include "eventactionchains.h"
 #include "eventsubchains.h"
 
-static const pem_event_action *initialize_event[] = {
+static const pem_event_action * const initialize_event[] = {
        block_adjust_power_state_tasks,
        power_budget_tasks,
        system_config_tasks,
@@ -45,7 +45,7 @@ const struct action_chain initialize_action_chain = {
        initialize_event
 };
 
-static const pem_event_action *uninitialize_event[] = {
+static const pem_event_action * const uninitialize_event[] = {
        ungate_all_display_phys_tasks,
        uninitialize_display_phy_access_tasks,
        disable_gfx_voltage_island_power_gating_tasks,
@@ -64,7 +64,7 @@ const struct action_chain uninitialize_action_chain = {
        uninitialize_event
 };
 
-static const pem_event_action *power_source_change_event_pp_enabled[] = {
+static const pem_event_action * const power_source_change_event_pp_enabled[] = {
        set_power_source_tasks,
        set_power_saving_state_tasks,
        adjust_power_state_tasks,
@@ -79,7 +79,7 @@ const struct action_chain power_source_change_action_chain_pp_enabled = {
        power_source_change_event_pp_enabled
 };
 
-static const pem_event_action *power_source_change_event_pp_disabled[] = {
+static const pem_event_action * const power_source_change_event_pp_disabled[] = {
        set_power_source_tasks,
        set_nbmcu_state_tasks,
        NULL
@@ -90,7 +90,7 @@ const struct action_chain power_source_changes_action_chain_pp_disabled = {
        power_source_change_event_pp_disabled
 };
 
-static const pem_event_action *power_source_change_event_hardware_dc[] = {
+static const pem_event_action * const power_source_change_event_hardware_dc[] = {
        set_power_source_tasks,
        set_power_saving_state_tasks,
        adjust_power_state_tasks,
@@ -106,7 +106,7 @@ const struct action_chain power_source_change_action_chain_hardware_dc = {
        power_source_change_event_hardware_dc
 };
 
-static const pem_event_action *suspend_event[] = {
+static const pem_event_action * const suspend_event[] = {
        reset_display_phy_access_tasks,
        unregister_interrupt_tasks,
        disable_gfx_voltage_island_power_gating_tasks,
@@ -130,7 +130,7 @@ const struct action_chain suspend_action_chain = {
        suspend_event
 };
 
-static const pem_event_action *resume_event[] = {
+static const pem_event_action * const resume_event[] = {
        unblock_hw_access_tasks,
        resume_connected_standby_tasks,
        notify_smu_resume_tasks,
@@ -164,7 +164,7 @@ const struct action_chain resume_action_chain = {
        resume_event
 };
 
-static const pem_event_action *complete_init_event[] = {
+static const pem_event_action * const complete_init_event[] = {
        unblock_adjust_power_state_tasks,
        adjust_power_state_tasks,
        enable_gfx_clock_gating_tasks,
@@ -178,7 +178,7 @@ const struct action_chain complete_init_action_chain = {
        complete_init_event
 };
 
-static const pem_event_action *enable_gfx_clock_gating_event[] = {
+static const pem_event_action * const enable_gfx_clock_gating_event[] = {
        enable_gfx_clock_gating_tasks,
        NULL
 };
@@ -188,7 +188,7 @@ const struct action_chain enable_gfx_clock_gating_action_chain = {
        enable_gfx_clock_gating_event
 };
 
-static const pem_event_action *disable_gfx_clock_gating_event[] = {
+static const pem_event_action * const disable_gfx_clock_gating_event[] = {
        disable_gfx_clock_gating_tasks,
        NULL
 };
@@ -198,7 +198,7 @@ const struct action_chain disable_gfx_clock_gating_action_chain = {
        disable_gfx_clock_gating_event
 };
 
-static const pem_event_action *enable_cgpg_event[] = {
+static const pem_event_action * const enable_cgpg_event[] = {
        enable_cgpg_tasks,
        NULL
 };
@@ -208,7 +208,7 @@ const struct action_chain enable_cgpg_action_chain = {
        enable_cgpg_event
 };
 
-static const pem_event_action *disable_cgpg_event[] = {
+static const pem_event_action * const disable_cgpg_event[] = {
        disable_cgpg_tasks,
        NULL
 };
@@ -221,7 +221,7 @@ const struct action_chain disable_cgpg_action_chain = {
 
 /* Enable user _2d performance and activate */
 
-static const pem_event_action *enable_user_state_event[] = {
+static const pem_event_action * const enable_user_state_event[] = {
        create_new_user_performance_state_tasks,
        adjust_power_state_tasks,
        NULL
@@ -232,7 +232,7 @@ const struct action_chain enable_user_state_action_chain = {
        enable_user_state_event
 };
 
-static const pem_event_action *enable_user_2d_performance_event[] = {
+static const pem_event_action * const enable_user_2d_performance_event[] = {
        enable_user_2d_performance_tasks,
        add_user_2d_performance_state_tasks,
        set_performance_state_tasks,
@@ -247,7 +247,7 @@ const struct action_chain enable_user_2d_performance_action_chain = {
 };
 
 
-static const pem_event_action *disable_user_2d_performance_event[] = {
+static const pem_event_action * const disable_user_2d_performance_event[] = {
        disable_user_2d_performance_tasks,
        delete_user_2d_performance_state_tasks,
        NULL
@@ -259,7 +259,7 @@ const struct action_chain disable_user_2d_performance_action_chain = {
 };
 
 
-static const pem_event_action *display_config_change_event[] = {
+static const pem_event_action * const display_config_change_event[] = {
        /* countDisplayConfigurationChangeEventTasks, */
        unblock_adjust_power_state_tasks,
        set_cpu_power_state,
@@ -278,7 +278,7 @@ const struct action_chain display_config_change_action_chain = {
        display_config_change_event
 };
 
-static const pem_event_action *readjust_power_state_event[] = {
+static const pem_event_action * const readjust_power_state_event[] = {
        adjust_power_state_tasks,
        NULL
 };
index 1e2ad5603080152f9fa7831b2c5c22ee7a0aa3c9..cd1ca07ef7f72deaa10d171c241d1308dc9d1869 100644 (file)
@@ -62,7 +62,7 @@ int pem_init_event_action_chains(struct pp_eventmgr *eventmgr)
 
 int pem_excute_event_chain(struct pp_eventmgr *eventmgr, const struct action_chain *event_chain, struct pem_event_data *event_data)
 {
-       const pem_event_action **paction_chain;
+       const pem_event_action * const *paction_chain;
        const pem_event_action *psub_chain;
        int tmp_result = 0;
        int result = 0;
index b664e34dbcc0d91f4a62c7411b787dbc72afa7d5..f7ce4cb71346c4623c780c5ba86c1c33ad3eb65c 100644 (file)
@@ -8,7 +8,9 @@ HARDWARE_MGR = hwmgr.o processpptables.o functiontables.o \
               tonga_processpptables.o ppatomctrl.o \
                tonga_hwmgr.o pppcielanes.o  tonga_thermal.o\
                fiji_powertune.o fiji_hwmgr.o tonga_clockpowergating.o \
-               fiji_clockpowergating.o fiji_thermal.o
+               fiji_clockpowergating.o fiji_thermal.o \
+              polaris10_hwmgr.o polaris10_powertune.o polaris10_thermal.o \
+              polaris10_clockpowergating.o
 
 AMD_PP_HWMGR = $(addprefix $(AMD_PP_PATH)/hwmgr/,$(HARDWARE_MGR))
 
index ff08ce41bde92f82596894ee178a545916d288df..436fc16dabb660e0970068ecc4eb0be3c2ed44f6 100644 (file)
@@ -237,7 +237,7 @@ int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)
 }
 
 
-static struct phm_master_table_item cz_enable_clock_power_gatings_list[] = {
+static const struct phm_master_table_item cz_enable_clock_power_gatings_list[] = {
        /*we don't need an exit table here, because there is only D3 cold on Kv*/
        { phm_cf_want_uvd_power_gating, cz_tf_uvd_power_gating_initialize },
        { phm_cf_want_vce_power_gating, cz_tf_vce_power_gating_initialize },
@@ -245,7 +245,7 @@ static struct phm_master_table_item cz_enable_clock_power_gatings_list[] = {
        { NULL, NULL }
 };
 
-struct phm_master_table_header cz_phm_enable_clock_power_gatings_master = {
+const struct phm_master_table_header cz_phm_enable_clock_power_gatings_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_enable_clock_power_gatings_list
index bbbc0571320eed5b908c3e5d2509ff87f57790f3..1954ceaed439ec1c8b06f92d5599bd65c55e49fc 100644 (file)
@@ -28,8 +28,7 @@
 #include "pp_asicblocks.h"
 
 extern int cz_phm_set_asic_block_gating(struct pp_hwmgr *hwmgr, enum PHM_AsicBlock block, enum PHM_ClockGateSetting gating);
-extern struct phm_master_table_header cz_phm_enable_clock_power_gatings_master;
-extern struct phm_master_table_header cz_phm_disable_clock_power_gatings_master;
+extern const struct phm_master_table_header cz_phm_enable_clock_power_gatings_master;
 extern int cz_dpm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate);
 extern int cz_dpm_powergate_uvd(struct pp_hwmgr *hwmgr, bool bgate);
 extern int cz_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable);
index 5682490337e3dda03f8e7b2d10774b2e67ea3bdc..1f14c477d15d3a490c89f316ce48dd077503e98f 100644 (file)
@@ -915,7 +915,7 @@ static int cz_tf_update_low_mem_pstate(struct pp_hwmgr *hwmgr,
        return 0;
 }
 
-static struct phm_master_table_item cz_set_power_state_list[] = {
+static const struct phm_master_table_item cz_set_power_state_list[] = {
        {NULL, cz_tf_update_sclk_limit},
        {NULL, cz_tf_set_deep_sleep_sclk_threshold},
        {NULL, cz_tf_set_watermark_threshold},
@@ -925,13 +925,13 @@ static struct phm_master_table_item cz_set_power_state_list[] = {
        {NULL, NULL}
 };
 
-static struct phm_master_table_header cz_set_power_state_master = {
+static const struct phm_master_table_header cz_set_power_state_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_set_power_state_list
 };
 
-static struct phm_master_table_item cz_setup_asic_list[] = {
+static const struct phm_master_table_item cz_setup_asic_list[] = {
        {NULL, cz_tf_reset_active_process_mask},
        {NULL, cz_tf_upload_pptable_to_smu},
        {NULL, cz_tf_init_sclk_limit},
@@ -943,7 +943,7 @@ static struct phm_master_table_item cz_setup_asic_list[] = {
        {NULL, NULL}
 };
 
-static struct phm_master_table_header cz_setup_asic_master = {
+static const struct phm_master_table_header cz_setup_asic_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_setup_asic_list
@@ -984,14 +984,14 @@ static int cz_tf_reset_cc6_data(struct pp_hwmgr *hwmgr,
        return 0;
 }
 
-static struct phm_master_table_item cz_power_down_asic_list[] = {
+static const struct phm_master_table_item cz_power_down_asic_list[] = {
        {NULL, cz_tf_power_up_display_clock_sys_pll},
        {NULL, cz_tf_clear_nb_dpm_flag},
        {NULL, cz_tf_reset_cc6_data},
        {NULL, NULL}
 };
 
-static struct phm_master_table_header cz_power_down_asic_master = {
+static const struct phm_master_table_header cz_power_down_asic_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_power_down_asic_list
@@ -1095,19 +1095,19 @@ static int cz_tf_check_for_dpm_enabled(struct pp_hwmgr *hwmgr,
        return 0;
 }
 
-static struct phm_master_table_item cz_disable_dpm_list[] = {
+static const struct phm_master_table_item cz_disable_dpm_list[] = {
        { NULL, cz_tf_check_for_dpm_enabled},
        {NULL, NULL},
 };
 
 
-static struct phm_master_table_header cz_disable_dpm_master = {
+static const struct phm_master_table_header cz_disable_dpm_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_disable_dpm_list
 };
 
-static struct phm_master_table_item cz_enable_dpm_list[] = {
+static const struct phm_master_table_item cz_enable_dpm_list[] = {
        { NULL, cz_tf_check_for_dpm_disabled },
        { NULL, cz_tf_program_voting_clients },
        { NULL, cz_tf_start_dpm},
@@ -1117,7 +1117,7 @@ static struct phm_master_table_item cz_enable_dpm_list[] = {
        {NULL, NULL},
 };
 
-static struct phm_master_table_header cz_enable_dpm_master = {
+static const struct phm_master_table_header cz_enable_dpm_master = {
        0,
        PHM_MasterTableFlag_None,
        cz_enable_dpm_list
@@ -1729,7 +1729,7 @@ static int cz_get_dal_power_level(struct pp_hwmgr *hwmgr,
 }
 
 static int cz_force_clock_level(struct pp_hwmgr *hwmgr,
-               enum pp_clock_type type, int level)
+               enum pp_clock_type type, uint32_t mask)
 {
        if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL)
                return -EINVAL;
@@ -1738,10 +1738,10 @@ static int cz_force_clock_level(struct pp_hwmgr *hwmgr,
        case PP_SCLK:
                smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                PPSMC_MSG_SetSclkSoftMin,
-                               (1 << level));
+                               mask);
                smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                PPSMC_MSG_SetSclkSoftMax,
-                               (1 << level));
+                               mask);
                break;
        default:
                break;
index e68edf06ed73eecb0afa21f4531ace01156c9b82..e1b649bd5344919b55786bea9fd5fd49c48e240b 100644 (file)
@@ -47,10 +47,17 @@ int fiji_phm_powergate_uvd(struct pp_hwmgr *hwmgr, bool bgate)
 
        data->uvd_power_gated = bgate;
 
-       if (bgate)
+       if (bgate) {
+               cgs_set_clockgating_state(hwmgr->device,
+                                         AMD_IP_BLOCK_TYPE_UVD,
+                                         AMD_CG_STATE_GATE);
                fiji_update_uvd_dpm(hwmgr, true);
-       else
+       } else {
                fiji_update_uvd_dpm(hwmgr, false);
+               cgs_set_clockgating_state(hwmgr->device,
+                                         AMD_IP_BLOCK_TYPE_UVD,
+                                         AMD_PG_STATE_UNGATE);
+       }
 
        return 0;
 }
index 89f31bc5b68b9e061d31a2fb2494c7e4f60d276f..c94f9faa220a7ddadff3001aebf5d5da9996c43e 100644 (file)
@@ -95,23 +95,23 @@ enum DPM_EVENT_SRC {
 /* [2.5%,~2.5%] Clock stretched is multiple of 2.5% vs
  * not and [Fmin, Fmax, LDO_REFSEL, USE_FOR_LOW_FREQ]
  */
-uint16_t fiji_clock_stretcher_lookup_table[2][4] = { {600, 1050, 3, 0},
-                                                {600, 1050, 6, 1} };
+static const uint16_t fiji_clock_stretcher_lookup_table[2][4] =
+{ {600, 1050, 3, 0}, {600, 1050, 6, 1} };
 
 /* [FF, SS] type, [] 4 voltage ranges, and
  * [Floor Freq, Boundary Freq, VID min , VID max]
  */
-uint32_t fiji_clock_stretcher_ddt_table[2][4][4] =
+static const uint32_t fiji_clock_stretcher_ddt_table[2][4][4] =
 { { {265, 529, 120, 128}, {325, 650, 96, 119}, {430, 860, 32, 95}, {0, 0, 0, 31} },
   { {275, 550, 104, 112}, {319, 638, 96, 103}, {360, 720, 64, 95}, {384, 768, 32, 63} } };
 
 /* [Use_For_Low_freq] value, [0%, 5%, 10%, 7.14%, 14.28%, 20%]
  * (coming from PWR_CKS_CNTL.stretch_amount reg spec)
  */
-uint8_t fiji_clock_stretch_amount_conversion[2][6] = { {0, 1, 3, 2, 4, 5},
-                                                  {0, 2, 4, 5, 6, 5} };
+static const uint8_t fiji_clock_stretch_amount_conversion[2][6] =
+{ {0, 1, 3, 2, 4, 5}, {0, 2, 4, 5, 6, 5} };
 
-const unsigned long PhwFiji_Magic = (unsigned long)(PHM_VIslands_Magic);
+static const unsigned long PhwFiji_Magic = (unsigned long)(PHM_VIslands_Magic);
 
 struct fiji_power_state *cast_phw_fiji_power_state(
                                  struct pp_hw_power_state *hw_ps)
@@ -465,14 +465,14 @@ static int fiji_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
                        table_info->vdd_dep_on_mclk;
 
        PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table != NULL,
-               "VDD dependency on SCLK table is missing.       \
+               "VDD dependency on SCLK table is missing.       \
                This table is mandatory", return -EINVAL);
        PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table->count >= 1,
-               "VDD dependency on SCLK table has to have is missing.   \
+               "VDD dependency on SCLK table has to have is missing.   \
                This table is mandatory", return -EINVAL);
 
        PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table != NULL,
-               "VDD dependency on MCLK table is missing.       \
+               "VDD dependency on MCLK table is missing.       \
                This table is mandatory", return -EINVAL);
        PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table->count >= 1,
                "VDD dependency on MCLK table has to have is missing.    \
@@ -579,6 +579,18 @@ static int fiji_patch_boot_state(struct pp_hwmgr *hwmgr,
        return 0;
 }
 
+static int fiji_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
+{
+       struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
+
+       if (data->soft_pp_table) {
+               kfree(data->soft_pp_table);
+               data->soft_pp_table = NULL;
+       }
+
+       return phm_hwmgr_backend_fini(hwmgr);
+}
+
 static int fiji_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
@@ -734,7 +746,7 @@ static int fiji_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
                        data->pcie_lane_cap = (uint32_t)sys_info.value;
        } else {
                /* Ignore return value in here, we are cleaning up a mess. */
-               tonga_hwmgr_backend_fini(hwmgr);
+               fiji_hwmgr_backend_fini(hwmgr);
        }
 
        return 0;
@@ -1885,6 +1897,23 @@ static int fiji_get_dependency_volt_by_clk(struct pp_hwmgr *hwmgr,
 
        return 0;
 }
+
+static uint8_t fiji_get_sleep_divider_id_from_clock(uint32_t clock,
+               uint32_t clock_insr)
+{
+       uint8_t i;
+       uint32_t temp;
+       uint32_t min = max(clock_insr, (uint32_t)FIJI_MINIMUM_ENGINE_CLOCK);
+
+       PP_ASSERT_WITH_CODE((clock >= min), "Engine clock can't satisfy stutter requirement!", return 0);
+       for (i = FIJI_MAX_DEEPSLEEP_DIVIDER_ID;  ; i--) {
+               temp = clock >> i;
+
+               if (temp >= min || i == 0)
+                       break;
+       }
+       return i;
+}
 /**
 * Populates single SMC SCLK structure using the provided engine clock
 *
@@ -1928,17 +1957,13 @@ static int fiji_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
 
        threshold = clock * data->fast_watermark_threshold / 100;
 
-       /*
-       * TODO: get minimum clocks from dal configaration
-       * PECI_GetMinClockSettings(hwmgr->pPECI, &minClocks);
-       */
-       /* data->DisplayTiming.minClockInSR = minClocks.engineClockInSR; */
 
-       /* get level->DeepSleepDivId
-       if (phm_cap_enabled(hwmgr->platformDescriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep))
-       {
-       level->DeepSleepDivId = PhwFiji_GetSleepDividerIdFromClock(hwmgr, clock, minClocks.engineClockInSR);
-       } */
+       data->display_timing.min_clock_in_sr = hwmgr->display_config.min_core_set_clock_in_sr;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep))
+               level->DeepSleepDivId = fiji_get_sleep_divider_id_from_clock(clock,
+                                                               hwmgr->display_config.min_core_set_clock_in_sr);
+
 
        /* Default to slow, highest DPM level will be
         * set to PPSMC_DISPLAY_WATERMARK_LOW later.
@@ -3364,7 +3389,7 @@ static void fiji_set_dpm_event_sources(struct pp_hwmgr *hwmgr,
                                DPM_EVENT_SRC, src);
                PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, GENERAL_PWRMGT,
                                THERMAL_PROTECTION_DIS,
-                               phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               !phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
                                                PHM_PlatformCaps_ThermalController));
        } else
                PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, GENERAL_PWRMGT,
@@ -4066,7 +4091,6 @@ static int fiji_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, cons
        struct fiji_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table);
        uint32_t mclk = fiji_ps->performance_levels
                        [fiji_ps->performance_level_count - 1].memory_clock;
-       struct PP_Clocks min_clocks = {0};
        uint32_t i;
        struct cgs_display_info info = {0};
 
@@ -4080,10 +4104,8 @@ static int fiji_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, cons
        if (i >= sclk_table->count)
                data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK;
        else {
-       /* TODO: Check SCLK in DAL's minimum clocks
-        * in case DeepSleep divider update is required.
-        */
-               if(data->display_timing.min_clock_in_sr != min_clocks.engineClockInSR)
+               if(data->display_timing.min_clock_in_sr !=
+                       hwmgr->display_config.min_core_set_clock_in_sr)
                        data->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_SCLK;
        }
 
@@ -5086,24 +5108,40 @@ static int fiji_get_pp_table(struct pp_hwmgr *hwmgr, char **table)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
 
-       *table = (char *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+               memcpy(data->soft_pp_table, hwmgr->soft_pp_table,
+                               hwmgr->soft_pp_table_size);
+       }
 
-       return sizeof(struct SMU73_Discrete_DpmTable);
+       *table = (char *)&data->soft_pp_table;
+
+       return hwmgr->soft_pp_table_size;
 }
 
 static int fiji_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
 
-       void *table = (void *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+       }
 
-       memcpy(table, buf, size);
+       memcpy(data->soft_pp_table, buf, size);
+
+       hwmgr->soft_pp_table = data->soft_pp_table;
+
+       /* TODO: re-init powerplay to implement modified pptable */
 
        return 0;
 }
 
 static int fiji_force_clock_level(struct pp_hwmgr *hwmgr,
-               enum pp_clock_type type, int level)
+               enum pp_clock_type type, uint32_t mask)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
 
@@ -5115,20 +5153,30 @@ static int fiji_force_clock_level(struct pp_hwmgr *hwmgr,
                if (!data->sclk_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_SCLKDPM_SetEnabledMask,
-                                       (1 << level));
+                                       data->dpm_level_enable_mask.sclk_dpm_enable_mask & mask);
                break;
+
        case PP_MCLK:
                if (!data->mclk_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_MCLKDPM_SetEnabledMask,
-                                       (1 << level));
+                                       data->dpm_level_enable_mask.mclk_dpm_enable_mask & mask);
                break;
+
        case PP_PCIE:
+       {
+               uint32_t tmp = mask & data->dpm_level_enable_mask.pcie_dpm_enable_mask;
+               uint32_t level = 0;
+
+               while (tmp >>= 1)
+                       level++;
+
                if (!data->pcie_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_PCIeDPM_ForceLevel,
-                                       (1 << level));
+                                       level);
                break;
+       }
        default:
                break;
        }
@@ -5252,19 +5300,19 @@ bool fiji_check_smc_update_required_for_display_configuration(struct pp_hwmgr *h
 
        if (data->display_timing.num_existing_displays != info.display_count)
                is_update_required = true;
-/* TO DO NEED TO GET DEEP SLEEP CLOCK FROM DAL
-       if (phm_cap_enabled(hwmgr->hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep)) {
-               cgs_get_min_clock_settings(hwmgr->device, &min_clocks);
-               if(min_clocks.engineClockInSR != data->display_timing.minClockInSR)
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep)) {
+               if(hwmgr->display_config.min_core_set_clock_in_sr != data->display_timing.min_clock_in_sr)
                        is_update_required = true;
-*/
+       }
+
        return is_update_required;
 }
 
 
 static const struct pp_hwmgr_func fiji_hwmgr_funcs = {
        .backend_init = &fiji_hwmgr_backend_init,
-       .backend_fini = &tonga_hwmgr_backend_fini,
+       .backend_fini = &fiji_hwmgr_backend_fini,
        .asic_setup = &fiji_setup_asic_task,
        .dynamic_state_management_enable = &fiji_enable_dpm_tasks,
        .force_dpm_level = &fiji_dpm_force_dpm_level,
index a16f7cd4c238fed39f60a366dc5cb3f86f329656..170edf5a772dabb04b8fb683104c141f24d53862 100644 (file)
@@ -263,7 +263,7 @@ struct fiji_hwmgr {
        bool                           enable_tdc_limit_feature;
        bool                           enable_pkg_pwr_tracking_feature;
        bool                           disable_uvd_power_tune_feature;
-       struct fiji_pt_defaults       *power_tune_defaults;
+       const struct fiji_pt_defaults  *power_tune_defaults;
        struct SMU73_Discrete_PmFuses  power_tune_table;
        uint32_t                       dte_tj_offset;
        uint32_t                       fast_watermark_threshold;
@@ -302,6 +302,9 @@ struct fiji_hwmgr {
        bool                           pg_acp_init;
        bool                           frtc_enabled;
        bool                           frtc_status_changed;
+
+       /* soft pptable for re-uploading into smu */
+       void *soft_pp_table;
 };
 
 /* To convert to Q8.8 format for firmware */
@@ -338,7 +341,6 @@ enum Fiji_I2CLineID {
 #define FIJI_UNUSED_GPIO_PIN       0x7F
 
 extern int tonga_initializa_dynamic_state_adjustment_rule_settings(struct pp_hwmgr *hwmgr);
-extern int tonga_hwmgr_backend_fini(struct pp_hwmgr *hwmgr);
 extern int tonga_get_mc_microcode_version (struct pp_hwmgr *hwmgr);
 extern int tonga_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr);
 extern int tonga_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display);
index 6efcb2bac45f54a1651bc33f8591922f231d6e92..db23a4068baf291f948eb891fd4c2739bef5d8cb 100644 (file)
@@ -32,7 +32,7 @@
 #define VOLTAGE_SCALE  4
 #define POWERTUNE_DEFAULT_SET_MAX    1
 
-struct fiji_pt_defaults fiji_power_tune_data_set_array[POWERTUNE_DEFAULT_SET_MAX] = {
+const struct fiji_pt_defaults fiji_power_tune_data_set_array[POWERTUNE_DEFAULT_SET_MAX] = {
                /*sviLoadLIneEn,  SviLoadLineVddC, TDC_VDDC_ThrottleReleaseLimitPerc */
                {1,               0xF,             0xFD,
                /* TDC_MAWt, TdcWaterfallCtl, DTEAmbientTempBase */
@@ -143,7 +143,7 @@ static void get_scl_sda_value(uint8_t line, uint8_t *scl, uint8_t* sda)
 int fiji_populate_bapm_parameters_in_dpm_table(struct pp_hwmgr *hwmgr)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
-       struct fiji_pt_defaults *defaults = data->power_tune_defaults;
+       const struct fiji_pt_defaults *defaults = data->power_tune_defaults;
        SMU73_Discrete_DpmTable  *dpm_table = &(data->smc_state_table);
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
@@ -222,7 +222,7 @@ int fiji_populate_bapm_parameters_in_dpm_table(struct pp_hwmgr *hwmgr)
 static int fiji_populate_svi_load_line(struct pp_hwmgr *hwmgr)
 {
     struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
-    struct fiji_pt_defaults *defaults = data->power_tune_defaults;
+    const struct fiji_pt_defaults *defaults = data->power_tune_defaults;
 
     data->power_tune_table.SviLoadLineEn = defaults->SviLoadLineEn;
     data->power_tune_table.SviLoadLineVddC = defaults->SviLoadLineVddC;
@@ -238,7 +238,7 @@ static int fiji_populate_tdc_limit(struct pp_hwmgr *hwmgr)
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
        struct phm_ppt_v1_information *table_info =
                        (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       struct  fiji_pt_defaults *defaults = data->power_tune_defaults;
+       const struct fiji_pt_defaults *defaults = data->power_tune_defaults;
 
        /* TDC number of fraction bits are changed from 8 to 7
         * for Fiji as requested by SMC team
@@ -256,7 +256,7 @@ static int fiji_populate_tdc_limit(struct pp_hwmgr *hwmgr)
 static int fiji_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset)
 {
        struct fiji_hwmgr *data = (struct fiji_hwmgr *)(hwmgr->backend);
-       struct  fiji_pt_defaults *defaults = data->power_tune_defaults;
+       const struct fiji_pt_defaults *defaults = data->power_tune_defaults;
        uint32_t temp;
 
        if (fiji_read_smc_sram_dword(hwmgr->smumgr,
index e76a7de9aa327b681db48f4fc8793feb62c254d3..92976b68d6fd7b7a76c4d5f62b5b67cf4a871285 100644 (file)
@@ -221,8 +221,8 @@ int fiji_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr,
        if (duty100 == 0)
                return -EINVAL;
 
-       tmp64 = (uint64_t)speed * 100;
-       do_div(tmp64, duty100);
+       tmp64 = (uint64_t)speed * duty100;
+       do_div(tmp64, 100);
        duty = (uint32_t)tmp64;
 
        PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
@@ -615,7 +615,7 @@ static int tf_fiji_thermal_disable_alert(struct pp_hwmgr *hwmgr,
        return fiji_thermal_disable_alert(hwmgr);
 }
 
-static struct phm_master_table_item
+static const struct phm_master_table_item
 fiji_thermal_start_thermal_controller_master_list[] = {
        {NULL, tf_fiji_thermal_initialize},
        {NULL, tf_fiji_thermal_set_temperature_range},
@@ -630,14 +630,14 @@ fiji_thermal_start_thermal_controller_master_list[] = {
        {NULL, NULL}
 };
 
-static struct phm_master_table_header
+static const struct phm_master_table_header
 fiji_thermal_start_thermal_controller_master = {
        0,
        PHM_MasterTableFlag_None,
        fiji_thermal_start_thermal_controller_master_list
 };
 
-static struct phm_master_table_item
+static const struct phm_master_table_item
 fiji_thermal_set_temperature_range_master_list[] = {
        {NULL, tf_fiji_thermal_disable_alert},
        {NULL, tf_fiji_thermal_set_temperature_range},
@@ -645,7 +645,7 @@ fiji_thermal_set_temperature_range_master_list[] = {
        {NULL, NULL}
 };
 
-struct phm_master_table_header
+static const struct phm_master_table_header
 fiji_thermal_set_temperature_range_master = {
        0,
        PHM_MasterTableFlag_None,
index 72cfecc4f9f729426e602ce6a09db56f10eb8527..7a705cee0cc23624b7bc131601460cd317e817c6 100644 (file)
@@ -84,7 +84,7 @@ int phm_dispatch_table(struct pp_hwmgr *hwmgr,
 }
 
 int phm_construct_table(struct pp_hwmgr *hwmgr,
-                       struct phm_master_table_header *master_table,
+                       const struct phm_master_table_header *master_table,
                        struct phm_runtime_table_header *rt_table)
 {
        uint32_t function_count = 0;
index 5fb98aa2e7192bfa5e6cac26892cf4671cf4c0d9..7d69ed635bc2071c0ff1c48a2b2b675e5d0145be 100644 (file)
@@ -34,6 +34,7 @@
 extern int cz_hwmgr_init(struct pp_hwmgr *hwmgr);
 extern int tonga_hwmgr_init(struct pp_hwmgr *hwmgr);
 extern int fiji_hwmgr_init(struct pp_hwmgr *hwmgr);
+extern int polaris10_hwmgr_init(struct pp_hwmgr *hwmgr);
 
 int hwmgr_init(struct amd_pp_init *pp_init, struct pp_instance *handle)
 {
@@ -67,6 +68,10 @@ int hwmgr_init(struct amd_pp_init *pp_init, struct pp_instance *handle)
                case CHIP_FIJI:
                        fiji_hwmgr_init(hwmgr);
                        break;
+               case CHIP_POLARIS11:
+               case CHIP_POLARIS10:
+                       polaris10_hwmgr_init(hwmgr);
+                       break;
                default:
                        return -EINVAL;
                }
index c9e6c2d80ea6c0acbaa2a7fac4a0e394b844cf15..347fef127ce91b26127fdf0f64a91f50a339b90b 100644 (file)
@@ -92,6 +92,8 @@ typedef struct phm_ppt_v1_voltage_lookup_table phm_ppt_v1_voltage_lookup_table;
 struct phm_ppt_v1_pcie_record {
        uint8_t gen_speed;
        uint8_t lane_width;
+       uint16_t usreserved;
+       uint32_t pcie_sclk;
 };
 typedef struct phm_ppt_v1_pcie_record phm_ppt_v1_pcie_record;
 
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.c
new file mode 100644 (file)
index 0000000..8f142a7
--- /dev/null
@@ -0,0 +1,430 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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 "polaris10_clockpowergating.h"
+
+int polaris10_phm_powerdown_uvd(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cf_want_uvd_power_gating(hwmgr))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_UVDPowerOFF);
+       return 0;
+}
+
+int polaris10_phm_powerup_uvd(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cf_want_uvd_power_gating(hwmgr)) {
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                                 PHM_PlatformCaps_UVDDynamicPowerGating)) {
+                       return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_UVDPowerON, 1);
+               } else {
+                       return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_UVDPowerON, 0);
+               }
+       }
+
+       return 0;
+}
+
+int polaris10_phm_powerdown_vce(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cf_want_vce_power_gating(hwmgr))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_VCEPowerOFF);
+       return 0;
+}
+
+int polaris10_phm_powerup_vce(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cf_want_vce_power_gating(hwmgr))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_VCEPowerON);
+       return 0;
+}
+
+int polaris10_phm_powerdown_samu(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SamuPowerGating))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_SAMPowerOFF);
+       return 0;
+}
+
+int polaris10_phm_powerup_samu(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SamuPowerGating))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_SAMPowerON);
+       return 0;
+}
+
+int polaris10_phm_disable_clock_power_gating(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       data->uvd_power_gated = false;
+       data->vce_power_gated = false;
+       data->samu_power_gated = false;
+
+       polaris10_phm_powerup_uvd(hwmgr);
+       polaris10_phm_powerup_vce(hwmgr);
+       polaris10_phm_powerup_samu(hwmgr);
+
+       return 0;
+}
+
+int polaris10_phm_powergate_uvd(struct pp_hwmgr *hwmgr, bool bgate)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->uvd_power_gated == bgate)
+               return 0;
+
+       data->uvd_power_gated = bgate;
+
+       if (bgate) {
+               polaris10_update_uvd_dpm(hwmgr, true);
+               polaris10_phm_powerdown_uvd(hwmgr);
+       } else {
+               polaris10_phm_powerup_uvd(hwmgr);
+               polaris10_update_uvd_dpm(hwmgr, false);
+       }
+
+       return 0;
+}
+
+int polaris10_phm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->vce_power_gated == bgate)
+               return 0;
+
+       data->vce_power_gated = bgate;
+
+       if (bgate)
+               polaris10_phm_powerdown_vce(hwmgr);
+       else
+               polaris10_phm_powerup_vce(hwmgr);
+
+       return 0;
+}
+
+int polaris10_phm_powergate_samu(struct pp_hwmgr *hwmgr, bool bgate)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->samu_power_gated == bgate)
+               return 0;
+
+       data->samu_power_gated = bgate;
+
+       if (bgate) {
+               polaris10_update_samu_dpm(hwmgr, true);
+               polaris10_phm_powerdown_samu(hwmgr);
+       } else {
+               polaris10_phm_powerup_samu(hwmgr);
+               polaris10_update_samu_dpm(hwmgr, false);
+       }
+
+       return 0;
+}
+
+int polaris10_phm_update_clock_gatings(struct pp_hwmgr *hwmgr,
+                                       const uint32_t *msg_id)
+{
+       PPSMC_Msg msg;
+       uint32_t value;
+
+       switch ((*msg_id & PP_GROUP_MASK) >> PP_GROUP_SHIFT) {
+       case PP_GROUP_GFX:
+               switch ((*msg_id & PP_BLOCK_MASK) >> PP_BLOCK_SHIFT) {
+               case PP_BLOCK_GFX_CG:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_CGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS
+                                       ? PPSMC_MSG_EnableClockGatingFeature
+                                       : PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_CGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_GFX_3D:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_3DCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+
+                       if  (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_3DLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_GFX_RLC:
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_RLC_LS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_GFX_CP:
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_GFX_CP_LS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_GFX_MG:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = (CG_CPF_MGCG_MASK | CG_RLC_MGCG_MASK |
+                                               CG_GFX_OTHERS_MGCG_MASK);
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               default:
+                       return -1;
+               }
+               break;
+
+       case PP_GROUP_SYS:
+               switch ((*msg_id & PP_BLOCK_MASK) >> PP_BLOCK_SHIFT) {
+               case PP_BLOCK_SYS_BIF:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_CG ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_BIF_MGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       if  (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_BIF_MGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_SYS_MC:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_MC_MGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_MC_MGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_SYS_DRM:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_CG ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_DRM_MGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_DRM_MGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_SYS_HDP:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_HDP_MGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_HDP_MGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_SYS_SDMA:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_SDMA_MGCG_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+
+                       if (PP_STATE_SUPPORT_LS & *msg_id) {
+                               msg = (*msg_id & PP_STATE_MASK) & PP_STATE_LS ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_SDMA_MGLS_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               case PP_BLOCK_SYS_ROM:
+                       if (PP_STATE_SUPPORT_CG & *msg_id) {
+                               msg = ((*msg_id & PP_STATE_MASK) & PP_STATE_CG) ?
+                                               PPSMC_MSG_EnableClockGatingFeature :
+                                               PPSMC_MSG_DisableClockGatingFeature;
+                               value = CG_SYS_ROM_MASK;
+
+                               if (smum_send_msg_to_smc_with_parameter(
+                                               hwmgr->smumgr, msg, value))
+                                       return -1;
+                       }
+                       break;
+
+               default:
+                       return -1;
+
+               }
+               break;
+
+       default:
+               return -1;
+
+       }
+
+       return 0;
+}
+
+/* This function is for Polaris11 only for now,
+ * Powerplay will only control the static per CU Power Gating.
+ * Dynamic per CU Power Gating will be done in gfx.
+ */
+int polaris10_phm_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable)
+{
+       struct cgs_system_info sys_info = {0};
+       uint32_t active_cus;
+       int result;
+
+       sys_info.size = sizeof(struct cgs_system_info);
+       sys_info.info_id = CGS_SYSTEM_INFO_GFX_CU_INFO;
+
+       result = cgs_query_system_info(hwmgr->device, &sys_info);
+
+       if (result)
+               return -EINVAL;
+       else
+               active_cus = sys_info.value;
+
+       if (enable)
+               return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_GFX_CU_PG_ENABLE, active_cus);
+       else
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_GFX_CU_PG_DISABLE);
+}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_clockpowergating.h
new file mode 100644 (file)
index 0000000..88d68cb
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef _POLARIS10_CLOCK_POWER_GATING_H_
+#define _POLARIS10_CLOCK_POWER_GATING_H_
+
+#include "polaris10_hwmgr.h"
+#include "pp_asicblocks.h"
+
+int polaris10_phm_powergate_vce(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_phm_powergate_uvd(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_phm_powerdown_uvd(struct pp_hwmgr *hwmgr);
+int polaris10_phm_powergate_samu(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_phm_powergate_acp(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_phm_disable_clock_power_gating(struct pp_hwmgr *hwmgr);
+int polaris10_phm_update_clock_gatings(struct pp_hwmgr *hwmgr,
+                                       const uint32_t *msg_id);
+int polaris10_phm_enable_per_cu_power_gating(struct pp_hwmgr *hwmgr, bool enable);
+
+#endif /* _POLARIS10_CLOCK_POWER_GATING_H_ */
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_dyn_defaults.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_dyn_defaults.h
new file mode 100644 (file)
index 0000000..f78ffd9
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef POLARIS10_DYN_DEFAULTS_H
+#define POLARIS10_DYN_DEFAULTS_H
+
+
+enum Polaris10dpm_TrendDetection {
+       Polaris10Adpm_TrendDetection_AUTO,
+       Polaris10Adpm_TrendDetection_UP,
+       Polaris10Adpm_TrendDetection_DOWN
+};
+typedef enum Polaris10dpm_TrendDetection Polaris10dpm_TrendDetection;
+
+/*  We need to fill in the default values */
+
+
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT0              0x3FFFC102
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT1              0x000400
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT2              0xC00080
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT3              0xC00200
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT4              0xC01680
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT5              0xC00033
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT6              0xC00033
+#define PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT7              0x3FFFC000
+
+
+#define PPPOLARIS10_THERMALPROTECTCOUNTER_DFLT            0x200
+#define PPPOLARIS10_STATICSCREENTHRESHOLDUNIT_DFLT        0
+#define PPPOLARIS10_STATICSCREENTHRESHOLD_DFLT            0x00C8
+#define PPPOLARIS10_GFXIDLECLOCKSTOPTHRESHOLD_DFLT        0x200
+#define PPPOLARIS10_REFERENCEDIVIDER_DFLT                  4
+
+#define PPPOLARIS10_ULVVOLTAGECHANGEDELAY_DFLT             1687
+
+#define PPPOLARIS10_CGULVPARAMETER_DFLT                    0x00040035
+#define PPPOLARIS10_CGULVCONTROL_DFLT                      0x00007450
+#define PPPOLARIS10_TARGETACTIVITY_DFLT                     50
+#define PPPOLARIS10_MCLK_TARGETACTIVITY_DFLT                10
+
+#endif
+
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.c
new file mode 100644 (file)
index 0000000..93768fa
--- /dev/null
@@ -0,0 +1,4995 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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 <linux/module.h>
+#include <linux/slab.h>
+#include <linux/fb.h>
+#include <asm/div64.h>
+#include "linux/delay.h"
+#include "pp_acpi.h"
+#include "hwmgr.h"
+#include "polaris10_hwmgr.h"
+#include "polaris10_powertune.h"
+#include "polaris10_dyn_defaults.h"
+#include "polaris10_smumgr.h"
+#include "pp_debug.h"
+#include "ppatomctrl.h"
+#include "atombios.h"
+#include "tonga_pptable.h"
+#include "pppcielanes.h"
+#include "amd_pcie_helpers.h"
+#include "hardwaremanager.h"
+#include "tonga_processpptables.h"
+#include "cgs_common.h"
+#include "smu74.h"
+#include "smu_ucode_xfer_vi.h"
+#include "smu74_discrete.h"
+#include "smu/smu_7_1_3_d.h"
+#include "smu/smu_7_1_3_sh_mask.h"
+#include "gmc/gmc_8_1_d.h"
+#include "gmc/gmc_8_1_sh_mask.h"
+#include "oss/oss_3_0_d.h"
+#include "gca/gfx_8_0_d.h"
+#include "bif/bif_5_0_d.h"
+#include "bif/bif_5_0_sh_mask.h"
+#include "gmc/gmc_8_1_d.h"
+#include "gmc/gmc_8_1_sh_mask.h"
+#include "bif/bif_5_0_d.h"
+#include "bif/bif_5_0_sh_mask.h"
+#include "dce/dce_10_0_d.h"
+#include "dce/dce_10_0_sh_mask.h"
+
+#include "polaris10_thermal.h"
+#include "polaris10_clockpowergating.h"
+
+#define MC_CG_ARB_FREQ_F0           0x0a
+#define MC_CG_ARB_FREQ_F1           0x0b
+#define MC_CG_ARB_FREQ_F2           0x0c
+#define MC_CG_ARB_FREQ_F3           0x0d
+
+#define MC_CG_SEQ_DRAMCONF_S0       0x05
+#define MC_CG_SEQ_DRAMCONF_S1       0x06
+#define MC_CG_SEQ_YCLK_SUSPEND      0x04
+#define MC_CG_SEQ_YCLK_RESUME       0x0a
+
+
+#define SMC_RAM_END 0x40000
+
+#define SMC_CG_IND_START            0xc0030000
+#define SMC_CG_IND_END              0xc0040000
+
+#define VOLTAGE_SCALE               4
+#define VOLTAGE_VID_OFFSET_SCALE1   625
+#define VOLTAGE_VID_OFFSET_SCALE2   100
+
+#define VDDC_VDDCI_DELTA            200
+
+#define MEM_FREQ_LOW_LATENCY        25000
+#define MEM_FREQ_HIGH_LATENCY       80000
+
+#define MEM_LATENCY_HIGH            45
+#define MEM_LATENCY_LOW             35
+#define MEM_LATENCY_ERR             0xFFFF
+
+#define MC_SEQ_MISC0_GDDR5_SHIFT 28
+#define MC_SEQ_MISC0_GDDR5_MASK  0xf0000000
+#define MC_SEQ_MISC0_GDDR5_VALUE 5
+
+
+#define PCIE_BUS_CLK                10000
+#define TCLK                        (PCIE_BUS_CLK / 10)
+
+
+static const uint16_t polaris10_clock_stretcher_lookup_table[2][4] =
+{ {600, 1050, 3, 0}, {600, 1050, 6, 1} };
+
+/*  [FF, SS] type, [] 4 voltage ranges, and [Floor Freq, Boundary Freq, VID min , VID max] */
+static const uint32_t polaris10_clock_stretcher_ddt_table[2][4][4] =
+{ { {265, 529, 120, 128}, {325, 650, 96, 119}, {430, 860, 32, 95}, {0, 0, 0, 31} },
+  { {275, 550, 104, 112}, {319, 638, 96, 103}, {360, 720, 64, 95}, {384, 768, 32, 63} } };
+
+/*  [Use_For_Low_freq] value, [0%, 5%, 10%, 7.14%, 14.28%, 20%] (coming from PWR_CKS_CNTL.stretch_amount reg spec) */
+static const uint8_t polaris10_clock_stretch_amount_conversion[2][6] =
+{ {0, 1, 3, 2, 4, 5}, {0, 2, 4, 5, 6, 5} };
+
+/** Values for the CG_THERMAL_CTRL::DPM_EVENT_SRC field. */
+enum DPM_EVENT_SRC {
+       DPM_EVENT_SRC_ANALOG = 0,
+       DPM_EVENT_SRC_EXTERNAL = 1,
+       DPM_EVENT_SRC_DIGITAL = 2,
+       DPM_EVENT_SRC_ANALOG_OR_EXTERNAL = 3,
+       DPM_EVENT_SRC_DIGITAL_OR_EXTERNAL = 4
+};
+
+static const unsigned long PhwPolaris10_Magic = (unsigned long)(PHM_VIslands_Magic);
+
+struct polaris10_power_state *cast_phw_polaris10_power_state(
+                                 struct pp_hw_power_state *hw_ps)
+{
+       PP_ASSERT_WITH_CODE((PhwPolaris10_Magic == hw_ps->magic),
+                               "Invalid Powerstate Type!",
+                                return NULL);
+
+       return (struct polaris10_power_state *)hw_ps;
+}
+
+const struct polaris10_power_state *cast_const_phw_polaris10_power_state(
+                                const struct pp_hw_power_state *hw_ps)
+{
+       PP_ASSERT_WITH_CODE((PhwPolaris10_Magic == hw_ps->magic),
+                               "Invalid Powerstate Type!",
+                                return NULL);
+
+       return (const struct polaris10_power_state *)hw_ps;
+}
+
+static bool polaris10_is_dpm_running(struct pp_hwmgr *hwmgr)
+{
+       return (1 == PHM_READ_INDIRECT_FIELD(hwmgr->device,
+                       CGS_IND_REG__SMC, FEATURE_STATUS, VOLTAGE_CONTROLLER_ON))
+                       ? true : false;
+}
+
+/**
+ * Find the MC microcode version and store it in the HwMgr struct
+ *
+ * @param    hwmgr  the address of the powerplay hardware manager.
+ * @return   always 0
+ */
+int phm_get_mc_microcode_version (struct pp_hwmgr *hwmgr)
+{
+       cgs_write_register(hwmgr->device, mmMC_SEQ_IO_DEBUG_INDEX, 0x9F);
+
+       hwmgr->microcode_version_info.MC = cgs_read_register(hwmgr->device, mmMC_SEQ_IO_DEBUG_DATA);
+
+       return 0;
+}
+
+uint16_t phm_get_current_pcie_speed(struct pp_hwmgr *hwmgr)
+{
+       uint32_t speedCntl = 0;
+
+       /* mmPCIE_PORT_INDEX rename as mmPCIE_INDEX */
+       speedCntl = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__PCIE,
+                       ixPCIE_LC_SPEED_CNTL);
+       return((uint16_t)PHM_GET_FIELD(speedCntl,
+                       PCIE_LC_SPEED_CNTL, LC_CURRENT_DATA_RATE));
+}
+
+int phm_get_current_pcie_lane_number(struct pp_hwmgr *hwmgr)
+{
+       uint32_t link_width;
+
+       /* mmPCIE_PORT_INDEX rename as mmPCIE_INDEX */
+       link_width = PHM_READ_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__PCIE,
+                       PCIE_LC_LINK_WIDTH_CNTL, LC_LINK_WIDTH_RD);
+
+       PP_ASSERT_WITH_CODE((7 >= link_width),
+                       "Invalid PCIe lane width!", return 0);
+
+       return decode_pcie_lane_width(link_width);
+}
+
+void phm_apply_dal_min_voltage_request(struct pp_hwmgr *hwmgr)
+{
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)hwmgr->pptable;
+       struct phm_clock_voltage_dependency_table *table =
+                               table_info->vddc_dep_on_dal_pwrl;
+       struct phm_ppt_v1_clock_voltage_dependency_table *vddc_table;
+       enum PP_DAL_POWERLEVEL dal_power_level = hwmgr->dal_power_level;
+       uint32_t req_vddc = 0, req_volt, i;
+
+       if (!table && !(dal_power_level >= PP_DAL_POWERLEVEL_ULTRALOW &&
+                       dal_power_level <= PP_DAL_POWERLEVEL_PERFORMANCE))
+               return;
+
+       for (i = 0; i < table->count; i++) {
+               if (dal_power_level == table->entries[i].clk) {
+                       req_vddc = table->entries[i].v;
+                       break;
+               }
+       }
+
+       vddc_table = table_info->vdd_dep_on_sclk;
+       for (i = 0; i < vddc_table->count; i++) {
+               if (req_vddc <= vddc_table->entries[i].vddc) {
+                       req_volt = (((uint32_t)vddc_table->entries[i].vddc) * VOLTAGE_SCALE)
+                                       << VDDC_SHIFT;
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_VddC_Request, req_volt);
+                       return;
+               }
+       }
+       printk(KERN_ERR "DAL requested level can not"
+                       " found a available voltage in VDDC DPM Table \n");
+}
+
+/**
+* Enable voltage control
+*
+* @param    pHwMgr  the address of the powerplay hardware manager.
+* @return   always PP_Result_OK
+*/
+int polaris10_enable_smc_voltage_controller(struct pp_hwmgr *hwmgr)
+{
+       PP_ASSERT_WITH_CODE(
+               (hwmgr->smumgr->smumgr_funcs->send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Voltage_Cntl_Enable) == 0),
+               "Failed to enable voltage DPM during DPM Start Function!",
+               return 1;
+       );
+
+       return 0;
+}
+
+/**
+* Checks if we want to support voltage control
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+*/
+static bool polaris10_voltage_control(const struct pp_hwmgr *hwmgr)
+{
+       const struct polaris10_hwmgr *data =
+                       (const struct polaris10_hwmgr *)(hwmgr->backend);
+
+       return (POLARIS10_VOLTAGE_CONTROL_NONE != data->voltage_control);
+}
+
+/**
+* Enable voltage control
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_enable_voltage_control(struct pp_hwmgr *hwmgr)
+{
+       /* enable voltage control */
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       GENERAL_PWRMGT, VOLT_PWRMGT_EN, 1);
+
+       return 0;
+}
+
+/**
+* Create Voltage Tables.
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_construct_voltage_tables(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)hwmgr->pptable;
+       int result;
+
+       if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->mvdd_control) {
+               result = atomctrl_get_voltage_table_v3(hwmgr,
+                               VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT,
+                               &(data->mvdd_voltage_table));
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to retrieve MVDD table.",
+                               return result);
+       } else if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->mvdd_control) {
+               result = phm_get_svi2_mvdd_voltage_table(&(data->mvdd_voltage_table),
+                               table_info->vdd_dep_on_mclk);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to retrieve SVI2 MVDD table from dependancy table.",
+                               return result;);
+       }
+
+       if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->vddci_control) {
+               result = atomctrl_get_voltage_table_v3(hwmgr,
+                               VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_GPIO_LUT,
+                               &(data->vddci_voltage_table));
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to retrieve VDDCI table.",
+                               return result);
+       } else if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->vddci_control) {
+               result = phm_get_svi2_vddci_voltage_table(&(data->vddci_voltage_table),
+                               table_info->vdd_dep_on_mclk);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to retrieve SVI2 VDDCI table from dependancy table.",
+                               return result);
+       }
+
+       if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->voltage_control) {
+               result = phm_get_svi2_vdd_voltage_table(&(data->vddc_voltage_table),
+                               table_info->vddc_lookup_table);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to retrieve SVI2 VDDC table from lookup table.",
+                               return result);
+       }
+
+       PP_ASSERT_WITH_CODE(
+                       (data->vddc_voltage_table.count <= (SMU74_MAX_LEVELS_VDDC)),
+                       "Too many voltage values for VDDC. Trimming to fit state table.",
+                       phm_trim_voltage_table_to_fit_state_table(SMU74_MAX_LEVELS_VDDC,
+                                                               &(data->vddc_voltage_table)));
+
+       PP_ASSERT_WITH_CODE(
+                       (data->vddci_voltage_table.count <= (SMU74_MAX_LEVELS_VDDCI)),
+                       "Too many voltage values for VDDCI. Trimming to fit state table.",
+                       phm_trim_voltage_table_to_fit_state_table(SMU74_MAX_LEVELS_VDDCI,
+                                       &(data->vddci_voltage_table)));
+
+       PP_ASSERT_WITH_CODE(
+                       (data->mvdd_voltage_table.count <= (SMU74_MAX_LEVELS_MVDD)),
+                       "Too many voltage values for MVDD. Trimming to fit state table.",
+                       phm_trim_voltage_table_to_fit_state_table(SMU74_MAX_LEVELS_MVDD,
+                                                          &(data->mvdd_voltage_table)));
+
+       return 0;
+}
+
+/**
+* Programs static screed detection parameters
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_program_static_screen_threshold_parameters(
+                                                       struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /* Set static screen threshold unit */
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_STATIC_SCREEN_PARAMETER, STATIC_SCREEN_THRESHOLD_UNIT,
+                       data->static_screen_threshold_unit);
+       /* Set static screen threshold */
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_STATIC_SCREEN_PARAMETER, STATIC_SCREEN_THRESHOLD,
+                       data->static_screen_threshold);
+
+       return 0;
+}
+
+/**
+* Setup display gap for glitch free memory clock switching.
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always  0
+*/
+static int polaris10_enable_display_gap(struct pp_hwmgr *hwmgr)
+{
+       uint32_t display_gap =
+                       cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                                       ixCG_DISPLAY_GAP_CNTL);
+
+       display_gap = PHM_SET_FIELD(display_gap, CG_DISPLAY_GAP_CNTL,
+                       DISP_GAP, DISPLAY_GAP_IGNORE);
+
+       display_gap = PHM_SET_FIELD(display_gap, CG_DISPLAY_GAP_CNTL,
+                       DISP_GAP_MCHG, DISPLAY_GAP_VBLANK);
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_DISPLAY_GAP_CNTL, display_gap);
+
+       return 0;
+}
+
+/**
+* Programs activity state transition voting clients
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always  0
+*/
+static int polaris10_program_voting_clients(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /* Clear reset for voting clients before enabling DPM */
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       SCLK_PWRMGT_CNTL, RESET_SCLK_CNT, 0);
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       SCLK_PWRMGT_CNTL, RESET_BUSY_CNT, 0);
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_0, data->voting_rights_clients0);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_1, data->voting_rights_clients1);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_2, data->voting_rights_clients2);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_3, data->voting_rights_clients3);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_4, data->voting_rights_clients4);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_5, data->voting_rights_clients5);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_6, data->voting_rights_clients6);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixCG_FREQ_TRAN_VOTING_7, data->voting_rights_clients7);
+
+       return 0;
+}
+
+/**
+* Get the location of various tables inside the FW image.
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always  0
+*/
+static int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
+       uint32_t tmp;
+       int result;
+       bool error = false;
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, DpmTable),
+                       &tmp, data->sram_end);
+
+       if (0 == result)
+               data->dpm_table_start = tmp;
+
+       error |= (0 != result);
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, SoftRegisters),
+                       &tmp, data->sram_end);
+
+       if (!result) {
+               data->soft_regs_start = tmp;
+               smu_data->soft_regs_start = tmp;
+       }
+
+       error |= (0 != result);
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, mcRegisterTable),
+                       &tmp, data->sram_end);
+
+       if (!result)
+               data->mc_reg_table_start = tmp;
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, FanTable),
+                       &tmp, data->sram_end);
+
+       if (!result)
+               data->fan_table_start = tmp;
+
+       error |= (0 != result);
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, mcArbDramTimingTable),
+                       &tmp, data->sram_end);
+
+       if (!result)
+               data->arb_table_start = tmp;
+
+       error |= (0 != result);
+
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       SMU7_FIRMWARE_HEADER_LOCATION +
+                       offsetof(SMU74_Firmware_Header, Version),
+                       &tmp, data->sram_end);
+
+       if (!result)
+               hwmgr->microcode_version_info.SMC = tmp;
+
+       error |= (0 != result);
+
+       return error ? -1 : 0;
+}
+
+/* Copy one arb setting to another and then switch the active set.
+ * arb_src and arb_dest is one of the MC_CG_ARB_FREQ_Fx constants.
+ */
+static int polaris10_copy_and_switch_arb_sets(struct pp_hwmgr *hwmgr,
+               uint32_t arb_src, uint32_t arb_dest)
+{
+       uint32_t mc_arb_dram_timing;
+       uint32_t mc_arb_dram_timing2;
+       uint32_t burst_time;
+       uint32_t mc_cg_config;
+
+       switch (arb_src) {
+       case MC_CG_ARB_FREQ_F0:
+               mc_arb_dram_timing  = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING);
+               mc_arb_dram_timing2 = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING2);
+               burst_time = PHM_READ_FIELD(hwmgr->device, MC_ARB_BURST_TIME, STATE0);
+               break;
+       case MC_CG_ARB_FREQ_F1:
+               mc_arb_dram_timing  = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING_1);
+               mc_arb_dram_timing2 = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING2_1);
+               burst_time = PHM_READ_FIELD(hwmgr->device, MC_ARB_BURST_TIME, STATE1);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       switch (arb_dest) {
+       case MC_CG_ARB_FREQ_F0:
+               cgs_write_register(hwmgr->device, mmMC_ARB_DRAM_TIMING, mc_arb_dram_timing);
+               cgs_write_register(hwmgr->device, mmMC_ARB_DRAM_TIMING2, mc_arb_dram_timing2);
+               PHM_WRITE_FIELD(hwmgr->device, MC_ARB_BURST_TIME, STATE0, burst_time);
+               break;
+       case MC_CG_ARB_FREQ_F1:
+               cgs_write_register(hwmgr->device, mmMC_ARB_DRAM_TIMING_1, mc_arb_dram_timing);
+               cgs_write_register(hwmgr->device, mmMC_ARB_DRAM_TIMING2_1, mc_arb_dram_timing2);
+               PHM_WRITE_FIELD(hwmgr->device, MC_ARB_BURST_TIME, STATE1, burst_time);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       mc_cg_config = cgs_read_register(hwmgr->device, mmMC_CG_CONFIG);
+       mc_cg_config |= 0x0000000F;
+       cgs_write_register(hwmgr->device, mmMC_CG_CONFIG, mc_cg_config);
+       PHM_WRITE_FIELD(hwmgr->device, MC_ARB_CG, CG_ARB_REQ, arb_dest);
+
+       return 0;
+}
+
+/**
+* Initial switch from ARB F0->F1
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+* This function is to be called from the SetPowerState table.
+*/
+static int polaris10_initial_switch_from_arbf0_to_f1(struct pp_hwmgr *hwmgr)
+{
+       return polaris10_copy_and_switch_arb_sets(hwmgr,
+                       MC_CG_ARB_FREQ_F0, MC_CG_ARB_FREQ_F1);
+}
+
+static int polaris10_setup_default_pcie_table(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_pcie_table *pcie_table = table_info->pcie_table;
+       uint32_t i, max_entry;
+
+       PP_ASSERT_WITH_CODE((data->use_pcie_performance_levels ||
+                       data->use_pcie_power_saving_levels), "No pcie performance levels!",
+                       return -EINVAL);
+
+       if (data->use_pcie_performance_levels &&
+                       !data->use_pcie_power_saving_levels) {
+               data->pcie_gen_power_saving = data->pcie_gen_performance;
+               data->pcie_lane_power_saving = data->pcie_lane_performance;
+       } else if (!data->use_pcie_performance_levels &&
+                       data->use_pcie_power_saving_levels) {
+               data->pcie_gen_performance = data->pcie_gen_power_saving;
+               data->pcie_lane_performance = data->pcie_lane_power_saving;
+       }
+
+       phm_reset_single_dpm_table(&data->dpm_table.pcie_speed_table,
+                                       SMU74_MAX_LEVELS_LINK,
+                                       MAX_REGULAR_DPM_NUMBER);
+
+       if (pcie_table != NULL) {
+               /* max_entry is used to make sure we reserve one PCIE level
+                * for boot level (fix for A+A PSPP issue).
+                * If PCIE table from PPTable have ULV entry + 8 entries,
+                * then ignore the last entry.*/
+               max_entry = (SMU74_MAX_LEVELS_LINK < pcie_table->count) ?
+                               SMU74_MAX_LEVELS_LINK : pcie_table->count;
+               for (i = 1; i < max_entry; i++) {
+                       phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, i - 1,
+                                       get_pcie_gen_support(data->pcie_gen_cap,
+                                                       pcie_table->entries[i].gen_speed),
+                                       get_pcie_lane_support(data->pcie_lane_cap,
+                                                       pcie_table->entries[i].lane_width));
+               }
+               data->dpm_table.pcie_speed_table.count = max_entry - 1;
+
+               /* Setup BIF_SCLK levels */
+               for (i = 0; i < max_entry; i++)
+                       data->bif_sclk_table[i] = pcie_table->entries[i].pcie_sclk;
+       } else {
+               /* Hardcode Pcie Table */
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 0,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Min_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 1,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Min_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 2,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Max_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 3,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Max_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 4,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Max_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+               phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table, 5,
+                               get_pcie_gen_support(data->pcie_gen_cap,
+                                               PP_Max_PCIEGen),
+                               get_pcie_lane_support(data->pcie_lane_cap,
+                                               PP_Max_PCIELane));
+
+               data->dpm_table.pcie_speed_table.count = 6;
+       }
+       /* Populate last level for boot PCIE level, but do not increment count. */
+       phm_setup_pcie_table_entry(&data->dpm_table.pcie_speed_table,
+                       data->dpm_table.pcie_speed_table.count,
+                       get_pcie_gen_support(data->pcie_gen_cap,
+                                       PP_Min_PCIEGen),
+                       get_pcie_lane_support(data->pcie_lane_cap,
+                                       PP_Max_PCIELane));
+
+       return 0;
+}
+
+/*
+ * This function is to initalize all DPM state tables
+ * for SMU7 based on the dependency table.
+ * Dynamic state patching function will then trim these
+ * state tables to the allowed range based
+ * on the power policy or external client requests,
+ * such as UVD request, etc.
+ */
+int polaris10_setup_default_dpm_tables(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       uint32_t i;
+
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table =
+                       table_info->vdd_dep_on_sclk;
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
+                       table_info->vdd_dep_on_mclk;
+
+       PP_ASSERT_WITH_CODE(dep_sclk_table != NULL,
+                       "SCLK dependency table is missing. This table is mandatory",
+                       return -EINVAL);
+       PP_ASSERT_WITH_CODE(dep_sclk_table->count >= 1,
+                       "SCLK dependency table has to have is missing."
+                       "This table is mandatory",
+                       return -EINVAL);
+
+       PP_ASSERT_WITH_CODE(dep_mclk_table != NULL,
+                       "MCLK dependency table is missing. This table is mandatory",
+                       return -EINVAL);
+       PP_ASSERT_WITH_CODE(dep_mclk_table->count >= 1,
+                       "MCLK dependency table has to have is missing."
+                       "This table is mandatory",
+                       return -EINVAL);
+
+       /* clear the state table to reset everything to default */
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.sclk_table, SMU74_MAX_LEVELS_GRAPHICS, MAX_REGULAR_DPM_NUMBER);
+       phm_reset_single_dpm_table(
+                       &data->dpm_table.mclk_table, SMU74_MAX_LEVELS_MEMORY, MAX_REGULAR_DPM_NUMBER);
+
+
+       /* Initialize Sclk DPM table based on allow Sclk values */
+       data->dpm_table.sclk_table.count = 0;
+       for (i = 0; i < dep_sclk_table->count; i++) {
+               if (i == 0 || data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count - 1].value !=
+                                               dep_sclk_table->entries[i].clk) {
+
+                       data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].value =
+                                       dep_sclk_table->entries[i].clk;
+
+                       data->dpm_table.sclk_table.dpm_levels[data->dpm_table.sclk_table.count].enabled =
+                                       (i == 0) ? true : false;
+                       data->dpm_table.sclk_table.count++;
+               }
+       }
+
+       /* Initialize Mclk DPM table based on allow Mclk values */
+       data->dpm_table.mclk_table.count = 0;
+       for (i = 0; i < dep_mclk_table->count; i++) {
+               if (i == 0 || data->dpm_table.mclk_table.dpm_levels
+                               [data->dpm_table.mclk_table.count - 1].value !=
+                                               dep_mclk_table->entries[i].clk) {
+                       data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].value =
+                                                       dep_mclk_table->entries[i].clk;
+                       data->dpm_table.mclk_table.dpm_levels[data->dpm_table.mclk_table.count].enabled =
+                                                       (i == 0) ? true : false;
+                       data->dpm_table.mclk_table.count++;
+               }
+       }
+
+       /* setup PCIE gen speed levels */
+       polaris10_setup_default_pcie_table(hwmgr);
+
+       /* save a copy of the default DPM table */
+       memcpy(&(data->golden_dpm_table), &(data->dpm_table),
+                       sizeof(struct polaris10_dpm_table));
+
+       return 0;
+}
+
+uint8_t convert_to_vid(uint16_t vddc)
+{
+       return (uint8_t) ((6200 - (vddc * VOLTAGE_SCALE)) / 25);
+}
+
+/**
+ * Mvdd table preparation for SMC.
+ *
+ * @param    *hwmgr The address of the hardware manager.
+ * @param    *table The SMC DPM table structure to be populated.
+ * @return   0
+ */
+static int polaris10_populate_smc_mvdd_table(struct pp_hwmgr *hwmgr,
+                       SMU74_Discrete_DpmTable *table)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t count, level;
+
+       if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->mvdd_control) {
+               count = data->mvdd_voltage_table.count;
+               if (count > SMU_MAX_SMIO_LEVELS)
+                       count = SMU_MAX_SMIO_LEVELS;
+               for (level = 0; level < count; level++) {
+                       table->SmioTable2.Pattern[level].Voltage =
+                               PP_HOST_TO_SMC_US(data->mvdd_voltage_table.entries[count].value * VOLTAGE_SCALE);
+                       /* Index into DpmTable.Smio. Drive bits from Smio entry to get this voltage level.*/
+                       table->SmioTable2.Pattern[level].Smio =
+                               (uint8_t) level;
+                       table->Smio[level] |=
+                               data->mvdd_voltage_table.entries[level].smio_low;
+               }
+               table->SmioMask2 = data->vddci_voltage_table.mask_low;
+
+               table->MvddLevelCount = (uint32_t) PP_HOST_TO_SMC_UL(count);
+       }
+
+       return 0;
+}
+
+static int polaris10_populate_smc_vddci_table(struct pp_hwmgr *hwmgr,
+                                       struct SMU74_Discrete_DpmTable *table)
+{
+       uint32_t count, level;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       count = data->vddci_voltage_table.count;
+
+       if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->vddci_control) {
+               if (count > SMU_MAX_SMIO_LEVELS)
+                       count = SMU_MAX_SMIO_LEVELS;
+               for (level = 0; level < count; ++level) {
+                       table->SmioTable1.Pattern[level].Voltage =
+                               PP_HOST_TO_SMC_US(data->vddci_voltage_table.entries[level].value * VOLTAGE_SCALE);
+                       table->SmioTable1.Pattern[level].Smio = (uint8_t) level;
+
+                       table->Smio[level] |= data->vddci_voltage_table.entries[level].smio_low;
+               }
+       }
+
+       table->SmioMask1 = data->vddci_voltage_table.mask_low;
+
+       return 0;
+}
+
+/**
+* Preparation of vddc and vddgfx CAC tables for SMC.
+*
+* @param    hwmgr  the address of the hardware manager
+* @param    table  the SMC DPM table structure to be populated
+* @return   always 0
+*/
+static int polaris10_populate_cac_table(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       uint32_t count;
+       uint8_t index;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_voltage_lookup_table *lookup_table =
+                       table_info->vddc_lookup_table;
+       /* tables is already swapped, so in order to use the value from it,
+        * we need to swap it back.
+        * We are populating vddc CAC data to BapmVddc table
+        * in split and merged mode
+        */
+       for (count = 0; count < lookup_table->count; count++) {
+               index = phm_get_voltage_index(lookup_table,
+                               data->vddc_voltage_table.entries[count].value);
+               table->BapmVddcVidLoSidd[count] = convert_to_vid(lookup_table->entries[index].us_cac_low);
+               table->BapmVddcVidHiSidd[count] = convert_to_vid(lookup_table->entries[index].us_cac_mid);
+               table->BapmVddcVidHiSidd2[count] = convert_to_vid(lookup_table->entries[index].us_cac_high);
+       }
+
+       return 0;
+}
+
+/**
+* Preparation of voltage tables for SMC.
+*
+* @param    hwmgr   the address of the hardware manager
+* @param    table   the SMC DPM table structure to be populated
+* @return   always  0
+*/
+
+int polaris10_populate_smc_voltage_tables(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       polaris10_populate_smc_vddci_table(hwmgr, table);
+       polaris10_populate_smc_mvdd_table(hwmgr, table);
+       polaris10_populate_cac_table(hwmgr, table);
+
+       return 0;
+}
+
+static int polaris10_populate_ulv_level(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_Ulv *state)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       state->CcPwrDynRm = 0;
+       state->CcPwrDynRm1 = 0;
+
+       state->VddcOffset = (uint16_t) table_info->us_ulv_voltage_offset;
+       state->VddcOffsetVid = (uint8_t)(table_info->us_ulv_voltage_offset *
+                       VOLTAGE_VID_OFFSET_SCALE2 / VOLTAGE_VID_OFFSET_SCALE1);
+
+       state->VddcPhase = (data->vddc_phase_shed_control) ? 0 : 1;
+
+       CONVERT_FROM_HOST_TO_SMC_UL(state->CcPwrDynRm);
+       CONVERT_FROM_HOST_TO_SMC_UL(state->CcPwrDynRm1);
+       CONVERT_FROM_HOST_TO_SMC_US(state->VddcOffset);
+
+       return 0;
+}
+
+static int polaris10_populate_ulv_state(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       return polaris10_populate_ulv_level(hwmgr, &table->Ulv);
+}
+
+static int polaris10_populate_smc_link_level(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_dpm_table *dpm_table = &data->dpm_table;
+       int i;
+
+       /* Index (dpm_table->pcie_speed_table.count)
+        * is reserved for PCIE boot level. */
+       for (i = 0; i <= dpm_table->pcie_speed_table.count; i++) {
+               table->LinkLevel[i].PcieGenSpeed  =
+                               (uint8_t)dpm_table->pcie_speed_table.dpm_levels[i].value;
+               table->LinkLevel[i].PcieLaneCount = (uint8_t)encode_pcie_lane_width(
+                               dpm_table->pcie_speed_table.dpm_levels[i].param1);
+               table->LinkLevel[i].EnabledForActivity = 1;
+               table->LinkLevel[i].SPC = (uint8_t)(data->pcie_spc_cap & 0xff);
+               table->LinkLevel[i].DownThreshold = PP_HOST_TO_SMC_UL(5);
+               table->LinkLevel[i].UpThreshold = PP_HOST_TO_SMC_UL(30);
+       }
+
+       data->smc_state_table.LinkLevelCount =
+                       (uint8_t)dpm_table->pcie_speed_table.count;
+       data->dpm_level_enable_mask.pcie_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&dpm_table->pcie_speed_table);
+
+       return 0;
+}
+
+static uint32_t polaris10_get_xclk(struct pp_hwmgr *hwmgr)
+{
+       uint32_t reference_clock, tmp;
+       struct cgs_display_info info = {0};
+       struct cgs_mode_info mode_info;
+
+       info.mode_info = &mode_info;
+
+       tmp = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_CLKPIN_CNTL_2, MUX_TCLK_TO_XCLK);
+
+       if (tmp)
+               return TCLK;
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+       reference_clock = mode_info.ref_clock;
+
+       tmp = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_CLKPIN_CNTL, XTALIN_DIVIDE);
+
+       if (0 != tmp)
+               return reference_clock / 4;
+
+       return reference_clock;
+}
+
+/**
+* Calculates the SCLK dividers using the provided engine clock
+*
+* @param    hwmgr  the address of the hardware manager
+* @param    clock  the engine clock to use to populate the structure
+* @param    sclk   the SMC SCLK structure to be populated
+*/
+static int polaris10_calculate_sclk_params(struct pp_hwmgr *hwmgr,
+               uint32_t clock, SMU_SclkSetting *sclk_setting)
+{
+       const struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const SMU74_Discrete_DpmTable *table = &(data->smc_state_table);
+       struct pp_atomctrl_clock_dividers_ai dividers;
+
+       uint32_t ref_clock;
+       uint32_t pcc_target_percent, pcc_target_freq, ss_target_percent, ss_target_freq;
+       uint8_t i;
+       int result;
+       uint64_t temp;
+
+       sclk_setting->SclkFrequency = clock;
+       /* get the engine clock dividers for this clock value */
+       result = atomctrl_get_engine_pll_dividers_ai(hwmgr, clock,  &dividers);
+       if (result == 0) {
+               sclk_setting->Fcw_int = dividers.usSclk_fcw_int;
+               sclk_setting->Fcw_frac = dividers.usSclk_fcw_frac;
+               sclk_setting->Pcc_fcw_int = dividers.usPcc_fcw_int;
+               sclk_setting->PllRange = dividers.ucSclkPllRange;
+               sclk_setting->Sclk_slew_rate = 0x400;
+               sclk_setting->Pcc_up_slew_rate = dividers.usPcc_fcw_slew_frac;
+               sclk_setting->Pcc_down_slew_rate = 0xffff;
+               sclk_setting->SSc_En = dividers.ucSscEnable;
+               sclk_setting->Fcw1_int = dividers.usSsc_fcw1_int;
+               sclk_setting->Fcw1_frac = dividers.usSsc_fcw1_frac;
+               sclk_setting->Sclk_ss_slew_rate = dividers.usSsc_fcw_slew_frac;
+               return result;
+       }
+
+       ref_clock = polaris10_get_xclk(hwmgr);
+
+       for (i = 0; i < NUM_SCLK_RANGE; i++) {
+               if (clock > data->range_table[i].trans_lower_frequency
+               && clock <= data->range_table[i].trans_upper_frequency) {
+                       sclk_setting->PllRange = i;
+                       break;
+               }
+       }
+
+       sclk_setting->Fcw_int = (uint16_t)((clock << table->SclkFcwRangeTable[sclk_setting->PllRange].postdiv) / ref_clock);
+       temp = clock << table->SclkFcwRangeTable[sclk_setting->PllRange].postdiv;
+       temp <<= 0x10;
+       do_div(temp, ref_clock);
+       sclk_setting->Fcw_frac = temp & 0xffff;
+
+       pcc_target_percent = 10; /*  Hardcode 10% for now. */
+       pcc_target_freq = clock - (clock * pcc_target_percent / 100);
+       sclk_setting->Pcc_fcw_int = (uint16_t)((pcc_target_freq << table->SclkFcwRangeTable[sclk_setting->PllRange].postdiv) / ref_clock);
+
+       ss_target_percent = 2; /*  Hardcode 2% for now. */
+       sclk_setting->SSc_En = 0;
+       if (ss_target_percent) {
+               sclk_setting->SSc_En = 1;
+               ss_target_freq = clock - (clock * ss_target_percent / 100);
+               sclk_setting->Fcw1_int = (uint16_t)((ss_target_freq << table->SclkFcwRangeTable[sclk_setting->PllRange].postdiv) / ref_clock);
+               temp = ss_target_freq << table->SclkFcwRangeTable[sclk_setting->PllRange].postdiv;
+               temp <<= 0x10;
+               do_div(temp, ref_clock);
+               sclk_setting->Fcw1_frac = temp & 0xffff;
+       }
+
+       return 0;
+}
+
+static int polaris10_get_dependency_volt_by_clk(struct pp_hwmgr *hwmgr,
+               struct phm_ppt_v1_clock_voltage_dependency_table *dep_table,
+               uint32_t clock, SMU_VoltageLevel *voltage, uint32_t *mvdd)
+{
+       uint32_t i;
+       uint16_t vddci;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       *voltage = *mvdd = 0;
+
+       /* clock - voltage dependency table is empty table */
+       if (dep_table->count == 0)
+               return -EINVAL;
+
+       for (i = 0; i < dep_table->count; i++) {
+               /* find first sclk bigger than request */
+               if (dep_table->entries[i].clk >= clock) {
+                       *voltage |= (dep_table->entries[i].vddc *
+                                       VOLTAGE_SCALE) << VDDC_SHIFT;
+                       if (POLARIS10_VOLTAGE_CONTROL_NONE == data->vddci_control)
+                               *voltage |= (data->vbios_boot_state.vddci_bootup_value *
+                                               VOLTAGE_SCALE) << VDDCI_SHIFT;
+                       else if (dep_table->entries[i].vddci)
+                               *voltage |= (dep_table->entries[i].vddci *
+                                               VOLTAGE_SCALE) << VDDCI_SHIFT;
+                       else {
+                               vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
+                                               (dep_table->entries[i].vddc -
+                                                               (uint16_t)data->vddc_vddci_delta));
+                               *voltage |= (vddci * VOLTAGE_SCALE) <<  VDDCI_SHIFT;
+                       }
+
+                       if (POLARIS10_VOLTAGE_CONTROL_NONE == data->mvdd_control)
+                               *mvdd = data->vbios_boot_state.mvdd_bootup_value *
+                                       VOLTAGE_SCALE;
+                       else if (dep_table->entries[i].mvdd)
+                               *mvdd = (uint32_t) dep_table->entries[i].mvdd *
+                                       VOLTAGE_SCALE;
+
+                       *voltage |= 1 << PHASES_SHIFT;
+                       return 0;
+               }
+       }
+
+       /* sclk is bigger than max sclk in the dependence table */
+       *voltage |= (dep_table->entries[i - 1].vddc * VOLTAGE_SCALE) << VDDC_SHIFT;
+
+       if (POLARIS10_VOLTAGE_CONTROL_NONE == data->vddci_control)
+               *voltage |= (data->vbios_boot_state.vddci_bootup_value *
+                               VOLTAGE_SCALE) << VDDCI_SHIFT;
+       else if (dep_table->entries[i-1].vddci) {
+               vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
+                               (dep_table->entries[i].vddc -
+                                               (uint16_t)data->vddc_vddci_delta));
+               *voltage |= (vddci * VOLTAGE_SCALE) << VDDCI_SHIFT;
+       }
+
+       if (POLARIS10_VOLTAGE_CONTROL_NONE == data->mvdd_control)
+               *mvdd = data->vbios_boot_state.mvdd_bootup_value * VOLTAGE_SCALE;
+       else if (dep_table->entries[i].mvdd)
+               *mvdd = (uint32_t) dep_table->entries[i - 1].mvdd * VOLTAGE_SCALE;
+
+       return 0;
+}
+
+static const sclkFcwRange_t Range_Table[NUM_SCLK_RANGE] =
+{ {VCO_2_4, POSTDIV_DIV_BY_16,  75, 160, 112},
+  {VCO_3_6, POSTDIV_DIV_BY_16, 112, 224, 160},
+  {VCO_2_4, POSTDIV_DIV_BY_8,   75, 160, 112},
+  {VCO_3_6, POSTDIV_DIV_BY_8,  112, 224, 160},
+  {VCO_2_4, POSTDIV_DIV_BY_4,   75, 160, 112},
+  {VCO_3_6, POSTDIV_DIV_BY_4,  112, 216, 160},
+  {VCO_2_4, POSTDIV_DIV_BY_2,   75, 160, 108},
+  {VCO_3_6, POSTDIV_DIV_BY_2,  112, 216, 160} };
+
+static void polaris10_get_sclk_range_table(struct pp_hwmgr *hwmgr)
+{
+       uint32_t i, ref_clk;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       SMU74_Discrete_DpmTable  *table = &(data->smc_state_table);
+       struct pp_atom_ctrl_sclk_range_table range_table_from_vbios = { { {0} } };
+
+       ref_clk = polaris10_get_xclk(hwmgr);
+
+       if (0 == atomctrl_get_smc_sclk_range_table(hwmgr, &range_table_from_vbios)) {
+               for (i = 0; i < NUM_SCLK_RANGE; i++) {
+                       table->SclkFcwRangeTable[i].vco_setting = range_table_from_vbios.entry[i].ucVco_setting;
+                       table->SclkFcwRangeTable[i].postdiv = range_table_from_vbios.entry[i].ucPostdiv;
+                       table->SclkFcwRangeTable[i].fcw_pcc = range_table_from_vbios.entry[i].usFcw_pcc;
+
+                       table->SclkFcwRangeTable[i].fcw_trans_upper = range_table_from_vbios.entry[i].usFcw_trans_upper;
+                       table->SclkFcwRangeTable[i].fcw_trans_lower = range_table_from_vbios.entry[i].usRcw_trans_lower;
+
+                       CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_pcc);
+                       CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_trans_upper);
+                       CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_trans_lower);
+               }
+               return;
+       }
+
+       for (i = 0; i < NUM_SCLK_RANGE; i++) {
+
+               data->range_table[i].trans_lower_frequency = (ref_clk * Range_Table[i].fcw_trans_lower) >> Range_Table[i].postdiv;
+               data->range_table[i].trans_upper_frequency = (ref_clk * Range_Table[i].fcw_trans_upper) >> Range_Table[i].postdiv;
+
+               table->SclkFcwRangeTable[i].vco_setting = Range_Table[i].vco_setting;
+               table->SclkFcwRangeTable[i].postdiv = Range_Table[i].postdiv;
+               table->SclkFcwRangeTable[i].fcw_pcc = Range_Table[i].fcw_pcc;
+
+               table->SclkFcwRangeTable[i].fcw_trans_upper = Range_Table[i].fcw_trans_upper;
+               table->SclkFcwRangeTable[i].fcw_trans_lower = Range_Table[i].fcw_trans_lower;
+
+               CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_pcc);
+               CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_trans_upper);
+               CONVERT_FROM_HOST_TO_SMC_US(table->SclkFcwRangeTable[i].fcw_trans_lower);
+       }
+}
+
+/**
+* Populates single SMC SCLK structure using the provided engine clock
+*
+* @param    hwmgr      the address of the hardware manager
+* @param    clock the engine clock to use to populate the structure
+* @param    sclk        the SMC SCLK structure to be populated
+*/
+
+static int polaris10_populate_single_graphic_level(struct pp_hwmgr *hwmgr,
+               uint32_t clock, uint16_t sclk_al_threshold,
+               struct SMU74_Discrete_GraphicsLevel *level)
+{
+       int result, i, temp;
+       /* PP_Clocks minClocks; */
+       uint32_t mvdd;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       SMU_SclkSetting curr_sclk_setting = { 0 };
+
+       result = polaris10_calculate_sclk_params(hwmgr, clock, &curr_sclk_setting);
+
+       /* populate graphics levels */
+       result = polaris10_get_dependency_volt_by_clk(hwmgr,
+                       table_info->vdd_dep_on_sclk, clock,
+                       &level->MinVoltage, &mvdd);
+
+       PP_ASSERT_WITH_CODE((0 == result),
+                       "can not find VDDC voltage value for "
+                       "VDDC engine clock dependency table",
+                       return result);
+       level->ActivityLevel = sclk_al_threshold;
+
+       level->CcPwrDynRm = 0;
+       level->CcPwrDynRm1 = 0;
+       level->EnabledForActivity = 0;
+       level->EnabledForThrottle = 1;
+       level->UpHyst = 10;
+       level->DownHyst = 0;
+       level->VoltageDownHyst = 0;
+       level->PowerThrottle = 0;
+
+       /*
+       * TODO: get minimum clocks from dal configaration
+       * PECI_GetMinClockSettings(hwmgr->pPECI, &minClocks);
+       */
+       /* data->DisplayTiming.minClockInSR = minClocks.engineClockInSR; */
+
+       /* get level->DeepSleepDivId
+       if (phm_cap_enabled(hwmgr->platformDescriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep))
+               level->DeepSleepDivId = PhwFiji_GetSleepDividerIdFromClock(hwmgr, clock, minClocks.engineClockInSR);
+       */
+       PP_ASSERT_WITH_CODE((clock >= POLARIS10_MINIMUM_ENGINE_CLOCK), "Engine clock can't satisfy stutter requirement!", return 0);
+       for (i = POLARIS10_MAX_DEEPSLEEP_DIVIDER_ID;  ; i--) {
+               temp = clock >> i;
+
+               if (temp >= POLARIS10_MINIMUM_ENGINE_CLOCK || i == 0)
+                       break;
+       }
+
+       level->DeepSleepDivId = i;
+
+       /* Default to slow, highest DPM level will be
+        * set to PPSMC_DISPLAY_WATERMARK_LOW later.
+        */
+       if (data->update_up_hyst)
+               level->UpHyst = (uint8_t)data->up_hyst;
+       if (data->update_down_hyst)
+               level->DownHyst = (uint8_t)data->down_hyst;
+
+       level->SclkSetting = curr_sclk_setting;
+
+       CONVERT_FROM_HOST_TO_SMC_UL(level->MinVoltage);
+       CONVERT_FROM_HOST_TO_SMC_UL(level->CcPwrDynRm);
+       CONVERT_FROM_HOST_TO_SMC_UL(level->CcPwrDynRm1);
+       CONVERT_FROM_HOST_TO_SMC_US(level->ActivityLevel);
+       CONVERT_FROM_HOST_TO_SMC_UL(level->SclkSetting.SclkFrequency);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Fcw_int);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Fcw_frac);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Pcc_fcw_int);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Sclk_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Pcc_up_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Pcc_down_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Fcw1_int);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Fcw1_frac);
+       CONVERT_FROM_HOST_TO_SMC_US(level->SclkSetting.Sclk_ss_slew_rate);
+       return 0;
+}
+
+/**
+* Populates all SMC SCLK levels' structure based on the trimmed allowed dpm engine clock states
+*
+* @param    hwmgr      the address of the hardware manager
+*/
+static int polaris10_populate_all_graphic_levels(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_dpm_table *dpm_table = &data->dpm_table;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_pcie_table *pcie_table = table_info->pcie_table;
+       uint8_t pcie_entry_cnt = (uint8_t) data->dpm_table.pcie_speed_table.count;
+       int result = 0;
+       uint32_t array = data->dpm_table_start +
+                       offsetof(SMU74_Discrete_DpmTable, GraphicsLevel);
+       uint32_t array_size = sizeof(struct SMU74_Discrete_GraphicsLevel) *
+                       SMU74_MAX_LEVELS_GRAPHICS;
+       struct SMU74_Discrete_GraphicsLevel *levels =
+                       data->smc_state_table.GraphicsLevel;
+       uint32_t i, max_entry;
+       uint8_t hightest_pcie_level_enabled = 0,
+               lowest_pcie_level_enabled = 0,
+               mid_pcie_level_enabled = 0,
+               count = 0;
+
+       polaris10_get_sclk_range_table(hwmgr);
+
+       for (i = 0; i < dpm_table->sclk_table.count; i++) {
+
+               result = polaris10_populate_single_graphic_level(hwmgr,
+                               dpm_table->sclk_table.dpm_levels[i].value,
+                               (uint16_t)data->activity_target[i],
+                               &(data->smc_state_table.GraphicsLevel[i]));
+               if (result)
+                       return result;
+
+               /* Making sure only DPM level 0-1 have Deep Sleep Div ID populated. */
+               if (i > 1)
+                       levels[i].DeepSleepDivId = 0;
+       }
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_SPLLShutdownSupport))
+               data->smc_state_table.GraphicsLevel[0].SclkSetting.SSc_En = 0;
+
+       data->smc_state_table.GraphicsLevel[0].EnabledForActivity = 1;
+       data->smc_state_table.GraphicsDpmLevelCount =
+                       (uint8_t)dpm_table->sclk_table.count;
+       data->dpm_level_enable_mask.sclk_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&dpm_table->sclk_table);
+
+
+       if (pcie_table != NULL) {
+               PP_ASSERT_WITH_CODE((1 <= pcie_entry_cnt),
+                               "There must be 1 or more PCIE levels defined in PPTable.",
+                               return -EINVAL);
+               max_entry = pcie_entry_cnt - 1;
+               for (i = 0; i < dpm_table->sclk_table.count; i++)
+                       levels[i].pcieDpmLevel =
+                                       (uint8_t) ((i < max_entry) ? i : max_entry);
+       } else {
+               while (data->dpm_level_enable_mask.pcie_dpm_enable_mask &&
+                               ((data->dpm_level_enable_mask.pcie_dpm_enable_mask &
+                                               (1 << (hightest_pcie_level_enabled + 1))) != 0))
+                       hightest_pcie_level_enabled++;
+
+               while (data->dpm_level_enable_mask.pcie_dpm_enable_mask &&
+                               ((data->dpm_level_enable_mask.pcie_dpm_enable_mask &
+                                               (1 << lowest_pcie_level_enabled)) == 0))
+                       lowest_pcie_level_enabled++;
+
+               while ((count < hightest_pcie_level_enabled) &&
+                               ((data->dpm_level_enable_mask.pcie_dpm_enable_mask &
+                                               (1 << (lowest_pcie_level_enabled + 1 + count))) == 0))
+                       count++;
+
+               mid_pcie_level_enabled = (lowest_pcie_level_enabled + 1 + count) <
+                               hightest_pcie_level_enabled ?
+                                               (lowest_pcie_level_enabled + 1 + count) :
+                                               hightest_pcie_level_enabled;
+
+               /* set pcieDpmLevel to hightest_pcie_level_enabled */
+               for (i = 2; i < dpm_table->sclk_table.count; i++)
+                       levels[i].pcieDpmLevel = hightest_pcie_level_enabled;
+
+               /* set pcieDpmLevel to lowest_pcie_level_enabled */
+               levels[0].pcieDpmLevel = lowest_pcie_level_enabled;
+
+               /* set pcieDpmLevel to mid_pcie_level_enabled */
+               levels[1].pcieDpmLevel = mid_pcie_level_enabled;
+       }
+       /* level count will send to smc once at init smc table and never change */
+       result = polaris10_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
+                       (uint32_t)array_size, data->sram_end);
+
+       return result;
+}
+
+static int polaris10_populate_single_memory_level(struct pp_hwmgr *hwmgr,
+               uint32_t clock, struct SMU74_Discrete_MemoryLevel *mem_level)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       int result = 0;
+       struct cgs_display_info info = {0, 0, NULL};
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+
+       if (table_info->vdd_dep_on_mclk) {
+               result = polaris10_get_dependency_volt_by_clk(hwmgr,
+                               table_info->vdd_dep_on_mclk, clock,
+                               &mem_level->MinVoltage, &mem_level->MinMvdd);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "can not find MinVddc voltage value from memory "
+                               "VDDC voltage dependency table", return result);
+       }
+
+       mem_level->MclkFrequency = clock;
+       mem_level->StutterEnable = 0;
+       mem_level->EnabledForThrottle = 1;
+       mem_level->EnabledForActivity = 0;
+       mem_level->UpHyst = 0;
+       mem_level->DownHyst = 100;
+       mem_level->VoltageDownHyst = 0;
+       mem_level->ActivityLevel = (uint16_t)data->mclk_activity_target;
+       mem_level->StutterEnable = false;
+
+       mem_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
+
+       data->display_timing.num_existing_displays = info.display_count;
+
+       if ((data->mclk_stutter_mode_threshold) &&
+               (clock <= data->mclk_stutter_mode_threshold) &&
+               (PHM_READ_FIELD(hwmgr->device, DPG_PIPE_STUTTER_CONTROL,
+                               STUTTER_ENABLE) & 0x1))
+               mem_level->StutterEnable = true;
+
+       if (!result) {
+               CONVERT_FROM_HOST_TO_SMC_UL(mem_level->MinMvdd);
+               CONVERT_FROM_HOST_TO_SMC_UL(mem_level->MclkFrequency);
+               CONVERT_FROM_HOST_TO_SMC_US(mem_level->ActivityLevel);
+               CONVERT_FROM_HOST_TO_SMC_UL(mem_level->MinVoltage);
+       }
+       return result;
+}
+
+/**
+* Populates all SMC MCLK levels' structure based on the trimmed allowed dpm memory clock states
+*
+* @param    hwmgr      the address of the hardware manager
+*/
+static int polaris10_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_dpm_table *dpm_table = &data->dpm_table;
+       int result;
+       /* populate MCLK dpm table to SMU7 */
+       uint32_t array = data->dpm_table_start +
+                       offsetof(SMU74_Discrete_DpmTable, MemoryLevel);
+       uint32_t array_size = sizeof(SMU74_Discrete_MemoryLevel) *
+                       SMU74_MAX_LEVELS_MEMORY;
+       struct SMU74_Discrete_MemoryLevel *levels =
+                       data->smc_state_table.MemoryLevel;
+       uint32_t i;
+
+       for (i = 0; i < dpm_table->mclk_table.count; i++) {
+               PP_ASSERT_WITH_CODE((0 != dpm_table->mclk_table.dpm_levels[i].value),
+                               "can not populate memory level as memory clock is zero",
+                               return -EINVAL);
+               result = polaris10_populate_single_memory_level(hwmgr,
+                               dpm_table->mclk_table.dpm_levels[i].value,
+                               &levels[i]);
+               if (i == dpm_table->mclk_table.count - 1) {
+                       levels[i].DisplayWatermark = PPSMC_DISPLAY_WATERMARK_HIGH;
+                       levels[i].EnabledForActivity = 1;
+               }
+               if (result)
+                       return result;
+       }
+
+       /* in order to prevent MC activity from stutter mode to push DPM up.
+        * the UVD change complements this by putting the MCLK in
+        * a higher state by default such that we are not effected by
+        * up threshold or and MCLK DPM latency.
+        */
+       levels[0].ActivityLevel = (uint16_t)data->mclk_dpm0_activity_target;
+       CONVERT_FROM_HOST_TO_SMC_US(levels[0].ActivityLevel);
+
+       data->smc_state_table.MemoryDpmLevelCount =
+                       (uint8_t)dpm_table->mclk_table.count;
+       data->dpm_level_enable_mask.mclk_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&dpm_table->mclk_table);
+
+       /* level count will send to smc once at init smc table and never change */
+       result = polaris10_copy_bytes_to_smc(hwmgr->smumgr, array, (uint8_t *)levels,
+                       (uint32_t)array_size, data->sram_end);
+
+       return result;
+}
+
+/**
+* Populates the SMC MVDD structure using the provided memory clock.
+*
+* @param    hwmgr      the address of the hardware manager
+* @param    mclk        the MCLK value to be used in the decision if MVDD should be high or low.
+* @param    voltage     the SMC VOLTAGE structure to be populated
+*/
+int polaris10_populate_mvdd_value(struct pp_hwmgr *hwmgr,
+               uint32_t mclk, SMIO_Pattern *smio_pat)
+{
+       const struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       uint32_t i = 0;
+
+       if (POLARIS10_VOLTAGE_CONTROL_NONE != data->mvdd_control) {
+               /* find mvdd value which clock is more than request */
+               for (i = 0; i < table_info->vdd_dep_on_mclk->count; i++) {
+                       if (mclk <= table_info->vdd_dep_on_mclk->entries[i].clk) {
+                               smio_pat->Voltage = data->mvdd_voltage_table.entries[i].value;
+                               break;
+                       }
+               }
+               PP_ASSERT_WITH_CODE(i < table_info->vdd_dep_on_mclk->count,
+                               "MVDD Voltage is outside the supported range.",
+                               return -EINVAL);
+       } else
+               return -EINVAL;
+
+       return 0;
+}
+
+static int polaris10_populate_smc_acpi_level(struct pp_hwmgr *hwmgr,
+               SMU74_Discrete_DpmTable *table)
+{
+       int result = 0;
+       uint32_t sclk_frequency;
+       const struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       SMIO_Pattern vol_level;
+       uint32_t mvdd;
+       uint16_t us_mvdd;
+
+       table->ACPILevel.Flags &= ~PPSMC_SWSTATE_FLAG_DC;
+
+       if (!data->sclk_dpm_key_disabled) {
+               /* Get MinVoltage and Frequency from DPM0,
+                * already converted to SMC_UL */
+               sclk_frequency = data->dpm_table.sclk_table.dpm_levels[0].value;
+               result = polaris10_get_dependency_volt_by_clk(hwmgr,
+                               table_info->vdd_dep_on_sclk,
+                               table->ACPILevel.SclkFrequency,
+                               &table->ACPILevel.MinVoltage, &mvdd);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Cannot find ACPI VDDC voltage value "
+                               "in Clock Dependency Table", );
+       } else {
+               sclk_frequency = data->vbios_boot_state.sclk_bootup_value;
+               table->ACPILevel.MinVoltage =
+                               data->vbios_boot_state.vddc_bootup_value * VOLTAGE_SCALE;
+       }
+
+       result = polaris10_calculate_sclk_params(hwmgr, sclk_frequency,  &(table->ACPILevel.SclkSetting));
+       PP_ASSERT_WITH_CODE(result == 0, "Error retrieving Engine Clock dividers from VBIOS.", return result);
+
+       table->ACPILevel.DeepSleepDivId = 0;
+       table->ACPILevel.CcPwrDynRm = 0;
+       table->ACPILevel.CcPwrDynRm1 = 0;
+
+       CONVERT_FROM_HOST_TO_SMC_UL(table->ACPILevel.Flags);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->ACPILevel.MinVoltage);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->ACPILevel.CcPwrDynRm);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->ACPILevel.CcPwrDynRm1);
+
+       CONVERT_FROM_HOST_TO_SMC_UL(table->ACPILevel.SclkSetting.SclkFrequency);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Fcw_int);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Fcw_frac);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Pcc_fcw_int);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Sclk_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Pcc_up_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Pcc_down_slew_rate);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Fcw1_int);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Fcw1_frac);
+       CONVERT_FROM_HOST_TO_SMC_US(table->ACPILevel.SclkSetting.Sclk_ss_slew_rate);
+
+       if (!data->mclk_dpm_key_disabled) {
+               /* Get MinVoltage and Frequency from DPM0, already converted to SMC_UL */
+               table->MemoryACPILevel.MclkFrequency =
+                               data->dpm_table.mclk_table.dpm_levels[0].value;
+               result = polaris10_get_dependency_volt_by_clk(hwmgr,
+                               table_info->vdd_dep_on_mclk,
+                               table->MemoryACPILevel.MclkFrequency,
+                               &table->MemoryACPILevel.MinVoltage, &mvdd);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Cannot find ACPI VDDCI voltage value "
+                               "in Clock Dependency Table",
+                               );
+       } else {
+               table->MemoryACPILevel.MclkFrequency =
+                               data->vbios_boot_state.mclk_bootup_value;
+               table->MemoryACPILevel.MinVoltage =
+                               data->vbios_boot_state.vddci_bootup_value * VOLTAGE_SCALE;
+       }
+
+       us_mvdd = 0;
+       if ((POLARIS10_VOLTAGE_CONTROL_NONE == data->mvdd_control) ||
+                       (data->mclk_dpm_key_disabled))
+               us_mvdd = data->vbios_boot_state.mvdd_bootup_value;
+       else {
+               if (!polaris10_populate_mvdd_value(hwmgr,
+                               data->dpm_table.mclk_table.dpm_levels[0].value,
+                               &vol_level))
+                       us_mvdd = vol_level.Voltage;
+       }
+
+       if (0 == polaris10_populate_mvdd_value(hwmgr, 0, &vol_level))
+               table->MemoryACPILevel.MinMvdd = PP_HOST_TO_SMC_UL(vol_level.Voltage);
+       else
+               table->MemoryACPILevel.MinMvdd = 0;
+
+       table->MemoryACPILevel.StutterEnable = false;
+
+       table->MemoryACPILevel.EnabledForThrottle = 0;
+       table->MemoryACPILevel.EnabledForActivity = 0;
+       table->MemoryACPILevel.UpHyst = 0;
+       table->MemoryACPILevel.DownHyst = 100;
+       table->MemoryACPILevel.VoltageDownHyst = 0;
+       table->MemoryACPILevel.ActivityLevel =
+                       PP_HOST_TO_SMC_US((uint16_t)data->mclk_activity_target);
+
+       CONVERT_FROM_HOST_TO_SMC_UL(table->MemoryACPILevel.MclkFrequency);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->MemoryACPILevel.MinVoltage);
+
+       return result;
+}
+
+static int polaris10_populate_smc_vce_level(struct pp_hwmgr *hwmgr,
+               SMU74_Discrete_DpmTable *table)
+{
+       int result = -EINVAL;
+       uint8_t count;
+       struct pp_atomctrl_clock_dividers_vi dividers;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_table =
+                       table_info->mm_dep_table;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       table->VceLevelCount = (uint8_t)(mm_table->count);
+       table->VceBootLevel = 0;
+
+       for (count = 0; count < table->VceLevelCount; count++) {
+               table->VceLevel[count].Frequency = mm_table->entries[count].eclk;
+               table->VceLevel[count].MinVoltage = 0;
+               table->VceLevel[count].MinVoltage |=
+                               (mm_table->entries[count].vddc * VOLTAGE_SCALE) << VDDC_SHIFT;
+               table->VceLevel[count].MinVoltage |=
+                               ((mm_table->entries[count].vddc - data->vddc_vddci_delta) *
+                                               VOLTAGE_SCALE) << VDDCI_SHIFT;
+               table->VceLevel[count].MinVoltage |= 1 << PHASES_SHIFT;
+
+               /*retrieve divider value for VBIOS */
+               result = atomctrl_get_dfs_pll_dividers_vi(hwmgr,
+                               table->VceLevel[count].Frequency, &dividers);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "can not find divide id for VCE engine clock",
+                               return result);
+
+               table->VceLevel[count].Divider = (uint8_t)dividers.pll_post_divider;
+
+               CONVERT_FROM_HOST_TO_SMC_UL(table->VceLevel[count].Frequency);
+               CONVERT_FROM_HOST_TO_SMC_UL(table->VceLevel[count].MinVoltage);
+       }
+       return result;
+}
+
+static int polaris10_populate_smc_samu_level(struct pp_hwmgr *hwmgr,
+               SMU74_Discrete_DpmTable *table)
+{
+       int result = -EINVAL;
+       uint8_t count;
+       struct pp_atomctrl_clock_dividers_vi dividers;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_table =
+                       table_info->mm_dep_table;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       table->SamuBootLevel = 0;
+       table->SamuLevelCount = (uint8_t)(mm_table->count);
+
+       for (count = 0; count < table->SamuLevelCount; count++) {
+               /* not sure whether we need evclk or not */
+               table->SamuLevel[count].MinVoltage = 0;
+               table->SamuLevel[count].Frequency = mm_table->entries[count].samclock;
+               table->SamuLevel[count].MinVoltage |= (mm_table->entries[count].vddc *
+                               VOLTAGE_SCALE) << VDDC_SHIFT;
+               table->SamuLevel[count].MinVoltage |= ((mm_table->entries[count].vddc -
+                               data->vddc_vddci_delta) * VOLTAGE_SCALE) << VDDCI_SHIFT;
+               table->SamuLevel[count].MinVoltage |= 1 << PHASES_SHIFT;
+
+               /* retrieve divider value for VBIOS */
+               result = atomctrl_get_dfs_pll_dividers_vi(hwmgr,
+                               table->SamuLevel[count].Frequency, &dividers);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "can not find divide id for samu clock", return result);
+
+               table->SamuLevel[count].Divider = (uint8_t)dividers.pll_post_divider;
+
+               CONVERT_FROM_HOST_TO_SMC_UL(table->SamuLevel[count].Frequency);
+               CONVERT_FROM_HOST_TO_SMC_UL(table->SamuLevel[count].MinVoltage);
+       }
+       return result;
+}
+
+static int polaris10_populate_memory_timing_parameters(struct pp_hwmgr *hwmgr,
+               int32_t eng_clock, int32_t mem_clock,
+               SMU74_Discrete_MCArbDramTimingTableEntry *arb_regs)
+{
+       uint32_t dram_timing;
+       uint32_t dram_timing2;
+       uint32_t burst_time;
+       int result;
+
+       result = atomctrl_set_engine_dram_timings_rv770(hwmgr,
+                       eng_clock, mem_clock);
+       PP_ASSERT_WITH_CODE(result == 0,
+                       "Error calling VBIOS to set DRAM_TIMING.", return result);
+
+       dram_timing = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING);
+       dram_timing2 = cgs_read_register(hwmgr->device, mmMC_ARB_DRAM_TIMING2);
+       burst_time = PHM_READ_FIELD(hwmgr->device, MC_ARB_BURST_TIME, STATE0);
+
+
+       arb_regs->McArbDramTiming  = PP_HOST_TO_SMC_UL(dram_timing);
+       arb_regs->McArbDramTiming2 = PP_HOST_TO_SMC_UL(dram_timing2);
+       arb_regs->McArbBurstTime   = (uint8_t)burst_time;
+
+       return 0;
+}
+
+static int polaris10_program_memory_timing_parameters(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct SMU74_Discrete_MCArbDramTimingTable arb_regs;
+       uint32_t i, j;
+       int result = 0;
+
+       for (i = 0; i < data->dpm_table.sclk_table.count; i++) {
+               for (j = 0; j < data->dpm_table.mclk_table.count; j++) {
+                       result = polaris10_populate_memory_timing_parameters(hwmgr,
+                                       data->dpm_table.sclk_table.dpm_levels[i].value,
+                                       data->dpm_table.mclk_table.dpm_levels[j].value,
+                                       &arb_regs.entries[i][j]);
+                       if (result == 0)
+                               result = atomctrl_set_ac_timing_ai(hwmgr, data->dpm_table.mclk_table.dpm_levels[j].value, j);
+                       if (result != 0)
+                               return result;
+               }
+       }
+
+       result = polaris10_copy_bytes_to_smc(
+                       hwmgr->smumgr,
+                       data->arb_table_start,
+                       (uint8_t *)&arb_regs,
+                       sizeof(SMU74_Discrete_MCArbDramTimingTable),
+                       data->sram_end);
+       return result;
+}
+
+static int polaris10_populate_smc_uvd_level(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       int result = -EINVAL;
+       uint8_t count;
+       struct pp_atomctrl_clock_dividers_vi dividers;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_table =
+                       table_info->mm_dep_table;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       table->UvdLevelCount = (uint8_t)(mm_table->count);
+       table->UvdBootLevel = 0;
+
+       for (count = 0; count < table->UvdLevelCount; count++) {
+               table->UvdLevel[count].MinVoltage = 0;
+               table->UvdLevel[count].VclkFrequency = mm_table->entries[count].vclk;
+               table->UvdLevel[count].DclkFrequency = mm_table->entries[count].dclk;
+               table->UvdLevel[count].MinVoltage |= (mm_table->entries[count].vddc *
+                               VOLTAGE_SCALE) << VDDC_SHIFT;
+               table->UvdLevel[count].MinVoltage |= ((mm_table->entries[count].vddc -
+                               data->vddc_vddci_delta) * VOLTAGE_SCALE) << VDDCI_SHIFT;
+               table->UvdLevel[count].MinVoltage |= 1 << PHASES_SHIFT;
+
+               /* retrieve divider value for VBIOS */
+               result = atomctrl_get_dfs_pll_dividers_vi(hwmgr,
+                               table->UvdLevel[count].VclkFrequency, &dividers);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "can not find divide id for Vclk clock", return result);
+
+               table->UvdLevel[count].VclkDivider = (uint8_t)dividers.pll_post_divider;
+
+               result = atomctrl_get_dfs_pll_dividers_vi(hwmgr,
+                               table->UvdLevel[count].DclkFrequency, &dividers);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "can not find divide id for Dclk clock", return result);
+
+               table->UvdLevel[count].DclkDivider = (uint8_t)dividers.pll_post_divider;
+
+               CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].VclkFrequency);
+               CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].DclkFrequency);
+               CONVERT_FROM_HOST_TO_SMC_UL(table->UvdLevel[count].MinVoltage);
+
+       }
+       return result;
+}
+
+static int polaris10_populate_smc_boot_level(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       int result = 0;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       table->GraphicsBootLevel = 0;
+       table->MemoryBootLevel = 0;
+
+       /* find boot level from dpm table */
+       result = phm_find_boot_level(&(data->dpm_table.sclk_table),
+                       data->vbios_boot_state.sclk_bootup_value,
+                       (uint32_t *)&(table->GraphicsBootLevel));
+
+       result = phm_find_boot_level(&(data->dpm_table.mclk_table),
+                       data->vbios_boot_state.mclk_bootup_value,
+                       (uint32_t *)&(table->MemoryBootLevel));
+
+       table->BootVddc  = data->vbios_boot_state.vddc_bootup_value *
+                       VOLTAGE_SCALE;
+       table->BootVddci = data->vbios_boot_state.vddci_bootup_value *
+                       VOLTAGE_SCALE;
+       table->BootMVdd  = data->vbios_boot_state.mvdd_bootup_value *
+                       VOLTAGE_SCALE;
+
+       CONVERT_FROM_HOST_TO_SMC_US(table->BootVddc);
+       CONVERT_FROM_HOST_TO_SMC_US(table->BootVddci);
+       CONVERT_FROM_HOST_TO_SMC_US(table->BootMVdd);
+
+       return 0;
+}
+
+
+static int polaris10_populate_smc_initailial_state(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       uint8_t count, level;
+
+       count = (uint8_t)(table_info->vdd_dep_on_sclk->count);
+
+       for (level = 0; level < count; level++) {
+               if (table_info->vdd_dep_on_sclk->entries[level].clk >=
+                               data->vbios_boot_state.sclk_bootup_value) {
+                       data->smc_state_table.GraphicsBootLevel = level;
+                       break;
+               }
+       }
+
+       count = (uint8_t)(table_info->vdd_dep_on_mclk->count);
+       for (level = 0; level < count; level++) {
+               if (table_info->vdd_dep_on_mclk->entries[level].clk >=
+                               data->vbios_boot_state.mclk_bootup_value) {
+                       data->smc_state_table.MemoryBootLevel = level;
+                       break;
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr)
+{
+       uint32_t ro, efuse, efuse2, clock_freq, volt_without_cks,
+                       volt_with_cks, value;
+       uint16_t clock_freq_u16;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint8_t type, i, j, cks_setting, stretch_amount, stretch_amount2,
+                       volt_offset = 0;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table =
+                       table_info->vdd_dep_on_sclk;
+
+       stretch_amount = (uint8_t)table_info->cac_dtp_table->usClockStretchAmount;
+
+       /* Read SMU_Eefuse to read and calculate RO and determine
+        * if the part is SS or FF. if RO >= 1660MHz, part is FF.
+        */
+       efuse = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixSMU_EFUSE_0 + (146 * 4));
+       efuse2 = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixSMU_EFUSE_0 + (148 * 4));
+       efuse &= 0xFF000000;
+       efuse = efuse >> 24;
+       efuse2 &= 0xF;
+
+       if (efuse2 == 1)
+               ro = (2300 - 1350) * efuse / 255 + 1350;
+       else
+               ro = (2500 - 1000) * efuse / 255 + 1000;
+
+       if (ro >= 1660)
+               type = 0;
+       else
+               type = 1;
+
+       /* Populate Stretch amount */
+       data->smc_state_table.ClockStretcherAmount = stretch_amount;
+
+       /* Populate Sclk_CKS_masterEn0_7 and Sclk_voltageOffset */
+       for (i = 0; i < sclk_table->count; i++) {
+               data->smc_state_table.Sclk_CKS_masterEn0_7 |=
+                               sclk_table->entries[i].cks_enable << i;
+               volt_without_cks = (uint32_t)((14041 *
+                       (sclk_table->entries[i].clk/100) / 10000 + 3571 + 75 - ro) * 1000 /
+                       (4026 - (13924 * (sclk_table->entries[i].clk/100) / 10000)));
+               volt_with_cks = (uint32_t)((13946 *
+                       (sclk_table->entries[i].clk/100) / 10000 + 3320 + 45 - ro) * 1000 /
+                       (3664 - (11454 * (sclk_table->entries[i].clk/100) / 10000)));
+               if (volt_without_cks >= volt_with_cks)
+                       volt_offset = (uint8_t)(((volt_without_cks - volt_with_cks +
+                                       sclk_table->entries[i].cks_voffset) * 100 / 625) + 1);
+               data->smc_state_table.Sclk_voltageOffset[i] = volt_offset;
+       }
+
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE,
+                       STRETCH_ENABLE, 0x0);
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE,
+                       masterReset, 0x1);
+       /* PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE, staticEnable, 0x1); */
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, PWR_CKS_ENABLE,
+                       masterReset, 0x0);
+
+       /* Populate CKS Lookup Table */
+       if (stretch_amount == 1 || stretch_amount == 2 || stretch_amount == 5)
+               stretch_amount2 = 0;
+       else if (stretch_amount == 3 || stretch_amount == 4)
+               stretch_amount2 = 1;
+       else {
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_ClockStretcher);
+               PP_ASSERT_WITH_CODE(false,
+                               "Stretch Amount in PPTable not supported\n",
+                               return -EINVAL);
+       }
+
+       value = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixPWR_CKS_CNTL);
+       value &= 0xFFC2FF87;
+       data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].minFreq =
+                       polaris10_clock_stretcher_lookup_table[stretch_amount2][0];
+       data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].maxFreq =
+                       polaris10_clock_stretcher_lookup_table[stretch_amount2][1];
+       clock_freq_u16 = (uint16_t)(PP_SMC_TO_HOST_UL(data->smc_state_table.
+                       GraphicsLevel[data->smc_state_table.GraphicsDpmLevelCount - 1].SclkSetting.SclkFrequency) / 100);
+       if (polaris10_clock_stretcher_lookup_table[stretch_amount2][0] < clock_freq_u16
+       && polaris10_clock_stretcher_lookup_table[stretch_amount2][1] > clock_freq_u16) {
+               /* Program PWR_CKS_CNTL. CKS_USE_FOR_LOW_FREQ */
+               value |= (polaris10_clock_stretcher_lookup_table[stretch_amount2][3]) << 16;
+               /* Program PWR_CKS_CNTL. CKS_LDO_REFSEL */
+               value |= (polaris10_clock_stretcher_lookup_table[stretch_amount2][2]) << 18;
+               /* Program PWR_CKS_CNTL. CKS_STRETCH_AMOUNT */
+               value |= (polaris10_clock_stretch_amount_conversion
+                               [polaris10_clock_stretcher_lookup_table[stretch_amount2][3]]
+                                [stretch_amount]) << 3;
+       }
+       CONVERT_FROM_HOST_TO_SMC_US(data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].minFreq);
+       CONVERT_FROM_HOST_TO_SMC_US(data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].maxFreq);
+       data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].setting =
+                       polaris10_clock_stretcher_lookup_table[stretch_amount2][2] & 0x7F;
+       data->smc_state_table.CKS_LOOKUPTable.CKS_LOOKUPTableEntry[0].setting |=
+                       (polaris10_clock_stretcher_lookup_table[stretch_amount2][3]) << 7;
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       ixPWR_CKS_CNTL, value);
+
+       /* Populate DDT Lookup Table */
+       for (i = 0; i < 4; i++) {
+               /* Assign the minimum and maximum VID stored
+                * in the last row of Clock Stretcher Voltage Table.
+                */
+               data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].minVID =
+                               (uint8_t) polaris10_clock_stretcher_ddt_table[type][i][2];
+               data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].maxVID =
+                               (uint8_t) polaris10_clock_stretcher_ddt_table[type][i][3];
+               /* Loop through each SCLK and check the frequency
+                * to see if it lies within the frequency for clock stretcher.
+                */
+               for (j = 0; j < data->smc_state_table.GraphicsDpmLevelCount; j++) {
+                       cks_setting = 0;
+                       clock_freq = PP_SMC_TO_HOST_UL(
+                                       data->smc_state_table.GraphicsLevel[j].SclkSetting.SclkFrequency);
+                       /* Check the allowed frequency against the sclk level[j].
+                        *  Sclk's endianness has already been converted,
+                        *  and it's in 10Khz unit,
+                        *  as opposed to Data table, which is in Mhz unit.
+                        */
+                       if (clock_freq >= (polaris10_clock_stretcher_ddt_table[type][i][0]) * 100) {
+                               cks_setting |= 0x2;
+                               if (clock_freq < (polaris10_clock_stretcher_ddt_table[type][i][1]) * 100)
+                                       cks_setting |= 0x1;
+                       }
+                       data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].setting
+                                                       |= cks_setting << (j * 2);
+               }
+               CONVERT_FROM_HOST_TO_SMC_US(
+                       data->smc_state_table.ClockStretcherDataTable.ClockStretcherDataTableEntry[i].setting);
+       }
+
+       value = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL);
+       value &= 0xFFFFFFFE;
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixPWR_CKS_CNTL, value);
+
+       return 0;
+}
+
+/**
+* Populates the SMC VRConfig field in DPM table.
+*
+* @param    hwmgr   the address of the hardware manager
+* @param    table   the SMC DPM table structure to be populated
+* @return   always 0
+*/
+static int polaris10_populate_vr_config(struct pp_hwmgr *hwmgr,
+               struct SMU74_Discrete_DpmTable *table)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint16_t config;
+
+       config = VR_MERGED_WITH_VDDC;
+       table->VRConfig |= (config << VRCONF_VDDGFX_SHIFT);
+
+       /* Set Vddc Voltage Controller */
+       if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->voltage_control) {
+               config = VR_SVI2_PLANE_1;
+               table->VRConfig |= config;
+       } else {
+               PP_ASSERT_WITH_CODE(false,
+                               "VDDC should be on SVI2 control in merged mode!",
+                               );
+       }
+       /* Set Vddci Voltage Controller */
+       if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->vddci_control) {
+               config = VR_SVI2_PLANE_2;  /* only in merged mode */
+               table->VRConfig |= (config << VRCONF_VDDCI_SHIFT);
+       } else if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->vddci_control) {
+               config = VR_SMIO_PATTERN_1;
+               table->VRConfig |= (config << VRCONF_VDDCI_SHIFT);
+       } else {
+               config = VR_STATIC_VOLTAGE;
+               table->VRConfig |= (config << VRCONF_VDDCI_SHIFT);
+       }
+       /* Set Mvdd Voltage Controller */
+       if (POLARIS10_VOLTAGE_CONTROL_BY_SVID2 == data->mvdd_control) {
+               config = VR_SVI2_PLANE_2;
+               table->VRConfig |= (config << VRCONF_MVDD_SHIFT);
+       } else if (POLARIS10_VOLTAGE_CONTROL_BY_GPIO == data->mvdd_control) {
+               config = VR_SMIO_PATTERN_2;
+               table->VRConfig |= (config << VRCONF_MVDD_SHIFT);
+       } else {
+               config = VR_STATIC_VOLTAGE;
+               table->VRConfig |= (config << VRCONF_MVDD_SHIFT);
+       }
+
+       return 0;
+}
+
+/**
+* Initializes the SMC table and uploads it
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_init_smc_table(struct pp_hwmgr *hwmgr)
+{
+       int result;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct SMU74_Discrete_DpmTable *table = &(data->smc_state_table);
+       const struct polaris10_ulv_parm *ulv = &(data->ulv);
+       uint8_t i;
+       struct pp_atomctrl_gpio_pin_assignment gpio_pin;
+       pp_atomctrl_clock_dividers_vi dividers;
+
+       result = polaris10_setup_default_dpm_tables(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to setup default DPM tables!", return result);
+
+       if (POLARIS10_VOLTAGE_CONTROL_NONE != data->voltage_control)
+               polaris10_populate_smc_voltage_tables(hwmgr, table);
+
+       table->SystemFlags = 0;
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_AutomaticDCTransition))
+               table->SystemFlags |= PPSMC_SYSTEMFLAG_GPIO_DC;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_StepVddc))
+               table->SystemFlags |= PPSMC_SYSTEMFLAG_STEPVDDC;
+
+       if (data->is_memory_gddr5)
+               table->SystemFlags |= PPSMC_SYSTEMFLAG_GDDR5;
+
+       if (ulv->ulv_supported && table_info->us_ulv_voltage_offset) {
+               result = polaris10_populate_ulv_state(hwmgr, table);
+               PP_ASSERT_WITH_CODE(0 == result,
+                               "Failed to initialize ULV state!", return result);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                               ixCG_ULV_PARAMETER, PPPOLARIS10_CGULVPARAMETER_DFLT);
+       }
+
+       result = polaris10_populate_smc_link_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize Link Level!", return result);
+
+       result = polaris10_populate_all_graphic_levels(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize Graphics Level!", return result);
+
+       result = polaris10_populate_all_memory_levels(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize Memory Level!", return result);
+
+       result = polaris10_populate_smc_acpi_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize ACPI Level!", return result);
+
+       result = polaris10_populate_smc_vce_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize VCE Level!", return result);
+
+       result = polaris10_populate_smc_samu_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize SAMU Level!", return result);
+
+       /* Since only the initial state is completely set up at this point
+        * (the other states are just copies of the boot state) we only
+        * need to populate the  ARB settings for the initial state.
+        */
+       result = polaris10_program_memory_timing_parameters(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to Write ARB settings for the initial state.", return result);
+
+       result = polaris10_populate_smc_uvd_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize UVD Level!", return result);
+
+       result = polaris10_populate_smc_boot_level(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize Boot Level!", return result);
+
+       result = polaris10_populate_smc_initailial_state(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to initialize Boot State!", return result);
+
+       result = polaris10_populate_bapm_parameters_in_dpm_table(hwmgr);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to populate BAPM Parameters!", return result);
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_ClockStretcher)) {
+               result = polaris10_populate_clock_stretcher_data_table(hwmgr);
+               PP_ASSERT_WITH_CODE(0 == result,
+                               "Failed to populate Clock Stretcher Data Table!",
+                               return result);
+       }
+
+       table->GraphicsVoltageChangeEnable  = 1;
+       table->GraphicsThermThrottleEnable  = 1;
+       table->GraphicsInterval = 1;
+       table->VoltageInterval  = 1;
+       table->ThermalInterval  = 1;
+       table->TemperatureLimitHigh =
+                       table_info->cac_dtp_table->usTargetOperatingTemp *
+                       POLARIS10_Q88_FORMAT_CONVERSION_UNIT;
+       table->TemperatureLimitLow  =
+                       (table_info->cac_dtp_table->usTargetOperatingTemp - 1) *
+                       POLARIS10_Q88_FORMAT_CONVERSION_UNIT;
+       table->MemoryVoltageChangeEnable = 1;
+       table->MemoryInterval = 1;
+       table->VoltageResponseTime = 0;
+       table->PhaseResponseTime = 0;
+       table->MemoryThermThrottleEnable = 1;
+       table->PCIeBootLinkLevel = 0;
+       table->PCIeGenInterval = 1;
+       table->VRConfig = 0;
+
+       result = polaris10_populate_vr_config(hwmgr, table);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to populate VRConfig setting!", return result);
+
+       table->ThermGpio = 17;
+       table->SclkStepSize = 0x4000;
+
+       if (atomctrl_get_pp_assign_pin(hwmgr, VDDC_VRHOT_GPIO_PINID, &gpio_pin)) {
+               table->VRHotGpio = gpio_pin.uc_gpio_pin_bit_shift;
+       } else {
+               table->VRHotGpio = POLARIS10_UNUSED_GPIO_PIN;
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_RegulatorHot);
+       }
+
+       if (atomctrl_get_pp_assign_pin(hwmgr, PP_AC_DC_SWITCH_GPIO_PINID,
+                       &gpio_pin)) {
+               table->AcDcGpio = gpio_pin.uc_gpio_pin_bit_shift;
+               phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_AutomaticDCTransition);
+       } else {
+               table->AcDcGpio = POLARIS10_UNUSED_GPIO_PIN;
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_AutomaticDCTransition);
+       }
+
+       /* Thermal Output GPIO */
+       if (atomctrl_get_pp_assign_pin(hwmgr, THERMAL_INT_OUTPUT_GPIO_PINID,
+                       &gpio_pin)) {
+               phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_ThermalOutGPIO);
+
+               table->ThermOutGpio = gpio_pin.uc_gpio_pin_bit_shift;
+
+               /* For porlarity read GPIOPAD_A with assigned Gpio pin
+                * since VBIOS will program this register to set 'inactive state',
+                * driver can then determine 'active state' from this and
+                * program SMU with correct polarity
+                */
+               table->ThermOutPolarity = (0 == (cgs_read_register(hwmgr->device, mmGPIOPAD_A)
+                                       & (1 << gpio_pin.uc_gpio_pin_bit_shift))) ? 1:0;
+               table->ThermOutMode = SMU7_THERM_OUT_MODE_THERM_ONLY;
+
+               /* if required, combine VRHot/PCC with thermal out GPIO */
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_RegulatorHot)
+               && phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_CombinePCCWithThermalSignal))
+                       table->ThermOutMode = SMU7_THERM_OUT_MODE_THERM_VRHOT;
+       } else {
+               table->ThermOutGpio = 17;
+               table->ThermOutPolarity = 1;
+               table->ThermOutMode = SMU7_THERM_OUT_MODE_DISABLE;
+       }
+
+       /* Populate BIF_SCLK levels into SMC DPM table */
+       for (i = 0; i <= data->dpm_table.pcie_speed_table.count; i++) {
+               result = atomctrl_get_dfs_pll_dividers_vi(hwmgr, data->bif_sclk_table[i], &dividers);
+               PP_ASSERT_WITH_CODE((result == 0), "Can not find DFS divide id for Sclk", return result);
+
+               if (i == 0)
+                       table->Ulv.BifSclkDfs = PP_HOST_TO_SMC_US((USHORT)(dividers.pll_post_divider));
+               else
+                       table->LinkLevel[i-1].BifSclkDfs = PP_HOST_TO_SMC_US((USHORT)(dividers.pll_post_divider));
+       }
+
+       for (i = 0; i < SMU74_MAX_ENTRIES_SMIO; i++)
+               table->Smio[i] = PP_HOST_TO_SMC_UL(table->Smio[i]);
+
+       CONVERT_FROM_HOST_TO_SMC_UL(table->SystemFlags);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->VRConfig);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->SmioMask1);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->SmioMask2);
+       CONVERT_FROM_HOST_TO_SMC_UL(table->SclkStepSize);
+       CONVERT_FROM_HOST_TO_SMC_US(table->TemperatureLimitHigh);
+       CONVERT_FROM_HOST_TO_SMC_US(table->TemperatureLimitLow);
+       CONVERT_FROM_HOST_TO_SMC_US(table->VoltageResponseTime);
+       CONVERT_FROM_HOST_TO_SMC_US(table->PhaseResponseTime);
+
+       /* Upload all dpm data to SMC memory.(dpm level, dpm level count etc) */
+       result = polaris10_copy_bytes_to_smc(hwmgr->smumgr,
+                       data->dpm_table_start +
+                       offsetof(SMU74_Discrete_DpmTable, SystemFlags),
+                       (uint8_t *)&(table->SystemFlags),
+                       sizeof(SMU74_Discrete_DpmTable) - 3 * sizeof(SMU74_PIDController),
+                       data->sram_end);
+       PP_ASSERT_WITH_CODE(0 == result,
+                       "Failed to upload dpm data to SMC memory!", return result);
+
+       return 0;
+}
+
+/**
+* Initialize the ARB DRAM timing table's index field.
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_init_arb_table_index(struct pp_hwmgr *hwmgr)
+{
+       const struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t tmp;
+       int result;
+
+       /* This is a read-modify-write on the first byte of the ARB table.
+        * The first byte in the SMU73_Discrete_MCArbDramTimingTable structure
+        * is the field 'current'.
+        * This solution is ugly, but we never write the whole table only
+        * individual fields in it.
+        * In reality this field should not be in that structure
+        * but in a soft register.
+        */
+       result = polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       data->arb_table_start, &tmp, data->sram_end);
+
+       if (result)
+               return result;
+
+       tmp &= 0x00FFFFFF;
+       tmp |= ((uint32_t)MC_CG_ARB_FREQ_F1) << 24;
+
+       return polaris10_write_smc_sram_dword(hwmgr->smumgr,
+                       data->arb_table_start, tmp, data->sram_end);
+}
+
+static int polaris10_enable_vrhot_gpio_interrupt(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_RegulatorHot))
+               return smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_EnableVRHotGPIOInterrupt);
+
+       return 0;
+}
+
+static int polaris10_enable_sclk_control(struct pp_hwmgr *hwmgr)
+{
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SCLK_PWRMGT_CNTL,
+                       SCLK_PWRMGT_OFF, 0);
+       return 0;
+}
+
+static int polaris10_enable_ulv(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_ulv_parm *ulv = &(data->ulv);
+
+       if (ulv->ulv_supported)
+               return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_EnableULV);
+
+       return 0;
+}
+
+static int polaris10_enable_deep_sleep_master_switch(struct pp_hwmgr *hwmgr)
+{
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SclkDeepSleep)) {
+               if (smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_MASTER_DeepSleep_ON))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to enable Master Deep Sleep switch failed!",
+                                       return -1);
+       } else {
+               if (smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_MASTER_DeepSleep_OFF)) {
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to disable Master Deep Sleep switch failed!",
+                                       return -1);
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_enable_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /* enable SCLK dpm */
+       if (!data->sclk_dpm_key_disabled)
+               PP_ASSERT_WITH_CODE(
+               (0 == smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_DPM_Enable)),
+               "Failed to enable SCLK DPM during DPM Start Function!",
+               return -1);
+
+       /* enable MCLK dpm */
+       if (0 == data->mclk_dpm_key_disabled) {
+
+               PP_ASSERT_WITH_CODE(
+                               (0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                                               PPSMC_MSG_MCLKDPM_Enable)),
+                               "Failed to enable MCLK DPM during DPM Start Function!",
+                               return -1);
+
+
+               PHM_WRITE_FIELD(hwmgr->device, MC_SEQ_CNTL_3, CAC_EN, 0x1);
+
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC0_CNTL, 0x5);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC1_CNTL, 0x5);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_CPL_CNTL, 0x100005);
+               udelay(10);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC0_CNTL, 0x400005);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_MC1_CNTL, 0x400005);
+               cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixLCAC_CPL_CNTL, 0x500005);
+       }
+
+       return 0;
+}
+
+static int polaris10_start_dpm(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /*enable general power management */
+
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, GENERAL_PWRMGT,
+                       GLOBAL_PWRMGT_EN, 1);
+
+       /* enable sclk deep sleep */
+
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, SCLK_PWRMGT_CNTL,
+                       DYNAMIC_PM_EN, 1);
+
+       /* prepare for PCIE DPM */
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC,
+                       data->soft_regs_start + offsetof(SMU74_SoftRegisters,
+                                       VoltageChangeTimeout), 0x1000);
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__PCIE,
+                       SWRST_COMMAND_1, RESETLC, 0x0);
+/*
+       PP_ASSERT_WITH_CODE(
+                       (0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                                       PPSMC_MSG_Voltage_Cntl_Enable)),
+                       "Failed to enable voltage DPM during DPM Start Function!",
+                       return -1);
+*/
+
+       if (polaris10_enable_sclk_mclk_dpm(hwmgr)) {
+               printk(KERN_ERR "Failed to enable Sclk DPM and Mclk DPM!");
+               return -1;
+       }
+
+       /* enable PCIE dpm */
+       if (0 == data->pcie_dpm_key_disabled) {
+               PP_ASSERT_WITH_CODE(
+                               (0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                                               PPSMC_MSG_PCIeDPM_Enable)),
+                               "Failed to enable pcie DPM during DPM Start Function!",
+                               return -1);
+       }
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_Falcon_QuickTransition)) {
+               PP_ASSERT_WITH_CODE((0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_EnableACDCGPIOInterrupt)),
+                               "Failed to enable AC DC GPIO Interrupt!",
+                               );
+       }
+
+       return 0;
+}
+
+static void polaris10_set_dpm_event_sources(struct pp_hwmgr *hwmgr, uint32_t sources)
+{
+       bool protection;
+       enum DPM_EVENT_SRC src;
+
+       switch (sources) {
+       default:
+               printk(KERN_ERR "Unknown throttling event sources.");
+               /* fall through */
+       case 0:
+               protection = false;
+               /* src is unused */
+               break;
+       case (1 << PHM_AutoThrottleSource_Thermal):
+               protection = true;
+               src = DPM_EVENT_SRC_DIGITAL;
+               break;
+       case (1 << PHM_AutoThrottleSource_External):
+               protection = true;
+               src = DPM_EVENT_SRC_EXTERNAL;
+               break;
+       case (1 << PHM_AutoThrottleSource_External) |
+                       (1 << PHM_AutoThrottleSource_Thermal):
+               protection = true;
+               src = DPM_EVENT_SRC_DIGITAL_OR_EXTERNAL;
+               break;
+       }
+       /* Order matters - don't enable thermal protection for the wrong source. */
+       if (protection) {
+               PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_THERMAL_CTRL,
+                               DPM_EVENT_SRC, src);
+               PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, GENERAL_PWRMGT,
+                               THERMAL_PROTECTION_DIS,
+                               !phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_ThermalController));
+       } else
+               PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, GENERAL_PWRMGT,
+                               THERMAL_PROTECTION_DIS, 1);
+}
+
+static int polaris10_enable_auto_throttle_source(struct pp_hwmgr *hwmgr,
+               PHM_AutoThrottleSource source)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (!(data->active_auto_throttle_sources & (1 << source))) {
+               data->active_auto_throttle_sources |= 1 << source;
+               polaris10_set_dpm_event_sources(hwmgr, data->active_auto_throttle_sources);
+       }
+       return 0;
+}
+
+static int polaris10_enable_thermal_auto_throttle(struct pp_hwmgr *hwmgr)
+{
+       return polaris10_enable_auto_throttle_source(hwmgr, PHM_AutoThrottleSource_Thermal);
+}
+
+int polaris10_pcie_performance_request(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       data->pcie_performance_request = true;
+
+       return 0;
+}
+
+int polaris10_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
+{
+       int tmp_result, result = 0;
+       tmp_result = (!polaris10_is_dpm_running(hwmgr)) ? 0 : -1;
+       PP_ASSERT_WITH_CODE(result == 0,
+                       "DPM is already running right now, no need to enable DPM!",
+                       return 0);
+
+       if (polaris10_voltage_control(hwmgr)) {
+               tmp_result = polaris10_enable_voltage_control(hwmgr);
+               PP_ASSERT_WITH_CODE(tmp_result == 0,
+                               "Failed to enable voltage control!",
+                               result = tmp_result);
+
+               tmp_result = polaris10_construct_voltage_tables(hwmgr);
+               PP_ASSERT_WITH_CODE((0 == tmp_result),
+                               "Failed to contruct voltage tables!",
+                               result = tmp_result);
+       }
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_EngineSpreadSpectrumSupport))
+               PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               GENERAL_PWRMGT, DYN_SPREAD_SPECTRUM_EN, 1);
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_ThermalController))
+               PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               GENERAL_PWRMGT, THERMAL_PROTECTION_DIS, 0);
+
+       tmp_result = polaris10_program_static_screen_threshold_parameters(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to program static screen threshold parameters!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_enable_display_gap(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable display gap!", result = tmp_result);
+
+       tmp_result = polaris10_program_voting_clients(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to program voting clients!", result = tmp_result);
+
+       tmp_result = polaris10_process_firmware_header(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to process firmware header!", result = tmp_result);
+
+       tmp_result = polaris10_initial_switch_from_arbf0_to_f1(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to initialize switch from ArbF0 to F1!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_init_smc_table(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to initialize SMC table!", result = tmp_result);
+
+       tmp_result = polaris10_init_arb_table_index(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to initialize ARB table index!", result = tmp_result);
+
+       tmp_result = polaris10_populate_pm_fuses(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to populate PM fuses!", result = tmp_result);
+
+       tmp_result = polaris10_enable_vrhot_gpio_interrupt(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable VR hot GPIO interrupt!", result = tmp_result);
+
+       tmp_result = polaris10_enable_sclk_control(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable SCLK control!", result = tmp_result);
+
+       tmp_result = polaris10_enable_smc_voltage_controller(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable voltage control!", result = tmp_result);
+
+       tmp_result = polaris10_enable_ulv(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable ULV!", result = tmp_result);
+
+       tmp_result = polaris10_enable_deep_sleep_master_switch(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable deep sleep master switch!", result = tmp_result);
+
+       tmp_result = polaris10_start_dpm(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to start DPM!", result = tmp_result);
+
+       tmp_result = polaris10_enable_smc_cac(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable SMC CAC!", result = tmp_result);
+
+       tmp_result = polaris10_enable_power_containment(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable power containment!", result = tmp_result);
+
+       tmp_result = polaris10_power_control_set_level(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to power control set level!", result = tmp_result);
+
+       tmp_result = polaris10_enable_thermal_auto_throttle(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable thermal auto throttle!", result = tmp_result);
+
+       tmp_result = polaris10_pcie_performance_request(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "pcie performance request failed!", result = tmp_result);
+
+       return result;
+}
+
+int polaris10_disable_dpm_tasks(struct pp_hwmgr *hwmgr)
+{
+
+       return 0;
+}
+
+int polaris10_reset_asic_tasks(struct pp_hwmgr *hwmgr)
+{
+
+       return 0;
+}
+
+int polaris10_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->soft_pp_table) {
+               kfree(data->soft_pp_table);
+               data->soft_pp_table = NULL;
+       }
+
+       return phm_hwmgr_backend_fini(hwmgr);
+}
+
+int polaris10_set_features_platform_caps(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SclkDeepSleep);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+               PHM_PlatformCaps_DynamicPatchPowerState);
+
+       if (data->mvdd_control == POLARIS10_VOLTAGE_CONTROL_NONE)
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_EnableMVDDControl);
+
+       if (data->vddci_control == POLARIS10_VOLTAGE_CONTROL_NONE)
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_ControlVDDCI);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                        PHM_PlatformCaps_TablelessHardwareInterface);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_EnableSMU7ThermalManagement);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_DynamicPowerManagement);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_UnTabledHardwareInterface);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_TablelessHardwareInterface);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_SMC);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_NonABMSupportInPPLib);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_DynamicUVDState);
+
+       /* power tune caps Assume disabled */
+       phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_SQRamping);
+       phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_DBRamping);
+       phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_TDRamping);
+       phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_TCPRamping);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_PowerContainment);
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                                       PHM_PlatformCaps_CAC);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_RegulatorHot);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_AutomaticDCTransition);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_ODFuzzyFanControlSupport);
+
+       phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                               PHM_PlatformCaps_FanSpeedInTableIsRPM);
+       if (hwmgr->chip_id == CHIP_POLARIS11)
+               phm_cap_set(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_SPLLShutdownSupport);
+       return 0;
+}
+
+static void polaris10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       polaris10_initialize_power_tune_defaults(hwmgr);
+
+       data->pcie_gen_performance.max = PP_PCIEGen1;
+       data->pcie_gen_performance.min = PP_PCIEGen3;
+       data->pcie_gen_power_saving.max = PP_PCIEGen1;
+       data->pcie_gen_power_saving.min = PP_PCIEGen3;
+       data->pcie_lane_performance.max = 0;
+       data->pcie_lane_performance.min = 16;
+       data->pcie_lane_power_saving.max = 0;
+       data->pcie_lane_power_saving.min = 16;
+}
+
+/**
+* Get Leakage VDDC based on leakage ID.
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always 0
+*/
+static int polaris10_get_evv_voltages(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint16_t vv_id;
+       uint16_t vddc = 0;
+       uint16_t i, j;
+       uint32_t sclk = 0;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)hwmgr->pptable;
+       struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table =
+                       table_info->vdd_dep_on_sclk;
+       int result;
+
+       for (i = 0; i < POLARIS10_MAX_LEAKAGE_COUNT; i++) {
+               vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
+               if (!phm_get_sclk_for_voltage_evv(hwmgr,
+                               table_info->vddc_lookup_table, vv_id, &sclk)) {
+                       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                                       PHM_PlatformCaps_ClockStretcher)) {
+                               for (j = 1; j < sclk_table->count; j++) {
+                                       if (sclk_table->entries[j].clk == sclk &&
+                                                       sclk_table->entries[j].cks_enable == 0) {
+                                               sclk += 5000;
+                                               break;
+                                       }
+                               }
+                       }
+
+
+                       PP_ASSERT_WITH_CODE(0 == atomctrl_get_voltage_evv_on_sclk_ai(hwmgr,
+                                                       VOLTAGE_TYPE_VDDC, sclk, vv_id, &vddc),
+                                               "Error retrieving EVV voltage value!",
+                                               continue);
+
+
+                       /* need to make sure vddc is less than 2v or else, it could burn the ASIC. */
+                       PP_ASSERT_WITH_CODE((vddc < 2000 && vddc != 0),
+                                       "Invalid VDDC value", result = -EINVAL;);
+
+                       /* the voltage should not be zero nor equal to leakage ID */
+                       if (vddc != 0 && vddc != vv_id) {
+                               data->vddc_leakage.actual_voltage[data->vddc_leakage.count] = (uint16_t)(vddc/100);
+                               data->vddc_leakage.leakage_id[data->vddc_leakage.count] = vv_id;
+                               data->vddc_leakage.count++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+/**
+ * Change virtual leakage voltage to actual value.
+ *
+ * @param     hwmgr  the address of the powerplay hardware manager.
+ * @param     pointer to changing voltage
+ * @param     pointer to leakage table
+ */
+static void polaris10_patch_with_vdd_leakage(struct pp_hwmgr *hwmgr,
+               uint16_t *voltage, struct polaris10_leakage_voltage *leakage_table)
+{
+       uint32_t index;
+
+       /* search for leakage voltage ID 0xff01 ~ 0xff08 */
+       for (index = 0; index < leakage_table->count; index++) {
+               /* if this voltage matches a leakage voltage ID */
+               /* patch with actual leakage voltage */
+               if (leakage_table->leakage_id[index] == *voltage) {
+                       *voltage = leakage_table->actual_voltage[index];
+                       break;
+               }
+       }
+
+       if (*voltage > ATOM_VIRTUAL_VOLTAGE_ID0)
+               printk(KERN_ERR "Voltage value looks like a Leakage ID but it's not patched \n");
+}
+
+/**
+* Patch voltage lookup table by EVV leakages.
+*
+* @param     hwmgr  the address of the powerplay hardware manager.
+* @param     pointer to voltage lookup table
+* @param     pointer to leakage table
+* @return     always 0
+*/
+static int polaris10_patch_lookup_table_with_leakage(struct pp_hwmgr *hwmgr,
+               phm_ppt_v1_voltage_lookup_table *lookup_table,
+               struct polaris10_leakage_voltage *leakage_table)
+{
+       uint32_t i;
+
+       for (i = 0; i < lookup_table->count; i++)
+               polaris10_patch_with_vdd_leakage(hwmgr,
+                               &lookup_table->entries[i].us_vdd, leakage_table);
+
+       return 0;
+}
+
+static int polaris10_patch_clock_voltage_limits_with_vddc_leakage(
+               struct pp_hwmgr *hwmgr, struct polaris10_leakage_voltage *leakage_table,
+               uint16_t *vddc)
+{
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       polaris10_patch_with_vdd_leakage(hwmgr, (uint16_t *)vddc, leakage_table);
+       hwmgr->dyn_state.max_clock_voltage_on_dc.vddc =
+                       table_info->max_clock_voltage_on_dc.vddc;
+       return 0;
+}
+
+static int polaris10_patch_voltage_dependency_tables_with_lookup_table(
+               struct pp_hwmgr *hwmgr)
+{
+       uint8_t entryId;
+       uint8_t voltageId;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table =
+                       table_info->vdd_dep_on_sclk;
+       struct phm_ppt_v1_clock_voltage_dependency_table *mclk_table =
+                       table_info->vdd_dep_on_mclk;
+       struct phm_ppt_v1_mm_clock_voltage_dependency_table *mm_table =
+                       table_info->mm_dep_table;
+
+       for (entryId = 0; entryId < sclk_table->count; ++entryId) {
+               voltageId = sclk_table->entries[entryId].vddInd;
+               sclk_table->entries[entryId].vddc =
+                               table_info->vddc_lookup_table->entries[voltageId].us_vdd;
+       }
+
+       for (entryId = 0; entryId < mclk_table->count; ++entryId) {
+               voltageId = mclk_table->entries[entryId].vddInd;
+               mclk_table->entries[entryId].vddc =
+                       table_info->vddc_lookup_table->entries[voltageId].us_vdd;
+       }
+
+       for (entryId = 0; entryId < mm_table->count; ++entryId) {
+               voltageId = mm_table->entries[entryId].vddcInd;
+               mm_table->entries[entryId].vddc =
+                       table_info->vddc_lookup_table->entries[voltageId].us_vdd;
+       }
+
+       return 0;
+
+}
+
+static int polaris10_calc_voltage_dependency_tables(struct pp_hwmgr *hwmgr)
+{
+       /* Need to determine if we need calculated voltage. */
+       return 0;
+}
+
+static int polaris10_calc_mm_voltage_dependency_table(struct pp_hwmgr *hwmgr)
+{
+       /* Need to determine if we need calculated voltage from mm table. */
+       return 0;
+}
+
+static int polaris10_sort_lookup_table(struct pp_hwmgr *hwmgr,
+               struct phm_ppt_v1_voltage_lookup_table *lookup_table)
+{
+       uint32_t table_size, i, j;
+       struct phm_ppt_v1_voltage_lookup_record tmp_voltage_lookup_record;
+       table_size = lookup_table->count;
+
+       PP_ASSERT_WITH_CODE(0 != lookup_table->count,
+               "Lookup table is empty", return -EINVAL);
+
+       /* Sorting voltages */
+       for (i = 0; i < table_size - 1; i++) {
+               for (j = i + 1; j > 0; j--) {
+                       if (lookup_table->entries[j].us_vdd <
+                                       lookup_table->entries[j - 1].us_vdd) {
+                               tmp_voltage_lookup_record = lookup_table->entries[j - 1];
+                               lookup_table->entries[j - 1] = lookup_table->entries[j];
+                               lookup_table->entries[j] = tmp_voltage_lookup_record;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_complete_dependency_tables(struct pp_hwmgr *hwmgr)
+{
+       int result = 0;
+       int tmp_result;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       tmp_result = polaris10_patch_lookup_table_with_leakage(hwmgr,
+                       table_info->vddc_lookup_table, &(data->vddc_leakage));
+       if (tmp_result)
+               result = tmp_result;
+
+       tmp_result = polaris10_patch_clock_voltage_limits_with_vddc_leakage(hwmgr,
+                       &(data->vddc_leakage), &table_info->max_clock_voltage_on_dc.vddc);
+       if (tmp_result)
+               result = tmp_result;
+
+       tmp_result = polaris10_patch_voltage_dependency_tables_with_lookup_table(hwmgr);
+       if (tmp_result)
+               result = tmp_result;
+
+       tmp_result = polaris10_calc_voltage_dependency_tables(hwmgr);
+       if (tmp_result)
+               result = tmp_result;
+
+       tmp_result = polaris10_calc_mm_voltage_dependency_table(hwmgr);
+       if (tmp_result)
+               result = tmp_result;
+
+       tmp_result = polaris10_sort_lookup_table(hwmgr, table_info->vddc_lookup_table);
+       if (tmp_result)
+               result = tmp_result;
+
+       return result;
+}
+
+static int polaris10_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
+{
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       struct phm_ppt_v1_clock_voltage_dependency_table *allowed_sclk_vdd_table =
+                                               table_info->vdd_dep_on_sclk;
+       struct phm_ppt_v1_clock_voltage_dependency_table *allowed_mclk_vdd_table =
+                                               table_info->vdd_dep_on_mclk;
+
+       PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table != NULL,
+               "VDD dependency on SCLK table is missing.       \
+               This table is mandatory", return -EINVAL);
+       PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table->count >= 1,
+               "VDD dependency on SCLK table has to have is missing.   \
+               This table is mandatory", return -EINVAL);
+
+       PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table != NULL,
+               "VDD dependency on MCLK table is missing.       \
+               This table is mandatory", return -EINVAL);
+       PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table->count >= 1,
+               "VDD dependency on MCLK table has to have is missing.    \
+               This table is mandatory", return -EINVAL);
+
+       table_info->max_clock_voltage_on_ac.sclk =
+               allowed_sclk_vdd_table->entries[allowed_sclk_vdd_table->count - 1].clk;
+       table_info->max_clock_voltage_on_ac.mclk =
+               allowed_mclk_vdd_table->entries[allowed_mclk_vdd_table->count - 1].clk;
+       table_info->max_clock_voltage_on_ac.vddc =
+               allowed_sclk_vdd_table->entries[allowed_sclk_vdd_table->count - 1].vddc;
+       table_info->max_clock_voltage_on_ac.vddci =
+               allowed_mclk_vdd_table->entries[allowed_mclk_vdd_table->count - 1].vddci;
+
+       hwmgr->dyn_state.max_clock_voltage_on_ac.sclk = table_info->max_clock_voltage_on_ac.sclk;
+       hwmgr->dyn_state.max_clock_voltage_on_ac.mclk = table_info->max_clock_voltage_on_ac.mclk;
+       hwmgr->dyn_state.max_clock_voltage_on_ac.vddc = table_info->max_clock_voltage_on_ac.vddc;
+       hwmgr->dyn_state.max_clock_voltage_on_ac.vddci =table_info->max_clock_voltage_on_ac.vddci;
+
+       return 0;
+}
+
+int polaris10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct pp_atomctrl_gpio_pin_assignment gpio_pin_assignment;
+       uint32_t temp_reg;
+       int result;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       data->dll_default_on = false;
+       data->sram_end = SMC_RAM_END;
+       data->mclk_dpm0_activity_target = 0xa;
+       data->disable_dpm_mask = 0xFF;
+       data->static_screen_threshold = PPPOLARIS10_STATICSCREENTHRESHOLD_DFLT;
+       data->static_screen_threshold_unit = PPPOLARIS10_STATICSCREENTHRESHOLD_DFLT;
+       data->activity_target[0] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[1] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[2] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[3] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[4] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[5] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[6] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+       data->activity_target[7] = PPPOLARIS10_TARGETACTIVITY_DFLT;
+
+       data->voting_rights_clients0 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT0;
+       data->voting_rights_clients1 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT1;
+       data->voting_rights_clients2 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT2;
+       data->voting_rights_clients3 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT3;
+       data->voting_rights_clients4 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT4;
+       data->voting_rights_clients5 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT5;
+       data->voting_rights_clients6 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT6;
+       data->voting_rights_clients7 = PPPOLARIS10_VOTINGRIGHTSCLIENTS_DFLT7;
+
+       data->vddc_vddci_delta = VDDC_VDDCI_DELTA;
+
+       data->mclk_activity_target = PPPOLARIS10_MCLK_TARGETACTIVITY_DFLT;
+
+       /* need to set voltage control types before EVV patching */
+       data->voltage_control = POLARIS10_VOLTAGE_CONTROL_NONE;
+       data->vddci_control = POLARIS10_VOLTAGE_CONTROL_NONE;
+       data->mvdd_control = POLARIS10_VOLTAGE_CONTROL_NONE;
+
+       if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr,
+                       VOLTAGE_TYPE_VDDC, VOLTAGE_OBJ_SVID2))
+               data->voltage_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_EnableMVDDControl)) {
+               if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr,
+                               VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_GPIO_LUT))
+                       data->mvdd_control = POLARIS10_VOLTAGE_CONTROL_BY_GPIO;
+               else if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr,
+                               VOLTAGE_TYPE_MVDDC, VOLTAGE_OBJ_SVID2))
+                       data->mvdd_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2;
+       }
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_ControlVDDCI)) {
+               if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr,
+                               VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_GPIO_LUT))
+                       data->vddci_control = POLARIS10_VOLTAGE_CONTROL_BY_GPIO;
+               else if (atomctrl_is_voltage_controled_by_gpio_v3(hwmgr,
+                               VOLTAGE_TYPE_VDDCI, VOLTAGE_OBJ_SVID2))
+                       data->vddci_control = POLARIS10_VOLTAGE_CONTROL_BY_SVID2;
+       }
+
+       polaris10_set_features_platform_caps(hwmgr);
+
+       polaris10_init_dpm_defaults(hwmgr);
+
+       /* Get leakage voltage based on leakage ID. */
+       result = polaris10_get_evv_voltages(hwmgr);
+
+       if (result) {
+               printk("Get EVV Voltage Failed.  Abort Driver loading!\n");
+               return -1;
+       }
+
+       polaris10_complete_dependency_tables(hwmgr);
+       polaris10_set_private_data_based_on_pptable(hwmgr);
+
+       /* Initalize Dynamic State Adjustment Rule Settings */
+       result = phm_initializa_dynamic_state_adjustment_rule_settings(hwmgr);
+
+       if (0 == result) {
+               struct cgs_system_info sys_info = {0};
+
+               data->is_tlu_enabled = 0;
+
+               hwmgr->platform_descriptor.hardwareActivityPerformanceLevels =
+                                                       POLARIS10_MAX_HARDWARE_POWERLEVELS;
+               hwmgr->platform_descriptor.hardwarePerformanceLevels = 2;
+               hwmgr->platform_descriptor.minimumClocksReductionPercentage = 50;
+
+
+               if (atomctrl_get_pp_assign_pin(hwmgr, VDDC_PCC_GPIO_PINID, &gpio_pin_assignment)) {
+                       temp_reg = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCNB_PWRMGT_CNTL);
+                       switch (gpio_pin_assignment.uc_gpio_pin_bit_shift) {
+                       case 0:
+                               temp_reg = PHM_SET_FIELD(temp_reg, CNB_PWRMGT_CNTL, GNB_SLOW_MODE, 0x1);
+                               break;
+                       case 1:
+                               temp_reg = PHM_SET_FIELD(temp_reg, CNB_PWRMGT_CNTL, GNB_SLOW_MODE, 0x2);
+                               break;
+                       case 2:
+                               temp_reg = PHM_SET_FIELD(temp_reg, CNB_PWRMGT_CNTL, GNB_SLOW, 0x1);
+                               break;
+                       case 3:
+                               temp_reg = PHM_SET_FIELD(temp_reg, CNB_PWRMGT_CNTL, FORCE_NB_PS1, 0x1);
+                               break;
+                       case 4:
+                               temp_reg = PHM_SET_FIELD(temp_reg, CNB_PWRMGT_CNTL, DPM_ENABLED, 0x1);
+                               break;
+                       default:
+                               PP_ASSERT_WITH_CODE(0,
+                               "Failed to setup PCC HW register! Wrong GPIO assigned for VDDC_PCC_GPIO_PINID!",
+                               );
+                               break;
+                       }
+                       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCNB_PWRMGT_CNTL, temp_reg);
+               }
+
+               if (table_info->cac_dtp_table->usDefaultTargetOperatingTemp != 0 &&
+                       hwmgr->thermal_controller.advanceFanControlParameters.ucFanControlMode) {
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanPWMMinLimit =
+                               (uint16_t)hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanPWMMaxLimit =
+                               (uint16_t)hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanPWM;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanPWMStep = 1;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMaxLimit = 100;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMMinLimit =
+                               (uint16_t)hwmgr->thermal_controller.advanceFanControlParameters.ucMinimumPWMLimit;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usFanRPMStep = 1;
+
+                       table_info->cac_dtp_table->usDefaultTargetOperatingTemp = (table_info->cac_dtp_table->usDefaultTargetOperatingTemp >= 50) ?
+                                                                       (table_info->cac_dtp_table->usDefaultTargetOperatingTemp -50) : 0;
+
+                       table_info->cac_dtp_table->usOperatingTempMaxLimit = table_info->cac_dtp_table->usDefaultTargetOperatingTemp;
+                       table_info->cac_dtp_table->usOperatingTempStep = 1;
+                       table_info->cac_dtp_table->usOperatingTempHyst = 1;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanPWM =
+                                      hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanPWM;
+
+                       hwmgr->thermal_controller.advanceFanControlParameters.usMaxFanRPM =
+                                      hwmgr->thermal_controller.advanceFanControlParameters.usDefaultMaxFanRPM;
+
+                       hwmgr->dyn_state.cac_dtp_table->usOperatingTempMinLimit =
+                                      table_info->cac_dtp_table->usOperatingTempMinLimit;
+
+                       hwmgr->dyn_state.cac_dtp_table->usOperatingTempMaxLimit =
+                                      table_info->cac_dtp_table->usOperatingTempMaxLimit;
+
+                       hwmgr->dyn_state.cac_dtp_table->usDefaultTargetOperatingTemp =
+                                      table_info->cac_dtp_table->usDefaultTargetOperatingTemp;
+
+                       hwmgr->dyn_state.cac_dtp_table->usOperatingTempStep =
+                                      table_info->cac_dtp_table->usOperatingTempStep;
+
+                       hwmgr->dyn_state.cac_dtp_table->usTargetOperatingTemp =
+                                      table_info->cac_dtp_table->usTargetOperatingTemp;
+               }
+
+               sys_info.size = sizeof(struct cgs_system_info);
+               sys_info.info_id = CGS_SYSTEM_INFO_PCIE_GEN_INFO;
+               result = cgs_query_system_info(hwmgr->device, &sys_info);
+               if (result)
+                       data->pcie_gen_cap = 0x30007;
+               else
+                       data->pcie_gen_cap = (uint32_t)sys_info.value;
+               if (data->pcie_gen_cap & CAIL_PCIE_LINK_SPEED_SUPPORT_GEN3)
+                       data->pcie_spc_cap = 20;
+               sys_info.size = sizeof(struct cgs_system_info);
+               sys_info.info_id = CGS_SYSTEM_INFO_PCIE_MLW;
+               result = cgs_query_system_info(hwmgr->device, &sys_info);
+               if (result)
+                       data->pcie_lane_cap = 0x2f0000;
+               else
+                       data->pcie_lane_cap = (uint32_t)sys_info.value;
+
+               hwmgr->platform_descriptor.vbiosInterruptId = 0x20000400; /* IRQ_SOURCE1_SW_INT */
+/* The true clock step depends on the frequency, typically 4.5 or 9 MHz. Here we use 5. */
+               hwmgr->platform_descriptor.clockStep.engineClock = 500;
+               hwmgr->platform_descriptor.clockStep.memoryClock = 500;
+       } else {
+               /* Ignore return value in here, we are cleaning up a mess. */
+               polaris10_hwmgr_backend_fini(hwmgr);
+       }
+
+       return 0;
+}
+
+static int polaris10_force_dpm_highest(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t level, tmp;
+
+       if (!data->pcie_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.pcie_dpm_enable_mask) {
+                       level = 0;
+                       tmp = data->dpm_level_enable_mask.pcie_dpm_enable_mask;
+                       while (tmp >>= 1)
+                               level++;
+
+                       if (level)
+                               smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                               PPSMC_MSG_PCIeDPM_ForceLevel, level);
+               }
+       }
+
+       if (!data->sclk_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.sclk_dpm_enable_mask) {
+                       level = 0;
+                       tmp = data->dpm_level_enable_mask.sclk_dpm_enable_mask;
+                       while (tmp >>= 1)
+                               level++;
+
+                       if (level)
+                               smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                               PPSMC_MSG_SCLKDPM_SetEnabledMask,
+                                               (1 << level));
+               }
+       }
+
+       if (!data->mclk_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.mclk_dpm_enable_mask) {
+                       level = 0;
+                       tmp = data->dpm_level_enable_mask.mclk_dpm_enable_mask;
+                       while (tmp >>= 1)
+                               level++;
+
+                       if (level)
+                               smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                               PPSMC_MSG_MCLKDPM_SetEnabledMask,
+                                               (1 << level));
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_upload_dpm_level_enable_mask(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       phm_apply_dal_min_voltage_request(hwmgr);
+
+       if (!data->sclk_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.sclk_dpm_enable_mask)
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_SCLKDPM_SetEnabledMask,
+                                       data->dpm_level_enable_mask.sclk_dpm_enable_mask);
+       }
+
+       if (!data->mclk_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.mclk_dpm_enable_mask)
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_MCLKDPM_SetEnabledMask,
+                                       data->dpm_level_enable_mask.mclk_dpm_enable_mask);
+       }
+
+       return 0;
+}
+
+static int polaris10_unforce_dpm_levels(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (!polaris10_is_dpm_running(hwmgr))
+               return -EINVAL;
+
+       if (!data->pcie_dpm_key_disabled) {
+               smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_PCIeDPM_UnForceLevel);
+       }
+
+       return polaris10_upload_dpm_level_enable_mask(hwmgr);
+}
+
+static int polaris10_force_dpm_lowest(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data =
+                       (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t level;
+
+       if (!data->sclk_dpm_key_disabled)
+               if (data->dpm_level_enable_mask.sclk_dpm_enable_mask) {
+                       level = phm_get_lowest_enabled_level(hwmgr,
+                                                             data->dpm_level_enable_mask.sclk_dpm_enable_mask);
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                                           PPSMC_MSG_SCLKDPM_SetEnabledMask,
+                                                           (1 << level));
+
+       }
+
+       if (!data->mclk_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.mclk_dpm_enable_mask) {
+                       level = phm_get_lowest_enabled_level(hwmgr,
+                                                             data->dpm_level_enable_mask.mclk_dpm_enable_mask);
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                                           PPSMC_MSG_MCLKDPM_SetEnabledMask,
+                                                           (1 << level));
+               }
+       }
+
+       if (!data->pcie_dpm_key_disabled) {
+               if (data->dpm_level_enable_mask.pcie_dpm_enable_mask) {
+                       level = phm_get_lowest_enabled_level(hwmgr,
+                                                             data->dpm_level_enable_mask.pcie_dpm_enable_mask);
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                                           PPSMC_MSG_PCIeDPM_ForceLevel,
+                                                           (level));
+               }
+       }
+
+       return 0;
+
+}
+static int polaris10_force_dpm_level(struct pp_hwmgr *hwmgr,
+                               enum amd_dpm_forced_level level)
+{
+       int ret = 0;
+
+       switch (level) {
+       case AMD_DPM_FORCED_LEVEL_HIGH:
+               ret = polaris10_force_dpm_highest(hwmgr);
+               if (ret)
+                       return ret;
+               break;
+       case AMD_DPM_FORCED_LEVEL_LOW:
+               ret = polaris10_force_dpm_lowest(hwmgr);
+               if (ret)
+                       return ret;
+               break;
+       case AMD_DPM_FORCED_LEVEL_AUTO:
+               ret = polaris10_unforce_dpm_levels(hwmgr);
+               if (ret)
+                       return ret;
+               break;
+       default:
+               break;
+       }
+
+       hwmgr->dpm_level = level;
+
+       return ret;
+}
+
+static int polaris10_get_power_state_size(struct pp_hwmgr *hwmgr)
+{
+       return sizeof(struct polaris10_power_state);
+}
+
+
+static int polaris10_apply_state_adjust_rules(struct pp_hwmgr *hwmgr,
+                               struct pp_power_state *request_ps,
+                       const struct pp_power_state *current_ps)
+{
+
+       struct polaris10_power_state *polaris10_ps =
+                               cast_phw_polaris10_power_state(&request_ps->hardware);
+       uint32_t sclk;
+       uint32_t mclk;
+       struct PP_Clocks minimum_clocks = {0};
+       bool disable_mclk_switching;
+       bool disable_mclk_switching_for_frame_lock;
+       struct cgs_display_info info = {0};
+       const struct phm_clock_and_voltage_limits *max_limits;
+       uint32_t i;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       int32_t count;
+       int32_t stable_pstate_sclk = 0, stable_pstate_mclk = 0;
+
+       data->battery_state = (PP_StateUILabel_Battery ==
+                       request_ps->classification.ui_label);
+
+       PP_ASSERT_WITH_CODE(polaris10_ps->performance_level_count == 2,
+                                "VI should always have 2 performance levels",
+                               );
+
+       max_limits = (PP_PowerSource_AC == hwmgr->power_source) ?
+                       &(hwmgr->dyn_state.max_clock_voltage_on_ac) :
+                       &(hwmgr->dyn_state.max_clock_voltage_on_dc);
+
+       /* Cap clock DPM tables at DC MAX if it is in DC. */
+       if (PP_PowerSource_DC == hwmgr->power_source) {
+               for (i = 0; i < polaris10_ps->performance_level_count; i++) {
+                       if (polaris10_ps->performance_levels[i].memory_clock > max_limits->mclk)
+                               polaris10_ps->performance_levels[i].memory_clock = max_limits->mclk;
+                       if (polaris10_ps->performance_levels[i].engine_clock > max_limits->sclk)
+                               polaris10_ps->performance_levels[i].engine_clock = max_limits->sclk;
+               }
+       }
+
+       polaris10_ps->vce_clks.evclk = hwmgr->vce_arbiter.evclk;
+       polaris10_ps->vce_clks.ecclk = hwmgr->vce_arbiter.ecclk;
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+
+       /*TO DO result = PHM_CheckVBlankTime(hwmgr, &vblankTooShort);*/
+
+       /* TO DO GetMinClockSettings(hwmgr->pPECI, &minimum_clocks); */
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_StablePState)) {
+               max_limits = &(hwmgr->dyn_state.max_clock_voltage_on_ac);
+               stable_pstate_sclk = (max_limits->sclk * 75) / 100;
+
+               for (count = table_info->vdd_dep_on_sclk->count - 1;
+                               count >= 0; count--) {
+                       if (stable_pstate_sclk >=
+                                       table_info->vdd_dep_on_sclk->entries[count].clk) {
+                               stable_pstate_sclk =
+                                               table_info->vdd_dep_on_sclk->entries[count].clk;
+                               break;
+                       }
+               }
+
+               if (count < 0)
+                       stable_pstate_sclk = table_info->vdd_dep_on_sclk->entries[0].clk;
+
+               stable_pstate_mclk = max_limits->mclk;
+
+               minimum_clocks.engineClock = stable_pstate_sclk;
+               minimum_clocks.memoryClock = stable_pstate_mclk;
+       }
+
+       if (minimum_clocks.engineClock < hwmgr->gfx_arbiter.sclk)
+               minimum_clocks.engineClock = hwmgr->gfx_arbiter.sclk;
+
+       if (minimum_clocks.memoryClock < hwmgr->gfx_arbiter.mclk)
+               minimum_clocks.memoryClock = hwmgr->gfx_arbiter.mclk;
+
+       polaris10_ps->sclk_threshold = hwmgr->gfx_arbiter.sclk_threshold;
+
+       if (0 != hwmgr->gfx_arbiter.sclk_over_drive) {
+               PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.sclk_over_drive <=
+                               hwmgr->platform_descriptor.overdriveLimit.engineClock),
+                               "Overdrive sclk exceeds limit",
+                               hwmgr->gfx_arbiter.sclk_over_drive =
+                                               hwmgr->platform_descriptor.overdriveLimit.engineClock);
+
+               if (hwmgr->gfx_arbiter.sclk_over_drive >= hwmgr->gfx_arbiter.sclk)
+                       polaris10_ps->performance_levels[1].engine_clock =
+                                       hwmgr->gfx_arbiter.sclk_over_drive;
+       }
+
+       if (0 != hwmgr->gfx_arbiter.mclk_over_drive) {
+               PP_ASSERT_WITH_CODE((hwmgr->gfx_arbiter.mclk_over_drive <=
+                               hwmgr->platform_descriptor.overdriveLimit.memoryClock),
+                               "Overdrive mclk exceeds limit",
+                               hwmgr->gfx_arbiter.mclk_over_drive =
+                                               hwmgr->platform_descriptor.overdriveLimit.memoryClock);
+
+               if (hwmgr->gfx_arbiter.mclk_over_drive >= hwmgr->gfx_arbiter.mclk)
+                       polaris10_ps->performance_levels[1].memory_clock =
+                                       hwmgr->gfx_arbiter.mclk_over_drive;
+       }
+
+       disable_mclk_switching_for_frame_lock = phm_cap_enabled(
+                                   hwmgr->platform_descriptor.platformCaps,
+                                   PHM_PlatformCaps_DisableMclkSwitchingForFrameLock);
+
+       disable_mclk_switching = (1 < info.display_count) ||
+                                   disable_mclk_switching_for_frame_lock;
+
+       sclk = polaris10_ps->performance_levels[0].engine_clock;
+       mclk = polaris10_ps->performance_levels[0].memory_clock;
+
+       if (disable_mclk_switching)
+               mclk = polaris10_ps->performance_levels
+               [polaris10_ps->performance_level_count - 1].memory_clock;
+
+       if (sclk < minimum_clocks.engineClock)
+               sclk = (minimum_clocks.engineClock > max_limits->sclk) ?
+                               max_limits->sclk : minimum_clocks.engineClock;
+
+       if (mclk < minimum_clocks.memoryClock)
+               mclk = (minimum_clocks.memoryClock > max_limits->mclk) ?
+                               max_limits->mclk : minimum_clocks.memoryClock;
+
+       polaris10_ps->performance_levels[0].engine_clock = sclk;
+       polaris10_ps->performance_levels[0].memory_clock = mclk;
+
+       polaris10_ps->performance_levels[1].engine_clock =
+               (polaris10_ps->performance_levels[1].engine_clock >=
+                               polaris10_ps->performance_levels[0].engine_clock) ?
+                                               polaris10_ps->performance_levels[1].engine_clock :
+                                               polaris10_ps->performance_levels[0].engine_clock;
+
+       if (disable_mclk_switching) {
+               if (mclk < polaris10_ps->performance_levels[1].memory_clock)
+                       mclk = polaris10_ps->performance_levels[1].memory_clock;
+
+               polaris10_ps->performance_levels[0].memory_clock = mclk;
+               polaris10_ps->performance_levels[1].memory_clock = mclk;
+       } else {
+               if (polaris10_ps->performance_levels[1].memory_clock <
+                               polaris10_ps->performance_levels[0].memory_clock)
+                       polaris10_ps->performance_levels[1].memory_clock =
+                                       polaris10_ps->performance_levels[0].memory_clock;
+       }
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_StablePState)) {
+               for (i = 0; i < polaris10_ps->performance_level_count; i++) {
+                       polaris10_ps->performance_levels[i].engine_clock = stable_pstate_sclk;
+                       polaris10_ps->performance_levels[i].memory_clock = stable_pstate_mclk;
+                       polaris10_ps->performance_levels[i].pcie_gen = data->pcie_gen_performance.max;
+                       polaris10_ps->performance_levels[i].pcie_lane = data->pcie_gen_performance.max;
+               }
+       }
+       return 0;
+}
+
+
+static int polaris10_dpm_get_mclk(struct pp_hwmgr *hwmgr, bool low)
+{
+       struct pp_power_state  *ps;
+       struct polaris10_power_state  *polaris10_ps;
+
+       if (hwmgr == NULL)
+               return -EINVAL;
+
+       ps = hwmgr->request_ps;
+
+       if (ps == NULL)
+               return -EINVAL;
+
+       polaris10_ps = cast_phw_polaris10_power_state(&ps->hardware);
+
+       if (low)
+               return polaris10_ps->performance_levels[0].memory_clock;
+       else
+               return polaris10_ps->performance_levels
+                               [polaris10_ps->performance_level_count-1].memory_clock;
+}
+
+static int polaris10_dpm_get_sclk(struct pp_hwmgr *hwmgr, bool low)
+{
+       struct pp_power_state  *ps;
+       struct polaris10_power_state  *polaris10_ps;
+
+       if (hwmgr == NULL)
+               return -EINVAL;
+
+       ps = hwmgr->request_ps;
+
+       if (ps == NULL)
+               return -EINVAL;
+
+       polaris10_ps = cast_phw_polaris10_power_state(&ps->hardware);
+
+       if (low)
+               return polaris10_ps->performance_levels[0].engine_clock;
+       else
+               return polaris10_ps->performance_levels
+                               [polaris10_ps->performance_level_count-1].engine_clock;
+}
+
+static int polaris10_dpm_patch_boot_state(struct pp_hwmgr *hwmgr,
+                                       struct pp_hw_power_state *hw_ps)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_power_state *ps = (struct polaris10_power_state *)hw_ps;
+       ATOM_FIRMWARE_INFO_V2_2 *fw_info;
+       uint16_t size;
+       uint8_t frev, crev;
+       int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
+
+       /* First retrieve the Boot clocks and VDDC from the firmware info table.
+        * We assume here that fw_info is unchanged if this call fails.
+        */
+       fw_info = (ATOM_FIRMWARE_INFO_V2_2 *)cgs_atom_get_data_table(
+                       hwmgr->device, index,
+                       &size, &frev, &crev);
+       if (!fw_info)
+               /* During a test, there is no firmware info table. */
+               return 0;
+
+       /* Patch the state. */
+       data->vbios_boot_state.sclk_bootup_value =
+                       le32_to_cpu(fw_info->ulDefaultEngineClock);
+       data->vbios_boot_state.mclk_bootup_value =
+                       le32_to_cpu(fw_info->ulDefaultMemoryClock);
+       data->vbios_boot_state.mvdd_bootup_value =
+                       le16_to_cpu(fw_info->usBootUpMVDDCVoltage);
+       data->vbios_boot_state.vddc_bootup_value =
+                       le16_to_cpu(fw_info->usBootUpVDDCVoltage);
+       data->vbios_boot_state.vddci_bootup_value =
+                       le16_to_cpu(fw_info->usBootUpVDDCIVoltage);
+       data->vbios_boot_state.pcie_gen_bootup_value =
+                       phm_get_current_pcie_speed(hwmgr);
+
+       data->vbios_boot_state.pcie_lane_bootup_value =
+                       (uint16_t)phm_get_current_pcie_lane_number(hwmgr);
+
+       /* set boot power state */
+       ps->performance_levels[0].memory_clock = data->vbios_boot_state.mclk_bootup_value;
+       ps->performance_levels[0].engine_clock = data->vbios_boot_state.sclk_bootup_value;
+       ps->performance_levels[0].pcie_gen = data->vbios_boot_state.pcie_gen_bootup_value;
+       ps->performance_levels[0].pcie_lane = data->vbios_boot_state.pcie_lane_bootup_value;
+
+       return 0;
+}
+
+static int polaris10_get_pp_table_entry_callback_func(struct pp_hwmgr *hwmgr,
+               void *state, struct pp_power_state *power_state,
+               void *pp_table, uint32_t classification_flag)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_power_state  *polaris10_power_state =
+                       (struct polaris10_power_state *)(&(power_state->hardware));
+       struct polaris10_performance_level *performance_level;
+       ATOM_Tonga_State *state_entry = (ATOM_Tonga_State *)state;
+       ATOM_Tonga_POWERPLAYTABLE *powerplay_table =
+                       (ATOM_Tonga_POWERPLAYTABLE *)pp_table;
+       ATOM_Tonga_SCLK_Dependency_Table *sclk_dep_table =
+                       (ATOM_Tonga_SCLK_Dependency_Table *)
+                       (((unsigned long)powerplay_table) +
+                               le16_to_cpu(powerplay_table->usSclkDependencyTableOffset));
+       ATOM_Tonga_MCLK_Dependency_Table *mclk_dep_table =
+                       (ATOM_Tonga_MCLK_Dependency_Table *)
+                       (((unsigned long)powerplay_table) +
+                               le16_to_cpu(powerplay_table->usMclkDependencyTableOffset));
+
+       /* The following fields are not initialized here: id orderedList allStatesList */
+       power_state->classification.ui_label =
+                       (le16_to_cpu(state_entry->usClassification) &
+                       ATOM_PPLIB_CLASSIFICATION_UI_MASK) >>
+                       ATOM_PPLIB_CLASSIFICATION_UI_SHIFT;
+       power_state->classification.flags = classification_flag;
+       /* NOTE: There is a classification2 flag in BIOS that is not being used right now */
+
+       power_state->classification.temporary_state = false;
+       power_state->classification.to_be_deleted = false;
+
+       power_state->validation.disallowOnDC =
+                       (0 != (le32_to_cpu(state_entry->ulCapsAndSettings) &
+                                       ATOM_Tonga_DISALLOW_ON_DC));
+
+       power_state->pcie.lanes = 0;
+
+       power_state->display.disableFrameModulation = false;
+       power_state->display.limitRefreshrate = false;
+       power_state->display.enableVariBright =
+                       (0 != (le32_to_cpu(state_entry->ulCapsAndSettings) &
+                                       ATOM_Tonga_ENABLE_VARIBRIGHT));
+
+       power_state->validation.supportedPowerLevels = 0;
+       power_state->uvd_clocks.VCLK = 0;
+       power_state->uvd_clocks.DCLK = 0;
+       power_state->temperatures.min = 0;
+       power_state->temperatures.max = 0;
+
+       performance_level = &(polaris10_power_state->performance_levels
+                       [polaris10_power_state->performance_level_count++]);
+
+       PP_ASSERT_WITH_CODE(
+                       (polaris10_power_state->performance_level_count < SMU74_MAX_LEVELS_GRAPHICS),
+                       "Performance levels exceeds SMC limit!",
+                       return -1);
+
+       PP_ASSERT_WITH_CODE(
+                       (polaris10_power_state->performance_level_count <=
+                                       hwmgr->platform_descriptor.hardwareActivityPerformanceLevels),
+                       "Performance levels exceeds Driver limit!",
+                       return -1);
+
+       /* Performance levels are arranged from low to high. */
+       performance_level->memory_clock = mclk_dep_table->entries
+                       [state_entry->ucMemoryClockIndexLow].ulMclk;
+       performance_level->engine_clock = sclk_dep_table->entries
+                       [state_entry->ucEngineClockIndexLow].ulSclk;
+       performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
+                       state_entry->ucPCIEGenLow);
+       performance_level->pcie_lane = get_pcie_lane_support(data->pcie_lane_cap,
+                       state_entry->ucPCIELaneHigh);
+
+       performance_level = &(polaris10_power_state->performance_levels
+                       [polaris10_power_state->performance_level_count++]);
+       performance_level->memory_clock = mclk_dep_table->entries
+                       [state_entry->ucMemoryClockIndexHigh].ulMclk;
+       performance_level->engine_clock = sclk_dep_table->entries
+                       [state_entry->ucEngineClockIndexHigh].ulSclk;
+       performance_level->pcie_gen = get_pcie_gen_support(data->pcie_gen_cap,
+                       state_entry->ucPCIEGenHigh);
+       performance_level->pcie_lane = get_pcie_lane_support(data->pcie_lane_cap,
+                       state_entry->ucPCIELaneHigh);
+
+       return 0;
+}
+
+static int polaris10_get_pp_table_entry(struct pp_hwmgr *hwmgr,
+               unsigned long entry_index, struct pp_power_state *state)
+{
+       int result;
+       struct polaris10_power_state *ps;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table =
+                       table_info->vdd_dep_on_mclk;
+
+       state->hardware.magic = PHM_VIslands_Magic;
+
+       ps = (struct polaris10_power_state *)(&state->hardware);
+
+       result = tonga_get_powerplay_table_entry(hwmgr, entry_index, state,
+                       polaris10_get_pp_table_entry_callback_func);
+
+       /* This is the earliest time we have all the dependency table and the VBIOS boot state
+        * as PP_Tables_GetPowerPlayTableEntry retrieves the VBIOS boot state
+        * if there is only one VDDCI/MCLK level, check if it's the same as VBIOS boot state
+        */
+       if (dep_mclk_table != NULL && dep_mclk_table->count == 1) {
+               if (dep_mclk_table->entries[0].clk !=
+                               data->vbios_boot_state.mclk_bootup_value)
+                       printk(KERN_ERR "Single MCLK entry VDDCI/MCLK dependency table "
+                                       "does not match VBIOS boot MCLK level");
+               if (dep_mclk_table->entries[0].vddci !=
+                               data->vbios_boot_state.vddci_bootup_value)
+                       printk(KERN_ERR "Single VDDCI entry VDDCI/MCLK dependency table "
+                                       "does not match VBIOS boot VDDCI level");
+       }
+
+       /* set DC compatible flag if this state supports DC */
+       if (!state->validation.disallowOnDC)
+               ps->dc_compatible = true;
+
+       if (state->classification.flags & PP_StateClassificationFlag_ACPI)
+               data->acpi_pcie_gen = ps->performance_levels[0].pcie_gen;
+
+       ps->uvd_clks.vclk = state->uvd_clocks.VCLK;
+       ps->uvd_clks.dclk = state->uvd_clocks.DCLK;
+
+       if (!result) {
+               uint32_t i;
+
+               switch (state->classification.ui_label) {
+               case PP_StateUILabel_Performance:
+                       data->use_pcie_performance_levels = true;
+
+                       for (i = 0; i < ps->performance_level_count; i++) {
+                               if (data->pcie_gen_performance.max <
+                                               ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_performance.max =
+                                                       ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_gen_performance.min >
+                                               ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_performance.min =
+                                                       ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_lane_performance.max <
+                                               ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_performance.max =
+                                                       ps->performance_levels[i].pcie_lane;
+
+                               if (data->pcie_lane_performance.min >
+                                               ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_performance.min =
+                                                       ps->performance_levels[i].pcie_lane;
+                       }
+                       break;
+               case PP_StateUILabel_Battery:
+                       data->use_pcie_power_saving_levels = true;
+
+                       for (i = 0; i < ps->performance_level_count; i++) {
+                               if (data->pcie_gen_power_saving.max <
+                                               ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_power_saving.max =
+                                                       ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_gen_power_saving.min >
+                                               ps->performance_levels[i].pcie_gen)
+                                       data->pcie_gen_power_saving.min =
+                                                       ps->performance_levels[i].pcie_gen;
+
+                               if (data->pcie_lane_power_saving.max <
+                                               ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_power_saving.max =
+                                                       ps->performance_levels[i].pcie_lane;
+
+                               if (data->pcie_lane_power_saving.min >
+                                               ps->performance_levels[i].pcie_lane)
+                                       data->pcie_lane_power_saving.min =
+                                                       ps->performance_levels[i].pcie_lane;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+       return 0;
+}
+
+static void
+polaris10_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m)
+{
+       uint32_t sclk, mclk, activity_percent;
+       uint32_t offset;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency);
+
+       sclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
+
+       smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetMclkFrequency);
+
+       mclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
+       seq_printf(m, "\n [  mclk  ]: %u MHz\n\n [  sclk  ]: %u MHz\n",
+                       mclk / 100, sclk / 100);
+
+       offset = data->soft_regs_start + offsetof(SMU74_SoftRegisters, AverageGraphicsActivity);
+       activity_percent = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, offset);
+       activity_percent += 0x80;
+       activity_percent >>= 8;
+
+       seq_printf(m, "\n [GPU load]: %u%%\n\n", activity_percent > 100 ? 100 : activity_percent);
+
+       seq_printf(m, "uvd    %sabled\n", data->uvd_power_gated ? "dis" : "en");
+
+       seq_printf(m, "vce    %sabled\n", data->vce_power_gated ? "dis" : "en");
+}
+
+static int polaris10_find_dpm_states_clocks_in_dpm_table(struct pp_hwmgr *hwmgr, const void *input)
+{
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       const struct polaris10_power_state *polaris10_ps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table);
+       uint32_t sclk = polaris10_ps->performance_levels
+                       [polaris10_ps->performance_level_count - 1].engine_clock;
+       struct polaris10_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table);
+       uint32_t mclk = polaris10_ps->performance_levels
+                       [polaris10_ps->performance_level_count - 1].memory_clock;
+       struct PP_Clocks min_clocks = {0};
+       uint32_t i;
+       struct cgs_display_info info = {0};
+
+       data->need_update_smu7_dpm_table = 0;
+
+       for (i = 0; i < sclk_table->count; i++) {
+               if (sclk == sclk_table->dpm_levels[i].value)
+                       break;
+       }
+
+       if (i >= sclk_table->count)
+               data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_SCLK;
+       else {
+       /* TODO: Check SCLK in DAL's minimum clocks
+        * in case DeepSleep divider update is required.
+        */
+               if (data->display_timing.min_clock_in_sr != min_clocks.engineClockInSR &&
+                       (min_clocks.engineClockInSR >= POLARIS10_MINIMUM_ENGINE_CLOCK ||
+                               data->display_timing.min_clock_in_sr >= POLARIS10_MINIMUM_ENGINE_CLOCK))
+                       data->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_SCLK;
+       }
+
+       for (i = 0; i < mclk_table->count; i++) {
+               if (mclk == mclk_table->dpm_levels[i].value)
+                       break;
+       }
+
+       if (i >= mclk_table->count)
+               data->need_update_smu7_dpm_table |= DPMTABLE_OD_UPDATE_MCLK;
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+
+       if (data->display_timing.num_existing_displays != info.display_count)
+               data->need_update_smu7_dpm_table |= DPMTABLE_UPDATE_MCLK;
+
+       return 0;
+}
+
+static uint16_t polaris10_get_maximum_link_speed(struct pp_hwmgr *hwmgr,
+               const struct polaris10_power_state *polaris10_ps)
+{
+       uint32_t i;
+       uint32_t sclk, max_sclk = 0;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_dpm_table *dpm_table = &data->dpm_table;
+
+       for (i = 0; i < polaris10_ps->performance_level_count; i++) {
+               sclk = polaris10_ps->performance_levels[i].engine_clock;
+               if (max_sclk < sclk)
+                       max_sclk = sclk;
+       }
+
+       for (i = 0; i < dpm_table->sclk_table.count; i++) {
+               if (dpm_table->sclk_table.dpm_levels[i].value == max_sclk)
+                       return (uint16_t) ((i >= dpm_table->pcie_speed_table.count) ?
+                                       dpm_table->pcie_speed_table.dpm_levels
+                                       [dpm_table->pcie_speed_table.count - 1].value :
+                                       dpm_table->pcie_speed_table.dpm_levels[i].value);
+       }
+
+       return 0;
+}
+
+static int polaris10_request_link_speed_change_before_state_change(
+               struct pp_hwmgr *hwmgr, const void *input)
+{
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_power_state *polaris10_nps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+       const struct polaris10_power_state *polaris10_cps =
+                       cast_const_phw_polaris10_power_state(states->pcurrent_state);
+
+       uint16_t target_link_speed = polaris10_get_maximum_link_speed(hwmgr, polaris10_nps);
+       uint16_t current_link_speed;
+
+       if (data->force_pcie_gen == PP_PCIEGenInvalid)
+               current_link_speed = polaris10_get_maximum_link_speed(hwmgr, polaris10_cps);
+       else
+               current_link_speed = data->force_pcie_gen;
+
+       data->force_pcie_gen = PP_PCIEGenInvalid;
+       data->pspp_notify_required = false;
+
+       if (target_link_speed > current_link_speed) {
+               switch (target_link_speed) {
+               case PP_PCIEGen3:
+                       if (0 == acpi_pcie_perf_request(hwmgr->device, PCIE_PERF_REQ_GEN3, false))
+                               break;
+                       data->force_pcie_gen = PP_PCIEGen2;
+                       if (current_link_speed == PP_PCIEGen2)
+                               break;
+               case PP_PCIEGen2:
+                       if (0 == acpi_pcie_perf_request(hwmgr->device, PCIE_PERF_REQ_GEN2, false))
+                               break;
+               default:
+                       data->force_pcie_gen = phm_get_current_pcie_speed(hwmgr);
+                       break;
+               }
+       } else {
+               if (target_link_speed < current_link_speed)
+                       data->pspp_notify_required = true;
+       }
+
+       return 0;
+}
+
+static int polaris10_freeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (0 == data->need_update_smu7_dpm_table)
+               return 0;
+
+       if ((0 == data->sclk_dpm_key_disabled) &&
+               (data->need_update_smu7_dpm_table &
+                       (DPMTABLE_OD_UPDATE_SCLK + DPMTABLE_UPDATE_SCLK))) {
+               PP_ASSERT_WITH_CODE(true == polaris10_is_dpm_running(hwmgr),
+                               "Trying to freeze SCLK DPM when DPM is disabled",
+                               );
+               PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_SCLKDPM_FreezeLevel),
+                               "Failed to freeze SCLK DPM during FreezeSclkMclkDPM Function!",
+                               return -1);
+       }
+
+       if ((0 == data->mclk_dpm_key_disabled) &&
+               (data->need_update_smu7_dpm_table &
+                DPMTABLE_OD_UPDATE_MCLK)) {
+               PP_ASSERT_WITH_CODE(true == polaris10_is_dpm_running(hwmgr),
+                               "Trying to freeze MCLK DPM when DPM is disabled",
+                               );
+               PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_MCLKDPM_FreezeLevel),
+                               "Failed to freeze MCLK DPM during FreezeSclkMclkDPM Function!",
+                               return -1);
+       }
+
+       return 0;
+}
+
+static int polaris10_populate_and_upload_sclk_mclk_dpm_levels(
+               struct pp_hwmgr *hwmgr, const void *input)
+{
+       int result = 0;
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       const struct polaris10_power_state *polaris10_ps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t sclk = polaris10_ps->performance_levels
+                       [polaris10_ps->performance_level_count - 1].engine_clock;
+       uint32_t mclk = polaris10_ps->performance_levels
+                       [polaris10_ps->performance_level_count - 1].memory_clock;
+       struct polaris10_dpm_table *dpm_table = &data->dpm_table;
+
+       struct polaris10_dpm_table *golden_dpm_table = &data->golden_dpm_table;
+       uint32_t dpm_count, clock_percent;
+       uint32_t i;
+
+       if (0 == data->need_update_smu7_dpm_table)
+               return 0;
+
+       if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_SCLK) {
+               dpm_table->sclk_table.dpm_levels
+               [dpm_table->sclk_table.count - 1].value = sclk;
+
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_OD6PlusinACSupport) ||
+                   phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_OD6PlusinDCSupport)) {
+               /* Need to do calculation based on the golden DPM table
+                * as the Heatmap GPU Clock axis is also based on the default values
+                */
+                       PP_ASSERT_WITH_CODE(
+                               (golden_dpm_table->sclk_table.dpm_levels
+                                               [golden_dpm_table->sclk_table.count - 1].value != 0),
+                               "Divide by 0!",
+                               return -1);
+                       dpm_count = dpm_table->sclk_table.count < 2 ? 0 : dpm_table->sclk_table.count - 2;
+
+                       for (i = dpm_count; i > 1; i--) {
+                               if (sclk > golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value) {
+                                       clock_percent =
+                                             ((sclk
+                                               - golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value
+                                               ) * 100)
+                                               / golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
+
+                                       dpm_table->sclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->sclk_table.dpm_levels[i].value +
+                                                       (golden_dpm_table->sclk_table.dpm_levels[i].value *
+                                                               clock_percent)/100;
+
+                               } else if (golden_dpm_table->sclk_table.dpm_levels[dpm_table->sclk_table.count-1].value > sclk) {
+                                       clock_percent =
+                                               ((golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count - 1].value
+                                               - sclk) * 100)
+                                               / golden_dpm_table->sclk_table.dpm_levels[golden_dpm_table->sclk_table.count-1].value;
+
+                                       dpm_table->sclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->sclk_table.dpm_levels[i].value -
+                                                       (golden_dpm_table->sclk_table.dpm_levels[i].value *
+                                                                       clock_percent) / 100;
+                               } else
+                                       dpm_table->sclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->sclk_table.dpm_levels[i].value;
+                       }
+               }
+       }
+
+       if (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK) {
+               dpm_table->mclk_table.dpm_levels
+                       [dpm_table->mclk_table.count - 1].value = mclk;
+
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_OD6PlusinACSupport) ||
+                   phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_OD6PlusinDCSupport)) {
+
+                       PP_ASSERT_WITH_CODE(
+                                       (golden_dpm_table->mclk_table.dpm_levels
+                                               [golden_dpm_table->mclk_table.count-1].value != 0),
+                                       "Divide by 0!",
+                                       return -1);
+                       dpm_count = dpm_table->mclk_table.count < 2 ? 0 : dpm_table->mclk_table.count - 2;
+                       for (i = dpm_count; i > 1; i--) {
+                               if (golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value < mclk) {
+                                       clock_percent = ((mclk -
+                                       golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value) * 100)
+                                       / golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value;
+
+                                       dpm_table->mclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->mclk_table.dpm_levels[i].value +
+                                                       (golden_dpm_table->mclk_table.dpm_levels[i].value *
+                                                       clock_percent) / 100;
+
+                               } else if (golden_dpm_table->mclk_table.dpm_levels[dpm_table->mclk_table.count-1].value > mclk) {
+                                       clock_percent = (
+                                        (golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value - mclk)
+                                       * 100)
+                                       / golden_dpm_table->mclk_table.dpm_levels[golden_dpm_table->mclk_table.count-1].value;
+
+                                       dpm_table->mclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->mclk_table.dpm_levels[i].value -
+                                                       (golden_dpm_table->mclk_table.dpm_levels[i].value *
+                                                                       clock_percent) / 100;
+                               } else
+                                       dpm_table->mclk_table.dpm_levels[i].value =
+                                                       golden_dpm_table->mclk_table.dpm_levels[i].value;
+                       }
+               }
+       }
+
+       if (data->need_update_smu7_dpm_table &
+                       (DPMTABLE_OD_UPDATE_SCLK + DPMTABLE_UPDATE_SCLK)) {
+               result = polaris10_populate_all_graphic_levels(hwmgr);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to populate SCLK during PopulateNewDPMClocksStates Function!",
+                               return result);
+       }
+
+       if (data->need_update_smu7_dpm_table &
+                       (DPMTABLE_OD_UPDATE_MCLK + DPMTABLE_UPDATE_MCLK)) {
+               /*populate MCLK dpm table to SMU7 */
+               result = polaris10_populate_all_memory_levels(hwmgr);
+               PP_ASSERT_WITH_CODE((0 == result),
+                               "Failed to populate MCLK during PopulateNewDPMClocksStates Function!",
+                               return result);
+       }
+
+       return result;
+}
+
+static int polaris10_trim_single_dpm_states(struct pp_hwmgr *hwmgr,
+                         struct polaris10_single_dpm_table *dpm_table,
+                       uint32_t low_limit, uint32_t high_limit)
+{
+       uint32_t i;
+
+       for (i = 0; i < dpm_table->count; i++) {
+               if ((dpm_table->dpm_levels[i].value < low_limit)
+               || (dpm_table->dpm_levels[i].value > high_limit))
+                       dpm_table->dpm_levels[i].enabled = false;
+               else
+                       dpm_table->dpm_levels[i].enabled = true;
+       }
+
+       return 0;
+}
+
+static int polaris10_trim_dpm_states(struct pp_hwmgr *hwmgr,
+               const struct polaris10_power_state *polaris10_ps)
+{
+       int result = 0;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t high_limit_count;
+
+       PP_ASSERT_WITH_CODE((polaris10_ps->performance_level_count >= 1),
+                       "power state did not have any performance level",
+                       return -1);
+
+       high_limit_count = (1 == polaris10_ps->performance_level_count) ? 0 : 1;
+
+       polaris10_trim_single_dpm_states(hwmgr,
+                       &(data->dpm_table.sclk_table),
+                       polaris10_ps->performance_levels[0].engine_clock,
+                       polaris10_ps->performance_levels[high_limit_count].engine_clock);
+
+       polaris10_trim_single_dpm_states(hwmgr,
+                       &(data->dpm_table.mclk_table),
+                       polaris10_ps->performance_levels[0].memory_clock,
+                       polaris10_ps->performance_levels[high_limit_count].memory_clock);
+
+       return result;
+}
+
+static int polaris10_generate_dpm_level_enable_mask(
+               struct pp_hwmgr *hwmgr, const void *input)
+{
+       int result;
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_power_state *polaris10_ps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+
+       result = polaris10_trim_dpm_states(hwmgr, polaris10_ps);
+       if (result)
+               return result;
+
+       data->dpm_level_enable_mask.sclk_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&data->dpm_table.sclk_table);
+       data->dpm_level_enable_mask.mclk_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&data->dpm_table.mclk_table);
+       data->dpm_level_enable_mask.pcie_dpm_enable_mask =
+                       phm_get_dpm_level_enable_mask_value(&data->dpm_table.pcie_speed_table);
+
+       return 0;
+}
+
+int polaris10_enable_disable_uvd_dpm(struct pp_hwmgr *hwmgr, bool enable)
+{
+       return smum_send_msg_to_smc(hwmgr->smumgr, enable ?
+                       PPSMC_MSG_UVDDPM_Enable :
+                       PPSMC_MSG_UVDDPM_Disable);
+}
+
+int polaris10_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable)
+{
+       return smum_send_msg_to_smc(hwmgr->smumgr, enable?
+                       PPSMC_MSG_VCEDPM_Enable :
+                       PPSMC_MSG_VCEDPM_Disable);
+}
+
+int polaris10_enable_disable_samu_dpm(struct pp_hwmgr *hwmgr, bool enable)
+{
+       return smum_send_msg_to_smc(hwmgr->smumgr, enable?
+                       PPSMC_MSG_SAMUDPM_Enable :
+                       PPSMC_MSG_SAMUDPM_Disable);
+}
+
+int polaris10_update_uvd_dpm(struct pp_hwmgr *hwmgr, bool bgate)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t mm_boot_level_offset, mm_boot_level_value;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       if (!bgate) {
+               data->smc_state_table.UvdBootLevel = 0;
+               if (table_info->mm_dep_table->count > 0)
+                       data->smc_state_table.UvdBootLevel =
+                                       (uint8_t) (table_info->mm_dep_table->count - 1);
+               mm_boot_level_offset = data->dpm_table_start +
+                               offsetof(SMU74_Discrete_DpmTable, UvdBootLevel);
+               mm_boot_level_offset /= 4;
+               mm_boot_level_offset *= 4;
+               mm_boot_level_value = cgs_read_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset);
+               mm_boot_level_value &= 0x00FFFFFF;
+               mm_boot_level_value |= data->smc_state_table.UvdBootLevel << 24;
+               cgs_write_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset, mm_boot_level_value);
+
+               if (!phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_UVDDPM) ||
+                       phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_StablePState))
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_UVDDPM_SetEnabledMask,
+                                       (uint32_t)(1 << data->smc_state_table.UvdBootLevel));
+       }
+
+       return polaris10_enable_disable_uvd_dpm(hwmgr, !bgate);
+}
+
+static int polaris10_update_vce_dpm(struct pp_hwmgr *hwmgr, const void *input)
+{
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_power_state *polaris10_nps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+       const struct polaris10_power_state *polaris10_cps =
+                       cast_const_phw_polaris10_power_state(states->pcurrent_state);
+
+       uint32_t mm_boot_level_offset, mm_boot_level_value;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       if (polaris10_nps->vce_clks.evclk > 0 &&
+       (polaris10_cps == NULL || polaris10_cps->vce_clks.evclk == 0)) {
+
+               data->smc_state_table.VceBootLevel =
+                               (uint8_t) (table_info->mm_dep_table->count - 1);
+
+               mm_boot_level_offset = data->dpm_table_start +
+                               offsetof(SMU74_Discrete_DpmTable, VceBootLevel);
+               mm_boot_level_offset /= 4;
+               mm_boot_level_offset *= 4;
+               mm_boot_level_value = cgs_read_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset);
+               mm_boot_level_value &= 0xFF00FFFF;
+               mm_boot_level_value |= data->smc_state_table.VceBootLevel << 16;
+               cgs_write_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset, mm_boot_level_value);
+
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_StablePState)) {
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_VCEDPM_SetEnabledMask,
+                                       (uint32_t)1 << data->smc_state_table.VceBootLevel);
+
+                       polaris10_enable_disable_vce_dpm(hwmgr, true);
+               } else if (polaris10_nps->vce_clks.evclk == 0 &&
+                               polaris10_cps != NULL &&
+                               polaris10_cps->vce_clks.evclk > 0)
+                       polaris10_enable_disable_vce_dpm(hwmgr, false);
+       }
+
+       return 0;
+}
+
+int polaris10_update_samu_dpm(struct pp_hwmgr *hwmgr, bool bgate)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t mm_boot_level_offset, mm_boot_level_value;
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+
+       if (!bgate) {
+               data->smc_state_table.SamuBootLevel =
+                               (uint8_t) (table_info->mm_dep_table->count - 1);
+               mm_boot_level_offset = data->dpm_table_start +
+                               offsetof(SMU74_Discrete_DpmTable, SamuBootLevel);
+               mm_boot_level_offset /= 4;
+               mm_boot_level_offset *= 4;
+               mm_boot_level_value = cgs_read_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset);
+               mm_boot_level_value &= 0xFFFFFF00;
+               mm_boot_level_value |= data->smc_state_table.SamuBootLevel << 0;
+               cgs_write_ind_register(hwmgr->device,
+                               CGS_IND_REG__SMC, mm_boot_level_offset, mm_boot_level_value);
+
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_StablePState))
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_SAMUDPM_SetEnabledMask,
+                                       (uint32_t)(1 << data->smc_state_table.SamuBootLevel));
+       }
+
+       return polaris10_enable_disable_samu_dpm(hwmgr, !bgate);
+}
+
+static int polaris10_update_sclk_threshold(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       int result = 0;
+       uint32_t low_sclk_interrupt_threshold = 0;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SclkThrottleLowNotification)
+               && (hwmgr->gfx_arbiter.sclk_threshold !=
+                               data->low_sclk_interrupt_threshold)) {
+               data->low_sclk_interrupt_threshold =
+                               hwmgr->gfx_arbiter.sclk_threshold;
+               low_sclk_interrupt_threshold =
+                               data->low_sclk_interrupt_threshold;
+
+               CONVERT_FROM_HOST_TO_SMC_UL(low_sclk_interrupt_threshold);
+
+               result = polaris10_copy_bytes_to_smc(
+                               hwmgr->smumgr,
+                               data->dpm_table_start +
+                               offsetof(SMU74_Discrete_DpmTable,
+                                       LowSclkInterruptThreshold),
+                               (uint8_t *)&low_sclk_interrupt_threshold,
+                               sizeof(uint32_t),
+                               data->sram_end);
+       }
+
+       return result;
+}
+
+static int polaris10_program_mem_timing_parameters(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->need_update_smu7_dpm_table &
+               (DPMTABLE_OD_UPDATE_SCLK + DPMTABLE_OD_UPDATE_MCLK))
+               return polaris10_program_memory_timing_parameters(hwmgr);
+
+       return 0;
+}
+
+static int polaris10_unfreeze_sclk_mclk_dpm(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (0 == data->need_update_smu7_dpm_table)
+               return 0;
+
+       if ((0 == data->sclk_dpm_key_disabled) &&
+               (data->need_update_smu7_dpm_table &
+               (DPMTABLE_OD_UPDATE_SCLK + DPMTABLE_UPDATE_SCLK))) {
+
+               PP_ASSERT_WITH_CODE(true == polaris10_is_dpm_running(hwmgr),
+                               "Trying to Unfreeze SCLK DPM when DPM is disabled",
+                               );
+               PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_SCLKDPM_UnfreezeLevel),
+                       "Failed to unfreeze SCLK DPM during UnFreezeSclkMclkDPM Function!",
+                       return -1);
+       }
+
+       if ((0 == data->mclk_dpm_key_disabled) &&
+               (data->need_update_smu7_dpm_table & DPMTABLE_OD_UPDATE_MCLK)) {
+
+               PP_ASSERT_WITH_CODE(true == polaris10_is_dpm_running(hwmgr),
+                               "Trying to Unfreeze MCLK DPM when DPM is disabled",
+                               );
+               PP_ASSERT_WITH_CODE(0 == smum_send_msg_to_smc(hwmgr->smumgr,
+                               PPSMC_MSG_SCLKDPM_UnfreezeLevel),
+                   "Failed to unfreeze MCLK DPM during UnFreezeSclkMclkDPM Function!",
+                   return -1);
+       }
+
+       data->need_update_smu7_dpm_table = 0;
+
+       return 0;
+}
+
+static int polaris10_notify_link_speed_change_after_state_change(
+               struct pp_hwmgr *hwmgr, const void *input)
+{
+       const struct phm_set_power_state_input *states =
+                       (const struct phm_set_power_state_input *)input;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_power_state *polaris10_ps =
+                       cast_const_phw_polaris10_power_state(states->pnew_state);
+       uint16_t target_link_speed = polaris10_get_maximum_link_speed(hwmgr, polaris10_ps);
+       uint8_t  request;
+
+       if (data->pspp_notify_required) {
+               if (target_link_speed == PP_PCIEGen3)
+                       request = PCIE_PERF_REQ_GEN3;
+               else if (target_link_speed == PP_PCIEGen2)
+                       request = PCIE_PERF_REQ_GEN2;
+               else
+                       request = PCIE_PERF_REQ_GEN1;
+
+               if (request == PCIE_PERF_REQ_GEN1 &&
+                               phm_get_current_pcie_speed(hwmgr) > 0)
+                       return 0;
+
+               if (acpi_pcie_perf_request(hwmgr->device, request, false)) {
+                       if (PP_PCIEGen2 == target_link_speed)
+                               printk("PSPP request to switch to Gen2 from Gen3 Failed!");
+                       else
+                               printk("PSPP request to switch to Gen1 from Gen2 Failed!");
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_set_power_state_tasks(struct pp_hwmgr *hwmgr, const void *input)
+{
+       int tmp_result, result = 0;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       tmp_result = polaris10_find_dpm_states_clocks_in_dpm_table(hwmgr, input);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to find DPM states clocks in DPM table!",
+                       result = tmp_result);
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_PCIEPerformanceRequest)) {
+               tmp_result =
+                       polaris10_request_link_speed_change_before_state_change(hwmgr, input);
+               PP_ASSERT_WITH_CODE((0 == tmp_result),
+                               "Failed to request link speed change before state change!",
+                               result = tmp_result);
+       }
+
+       tmp_result = polaris10_freeze_sclk_mclk_dpm(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to freeze SCLK MCLK DPM!", result = tmp_result);
+
+       tmp_result = polaris10_populate_and_upload_sclk_mclk_dpm_levels(hwmgr, input);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to populate and upload SCLK MCLK DPM levels!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_generate_dpm_level_enable_mask(hwmgr, input);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to generate DPM level enabled mask!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_update_vce_dpm(hwmgr, input);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to update VCE DPM!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_update_sclk_threshold(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to update SCLK threshold!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_program_mem_timing_parameters(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to program memory timing parameters!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_unfreeze_sclk_mclk_dpm(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to unfreeze SCLK MCLK DPM!",
+                       result = tmp_result);
+
+       tmp_result = polaris10_upload_dpm_level_enable_mask(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to upload DPM level enabled mask!",
+                       result = tmp_result);
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_PCIEPerformanceRequest)) {
+               tmp_result =
+                       polaris10_notify_link_speed_change_after_state_change(hwmgr, input);
+               PP_ASSERT_WITH_CODE((0 == tmp_result),
+                               "Failed to notify link speed change after state change!",
+                               result = tmp_result);
+       }
+       data->apply_optimized_settings = false;
+       return result;
+}
+
+static int polaris10_set_max_fan_pwm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_pwm)
+{
+       hwmgr->thermal_controller.
+       advanceFanControlParameters.usMaxFanPWM = us_max_fan_pwm;
+
+       if (phm_is_hw_access_blocked(hwmgr))
+               return 0;
+
+       return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                       PPSMC_MSG_SetFanPwmMax, us_max_fan_pwm);
+}
+
+int polaris10_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display)
+{
+       PPSMC_Msg msg = has_display ? (PPSMC_Msg)PPSMC_HasDisplay : (PPSMC_Msg)PPSMC_NoDisplay;
+
+       return (smum_send_msg_to_smc(hwmgr->smumgr, msg) == 0) ?  0 : -1;
+}
+
+int polaris10_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr)
+{
+       uint32_t num_active_displays = 0;
+       struct cgs_display_info info = {0};
+       info.mode_info = NULL;
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+
+       num_active_displays = info.display_count;
+
+       if (num_active_displays > 1)  /* to do && (pHwMgr->pPECI->displayConfiguration.bMultiMonitorInSync != TRUE)) */
+               polaris10_notify_smc_display_change(hwmgr, false);
+       else
+               polaris10_notify_smc_display_change(hwmgr, true);
+
+       return 0;
+}
+
+/**
+* Programs the display gap
+*
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @return   always OK
+*/
+int polaris10_program_display_gap(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t num_active_displays = 0;
+       uint32_t display_gap = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL);
+       uint32_t display_gap2;
+       uint32_t pre_vbi_time_in_us;
+       uint32_t frame_time_in_us;
+       uint32_t ref_clock;
+       uint32_t refresh_rate = 0;
+       struct cgs_display_info info = {0};
+       struct cgs_mode_info mode_info;
+
+       info.mode_info = &mode_info;
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+       num_active_displays = info.display_count;
+
+       display_gap = PHM_SET_FIELD(display_gap, CG_DISPLAY_GAP_CNTL, DISP_GAP, (num_active_displays > 0) ? DISPLAY_GAP_VBLANK_OR_WM : DISPLAY_GAP_IGNORE);
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL, display_gap);
+
+       ref_clock = mode_info.ref_clock;
+       refresh_rate = mode_info.refresh_rate;
+
+       if (0 == refresh_rate)
+               refresh_rate = 60;
+
+       frame_time_in_us = 1000000 / refresh_rate;
+
+       pre_vbi_time_in_us = frame_time_in_us - 200 - mode_info.vblank_time_us;
+       display_gap2 = pre_vbi_time_in_us * (ref_clock / 100);
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixCG_DISPLAY_GAP_CNTL2, display_gap2);
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, data->soft_regs_start + offsetof(SMU74_SoftRegisters, PreVBlankGap), 0x64);
+
+       cgs_write_ind_register(hwmgr->device, CGS_IND_REG__SMC, data->soft_regs_start + offsetof(SMU74_SoftRegisters, VBlankTimeout), (frame_time_in_us - pre_vbi_time_in_us));
+
+       polaris10_notify_smc_display_change(hwmgr, num_active_displays != 0);
+
+       return 0;
+}
+
+
+int polaris10_display_configuration_changed_task(struct pp_hwmgr *hwmgr)
+{
+       return polaris10_program_display_gap(hwmgr);
+}
+
+/**
+*  Set maximum target operating fan output RPM
+*
+* @param    hwmgr:  the address of the powerplay hardware manager.
+* @param    usMaxFanRpm:  max operating fan RPM value.
+* @return   The response that came from the SMC.
+*/
+static int polaris10_set_max_fan_rpm_output(struct pp_hwmgr *hwmgr, uint16_t us_max_fan_rpm)
+{
+       hwmgr->thermal_controller.
+       advanceFanControlParameters.usMaxFanRPM = us_max_fan_rpm;
+
+       if (phm_is_hw_access_blocked(hwmgr))
+               return 0;
+
+       return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                       PPSMC_MSG_SetFanRpmMax, us_max_fan_rpm);
+}
+
+int polaris10_register_internal_thermal_interrupt(struct pp_hwmgr *hwmgr,
+                                       const void *thermal_interrupt_info)
+{
+       return 0;
+}
+
+bool polaris10_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       bool is_update_required = false;
+       struct cgs_display_info info = {0, 0, NULL};
+
+       cgs_get_active_displays_info(hwmgr->device, &info);
+
+       if (data->display_timing.num_existing_displays != info.display_count)
+               is_update_required = true;
+/* TO DO NEED TO GET DEEP SLEEP CLOCK FROM DAL
+       if (phm_cap_enabled(hwmgr->hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep)) {
+               cgs_get_min_clock_settings(hwmgr->device, &min_clocks);
+               if (min_clocks.engineClockInSR != data->display_timing.minClockInSR &&
+                       (min_clocks.engineClockInSR >= POLARIS10_MINIMUM_ENGINE_CLOCK ||
+                               data->display_timing.minClockInSR >= POLARIS10_MINIMUM_ENGINE_CLOCK))
+                       is_update_required = true;
+*/
+       return is_update_required;
+}
+
+static inline bool polaris10_are_power_levels_equal(const struct polaris10_performance_level *pl1,
+                                                          const struct polaris10_performance_level *pl2)
+{
+       return ((pl1->memory_clock == pl2->memory_clock) &&
+                 (pl1->engine_clock == pl2->engine_clock) &&
+                 (pl1->pcie_gen == pl2->pcie_gen) &&
+                 (pl1->pcie_lane == pl2->pcie_lane));
+}
+
+int polaris10_check_states_equal(struct pp_hwmgr *hwmgr, const struct pp_hw_power_state *pstate1, const struct pp_hw_power_state *pstate2, bool *equal)
+{
+       const struct polaris10_power_state *psa = cast_const_phw_polaris10_power_state(pstate1);
+       const struct polaris10_power_state *psb = cast_const_phw_polaris10_power_state(pstate2);
+       int i;
+
+       if (pstate1 == NULL || pstate2 == NULL || equal == NULL)
+               return -EINVAL;
+
+       /* If the two states don't even have the same number of performance levels they cannot be the same state. */
+       if (psa->performance_level_count != psb->performance_level_count) {
+               *equal = false;
+               return 0;
+       }
+
+       for (i = 0; i < psa->performance_level_count; i++) {
+               if (!polaris10_are_power_levels_equal(&(psa->performance_levels[i]), &(psb->performance_levels[i]))) {
+                       /* If we have found even one performance level pair that is different the states are different. */
+                       *equal = false;
+                       return 0;
+               }
+       }
+
+       /* If all performance levels are the same try to use the UVD clocks to break the tie.*/
+       *equal = ((psa->uvd_clks.vclk == psb->uvd_clks.vclk) && (psa->uvd_clks.dclk == psb->uvd_clks.dclk));
+       *equal &= ((psa->vce_clks.evclk == psb->vce_clks.evclk) && (psa->vce_clks.ecclk == psb->vce_clks.ecclk));
+       *equal &= (psa->sclk_threshold == psb->sclk_threshold);
+
+       return 0;
+}
+
+int polaris10_upload_mc_firmware(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       uint32_t vbios_version;
+
+       /*  Read MC indirect register offset 0x9F bits [3:0] to see if VBIOS has already loaded a full version of MC ucode or not.*/
+
+       phm_get_mc_microcode_version(hwmgr);
+       vbios_version = hwmgr->microcode_version_info.MC & 0xf;
+       /*  Full version of MC ucode has already been loaded. */
+       if (vbios_version == 0) {
+               data->need_long_memory_training = false;
+               return 0;
+       }
+
+       data->need_long_memory_training = true;
+
+/*
+ *     PPMCME_FirmwareDescriptorEntry *pfd = NULL;
+       pfd = &tonga_mcmeFirmware;
+       if (0 == PHM_READ_FIELD(hwmgr->device, MC_SEQ_SUP_CNTL, RUN))
+               polaris10_load_mc_microcode(hwmgr, pfd->dpmThreshold,
+                                       pfd->cfgArray, pfd->cfgSize, pfd->ioDebugArray,
+                                       pfd->ioDebugSize, pfd->ucodeArray, pfd->ucodeSize);
+*/
+       return 0;
+}
+
+/**
+ * Read clock related registers.
+ *
+ * @param    hwmgr  the address of the powerplay hardware manager.
+ * @return   always 0
+ */
+static int polaris10_read_clock_registers(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       data->clock_registers.vCG_SPLL_FUNC_CNTL = cgs_read_ind_register(hwmgr->device,
+                                               CGS_IND_REG__SMC, ixCG_SPLL_FUNC_CNTL)
+                                               & CG_SPLL_FUNC_CNTL__SPLL_BYPASS_EN_MASK;
+
+       data->clock_registers.vCG_SPLL_FUNC_CNTL_2 = cgs_read_ind_register(hwmgr->device,
+                                               CGS_IND_REG__SMC, ixCG_SPLL_FUNC_CNTL_2)
+                                               & CG_SPLL_FUNC_CNTL_2__SCLK_MUX_SEL_MASK;
+
+       data->clock_registers.vCG_SPLL_FUNC_CNTL_4 = cgs_read_ind_register(hwmgr->device,
+                                               CGS_IND_REG__SMC, ixCG_SPLL_FUNC_CNTL_4)
+                                               & CG_SPLL_FUNC_CNTL_4__SPLL_SPARE_MASK;
+
+       return 0;
+}
+
+/**
+ * Find out if memory is GDDR5.
+ *
+ * @param    hwmgr  the address of the powerplay hardware manager.
+ * @return   always 0
+ */
+static int polaris10_get_memory_type(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t temp;
+
+       temp = cgs_read_register(hwmgr->device, mmMC_SEQ_MISC0);
+
+       data->is_memory_gddr5 = (MC_SEQ_MISC0_GDDR5_VALUE ==
+                       ((temp & MC_SEQ_MISC0_GDDR5_MASK) >>
+                        MC_SEQ_MISC0_GDDR5_SHIFT));
+
+       return 0;
+}
+
+/**
+ * Enables Dynamic Power Management by SMC
+ *
+ * @param    hwmgr  the address of the powerplay hardware manager.
+ * @return   always 0
+ */
+static int polaris10_enable_acpi_power_management(struct pp_hwmgr *hwmgr)
+{
+       PHM_WRITE_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       GENERAL_PWRMGT, STATIC_PM_EN, 1);
+
+       return 0;
+}
+
+/**
+ * Initialize PowerGating States for different engines
+ *
+ * @param    hwmgr  the address of the powerplay hardware manager.
+ * @return   always 0
+ */
+static int polaris10_init_power_gate_state(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       data->uvd_power_gated = false;
+       data->vce_power_gated = false;
+       data->samu_power_gated = false;
+
+       return 0;
+}
+
+static int polaris10_init_sclk_threshold(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       data->low_sclk_interrupt_threshold = 0;
+
+       return 0;
+}
+
+int polaris10_setup_asic_task(struct pp_hwmgr *hwmgr)
+{
+       int tmp_result, result = 0;
+
+       polaris10_upload_mc_firmware(hwmgr);
+
+       tmp_result = polaris10_read_clock_registers(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to read clock registers!", result = tmp_result);
+
+       tmp_result = polaris10_get_memory_type(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to get memory type!", result = tmp_result);
+
+       tmp_result = polaris10_enable_acpi_power_management(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to enable ACPI power management!", result = tmp_result);
+
+       tmp_result = polaris10_init_power_gate_state(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to init power gate state!", result = tmp_result);
+
+       tmp_result = phm_get_mc_microcode_version(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to get MC microcode version!", result = tmp_result);
+
+       tmp_result = polaris10_init_sclk_threshold(hwmgr);
+       PP_ASSERT_WITH_CODE((0 == tmp_result),
+                       "Failed to init sclk threshold!", result = tmp_result);
+
+       return result;
+}
+
+static int polaris10_get_pp_table(struct pp_hwmgr *hwmgr, char **table)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+               memcpy(data->soft_pp_table, hwmgr->soft_pp_table,
+                               hwmgr->soft_pp_table_size);
+       }
+
+       *table = (char *)&data->soft_pp_table;
+
+       return hwmgr->soft_pp_table_size;
+}
+
+static int polaris10_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+       }
+
+       memcpy(data->soft_pp_table, buf, size);
+
+       hwmgr->soft_pp_table = data->soft_pp_table;
+
+       /* TODO: re-init powerplay to implement modified pptable */
+
+       return 0;
+}
+
+static int polaris10_force_clock_level(struct pp_hwmgr *hwmgr,
+               enum pp_clock_type type, uint32_t mask)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (hwmgr->dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL)
+               return -EINVAL;
+
+       switch (type) {
+       case PP_SCLK:
+               if (!data->sclk_dpm_key_disabled)
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_SCLKDPM_SetEnabledMask,
+                                       data->dpm_level_enable_mask.sclk_dpm_enable_mask & mask);
+               break;
+       case PP_MCLK:
+               if (!data->mclk_dpm_key_disabled)
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_MCLKDPM_SetEnabledMask,
+                                       data->dpm_level_enable_mask.mclk_dpm_enable_mask & mask);
+               break;
+       case PP_PCIE:
+       {
+               uint32_t tmp = mask & data->dpm_level_enable_mask.pcie_dpm_enable_mask;
+               uint32_t level = 0;
+
+               while (tmp >>= 1)
+                       level++;
+
+               if (!data->pcie_dpm_key_disabled)
+                       smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                                       PPSMC_MSG_PCIeDPM_ForceLevel,
+                                       level);
+               break;
+       }
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static uint16_t polaris10_get_current_pcie_speed(struct pp_hwmgr *hwmgr)
+{
+       uint32_t speedCntl = 0;
+
+       /* mmPCIE_PORT_INDEX rename as mmPCIE_INDEX */
+       speedCntl = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__PCIE,
+                       ixPCIE_LC_SPEED_CNTL);
+       return((uint16_t)PHM_GET_FIELD(speedCntl,
+                       PCIE_LC_SPEED_CNTL, LC_CURRENT_DATA_RATE));
+}
+
+static int polaris10_print_clock_levels(struct pp_hwmgr *hwmgr,
+               enum pp_clock_type type, char *buf)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct polaris10_single_dpm_table *sclk_table = &(data->dpm_table.sclk_table);
+       struct polaris10_single_dpm_table *mclk_table = &(data->dpm_table.mclk_table);
+       struct polaris10_single_dpm_table *pcie_table = &(data->dpm_table.pcie_speed_table);
+       int i, now, size = 0;
+       uint32_t clock, pcie_speed;
+
+       switch (type) {
+       case PP_SCLK:
+               smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency);
+               clock = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
+
+               for (i = 0; i < sclk_table->count; i++) {
+                       if (clock > sclk_table->dpm_levels[i].value)
+                               continue;
+                       break;
+               }
+               now = i;
+
+               for (i = 0; i < sclk_table->count; i++)
+                       size += sprintf(buf + size, "%d: %uMhz %s\n",
+                                       i, sclk_table->dpm_levels[i].value / 100,
+                                       (i == now) ? "*" : "");
+               break;
+       case PP_MCLK:
+               smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetMclkFrequency);
+               clock = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0);
+
+               for (i = 0; i < mclk_table->count; i++) {
+                       if (clock > mclk_table->dpm_levels[i].value)
+                               continue;
+                       break;
+               }
+               now = i;
+
+               for (i = 0; i < mclk_table->count; i++)
+                       size += sprintf(buf + size, "%d: %uMhz %s\n",
+                                       i, mclk_table->dpm_levels[i].value / 100,
+                                       (i == now) ? "*" : "");
+               break;
+       case PP_PCIE:
+               pcie_speed = polaris10_get_current_pcie_speed(hwmgr);
+               for (i = 0; i < pcie_table->count; i++) {
+                       if (pcie_speed != pcie_table->dpm_levels[i].value)
+                               continue;
+                       break;
+               }
+               now = i;
+
+               for (i = 0; i < pcie_table->count; i++)
+                       size += sprintf(buf + size, "%d: %s %s\n", i,
+                                       (pcie_table->dpm_levels[i].value == 0) ? "2.5GB, x8" :
+                                       (pcie_table->dpm_levels[i].value == 1) ? "5.0GB, x16" :
+                                       (pcie_table->dpm_levels[i].value == 2) ? "8.0GB, x16" : "",
+                                       (i == now) ? "*" : "");
+               break;
+       default:
+               break;
+       }
+       return size;
+}
+
+static int polaris10_set_fan_control_mode(struct pp_hwmgr *hwmgr, uint32_t mode)
+{
+       if (mode) {
+               /* stop auto-manage */
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_MicrocodeFanControl))
+                       polaris10_fan_ctrl_stop_smc_fan_control(hwmgr);
+               polaris10_fan_ctrl_set_static_mode(hwmgr, mode);
+       } else
+               /* restart auto-manage */
+               polaris10_fan_ctrl_reset_fan_speed_to_default(hwmgr);
+
+       return 0;
+}
+
+static int polaris10_get_fan_control_mode(struct pp_hwmgr *hwmgr)
+{
+       if (hwmgr->fan_ctrl_is_in_default_mode)
+               return hwmgr->fan_ctrl_default_mode;
+       else
+               return PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               CG_FDO_CTRL2, FDO_PWM_MODE);
+}
+
+static const struct pp_hwmgr_func polaris10_hwmgr_funcs = {
+       .backend_init = &polaris10_hwmgr_backend_init,
+       .backend_fini = &polaris10_hwmgr_backend_fini,
+       .asic_setup = &polaris10_setup_asic_task,
+       .dynamic_state_management_enable = &polaris10_enable_dpm_tasks,
+       .apply_state_adjust_rules = polaris10_apply_state_adjust_rules,
+       .force_dpm_level = &polaris10_force_dpm_level,
+       .power_state_set = polaris10_set_power_state_tasks,
+       .get_power_state_size = polaris10_get_power_state_size,
+       .get_mclk = polaris10_dpm_get_mclk,
+       .get_sclk = polaris10_dpm_get_sclk,
+       .patch_boot_state = polaris10_dpm_patch_boot_state,
+       .get_pp_table_entry = polaris10_get_pp_table_entry,
+       .get_num_of_pp_table_entries = tonga_get_number_of_powerplay_table_entries,
+       .print_current_perforce_level = polaris10_print_current_perforce_level,
+       .powerdown_uvd = polaris10_phm_powerdown_uvd,
+       .powergate_uvd = polaris10_phm_powergate_uvd,
+       .powergate_vce = polaris10_phm_powergate_vce,
+       .disable_clock_power_gating = polaris10_phm_disable_clock_power_gating,
+       .update_clock_gatings = polaris10_phm_update_clock_gatings,
+       .notify_smc_display_config_after_ps_adjustment = polaris10_notify_smc_display_config_after_ps_adjustment,
+       .display_config_changed = polaris10_display_configuration_changed_task,
+       .set_max_fan_pwm_output = polaris10_set_max_fan_pwm_output,
+       .set_max_fan_rpm_output = polaris10_set_max_fan_rpm_output,
+       .get_temperature = polaris10_thermal_get_temperature,
+       .stop_thermal_controller = polaris10_thermal_stop_thermal_controller,
+       .get_fan_speed_info = polaris10_fan_ctrl_get_fan_speed_info,
+       .get_fan_speed_percent = polaris10_fan_ctrl_get_fan_speed_percent,
+       .set_fan_speed_percent = polaris10_fan_ctrl_set_fan_speed_percent,
+       .reset_fan_speed_to_default = polaris10_fan_ctrl_reset_fan_speed_to_default,
+       .get_fan_speed_rpm = polaris10_fan_ctrl_get_fan_speed_rpm,
+       .set_fan_speed_rpm = polaris10_fan_ctrl_set_fan_speed_rpm,
+       .uninitialize_thermal_controller = polaris10_thermal_ctrl_uninitialize_thermal_controller,
+       .register_internal_thermal_interrupt = polaris10_register_internal_thermal_interrupt,
+       .check_smc_update_required_for_display_configuration = polaris10_check_smc_update_required_for_display_configuration,
+       .check_states_equal = polaris10_check_states_equal,
+       .set_fan_control_mode = polaris10_set_fan_control_mode,
+       .get_fan_control_mode = polaris10_get_fan_control_mode,
+       .get_pp_table = polaris10_get_pp_table,
+       .set_pp_table = polaris10_set_pp_table,
+       .force_clock_level = polaris10_force_clock_level,
+       .print_clock_levels = polaris10_print_clock_levels,
+       .enable_per_cu_power_gating = polaris10_phm_enable_per_cu_power_gating,
+};
+
+int polaris10_hwmgr_init(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr  *data;
+
+       data = kzalloc (sizeof(struct polaris10_hwmgr), GFP_KERNEL);
+       if (data == NULL)
+               return -ENOMEM;
+
+       hwmgr->backend = data;
+       hwmgr->hwmgr_func = &polaris10_hwmgr_funcs;
+       hwmgr->pptable_func = &tonga_pptable_funcs;
+       pp_polaris10_thermal_initialize(hwmgr);
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_hwmgr.h
new file mode 100644 (file)
index 0000000..beedf35
--- /dev/null
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef POLARIS10_HWMGR_H
+#define POLARIS10_HWMGR_H
+
+#include "hwmgr.h"
+#include "smu74.h"
+#include "smu74_discrete.h"
+#include "ppatomctrl.h"
+#include "polaris10_ppsmc.h"
+#include "polaris10_powertune.h"
+
+#define POLARIS10_MAX_HARDWARE_POWERLEVELS     2
+
+#define POLARIS10_VOLTAGE_CONTROL_NONE                   0x0
+#define POLARIS10_VOLTAGE_CONTROL_BY_GPIO                0x1
+#define POLARIS10_VOLTAGE_CONTROL_BY_SVID2               0x2
+#define POLARIS10_VOLTAGE_CONTROL_MERGED                 0x3
+
+#define DPMTABLE_OD_UPDATE_SCLK     0x00000001
+#define DPMTABLE_OD_UPDATE_MCLK     0x00000002
+#define DPMTABLE_UPDATE_SCLK        0x00000004
+#define DPMTABLE_UPDATE_MCLK        0x00000008
+
+struct polaris10_performance_level {
+       uint32_t  memory_clock;
+       uint32_t  engine_clock;
+       uint16_t  pcie_gen;
+       uint16_t  pcie_lane;
+};
+
+struct polaris10_uvd_clocks {
+       uint32_t  vclk;
+       uint32_t  dclk;
+};
+
+struct polaris10_vce_clocks {
+       uint32_t  evclk;
+       uint32_t  ecclk;
+};
+
+struct polaris10_power_state {
+       uint32_t                  magic;
+       struct polaris10_uvd_clocks    uvd_clks;
+       struct polaris10_vce_clocks    vce_clks;
+       uint32_t                  sam_clk;
+       uint16_t                  performance_level_count;
+       bool                      dc_compatible;
+       uint32_t                  sclk_threshold;
+       struct polaris10_performance_level  performance_levels[POLARIS10_MAX_HARDWARE_POWERLEVELS];
+};
+
+struct polaris10_dpm_level {
+       bool    enabled;
+       uint32_t        value;
+       uint32_t        param1;
+};
+
+#define POLARIS10_MAX_DEEPSLEEP_DIVIDER_ID 5
+#define MAX_REGULAR_DPM_NUMBER 8
+#define POLARIS10_MINIMUM_ENGINE_CLOCK 2500
+
+struct polaris10_single_dpm_table {
+       uint32_t                count;
+       struct polaris10_dpm_level      dpm_levels[MAX_REGULAR_DPM_NUMBER];
+};
+
+struct polaris10_dpm_table {
+       struct polaris10_single_dpm_table  sclk_table;
+       struct polaris10_single_dpm_table  mclk_table;
+       struct polaris10_single_dpm_table  pcie_speed_table;
+       struct polaris10_single_dpm_table  vddc_table;
+       struct polaris10_single_dpm_table  vddci_table;
+       struct polaris10_single_dpm_table  mvdd_table;
+};
+
+struct polaris10_clock_registers {
+       uint32_t  vCG_SPLL_FUNC_CNTL;
+       uint32_t  vCG_SPLL_FUNC_CNTL_2;
+       uint32_t  vCG_SPLL_FUNC_CNTL_3;
+       uint32_t  vCG_SPLL_FUNC_CNTL_4;
+       uint32_t  vCG_SPLL_SPREAD_SPECTRUM;
+       uint32_t  vCG_SPLL_SPREAD_SPECTRUM_2;
+       uint32_t  vDLL_CNTL;
+       uint32_t  vMCLK_PWRMGT_CNTL;
+       uint32_t  vMPLL_AD_FUNC_CNTL;
+       uint32_t  vMPLL_DQ_FUNC_CNTL;
+       uint32_t  vMPLL_FUNC_CNTL;
+       uint32_t  vMPLL_FUNC_CNTL_1;
+       uint32_t  vMPLL_FUNC_CNTL_2;
+       uint32_t  vMPLL_SS1;
+       uint32_t  vMPLL_SS2;
+};
+
+#define DISABLE_MC_LOADMICROCODE   1
+#define DISABLE_MC_CFGPROGRAMMING  2
+
+struct polaris10_voltage_smio_registers {
+       uint32_t vS0_VID_LOWER_SMIO_CNTL;
+};
+
+#define POLARIS10_MAX_LEAKAGE_COUNT  8
+
+struct polaris10_leakage_voltage {
+       uint16_t  count;
+       uint16_t  leakage_id[POLARIS10_MAX_LEAKAGE_COUNT];
+       uint16_t  actual_voltage[POLARIS10_MAX_LEAKAGE_COUNT];
+};
+
+struct polaris10_vbios_boot_state {
+       uint16_t    mvdd_bootup_value;
+       uint16_t    vddc_bootup_value;
+       uint16_t    vddci_bootup_value;
+       uint32_t    sclk_bootup_value;
+       uint32_t    mclk_bootup_value;
+       uint16_t    pcie_gen_bootup_value;
+       uint16_t    pcie_lane_bootup_value;
+};
+
+/* Ultra Low Voltage parameter structure */
+struct polaris10_ulv_parm {
+       bool                           ulv_supported;
+       uint32_t                       cg_ulv_parameter;
+       uint32_t                       ulv_volt_change_delay;
+       struct polaris10_performance_level  ulv_power_level;
+};
+
+struct polaris10_display_timing {
+       uint32_t  min_clock_in_sr;
+       uint32_t  num_existing_displays;
+};
+
+struct polaris10_dpmlevel_enable_mask {
+       uint32_t  uvd_dpm_enable_mask;
+       uint32_t  vce_dpm_enable_mask;
+       uint32_t  acp_dpm_enable_mask;
+       uint32_t  samu_dpm_enable_mask;
+       uint32_t  sclk_dpm_enable_mask;
+       uint32_t  mclk_dpm_enable_mask;
+       uint32_t  pcie_dpm_enable_mask;
+};
+
+struct polaris10_pcie_perf_range {
+       uint16_t  max;
+       uint16_t  min;
+};
+struct polaris10_range_table {
+       uint32_t trans_lower_frequency; /* in 10khz */
+       uint32_t trans_upper_frequency;
+};
+
+struct polaris10_hwmgr {
+       struct polaris10_dpm_table                      dpm_table;
+       struct polaris10_dpm_table                      golden_dpm_table;
+       SMU74_Discrete_DpmTable                         smc_state_table;
+       struct SMU74_Discrete_Ulv            ulv_setting;
+
+       struct polaris10_range_table                range_table[NUM_SCLK_RANGE];
+       uint32_t                                                voting_rights_clients0;
+       uint32_t                                                voting_rights_clients1;
+       uint32_t                                                voting_rights_clients2;
+       uint32_t                                                voting_rights_clients3;
+       uint32_t                                                voting_rights_clients4;
+       uint32_t                                                voting_rights_clients5;
+       uint32_t                                                voting_rights_clients6;
+       uint32_t                                                voting_rights_clients7;
+       uint32_t                                                static_screen_threshold_unit;
+       uint32_t                                                static_screen_threshold;
+       uint32_t                                                voltage_control;
+       uint32_t                                                vddc_vddci_delta;
+
+       uint32_t                                                active_auto_throttle_sources;
+
+       struct polaris10_clock_registers            clock_registers;
+       struct polaris10_voltage_smio_registers      voltage_smio_registers;
+
+       bool                           is_memory_gddr5;
+       uint16_t                       acpi_vddc;
+       bool                           pspp_notify_required;
+       uint16_t                       force_pcie_gen;
+       uint16_t                       acpi_pcie_gen;
+       uint32_t                       pcie_gen_cap;
+       uint32_t                       pcie_lane_cap;
+       uint32_t                       pcie_spc_cap;
+       struct polaris10_leakage_voltage          vddc_leakage;
+       struct polaris10_leakage_voltage          Vddci_leakage;
+
+       uint32_t                             mvdd_control;
+       uint32_t                             vddc_mask_low;
+       uint32_t                             mvdd_mask_low;
+       uint16_t                            max_vddc_in_pptable;
+       uint16_t                            min_vddc_in_pptable;
+       uint16_t                            max_vddci_in_pptable;
+       uint16_t                            min_vddci_in_pptable;
+       uint32_t                             mclk_strobe_mode_threshold;
+       uint32_t                             mclk_stutter_mode_threshold;
+       uint32_t                             mclk_edc_enable_threshold;
+       uint32_t                             mclk_edcwr_enable_threshold;
+       bool                                is_uvd_enabled;
+       struct polaris10_vbios_boot_state        vbios_boot_state;
+
+       bool                           pcie_performance_request;
+       bool                           battery_state;
+       bool                           is_tlu_enabled;
+
+       /* ---- SMC SRAM Address of firmware header tables ---- */
+       uint32_t                             sram_end;
+       uint32_t                             dpm_table_start;
+       uint32_t                             soft_regs_start;
+       uint32_t                             mc_reg_table_start;
+       uint32_t                             fan_table_start;
+       uint32_t                             arb_table_start;
+
+       /* ---- Stuff originally coming from Evergreen ---- */
+       uint32_t                             vddci_control;
+       struct pp_atomctrl_voltage_table     vddc_voltage_table;
+       struct pp_atomctrl_voltage_table     vddci_voltage_table;
+       struct pp_atomctrl_voltage_table     mvdd_voltage_table;
+
+       uint32_t                             mgcg_cgtt_local2;
+       uint32_t                             mgcg_cgtt_local3;
+       uint32_t                             gpio_debug;
+       uint32_t                             mc_micro_code_feature;
+       uint32_t                             highest_mclk;
+       uint16_t                             acpi_vddci;
+       uint8_t                              mvdd_high_index;
+       uint8_t                              mvdd_low_index;
+       bool                                 dll_default_on;
+       bool                                 performance_request_registered;
+
+       /* ---- Low Power Features ---- */
+       struct polaris10_ulv_parm                 ulv;
+
+       /* ---- CAC Stuff ---- */
+       uint32_t                       cac_table_start;
+       bool                           cac_configuration_required;
+       bool                           driver_calculate_cac_leakage;
+       bool                           cac_enabled;
+
+       /* ---- DPM2 Parameters ---- */
+       uint32_t                       power_containment_features;
+       bool                           enable_dte_feature;
+       bool                           enable_tdc_limit_feature;
+       bool                           enable_pkg_pwr_tracking_feature;
+       bool                           disable_uvd_power_tune_feature;
+       const struct polaris10_pt_defaults       *power_tune_defaults;
+       struct SMU74_Discrete_PmFuses  power_tune_table;
+       uint32_t                       dte_tj_offset;
+       uint32_t                       fast_watermark_threshold;
+
+       /* ---- Phase Shedding ---- */
+       bool                           vddc_phase_shed_control;
+
+       /* ---- DI/DT ---- */
+       struct polaris10_display_timing        display_timing;
+       uint32_t                      bif_sclk_table[SMU74_MAX_LEVELS_LINK];
+
+       /* ---- Thermal Temperature Setting ---- */
+       struct polaris10_dpmlevel_enable_mask     dpm_level_enable_mask;
+       uint32_t                                  need_update_smu7_dpm_table;
+       uint32_t                                  sclk_dpm_key_disabled;
+       uint32_t                                  mclk_dpm_key_disabled;
+       uint32_t                                  pcie_dpm_key_disabled;
+       uint32_t                                  min_engine_clocks;
+       struct polaris10_pcie_perf_range          pcie_gen_performance;
+       struct polaris10_pcie_perf_range          pcie_lane_performance;
+       struct polaris10_pcie_perf_range          pcie_gen_power_saving;
+       struct polaris10_pcie_perf_range          pcie_lane_power_saving;
+       bool                                      use_pcie_performance_levels;
+       bool                                      use_pcie_power_saving_levels;
+       uint32_t                                  activity_target[SMU74_MAX_LEVELS_GRAPHICS];
+       uint32_t                                  mclk_activity_target;
+       uint32_t                                  mclk_dpm0_activity_target;
+       uint32_t                                  low_sclk_interrupt_threshold;
+       uint32_t                                  last_mclk_dpm_enable_mask;
+       bool                                      uvd_enabled;
+
+       /* ---- Power Gating States ---- */
+       bool                           uvd_power_gated;
+       bool                           vce_power_gated;
+       bool                           samu_power_gated;
+       bool                           need_long_memory_training;
+
+       /* Application power optimization parameters */
+       bool                               update_up_hyst;
+       bool                               update_down_hyst;
+       uint32_t                           down_hyst;
+       uint32_t                           up_hyst;
+       uint32_t disable_dpm_mask;
+       bool apply_optimized_settings;
+
+       /* soft pptable for re-uploading into smu */
+       void *soft_pp_table;
+};
+
+/* To convert to Q8.8 format for firmware */
+#define POLARIS10_Q88_FORMAT_CONVERSION_UNIT             256
+
+enum Polaris10_I2CLineID {
+       Polaris10_I2CLineID_DDC1 = 0x90,
+       Polaris10_I2CLineID_DDC2 = 0x91,
+       Polaris10_I2CLineID_DDC3 = 0x92,
+       Polaris10_I2CLineID_DDC4 = 0x93,
+       Polaris10_I2CLineID_DDC5 = 0x94,
+       Polaris10_I2CLineID_DDC6 = 0x95,
+       Polaris10_I2CLineID_SCLSDA = 0x96,
+       Polaris10_I2CLineID_DDCVGA = 0x97
+};
+
+#define POLARIS10_I2C_DDC1DATA          0
+#define POLARIS10_I2C_DDC1CLK           1
+#define POLARIS10_I2C_DDC2DATA          2
+#define POLARIS10_I2C_DDC2CLK           3
+#define POLARIS10_I2C_DDC3DATA          4
+#define POLARIS10_I2C_DDC3CLK           5
+#define POLARIS10_I2C_SDA               40
+#define POLARIS10_I2C_SCL               41
+#define POLARIS10_I2C_DDC4DATA          65
+#define POLARIS10_I2C_DDC4CLK           66
+#define POLARIS10_I2C_DDC5DATA          0x48
+#define POLARIS10_I2C_DDC5CLK           0x49
+#define POLARIS10_I2C_DDC6DATA          0x4a
+#define POLARIS10_I2C_DDC6CLK           0x4b
+#define POLARIS10_I2C_DDCVGADATA        0x4c
+#define POLARIS10_I2C_DDCVGACLK         0x4d
+
+#define POLARIS10_UNUSED_GPIO_PIN       0x7F
+
+int polaris10_hwmgr_init(struct pp_hwmgr *hwmgr);
+
+int polaris10_update_uvd_dpm(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_update_samu_dpm(struct pp_hwmgr *hwmgr, bool bgate);
+int polaris10_enable_disable_vce_dpm(struct pp_hwmgr *hwmgr, bool enable);
+
+#endif
+
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.c
new file mode 100644 (file)
index 0000000..0b99ab3
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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 "hwmgr.h"
+#include "smumgr.h"
+#include "polaris10_hwmgr.h"
+#include "polaris10_powertune.h"
+#include "polaris10_smumgr.h"
+#include "smu74_discrete.h"
+#include "pp_debug.h"
+
+#define VOLTAGE_SCALE  4
+#define POWERTUNE_DEFAULT_SET_MAX    1
+
+static const struct polaris10_pt_defaults polaris10_power_tune_data_set_array[POWERTUNE_DEFAULT_SET_MAX] = {
+       /* sviLoadLIneEn, SviLoadLineVddC, TDC_VDDC_ThrottleReleaseLimitPerc, TDC_MAWt,
+        * TdcWaterfallCtl, DTEAmbientTempBase, DisplayCac, BAPM_TEMP_GRADIENT */
+       { 1, 0xF, 0xFD, 0x19, 5, 45, 0, 0xB0000,
+       { 0x79, 0x253, 0x25D, 0xAE, 0x72, 0x80, 0x83, 0x86, 0x6F, 0xC8, 0xC9, 0xC9, 0x2F, 0x4D, 0x61},
+       { 0x17C, 0x172, 0x180, 0x1BC, 0x1B3, 0x1BD, 0x206, 0x200, 0x203, 0x25D, 0x25A, 0x255, 0x2C3, 0x2C5, 0x2B4 } },
+};
+
+void polaris10_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *polaris10_hwmgr = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct  phm_ppt_v1_information *table_info =
+                       (struct  phm_ppt_v1_information *)(hwmgr->pptable);
+
+       if (table_info &&
+                       table_info->cac_dtp_table->usPowerTuneDataSetID <= POWERTUNE_DEFAULT_SET_MAX &&
+                       table_info->cac_dtp_table->usPowerTuneDataSetID)
+               polaris10_hwmgr->power_tune_defaults =
+                               &polaris10_power_tune_data_set_array
+                               [table_info->cac_dtp_table->usPowerTuneDataSetID - 1];
+       else
+               polaris10_hwmgr->power_tune_defaults = &polaris10_power_tune_data_set_array[0];
+
+}
+
+static uint16_t scale_fan_gain_settings(uint16_t raw_setting)
+{
+       uint32_t tmp;
+       tmp = raw_setting * 4096 / 100;
+       return (uint16_t)tmp;
+}
+
+int polaris10_populate_bapm_parameters_in_dpm_table(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_pt_defaults *defaults = data->power_tune_defaults;
+       SMU74_Discrete_DpmTable  *dpm_table = &(data->smc_state_table);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_cac_tdp_table *cac_dtp_table = table_info->cac_dtp_table;
+       struct pp_advance_fan_control_parameters *fan_table=
+                       &hwmgr->thermal_controller.advanceFanControlParameters;
+       int i, j, k;
+       const uint16_t *pdef1;
+       const uint16_t *pdef2;
+
+       dpm_table->DefaultTdp = PP_HOST_TO_SMC_US((uint16_t)(cac_dtp_table->usTDP * 128));
+       dpm_table->TargetTdp  = PP_HOST_TO_SMC_US((uint16_t)(cac_dtp_table->usTDP * 128));
+
+       PP_ASSERT_WITH_CODE(cac_dtp_table->usTargetOperatingTemp <= 255,
+                               "Target Operating Temp is out of Range!",
+                               );
+
+       dpm_table->TemperatureLimitEdge = PP_HOST_TO_SMC_US(
+                       cac_dtp_table->usTargetOperatingTemp * 256);
+       dpm_table->TemperatureLimitHotspot = PP_HOST_TO_SMC_US(
+                       cac_dtp_table->usTemperatureLimitHotspot * 256);
+       dpm_table->FanGainEdge = PP_HOST_TO_SMC_US(
+                       scale_fan_gain_settings(fan_table->usFanGainEdge));
+       dpm_table->FanGainHotspot = PP_HOST_TO_SMC_US(
+                       scale_fan_gain_settings(fan_table->usFanGainHotspot));
+
+       pdef1 = defaults->BAPMTI_R;
+       pdef2 = defaults->BAPMTI_RC;
+
+       for (i = 0; i < SMU74_DTE_ITERATIONS; i++) {
+               for (j = 0; j < SMU74_DTE_SOURCES; j++) {
+                       for (k = 0; k < SMU74_DTE_SINKS; k++) {
+                               dpm_table->BAPMTI_R[i][j][k] = PP_HOST_TO_SMC_US(*pdef1);
+                               dpm_table->BAPMTI_RC[i][j][k] = PP_HOST_TO_SMC_US(*pdef2);
+                               pdef1++;
+                               pdef2++;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int polaris10_populate_svi_load_line(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_pt_defaults *defaults = data->power_tune_defaults;
+
+       data->power_tune_table.SviLoadLineEn = defaults->SviLoadLineEn;
+       data->power_tune_table.SviLoadLineVddC = defaults->SviLoadLineVddC;
+       data->power_tune_table.SviLoadLineTrimVddC = 3;
+       data->power_tune_table.SviLoadLineOffsetVddC = 0;
+
+       return 0;
+}
+
+static int polaris10_populate_tdc_limit(struct pp_hwmgr *hwmgr)
+{
+       uint16_t tdc_limit;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       const struct polaris10_pt_defaults *defaults = data->power_tune_defaults;
+
+       tdc_limit = (uint16_t)(table_info->cac_dtp_table->usTDC * 128);
+       data->power_tune_table.TDC_VDDC_PkgLimit =
+                       CONVERT_FROM_HOST_TO_SMC_US(tdc_limit);
+       data->power_tune_table.TDC_VDDC_ThrottleReleaseLimitPerc =
+                       defaults->TDC_VDDC_ThrottleReleaseLimitPerc;
+       data->power_tune_table.TDC_MAWt = defaults->TDC_MAWt;
+
+       return 0;
+}
+
+static int polaris10_populate_dw8(struct pp_hwmgr *hwmgr, uint32_t fuse_table_offset)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       const struct polaris10_pt_defaults *defaults = data->power_tune_defaults;
+       uint32_t temp;
+
+       if (polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                       fuse_table_offset +
+                       offsetof(SMU74_Discrete_PmFuses, TdcWaterfallCtl),
+                       (uint32_t *)&temp, data->sram_end))
+               PP_ASSERT_WITH_CODE(false,
+                               "Attempt to read PmFuses.DW6 (SviLoadLineEn) from SMC Failed!",
+                               return -EINVAL);
+       else {
+               data->power_tune_table.TdcWaterfallCtl = defaults->TdcWaterfallCtl;
+               data->power_tune_table.LPMLTemperatureMin =
+                               (uint8_t)((temp >> 16) & 0xff);
+               data->power_tune_table.LPMLTemperatureMax =
+                               (uint8_t)((temp >> 8) & 0xff);
+               data->power_tune_table.Reserved = (uint8_t)(temp & 0xff);
+       }
+       return 0;
+}
+
+static int polaris10_populate_temperature_scaler(struct pp_hwmgr *hwmgr)
+{
+       int i;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /* Currently not used. Set all to zero. */
+       for (i = 0; i < 16; i++)
+               data->power_tune_table.LPMLTemperatureScaler[i] = 0;
+
+       return 0;
+}
+
+static int polaris10_populate_fuzzy_fan(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if ((hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity & (1 << 15))
+               || 0 == hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity)
+               hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity =
+                       hwmgr->thermal_controller.advanceFanControlParameters.usDefaultFanOutputSensitivity;
+
+       data->power_tune_table.FuzzyFan_PwmSetDelta = PP_HOST_TO_SMC_US(
+                               hwmgr->thermal_controller.advanceFanControlParameters.usFanOutputSensitivity);
+       return 0;
+}
+
+static int polaris10_populate_gnb_lpml(struct pp_hwmgr *hwmgr)
+{
+       int i;
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       /* Currently not used. Set all to zero. */
+       for (i = 0; i < 16; i++)
+               data->power_tune_table.GnbLPML[i] = 0;
+
+       return 0;
+}
+
+static int polaris10_min_max_vgnb_lpml_id_from_bapm_vddc(struct pp_hwmgr *hwmgr)
+{
+       return 0;
+}
+
+static int polaris10_populate_bapm_vddc_base_leakage_sidd(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       uint16_t hi_sidd = data->power_tune_table.BapmVddCBaseLeakageHiSidd;
+       uint16_t lo_sidd = data->power_tune_table.BapmVddCBaseLeakageLoSidd;
+       struct phm_cac_tdp_table *cac_table = table_info->cac_dtp_table;
+
+       hi_sidd = (uint16_t)(cac_table->usHighCACLeakage / 100 * 256);
+       lo_sidd = (uint16_t)(cac_table->usLowCACLeakage / 100 * 256);
+
+       data->power_tune_table.BapmVddCBaseLeakageHiSidd =
+                       CONVERT_FROM_HOST_TO_SMC_US(hi_sidd);
+       data->power_tune_table.BapmVddCBaseLeakageLoSidd =
+                       CONVERT_FROM_HOST_TO_SMC_US(lo_sidd);
+
+       return 0;
+}
+
+int polaris10_populate_pm_fuses(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       uint32_t pm_fuse_table_offset;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_PowerContainment)) {
+               if (polaris10_read_smc_sram_dword(hwmgr->smumgr,
+                               SMU7_FIRMWARE_HEADER_LOCATION +
+                               offsetof(SMU74_Firmware_Header, PmFuseTable),
+                               &pm_fuse_table_offset, data->sram_end))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to get pm_fuse_table_offset Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_populate_svi_load_line(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate SviLoadLine Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_populate_tdc_limit(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate TDCLimit Failed!", return -EINVAL);
+
+               if (polaris10_populate_dw8(hwmgr, pm_fuse_table_offset))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate TdcWaterfallCtl, "
+                                       "LPMLTemperature Min and Max Failed!",
+                                       return -EINVAL);
+
+               if (0 != polaris10_populate_temperature_scaler(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate LPMLTemperatureScaler Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_populate_fuzzy_fan(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate Fuzzy Fan Control parameters Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_populate_gnb_lpml(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate GnbLPML Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_min_max_vgnb_lpml_id_from_bapm_vddc(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate GnbLPML Min and Max Vid Failed!",
+                                       return -EINVAL);
+
+               if (polaris10_populate_bapm_vddc_base_leakage_sidd(hwmgr))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to populate BapmVddCBaseLeakage Hi and Lo "
+                                       "Sidd Failed!", return -EINVAL);
+
+               if (polaris10_copy_bytes_to_smc(hwmgr->smumgr, pm_fuse_table_offset,
+                               (uint8_t *)&data->power_tune_table,
+                               sizeof(struct SMU74_Discrete_PmFuses), data->sram_end))
+                       PP_ASSERT_WITH_CODE(false,
+                                       "Attempt to download PmFuseTable Failed!",
+                                       return -EINVAL);
+       }
+       return 0;
+}
+
+int polaris10_enable_smc_cac(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       int result = 0;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_CAC)) {
+               int smc_result;
+               smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
+                               (uint16_t)(PPSMC_MSG_EnableCac));
+               PP_ASSERT_WITH_CODE((0 == smc_result),
+                               "Failed to enable CAC in SMC.", result = -1);
+
+               data->cac_enabled = (0 == smc_result) ? true : false;
+       }
+       return result;
+}
+
+int polaris10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+
+       if (data->power_containment_features &
+                       POWERCONTAINMENT_FEATURE_PkgPwrLimit)
+               return smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_PkgPwrSetLimit, n);
+       return 0;
+}
+
+static int polaris10_set_overdriver_target_tdp(struct pp_hwmgr *pHwMgr, uint32_t target_tdp)
+{
+       return smum_send_msg_to_smc_with_parameter(pHwMgr->smumgr,
+                       PPSMC_MSG_OverDriveSetTargetTdp, target_tdp);
+}
+
+int polaris10_enable_power_containment(struct pp_hwmgr *hwmgr)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       int smc_result;
+       int result = 0;
+
+       data->power_containment_features = 0;
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_PowerContainment)) {
+
+               if (data->enable_tdc_limit_feature) {
+                       smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
+                                       (uint16_t)(PPSMC_MSG_TDCLimitEnable));
+                       PP_ASSERT_WITH_CODE((0 == smc_result),
+                                       "Failed to enable TDCLimit in SMC.", result = -1;);
+                       if (0 == smc_result)
+                               data->power_containment_features |=
+                                               POWERCONTAINMENT_FEATURE_TDCLimit;
+               }
+
+               if (data->enable_pkg_pwr_tracking_feature) {
+                       smc_result = smum_send_msg_to_smc(hwmgr->smumgr,
+                                       (uint16_t)(PPSMC_MSG_PkgPwrLimitEnable));
+                       PP_ASSERT_WITH_CODE((0 == smc_result),
+                                       "Failed to enable PkgPwrTracking in SMC.", result = -1;);
+                       if (0 == smc_result) {
+                               struct phm_cac_tdp_table *cac_table =
+                                               table_info->cac_dtp_table;
+                               uint32_t default_limit =
+                                       (uint32_t)(cac_table->usMaximumPowerDeliveryLimit * 256);
+
+                               data->power_containment_features |=
+                                               POWERCONTAINMENT_FEATURE_PkgPwrLimit;
+
+                               if (polaris10_set_power_limit(hwmgr, default_limit))
+                                       printk(KERN_ERR "Failed to set Default Power Limit in SMC!");
+                       }
+               }
+       }
+       return result;
+}
+
+int polaris10_power_control_set_level(struct pp_hwmgr *hwmgr)
+{
+       struct phm_ppt_v1_information *table_info =
+                       (struct phm_ppt_v1_information *)(hwmgr->pptable);
+       struct phm_cac_tdp_table *cac_table = table_info->cac_dtp_table;
+       int adjust_percent, target_tdp;
+       int result = 0;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_PowerContainment)) {
+               /* adjustment percentage has already been validated */
+               adjust_percent = hwmgr->platform_descriptor.TDPAdjustmentPolarity ?
+                               hwmgr->platform_descriptor.TDPAdjustment :
+                               (-1 * hwmgr->platform_descriptor.TDPAdjustment);
+               /* SMC requested that target_tdp to be 7 bit fraction in DPM table
+                * but message to be 8 bit fraction for messages
+                */
+               target_tdp = ((100 + adjust_percent) * (int)(cac_table->usTDP * 256)) / 100;
+               result = polaris10_set_overdriver_target_tdp(hwmgr, (uint32_t)target_tdp);
+       }
+
+       return result;
+}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_powertune.h
new file mode 100644 (file)
index 0000000..68bc1cb
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+#ifndef POLARIS10_POWERTUNE_H
+#define POLARIS10_POWERTUNE_H
+
+enum polaris10_pt_config_reg_type {
+       POLARIS10_CONFIGREG_MMR = 0,
+       POLARIS10_CONFIGREG_SMC_IND,
+       POLARIS10_CONFIGREG_DIDT_IND,
+       POLARIS10_CONFIGREG_CACHE,
+       POLARIS10_CONFIGREG_MAX
+};
+
+/* PowerContainment Features */
+#define POWERCONTAINMENT_FEATURE_DTE             0x00000001
+#define POWERCONTAINMENT_FEATURE_TDCLimit        0x00000002
+#define POWERCONTAINMENT_FEATURE_PkgPwrLimit     0x00000004
+
+struct polaris10_pt_config_reg {
+       uint32_t                           offset;
+       uint32_t                           mask;
+       uint32_t                           shift;
+       uint32_t                           value;
+       enum polaris10_pt_config_reg_type       type;
+};
+
+struct polaris10_pt_defaults {
+       uint8_t   SviLoadLineEn;
+       uint8_t   SviLoadLineVddC;
+       uint8_t   TDC_VDDC_ThrottleReleaseLimitPerc;
+       uint8_t   TDC_MAWt;
+       uint8_t   TdcWaterfallCtl;
+       uint8_t   DTEAmbientTempBase;
+
+       uint32_t  DisplayCac;
+       uint32_t  BAPM_TEMP_GRADIENT;
+       uint16_t  BAPMTI_R[SMU74_DTE_ITERATIONS * SMU74_DTE_SOURCES * SMU74_DTE_SINKS];
+       uint16_t  BAPMTI_RC[SMU74_DTE_ITERATIONS * SMU74_DTE_SOURCES * SMU74_DTE_SINKS];
+};
+
+void polaris10_initialize_power_tune_defaults(struct pp_hwmgr *hwmgr);
+int polaris10_populate_bapm_parameters_in_dpm_table(struct pp_hwmgr *hwmgr);
+int polaris10_populate_pm_fuses(struct pp_hwmgr *hwmgr);
+int polaris10_enable_smc_cac(struct pp_hwmgr *hwmgr);
+int polaris10_enable_power_containment(struct pp_hwmgr *hwmgr);
+int polaris10_set_power_limit(struct pp_hwmgr *hwmgr, uint32_t n);
+int polaris10_power_control_set_level(struct pp_hwmgr *hwmgr);
+
+#endif  /* POLARIS10_POWERTUNE_H */
+
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.c
new file mode 100644 (file)
index 0000000..aba167f
--- /dev/null
@@ -0,0 +1,712 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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 <asm/div64.h>
+#include "polaris10_thermal.h"
+#include "polaris10_hwmgr.h"
+#include "polaris10_smumgr.h"
+#include "polaris10_ppsmc.h"
+#include "smu/smu_7_1_3_d.h"
+#include "smu/smu_7_1_3_sh_mask.h"
+
+int polaris10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr,
+               struct phm_fan_speed_info *fan_speed_info)
+{
+       if (hwmgr->thermal_controller.fanInfo.bNoFan)
+               return 0;
+
+       fan_speed_info->supports_percent_read = true;
+       fan_speed_info->supports_percent_write = true;
+       fan_speed_info->min_percent = 0;
+       fan_speed_info->max_percent = 100;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_FanSpeedInTableIsRPM) &&
+               hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution) {
+               fan_speed_info->supports_rpm_read = true;
+               fan_speed_info->supports_rpm_write = true;
+               fan_speed_info->min_rpm = hwmgr->thermal_controller.fanInfo.ulMinRPM;
+               fan_speed_info->max_rpm = hwmgr->thermal_controller.fanInfo.ulMaxRPM;
+       } else {
+               fan_speed_info->min_rpm = 0;
+               fan_speed_info->max_rpm = 0;
+       }
+
+       return 0;
+}
+
+int polaris10_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
+               uint32_t *speed)
+{
+       uint32_t duty100;
+       uint32_t duty;
+       uint64_t tmp64;
+
+       if (hwmgr->thermal_controller.fanInfo.bNoFan)
+               return 0;
+
+       duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL1, FMAX_DUTY100);
+       duty = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_STATUS, FDO_PWM_DUTY);
+
+       if (duty100 == 0)
+               return -EINVAL;
+
+
+       tmp64 = (uint64_t)duty * 100;
+       do_div(tmp64, duty100);
+       *speed = (uint32_t)tmp64;
+
+       if (*speed > 100)
+               *speed = 100;
+
+       return 0;
+}
+
+int polaris10_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
+{
+       uint32_t tach_period;
+       uint32_t crystal_clock_freq;
+
+       if (hwmgr->thermal_controller.fanInfo.bNoFan ||
+                       (hwmgr->thermal_controller.fanInfo.
+                               ucTachometerPulsesPerRevolution == 0))
+               return 0;
+
+       tach_period = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_TACH_STATUS, TACH_PERIOD);
+
+       if (tach_period == 0)
+               return -EINVAL;
+
+       crystal_clock_freq = tonga_get_xclk(hwmgr);
+
+       *speed = 60 * crystal_clock_freq * 10000 / tach_period;
+
+       return 0;
+}
+
+/**
+* Set Fan Speed Control to static mode, so that the user can decide what speed to use.
+* @param    hwmgr  the address of the powerplay hardware manager.
+*           mode    the fan control mode, 0 default, 1 by percent, 5, by RPM
+* @exception Should always succeed.
+*/
+int polaris10_fan_ctrl_set_static_mode(struct pp_hwmgr *hwmgr, uint32_t mode)
+{
+
+       if (hwmgr->fan_ctrl_is_in_default_mode) {
+               hwmgr->fan_ctrl_default_mode =
+                               PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device,     CGS_IND_REG__SMC,
+                                               CG_FDO_CTRL2, FDO_PWM_MODE);
+               hwmgr->tmin =
+                               PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                                               CG_FDO_CTRL2, TMIN);
+               hwmgr->fan_ctrl_is_in_default_mode = false;
+       }
+
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL2, TMIN, 0);
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL2, FDO_PWM_MODE, mode);
+
+       return 0;
+}
+
+/**
+* Reset Fan Speed Control to default mode.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @exception Should always succeed.
+*/
+int polaris10_fan_ctrl_set_default_mode(struct pp_hwmgr *hwmgr)
+{
+       if (!hwmgr->fan_ctrl_is_in_default_mode) {
+               PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               CG_FDO_CTRL2, FDO_PWM_MODE, hwmgr->fan_ctrl_default_mode);
+               PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               CG_FDO_CTRL2, TMIN, hwmgr->tmin);
+               hwmgr->fan_ctrl_is_in_default_mode = true;
+       }
+
+       return 0;
+}
+
+int polaris10_fan_ctrl_start_smc_fan_control(struct pp_hwmgr *hwmgr)
+{
+       int result;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_ODFuzzyFanControlSupport)) {
+               cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_FUZZY);
+               result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl);
+
+               if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_FanSpeedInTableIsRPM))
+                       hwmgr->hwmgr_func->set_max_fan_rpm_output(hwmgr,
+                                       hwmgr->thermal_controller.
+                                       advanceFanControlParameters.usMaxFanRPM);
+               else
+                       hwmgr->hwmgr_func->set_max_fan_pwm_output(hwmgr,
+                                       hwmgr->thermal_controller.
+                                       advanceFanControlParameters.usMaxFanPWM);
+
+       } else {
+               cgs_write_register(hwmgr->device, mmSMC_MSG_ARG_0, FAN_CONTROL_TABLE);
+               result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StartFanControl);
+       }
+
+       if (!result && hwmgr->thermal_controller.
+                       advanceFanControlParameters.ucTargetTemperature)
+               result = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_SetFanTemperatureTarget,
+                               hwmgr->thermal_controller.
+                               advanceFanControlParameters.ucTargetTemperature);
+
+       return result;
+}
+
+
+int polaris10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr)
+{
+       return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_StopFanControl);
+}
+
+/**
+* Set Fan Speed in percent.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    speed is the percentage value (0% - 100%) to be set.
+* @exception Fails is the 100% setting appears to be 0.
+*/
+int polaris10_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr,
+               uint32_t speed)
+{
+       uint32_t duty100;
+       uint32_t duty;
+       uint64_t tmp64;
+
+       if (hwmgr->thermal_controller.fanInfo.bNoFan)
+               return 0;
+
+       if (speed > 100)
+               speed = 100;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_MicrocodeFanControl))
+               polaris10_fan_ctrl_stop_smc_fan_control(hwmgr);
+
+       duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL1, FMAX_DUTY100);
+
+       if (duty100 == 0)
+               return -EINVAL;
+
+       tmp64 = (uint64_t)speed * duty100;
+       do_div(tmp64, 100);
+       duty = (uint32_t)tmp64;
+
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL0, FDO_STATIC_DUTY, duty);
+
+       return polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC);
+}
+
+/**
+* Reset Fan Speed to default.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @exception Always succeeds.
+*/
+int polaris10_fan_ctrl_reset_fan_speed_to_default(struct pp_hwmgr *hwmgr)
+{
+       int result;
+
+       if (hwmgr->thermal_controller.fanInfo.bNoFan)
+               return 0;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_MicrocodeFanControl)) {
+               result = polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC);
+               if (!result)
+                       result = polaris10_fan_ctrl_start_smc_fan_control(hwmgr);
+       } else
+               result = polaris10_fan_ctrl_set_default_mode(hwmgr);
+
+       return result;
+}
+
+/**
+* Set Fan Speed in RPM.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    speed is the percentage value (min - max) to be set.
+* @exception Fails is the speed not lie between min and max.
+*/
+int polaris10_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed)
+{
+       uint32_t tach_period;
+       uint32_t crystal_clock_freq;
+
+       if (hwmgr->thermal_controller.fanInfo.bNoFan ||
+                       (hwmgr->thermal_controller.fanInfo.
+                       ucTachometerPulsesPerRevolution == 0) ||
+                       (speed < hwmgr->thermal_controller.fanInfo.ulMinRPM) ||
+                       (speed > hwmgr->thermal_controller.fanInfo.ulMaxRPM))
+               return 0;
+
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_MicrocodeFanControl))
+               polaris10_fan_ctrl_stop_smc_fan_control(hwmgr);
+
+       crystal_clock_freq = tonga_get_xclk(hwmgr);
+
+       tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
+
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               CG_TACH_STATUS, TACH_PERIOD, tach_period);
+
+       return polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC);
+}
+
+/**
+* Reads the remote temperature from the SIslands thermal controller.
+*
+* @param    hwmgr The address of the hardware manager.
+*/
+int polaris10_thermal_get_temperature(struct pp_hwmgr *hwmgr)
+{
+       int temp;
+
+       temp = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_MULT_THERMAL_STATUS, CTF_TEMP);
+
+       /* Bit 9 means the reading is lower than the lowest usable value. */
+       if (temp & 0x200)
+               temp = POLARIS10_THERMAL_MAXIMUM_TEMP_READING;
+       else
+               temp = temp & 0x1ff;
+
+       temp *= PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+       return temp;
+}
+
+/**
+* Set the requested temperature range for high and low alert signals
+*
+* @param    hwmgr The address of the hardware manager.
+* @param    range Temperature range to be programmed for high and low alert signals
+* @exception PP_Result_BadInput if the input data is not valid.
+*/
+static int polaris10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr,
+               uint32_t low_temp, uint32_t high_temp)
+{
+       uint32_t low = POLARIS10_THERMAL_MINIMUM_ALERT_TEMP *
+                       PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+       uint32_t high = POLARIS10_THERMAL_MAXIMUM_ALERT_TEMP *
+                       PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+
+       if (low < low_temp)
+               low = low_temp;
+       if (high > high_temp)
+               high = high_temp;
+
+       if (low > high)
+               return -EINVAL;
+
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, DIG_THERM_INTH,
+                       (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES));
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, DIG_THERM_INTL,
+                       (low / PP_TEMPERATURE_UNITS_PER_CENTIGRADES));
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_CTRL, DIG_THERM_DPM,
+                       (high / PP_TEMPERATURE_UNITS_PER_CENTIGRADES));
+
+       return 0;
+}
+
+/**
+* Programs thermal controller one-time setting registers
+*
+* @param    hwmgr The address of the hardware manager.
+*/
+static int polaris10_thermal_initialize(struct pp_hwmgr *hwmgr)
+{
+       if (hwmgr->thermal_controller.fanInfo.ucTachometerPulsesPerRevolution)
+               PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                               CG_TACH_CTRL, EDGE_PER_REV,
+                               hwmgr->thermal_controller.fanInfo.
+                               ucTachometerPulsesPerRevolution - 1);
+
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL2, TACH_PWM_RESP_RATE, 0x28);
+
+       return 0;
+}
+
+/**
+* Enable thermal alerts on the RV770 thermal controller.
+*
+* @param    hwmgr The address of the hardware manager.
+*/
+static int polaris10_thermal_enable_alert(struct pp_hwmgr *hwmgr)
+{
+       uint32_t alert;
+
+       alert = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, THERM_INT_MASK);
+       alert &= ~(POLARIS10_THERMAL_HIGH_ALERT_MASK | POLARIS10_THERMAL_LOW_ALERT_MASK);
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, THERM_INT_MASK, alert);
+
+       /* send message to SMU to enable internal thermal interrupts */
+       return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Thermal_Cntl_Enable);
+}
+
+/**
+* Disable thermal alerts on the RV770 thermal controller.
+* @param    hwmgr The address of the hardware manager.
+*/
+static int polaris10_thermal_disable_alert(struct pp_hwmgr *hwmgr)
+{
+       uint32_t alert;
+
+       alert = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, THERM_INT_MASK);
+       alert |= (POLARIS10_THERMAL_HIGH_ALERT_MASK | POLARIS10_THERMAL_LOW_ALERT_MASK);
+       PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_THERMAL_INT, THERM_INT_MASK, alert);
+
+       /* send message to SMU to disable internal thermal interrupts */
+       return smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Thermal_Cntl_Disable);
+}
+
+/**
+* Uninitialize the thermal controller.
+* Currently just disables alerts.
+* @param    hwmgr The address of the hardware manager.
+*/
+int polaris10_thermal_stop_thermal_controller(struct pp_hwmgr *hwmgr)
+{
+       int result = polaris10_thermal_disable_alert(hwmgr);
+
+       if (!hwmgr->thermal_controller.fanInfo.bNoFan)
+               polaris10_fan_ctrl_set_default_mode(hwmgr);
+
+       return result;
+}
+
+/**
+* Set up the fan table to control the fan using the SMC.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from set temperature range routine
+*/
+int tf_polaris10_thermal_setup_fan_table(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+       struct polaris10_hwmgr *data = (struct polaris10_hwmgr *)(hwmgr->backend);
+       SMU74_Discrete_FanTable fan_table = { FDO_MODE_HARDWARE };
+       uint32_t duty100;
+       uint32_t t_diff1, t_diff2, pwm_diff1, pwm_diff2;
+       uint16_t fdo_min, slope1, slope2;
+       uint32_t reference_clock;
+       int res;
+       uint64_t tmp64;
+
+       if (data->fan_table_start == 0) {
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_MicrocodeFanControl);
+               return 0;
+       }
+
+       duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
+                       CG_FDO_CTRL1, FMAX_DUTY100);
+
+       if (duty100 == 0) {
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_MicrocodeFanControl);
+               return 0;
+       }
+
+       tmp64 = hwmgr->thermal_controller.advanceFanControlParameters.
+                       usPWMMin * duty100;
+       do_div(tmp64, 10000);
+       fdo_min = (uint16_t)tmp64;
+
+       t_diff1 = hwmgr->thermal_controller.advanceFanControlParameters.usTMed -
+                       hwmgr->thermal_controller.advanceFanControlParameters.usTMin;
+       t_diff2 = hwmgr->thermal_controller.advanceFanControlParameters.usTHigh -
+                       hwmgr->thermal_controller.advanceFanControlParameters.usTMed;
+
+       pwm_diff1 = hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed -
+                       hwmgr->thermal_controller.advanceFanControlParameters.usPWMMin;
+       pwm_diff2 = hwmgr->thermal_controller.advanceFanControlParameters.usPWMHigh -
+                       hwmgr->thermal_controller.advanceFanControlParameters.usPWMMed;
+
+       slope1 = (uint16_t)((50 + ((16 * duty100 * pwm_diff1) / t_diff1)) / 100);
+       slope2 = (uint16_t)((50 + ((16 * duty100 * pwm_diff2) / t_diff2)) / 100);
+
+       fan_table.TempMin = cpu_to_be16((50 + hwmgr->
+                       thermal_controller.advanceFanControlParameters.usTMin) / 100);
+       fan_table.TempMed = cpu_to_be16((50 + hwmgr->
+                       thermal_controller.advanceFanControlParameters.usTMed) / 100);
+       fan_table.TempMax = cpu_to_be16((50 + hwmgr->
+                       thermal_controller.advanceFanControlParameters.usTMax) / 100);
+
+       fan_table.Slope1 = cpu_to_be16(slope1);
+       fan_table.Slope2 = cpu_to_be16(slope2);
+
+       fan_table.FdoMin = cpu_to_be16(fdo_min);
+
+       fan_table.HystDown = cpu_to_be16(hwmgr->
+                       thermal_controller.advanceFanControlParameters.ucTHyst);
+
+       fan_table.HystUp = cpu_to_be16(1);
+
+       fan_table.HystSlope = cpu_to_be16(1);
+
+       fan_table.TempRespLim = cpu_to_be16(5);
+
+       reference_clock = tonga_get_xclk(hwmgr);
+
+       fan_table.RefreshPeriod = cpu_to_be32((hwmgr->
+                       thermal_controller.advanceFanControlParameters.ulCycleDelay *
+                       reference_clock) / 1600);
+
+       fan_table.FdoMax = cpu_to_be16((uint16_t)duty100);
+
+       fan_table.TempSrc = (uint8_t)PHM_READ_VFPF_INDIRECT_FIELD(
+                       hwmgr->device, CGS_IND_REG__SMC,
+                       CG_MULT_THERMAL_CTRL, TEMP_SEL);
+
+       res = polaris10_copy_bytes_to_smc(hwmgr->smumgr, data->fan_table_start,
+                       (uint8_t *)&fan_table, (uint32_t)sizeof(fan_table),
+                       data->sram_end);
+
+       if (!res && hwmgr->thermal_controller.
+                       advanceFanControlParameters.ucMinimumPWMLimit)
+               res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_SetFanMinPwm,
+                               hwmgr->thermal_controller.
+                               advanceFanControlParameters.ucMinimumPWMLimit);
+
+       if (!res && hwmgr->thermal_controller.
+                       advanceFanControlParameters.ulMinFanSCLKAcousticLimit)
+               res = smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
+                               PPSMC_MSG_SetFanSclkTarget,
+                               hwmgr->thermal_controller.
+                               advanceFanControlParameters.ulMinFanSCLKAcousticLimit);
+
+       if (res)
+               phm_cap_unset(hwmgr->platform_descriptor.platformCaps,
+                               PHM_PlatformCaps_MicrocodeFanControl);
+
+       return 0;
+}
+
+/**
+* Start the fan control on the SMC.
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from set temperature range routine
+*/
+int tf_polaris10_thermal_start_smc_fan_control(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+/* If the fantable setup has failed we could have disabled
+ * PHM_PlatformCaps_MicrocodeFanControl even after
+ * this function was included in the table.
+ * Make sure that we still think controlling the fan is OK.
+*/
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_MicrocodeFanControl)) {
+               polaris10_fan_ctrl_start_smc_fan_control(hwmgr);
+               polaris10_fan_ctrl_set_static_mode(hwmgr, FDO_PWM_MODE_STATIC);
+       }
+
+       return 0;
+}
+
+/**
+* Set temperature range for high and low alerts
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from set temperature range routine
+*/
+int tf_polaris10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+       struct PP_TemperatureRange *range = (struct PP_TemperatureRange *)input;
+
+       if (range == NULL)
+               return -EINVAL;
+
+       return polaris10_thermal_set_temperature_range(hwmgr, range->min, range->max);
+}
+
+/**
+* Programs one-time setting registers
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from initialize thermal controller routine
+*/
+int tf_polaris10_thermal_initialize(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+    return polaris10_thermal_initialize(hwmgr);
+}
+
+/**
+* Enable high and low alerts
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from enable alert routine
+*/
+int tf_polaris10_thermal_enable_alert(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+       return polaris10_thermal_enable_alert(hwmgr);
+}
+
+/**
+* Disable high and low alerts
+* @param    hwmgr  the address of the powerplay hardware manager.
+* @param    pInput the pointer to input data
+* @param    pOutput the pointer to output data
+* @param    pStorage the pointer to temporary storage
+* @param    Result the last failure code
+* @return   result from disable alert routine
+*/
+static int tf_polaris10_thermal_disable_alert(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+       return polaris10_thermal_disable_alert(hwmgr);
+}
+
+static int tf_polaris10_thermal_avfs_enable(struct pp_hwmgr *hwmgr,
+               void *input, void *output, void *storage, int result)
+{
+       int ret;
+       struct pp_smumgr *smumgr = (struct pp_smumgr *)(hwmgr->smumgr);
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+
+       if (smu_data->avfs.avfs_btc_status != AVFS_BTC_ENABLEAVFS)
+               return 0;
+
+       ret = (smum_send_msg_to_smc(smumgr, PPSMC_MSG_EnableAvfs) == 0) ?
+                       0 : -1;
+
+       if (!ret)
+               /* If this param is not changed, this function could fire unnecessarily */
+               smu_data->avfs.avfs_btc_status = AVFS_BTC_COMPLETED_PREVIOUSLY;
+
+       return ret;
+}
+
+static const struct phm_master_table_item
+polaris10_thermal_start_thermal_controller_master_list[] = {
+       {NULL, tf_polaris10_thermal_initialize},
+       {NULL, tf_polaris10_thermal_set_temperature_range},
+       {NULL, tf_polaris10_thermal_enable_alert},
+       {NULL, tf_polaris10_thermal_avfs_enable},
+/* We should restrict performance levels to low before we halt the SMC.
+ * On the other hand we are still in boot state when we do this
+ * so it would be pointless.
+ * If this assumption changes we have to revisit this table.
+ */
+       {NULL, tf_polaris10_thermal_setup_fan_table},
+       {NULL, tf_polaris10_thermal_start_smc_fan_control},
+       {NULL, NULL}
+};
+
+static const struct phm_master_table_header
+polaris10_thermal_start_thermal_controller_master = {
+       0,
+       PHM_MasterTableFlag_None,
+       polaris10_thermal_start_thermal_controller_master_list
+};
+
+static const struct phm_master_table_item
+polaris10_thermal_set_temperature_range_master_list[] = {
+       {NULL, tf_polaris10_thermal_disable_alert},
+       {NULL, tf_polaris10_thermal_set_temperature_range},
+       {NULL, tf_polaris10_thermal_enable_alert},
+       {NULL, NULL}
+};
+
+static const struct phm_master_table_header
+polaris10_thermal_set_temperature_range_master = {
+       0,
+       PHM_MasterTableFlag_None,
+       polaris10_thermal_set_temperature_range_master_list
+};
+
+int polaris10_thermal_ctrl_uninitialize_thermal_controller(struct pp_hwmgr *hwmgr)
+{
+       if (!hwmgr->thermal_controller.fanInfo.bNoFan)
+               polaris10_fan_ctrl_set_default_mode(hwmgr);
+       return 0;
+}
+
+/**
+* Initializes the thermal controller related functions in the Hardware Manager structure.
+* @param    hwmgr The address of the hardware manager.
+* @exception Any error code from the low-level communication.
+*/
+int pp_polaris10_thermal_initialize(struct pp_hwmgr *hwmgr)
+{
+       int result;
+
+       result = phm_construct_table(hwmgr,
+                       &polaris10_thermal_set_temperature_range_master,
+                       &(hwmgr->set_temperature_range));
+
+       if (!result) {
+               result = phm_construct_table(hwmgr,
+                               &polaris10_thermal_start_thermal_controller_master,
+                               &(hwmgr->start_thermal_controller));
+               if (result)
+                       phm_destroy_table(hwmgr, &(hwmgr->set_temperature_range));
+       }
+
+       if (!result)
+               hwmgr->fan_ctrl_is_in_default_mode = true;
+       return result;
+}
+
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.h b/drivers/gpu/drm/amd/powerplay/hwmgr/polaris10_thermal.h
new file mode 100644 (file)
index 0000000..62f8cbc
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef _POLARIS10_THERMAL_H_
+#define _POLARIS10_THERMAL_H_
+
+#include "hwmgr.h"
+
+#define POLARIS10_THERMAL_HIGH_ALERT_MASK         0x1
+#define POLARIS10_THERMAL_LOW_ALERT_MASK          0x2
+
+#define POLARIS10_THERMAL_MINIMUM_TEMP_READING    -256
+#define POLARIS10_THERMAL_MAXIMUM_TEMP_READING    255
+
+#define POLARIS10_THERMAL_MINIMUM_ALERT_TEMP      0
+#define POLARIS10_THERMAL_MAXIMUM_ALERT_TEMP      255
+
+#define FDO_PWM_MODE_STATIC  1
+#define FDO_PWM_MODE_STATIC_RPM 5
+
+
+extern int tf_polaris10_thermal_initialize(struct pp_hwmgr *hwmgr, void *input, void *output, void *storage, int result);
+extern int tf_polaris10_thermal_set_temperature_range(struct pp_hwmgr *hwmgr, void *input, void *output, void *storage, int result);
+extern int tf_polaris10_thermal_enable_alert(struct pp_hwmgr *hwmgr, void *input, void *output, void *storage, int result);
+
+extern int polaris10_thermal_get_temperature(struct pp_hwmgr *hwmgr);
+extern int polaris10_thermal_stop_thermal_controller(struct pp_hwmgr *hwmgr);
+extern int polaris10_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr, struct phm_fan_speed_info *fan_speed_info);
+extern int polaris10_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr, uint32_t *speed);
+extern int polaris10_fan_ctrl_set_default_mode(struct pp_hwmgr *hwmgr);
+extern int polaris10_fan_ctrl_set_static_mode(struct pp_hwmgr *hwmgr, uint32_t mode);
+extern int polaris10_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr, uint32_t speed);
+extern int polaris10_fan_ctrl_reset_fan_speed_to_default(struct pp_hwmgr *hwmgr);
+extern int pp_polaris10_thermal_initialize(struct pp_hwmgr *hwmgr);
+extern int polaris10_thermal_ctrl_uninitialize_thermal_controller(struct pp_hwmgr *hwmgr);
+extern int polaris10_fan_ctrl_set_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t speed);
+extern int polaris10_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed);
+extern int polaris10_fan_ctrl_stop_smc_fan_control(struct pp_hwmgr *hwmgr);
+extern uint32_t tonga_get_xclk(struct pp_hwmgr *hwmgr);
+
+#endif
+
index 7b2d5000292d86d8166c7a85ba0b1d6d2b9278b7..58742e0d14924bb3b0e994c03f8b98f898769081 100644 (file)
@@ -1,3 +1,26 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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 <linux/errno.h>
 #include "linux/delay.h"
 #include "hwmgr.h"
index 2a83a4af2904ca2ed9057a1f46947bcdfa4bcc30..da9f5f1b6dc2ccd00cd7f2508c316b189ccec657 100644 (file)
@@ -373,6 +373,37 @@ int atomctrl_get_engine_pll_dividers_vi(
        return result;
 }
 
+int atomctrl_get_engine_pll_dividers_ai(struct pp_hwmgr *hwmgr,
+               uint32_t clock_value,
+               pp_atomctrl_clock_dividers_ai *dividers)
+{
+       COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_7 pll_patameters;
+       int result;
+
+       pll_patameters.ulClock.ulClock = clock_value;
+       pll_patameters.ulClock.ucPostDiv = COMPUTE_GPUCLK_INPUT_FLAG_SCLK;
+
+       result = cgs_atom_exec_cmd_table
+               (hwmgr->device,
+                GetIndexIntoMasterTable(COMMAND, ComputeMemoryEnginePLL),
+                &pll_patameters);
+
+       if (0 == result) {
+               dividers->usSclk_fcw_frac     = le16_to_cpu(pll_patameters.usSclk_fcw_frac);
+               dividers->usSclk_fcw_int      = le16_to_cpu(pll_patameters.usSclk_fcw_int);
+               dividers->ucSclkPostDiv       = pll_patameters.ucSclkPostDiv;
+               dividers->ucSclkVcoMode       = pll_patameters.ucSclkVcoMode;
+               dividers->ucSclkPllRange      = pll_patameters.ucSclkPllRange;
+               dividers->ucSscEnable         = pll_patameters.ucSscEnable;
+               dividers->usSsc_fcw1_frac     = le16_to_cpu(pll_patameters.usSsc_fcw1_frac);
+               dividers->usSsc_fcw1_int      = le16_to_cpu(pll_patameters.usSsc_fcw1_int);
+               dividers->usPcc_fcw_int       = le16_to_cpu(pll_patameters.usPcc_fcw_int);
+               dividers->usSsc_fcw_slew_frac = le16_to_cpu(pll_patameters.usSsc_fcw_slew_frac);
+               dividers->usPcc_fcw_slew_frac = le16_to_cpu(pll_patameters.usPcc_fcw_slew_frac);
+       }
+       return result;
+}
+
 int atomctrl_get_dfs_pll_dividers_vi(
                struct pp_hwmgr *hwmgr,
                uint32_t clock_value,
@@ -618,7 +649,7 @@ int atomctrl_calculate_voltage_evv_on_sclk(
        if (!getASICProfilingInfo)
                return -1;
 
-       if(getASICProfilingInfo->asHeader.ucTableFormatRevision < 3 ||
+       if (getASICProfilingInfo->asHeader.ucTableFormatRevision < 3 ||
                        (getASICProfilingInfo->asHeader.ucTableFormatRevision == 3 &&
                        getASICProfilingInfo->asHeader.ucTableContentRevision < 4))
                return -1;
@@ -891,18 +922,18 @@ int atomctrl_calculate_voltage_evv_on_sclk(
         *-----------------------
         */
 
-       fA_Term = fAdd(fMargin_RO_a, fAdd(fMultiply(fSM_A4,fSclk), fSM_A5));
+       fA_Term = fAdd(fMargin_RO_a, fAdd(fMultiply(fSM_A4, fSclk), fSM_A5));
        fB_Term = fAdd(fAdd(fMultiply(fSM_A2, fSclk), fSM_A6), fMargin_RO_b);
        fC_Term = fAdd(fMargin_RO_c,
                        fAdd(fMultiply(fSM_A0,fLkg_FT),
-                       fAdd(fMultiply(fSM_A1, fMultiply(fLkg_FT,fSclk)),
+                       fAdd(fMultiply(fSM_A1, fMultiply(fLkg_FT, fSclk)),
                        fAdd(fMultiply(fSM_A3, fSclk),
-                       fSubtract(fSM_A7,fRO_fused)))));
+                       fSubtract(fSM_A7, fRO_fused)))));
 
        fVDDC_base = fSubtract(fRO_fused,
                        fSubtract(fMargin_RO_c,
                                        fSubtract(fSM_A3, fMultiply(fSM_A1, fSclk))));
-       fVDDC_base = fDivide(fVDDC_base, fAdd(fMultiply(fSM_A0,fSclk), fSM_A2));
+       fVDDC_base = fDivide(fVDDC_base, fAdd(fMultiply(fSM_A0, fSclk), fSM_A2));
 
        repeat = fSubtract(fVDDC_base,
                        fDivide(fMargin_DC_sigma, ConvertToFraction(1000)));
@@ -916,7 +947,7 @@ int atomctrl_calculate_voltage_evv_on_sclk(
                        fSubtract(fRO_DC_margin,
                        fSubtract(fSM_A3,
                        fMultiply(fSM_A2, repeat))));
-       fDC_SCLK = fDivide(fDC_SCLK, fAdd(fMultiply(fSM_A0,repeat), fSM_A1));
+       fDC_SCLK = fDivide(fDC_SCLK, fAdd(fMultiply(fSM_A0, repeat), fSM_A1));
 
        fSigma_DC = fSubtract(fSclk, fDC_SCLK);
 
@@ -996,7 +1027,7 @@ int atomctrl_calculate_voltage_evv_on_sclk(
                fV_NL = fRoundUpByStepSize(fV_NL, fStepSize, 0);
 
                if (GreaterThan(fV_max, fV_NL) &&
-                       (GreaterThan(fV_NL,fEVV_V) ||
+                       (GreaterThan(fV_NL, fEVV_V) ||
                        Equal(fV_NL, fEVV_V))) {
                        fV_NL = fMultiply(fV_NL, ConvertToFraction(1000));
 
@@ -1010,10 +1041,10 @@ int atomctrl_calculate_voltage_evv_on_sclk(
 }
 
 /** atomctrl_get_voltage_evv_on_sclk gets voltage via call to ATOM COMMAND table.
- * @param hwmgr                input: pointer to hwManager
+ * @param hwmgr        input: pointer to hwManager
  * @param voltage_type            input: type of EVV voltage VDDC or VDDGFX
  * @param sclk                        input: in 10Khz unit. DPM state SCLK frequency
- *                                             which is define in PPTable SCLK/VDDC dependence
+ *             which is define in PPTable SCLK/VDDC dependence
  *                             table associated with this virtual_voltage_Id
  * @param virtual_voltage_Id      input: voltage id which match per voltage DPM state: 0xff01, 0xff02.. 0xff08
  * @param voltage                     output: real voltage level in unit of mv
@@ -1205,3 +1236,69 @@ int atomctrl_read_efuse(void *device, uint16_t start_index,
 
        return result;
 }
+
+int atomctrl_set_ac_timing_ai(struct pp_hwmgr *hwmgr, uint32_t memory_clock,
+                                                               uint8_t level)
+{
+       DYNAMICE_MEMORY_SETTINGS_PARAMETER_V2_1 memory_clock_parameters;
+       int result;
+
+       memory_clock_parameters.asDPMMCReg.ulClock.ulClockFreq = memory_clock & SET_CLOCK_FREQ_MASK;
+       memory_clock_parameters.asDPMMCReg.ulClock.ulComputeClockFlag = ADJUST_MC_SETTING_PARAM;
+       memory_clock_parameters.asDPMMCReg.ucMclkDPMState = level;
+
+       result = cgs_atom_exec_cmd_table
+               (hwmgr->device,
+                GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings),
+                &memory_clock_parameters);
+
+       return result;
+}
+
+int atomctrl_get_voltage_evv_on_sclk_ai(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
+                               uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage)
+{
+
+       int result;
+       GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_3 get_voltage_info_param_space;
+
+       get_voltage_info_param_space.ucVoltageType = voltage_type;
+       get_voltage_info_param_space.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE;
+       get_voltage_info_param_space.usVoltageLevel = virtual_voltage_Id;
+       get_voltage_info_param_space.ulSCLKFreq = sclk;
+
+       result = cgs_atom_exec_cmd_table(hwmgr->device,
+                       GetIndexIntoMasterTable(COMMAND, GetVoltageInfo),
+                       &get_voltage_info_param_space);
+
+       if (0 != result)
+               return result;
+
+       *voltage = get_voltage_info_param_space.usVoltageLevel;
+
+       return result;
+}
+
+int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl_sclk_range_table *table)
+{
+
+       int i;
+       u8 frev, crev;
+       u16 size;
+
+       ATOM_SMU_INFO_V2_1 *psmu_info =
+               (ATOM_SMU_INFO_V2_1 *)cgs_atom_get_data_table(hwmgr->device,
+                       GetIndexIntoMasterTable(DATA, SMU_Info),
+                       &size, &frev, &crev);
+
+
+       for (i = 0; i < psmu_info->ucSclkEntryNum; i++) {
+               table->entry[i].ucVco_setting = psmu_info->asSclkFcwRangeEntry[i].ucVco_setting;
+               table->entry[i].ucPostdiv = psmu_info->asSclkFcwRangeEntry[i].ucPostdiv;
+               table->entry[i].usFcw_pcc = psmu_info->asSclkFcwRangeEntry[i].ucFcw_pcc;
+               table->entry[i].usFcw_trans_upper = psmu_info->asSclkFcwRangeEntry[i].ucFcw_trans_upper;
+               table->entry[i].usRcw_trans_lower = psmu_info->asSclkFcwRangeEntry[i].ucRcw_trans_lower;
+       }
+
+       return 0;
+}
index 627420b80a5ffa2b8041596509d634f33f65f5cd..d24ebb566905295587b16211cbef4dc1eca0c5fa 100644 (file)
@@ -101,6 +101,23 @@ struct pp_atomctrl_clock_dividers_vi {
 };
 typedef struct pp_atomctrl_clock_dividers_vi pp_atomctrl_clock_dividers_vi;
 
+struct pp_atomctrl_clock_dividers_ai {
+       u16 usSclk_fcw_frac;
+       u16  usSclk_fcw_int;
+       u8   ucSclkPostDiv;
+       u8   ucSclkVcoMode;
+       u8   ucSclkPllRange;
+       u8   ucSscEnable;
+       u16  usSsc_fcw1_frac;
+       u16  usSsc_fcw1_int;
+       u16  usReserved;
+       u16  usPcc_fcw_int;
+       u16  usSsc_fcw_slew_frac;
+       u16  usPcc_fcw_slew_frac;
+};
+typedef struct pp_atomctrl_clock_dividers_ai pp_atomctrl_clock_dividers_ai;
+
+
 union pp_atomctrl_s_mpll_fb_divider {
        struct {
                uint32_t cl_kf : 12;
@@ -204,6 +221,21 @@ struct pp_atomctrl_mc_register_address {
 
 typedef struct pp_atomctrl_mc_register_address pp_atomctrl_mc_register_address;
 
+#define MAX_SCLK_RANGE 8
+
+struct pp_atom_ctrl_sclk_range_table_entry{
+       uint8_t  ucVco_setting;
+       uint8_t  ucPostdiv;
+       uint16_t usFcw_pcc;
+       uint16_t usFcw_trans_upper;
+       uint16_t usRcw_trans_lower;
+};
+
+
+struct pp_atom_ctrl_sclk_range_table{
+       struct pp_atom_ctrl_sclk_range_table_entry entry[MAX_SCLK_RANGE];
+};
+
 struct pp_atomctrl_mc_reg_table {
        uint8_t                         last;                    /* number of registers */
        uint8_t                         num_entries;             /* number of AC timing entries */
@@ -240,7 +272,11 @@ extern int atomctrl_read_efuse(void *device, uint16_t start_index,
                uint16_t end_index, uint32_t mask, uint32_t *efuse);
 extern int atomctrl_calculate_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
                uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage, uint16_t dpm_level, bool debug);
-
-
+extern int atomctrl_get_engine_pll_dividers_ai(struct pp_hwmgr *hwmgr, uint32_t clock_value, pp_atomctrl_clock_dividers_ai *dividers);
+extern int atomctrl_set_ac_timing_ai(struct pp_hwmgr *hwmgr, uint32_t memory_clock,
+                                                               uint8_t level);
+extern int atomctrl_get_voltage_evv_on_sclk_ai(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
+                               uint32_t sclk, uint16_t virtual_voltage_Id, uint16_t *voltage);
+extern int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctrl_sclk_range_table *table);
 #endif
 
index b10df328d58cd10d4055084bf389286f680d810f..009bd5963ed8c8d9c79472e6dff4c237e4caac36 100644 (file)
@@ -127,8 +127,8 @@ fInt fExponential(fInt exponent)        /*Can be used to calculate e^exponent*/
        fInt solution = fPositiveOne; /*Starting off with baseline of 1 */
        fInt error_term;
 
-       uint32_t k_array[11] = {55452, 27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
-       uint32_t expk_array[11] = {2560000, 160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
+       static const uint32_t k_array[11] = {55452, 27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
+       static const uint32_t expk_array[11] = {2560000, 160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
 
        if (GreaterThan(fZERO, exponent)) {
                exponent = fNegate(exponent);
@@ -162,8 +162,8 @@ fInt fNaturalLog(fInt value)
        fInt solution = ConvertToFraction(0); /*Starting off with baseline of 0 */
        fInt error_term;
 
-       uint32_t k_array[10] = {160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
-       uint32_t logk_array[10] = {27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
+       static const uint32_t k_array[10] = {160000, 40000, 20000, 15000, 12500, 11250, 10625, 10313, 10156, 10078};
+       static const uint32_t logk_array[10] = {27726, 13863, 6931, 4055, 2231, 1178, 606, 308, 155, 78};
 
        while (GreaterThan(fAdd(value, fNegativeOne), upper_bound)) {
                for (i = 0; i < 10; i++) {
index 0d5d8372953ee21363c83faf9beec4056d8c2f13..1faad92b50d3082159ca98483ce0d85bc3782618 100644 (file)
@@ -51,6 +51,9 @@
 #include "bif/bif_5_0_d.h"
 #include "bif/bif_5_0_sh_mask.h"
 
+#include "dce/dce_10_0_d.h"
+#include "dce/dce_10_0_sh_mask.h"
+
 #include "cgs_linux.h"
 #include "eventmgr.h"
 #include "amd_pcie_helpers.h"
 typedef uint32_t PECI_RegistryValue;
 
 /* [2.5%,~2.5%] Clock stretched is multiple of 2.5% vs not and [Fmin, Fmax, LDO_REFSEL, USE_FOR_LOW_FREQ] */
-uint16_t PP_ClockStretcherLookupTable[2][4] = {
+static const uint16_t PP_ClockStretcherLookupTable[2][4] = {
        {600, 1050, 3, 0},
        {600, 1050, 6, 1} };
 
 /* [FF, SS] type, [] 4 voltage ranges, and [Floor Freq, Boundary Freq, VID min , VID max] */
-uint32_t PP_ClockStretcherDDTTable[2][4][4] = {
+static const uint32_t PP_ClockStretcherDDTTable[2][4][4] = {
        { {265, 529, 120, 128}, {325, 650, 96, 119}, {430, 860, 32, 95}, {0, 0, 0, 31} },
        { {275, 550, 104, 112}, {319, 638, 96, 103}, {360, 720, 64, 95}, {384, 768, 32, 63} } };
 
 /* [Use_For_Low_freq] value, [0%, 5%, 10%, 7.14%, 14.28%, 20%] (coming from PWR_CKS_CNTL.stretch_amount reg spec) */
-uint8_t PP_ClockStretchAmountConversion[2][6] = {
+static const uint8_t PP_ClockStretchAmountConversion[2][6] = {
        {0, 1, 3, 2, 4, 5},
        {0, 2, 4, 5, 6, 5} };
 
@@ -110,7 +113,7 @@ enum DPM_EVENT_SRC {
 };
 typedef enum DPM_EVENT_SRC DPM_EVENT_SRC;
 
-const unsigned long PhwTonga_Magic = (unsigned long)(PHM_VIslands_Magic);
+static const unsigned long PhwTonga_Magic = (unsigned long)(PHM_VIslands_Magic);
 
 struct tonga_power_state *cast_phw_tonga_power_state(
                                  struct pp_hw_power_state *hw_ps)
@@ -429,19 +432,20 @@ int tonga_get_evv_voltage(struct pp_hwmgr *hwmgr)
                                                }
                                        }
                                }
-                               PP_ASSERT_WITH_CODE(0 == atomctrl_get_voltage_evv_on_sclk
-                                               (hwmgr, VOLTAGE_TYPE_VDDGFX, sclk,
-                                                virtual_voltage_id, &vddgfx),
-                                               "Error retrieving EVV voltage value!", continue);
-
-                               /* need to make sure vddgfx is less than 2v or else, it could burn the ASIC. */
-                               PP_ASSERT_WITH_CODE((vddgfx < 2000 && vddgfx != 0), "Invalid VDDGFX value!", return -1);
-
-                               /* the voltage should not be zero nor equal to leakage ID */
-                               if (vddgfx != 0 && vddgfx != virtual_voltage_id) {
-                                       data->vddcgfx_leakage.actual_voltage[data->vddcgfx_leakage.count] = vddgfx;
-                                       data->vddcgfx_leakage.leakage_id[data->vddcgfx_leakage.count] = virtual_voltage_id;
-                                       data->vddcgfx_leakage.count++;
+                               if (0 == atomctrl_get_voltage_evv_on_sclk
+                                   (hwmgr, VOLTAGE_TYPE_VDDGFX, sclk,
+                                    virtual_voltage_id, &vddgfx)) {
+                                       /* need to make sure vddgfx is less than 2v or else, it could burn the ASIC. */
+                                       PP_ASSERT_WITH_CODE((vddgfx < 2000 && vddgfx != 0), "Invalid VDDGFX value!", return -1);
+
+                                       /* the voltage should not be zero nor equal to leakage ID */
+                                       if (vddgfx != 0 && vddgfx != virtual_voltage_id) {
+                                               data->vddcgfx_leakage.actual_voltage[data->vddcgfx_leakage.count] = vddgfx;
+                                               data->vddcgfx_leakage.leakage_id[data->vddcgfx_leakage.count] = virtual_voltage_id;
+                                               data->vddcgfx_leakage.count++;
+                                       }
+                               } else {
+                                       printk("Error retrieving EVV voltage value!\n");
                                }
                        }
                } else {
@@ -449,20 +453,20 @@ int tonga_get_evv_voltage(struct pp_hwmgr *hwmgr)
                        if (0 == tonga_get_sclk_for_voltage_evv(hwmgr,
                                                pptable_info->vddc_lookup_table,
                                                virtual_voltage_id, &sclk)) {
-                               PP_ASSERT_WITH_CODE(0 == atomctrl_get_voltage_evv_on_sclk
-                                               (hwmgr, VOLTAGE_TYPE_VDDC, sclk,
-                                                virtual_voltage_id, &vddc),
-                                               "Error retrieving EVV voltage value!", continue);
-
-                               /* need to make sure vddc is less than 2v or else, it could burn the ASIC. */
-                               if (vddc > 2000)
-                                       printk(KERN_ERR "[ powerplay ] Invalid VDDC value! \n");
-
-                               /* the voltage should not be zero nor equal to leakage ID */
-                               if (vddc != 0 && vddc != virtual_voltage_id) {
-                                       data->vddc_leakage.actual_voltage[data->vddc_leakage.count] = vddc;
-                                       data->vddc_leakage.leakage_id[data->vddc_leakage.count] = virtual_voltage_id;
-                                       data->vddc_leakage.count++;
+                               if (0 == atomctrl_get_voltage_evv_on_sclk
+                                   (hwmgr, VOLTAGE_TYPE_VDDC, sclk,
+                                    virtual_voltage_id, &vddc)) {
+                                       /* need to make sure vddc is less than 2v or else, it could burn the ASIC. */
+                                       PP_ASSERT_WITH_CODE(vddc < 2000, "Invalid VDDC value!", return -1);
+
+                                       /* the voltage should not be zero nor equal to leakage ID */
+                                       if (vddc != 0 && vddc != virtual_voltage_id) {
+                                               data->vddc_leakage.actual_voltage[data->vddc_leakage.count] = vddc;
+                                               data->vddc_leakage.leakage_id[data->vddc_leakage.count] = virtual_voltage_id;
+                                               data->vddc_leakage.count++;
+                                       }
+                               } else {
+                                       printk("Error retrieving EVV voltage value!\n");
                                }
                        }
                }
@@ -2037,14 +2041,11 @@ static int tonga_populate_single_memory_level(
        data->display_timing.num_existing_displays = info.display_count;
 
        if ((data->mclk_stutter_mode_threshold != 0) &&
-                       (memory_clock <= data->mclk_stutter_mode_threshold) &&
-                       (data->is_uvd_enabled == 0)
-#if defined(LINUX)
-                       && (PHM_READ_FIELD(hwmgr->device, DPG_PIPE_STUTTER_CONTROL, STUTTER_ENABLE) & 0x1)
-                       && (data->display_timing.num_existing_displays <= 2)
-                       && (data->display_timing.num_existing_displays != 0)
-#endif
-       )
+           (memory_clock <= data->mclk_stutter_mode_threshold) &&
+           (data->is_uvd_enabled == 0)
+           && (PHM_READ_FIELD(hwmgr->device, DPG_PIPE_STUTTER_CONTROL, STUTTER_ENABLE) & 0x1)
+           && (data->display_timing.num_existing_displays <= 2)
+           && (data->display_timing.num_existing_displays != 0))
                memory_level->StutterEnable = 1;
 
        /* decide strobe mode*/
@@ -2415,6 +2416,24 @@ int tonga_calculate_sclk_params(struct pp_hwmgr *hwmgr,
        return 0;
 }
 
+static uint8_t tonga_get_sleep_divider_id_from_clock(uint32_t engine_clock,
+               uint32_t min_engine_clock_in_sr)
+{
+       uint32_t i, temp;
+       uint32_t min = max(min_engine_clock_in_sr, (uint32_t)TONGA_MINIMUM_ENGINE_CLOCK);
+
+       PP_ASSERT_WITH_CODE((engine_clock >= min),
+                       "Engine clock can't satisfy stutter requirement!", return 0);
+
+       for (i = TONGA_MAX_DEEPSLEEP_DIVIDER_ID;; i--) {
+               temp = engine_clock >> i;
+
+               if(temp >= min || i == 0)
+                       break;
+       }
+       return (uint8_t)i;
+}
+
 /**
  * Populates single SMC SCLK structure using the provided engine clock
  *
@@ -2463,12 +2482,12 @@ static int tonga_populate_single_graphic_level(struct pp_hwmgr *hwmgr, uint32_t
        *get the DAL clock. do it in funture.
        PECI_GetMinClockSettings(hwmgr->peci, &minClocks);
        data->display_timing.min_clock_insr = minClocks.engineClockInSR;
-
-       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, PHM_PlatformCaps_SclkDeepSleep))
-       {
-               graphic_level->DeepSleepDivId = PhwTonga_GetSleepDividerIdFromClock(hwmgr, engine_clock, minClocks.engineClockInSR);
-       }
 */
+       if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
+                       PHM_PlatformCaps_SclkDeepSleep))
+               graphic_level->DeepSleepDivId =
+                               tonga_get_sleep_divider_id_from_clock(engine_clock,
+                                               data->display_timing.min_clock_insr);
 
        /* Default to slow, highest DPM level will be set to PPSMC_DISPLAY_WATERMARK_LOW later.*/
        graphic_level->DisplayWatermark = PPSMC_DISPLAY_WATERMARK_LOW;
@@ -2663,7 +2682,7 @@ static int tonga_populate_all_memory_levels(struct pp_hwmgr *hwmgr)
 struct TONGA_DLL_SPEED_SETTING {
        uint16_t            Min;                          /* Minimum Data Rate*/
        uint16_t            Max;                          /* Maximum Data Rate*/
-       uint32_t                        dll_speed;                     /* The desired DLL_SPEED setting*/
+       uint32_t                        dll_speed;                     /* The desired DLL_SPEED setting*/
 };
 
 static int tonga_populate_clock_stretcher_data_table(struct pp_hwmgr *hwmgr)
@@ -3296,14 +3315,14 @@ static int tonga_set_private_var_based_on_pptale(struct pp_hwmgr *hwmgr)
                pptable_info->vdd_dep_on_mclk;
 
        PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table != NULL,
-               "VDD dependency on SCLK table is missing.       \
+               "VDD dependency on SCLK table is missing.       \
                This table is mandatory", return -1);
        PP_ASSERT_WITH_CODE(allowed_sclk_vdd_table->count >= 1,
-               "VDD dependency on SCLK table has to have is missing.   \
+               "VDD dependency on SCLK table has to have is missing.   \
                This table is mandatory", return -1);
 
        PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table != NULL,
-               "VDD dependency on MCLK table is missing.       \
+               "VDD dependency on MCLK table is missing.       \
                This table is mandatory", return -1);
        PP_ASSERT_WITH_CODE(allowed_mclk_vdd_table->count >= 1,
                "VDD dependency on MCLK table has to have is missing.    \
@@ -4424,17 +4443,14 @@ int tonga_reset_asic_tasks(struct pp_hwmgr *hwmgr)
 
 int tonga_hwmgr_backend_fini(struct pp_hwmgr *hwmgr)
 {
-       if (NULL != hwmgr->dyn_state.vddc_dep_on_dal_pwrl) {
-               kfree(hwmgr->dyn_state.vddc_dep_on_dal_pwrl);
-               hwmgr->dyn_state.vddc_dep_on_dal_pwrl = NULL;
-       }
+       struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       if (NULL != hwmgr->backend) {
-               kfree(hwmgr->backend);
-               hwmgr->backend = NULL;
+       if (data->soft_pp_table) {
+               kfree(data->soft_pp_table);
+               data->soft_pp_table = NULL;
        }
 
-       return 0;
+       return phm_hwmgr_backend_fini(hwmgr);
 }
 
 /**
@@ -5874,7 +5890,7 @@ uint32_t tonga_get_xclk(struct pp_hwmgr *hwmgr)
        if (!fw_info)
                return 0;
 
-       reference_clock = le16_to_cpu(fw_info->usMinPixelClockPLL_Output);
+       reference_clock = le16_to_cpu(fw_info->usReferenceClock);
 
        divide = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_CLKPIN_CNTL, XTALIN_DIVIDE);
 
@@ -6039,24 +6055,40 @@ static int tonga_get_pp_table(struct pp_hwmgr *hwmgr, char **table)
 {
        struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       *table = (char *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+               memcpy(data->soft_pp_table, hwmgr->soft_pp_table,
+                               hwmgr->soft_pp_table_size);
+       }
+
+       *table = (char *)&data->soft_pp_table;
 
-       return sizeof(struct SMU72_Discrete_DpmTable);
+       return hwmgr->soft_pp_table_size;
 }
 
 static int tonga_set_pp_table(struct pp_hwmgr *hwmgr, const char *buf, size_t size)
 {
        struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
-       void *table = (void *)&data->smc_state_table;
+       if (!data->soft_pp_table) {
+               data->soft_pp_table = kzalloc(hwmgr->soft_pp_table_size, GFP_KERNEL);
+               if (!data->soft_pp_table)
+                       return -ENOMEM;
+       }
 
-       memcpy(table, buf, size);
+       memcpy(data->soft_pp_table, buf, size);
+
+       hwmgr->soft_pp_table = data->soft_pp_table;
+
+       /* TODO: re-init powerplay to implement modified pptable */
 
        return 0;
 }
 
 static int tonga_force_clock_level(struct pp_hwmgr *hwmgr,
-               enum pp_clock_type type, int level)
+               enum pp_clock_type type, uint32_t mask)
 {
        struct tonga_hwmgr *data = (struct tonga_hwmgr *)(hwmgr->backend);
 
@@ -6068,20 +6100,28 @@ static int tonga_force_clock_level(struct pp_hwmgr *hwmgr,
                if (!data->sclk_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_SCLKDPM_SetEnabledMask,
-                                       (1 << level));
+                                       data->dpm_level_enable_mask.sclk_dpm_enable_mask & mask);
                break;
        case PP_MCLK:
                if (!data->mclk_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_MCLKDPM_SetEnabledMask,
-                                       (1 << level));
+                                       data->dpm_level_enable_mask.mclk_dpm_enable_mask & mask);
                break;
        case PP_PCIE:
+       {
+               uint32_t tmp = mask & data->dpm_level_enable_mask.pcie_dpm_enable_mask;
+               uint32_t level = 0;
+
+               while (tmp >>= 1)
+                       level++;
+
                if (!data->pcie_dpm_key_disabled)
                        smum_send_msg_to_smc_with_parameter(hwmgr->smumgr,
                                        PPSMC_MSG_PCIeDPM_ForceLevel,
-                                       (1 << level));
+                                       level);
                break;
+       }
        default:
                break;
        }
@@ -6173,6 +6213,7 @@ static const struct pp_hwmgr_func tonga_hwmgr_funcs = {
        .powergate_uvd = tonga_phm_powergate_uvd,
        .powergate_vce = tonga_phm_powergate_vce,
        .disable_clock_power_gating = tonga_phm_disable_clock_power_gating,
+       .update_clock_gatings = tonga_phm_update_clock_gatings,
        .notify_smc_display_config_after_ps_adjustment = tonga_notify_smc_display_config_after_ps_adjustment,
        .display_config_changed = tonga_display_configuration_changed_task,
        .set_max_fan_pwm_output = tonga_set_max_fan_pwm_output,
index f88d3bbe667120b2319c68b5287eb47ec6d31cb4..573cd39fe78d34dd09f0a4b34c074dd160d861bd 100644 (file)
@@ -74,7 +74,7 @@ struct tonga_power_state {
 };
 
 struct _phw_tonga_dpm_level {
-       bool            enabled;
+       bool            enabled;
        uint32_t    value;
        uint32_t    param1;
 };
@@ -237,20 +237,20 @@ struct tonga_hwmgr {
        irq_handler_func_t             ctf_callback;
        void                             *ctf_context;
 
-       phw_tonga_clock_registers         clock_registers;
+       phw_tonga_clock_registers         clock_registers;
        phw_tonga_voltage_smio_registers  voltage_smio_registers;
 
-       bool                            is_memory_GDDR5;
+       bool    is_memory_GDDR5;
        uint16_t                          acpi_vddc;
-       bool                            pspp_notify_required;        /* Flag to indicate if PSPP notification to SBIOS is required */
+       bool    pspp_notify_required;        /* Flag to indicate if PSPP notification to SBIOS is required */
        uint16_t                          force_pcie_gen;            /* The forced PCI-E speed if not 0xffff */
        uint16_t                          acpi_pcie_gen;             /* The PCI-E speed at ACPI time */
        uint32_t                           pcie_gen_cap;             /* The PCI-E speed capabilities bitmap from CAIL */
        uint32_t                           pcie_lane_cap;            /* The PCI-E lane capabilities bitmap from CAIL */
        uint32_t                           pcie_spc_cap;             /* Symbol Per Clock Capabilities from registry */
-       phw_tonga_leakage_voltage               vddc_leakage;            /* The Leakage VDDC supported (based on leakage ID).*/
-       phw_tonga_leakage_voltage               vddcgfx_leakage;         /* The Leakage VDDC supported (based on leakage ID). */
-       phw_tonga_leakage_voltage               vddci_leakage;           /* The Leakage VDDCI supported (based on leakage ID). */
+       phw_tonga_leakage_voltage       vddc_leakage;            /* The Leakage VDDC supported (based on leakage ID).*/
+       phw_tonga_leakage_voltage       vddcgfx_leakage;         /* The Leakage VDDC supported (based on leakage ID). */
+       phw_tonga_leakage_voltage       vddci_leakage;           /* The Leakage VDDCI supported (based on leakage ID). */
 
        uint32_t                           mvdd_control;
        uint32_t                           vddc_mask_low;
@@ -263,8 +263,8 @@ struct tonga_hwmgr {
        uint32_t                           mclk_stutter_mode_threshold;
        uint32_t                           mclk_edc_enable_threshold;
        uint32_t                           mclk_edc_wr_enable_threshold;
-       bool                            is_uvd_enabled;
-       bool                            is_xdma_enabled;
+       bool    is_uvd_enabled;
+       bool    is_xdma_enabled;
        phw_tonga_vbios_boot_state      vbios_boot_state;
 
        bool                         battery_state;
@@ -353,6 +353,8 @@ struct tonga_hwmgr {
        bool                           acp_power_gated;  /* 1: gated, 0:not gated */
        bool                           pg_acp_init;
 
+       /* soft pptable for re-uploading into smu */
+       void *soft_pp_table;
 };
 
 typedef struct tonga_hwmgr tonga_hwmgr;
index 9a4456e6521b40bda580eb99aee1da58f62fa76c..1b44f4e9b8f55c02fe5faf71ba0687465840fe9d 100644 (file)
@@ -209,6 +209,20 @@ typedef struct _ATOM_Tonga_PCIE_Table {
        ATOM_Tonga_PCIE_Record entries[1];                                                      /* Dynamically allocate entries. */
 } ATOM_Tonga_PCIE_Table;
 
+typedef struct _ATOM_Polaris10_PCIE_Record {
+       UCHAR ucPCIEGenSpeed;
+       UCHAR usPCIELaneWidth;
+       UCHAR ucReserved[2];
+       ULONG ulPCIE_Sclk;
+} ATOM_Polaris10_PCIE_Record;
+
+typedef struct _ATOM_Polaris10_PCIE_Table {
+       UCHAR ucRevId;
+       UCHAR ucNumEntries;                                         /* Number of entries. */
+       ATOM_Polaris10_PCIE_Record entries[1];                      /* Dynamically allocate entries. */
+} ATOM_Polaris10_PCIE_Table;
+
+
 typedef struct _ATOM_Tonga_MM_Dependency_Record {
        UCHAR   ucVddcInd;                                                                                       /* VDDC voltage */
        USHORT  usVddgfxOffset;                                                                   /* Offset relative to VDDC voltage */
index b156481b50e8ee43076abf2de1fdcb8df46f3990..10e3630ee39d8d86c4897754274d70b451203328 100644 (file)
@@ -138,12 +138,15 @@ const void *get_powerplay_table(struct pp_hwmgr *hwmgr)
 
        u16 size;
        u8 frev, crev;
-       void *table_address;
-
-       table_address = (ATOM_Tonga_POWERPLAYTABLE *)
-               cgs_atom_get_data_table(hwmgr->device, index, &size, &frev, &crev);
-
-       hwmgr->soft_pp_table = table_address;   /*Cache the result in RAM.*/
+       void *table_address = (void *)hwmgr->soft_pp_table;
+
+       if (!table_address) {
+               table_address = (ATOM_Tonga_POWERPLAYTABLE *)
+                               cgs_atom_get_data_table(hwmgr->device,
+                                               index, &size, &frev, &crev);
+               hwmgr->soft_pp_table = table_address;   /*Cache the result in RAM.*/
+               hwmgr->soft_pp_table_size = size;
+       }
 
        return table_address;
 }
@@ -448,47 +451,90 @@ static int get_sclk_voltage_dependency_table(
 static int get_pcie_table(
                struct pp_hwmgr *hwmgr,
                phm_ppt_v1_pcie_table **pp_tonga_pcie_table,
-               const ATOM_Tonga_PCIE_Table * atom_pcie_table
+               const PPTable_Generic_SubTable_Header * pTable
                )
 {
        uint32_t table_size, i, pcie_count;
        phm_ppt_v1_pcie_table *pcie_table;
        struct phm_ppt_v1_information *pp_table_information =
                (struct phm_ppt_v1_information *)(hwmgr->pptable);
-       PP_ASSERT_WITH_CODE((0 != atom_pcie_table->ucNumEntries),
-               "Invalid PowerPlay Table!", return -1);
 
-       table_size = sizeof(uint32_t) +
-               sizeof(phm_ppt_v1_pcie_record) * atom_pcie_table->ucNumEntries;
+       if (pTable->ucRevId < 1) {
+               const ATOM_Tonga_PCIE_Table *atom_pcie_table = (ATOM_Tonga_PCIE_Table *)pTable;
+               PP_ASSERT_WITH_CODE((atom_pcie_table->ucNumEntries != 0),
+                       "Invalid PowerPlay Table!", return -1);
 
-       pcie_table = (phm_ppt_v1_pcie_table *)kzalloc(table_size, GFP_KERNEL);
+               table_size = sizeof(uint32_t) +
+                       sizeof(phm_ppt_v1_pcie_record) * atom_pcie_table->ucNumEntries;
 
-       if (NULL == pcie_table)
-               return -ENOMEM;
+               pcie_table = (phm_ppt_v1_pcie_table *)kzalloc(table_size, GFP_KERNEL);
 
-       memset(pcie_table, 0x00, table_size);
+               if (pcie_table == NULL)
+                       return -ENOMEM;
 
-       /*
-       * Make sure the number of pcie entries are less than or equal to sclk dpm levels.
-       * Since first PCIE entry is for ULV, #pcie has to be <= SclkLevel + 1.
-       */
-       pcie_count = (pp_table_information->vdd_dep_on_sclk->count) + 1;
-       if ((uint32_t)atom_pcie_table->ucNumEntries <= pcie_count)
-               pcie_count = (uint32_t)atom_pcie_table->ucNumEntries;
-       else
-               printk(KERN_ERR "[ powerplay ] Number of Pcie Entries exceed the number of SCLK Dpm Levels! \
-               Disregarding the excess entries... \n");
+               memset(pcie_table, 0x00, table_size);
 
-       pcie_table->count = pcie_count;
+               /*
+               * Make sure the number of pcie entries are less than or equal to sclk dpm levels.
+               * Since first PCIE entry is for ULV, #pcie has to be <= SclkLevel + 1.
+               */
+               pcie_count = (pp_table_information->vdd_dep_on_sclk->count) + 1;
+               if ((uint32_t)atom_pcie_table->ucNumEntries <= pcie_count)
+                       pcie_count = (uint32_t)atom_pcie_table->ucNumEntries;
+               else
+                       printk(KERN_ERR "[ powerplay ] Number of Pcie Entries exceed the number of SCLK Dpm Levels! \
+                       Disregarding the excess entries... \n");
 
-       for (i = 0; i < pcie_count; i++) {
-               pcie_table->entries[i].gen_speed =
-                       atom_pcie_table->entries[i].ucPCIEGenSpeed;
-               pcie_table->entries[i].lane_width =
-                       atom_pcie_table->entries[i].usPCIELaneWidth;
-       }
+               pcie_table->count = pcie_count;
 
-       *pp_tonga_pcie_table = pcie_table;
+               for (i = 0; i < pcie_count; i++) {
+                       pcie_table->entries[i].gen_speed =
+                               atom_pcie_table->entries[i].ucPCIEGenSpeed;
+                       pcie_table->entries[i].lane_width =
+                               atom_pcie_table->entries[i].usPCIELaneWidth;
+               }
+
+               *pp_tonga_pcie_table = pcie_table;
+       } else {
+               /* Polaris10/Polaris11 and newer. */
+               const ATOM_Polaris10_PCIE_Table *atom_pcie_table = (ATOM_Polaris10_PCIE_Table *)pTable;
+               PP_ASSERT_WITH_CODE((atom_pcie_table->ucNumEntries != 0),
+                       "Invalid PowerPlay Table!", return -1);
+
+               table_size = sizeof(uint32_t) +
+                       sizeof(phm_ppt_v1_pcie_record) * atom_pcie_table->ucNumEntries;
+
+               pcie_table = (phm_ppt_v1_pcie_table *)kzalloc(table_size, GFP_KERNEL);
+
+               if (pcie_table == NULL)
+                       return -ENOMEM;
+
+               memset(pcie_table, 0x00, table_size);
+
+               /*
+               * Make sure the number of pcie entries are less than or equal to sclk dpm levels.
+               * Since first PCIE entry is for ULV, #pcie has to be <= SclkLevel + 1.
+               */
+               pcie_count = (pp_table_information->vdd_dep_on_sclk->count) + 1;
+               if ((uint32_t)atom_pcie_table->ucNumEntries <= pcie_count)
+                       pcie_count = (uint32_t)atom_pcie_table->ucNumEntries;
+               else
+                       printk(KERN_ERR "[ powerplay ] Number of Pcie Entries exceed the number of SCLK Dpm Levels! \
+                       Disregarding the excess entries... \n");
+
+               pcie_table->count = pcie_count;
+
+               for (i = 0; i < pcie_count; i++) {
+                       pcie_table->entries[i].gen_speed =
+                               atom_pcie_table->entries[i].ucPCIEGenSpeed;
+                       pcie_table->entries[i].lane_width =
+                               atom_pcie_table->entries[i].usPCIELaneWidth;
+                       pcie_table->entries[i].pcie_sclk =
+                               atom_pcie_table->entries[i].ulPCIE_Sclk;
+               }
+
+               *pp_tonga_pcie_table = pcie_table;
+       }
 
        return 0;
 }
@@ -668,8 +714,8 @@ static int init_clock_voltage_dependency(
        const ATOM_Tonga_Hard_Limit_Table *pHardLimits =
                (const ATOM_Tonga_Hard_Limit_Table *)(((unsigned long) powerplay_table) +
                le16_to_cpu(powerplay_table->usHardLimitTableOffset));
-       const ATOM_Tonga_PCIE_Table *pcie_table =
-               (const ATOM_Tonga_PCIE_Table *)(((unsigned long) powerplay_table) +
+       const PPTable_Generic_SubTable_Header *pcie_table =
+               (const PPTable_Generic_SubTable_Header *)(((unsigned long) powerplay_table) +
                le16_to_cpu(powerplay_table->usPCIETableOffset));
 
        pp_table_information->vdd_dep_on_sclk = NULL;
index a188174747c9f1465a04a9a5c62af5dfa135b348..47ef1ca2d78bc615625727df802bb08bfd977985 100644 (file)
@@ -195,8 +195,8 @@ int tonga_fan_ctrl_set_fan_speed_percent(struct pp_hwmgr *hwmgr, uint32_t speed)
        if (0 == duty100)
                return -EINVAL;
 
-       tmp64 = (uint64_t)speed * 100;
-       do_div(tmp64, duty100);
+       tmp64 = (uint64_t)speed * duty100;
+       do_div(tmp64, 100);
        duty = (uint32_t)tmp64;
 
        PHM_WRITE_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, CG_FDO_CTRL0, FDO_STATIC_DUTY, duty);
@@ -525,7 +525,7 @@ static int tf_tonga_thermal_disable_alert(struct pp_hwmgr *hwmgr, void *input, v
        return tonga_thermal_disable_alert(hwmgr);
 }
 
-static struct phm_master_table_item tonga_thermal_start_thermal_controller_master_list[] = {
+static const struct phm_master_table_item tonga_thermal_start_thermal_controller_master_list[] = {
        { NULL, tf_tonga_thermal_initialize },
        { NULL, tf_tonga_thermal_set_temperature_range },
        { NULL, tf_tonga_thermal_enable_alert },
@@ -538,20 +538,20 @@ static struct phm_master_table_item tonga_thermal_start_thermal_controller_maste
        { NULL, NULL }
 };
 
-static struct phm_master_table_header tonga_thermal_start_thermal_controller_master = {
+static const struct phm_master_table_header tonga_thermal_start_thermal_controller_master = {
        0,
        PHM_MasterTableFlag_None,
        tonga_thermal_start_thermal_controller_master_list
 };
 
-static struct phm_master_table_item tonga_thermal_set_temperature_range_master_list[] = {
+static const struct phm_master_table_item tonga_thermal_set_temperature_range_master_list[] = {
        { NULL, tf_tonga_thermal_disable_alert},
        { NULL, tf_tonga_thermal_set_temperature_range},
        { NULL, tf_tonga_thermal_enable_alert},
        { NULL, NULL }
 };
 
-struct phm_master_table_header tonga_thermal_set_temperature_range_master = {
+static const struct phm_master_table_header tonga_thermal_set_temperature_range_master = {
        0,
        PHM_MasterTableFlag_None,
        tonga_thermal_set_temperature_range_master_list
index 7255f7ddf93a288feb6c6f4166c5f3d3a7187cae..50b367d44307c8992b8a17ef78b05c3ede5c09f5 100644 (file)
@@ -289,6 +289,9 @@ struct pp_states_info {
 
 #define PP_BLOCK_GFX_CG         0x01
 #define PP_BLOCK_GFX_MG         0x02
+#define PP_BLOCK_GFX_3D         0x04
+#define PP_BLOCK_GFX_RLC        0x08
+#define PP_BLOCK_GFX_CP         0x10
 #define PP_BLOCK_SYS_BIF        0x01
 #define PP_BLOCK_SYS_MC         0x02
 #define PP_BLOCK_SYS_ROM        0x04
@@ -337,7 +340,7 @@ struct amd_powerplay_funcs {
        int (*get_pp_num_states)(void *handle, struct pp_states_info *data);
        int (*get_pp_table)(void *handle, char **table);
        int (*set_pp_table)(void *handle, const char *buf, size_t size);
-       int (*force_clock_level)(void *handle, enum pp_clock_type type, int level);
+       int (*force_clock_level)(void *handle, enum pp_clock_type type, uint32_t mask);
        int (*print_clock_levels)(void *handle, enum pp_clock_type type, char *buf);
 };
 
index 10437dcfd365941791b6b4f004dba7fed60874f5..d63ef83b2628a068a80eff01b1b6137499d8b166 100644 (file)
@@ -37,7 +37,7 @@ typedef int (*pem_event_action)(struct pp_eventmgr *eventmgr,
 
 struct action_chain {
        const char *description;  /* action chain description for debugging purpose */
-       const pem_event_action **action_chain; /* pointer to chain of event actions */
+       const pem_event_action * const *action_chain; /* pointer to chain of event actions */
 };
 
 struct pem_power_source_ui_state_info {
index 0262ad35502a35316a61a38bd9cba7ade13a418e..8a31665321a899e533c0212478027f5164335a62 100644 (file)
@@ -46,7 +46,7 @@ struct PWR_Command_Table
 typedef struct PWR_Command_Table PWR_Command_Table;
 
 #define PWR_VIRUS_TABLE_SIZE  10243
-static PWR_Command_Table PwrVirusTable[PWR_VIRUS_TABLE_SIZE] =
+static const PWR_Command_Table PwrVirusTable[PWR_VIRUS_TABLE_SIZE] =
 {
     { PwrCmdWrite, 0x100100b6, mmPCIE_INDEX                               },
     { PwrCmdWrite, 0x00000000, mmPCIE_DATA                                },
index 040d3f7cbf490da7a06cc13ae952e34cf84830c5..56f712c7d07aff6051b1c473ca6936b1c1f512a2 100644 (file)
@@ -211,6 +211,7 @@ enum phm_platform_caps {
        PHM_PlatformCaps_ClockStretcher,
        PHM_PlatformCaps_TablelessHardwareInterface,
        PHM_PlatformCaps_EnableDriverEVV,
+       PHM_PlatformCaps_SPLLShutdownSupport,
        PHM_PlatformCaps_Max
 };
 
index 928f5a740cba77b92ab28ff1e0428d4dea6fb6f5..fd4ce7aaeee9a1a5b52ca165058966c8bdd3814b 100644 (file)
@@ -141,7 +141,7 @@ enum phm_master_table_flag {
 struct phm_master_table_header {
        uint32_t storage_size;
        uint32_t flags;
-       struct phm_master_table_item *master_list;
+       const struct phm_master_table_item *master_list;
 };
 
 struct phm_runtime_table_header {
@@ -199,7 +199,7 @@ extern int phm_dispatch_table(struct pp_hwmgr *hwmgr,
                              void *input, void *output);
 
 extern int phm_construct_table(struct pp_hwmgr *hwmgr,
-                              struct phm_master_table_header *master_table,
+                              const struct phm_master_table_header *master_table,
                               struct phm_runtime_table_header *rt_table);
 
 extern int phm_destroy_table(struct pp_hwmgr *hwmgr,
@@ -335,8 +335,9 @@ struct pp_hwmgr_func {
        int (*power_off_asic)(struct pp_hwmgr *hwmgr);
        int (*get_pp_table)(struct pp_hwmgr *hwmgr, char **table);
        int (*set_pp_table)(struct pp_hwmgr *hwmgr, const char *buf, size_t size);
-       int (*force_clock_level)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, int level);
+       int (*force_clock_level)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, uint32_t mask);
        int (*print_clock_levels)(struct pp_hwmgr *hwmgr, enum pp_clock_type type, char *buf);
+       int (*enable_per_cu_power_gating)(struct pp_hwmgr *hwmgr, bool enable);
 };
 
 struct pp_table_func {
@@ -499,7 +500,7 @@ struct phm_dynamic_state_info {
        struct phm_ppm_table                          *ppm_parameter_table;
        struct phm_cac_tdp_table                      *cac_dtp_table;
        struct phm_clock_voltage_dependency_table         *vdd_gfx_dependency_on_sclk;
-       struct phm_vq_budgeting_table                             *vq_budgeting_table;
+       struct phm_vq_budgeting_table                             *vq_budgeting_table;
 };
 
 struct pp_fan_info {
@@ -576,6 +577,7 @@ struct pp_hwmgr {
        void *device;
        struct pp_smumgr *smumgr;
        const void *soft_pp_table;
+       uint32_t soft_pp_table_size;
        bool need_pp_table_upload;
        enum amd_dpm_forced_level dpm_level;
        bool block_hw_access;
diff --git a/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h b/drivers/gpu/drm/amd/powerplay/inc/polaris10_ppsmc.h
new file mode 100644 (file)
index 0000000..0c6a413
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef POLARIS10_PP_SMC_H
+#define POLARIS10_PP_SMC_H
+
+
+#pragma pack(push, 1)
+
+
+#define PPSMC_SWSTATE_FLAG_DC                           0x01
+#define PPSMC_SWSTATE_FLAG_UVD                          0x02
+#define PPSMC_SWSTATE_FLAG_VCE                          0x04
+
+#define PPSMC_THERMAL_PROTECT_TYPE_INTERNAL             0x00
+#define PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL             0x01
+#define PPSMC_THERMAL_PROTECT_TYPE_NONE                 0xff
+
+#define PPSMC_SYSTEMFLAG_GPIO_DC                        0x01
+#define PPSMC_SYSTEMFLAG_STEPVDDC                       0x02
+#define PPSMC_SYSTEMFLAG_GDDR5                          0x04
+
+#define PPSMC_SYSTEMFLAG_DISABLE_BABYSTEP               0x08
+
+#define PPSMC_SYSTEMFLAG_REGULATOR_HOT                  0x10
+#define PPSMC_SYSTEMFLAG_REGULATOR_HOT_ANALOG           0x20
+
+#define PPSMC_EXTRAFLAGS_AC2DC_ACTION_MASK              0x07
+#define PPSMC_EXTRAFLAGS_AC2DC_DONT_WAIT_FOR_VBLANK     0x08
+
+#define PPSMC_EXTRAFLAGS_AC2DC_ACTION_GOTODPMLOWSTATE   0x00
+#define PPSMC_EXTRAFLAGS_AC2DC_ACTION_GOTOINITIALSTATE  0x01
+
+
+#define PPSMC_DPM2FLAGS_TDPCLMP                         0x01
+#define PPSMC_DPM2FLAGS_PWRSHFT                         0x02
+#define PPSMC_DPM2FLAGS_OCP                             0x04
+
+
+#define PPSMC_DISPLAY_WATERMARK_LOW                     0
+#define PPSMC_DISPLAY_WATERMARK_HIGH                    1
+
+
+#define PPSMC_STATEFLAG_AUTO_PULSE_SKIP    0x01
+#define PPSMC_STATEFLAG_POWERBOOST         0x02
+#define PPSMC_STATEFLAG_PSKIP_ON_TDP_FAULT 0x04
+#define PPSMC_STATEFLAG_POWERSHIFT         0x08
+#define PPSMC_STATEFLAG_SLOW_READ_MARGIN   0x10
+#define PPSMC_STATEFLAG_DEEPSLEEP_THROTTLE 0x20
+#define PPSMC_STATEFLAG_DEEPSLEEP_BYPASS   0x40
+
+
+#define FDO_MODE_HARDWARE 0
+#define FDO_MODE_PIECE_WISE_LINEAR 1
+
+enum FAN_CONTROL {
+       FAN_CONTROL_FUZZY,
+       FAN_CONTROL_TABLE
+};
+
+
+#define PPSMC_Result_OK             ((uint16_t)0x01)
+#define PPSMC_Result_NoMore         ((uint16_t)0x02)
+
+#define PPSMC_Result_NotNow         ((uint16_t)0x03)
+#define PPSMC_Result_Failed         ((uint16_t)0xFF)
+#define PPSMC_Result_UnknownCmd     ((uint16_t)0xFE)
+#define PPSMC_Result_UnknownVT      ((uint16_t)0xFD)
+
+typedef uint16_t PPSMC_Result;
+
+#define PPSMC_isERROR(x) ((uint16_t)0x80 & (x))
+
+
+#define PPSMC_MSG_Halt                      ((uint16_t)0x10)
+#define PPSMC_MSG_Resume                    ((uint16_t)0x11)
+#define PPSMC_MSG_EnableDPMLevel            ((uint16_t)0x12)
+#define PPSMC_MSG_ZeroLevelsDisabled        ((uint16_t)0x13)
+#define PPSMC_MSG_OneLevelsDisabled         ((uint16_t)0x14)
+#define PPSMC_MSG_TwoLevelsDisabled         ((uint16_t)0x15)
+#define PPSMC_MSG_EnableThermalInterrupt    ((uint16_t)0x16)
+#define PPSMC_MSG_RunningOnAC               ((uint16_t)0x17)
+#define PPSMC_MSG_LevelUp                   ((uint16_t)0x18)
+#define PPSMC_MSG_LevelDown                 ((uint16_t)0x19)
+#define PPSMC_MSG_ResetDPMCounters          ((uint16_t)0x1a)
+#define PPSMC_MSG_SwitchToSwState           ((uint16_t)0x20)
+#define PPSMC_MSG_SwitchToSwStateLast       ((uint16_t)0x3f)
+#define PPSMC_MSG_SwitchToInitialState      ((uint16_t)0x40)
+#define PPSMC_MSG_NoForcedLevel             ((uint16_t)0x41)
+#define PPSMC_MSG_ForceHigh                 ((uint16_t)0x42)
+#define PPSMC_MSG_ForceMediumOrHigh         ((uint16_t)0x43)
+#define PPSMC_MSG_SwitchToMinimumPower      ((uint16_t)0x51)
+#define PPSMC_MSG_ResumeFromMinimumPower    ((uint16_t)0x52)
+#define PPSMC_MSG_EnableCac                 ((uint16_t)0x53)
+#define PPSMC_MSG_DisableCac                ((uint16_t)0x54)
+#define PPSMC_DPMStateHistoryStart          ((uint16_t)0x55)
+#define PPSMC_DPMStateHistoryStop           ((uint16_t)0x56)
+#define PPSMC_CACHistoryStart               ((uint16_t)0x57)
+#define PPSMC_CACHistoryStop                ((uint16_t)0x58)
+#define PPSMC_TDPClampingActive             ((uint16_t)0x59)
+#define PPSMC_TDPClampingInactive           ((uint16_t)0x5A)
+#define PPSMC_StartFanControl               ((uint16_t)0x5B)
+#define PPSMC_StopFanControl                ((uint16_t)0x5C)
+#define PPSMC_NoDisplay                     ((uint16_t)0x5D)
+#define PPSMC_HasDisplay                    ((uint16_t)0x5E)
+#define PPSMC_MSG_UVDPowerOFF               ((uint16_t)0x60)
+#define PPSMC_MSG_UVDPowerON                ((uint16_t)0x61)
+#define PPSMC_MSG_EnableULV                 ((uint16_t)0x62)
+#define PPSMC_MSG_DisableULV                ((uint16_t)0x63)
+#define PPSMC_MSG_EnterULV                  ((uint16_t)0x64)
+#define PPSMC_MSG_ExitULV                   ((uint16_t)0x65)
+#define PPSMC_PowerShiftActive              ((uint16_t)0x6A)
+#define PPSMC_PowerShiftInactive            ((uint16_t)0x6B)
+#define PPSMC_OCPActive                     ((uint16_t)0x6C)
+#define PPSMC_OCPInactive                   ((uint16_t)0x6D)
+#define PPSMC_CACLongTermAvgEnable          ((uint16_t)0x6E)
+#define PPSMC_CACLongTermAvgDisable         ((uint16_t)0x6F)
+#define PPSMC_MSG_InferredStateSweep_Start  ((uint16_t)0x70)
+#define PPSMC_MSG_InferredStateSweep_Stop   ((uint16_t)0x71)
+#define PPSMC_MSG_SwitchToLowestInfState    ((uint16_t)0x72)
+#define PPSMC_MSG_SwitchToNonInfState       ((uint16_t)0x73)
+#define PPSMC_MSG_AllStateSweep_Start       ((uint16_t)0x74)
+#define PPSMC_MSG_AllStateSweep_Stop        ((uint16_t)0x75)
+#define PPSMC_MSG_SwitchNextLowerInfState   ((uint16_t)0x76)
+#define PPSMC_MSG_SwitchNextHigherInfState  ((uint16_t)0x77)
+#define PPSMC_MSG_MclkRetrainingTest        ((uint16_t)0x78)
+#define PPSMC_MSG_ForceTDPClamping          ((uint16_t)0x79)
+#define PPSMC_MSG_CollectCAC_PowerCorreln   ((uint16_t)0x7A)
+#define PPSMC_MSG_CollectCAC_WeightCalib    ((uint16_t)0x7B)
+#define PPSMC_MSG_CollectCAC_SQonly         ((uint16_t)0x7C)
+#define PPSMC_MSG_CollectCAC_TemperaturePwr ((uint16_t)0x7D)
+
+#define PPSMC_MSG_ExtremitiesTest_Start     ((uint16_t)0x7E)
+#define PPSMC_MSG_ExtremitiesTest_Stop      ((uint16_t)0x7F)
+#define PPSMC_FlushDataCache                ((uint16_t)0x80)
+#define PPSMC_FlushInstrCache               ((uint16_t)0x81)
+
+#define PPSMC_MSG_SetEnabledLevels          ((uint16_t)0x82)
+#define PPSMC_MSG_SetForcedLevels           ((uint16_t)0x83)
+
+#define PPSMC_MSG_ResetToDefaults           ((uint16_t)0x84)
+
+#define PPSMC_MSG_SetForcedLevelsAndJump      ((uint16_t)0x85)
+#define PPSMC_MSG_SetCACHistoryMode           ((uint16_t)0x86)
+#define PPSMC_MSG_EnableDTE                   ((uint16_t)0x87)
+#define PPSMC_MSG_DisableDTE                  ((uint16_t)0x88)
+
+#define PPSMC_MSG_SmcSpaceSetAddress          ((uint16_t)0x89)
+#define PPSM_MSG_SmcSpaceWriteDWordInc        ((uint16_t)0x8A)
+#define PPSM_MSG_SmcSpaceWriteWordInc         ((uint16_t)0x8B)
+#define PPSM_MSG_SmcSpaceWriteByteInc         ((uint16_t)0x8C)
+
+#define PPSMC_MSG_BREAK                       ((uint16_t)0xF8)
+
+#define PPSMC_MSG_Test                        ((uint16_t) 0x100)
+#define PPSMC_MSG_DPM_Voltage_Pwrmgt          ((uint16_t) 0x101)
+#define PPSMC_MSG_DPM_Config                  ((uint16_t) 0x102)
+#define PPSMC_MSG_PM_Controller_Start         ((uint16_t) 0x103)
+#define PPSMC_MSG_DPM_ForceState              ((uint16_t) 0x104)
+#define PPSMC_MSG_PG_PowerDownSIMD            ((uint16_t) 0x105)
+#define PPSMC_MSG_PG_PowerUpSIMD              ((uint16_t) 0x106)
+#define PPSMC_MSG_PM_Controller_Stop          ((uint16_t) 0x107)
+#define PPSMC_MSG_PG_SIMD_Config              ((uint16_t) 0x108)
+#define PPSMC_MSG_Voltage_Cntl_Enable         ((uint16_t) 0x109)
+#define PPSMC_MSG_Thermal_Cntl_Enable         ((uint16_t) 0x10a)
+#define PPSMC_MSG_Reset_Service               ((uint16_t) 0x10b)
+#define PPSMC_MSG_VCEPowerOFF                 ((uint16_t) 0x10e)
+#define PPSMC_MSG_VCEPowerON                  ((uint16_t) 0x10f)
+#define PPSMC_MSG_DPM_Disable_VCE_HS          ((uint16_t) 0x110)
+#define PPSMC_MSG_DPM_Enable_VCE_HS           ((uint16_t) 0x111)
+#define PPSMC_MSG_DPM_N_LevelsDisabled        ((uint16_t) 0x112)
+#define PPSMC_MSG_DCEPowerOFF                 ((uint16_t) 0x113)
+#define PPSMC_MSG_DCEPowerON                  ((uint16_t) 0x114)
+#define PPSMC_MSG_PCIE_DDIPowerDown           ((uint16_t) 0x117)
+#define PPSMC_MSG_PCIE_DDIPowerUp             ((uint16_t) 0x118)
+#define PPSMC_MSG_PCIE_CascadePLLPowerDown    ((uint16_t) 0x119)
+#define PPSMC_MSG_PCIE_CascadePLLPowerUp      ((uint16_t) 0x11a)
+#define PPSMC_MSG_SYSPLLPowerOff              ((uint16_t) 0x11b)
+#define PPSMC_MSG_SYSPLLPowerOn               ((uint16_t) 0x11c)
+#define PPSMC_MSG_DCE_RemoveVoltageAdjustment ((uint16_t) 0x11d)
+#define PPSMC_MSG_DCE_AllowVoltageAdjustment  ((uint16_t) 0x11e)
+#define PPSMC_MSG_DISPLAYPHYStatusNotify      ((uint16_t) 0x11f)
+#define PPSMC_MSG_EnableBAPM                  ((uint16_t) 0x120)
+#define PPSMC_MSG_DisableBAPM                 ((uint16_t) 0x121)
+#define PPSMC_MSG_Spmi_Enable                 ((uint16_t) 0x122)
+#define PPSMC_MSG_Spmi_Timer                  ((uint16_t) 0x123)
+#define PPSMC_MSG_LCLK_DPM_Config             ((uint16_t) 0x124)
+#define PPSMC_MSG_VddNB_Request               ((uint16_t) 0x125)
+#define PPSMC_MSG_PCIE_DDIPhyPowerDown        ((uint32_t) 0x126)
+#define PPSMC_MSG_PCIE_DDIPhyPowerUp          ((uint32_t) 0x127)
+#define PPSMC_MSG_MCLKDPM_Config              ((uint16_t) 0x128)
+
+#define PPSMC_MSG_UVDDPM_Config               ((uint16_t) 0x129)
+#define PPSMC_MSG_VCEDPM_Config               ((uint16_t) 0x12A)
+#define PPSMC_MSG_ACPDPM_Config               ((uint16_t) 0x12B)
+#define PPSMC_MSG_SAMUDPM_Config              ((uint16_t) 0x12C)
+#define PPSMC_MSG_UVDDPM_SetEnabledMask       ((uint16_t) 0x12D)
+#define PPSMC_MSG_VCEDPM_SetEnabledMask       ((uint16_t) 0x12E)
+#define PPSMC_MSG_ACPDPM_SetEnabledMask       ((uint16_t) 0x12F)
+#define PPSMC_MSG_SAMUDPM_SetEnabledMask      ((uint16_t) 0x130)
+#define PPSMC_MSG_MCLKDPM_ForceState          ((uint16_t) 0x131)
+#define PPSMC_MSG_MCLKDPM_NoForcedLevel       ((uint16_t) 0x132)
+#define PPSMC_MSG_Thermal_Cntl_Disable        ((uint16_t) 0x133)
+#define PPSMC_MSG_SetTDPLimit                 ((uint16_t) 0x134)
+#define PPSMC_MSG_Voltage_Cntl_Disable        ((uint16_t) 0x135)
+#define PPSMC_MSG_PCIeDPM_Enable              ((uint16_t) 0x136)
+#define PPSMC_MSG_ACPPowerOFF                 ((uint16_t) 0x137)
+#define PPSMC_MSG_ACPPowerON                  ((uint16_t) 0x138)
+#define PPSMC_MSG_SAMPowerOFF                 ((uint16_t) 0x139)
+#define PPSMC_MSG_SAMPowerON                  ((uint16_t) 0x13a)
+#define PPSMC_MSG_SDMAPowerOFF                ((uint16_t) 0x13b)
+#define PPSMC_MSG_SDMAPowerON                 ((uint16_t) 0x13c)
+#define PPSMC_MSG_PCIeDPM_Disable             ((uint16_t) 0x13d)
+#define PPSMC_MSG_IOMMUPowerOFF               ((uint16_t) 0x13e)
+#define PPSMC_MSG_IOMMUPowerON                ((uint16_t) 0x13f)
+#define PPSMC_MSG_NBDPM_Enable                ((uint16_t) 0x140)
+#define PPSMC_MSG_NBDPM_Disable               ((uint16_t) 0x141)
+#define PPSMC_MSG_NBDPM_ForceNominal          ((uint16_t) 0x142)
+#define PPSMC_MSG_NBDPM_ForcePerformance      ((uint16_t) 0x143)
+#define PPSMC_MSG_NBDPM_UnForce               ((uint16_t) 0x144)
+#define PPSMC_MSG_SCLKDPM_SetEnabledMask      ((uint16_t) 0x145)
+#define PPSMC_MSG_MCLKDPM_SetEnabledMask      ((uint16_t) 0x146)
+#define PPSMC_MSG_PCIeDPM_ForceLevel          ((uint16_t) 0x147)
+#define PPSMC_MSG_PCIeDPM_UnForceLevel        ((uint16_t) 0x148)
+#define PPSMC_MSG_EnableACDCGPIOInterrupt     ((uint16_t) 0x149)
+#define PPSMC_MSG_EnableVRHotGPIOInterrupt    ((uint16_t) 0x14a)
+#define PPSMC_MSG_SwitchToAC                  ((uint16_t) 0x14b)
+#define PPSMC_MSG_XDMAPowerOFF                ((uint16_t) 0x14c)
+#define PPSMC_MSG_XDMAPowerON                 ((uint16_t) 0x14d)
+
+#define PPSMC_MSG_DPM_Enable                  ((uint16_t) 0x14e)
+#define PPSMC_MSG_DPM_Disable                 ((uint16_t) 0x14f)
+#define PPSMC_MSG_MCLKDPM_Enable              ((uint16_t) 0x150)
+#define PPSMC_MSG_MCLKDPM_Disable             ((uint16_t) 0x151)
+#define PPSMC_MSG_LCLKDPM_Enable              ((uint16_t) 0x152)
+#define PPSMC_MSG_LCLKDPM_Disable             ((uint16_t) 0x153)
+#define PPSMC_MSG_UVDDPM_Enable               ((uint16_t) 0x154)
+#define PPSMC_MSG_UVDDPM_Disable              ((uint16_t) 0x155)
+#define PPSMC_MSG_SAMUDPM_Enable              ((uint16_t) 0x156)
+#define PPSMC_MSG_SAMUDPM_Disable             ((uint16_t) 0x157)
+#define PPSMC_MSG_ACPDPM_Enable               ((uint16_t) 0x158)
+#define PPSMC_MSG_ACPDPM_Disable              ((uint16_t) 0x159)
+#define PPSMC_MSG_VCEDPM_Enable               ((uint16_t) 0x15a)
+#define PPSMC_MSG_VCEDPM_Disable              ((uint16_t) 0x15b)
+#define PPSMC_MSG_LCLKDPM_SetEnabledMask      ((uint16_t) 0x15c)
+#define PPSMC_MSG_DPM_FPS_Mode                ((uint16_t) 0x15d)
+#define PPSMC_MSG_DPM_Activity_Mode           ((uint16_t) 0x15e)
+#define PPSMC_MSG_VddC_Request                ((uint16_t) 0x15f)
+#define PPSMC_MSG_MCLKDPM_GetEnabledMask      ((uint16_t) 0x160)
+#define PPSMC_MSG_LCLKDPM_GetEnabledMask      ((uint16_t) 0x161)
+#define PPSMC_MSG_SCLKDPM_GetEnabledMask      ((uint16_t) 0x162)
+#define PPSMC_MSG_UVDDPM_GetEnabledMask       ((uint16_t) 0x163)
+#define PPSMC_MSG_SAMUDPM_GetEnabledMask      ((uint16_t) 0x164)
+#define PPSMC_MSG_ACPDPM_GetEnabledMask       ((uint16_t) 0x165)
+#define PPSMC_MSG_VCEDPM_GetEnabledMask       ((uint16_t) 0x166)
+#define PPSMC_MSG_PCIeDPM_SetEnabledMask      ((uint16_t) 0x167)
+#define PPSMC_MSG_PCIeDPM_GetEnabledMask      ((uint16_t) 0x168)
+#define PPSMC_MSG_TDCLimitEnable              ((uint16_t) 0x169)
+#define PPSMC_MSG_TDCLimitDisable             ((uint16_t) 0x16a)
+#define PPSMC_MSG_DPM_AutoRotate_Mode         ((uint16_t) 0x16b)
+#define PPSMC_MSG_DISPCLK_FROM_FCH            ((uint16_t) 0x16c)
+#define PPSMC_MSG_DISPCLK_FROM_DFS            ((uint16_t) 0x16d)
+#define PPSMC_MSG_DPREFCLK_FROM_FCH           ((uint16_t) 0x16e)
+#define PPSMC_MSG_DPREFCLK_FROM_DFS           ((uint16_t) 0x16f)
+#define PPSMC_MSG_PmStatusLogStart            ((uint16_t) 0x170)
+#define PPSMC_MSG_PmStatusLogSample           ((uint16_t) 0x171)
+#define PPSMC_MSG_SCLK_AutoDPM_ON             ((uint16_t) 0x172)
+#define PPSMC_MSG_MCLK_AutoDPM_ON             ((uint16_t) 0x173)
+#define PPSMC_MSG_LCLK_AutoDPM_ON             ((uint16_t) 0x174)
+#define PPSMC_MSG_UVD_AutoDPM_ON              ((uint16_t) 0x175)
+#define PPSMC_MSG_SAMU_AutoDPM_ON             ((uint16_t) 0x176)
+#define PPSMC_MSG_ACP_AutoDPM_ON              ((uint16_t) 0x177)
+#define PPSMC_MSG_VCE_AutoDPM_ON              ((uint16_t) 0x178)
+#define PPSMC_MSG_PCIe_AutoDPM_ON             ((uint16_t) 0x179)
+#define PPSMC_MSG_MASTER_AutoDPM_ON           ((uint16_t) 0x17a)
+#define PPSMC_MSG_MASTER_AutoDPM_OFF          ((uint16_t) 0x17b)
+#define PPSMC_MSG_DYNAMICDISPPHYPOWER         ((uint16_t) 0x17c)
+#define PPSMC_MSG_CAC_COLLECTION_ON           ((uint16_t) 0x17d)
+#define PPSMC_MSG_CAC_COLLECTION_OFF          ((uint16_t) 0x17e)
+#define PPSMC_MSG_CAC_CORRELATION_ON          ((uint16_t) 0x17f)
+#define PPSMC_MSG_CAC_CORRELATION_OFF         ((uint16_t) 0x180)
+#define PPSMC_MSG_PM_STATUS_TO_DRAM_ON        ((uint16_t) 0x181)
+#define PPSMC_MSG_PM_STATUS_TO_DRAM_OFF       ((uint16_t) 0x182)
+#define PPSMC_MSG_ALLOW_LOWSCLK_INTERRUPT     ((uint16_t) 0x184)
+#define PPSMC_MSG_PkgPwrLimitEnable           ((uint16_t) 0x185)
+#define PPSMC_MSG_PkgPwrLimitDisable          ((uint16_t) 0x186)
+#define PPSMC_MSG_PkgPwrSetLimit              ((uint16_t) 0x187)
+#define PPSMC_MSG_OverDriveSetTargetTdp       ((uint16_t) 0x188)
+#define PPSMC_MSG_SCLKDPM_FreezeLevel         ((uint16_t) 0x189)
+#define PPSMC_MSG_SCLKDPM_UnfreezeLevel       ((uint16_t) 0x18A)
+#define PPSMC_MSG_MCLKDPM_FreezeLevel         ((uint16_t) 0x18B)
+#define PPSMC_MSG_MCLKDPM_UnfreezeLevel       ((uint16_t) 0x18C)
+#define PPSMC_MSG_START_DRAM_LOGGING          ((uint16_t) 0x18D)
+#define PPSMC_MSG_STOP_DRAM_LOGGING           ((uint16_t) 0x18E)
+#define PPSMC_MSG_MASTER_DeepSleep_ON         ((uint16_t) 0x18F)
+#define PPSMC_MSG_MASTER_DeepSleep_OFF        ((uint16_t) 0x190)
+#define PPSMC_MSG_Remove_DC_Clamp             ((uint16_t) 0x191)
+#define PPSMC_MSG_DisableACDCGPIOInterrupt    ((uint16_t) 0x192)
+#define PPSMC_MSG_OverrideVoltageControl_SetVddc       ((uint16_t) 0x193)
+#define PPSMC_MSG_OverrideVoltageControl_SetVddci      ((uint16_t) 0x194)
+#define PPSMC_MSG_SetVidOffset_1              ((uint16_t) 0x195)
+#define PPSMC_MSG_SetVidOffset_2              ((uint16_t) 0x207)
+#define PPSMC_MSG_GetVidOffset_1              ((uint16_t) 0x196)
+#define PPSMC_MSG_GetVidOffset_2              ((uint16_t) 0x208)
+#define PPSMC_MSG_THERMAL_OVERDRIVE_Enable    ((uint16_t) 0x197)
+#define PPSMC_MSG_THERMAL_OVERDRIVE_Disable   ((uint16_t) 0x198)
+#define PPSMC_MSG_SetTjMax                    ((uint16_t) 0x199)
+#define PPSMC_MSG_SetFanPwmMax                ((uint16_t) 0x19A)
+#define PPSMC_MSG_WaitForMclkSwitchFinish     ((uint16_t) 0x19B)
+#define PPSMC_MSG_ENABLE_THERMAL_DPM          ((uint16_t) 0x19C)
+#define PPSMC_MSG_DISABLE_THERMAL_DPM         ((uint16_t) 0x19D)
+
+#define PPSMC_MSG_API_GetSclkFrequency        ((uint16_t) 0x200)
+#define PPSMC_MSG_API_GetMclkFrequency        ((uint16_t) 0x201)
+#define PPSMC_MSG_API_GetSclkBusy             ((uint16_t) 0x202)
+#define PPSMC_MSG_API_GetMclkBusy             ((uint16_t) 0x203)
+#define PPSMC_MSG_API_GetAsicPower            ((uint16_t) 0x204)
+#define PPSMC_MSG_SetFanRpmMax                ((uint16_t) 0x205)
+#define PPSMC_MSG_SetFanSclkTarget            ((uint16_t) 0x206)
+#define PPSMC_MSG_SetFanMinPwm                ((uint16_t) 0x209)
+#define PPSMC_MSG_SetFanTemperatureTarget     ((uint16_t) 0x20A)
+
+#define PPSMC_MSG_BACO_StartMonitor           ((uint16_t) 0x240)
+#define PPSMC_MSG_BACO_Cancel                 ((uint16_t) 0x241)
+#define PPSMC_MSG_EnableVddGfx                ((uint16_t) 0x242)
+#define PPSMC_MSG_DisableVddGfx               ((uint16_t) 0x243)
+#define PPSMC_MSG_UcodeAddressLow             ((uint16_t) 0x244)
+#define PPSMC_MSG_UcodeAddressHigh            ((uint16_t) 0x245)
+#define PPSMC_MSG_UcodeLoadStatus             ((uint16_t) 0x246)
+
+#define PPSMC_MSG_DRV_DRAM_ADDR_HI            ((uint16_t) 0x250)
+#define PPSMC_MSG_DRV_DRAM_ADDR_LO            ((uint16_t) 0x251)
+#define PPSMC_MSG_SMU_DRAM_ADDR_HI            ((uint16_t) 0x252)
+#define PPSMC_MSG_SMU_DRAM_ADDR_LO            ((uint16_t) 0x253)
+#define PPSMC_MSG_LoadUcodes                  ((uint16_t) 0x254)
+#define PPSMC_MSG_PowerStateNotify            ((uint16_t) 0x255)
+#define PPSMC_MSG_COND_EXEC_DRAM_ADDR_HI      ((uint16_t) 0x256)
+#define PPSMC_MSG_COND_EXEC_DRAM_ADDR_LO      ((uint16_t) 0x257)
+#define PPSMC_MSG_VBIOS_DRAM_ADDR_HI          ((uint16_t) 0x258)
+#define PPSMC_MSG_VBIOS_DRAM_ADDR_LO          ((uint16_t) 0x259)
+#define PPSMC_MSG_LoadVBios                   ((uint16_t) 0x25A)
+#define PPSMC_MSG_GetUcodeVersion             ((uint16_t) 0x25B)
+#define DMCUSMC_MSG_PSREntry                  ((uint16_t) 0x25C)
+#define DMCUSMC_MSG_PSRExit                   ((uint16_t) 0x25D)
+#define PPSMC_MSG_EnableClockGatingFeature    ((uint16_t) 0x260)
+#define PPSMC_MSG_DisableClockGatingFeature   ((uint16_t) 0x261)
+#define PPSMC_MSG_IsDeviceRunning             ((uint16_t) 0x262)
+#define PPSMC_MSG_LoadMetaData                ((uint16_t) 0x263)
+#define PPSMC_MSG_TMON_AutoCaliberate_Enable  ((uint16_t) 0x264)
+#define PPSMC_MSG_TMON_AutoCaliberate_Disable ((uint16_t) 0x265)
+#define PPSMC_MSG_GetTelemetry1Slope          ((uint16_t) 0x266)
+#define PPSMC_MSG_GetTelemetry1Offset         ((uint16_t) 0x267)
+#define PPSMC_MSG_GetTelemetry2Slope          ((uint16_t) 0x268)
+#define PPSMC_MSG_GetTelemetry2Offset         ((uint16_t) 0x269)
+#define PPSMC_MSG_EnableAvfs                  ((uint16_t) 0x26A)
+#define PPSMC_MSG_DisableAvfs                 ((uint16_t) 0x26B)
+
+#define PPSMC_MSG_PerformBtc                  ((uint16_t) 0x26C)
+#define PPSMC_MSG_VftTableIsValid             ((uint16_t) 0x275)
+#define PPSMC_MSG_UseNewGPIOScheme            ((uint16_t) 0x277)
+#define PPSMC_MSG_GetEnabledPsm               ((uint16_t) 0x400)
+#define PPSMC_MSG_AgmStartPsm                 ((uint16_t) 0x401)
+#define PPSMC_MSG_AgmReadPsm                  ((uint16_t) 0x402)
+#define PPSMC_MSG_AgmResetPsm                 ((uint16_t) 0x403)
+#define PPSMC_MSG_ReadVftCell                 ((uint16_t) 0x404)
+
+#define PPSMC_MSG_GFX_CU_PG_ENABLE            ((uint16_t) 0x280)
+#define PPSMC_MSG_GFX_CU_PG_DISABLE           ((uint16_t) 0x281)
+#define PPSMC_MSG_GetCurrPkgPwr               ((uint16_t) 0x282)
+
+#define PPSMC_MSG_SetGpuPllDfsForSclk         ((uint16_t) 0x300)
+#define PPSMC_MSG_Didt_Block_Function            ((uint16_t) 0x301)
+
+#define PPSMC_MSG_SecureSRBMWrite             ((uint16_t) 0x600)
+#define PPSMC_MSG_SecureSRBMRead              ((uint16_t) 0x601)
+#define PPSMC_MSG_SetAddress                  ((uint16_t) 0x800)
+#define PPSMC_MSG_GetData                     ((uint16_t) 0x801)
+#define PPSMC_MSG_SetData                     ((uint16_t) 0x802)
+
+typedef uint16_t PPSMC_Msg;
+
+#define PPSMC_EVENT_STATUS_THERMAL          0x00000001
+#define PPSMC_EVENT_STATUS_REGULATORHOT     0x00000002
+#define PPSMC_EVENT_STATUS_DC               0x00000004
+
+#pragma pack(pop)
+
+#endif
+
diff --git a/drivers/gpu/drm/amd/powerplay/inc/polaris10_pwrvirus.h b/drivers/gpu/drm/amd/powerplay/inc/polaris10_pwrvirus.h
new file mode 100644 (file)
index 0000000..f497e7d
--- /dev/null
@@ -0,0 +1,10088 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+#ifndef _POLARIS10_PWRVIRUS_H
+#define _POLARIS10_PWRVIRUS_H
+
+#define mmSMC_IND_INDEX_11                              0x01AC
+#define mmSMC_IND_DATA_11                               0x01AD
+#define mmCP_HYP_MEC1_UCODE_ADDR       0xf81a
+#define mmCP_HYP_MEC1_UCODE_DATA       0xf81b
+#define mmCP_HYP_MEC2_UCODE_ADDR       0xf81c
+#define mmCP_HYP_MEC2_UCODE_DATA       0xf81d
+
+enum PWR_Command {
+       PwrCmdNull = 0,
+       PwrCmdWrite,
+       PwrCmdEnd,
+       PwrCmdMax
+};
+
+typedef enum PWR_Command PWR_Command;
+
+struct PWR_Command_Table {
+       PWR_Command        command;
+       uint32_t              data;
+       uint32_t reg;
+};
+
+typedef struct PWR_Command_Table PWR_Command_Table;
+
+
+#define PWR_VIRUS_TABLE_SIZE  10031
+
+static const PWR_Command_Table pwr_virus_table[PWR_VIRUS_TABLE_SIZE] = {
+       { PwrCmdWrite, 0x00000000, mmRLC_CNTL                                 },
+       { PwrCmdWrite, 0x00000002, mmRLC_SRM_CNTL                             },
+       { PwrCmdWrite, 0x15000000, mmCP_ME_CNTL                               },
+       { PwrCmdWrite, 0x50000000, mmCP_MEC_CNTL                              },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x0840800a, mmCP_RB0_CNTL                              },
+       { PwrCmdWrite, 0xf30fff0f, mmTCC_CTRL                                 },
+       { PwrCmdWrite, 0x00000002, mmTCC_EXE_DISABLE                          },
+       { PwrCmdWrite, 0x000000ff, mmTCP_ADDR_CONFIG                          },
+       { PwrCmdWrite, 0x540ff000, mmCP_CPC_IC_BASE_LO                        },
+       { PwrCmdWrite, 0x000000b4, mmCP_CPC_IC_BASE_HI                        },
+       { PwrCmdWrite, 0x00010000, mmCP_HYP_MEC1_UCODE_ADDR                   },
+       { PwrCmdWrite, 0x00041b75, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000710e8, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000910dd, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000a1081, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000b016f, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000c0e3c, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000d10ec, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000e0188, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00101b5d, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00150a6c, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00170c5e, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x001d0c8c, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x001e0cfe, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00221408, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00370d7b, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00390dcb, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x003c142f, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x003f0b27, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00400e63, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00500f62, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00460fa7, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00490fa7, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005811d4, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00680ad6, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00760b00, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00780b0c, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00790af7, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x007d1aba, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x007e1abe, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00591260, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005a12fb, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00861ac7, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x008c1b01, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x008d1b34, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a014b9, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a1152e, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a216fb, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a41890, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a31906, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a50b14, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00621387, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005c0b27, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00160a75, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC1_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00010000, mmCP_HYP_MEC2_UCODE_ADDR                   },
+       { PwrCmdWrite, 0x00041b75, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000710e8, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000910dd, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000a1081, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000b016f, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000c0e3c, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000d10ec, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000e0188, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00101b5d, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00150a6c, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00170c5e, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x001d0c8c, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x001e0cfe, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00221408, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00370d7b, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00390dcb, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x003c142f, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x003f0b27, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00400e63, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00500f62, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00460fa7, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00490fa7, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005811d4, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00680ad6, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00760b00, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00780b0c, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00790af7, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x007d1aba, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x007e1abe, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00591260, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005a12fb, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00861ac7, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x008c1b01, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x008d1b34, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a014b9, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a1152e, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a216fb, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a41890, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a31906, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00a50b14, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00621387, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x005c0b27, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x00160a75, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x000f016a, mmCP_HYP_MEC2_UCODE_DATA                   },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x540fe800, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0x7e000200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e020201, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e040204, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e060205, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a080500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a0a0303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbf810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54106f00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000400b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00004000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00804fac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x540fef00, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0xc0031502, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00001e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x540ff000, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000145, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdcc10000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd010000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd410000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080061, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24ccffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3cd08000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1cd0ffcf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d018001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x050c0019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x84c00000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000067, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000006a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000006d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000008f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000099, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800000a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800000af, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x388c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08880002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98800003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000002d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28080001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d808001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc180000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc080000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc0700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d10ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d10c017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0d000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd0130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14cc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c00036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000005d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14d00011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c01b10, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00e0080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000013b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00e0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000013b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x280c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00052, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28180039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x280c0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00052, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28180039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x280c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00052, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28180039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000069, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28080001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca88004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc00006f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000013b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28180080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d10c017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd0130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000013b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd4c0380, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdcc0388, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55dc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdcc038c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce0c0390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce0c0394, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce4c0398, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce4c039c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce8c03a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56a80020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce8c03a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcecc03a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcecc03ac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf0c03b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf0c03b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4c03b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57740020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4c03bc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8c03c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57b80020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8c03c4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfcc03c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57fc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfcc03cc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05dc002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc12009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d200a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc012009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25e01c00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25e40300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25e800c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25ec003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e25c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de5c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xddc10000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02ee000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31100006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc1c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4df0388, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d7038c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d5dc01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4e30390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d70394, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d62001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4e70398, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d7039c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d66401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4eb03a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d6a801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ef03a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703ac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d6ec01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4f303b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d73001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4f703b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703bc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d77401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4fb03c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703c4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d7b801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ff03c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d703cc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d7fc01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc080000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4d70380, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1c88001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0e0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc01e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3cd00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0085, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc006a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc01e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3cd00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc180000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc080000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1c88001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc180000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc080000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400051, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04180018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aac0027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80002f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04080002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08880001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000367, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9880fff3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04080010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08880001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80c0309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80c0319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9880fffc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00e0100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d4001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x155c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e80180, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202c003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000bfc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900091a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05280196, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d4fe04, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800001b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000032b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000350, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000352, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000035f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000701, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000047c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000019f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d98001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0044, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9400036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40005b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40005d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840006d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11540015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a4003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1998003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af0007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1264001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15dc000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d65400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a38003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd5c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7df1c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800045, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411326a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc415326b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293279, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000056, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00059, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c8000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40005a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29988000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000073, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25140fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001b6d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153279, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd00005f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000075, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26f00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15100010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d190004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af07fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001427, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4412e01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0434001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4412e40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04343000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf413267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd1c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0160, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc810001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b4c0057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b700213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b740199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f4f400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55180020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2198003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x248dfffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc12e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af4007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33740003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26d80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ae8003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26680001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253348, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413348, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253348, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x958000d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000315, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04303000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26680001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b342010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1714000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25540800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x459801b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d77400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x199c01e2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e4002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e5c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e540002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc80c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54d00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000282, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc80c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54d00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000282, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000282, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc80c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1334e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01334f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd413350, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813351, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd881334d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3271, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153274, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50cc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cdcc011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05900008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd00006a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0006b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3272, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d594002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54d00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc12e23, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd012e24, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc12e25, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15540002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b340057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b280213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980198, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e40020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20cc003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113274, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01e0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2d540002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x078c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07d40000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001239, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04f80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x057c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd5c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840007c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400069, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c018a6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4412e22, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800007c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c018a2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd4c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680fffc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800002e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800002e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000069, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9540188f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc013cfff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x38d00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdcc30000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c01882, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000304, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x49980198, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e40020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x459801a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04302000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000329, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc812e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04302000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16ec001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1998003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce00000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a18003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4093249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1888003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000671, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419324c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1598001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14d80011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24dc00ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31e00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31dc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c00036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95801827, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14dc0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800006d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51dc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a0000ad, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04080000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af4003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740004d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca88005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24880001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f4b4009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313274, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d33400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a4004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1eecffdd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800003c3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aa80030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a8004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3272, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19e80042, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e8e800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de9c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3271, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50cc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ce8c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd30011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11e80007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd300001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240059, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1660001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e320009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0328000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e72400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0430000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02ac000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d310002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa87600, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280222, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4280058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x22ec003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8380018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57b00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04343108, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13740008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2374007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32a80003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ec0057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e40213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc0199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cecc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ce4c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800003e7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980104, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x49980104, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800003f2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000448, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813279, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf41326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x254c0700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a641fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0726, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a640200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1237b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2264003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8813260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4280034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001427, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c01755, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde830000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0174c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bb80040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100044, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19180024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x551c003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000043d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c8000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840006c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28200000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000043f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x282000f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x195c00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2555fff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0360001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5e124dc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e624001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80fff9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02ee000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2555fff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980158, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x49980158, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980170, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16200010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x195400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1154000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e80488, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0006c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18f807f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e40077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ec0199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6e400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000048e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000494, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004de, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000685, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000686, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800006ac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ccc001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1264000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d79400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e7a400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52a8001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d69401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202c007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aec0028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004cc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419324e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26e8003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aec003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12f4000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d324d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d75401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d290004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f8f4001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f52800f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50e00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004d1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0dc002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x6665fc00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1c011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a644000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f534002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x6665fc00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e76401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004d7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aec003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3257, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12f4000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d75401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1c011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a644000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202c003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e804e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004e7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800004f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000505, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x277401ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf41325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000671, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640fff4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17e00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84131db, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b301ff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26edf000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8413260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05a80507, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000050c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000528, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000057d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800005c2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800005f3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000671, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bd400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c004d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d150005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00063b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2511fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000624, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1be00fe4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000066, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400068, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000671, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bd400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c004d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d150005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400067, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00063b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2511fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000624, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bd400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ed6c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113271, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193272, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d51401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113274, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253276, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400061, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2730000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7db1800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00062, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000063, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400065, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc820001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b700057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b680213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b740199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46ec0188, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17e00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26e01000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c131fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x191807e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x192007ec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1334a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x69dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de20014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x561c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013344, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13345, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425334d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419334e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d334f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213350, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253351, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b680057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b700213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b740199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46ec01b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800068, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2010007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1910003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd00001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd00001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2010003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x191807e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9540000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2511fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1334a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013344, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013345, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180050, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0052, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280042, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813273, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13275, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000068, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400067, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07d40000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00124f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x057c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b680057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b700213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b740199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc820001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46ec0190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2154003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bd800e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd80005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420004d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1e000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28340001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f598004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1be800e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801327a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800005f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000075, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424004c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a4004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x277401ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf41325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xda000068, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113277, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9540002d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1334a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425334d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419334e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d334f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213350, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253351, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b680057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b700213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b740199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46ec01b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1334a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1be000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0360001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc63124dc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e724001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80fff9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02ee000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fc14001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x194c1c03, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc0003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c002d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000697, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x194c00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c004c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27301fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce00005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cf0c00d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0007e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b301ff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25100007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31100005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900008e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000075e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202c007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a9feff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1374000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1774000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d30b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce813265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00ac006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00e0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28880700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0006de, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14cc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30d4000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41530b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19980028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800006c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15600008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8380023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fa38011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1a0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x282c2002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e280008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd3800025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202400d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca48001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d8003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x194c00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c004c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27301fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce00005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cf0c00d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000712, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x194c1c03, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc0003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c002d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e80714, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000071c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000720, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000747, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000071d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800007c4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000732, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000745, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000744, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000072e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0007e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a64008c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b301fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000075e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0fff1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0007e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000723, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41f02f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000743, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8813247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0ffde, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000072e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0007e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15600008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84131db, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b301ff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8413260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc8000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x195800e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd80005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418004c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dd7fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1a001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46200200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04283247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af80057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af40213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6f400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2000025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc6990000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x329c325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x329c3269, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x329c3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01defff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d8009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000078a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fff2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03e7ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3f0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1f30001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03e4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001219, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d30b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bf0003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000b80, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x203c003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf0130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46200008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2000025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31dc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ec0057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e40213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc0199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cecc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ce4c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000448, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31980002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19580066, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15600008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0120001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11980003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da18001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d24db, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580137b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00ee000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113269, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19080070, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x190c00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2518000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05a80809, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000080e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000080f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000898, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000946, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800009e1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04a80811, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000815, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000834, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000085e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000085e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04341001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3045, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c091, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31300021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84002f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293059, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56a8001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000241, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000084a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02f0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4252087, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5668001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000084a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04341001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431ecaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02e0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31300021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84002f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293059, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56a8001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00021d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd410000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84802e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001a41, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43b02f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec80278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56f00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001608, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8813247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80802e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000085e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x950001fa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02e0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aec0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a40006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de6000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10e40008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e2e000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d10ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2110003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d10ff9e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0245301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801325f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0121fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29108eff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e524009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0127ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e524009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0131fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e524009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013279, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000866, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000866, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0100010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd2400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0180003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd1c002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000866, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04a8089a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000089e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800008fa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000945, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000945, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31300022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04183000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d91801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x459801e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2738000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b342010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x172c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef7400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc79d3300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc7a13301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8393300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0260001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce793301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x964012a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c028009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800008d2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x242c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02620c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0260400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6e400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae8001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2f0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800008d2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdf93300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce393301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04182000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000903, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31240022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ec30011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32f80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x67180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bfc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd981325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000915, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c1325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0fff6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f818001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001606, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d838001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16240014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a2801f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e2a000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2264003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00075e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x66d80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1330000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13f40014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33e80010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680ffec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04a80948, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000094c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000099b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800009e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800009e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04183000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d91801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x459801e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2738000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b342010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x172c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef7400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc79d3300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc7a13301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8393300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0260001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce793301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x964011fe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c028009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000978, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x242c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0260010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0260800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6e400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae8001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2f0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000978, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdf93300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce393301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04182000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dda801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e838011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84802e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001802, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x469c0390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04183000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b342010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x172c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef7400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4280011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04182000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0014df, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31280014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce8802ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800062, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31280034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04a809e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800009ec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a45, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a59, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a59, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d91801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a70250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e72401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b342010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x172c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b30c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef7400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x66740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04383000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b38007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33b40003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x4598001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740002f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4002eb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4002ec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4002ed, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4002ee, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04382000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd84802e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001715, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04382000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffbc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04341001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431ecaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a55, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x233c0032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf0130b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49302ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8413247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5198001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193269, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2598000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80002f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53b8001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7db9801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000a5e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c01106, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e02, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e03, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c010fd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ce4c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc80c0072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x58e801fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc01e2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e4002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e5c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e540002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9540000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x44cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55900020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x44cc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd812e01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd012e02, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd412e03, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2264003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1e64001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14d00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ab1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a0010ac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd880003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010de, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc010ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d403f7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0cc009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41b0367, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d958004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d85800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc1e0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d001fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05280adc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000af1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000adf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ae7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000ace, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd8d2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d803f7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc010ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0cc009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11940014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29544001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29544003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000af4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd44d2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd44dc000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000ace, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd8d2c00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000b0a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd44d2c00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28148004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4593240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0105e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2198003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x199c0034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef3400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14e80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a8000af, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c01043, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a01fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3620005c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2464003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc6290ce7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16ac001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ac003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ee6c00d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00fff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000367, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640102e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x199c0037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a00035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0005d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16f8001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9780000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc035f0ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e764009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19b401f8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13740008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e76400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x199c0034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ae4003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000b7c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aec003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a4003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12ec001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1374000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02e4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1774000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc01e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13fc0018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dbd800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d98ff15, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x592c00fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd80000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12e00016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x592c007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12e00015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1264001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1620000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e32000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12e4001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5924007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a4003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013257, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd413258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00fdb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9780f5ca, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001219, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001b6d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d324e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431324d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07740003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x269c003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e4004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f67000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f674002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53740002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab42010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab8c006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a8000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b740000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf40001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000bec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000b47, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b34060b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec00ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a8004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc415325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18580037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x262001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d54001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14f00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd280200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd680208, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcda80210, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc6930200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc6970208, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc69b0210, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd900003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd940003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9400040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010de, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14fc0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24f800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd88130b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d83c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4093249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1888003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000671, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419324c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1598001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14d80011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24e000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x321c0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580ffee, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c30, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9480000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800f29, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800f23, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c00036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800f1a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9600f502, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0f500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000f05, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1f30001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16e4001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640f4f4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33740002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40f4f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aec003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12ec001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1374000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02e4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1774000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00ac005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00e0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc8000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28884900, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ff3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400ee1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c40a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c40c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c40d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d0007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15580010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x255400ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c411, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c40f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c40e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c410, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e80033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ec0034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c414, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c415, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c413, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c412, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc0032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c030011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c038011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431c417, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435c416, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c419, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc418, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf413261, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013262, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13263, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813264, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc0030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d77000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000cd6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51b80020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f97801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000cd6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ca7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc0031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435c40b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4280032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012c2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f8cc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13f4000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bf0060b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000cf4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0677, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13fc0017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc032800b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb7800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ffbc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d42011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d001e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd4c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800e6c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d59401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x596001fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ce0c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x505c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50600020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8240010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e800c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x122c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000d1f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8240010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x566c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413261, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13262, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b740008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x566c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce413261, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec13262, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012c2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f8cc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13f4000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bf0060b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000d57, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0677, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13fc0017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0328009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb7800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ffbc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04143000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd413267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e51001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d2d0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19640057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19580213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19600199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da6400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04142000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd413267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4153267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d001e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d40030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d80034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05280d83, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c424001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000d8a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000d95, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000db1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000d95, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000dbc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11540010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e010001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00187c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d75400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4610000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580f3d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x526c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e80058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e2ec01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc82c0072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5ae0073a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea2800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580f3c6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc3a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980fff5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02a0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01c405, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd441c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580f3b1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c409, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11540010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4610000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580f3a5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00da7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50500020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8280072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5aac007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12d80017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56a00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e82400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e58c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19d4003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28182002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00104f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc011000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c908009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d614011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1a0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb0800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e280008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20880188, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20240090, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca48001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c018001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd901a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1624001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841325f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00038, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ac0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ac0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13f4000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b301ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2330003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00038, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0001a2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc80003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24b00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1330000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ac0024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b304000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a800e5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da9800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1910003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2220003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e2a000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00038, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d40030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d001e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18fc0034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24e8000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80e71, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000edd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e91, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e91, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ea1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000eaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e7c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e7f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e7f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e87, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000e8f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51dc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9e001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a200008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213262, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253261, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a200008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213264, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253263, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc820001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e82005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da1801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1800072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8180072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x59a001fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea2800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce80001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd180001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15980002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421c401, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425c401, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ee6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2580, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac260c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0828, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2440, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0093, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac31dc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac31e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ede, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac7c06, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db07c00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acc337, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0c330, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acc335, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0c336, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac9002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db09001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac9012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db09011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acec70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0ec6f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ebc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5a10000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5a50000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05280eea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ef1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000efe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f11, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f2e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000efe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f1f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce190000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce190000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0f26f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e80058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7daec01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc82c0072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5af8073a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eba800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0f25c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02a0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15980002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c405, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56240020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0f24e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c409, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40f247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce190000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce190000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0f240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439c040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2580, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac260c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0828, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2440, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac2390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac0093, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac31dc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31ac31e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ef2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac7c06, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db07c00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acc337, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0c330, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acc335, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0c336, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39acec70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db0ec6f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac9002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db09002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39ac9012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3db09012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ef1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b740008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c1325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c034001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c038001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e0007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32240003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f88, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e52401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8280072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ac0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26f0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af000fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1334000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24e02000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f63400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e00074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32240003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000f9d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51e40020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5a401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8280072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ac0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26f0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1af000fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13380016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e00039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fa3800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb7800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e0007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1220001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fa3800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e00074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fa3800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1c084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d001e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31140005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31140006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00104f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05280fb7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28140002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fbe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fbe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fc2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fbe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fd1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ff2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ff2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e80039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52a8003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d59401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d69401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140004b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d958004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d150005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x159c0011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31a00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31a40001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e25800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0fff5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fff4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000fef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d100010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01326f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc011000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33b40003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0340008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000ffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c908009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d614011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1a0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb0800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x282c2002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x208801a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e280008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20240030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca48001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28340000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x507c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d7d401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x557c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28342002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000102f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c018001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1cccfe08, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00b33, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da2400f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da28002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1ac002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d2ac002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3ef40010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40f11d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde410000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdcc10000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd010000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd410000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdd810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xddc10000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde010000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c024001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100086, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5510003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001075, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15800f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15c002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d520002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cde0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e20001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001071, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c00036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00b01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc200000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc1c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc180000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc0c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc240000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc40003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4080029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc80003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a800e5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da9800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a400e5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12500009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x248c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x200c006d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x200c0228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410002b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18881fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d4072c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc00d1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd4c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3094000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x38d80000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x311c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30940007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1620001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010c4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x259c007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a00030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010cb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x199c0fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010cb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000aac, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434002e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2020002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07a810d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000bfc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000104c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x200c007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28240007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xde430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc80003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24b00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1330000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a800e5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da9800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d3249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b304000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x192400fd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d59401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06681110, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ac0024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19180070, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19100078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18f40058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5978073a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001117, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001118, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001122, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000112d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001130, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001133, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000117b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24ec0f00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32ec0600, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000117b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24ec0f00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32ec0600, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000117b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001122, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc81c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55e00020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001122, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02a0200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e8e8009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x22a8003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x22a80074, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2774001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13740014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eb6800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25ecffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55700020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15f40010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13740002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x275c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c018001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15dc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39e00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc1c01e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e40008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc2001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e40008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e62000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da58001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001165, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc2001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1a0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e0d000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95000007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e02401e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06640008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05d80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc2401e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da58001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05e00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da2000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9600ffe6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00116b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce00001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81c078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x22640435, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0528117e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x312c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001185, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001182, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001182, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a0400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1198001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d81c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19a000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de2c00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26200010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc415326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc420007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011a3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d654001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c020001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011b6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253279, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc415326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2730003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3b380006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3f38000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0430000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb10004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e57000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e578002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d67c002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0be40001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d3a4002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x202c002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26200010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e640010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce81325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434002e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07a811cf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00feb8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x954009a7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000bfc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1c07c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c07d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c08c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c07e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18f0012f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18f40612, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc00c1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cf7400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x39600004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0140004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11600001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18fc003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9740001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x166c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011ee, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a6c003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800011e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ac007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab00030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aac0fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001205, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x166c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11600001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ffbc00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a2800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c07c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c08c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03ae000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a0800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c07c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c08c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03ae000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a4000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81c07c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c08c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17fc001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30d00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000052, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640090f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1514001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19180038, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d324e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431324d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab0c006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000127f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d3258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313257, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab0c012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e624004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f67800f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53740002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ab42010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a8000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b740000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f6b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf40001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1514001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0012e1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x964008d7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9800036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300677, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012aa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b34060b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f37000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec00ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a8002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef6c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7edec00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4140032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1858003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0cc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0006c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d407f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2598003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d190004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d5d4001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d52000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d514002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d958001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd5c002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc1325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1ccc001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14f00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd980003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9800040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd9c00040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800010de, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33f80003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800051, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc80003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24b00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1330000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18a800e5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1d980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7da9800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b74003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b304000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431326c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b4c00f8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50700020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04e81324, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18ac0024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50600020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30e40004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d71401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x596401fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b74008d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e76400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a640000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000132c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000133b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001344, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42530b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a68003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2024003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11980014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d19000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd0130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce4130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de6800f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce40001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc428000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8240011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de6800f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffe0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00104f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28182002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340035, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140023, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d614011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4100026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05980008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1a0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb0800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3e280008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cb4800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20240030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ca48001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b4c00f8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28340000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x507c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30e40004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d7d401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x557c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28342002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c018001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf81a2a4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c007eb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50500020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d0d001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8100072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x591c01fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45140210, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x595801fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11980009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1624001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400069, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a307fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x23304076, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc00e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0015, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x4514020c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a2001e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a204001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a64003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1264001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15dc000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dcdc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5dc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001427, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340022, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4412e01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0434001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf430000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4412e40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c030, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41c031, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x248dfffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc12e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc812e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45140248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013257, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0434000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdb000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd140001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9980ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8200011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013259, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0337fff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f220009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d01c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f01c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c01c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c000d61, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50500020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001427, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd0c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd0c00072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8240072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd240001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19682011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5a6c01fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12ec0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eeac00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aec0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4180011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf830000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfa0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4380007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d40038, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400029, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9540073d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18c80066, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30880001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00187c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd910000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x4220000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24e80007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24ec0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5310000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001465, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1000072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc82c0072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2c0001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18f02011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5aec01fc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12ec0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aec0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a8146a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1f0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001478, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001478, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000147a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000147a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000147a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f1b400e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000147a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f334002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000147b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e024001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000144a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fbfc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x251001ef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94800007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00187c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42c0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd910000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40d325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800012c2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13f4000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bf0060b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800014a9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d325a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0677, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb81ff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0328007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb7800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13fc0017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ffbc00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03a0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45dc0390, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04183000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b380057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b340213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c424001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c428001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c42c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c430001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c434001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04182000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd813267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a0800fd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x109c000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce080228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9880000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce480250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce880258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0ec75, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc80230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce480250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce880258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52a80020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x66580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc80260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec80288, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf080290, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec80298, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf0802a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4802a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27580001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc802b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80802b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x178c000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b8003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cf8c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8802c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc802c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8802d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf8802d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bc800ea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25b8ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd2800c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5230309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e3a400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001539, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd08034b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd880353, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00163f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b0353, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd14005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000154f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd080238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd08034b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2598ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d200008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc80230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd900309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8100319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340801, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2198003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd910ce7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4190ce6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d918005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d918004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd810ce6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdd1054f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000156e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x090c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdcd050e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x040c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x110c0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc4001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41230a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41230b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41230c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc41230d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc480329, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc48032a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc4802e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f02e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d8003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09940001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x44100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x69100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000157f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970290, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b0288, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d59401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b02a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49f0298, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x041c0040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dcdc002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d924019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d26400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00163f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001579, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d010021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d914019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd480298, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd8802a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10d40010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12180016, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc51f0309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d95800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d62000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdd00309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce113320, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f02e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b02b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18dc01e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9400e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c0001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00163f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015aa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a302b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12240004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e5e400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ab02a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04100000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce4c0319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d9d8002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea14005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015bc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04240001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e624004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d25000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2620000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fff4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd0d3330, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce0802b8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd8802b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ab02e0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aa807f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f02d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49702d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b02c8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49f02c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96800028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d4e000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9600000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d964002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d694001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cde4002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de94001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd64002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d694001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00163f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800015cd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930238, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d698002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd4802d8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x129c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc50f0319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11a0000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1e000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1198000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd953300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e0e000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a8000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce953301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce100319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b70280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73800a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x536c0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9780eb68, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001608, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001609, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30b40000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b400011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b70258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53780020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb3801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7faf8019, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x67b40001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x57b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bb0260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fab8001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf880260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x66f40001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4353247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7f4009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fff7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x269c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a00018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a00060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x269c0018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a40060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11dc0006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29dc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de5c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b70228, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc80230, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f514005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2510000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001644, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd080240, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f130005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001688, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00120d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001219, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001232, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340801, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f130004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01051e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42d051f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ed2c005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96c0fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01051f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000055, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5170309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x195c07f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x196007f6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04340001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x6b740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001665, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a702a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ab0298, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f634014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e76401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56680020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8113320, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce480298, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce8802a0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc5170319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b702b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x255c000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f5f4001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8113330, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf4802b0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11340001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x195c07e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x196007ee, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8353300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1e4001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8353301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce4802d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8100309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8100319, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc48f0250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd4c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x64d80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580005c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc24001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd2000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc435324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7df5c00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800016f1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc033ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2f3000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a7003e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13b80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a7000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07b80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a700064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800016df, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb30002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4392083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffca, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2030007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800016f2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ff9c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001608, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bc800ea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd80802e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18fc0064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00042, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51980020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dd9801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x45980400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b380057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b340213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f7b400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f73400a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14f4001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bf02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x192807fa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bf0258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a70250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53fc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e7e401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x667c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0aec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eebc00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x43300007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7db30011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd3000025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc03ec005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfca200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x192807fa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01f007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1d0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2110007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x203c003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0017f5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18fc01e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00185b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8413247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40ffd5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bf02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0ea24, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14d4001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d52400e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49f0258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a30250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51dc0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400017, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d534002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dae4005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32e0001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec80270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000174f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b740001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00178a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40fff3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001608, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ab0268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7daa4005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32a0001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001765, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01f007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d1d0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2110007d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8013256, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c0017f2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd013254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4113248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b3034b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f13000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001855, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32a4001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8413247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd080260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce880268, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ffc0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ec28001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32e0001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253255, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431324f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e72400c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9680fff7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aa4003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aa400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32680003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a800046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4293260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1aa400e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800017e2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc027ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2e6400ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a4009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4240009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19e403e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26680003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12a80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea68001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19e400e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea68001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea68001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19e40064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x32640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a40005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06640003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce412082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a640003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800017d0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16a40005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce412082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea64002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4292083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ea68005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a80ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc429325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26a400ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40ffca, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2024007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800017e3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4a70280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4ab0278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52640020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7eae8014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e6a401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56680020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce480278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce880280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x042c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec80270, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800017fe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bf02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800017fe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43b02eb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42302ec, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fa3801a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x47b8020c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x15e00008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1220000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2a206032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x513c001e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e3e001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4bf02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000180f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b3c0077, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1330000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd200000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4200007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd3800002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc30001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc1e0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04380032, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf80000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001427, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc413248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3269, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33fc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdfc30000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bfc0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdfc30000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd441326a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x173c0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300303, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3f0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ff3c004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001842, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdfc30000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4413249, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c43c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x23fc003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1326d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdf830000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd441326e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1fb8ffc6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xddc30000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf813265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001852, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c00142b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13252, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013253, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001878, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49f02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c00018, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c420001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13252, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013253, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c3000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c0012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001878, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41f02ed, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42302ee, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc13252, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013253, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e2a0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28340001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x313c0bcc, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x393c051f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d3c050e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x393c0560, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d3c054f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x393c1538, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d3c1537, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b740800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bc800ea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e8007c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c42c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a8189a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000189e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800018c5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800018f2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c414001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0007e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x50580020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d59401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc8140072, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09240002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c418001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4340004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc42130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a24002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2020002c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc418000d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1198001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14cc0004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7cd8c00a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc130b7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce0130b5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd1400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x5978073a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bb80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf800024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd800026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9600e8a8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9640e8a5, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800018a9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc55b0309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d5c0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2598ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dad800c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0ffd2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fff9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x442c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x65180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7df9c00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c13260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd901325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940fff1, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x66d80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x56ec0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26240007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940fff7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000189e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc023007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19e4003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7de1c009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dee000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96000007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c13260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd901325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc421325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x261c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000189e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940fff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000189e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28cc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43d3265, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bc800ea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18e00064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06281911, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14f4001d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24cc0003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x86800000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001915, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x800019af, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001a2b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8000016a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc48032b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc480333, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc48033b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc480343, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98800011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46640400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04203000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b3c0057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b200213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e3e000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e32000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04180000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f438001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00068, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213254, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a1c003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00065, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc01f007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1e0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97800062, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0bb80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x43bc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fcbc001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc7df032b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1fc00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0101, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c0102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001994, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc033ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2f3000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f003e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13b80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07b80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f00064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001982, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb30002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4392083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffcb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2030007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001995, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc1325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98800009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x41bc0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x53fc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e7fc011, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd3c00025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0012, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9bc0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x653c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dbd8001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ff8f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2bfc0008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x043c2000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcfc13267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c410001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc55b0309, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x3d5c0010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2598ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x05540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d91800c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580fff8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09780001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x65180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9580005d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200101, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400058, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dc24001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41d3248, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25dc000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7df9c00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95c00053, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e41c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a70003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a7000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33240003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a400046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1a7000e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001a21, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc033ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2f3000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f270009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x266400ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f003e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27240003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12640004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e724001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e724001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e724001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06640002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f00064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16700005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001a0f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x16700005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e730002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4252083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e724005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x26640001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a40ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x267000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffca, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2030007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001a22, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ff9f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001a31, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8080280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213246, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4253245, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52200020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e26401a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x46640400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04203000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4213267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b180057, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b200213, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1b300199, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e1a000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e32000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce000024, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4970258, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4930250, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x51540020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4af0280, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4b30278, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x52ec0020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140020, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04280000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x65180001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800060, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x8c001628, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4193247, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x25980001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200101, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x30f00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95800056, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb0003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b800046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4393260, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bb000e4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001aa2, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc033ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2f3000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f3b0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf01325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b800ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4300009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9700fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f003e6, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27380003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13b80004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f000e8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07b80002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x19f00064, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33300002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0b300003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001a90, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x17b00005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf012082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01203f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x13300005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb30002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4392083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7fb38005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b80ffdf, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c00034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc00013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc431325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27300010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc439325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27b000ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b00ffca, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2030007b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf00325b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001aa3, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce01325d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04300001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7f2b0014, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ef2c01a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd2400025, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x4664001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000026, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400027, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x06a80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55100001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ff9c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc49b02e9, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99800008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc430000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2b300008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf000013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04302000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcf013267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc4313267, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x244c00ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc4c0200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc44f0200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc410000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d158010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x059cc000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccdd0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0037, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000049, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c003a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500e69a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d0003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d40021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd840004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c003c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x14cc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c00028, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000033, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc438000b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0009, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x27fc0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43dc07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1bfc0078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7ffbc00c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x97c0fffd, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x99000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0120840, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x282c0040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001ae8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0121841, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x282c001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c07c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c08c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c079, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c07e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcec0001b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a200001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9a00ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x166c001f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04200004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9ac0fffb, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc434000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9b40ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc425c07f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8000034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940e66b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800004a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0036, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9900fffe, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18cc0021, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc00047, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc000046, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0039, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c003d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c40c001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24d003ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d47fea, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x18d87ff4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd00004c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd40004e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd80004d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c405, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc02a0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2aa80001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c406, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc414000e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x29540008, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x295c0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8c1325e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcdc0001a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11980002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x4110000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0160800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7d15000a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0164010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c080, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c081, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c082, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc01c083, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c084, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x98c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400048, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c003b, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x94c0ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000c16, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c40a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd901c40d, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c410, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c40e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd801c40f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc40c0040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x09540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9940ffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04140096, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8400013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1c400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc411c401, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9500fffa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424003e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04d00001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x11100002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd01c40c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0180034, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd81c411, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd841c414, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0a540001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcd41c412, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x2468000f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc419c416, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x41980003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc41c003f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7dda0001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x12200002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x10cc0002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xccc1c40c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd901c411, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce41c412, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd8800013, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xce292e40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e01, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e02, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e03, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc412e00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000aa7, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc43c0007, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc120000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x31144000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x95400005, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xdc030000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd800002a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xcc3c000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b70, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x33f80003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd4400078, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x9780e601, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x188cfff0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x04e40002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001190, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400006, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x90000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc424005e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x96400003, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7c408001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x88000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80001b74, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000168, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110501, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120206, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130703, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92100400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92110105, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92120602, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x92130307, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbf810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x54106500, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0x7e000200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e020204, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc00a0505, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbf8c007f, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb8900904, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb8911a04, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb8920304, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb8930b44, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x921c0d0c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x921c1c13, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x921d0c12, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x811c1d1c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x811c111c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x921cff1c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000400, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x921dff10, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000100, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x81181d1c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e040218, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0701000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050102, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xe0501000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80050302, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbf810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x54106900, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0x7e080200, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x7e100204, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbefc00ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00010000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x24200087, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x262200ff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000001f0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x20222282, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x28182111, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000040c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd81a0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000080c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xd86c0000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x1100000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xbf810000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x80000004, mmCP_DFY_CNTL                              },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_ADDR_HI                           },
+       { PwrCmdWrite, 0x54116f00, mmCP_DFY_ADDR_LO                           },
+       { PwrCmdWrite, 0xc0310800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4540fe8, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000041, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000000c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07808000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54116f00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00005301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4540fef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee20, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0310800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb454105e, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000c0, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07808000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54117300, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00005301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4540fef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee20, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0310800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4541065, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000500, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000001c, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07808000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54117700, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00005301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4540fef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee20, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xc0310800, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000040, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4541069, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000444, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x0000008a, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x07808000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xffffffff, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000002, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xaaaaaaaa, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x55555555, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee40, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000010, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000001, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000004, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x54117b00, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00005301, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0xb4540fef, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x540fee20, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x000000b4, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x08000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_DFY_DATA_0                            },
+       { PwrCmdWrite, 0x00000000, mmCP_MEC_CNTL                              },
+       { PwrCmdWrite, 0x00000000, mmCP_MEC_CNTL                              },
+       { PwrCmdWrite, 0x00000004, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x54116f00, mmCP_MQD_BASE_ADDR                         },
+       { PwrCmdWrite, 0x000000b4, mmCP_MQD_BASE_ADDR_HI                      },
+       { PwrCmdWrite, 0xb4540fef, mmCP_HQD_PQ_BASE                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_BASE_HI                        },
+       { PwrCmdWrite, 0x540fee20, mmCP_HQD_PQ_WPTR_POLL_ADDR                 },
+       { PwrCmdWrite, 0x000000b4, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI              },
+       { PwrCmdWrite, 0x00005301, mmCP_HQD_PERSISTENT_STATE                  },
+       { PwrCmdWrite, 0x00010000, mmCP_HQD_VMID                              },
+       { PwrCmdWrite, 0xc8318509, mmCP_HQD_PQ_CONTROL                        },
+       { PwrCmdWrite, 0x00000005, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x54117300, mmCP_MQD_BASE_ADDR                         },
+       { PwrCmdWrite, 0x000000b4, mmCP_MQD_BASE_ADDR_HI                      },
+       { PwrCmdWrite, 0xb4540fef, mmCP_HQD_PQ_BASE                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_BASE_HI                        },
+       { PwrCmdWrite, 0x540fee20, mmCP_HQD_PQ_WPTR_POLL_ADDR                 },
+       { PwrCmdWrite, 0x000000b4, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI              },
+       { PwrCmdWrite, 0x00005301, mmCP_HQD_PERSISTENT_STATE                  },
+       { PwrCmdWrite, 0x00010000, mmCP_HQD_VMID                              },
+       { PwrCmdWrite, 0xc8318509, mmCP_HQD_PQ_CONTROL                        },
+       { PwrCmdWrite, 0x00000006, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x54117700, mmCP_MQD_BASE_ADDR                         },
+       { PwrCmdWrite, 0x000000b4, mmCP_MQD_BASE_ADDR_HI                      },
+       { PwrCmdWrite, 0xb4540fef, mmCP_HQD_PQ_BASE                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_BASE_HI                        },
+       { PwrCmdWrite, 0x540fee20, mmCP_HQD_PQ_WPTR_POLL_ADDR                 },
+       { PwrCmdWrite, 0x000000b4, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI              },
+       { PwrCmdWrite, 0x00005301, mmCP_HQD_PERSISTENT_STATE                  },
+       { PwrCmdWrite, 0x00010000, mmCP_HQD_VMID                              },
+       { PwrCmdWrite, 0xc8318509, mmCP_HQD_PQ_CONTROL                        },
+       { PwrCmdWrite, 0x00000007, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x54117b00, mmCP_MQD_BASE_ADDR                         },
+       { PwrCmdWrite, 0x000000b4, mmCP_MQD_BASE_ADDR_HI                      },
+       { PwrCmdWrite, 0xb4540fef, mmCP_HQD_PQ_BASE                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_BASE_HI                        },
+       { PwrCmdWrite, 0x540fee20, mmCP_HQD_PQ_WPTR_POLL_ADDR                 },
+       { PwrCmdWrite, 0x000000b4, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI              },
+       { PwrCmdWrite, 0x00005301, mmCP_HQD_PERSISTENT_STATE                  },
+       { PwrCmdWrite, 0x00010000, mmCP_HQD_VMID                              },
+       { PwrCmdWrite, 0xc8318509, mmCP_HQD_PQ_CONTROL                        },
+       { PwrCmdWrite, 0x00000004, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000104, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000204, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000304, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000404, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000504, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000604, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000704, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000005, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000105, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000205, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000305, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000405, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000505, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000605, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000705, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000006, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000106, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000206, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000306, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000406, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000506, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000606, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000706, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000007, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000107, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000207, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000307, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000407, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000507, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000607, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000707, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000008, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000108, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000208, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000308, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000408, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000508, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000608, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000708, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000009, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000109, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000209, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000309, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000409, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000509, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000609, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000709, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_RPTR                           },
+       { PwrCmdWrite, 0x00000000, mmCP_HQD_PQ_WPTR                           },
+       { PwrCmdWrite, 0x00000001, mmCP_HQD_ACTIVE                            },
+       { PwrCmdWrite, 0x00000004, mmSRBM_GFX_CNTL                            },
+       { PwrCmdWrite, 0x01010101, mmCP_PQ_WPTR_POLL_CNTL1                    },
+       { PwrCmdWrite, 0x00000000, mmGRBM_STATUS                              },
+       { PwrCmdWrite, 0x00000000, mmGRBM_STATUS                              },
+       { PwrCmdWrite, 0x00000000, mmGRBM_STATUS                              },
+       { PwrCmdEnd,   0x00000000, 0x00000000                                 },
+};
+
+
+#endif
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu74.h b/drivers/gpu/drm/amd/powerplay/inc/smu74.h
new file mode 100644 (file)
index 0000000..1a12d85
--- /dev/null
@@ -0,0 +1,774 @@
+/*
+ * Copyright 2014 Advanced Micro Devices, 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.
+ *
+ */
+
+
+#ifndef SMU74_H
+#define SMU74_H
+
+#pragma pack(push, 1)
+
+#define SMU__DGPU_ONLY
+
+#define SMU__NUM_SCLK_DPM_STATE  8
+#define SMU__NUM_MCLK_DPM_LEVELS 4
+#define SMU__NUM_LCLK_DPM_LEVELS 8
+#define SMU__NUM_PCIE_DPM_LEVELS 8
+
+enum SID_OPTION {
+       SID_OPTION_HI,
+       SID_OPTION_LO,
+       SID_OPTION_COUNT
+};
+
+enum Poly3rdOrderCoeff {
+       LEAKAGE_TEMPERATURE_SCALAR,
+       LEAKAGE_VOLTAGE_SCALAR,
+       DYNAMIC_VOLTAGE_SCALAR,
+       POLY_3RD_ORDER_COUNT
+};
+
+struct SMU7_Poly3rdOrder_Data {
+       int32_t a;
+       int32_t b;
+       int32_t c;
+       int32_t d;
+       uint8_t a_shift;
+       uint8_t b_shift;
+       uint8_t c_shift;
+       uint8_t x_shift;
+};
+
+typedef struct SMU7_Poly3rdOrder_Data SMU7_Poly3rdOrder_Data;
+
+struct Power_Calculator_Data {
+       uint16_t NoLoadVoltage;
+       uint16_t LoadVoltage;
+       uint16_t Resistance;
+       uint16_t Temperature;
+       uint16_t BaseLeakage;
+       uint16_t LkgTempScalar;
+       uint16_t LkgVoltScalar;
+       uint16_t LkgAreaScalar;
+       uint16_t LkgPower;
+       uint16_t DynVoltScalar;
+       uint32_t Cac;
+       uint32_t DynPower;
+       uint32_t TotalCurrent;
+       uint32_t TotalPower;
+};
+
+typedef struct Power_Calculator_Data PowerCalculatorData_t;
+
+struct Gc_Cac_Weight_Data {
+       uint8_t index;
+       uint32_t value;
+};
+
+typedef struct Gc_Cac_Weight_Data GcCacWeight_Data;
+
+
+typedef struct {
+       uint32_t high;
+       uint32_t low;
+} data_64_t;
+
+typedef struct {
+       data_64_t high;
+       data_64_t low;
+} data_128_t;
+
+#define SMU7_CONTEXT_ID_SMC        1
+#define SMU7_CONTEXT_ID_VBIOS      2
+
+#define SMU74_MAX_LEVELS_VDDC            16
+#define SMU74_MAX_LEVELS_VDDGFX          16
+#define SMU74_MAX_LEVELS_VDDCI           8
+#define SMU74_MAX_LEVELS_MVDD            4
+
+#define SMU_MAX_SMIO_LEVELS              4
+
+#define SMU74_MAX_LEVELS_GRAPHICS        SMU__NUM_SCLK_DPM_STATE   /* SCLK + SQ DPM + ULV */
+#define SMU74_MAX_LEVELS_MEMORY          SMU__NUM_MCLK_DPM_LEVELS   /* MCLK Levels DPM */
+#define SMU74_MAX_LEVELS_GIO             SMU__NUM_LCLK_DPM_LEVELS  /* LCLK Levels */
+#define SMU74_MAX_LEVELS_LINK            SMU__NUM_PCIE_DPM_LEVELS  /* PCIe speed and number of lanes */
+#define SMU74_MAX_LEVELS_UVD             8   /* VCLK/DCLK levels for UVD */
+#define SMU74_MAX_LEVELS_VCE             8   /* ECLK levels for VCE */
+#define SMU74_MAX_LEVELS_ACP             8   /* ACLK levels for ACP */
+#define SMU74_MAX_LEVELS_SAMU            8   /* SAMCLK levels for SAMU */
+#define SMU74_MAX_ENTRIES_SMIO           32  /* Number of entries in SMIO table */
+
+#define DPM_NO_LIMIT 0
+#define DPM_NO_UP 1
+#define DPM_GO_DOWN 2
+#define DPM_GO_UP 3
+
+#define SMU7_FIRST_DPM_GRAPHICS_LEVEL    0
+#define SMU7_FIRST_DPM_MEMORY_LEVEL      0
+
+#define GPIO_CLAMP_MODE_VRHOT      1
+#define GPIO_CLAMP_MODE_THERM      2
+#define GPIO_CLAMP_MODE_DC         4
+
+#define SCRATCH_B_TARG_PCIE_INDEX_SHIFT 0
+#define SCRATCH_B_TARG_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_TARG_PCIE_INDEX_SHIFT)
+#define SCRATCH_B_CURR_PCIE_INDEX_SHIFT 3
+#define SCRATCH_B_CURR_PCIE_INDEX_MASK  (0x7<<SCRATCH_B_CURR_PCIE_INDEX_SHIFT)
+#define SCRATCH_B_TARG_UVD_INDEX_SHIFT  6
+#define SCRATCH_B_TARG_UVD_INDEX_MASK   (0x7<<SCRATCH_B_TARG_UVD_INDEX_SHIFT)
+#define SCRATCH_B_CURR_UVD_INDEX_SHIFT  9
+#define SCRATCH_B_CURR_UVD_INDEX_MASK   (0x7<<SCRATCH_B_CURR_UVD_INDEX_SHIFT)
+#define SCRATCH_B_TARG_VCE_INDEX_SHIFT  12
+#define SCRATCH_B_TARG_VCE_INDEX_MASK   (0x7<<SCRATCH_B_TARG_VCE_INDEX_SHIFT)
+#define SCRATCH_B_CURR_VCE_INDEX_SHIFT  15
+#define SCRATCH_B_CURR_VCE_INDEX_MASK   (0x7<<SCRATCH_B_CURR_VCE_INDEX_SHIFT)
+#define SCRATCH_B_TARG_ACP_INDEX_SHIFT  18
+#define SCRATCH_B_TARG_ACP_INDEX_MASK   (0x7<<SCRATCH_B_TARG_ACP_INDEX_SHIFT)
+#define SCRATCH_B_CURR_ACP_INDEX_SHIFT  21
+#define SCRATCH_B_CURR_ACP_INDEX_MASK   (0x7<<SCRATCH_B_CURR_ACP_INDEX_SHIFT)
+#define SCRATCH_B_TARG_SAMU_INDEX_SHIFT 24
+#define SCRATCH_B_TARG_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_TARG_SAMU_INDEX_SHIFT)
+#define SCRATCH_B_CURR_SAMU_INDEX_SHIFT 27
+#define SCRATCH_B_CURR_SAMU_INDEX_MASK  (0x7<<SCRATCH_B_CURR_SAMU_INDEX_SHIFT)
+
+/* Virtualization Defines */
+#define CG_XDMA_MASK  0x1
+#define CG_XDMA_SHIFT 0
+#define CG_UVD_MASK   0x2
+#define CG_UVD_SHIFT  1
+#define CG_VCE_MASK   0x4
+#define CG_VCE_SHIFT  2
+#define CG_SAMU_MASK  0x8
+#define CG_SAMU_SHIFT 3
+#define CG_GFX_MASK   0x10
+#define CG_GFX_SHIFT  4
+#define CG_SDMA_MASK  0x20
+#define CG_SDMA_SHIFT 5
+#define CG_HDP_MASK   0x40
+#define CG_HDP_SHIFT  6
+#define CG_MC_MASK    0x80
+#define CG_MC_SHIFT   7
+#define CG_DRM_MASK   0x100
+#define CG_DRM_SHIFT  8
+#define CG_ROM_MASK   0x200
+#define CG_ROM_SHIFT  9
+#define CG_BIF_MASK   0x400
+#define CG_BIF_SHIFT  10
+
+
+#define SMU74_DTE_ITERATIONS 5
+#define SMU74_DTE_SOURCES 3
+#define SMU74_DTE_SINKS 1
+#define SMU74_NUM_CPU_TES 0
+#define SMU74_NUM_GPU_TES 1
+#define SMU74_NUM_NON_TES 2
+#define SMU74_DTE_FAN_SCALAR_MIN 0x100
+#define SMU74_DTE_FAN_SCALAR_MAX 0x166
+#define SMU74_DTE_FAN_TEMP_MAX 93
+#define SMU74_DTE_FAN_TEMP_MIN 83
+
+
+#if defined SMU__FUSION_ONLY
+#define SMU7_DTE_ITERATIONS 5
+#define SMU7_DTE_SOURCES 5
+#define SMU7_DTE_SINKS 3
+#define SMU7_NUM_CPU_TES 2
+#define SMU7_NUM_GPU_TES 1
+#define SMU7_NUM_NON_TES 2
+#endif
+
+struct SMU7_HystController_Data {
+       uint8_t waterfall_up;
+       uint8_t waterfall_down;
+       uint8_t waterfall_limit;
+       uint8_t spare;
+       uint16_t release_cnt;
+       uint16_t release_limit;
+};
+
+typedef struct SMU7_HystController_Data SMU7_HystController_Data;
+
+struct SMU74_PIDController {
+       uint32_t Ki;
+       int32_t LFWindupUpperLim;
+       int32_t LFWindupLowerLim;
+       uint32_t StatePrecision;
+       uint32_t LfPrecision;
+       uint32_t LfOffset;
+       uint32_t MaxState;
+       uint32_t MaxLfFraction;
+       uint32_t StateShift;
+};
+
+typedef struct SMU74_PIDController SMU74_PIDController;
+
+struct SMU7_LocalDpmScoreboard {
+       uint32_t PercentageBusy;
+
+       int32_t  PIDError;
+       int32_t  PIDIntegral;
+       int32_t  PIDOutput;
+
+       uint32_t SigmaDeltaAccum;
+       uint32_t SigmaDeltaOutput;
+       uint32_t SigmaDeltaLevel;
+
+       uint32_t UtilizationSetpoint;
+
+       uint8_t  TdpClampMode;
+       uint8_t  TdcClampMode;
+       uint8_t  ThermClampMode;
+       uint8_t  VoltageBusy;
+
+       int8_t   CurrLevel;
+       int8_t   TargLevel;
+       uint8_t  LevelChangeInProgress;
+       uint8_t  UpHyst;
+
+       uint8_t  DownHyst;
+       uint8_t  VoltageDownHyst;
+       uint8_t  DpmEnable;
+       uint8_t  DpmRunning;
+
+       uint8_t  DpmForce;
+       uint8_t  DpmForceLevel;
+       uint8_t  DisplayWatermark;
+       uint8_t  McArbIndex;
+
+       uint32_t MinimumPerfSclk;
+
+       uint8_t  AcpiReq;
+       uint8_t  AcpiAck;
+       uint8_t  GfxClkSlow;
+       uint8_t  GpioClampMode;
+
+       uint8_t  spare2;
+       uint8_t  EnabledLevelsChange;
+       uint8_t  DteClampMode;
+       uint8_t  FpsClampMode;
+
+       uint16_t LevelResidencyCounters[SMU74_MAX_LEVELS_GRAPHICS];
+       uint16_t LevelSwitchCounters[SMU74_MAX_LEVELS_GRAPHICS];
+
+       void     (*TargetStateCalculator)(uint8_t);
+       void     (*SavedTargetStateCalculator)(uint8_t);
+
+       uint16_t AutoDpmInterval;
+       uint16_t AutoDpmRange;
+
+       uint8_t  FpsEnabled;
+       uint8_t  MaxPerfLevel;
+       uint8_t  AllowLowClkInterruptToHost;
+       uint8_t  FpsRunning;
+
+       uint32_t MaxAllowedFrequency;
+
+       uint32_t FilteredSclkFrequency;
+       uint32_t LastSclkFrequency;
+       uint32_t FilteredSclkFrequencyCnt;
+
+       uint8_t MinPerfLevel;
+       uint8_t padding[3];
+
+       uint16_t FpsAlpha;
+       uint16_t DeltaTime;
+       uint32_t CurrentFps;
+       uint32_t FilteredFps;
+       uint32_t FrameCount;
+       uint32_t FrameCountLast;
+       uint16_t FpsTargetScalar;
+       uint16_t FpsWaterfallLimitScalar;
+       uint16_t FpsAlphaScalar;
+       uint16_t spare8;
+       SMU7_HystController_Data HystControllerData;
+};
+
+typedef struct SMU7_LocalDpmScoreboard SMU7_LocalDpmScoreboard;
+
+#define SMU7_MAX_VOLTAGE_CLIENTS 12
+
+typedef uint8_t (*VoltageChangeHandler_t)(uint16_t, uint8_t);
+
+#define VDDC_MASK    0x00007FFF
+#define VDDC_SHIFT   0
+#define VDDCI_MASK   0x3FFF8000
+#define VDDCI_SHIFT  15
+#define PHASES_MASK  0xC0000000
+#define PHASES_SHIFT 30
+
+typedef uint32_t SMU_VoltageLevel;
+
+struct SMU7_VoltageScoreboard {
+
+       SMU_VoltageLevel TargetVoltage;
+       uint16_t MaxVid;
+       uint8_t  HighestVidOffset;
+       uint8_t  CurrentVidOffset;
+
+       uint16_t CurrentVddc;
+       uint16_t CurrentVddci;
+
+
+       uint8_t  ControllerBusy;
+       uint8_t  CurrentVid;
+       uint8_t  CurrentVddciVid;
+       uint8_t  padding;
+
+       SMU_VoltageLevel RequestedVoltage[SMU7_MAX_VOLTAGE_CLIENTS];
+       SMU_VoltageLevel TargetVoltageState;
+       uint8_t  EnabledRequest[SMU7_MAX_VOLTAGE_CLIENTS];
+
+       uint8_t  padding2;
+       uint8_t  padding3;
+       uint8_t  ControllerEnable;
+       uint8_t  ControllerRunning;
+       uint16_t CurrentStdVoltageHiSidd;
+       uint16_t CurrentStdVoltageLoSidd;
+       uint8_t  OverrideVoltage;
+       uint8_t  padding4;
+       uint8_t  padding5;
+       uint8_t  CurrentPhases;
+
+       VoltageChangeHandler_t ChangeVddc;
+
+       VoltageChangeHandler_t ChangeVddci;
+       VoltageChangeHandler_t ChangePhase;
+       VoltageChangeHandler_t ChangeMvdd;
+
+       VoltageChangeHandler_t functionLinks[6];
+
+       uint16_t *VddcFollower1;
+
+       int16_t  Driver_OD_RequestedVidOffset1;
+       int16_t  Driver_OD_RequestedVidOffset2;
+};
+
+typedef struct SMU7_VoltageScoreboard SMU7_VoltageScoreboard;
+
+#define SMU7_MAX_PCIE_LINK_SPEEDS 3 /* 0:Gen1 1:Gen2 2:Gen3 */
+
+struct SMU7_PCIeLinkSpeedScoreboard {
+       uint8_t     DpmEnable;
+       uint8_t     DpmRunning;
+       uint8_t     DpmForce;
+       uint8_t     DpmForceLevel;
+
+       uint8_t     CurrentLinkSpeed;
+       uint8_t     EnabledLevelsChange;
+       uint16_t    AutoDpmInterval;
+
+       uint16_t    AutoDpmRange;
+       uint16_t    AutoDpmCount;
+
+       uint8_t     DpmMode;
+       uint8_t     AcpiReq;
+       uint8_t     AcpiAck;
+       uint8_t     CurrentLinkLevel;
+
+};
+
+typedef struct SMU7_PCIeLinkSpeedScoreboard SMU7_PCIeLinkSpeedScoreboard;
+
+#define SMU7_LKGE_LUT_NUM_OF_TEMP_ENTRIES 16
+#define SMU7_LKGE_LUT_NUM_OF_VOLT_ENTRIES 16
+
+#define SMU7_SCALE_I  7
+#define SMU7_SCALE_R 12
+
+struct SMU7_PowerScoreboard {
+       PowerCalculatorData_t VddcPowerData[SID_OPTION_COUNT];
+
+       uint32_t TotalGpuPower;
+       uint32_t TdcCurrent;
+
+       uint16_t   VddciTotalPower;
+       uint16_t   sparesasfsdfd;
+       uint16_t   Vddr1Power;
+       uint16_t   RocPower;
+
+       uint16_t   CalcMeasPowerBlend;
+       uint8_t    SidOptionPower;
+       uint8_t    SidOptionCurrent;
+
+       uint32_t   WinTime;
+
+       uint16_t Telemetry_1_slope;
+       uint16_t Telemetry_2_slope;
+       int32_t Telemetry_1_offset;
+       int32_t Telemetry_2_offset;
+
+       uint32_t VddcCurrentTelemetry;
+       uint32_t VddGfxCurrentTelemetry;
+       uint32_t VddcPowerTelemetry;
+       uint32_t VddGfxPowerTelemetry;
+       uint32_t VddciPowerTelemetry;
+
+       uint32_t VddcPower;
+       uint32_t VddGfxPower;
+       uint32_t VddciPower;
+
+       uint32_t TelemetryCurrent[2];
+       uint32_t TelemetryVoltage[2];
+       uint32_t TelemetryPower[2];
+};
+
+typedef struct SMU7_PowerScoreboard SMU7_PowerScoreboard;
+
+struct SMU7_ThermalScoreboard {
+       int16_t  GpuLimit;
+       int16_t  GpuHyst;
+       uint16_t CurrGnbTemp;
+       uint16_t FilteredGnbTemp;
+
+       uint8_t  ControllerEnable;
+       uint8_t  ControllerRunning;
+       uint8_t  AutoTmonCalInterval;
+       uint8_t  AutoTmonCalEnable;
+
+       uint8_t  ThermalDpmEnabled;
+       uint8_t  SclkEnabledMask;
+       uint8_t  spare[2];
+       int32_t  temperature_gradient;
+
+       SMU7_HystController_Data HystControllerData;
+       int32_t  WeightedSensorTemperature;
+       uint16_t TemperatureLimit[SMU74_MAX_LEVELS_GRAPHICS];
+       uint32_t Alpha;
+};
+
+typedef struct SMU7_ThermalScoreboard SMU7_ThermalScoreboard;
+
+#define SMU7_SCLK_DPM_CONFIG_MASK                        0x01
+#define SMU7_VOLTAGE_CONTROLLER_CONFIG_MASK              0x02
+#define SMU7_THERMAL_CONTROLLER_CONFIG_MASK              0x04
+#define SMU7_MCLK_DPM_CONFIG_MASK                        0x08
+#define SMU7_UVD_DPM_CONFIG_MASK                         0x10
+#define SMU7_VCE_DPM_CONFIG_MASK                         0x20
+#define SMU7_ACP_DPM_CONFIG_MASK                         0x40
+#define SMU7_SAMU_DPM_CONFIG_MASK                        0x80
+#define SMU7_PCIEGEN_DPM_CONFIG_MASK                    0x100
+
+#define SMU7_ACP_MCLK_HANDSHAKE_DISABLE                  0x00000001
+#define SMU7_ACP_SCLK_HANDSHAKE_DISABLE                  0x00000002
+#define SMU7_UVD_MCLK_HANDSHAKE_DISABLE                  0x00000100
+#define SMU7_UVD_SCLK_HANDSHAKE_DISABLE                  0x00000200
+#define SMU7_VCE_MCLK_HANDSHAKE_DISABLE                  0x00010000
+#define SMU7_VCE_SCLK_HANDSHAKE_DISABLE                  0x00020000
+
+/* All 'soft registers' should be uint32_t. */
+struct SMU74_SoftRegisters {
+       uint32_t        RefClockFrequency;
+       uint32_t        PmTimerPeriod;
+       uint32_t        FeatureEnables;
+
+       uint32_t        PreVBlankGap;
+       uint32_t        VBlankTimeout;
+       uint32_t        TrainTimeGap;
+
+       uint32_t        MvddSwitchTime;
+       uint32_t        LongestAcpiTrainTime;
+       uint32_t        AcpiDelay;
+       uint32_t        G5TrainTime;
+       uint32_t        DelayMpllPwron;
+       uint32_t        VoltageChangeTimeout;
+
+       uint32_t        HandshakeDisables;
+
+       uint8_t         DisplayPhy1Config;
+       uint8_t         DisplayPhy2Config;
+       uint8_t         DisplayPhy3Config;
+       uint8_t         DisplayPhy4Config;
+
+       uint8_t         DisplayPhy5Config;
+       uint8_t         DisplayPhy6Config;
+       uint8_t         DisplayPhy7Config;
+       uint8_t         DisplayPhy8Config;
+
+       uint32_t        AverageGraphicsActivity;
+       uint32_t        AverageMemoryActivity;
+       uint32_t        AverageGioActivity;
+
+       uint8_t         SClkDpmEnabledLevels;
+       uint8_t         MClkDpmEnabledLevels;
+       uint8_t         LClkDpmEnabledLevels;
+       uint8_t         PCIeDpmEnabledLevels;
+
+       uint8_t         UVDDpmEnabledLevels;
+       uint8_t         SAMUDpmEnabledLevels;
+       uint8_t         ACPDpmEnabledLevels;
+       uint8_t         VCEDpmEnabledLevels;
+
+       uint32_t        DRAM_LOG_ADDR_H;
+       uint32_t        DRAM_LOG_ADDR_L;
+       uint32_t        DRAM_LOG_PHY_ADDR_H;
+       uint32_t        DRAM_LOG_PHY_ADDR_L;
+       uint32_t        DRAM_LOG_BUFF_SIZE;
+       uint32_t        UlvEnterCount;
+       uint32_t        UlvTime;
+       uint32_t        UcodeLoadStatus;
+       uint32_t        AllowMvddSwitch;
+       uint8_t         Activity_Weight;
+       uint8_t         Reserved8[3];
+};
+
+typedef struct SMU74_SoftRegisters SMU74_SoftRegisters;
+
+struct SMU74_Firmware_Header {
+       uint32_t Digest[5];
+       uint32_t Version;
+       uint32_t HeaderSize;
+       uint32_t Flags;
+       uint32_t EntryPoint;
+       uint32_t CodeSize;
+       uint32_t ImageSize;
+
+       uint32_t Rtos;
+       uint32_t SoftRegisters;
+       uint32_t DpmTable;
+       uint32_t FanTable;
+       uint32_t CacConfigTable;
+       uint32_t CacStatusTable;
+
+
+       uint32_t mcRegisterTable;
+
+
+       uint32_t mcArbDramTimingTable;
+
+
+
+
+       uint32_t PmFuseTable;
+       uint32_t Globals;
+       uint32_t ClockStretcherTable;
+       uint32_t VftTable;
+       uint32_t Reserved[21];
+       uint32_t Signature;
+};
+
+typedef struct SMU74_Firmware_Header SMU74_Firmware_Header;
+
+#define SMU7_FIRMWARE_HEADER_LOCATION 0x20000
+
+enum  DisplayConfig {
+       PowerDown = 1,
+       DP54x4,
+       DP54x2,
+       DP54x1,
+       DP27x4,
+       DP27x2,
+       DP27x1,
+       HDMI297,
+       HDMI162,
+       LVDS,
+       DP324x4,
+       DP324x2,
+       DP324x1
+};
+
+
+#define MC_BLOCK_COUNT 1
+#define CPL_BLOCK_COUNT 5
+#define SE_BLOCK_COUNT 15
+#define GC_BLOCK_COUNT 24
+
+struct SMU7_Local_Cac {
+       uint8_t BlockId;
+       uint8_t SignalId;
+       uint8_t Threshold;
+       uint8_t Padding;
+};
+
+typedef struct SMU7_Local_Cac SMU7_Local_Cac;
+
+struct SMU7_Local_Cac_Table {
+
+       SMU7_Local_Cac CplLocalCac[CPL_BLOCK_COUNT];
+       SMU7_Local_Cac McLocalCac[MC_BLOCK_COUNT];
+       SMU7_Local_Cac SeLocalCac[SE_BLOCK_COUNT];
+       SMU7_Local_Cac GcLocalCac[GC_BLOCK_COUNT];
+};
+
+typedef struct SMU7_Local_Cac_Table SMU7_Local_Cac_Table;
+
+#pragma pack(pop)
+
+/* Description of Clock Gating bitmask for Tonga:
+ * System Clock Gating
+ */
+#define CG_SYS_BITMASK_FIRST_BIT      0  /* First bit of Sys CG bitmask */
+#define CG_SYS_BITMASK_LAST_BIT       9  /* Last bit of Sys CG bitmask */
+#define CG_SYS_BIF_MGLS_SHIFT         0
+#define CG_SYS_ROM_SHIFT              1
+#define CG_SYS_MC_MGCG_SHIFT          2
+#define CG_SYS_MC_MGLS_SHIFT          3
+#define CG_SYS_SDMA_MGCG_SHIFT        4
+#define CG_SYS_SDMA_MGLS_SHIFT        5
+#define CG_SYS_DRM_MGCG_SHIFT         6
+#define CG_SYS_HDP_MGCG_SHIFT         7
+#define CG_SYS_HDP_MGLS_SHIFT         8
+#define CG_SYS_DRM_MGLS_SHIFT         9
+#define CG_SYS_BIF_MGCG_SHIFT         10
+
+#define CG_SYS_BIF_MGLS_MASK          0x1
+#define CG_SYS_ROM_MASK               0x2
+#define CG_SYS_MC_MGCG_MASK           0x4
+#define CG_SYS_MC_MGLS_MASK           0x8
+#define CG_SYS_SDMA_MGCG_MASK         0x10
+#define CG_SYS_SDMA_MGLS_MASK         0x20
+#define CG_SYS_DRM_MGCG_MASK          0x40
+#define CG_SYS_HDP_MGCG_MASK          0x80
+#define CG_SYS_HDP_MGLS_MASK          0x100
+#define CG_SYS_DRM_MGLS_MASK          0x200
+#define CG_SYS_BIF_MGCG_MASK          0x400
+
+/* Graphics Clock Gating */
+#define CG_GFX_BITMASK_FIRST_BIT      16 /* First bit of Gfx CG bitmask */
+#define CG_GFX_BITMASK_LAST_BIT       24 /* Last bit of Gfx CG bitmask */
+
+#define CG_GFX_CGCG_SHIFT             16
+#define CG_GFX_CGLS_SHIFT             17
+#define CG_CPF_MGCG_SHIFT             18
+#define CG_RLC_MGCG_SHIFT             19
+#define CG_GFX_OTHERS_MGCG_SHIFT      20
+#define CG_GFX_3DCG_SHIFT             21
+#define CG_GFX_3DLS_SHIFT             22
+#define CG_GFX_RLC_LS_SHIFT           23
+#define CG_GFX_CP_LS_SHIFT            24
+
+#define CG_GFX_CGCG_MASK              0x00010000
+#define CG_GFX_CGLS_MASK              0x00020000
+#define CG_CPF_MGCG_MASK              0x00040000
+#define CG_RLC_MGCG_MASK              0x00080000
+#define CG_GFX_OTHERS_MGCG_MASK       0x00100000
+#define CG_GFX_3DCG_MASK              0x00200000
+#define CG_GFX_3DLS_MASK              0x00400000
+#define CG_GFX_RLC_LS_MASK            0x00800000
+#define CG_GFX_CP_LS_MASK             0x01000000
+
+
+/* Voltage Regulator Configuration
+VR Config info is contained in dpmTable.VRConfig */
+
+#define VRCONF_VDDC_MASK         0x000000FF
+#define VRCONF_VDDC_SHIFT        0
+#define VRCONF_VDDGFX_MASK       0x0000FF00
+#define VRCONF_VDDGFX_SHIFT      8
+#define VRCONF_VDDCI_MASK        0x00FF0000
+#define VRCONF_VDDCI_SHIFT       16
+#define VRCONF_MVDD_MASK         0xFF000000
+#define VRCONF_MVDD_SHIFT        24
+
+#define VR_MERGED_WITH_VDDC      0
+#define VR_SVI2_PLANE_1          1
+#define VR_SVI2_PLANE_2          2
+#define VR_SMIO_PATTERN_1        3
+#define VR_SMIO_PATTERN_2        4
+#define VR_STATIC_VOLTAGE        5
+
+/* Clock Stretcher Configuration */
+
+#define CLOCK_STRETCHER_MAX_ENTRIES 0x4
+#define CKS_LOOKUPTable_MAX_ENTRIES 0x4
+
+/* The 'settings' field is subdivided in the following way: */
+#define CLOCK_STRETCHER_SETTING_DDT_MASK             0x01
+#define CLOCK_STRETCHER_SETTING_DDT_SHIFT            0x0
+#define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_MASK  0x1E
+#define CLOCK_STRETCHER_SETTING_STRETCH_AMOUNT_SHIFT 0x1
+#define CLOCK_STRETCHER_SETTING_ENABLE_MASK          0x80
+#define CLOCK_STRETCHER_SETTING_ENABLE_SHIFT         0x7
+
+struct SMU_ClockStretcherDataTableEntry {
+       uint8_t minVID;
+       uint8_t maxVID;
+
+
+       uint16_t setting;
+};
+typedef struct SMU_ClockStretcherDataTableEntry SMU_ClockStretcherDataTableEntry;
+
+struct SMU_ClockStretcherDataTable {
+       SMU_ClockStretcherDataTableEntry ClockStretcherDataTableEntry[CLOCK_STRETCHER_MAX_ENTRIES];
+};
+typedef struct SMU_ClockStretcherDataTable SMU_ClockStretcherDataTable;
+
+struct SMU_CKS_LOOKUPTableEntry {
+       uint16_t minFreq;
+       uint16_t maxFreq;
+
+       uint8_t setting;
+       uint8_t padding[3];
+};
+typedef struct SMU_CKS_LOOKUPTableEntry SMU_CKS_LOOKUPTableEntry;
+
+struct SMU_CKS_LOOKUPTable {
+       SMU_CKS_LOOKUPTableEntry CKS_LOOKUPTableEntry[CKS_LOOKUPTable_MAX_ENTRIES];
+};
+typedef struct SMU_CKS_LOOKUPTable SMU_CKS_LOOKUPTable;
+
+struct AgmAvfsData_t {
+       uint16_t avgPsmCount[28];
+       uint16_t minPsmCount[28];
+};
+
+typedef struct AgmAvfsData_t AgmAvfsData_t;
+
+enum VFT_COLUMNS {
+       SCLK0,
+       SCLK1,
+       SCLK2,
+       SCLK3,
+       SCLK4,
+       SCLK5,
+       SCLK6,
+       SCLK7,
+
+       NUM_VFT_COLUMNS
+};
+
+#define VFT_TABLE_DEFINED
+
+#define TEMP_RANGE_MAXSTEPS 12
+
+struct VFT_CELL_t {
+       uint16_t Voltage;
+};
+
+typedef struct VFT_CELL_t VFT_CELL_t;
+
+struct VFT_TABLE_t {
+       VFT_CELL_t    Cell[TEMP_RANGE_MAXSTEPS][NUM_VFT_COLUMNS];
+       uint16_t      AvfsGbv[NUM_VFT_COLUMNS];
+       uint16_t      BtcGbv[NUM_VFT_COLUMNS];
+       uint16_t      Temperature[TEMP_RANGE_MAXSTEPS];
+
+       uint8_t       NumTemperatureSteps;
+       uint8_t       padding[3];
+};
+
+typedef struct VFT_TABLE_t VFT_TABLE_t;
+
+
+#endif
+
+
diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h b/drivers/gpu/drm/amd/powerplay/inc/smu74_discrete.h
new file mode 100644 (file)
index 0000000..0dfe823
--- /dev/null
@@ -0,0 +1,828 @@
+/*
+ * Copyright 2014 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef SMU74_DISCRETE_H
+#define SMU74_DISCRETE_H
+
+#include "smu74.h"
+
+#pragma pack(push, 1)
+
+
+#define NUM_SCLK_RANGE 8
+
+#define VCO_3_6 1
+#define VCO_2_4 3
+
+#define POSTDIV_DIV_BY_1  0
+#define POSTDIV_DIV_BY_2  1
+#define POSTDIV_DIV_BY_4  2
+#define POSTDIV_DIV_BY_8  3
+#define POSTDIV_DIV_BY_16 4
+
+struct sclkFcwRange_t {
+       uint8_t  vco_setting;
+       uint8_t  postdiv;
+       uint16_t fcw_pcc;
+
+       uint16_t fcw_trans_upper;
+       uint16_t fcw_trans_lower;
+};
+typedef struct sclkFcwRange_t sclkFcwRange_t;
+
+struct SMIO_Pattern {
+       uint16_t Voltage;
+       uint8_t  Smio;
+       uint8_t  padding;
+};
+
+typedef struct SMIO_Pattern SMIO_Pattern;
+
+struct SMIO_Table {
+       SMIO_Pattern Pattern[SMU_MAX_SMIO_LEVELS];
+};
+
+typedef struct SMIO_Table SMIO_Table;
+
+struct SMU_SclkSetting {
+       uint32_t    SclkFrequency;
+       uint16_t    Fcw_int;
+       uint16_t    Fcw_frac;
+       uint16_t    Pcc_fcw_int;
+       uint8_t     PllRange;
+       uint8_t     SSc_En;
+       uint16_t    Sclk_slew_rate;
+       uint16_t    Pcc_up_slew_rate;
+       uint16_t    Pcc_down_slew_rate;
+       uint16_t    Fcw1_int;
+       uint16_t    Fcw1_frac;
+       uint16_t    Sclk_ss_slew_rate;
+};
+typedef struct SMU_SclkSetting SMU_SclkSetting;
+
+struct SMU74_Discrete_GraphicsLevel {
+       SMU_VoltageLevel MinVoltage;
+       uint8_t     pcieDpmLevel;
+       uint8_t     DeepSleepDivId;
+       uint16_t    ActivityLevel;
+       uint32_t    CgSpllFuncCntl3;
+       uint32_t    CgSpllFuncCntl4;
+       uint32_t    CcPwrDynRm;
+       uint32_t    CcPwrDynRm1;
+       uint8_t     SclkDid;
+       uint8_t     padding;
+       uint8_t     EnabledForActivity;
+       uint8_t     EnabledForThrottle;
+       uint8_t     UpHyst;
+       uint8_t     DownHyst;
+       uint8_t     VoltageDownHyst;
+       uint8_t     PowerThrottle;
+       SMU_SclkSetting SclkSetting;
+};
+
+typedef struct SMU74_Discrete_GraphicsLevel SMU74_Discrete_GraphicsLevel;
+
+struct SMU74_Discrete_ACPILevel {
+       uint32_t    Flags;
+       SMU_VoltageLevel MinVoltage;
+       uint32_t    SclkFrequency;
+       uint8_t     SclkDid;
+       uint8_t     DisplayWatermark;
+       uint8_t     DeepSleepDivId;
+       uint8_t     padding;
+       uint32_t    CcPwrDynRm;
+       uint32_t    CcPwrDynRm1;
+
+       SMU_SclkSetting SclkSetting;
+};
+
+typedef struct SMU74_Discrete_ACPILevel SMU74_Discrete_ACPILevel;
+
+struct SMU74_Discrete_Ulv {
+       uint32_t    CcPwrDynRm;
+       uint32_t    CcPwrDynRm1;
+       uint16_t    VddcOffset;
+       uint8_t     VddcOffsetVid;
+       uint8_t     VddcPhase;
+       uint16_t    BifSclkDfs;
+       uint16_t    Reserved;
+};
+
+typedef struct SMU74_Discrete_Ulv SMU74_Discrete_Ulv;
+
+struct SMU74_Discrete_MemoryLevel {
+       SMU_VoltageLevel MinVoltage;
+       uint32_t    MinMvdd;
+
+       uint32_t    MclkFrequency;
+
+       uint8_t     StutterEnable;
+       uint8_t     EnabledForThrottle;
+       uint8_t     EnabledForActivity;
+       uint8_t     padding_0;
+
+       uint8_t     UpHyst;
+       uint8_t     DownHyst;
+       uint8_t     VoltageDownHyst;
+       uint8_t     padding_1;
+
+       uint16_t    ActivityLevel;
+       uint8_t     DisplayWatermark;
+       uint8_t     Reserved;
+};
+
+typedef struct SMU74_Discrete_MemoryLevel SMU74_Discrete_MemoryLevel;
+
+struct SMU74_Discrete_LinkLevel {
+       uint8_t     PcieGenSpeed;
+       uint8_t     PcieLaneCount;
+       uint8_t     EnabledForActivity;
+       uint8_t     SPC;
+       uint32_t    DownThreshold;
+       uint32_t    UpThreshold;
+       uint16_t    BifSclkDfs;
+       uint16_t    Reserved;
+};
+
+typedef struct SMU74_Discrete_LinkLevel SMU74_Discrete_LinkLevel;
+
+struct SMU74_Discrete_MCArbDramTimingTableEntry {
+       uint32_t McArbDramTiming;
+       uint32_t McArbDramTiming2;
+       uint8_t  McArbBurstTime;
+       uint8_t  padding[3];
+};
+
+typedef struct SMU74_Discrete_MCArbDramTimingTableEntry SMU74_Discrete_MCArbDramTimingTableEntry;
+
+struct SMU74_Discrete_MCArbDramTimingTable {
+       SMU74_Discrete_MCArbDramTimingTableEntry entries[SMU__NUM_SCLK_DPM_STATE][SMU__NUM_MCLK_DPM_LEVELS];
+};
+
+typedef struct SMU74_Discrete_MCArbDramTimingTable SMU74_Discrete_MCArbDramTimingTable;
+
+struct SMU74_Discrete_UvdLevel {
+       uint32_t VclkFrequency;
+       uint32_t DclkFrequency;
+       SMU_VoltageLevel MinVoltage;
+       uint8_t  VclkDivider;
+       uint8_t  DclkDivider;
+       uint8_t  padding[2];
+};
+
+typedef struct SMU74_Discrete_UvdLevel SMU74_Discrete_UvdLevel;
+
+struct SMU74_Discrete_ExtClkLevel {
+       uint32_t Frequency;
+       SMU_VoltageLevel MinVoltage;
+       uint8_t  Divider;
+       uint8_t  padding[3];
+};
+
+typedef struct SMU74_Discrete_ExtClkLevel SMU74_Discrete_ExtClkLevel;
+
+struct SMU74_Discrete_StateInfo {
+       uint32_t SclkFrequency;
+       uint32_t MclkFrequency;
+       uint32_t VclkFrequency;
+       uint32_t DclkFrequency;
+       uint32_t SamclkFrequency;
+       uint32_t AclkFrequency;
+       uint32_t EclkFrequency;
+       uint16_t MvddVoltage;
+       uint16_t padding16;
+       uint8_t  DisplayWatermark;
+       uint8_t  McArbIndex;
+       uint8_t  McRegIndex;
+       uint8_t  SeqIndex;
+       uint8_t  SclkDid;
+       int8_t   SclkIndex;
+       int8_t   MclkIndex;
+       uint8_t  PCIeGen;
+};
+
+typedef struct SMU74_Discrete_StateInfo SMU74_Discrete_StateInfo;
+
+struct SMU74_Discrete_DpmTable {
+
+       SMU74_PIDController                  GraphicsPIDController;
+       SMU74_PIDController                  MemoryPIDController;
+       SMU74_PIDController                  LinkPIDController;
+
+       uint32_t                            SystemFlags;
+
+       uint32_t                            VRConfig;
+       uint32_t                            SmioMask1;
+       uint32_t                            SmioMask2;
+       SMIO_Table                          SmioTable1;
+       SMIO_Table                          SmioTable2;
+
+       uint32_t                            MvddLevelCount;
+
+
+       uint8_t                             BapmVddcVidHiSidd[SMU74_MAX_LEVELS_VDDC];
+       uint8_t                             BapmVddcVidLoSidd[SMU74_MAX_LEVELS_VDDC];
+       uint8_t                             BapmVddcVidHiSidd2[SMU74_MAX_LEVELS_VDDC];
+
+       uint8_t                             GraphicsDpmLevelCount;
+       uint8_t                             MemoryDpmLevelCount;
+       uint8_t                             LinkLevelCount;
+       uint8_t                             MasterDeepSleepControl;
+
+       uint8_t                             UvdLevelCount;
+       uint8_t                             VceLevelCount;
+       uint8_t                             AcpLevelCount;
+       uint8_t                             SamuLevelCount;
+
+       uint8_t                             ThermOutGpio;
+       uint8_t                             ThermOutPolarity;
+       uint8_t                             ThermOutMode;
+       uint8_t                             BootPhases;
+       uint32_t                            Reserved[4];
+
+       SMU74_Discrete_GraphicsLevel        GraphicsLevel[SMU74_MAX_LEVELS_GRAPHICS];
+       SMU74_Discrete_MemoryLevel          MemoryACPILevel;
+       SMU74_Discrete_MemoryLevel          MemoryLevel[SMU74_MAX_LEVELS_MEMORY];
+       SMU74_Discrete_LinkLevel            LinkLevel[SMU74_MAX_LEVELS_LINK];
+       SMU74_Discrete_ACPILevel            ACPILevel;
+       SMU74_Discrete_UvdLevel             UvdLevel[SMU74_MAX_LEVELS_UVD];
+       SMU74_Discrete_ExtClkLevel          VceLevel[SMU74_MAX_LEVELS_VCE];
+       SMU74_Discrete_ExtClkLevel          AcpLevel[SMU74_MAX_LEVELS_ACP];
+       SMU74_Discrete_ExtClkLevel          SamuLevel[SMU74_MAX_LEVELS_SAMU];
+       SMU74_Discrete_Ulv                  Ulv;
+
+       uint8_t                             DisplayWatermark[SMU74_MAX_LEVELS_MEMORY][SMU74_MAX_LEVELS_GRAPHICS];
+
+       uint32_t                            SclkStepSize;
+       uint32_t                            Smio[SMU74_MAX_ENTRIES_SMIO];
+
+       uint8_t                             UvdBootLevel;
+       uint8_t                             VceBootLevel;
+       uint8_t                             AcpBootLevel;
+       uint8_t                             SamuBootLevel;
+
+       uint8_t                             GraphicsBootLevel;
+       uint8_t                             GraphicsVoltageChangeEnable;
+       uint8_t                             GraphicsThermThrottleEnable;
+       uint8_t                             GraphicsInterval;
+
+       uint8_t                             VoltageInterval;
+       uint8_t                             ThermalInterval;
+       uint16_t                            TemperatureLimitHigh;
+
+       uint16_t                            TemperatureLimitLow;
+       uint8_t                             MemoryBootLevel;
+       uint8_t                             MemoryVoltageChangeEnable;
+
+       uint16_t                            BootMVdd;
+       uint8_t                             MemoryInterval;
+       uint8_t                             MemoryThermThrottleEnable;
+
+       uint16_t                            VoltageResponseTime;
+       uint16_t                            PhaseResponseTime;
+
+       uint8_t                             PCIeBootLinkLevel;
+       uint8_t                             PCIeGenInterval;
+       uint8_t                             DTEInterval;
+       uint8_t                             DTEMode;
+
+       uint8_t                             SVI2Enable;
+       uint8_t                             VRHotGpio;
+       uint8_t                             AcDcGpio;
+       uint8_t                             ThermGpio;
+
+       uint16_t                            PPM_PkgPwrLimit;
+       uint16_t                            PPM_TemperatureLimit;
+
+       uint16_t                            DefaultTdp;
+       uint16_t                            TargetTdp;
+
+       uint16_t                            FpsHighThreshold;
+       uint16_t                            FpsLowThreshold;
+
+       uint16_t                            BAPMTI_R[SMU74_DTE_ITERATIONS][SMU74_DTE_SOURCES][SMU74_DTE_SINKS];
+       uint16_t                            BAPMTI_RC[SMU74_DTE_ITERATIONS][SMU74_DTE_SOURCES][SMU74_DTE_SINKS];
+
+       uint16_t                            TemperatureLimitEdge;
+       uint16_t                            TemperatureLimitHotspot;
+
+       uint16_t                            BootVddc;
+       uint16_t                            BootVddci;
+
+       uint16_t                            FanGainEdge;
+       uint16_t                            FanGainHotspot;
+
+       uint32_t                            LowSclkInterruptThreshold;
+       uint32_t                            VddGfxReChkWait;
+
+       uint8_t                             ClockStretcherAmount;
+       uint8_t                             Sclk_CKS_masterEn0_7;
+       uint8_t                             Sclk_CKS_masterEn8_15;
+       uint8_t                             DPMFreezeAndForced;
+
+       uint8_t                             Sclk_voltageOffset[8];
+
+       SMU_ClockStretcherDataTable         ClockStretcherDataTable;
+       SMU_CKS_LOOKUPTable                 CKS_LOOKUPTable;
+
+       uint32_t                            CurrSclkPllRange;
+       sclkFcwRange_t                      SclkFcwRangeTable[NUM_SCLK_RANGE];
+};
+
+typedef struct SMU74_Discrete_DpmTable SMU74_Discrete_DpmTable;
+
+
+struct SMU74_Discrete_FanTable {
+       uint16_t FdoMode;
+       int16_t  TempMin;
+       int16_t  TempMed;
+       int16_t  TempMax;
+       int16_t  Slope1;
+       int16_t  Slope2;
+       int16_t  FdoMin;
+       int16_t  HystUp;
+       int16_t  HystDown;
+       int16_t  HystSlope;
+       int16_t  TempRespLim;
+       int16_t  TempCurr;
+       int16_t  SlopeCurr;
+       int16_t  PwmCurr;
+       uint32_t RefreshPeriod;
+       int16_t  FdoMax;
+       uint8_t  TempSrc;
+       int8_t   Padding;
+};
+
+typedef struct SMU74_Discrete_FanTable SMU74_Discrete_FanTable;
+
+#define SMU7_DISCRETE_GPIO_SCLK_DEBUG             4
+#define SMU7_DISCRETE_GPIO_SCLK_DEBUG_BIT         (0x1 << SMU7_DISCRETE_GPIO_SCLK_DEBUG)
+
+
+struct SMU7_MclkDpmScoreboard {
+       uint32_t PercentageBusy;
+
+       int32_t  PIDError;
+       int32_t  PIDIntegral;
+       int32_t  PIDOutput;
+
+       uint32_t SigmaDeltaAccum;
+       uint32_t SigmaDeltaOutput;
+       uint32_t SigmaDeltaLevel;
+
+       uint32_t UtilizationSetpoint;
+
+       uint8_t  TdpClampMode;
+       uint8_t  TdcClampMode;
+       uint8_t  ThermClampMode;
+       uint8_t  VoltageBusy;
+
+       int8_t   CurrLevel;
+       int8_t   TargLevel;
+       uint8_t  LevelChangeInProgress;
+       uint8_t  UpHyst;
+
+       uint8_t  DownHyst;
+       uint8_t  VoltageDownHyst;
+       uint8_t  DpmEnable;
+       uint8_t  DpmRunning;
+
+       uint8_t  DpmForce;
+       uint8_t  DpmForceLevel;
+       uint8_t  padding2;
+       uint8_t  McArbIndex;
+
+       uint32_t MinimumPerfMclk;
+
+       uint8_t  AcpiReq;
+       uint8_t  AcpiAck;
+       uint8_t  MclkSwitchInProgress;
+       uint8_t  MclkSwitchCritical;
+
+       uint8_t  IgnoreVBlank;
+       uint8_t  TargetMclkIndex;
+       uint16_t VbiFailureCount;
+       uint8_t  VbiWaitCounter;
+       uint8_t  EnabledLevelsChange;
+
+       uint16_t LevelResidencyCounters[SMU74_MAX_LEVELS_MEMORY];
+       uint16_t LevelSwitchCounters[SMU74_MAX_LEVELS_MEMORY];
+
+       void     (*TargetStateCalculator)(uint8_t);
+       void     (*SavedTargetStateCalculator)(uint8_t);
+
+       uint16_t AutoDpmInterval;
+       uint16_t AutoDpmRange;
+
+       uint16_t VbiTimeoutCount;
+       uint16_t MclkSwitchingTime;
+
+       uint8_t  fastSwitch;
+       uint8_t  Save_PIC_VDDGFX_EXIT;
+       uint8_t  Save_PIC_VDDGFX_ENTER;
+       uint8_t  padding;
+};
+
+typedef struct SMU7_MclkDpmScoreboard SMU7_MclkDpmScoreboard;
+
+struct SMU7_UlvScoreboard {
+       uint8_t     EnterUlv;
+       uint8_t     ExitUlv;
+       uint8_t     UlvActive;
+       uint8_t     WaitingForUlv;
+       uint8_t     UlvEnable;
+       uint8_t     UlvRunning;
+       uint8_t     UlvMasterEnable;
+       uint8_t     padding;
+       uint32_t    UlvAbortedCount;
+       uint32_t    UlvTimeStamp;
+};
+
+typedef struct SMU7_UlvScoreboard SMU7_UlvScoreboard;
+
+struct VddgfxSavedRegisters {
+       uint32_t GPU_DBG[3];
+       uint32_t MEC_BaseAddress_Hi;
+       uint32_t MEC_BaseAddress_Lo;
+       uint32_t THM_TMON0_CTRL2__RDIR_PRESENT;
+       uint32_t THM_TMON1_CTRL2__RDIR_PRESENT;
+       uint32_t CP_INT_CNTL;
+};
+
+typedef struct VddgfxSavedRegisters VddgfxSavedRegisters;
+
+struct SMU7_VddGfxScoreboard {
+       uint8_t     VddGfxEnable;
+       uint8_t     VddGfxActive;
+       uint8_t     VPUResetOccured;
+       uint8_t     padding;
+
+       uint32_t    VddGfxEnteredCount;
+       uint32_t    VddGfxAbortedCount;
+
+       uint32_t    VddGfxVid;
+
+       VddgfxSavedRegisters SavedRegisters;
+};
+
+typedef struct SMU7_VddGfxScoreboard SMU7_VddGfxScoreboard;
+
+struct SMU7_TdcLimitScoreboard {
+       uint8_t  Enable;
+       uint8_t  Running;
+       uint16_t Alpha;
+       uint32_t FilteredIddc;
+       uint32_t IddcLimit;
+       uint32_t IddcHyst;
+       SMU7_HystController_Data HystControllerData;
+};
+
+typedef struct SMU7_TdcLimitScoreboard SMU7_TdcLimitScoreboard;
+
+struct SMU7_PkgPwrLimitScoreboard {
+       uint8_t  Enable;
+       uint8_t  Running;
+       uint16_t Alpha;
+       uint32_t FilteredPkgPwr;
+       uint32_t Limit;
+       uint32_t Hyst;
+       uint32_t LimitFromDriver;
+       SMU7_HystController_Data HystControllerData;
+};
+
+typedef struct SMU7_PkgPwrLimitScoreboard SMU7_PkgPwrLimitScoreboard;
+
+struct SMU7_BapmScoreboard {
+       uint32_t source_powers[SMU74_DTE_SOURCES];
+       uint32_t source_powers_last[SMU74_DTE_SOURCES];
+       int32_t entity_temperatures[SMU74_NUM_GPU_TES];
+       int32_t initial_entity_temperatures[SMU74_NUM_GPU_TES];
+       int32_t Limit;
+       int32_t Hyst;
+       int32_t therm_influence_coeff_table[SMU74_DTE_ITERATIONS * SMU74_DTE_SOURCES * SMU74_DTE_SINKS * 2];
+       int32_t therm_node_table[SMU74_DTE_ITERATIONS * SMU74_DTE_SOURCES * SMU74_DTE_SINKS];
+       uint16_t ConfigTDPPowerScalar;
+       uint16_t FanSpeedPowerScalar;
+       uint16_t OverDrivePowerScalar;
+       uint16_t OverDriveLimitScalar;
+       uint16_t FinalPowerScalar;
+       uint8_t VariantID;
+       uint8_t spare997;
+
+       SMU7_HystController_Data HystControllerData;
+
+       int32_t temperature_gradient_slope;
+       int32_t temperature_gradient;
+       uint32_t measured_temperature;
+};
+
+
+typedef struct SMU7_BapmScoreboard SMU7_BapmScoreboard;
+
+struct SMU7_AcpiScoreboard {
+       uint32_t SavedInterruptMask[2];
+       uint8_t LastACPIRequest;
+       uint8_t CgBifResp;
+       uint8_t RequestType;
+       uint8_t Padding;
+       SMU74_Discrete_ACPILevel D0Level;
+};
+
+typedef struct SMU7_AcpiScoreboard SMU7_AcpiScoreboard;
+
+struct SMU_QuadraticCoeffs {
+       int32_t m1;
+       uint32_t b;
+
+       int16_t m2;
+       uint8_t m1_shift;
+       uint8_t m2_shift;
+};
+typedef struct SMU_QuadraticCoeffs SMU_QuadraticCoeffs;
+
+struct SMU74_Discrete_PmFuses {
+       uint8_t BapmVddCVidHiSidd[8];
+       uint8_t BapmVddCVidLoSidd[8];
+       uint8_t VddCVid[8];
+       uint8_t SviLoadLineEn;
+       uint8_t SviLoadLineVddC;
+       uint8_t SviLoadLineTrimVddC;
+       uint8_t SviLoadLineOffsetVddC;
+       uint16_t TDC_VDDC_PkgLimit;
+       uint8_t TDC_VDDC_ThrottleReleaseLimitPerc;
+       uint8_t TDC_MAWt;
+       uint8_t TdcWaterfallCtl;
+       uint8_t LPMLTemperatureMin;
+       uint8_t LPMLTemperatureMax;
+       uint8_t Reserved;
+
+       uint8_t LPMLTemperatureScaler[16];
+
+       int16_t FuzzyFan_ErrorSetDelta;
+       int16_t FuzzyFan_ErrorRateSetDelta;
+       int16_t FuzzyFan_PwmSetDelta;
+       uint16_t Reserved6;
+
+       uint8_t GnbLPML[16];
+
+       uint8_t GnbLPMLMaxVid;
+       uint8_t GnbLPMLMinVid;
+       uint8_t Reserved1[2];
+
+       uint16_t BapmVddCBaseLeakageHiSidd;
+       uint16_t BapmVddCBaseLeakageLoSidd;
+
+       uint16_t  VFT_Temp[3];
+       uint16_t  padding;
+
+       SMU_QuadraticCoeffs VFT_ATE[3];
+
+       SMU_QuadraticCoeffs AVFS_GB;
+       SMU_QuadraticCoeffs ATE_ACBTC_GB;
+
+       SMU_QuadraticCoeffs P2V;
+
+       uint32_t PsmCharzFreq;
+
+       uint16_t InversionVoltage;
+       uint16_t PsmCharzTemp;
+
+       uint32_t EnabledAvfsModules;
+};
+
+typedef struct SMU74_Discrete_PmFuses SMU74_Discrete_PmFuses;
+
+struct SMU7_Discrete_Log_Header_Table {
+       uint32_t    version;
+       uint32_t    asic_id;
+       uint16_t    flags;
+       uint16_t    entry_size;
+       uint32_t    total_size;
+       uint32_t    num_of_entries;
+       uint8_t     type;
+       uint8_t     mode;
+       uint8_t     filler_0[2];
+       uint32_t    filler_1[2];
+};
+
+typedef struct SMU7_Discrete_Log_Header_Table SMU7_Discrete_Log_Header_Table;
+
+struct SMU7_Discrete_Log_Cntl {
+       uint8_t             Enabled;
+       uint8_t             Type;
+       uint8_t             padding[2];
+       uint32_t            BufferSize;
+       uint32_t            SamplesLogged;
+       uint32_t            SampleSize;
+       uint32_t            AddrL;
+       uint32_t            AddrH;
+};
+
+typedef struct SMU7_Discrete_Log_Cntl SMU7_Discrete_Log_Cntl;
+
+#if defined SMU__DGPU_ONLY
+#define CAC_ACC_NW_NUM_OF_SIGNALS 87
+#endif
+
+
+struct SMU7_Discrete_Cac_Collection_Table {
+       uint32_t temperature;
+       uint32_t cac_acc_nw[CAC_ACC_NW_NUM_OF_SIGNALS];
+};
+
+typedef struct SMU7_Discrete_Cac_Collection_Table SMU7_Discrete_Cac_Collection_Table;
+
+struct SMU7_Discrete_Cac_Verification_Table {
+       uint32_t VddcTotalPower;
+       uint32_t VddcLeakagePower;
+       uint32_t VddcConstantPower;
+       uint32_t VddcGfxDynamicPower;
+       uint32_t VddcUvdDynamicPower;
+       uint32_t VddcVceDynamicPower;
+       uint32_t VddcAcpDynamicPower;
+       uint32_t VddcPcieDynamicPower;
+       uint32_t VddcDceDynamicPower;
+       uint32_t VddcCurrent;
+       uint32_t VddcVoltage;
+       uint32_t VddciTotalPower;
+       uint32_t VddciLeakagePower;
+       uint32_t VddciConstantPower;
+       uint32_t VddciDynamicPower;
+       uint32_t Vddr1TotalPower;
+       uint32_t Vddr1LeakagePower;
+       uint32_t Vddr1ConstantPower;
+       uint32_t Vddr1DynamicPower;
+       uint32_t spare[4];
+       uint32_t temperature;
+};
+
+typedef struct SMU7_Discrete_Cac_Verification_Table SMU7_Discrete_Cac_Verification_Table;
+
+struct SMU7_Discrete_Pm_Status_Table {
+       int32_t T_meas_max;
+       int32_t T_meas_acc;
+       int32_t T_calc_max;
+       int32_t T_calc_acc;
+       uint32_t P_scalar_acc;
+       uint32_t P_calc_max;
+       uint32_t P_calc_acc;
+
+       uint32_t I_calc_max;
+       uint32_t I_calc_acc;
+       uint32_t I_calc_acc_vddci;
+       uint32_t V_calc_noload_acc;
+       uint32_t V_calc_load_acc;
+       uint32_t V_calc_noload_acc_vddci;
+       uint32_t P_meas_acc;
+       uint32_t V_meas_noload_acc;
+       uint32_t V_meas_load_acc;
+       uint32_t I_meas_acc;
+       uint32_t P_meas_acc_vddci;
+       uint32_t V_meas_noload_acc_vddci;
+       uint32_t V_meas_load_acc_vddci;
+       uint32_t I_meas_acc_vddci;
+
+       uint16_t Sclk_dpm_residency[8];
+       uint16_t Uvd_dpm_residency[8];
+       uint16_t Vce_dpm_residency[8];
+       uint16_t Mclk_dpm_residency[4];
+
+       uint32_t P_vddci_acc;
+       uint32_t P_vddr1_acc;
+       uint32_t P_nte1_acc;
+       uint32_t PkgPwr_max;
+       uint32_t PkgPwr_acc;
+       uint32_t MclkSwitchingTime_max;
+       uint32_t MclkSwitchingTime_acc;
+       uint32_t FanPwm_acc;
+       uint32_t FanRpm_acc;
+
+       uint32_t AccCnt;
+};
+
+typedef struct SMU7_Discrete_Pm_Status_Table SMU7_Discrete_Pm_Status_Table;
+
+#define SMU7_MAX_GFX_CU_COUNT 16
+
+struct SMU7_GfxCuPgScoreboard {
+       uint8_t Enabled;
+       uint8_t WaterfallUp;
+       uint8_t WaterfallDown;
+       uint8_t WaterfallLimit;
+       uint8_t CurrMaxCu;
+       uint8_t TargMaxCu;
+       uint8_t ClampMode;
+       uint8_t Active;
+       uint8_t MaxSupportedCu;
+       uint8_t MinSupportedCu;
+       uint8_t PendingGfxCuHostInterrupt;
+       uint8_t LastFilteredMaxCuInteger;
+       uint16_t FilteredMaxCu;
+       uint16_t FilteredMaxCuAlpha;
+       uint16_t FilterResetCount;
+       uint16_t FilterResetCountLimit;
+       uint8_t ForceCu;
+       uint8_t ForceCuCount;
+       uint8_t spare[2];
+};
+
+typedef struct SMU7_GfxCuPgScoreboard SMU7_GfxCuPgScoreboard;
+
+#define SMU7_SCLK_CAC 0x561
+#define SMU7_MCLK_CAC 0xF9
+#define SMU7_VCLK_CAC 0x2DE
+#define SMU7_DCLK_CAC 0x2DE
+#define SMU7_ECLK_CAC 0x25E
+#define SMU7_ACLK_CAC 0x25E
+#define SMU7_SAMCLK_CAC 0x25E
+#define SMU7_DISPCLK_CAC 0x100
+#define SMU7_CAC_CONSTANT 0x2EE3430
+#define SMU7_CAC_CONSTANT_SHIFT 18
+
+#define SMU7_VDDCI_MCLK_CONST        1765
+#define SMU7_VDDCI_MCLK_CONST_SHIFT  16
+#define SMU7_VDDCI_VDDCI_CONST       50958
+#define SMU7_VDDCI_VDDCI_CONST_SHIFT 14
+#define SMU7_VDDCI_CONST             11781
+#define SMU7_VDDCI_STROBE_PWR        1331
+
+#define SMU7_VDDR1_CONST            693
+#define SMU7_VDDR1_CAC_WEIGHT       20
+#define SMU7_VDDR1_CAC_WEIGHT_SHIFT 19
+#define SMU7_VDDR1_STROBE_PWR       512
+
+#define SMU7_AREA_COEFF_UVD 0xA78
+#define SMU7_AREA_COEFF_VCE 0x190A
+#define SMU7_AREA_COEFF_ACP 0x22D1
+#define SMU7_AREA_COEFF_SAMU 0x534
+
+#define SMU7_THERM_OUT_MODE_DISABLE       0x0
+#define SMU7_THERM_OUT_MODE_THERM_ONLY    0x1
+#define SMU7_THERM_OUT_MODE_THERM_VRHOT   0x2
+
+// DIDT Defines
+#define SQ_Enable_MASK 0x1
+#define SQ_IR_MASK 0x2
+#define SQ_PCC_MASK 0x4
+#define SQ_EDC_MASK 0x8
+
+#define TCP_Enable_MASK 0x100
+#define TCP_IR_MASK 0x200
+#define TCP_PCC_MASK 0x400
+#define TCP_EDC_MASK 0x800
+
+#define TD_Enable_MASK 0x10000
+#define TD_IR_MASK 0x20000
+#define TD_PCC_MASK 0x40000
+#define TD_EDC_MASK 0x80000
+
+#define DB_Enable_MASK 0x1000000
+#define DB_IR_MASK 0x2000000
+#define DB_PCC_MASK 0x4000000 
+#define DB_EDC_MASK 0x8000000
+
+#define SQ_Enable_SHIFT 0
+#define SQ_IR_SHIFT 1
+#define SQ_PCC_SHIFT 2
+#define SQ_EDC_SHIFT 3
+
+#define TCP_Enable_SHIFT 8
+#define TCP_IR_SHIFT 9
+#define TCP_PCC_SHIFT 10
+#define TCP_EDC_SHIFT 11
+
+#define TD_Enable_SHIFT 16
+#define TD_IR_SHIFT 17
+#define TD_PCC_SHIFT 18
+#define TD_EDC_SHIFT 19
+
+#define DB_Enable_SHIFT 24
+#define DB_IR_SHIFT 25
+#define DB_PCC_SHIFT 26 
+#define DB_EDC_SHIFT 27
+
+#pragma pack(pop)
+
+
+#endif
+
index f8ba071f39c853263200614f83e9febe83f1854d..eb0f79f9c8764e4dafab5960852dcdde765e9362 100644 (file)
@@ -1,3 +1,25 @@
+/*
+ * Copyright 2016 Advanced Micro Devices, 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.
+ *
+ */
 // CZ Ucode Loading Definitions
 #ifndef SMU_UCODE_XFER_CZ_H
 #define SMU_UCODE_XFER_CZ_H
index c24a81eebc7cb10c99a6a3b9d7f577a1f9044724..880152c0f775e350e51e0b0ccb5d72ebcd45f806 100644 (file)
@@ -44,6 +44,7 @@
 #define UCODE_ID_IH_REG_RESTORE   11
 #define UCODE_ID_VBIOS            12
 #define UCODE_ID_MISC_METADATA    13
+#define UCODE_ID_SMU_SK                      14
 #define UCODE_ID_RLC_SCRATCH      32
 #define UCODE_ID_RLC_SRM_ARAM     33
 #define UCODE_ID_RLC_SRM_DRAM     34
index 6c4ef135cf0195d6c08fa4cdb7a77cc918d7aea6..f10fb64ef9813820c3b0e42060c985ac3e80620d 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the 'smu manager' sub-component of powerplay.
 # It provides the smu management services for the driver.
 
-SMU_MGR = smumgr.o cz_smumgr.o tonga_smumgr.o fiji_smumgr.o
+SMU_MGR = smumgr.o cz_smumgr.o tonga_smumgr.o fiji_smumgr.o polaris10_smumgr.o
 
 AMD_PP_SMUMGR = $(addprefix $(AMD_PP_PATH)/smumgr/,$(SMU_MGR))
 
index ec222c665602df7113cb4ec75b3fc2633d86a8a4..da18f44fd1c800116afe8367538fc4290459214f 100644 (file)
@@ -39,7 +39,7 @@
 
 #define SIZE_ALIGN_32(x)    (((x) + 31) / 32 * 32)
 
-static enum cz_scratch_entry firmware_list[] = {
+static const enum cz_scratch_entry firmware_list[] = {
        CZ_SCRATCH_ENTRY_UCODE_ID_SDMA0,
        CZ_SCRATCH_ENTRY_UCODE_ID_SDMA1,
        CZ_SCRATCH_ENTRY_UCODE_ID_CP_CE,
index cdbb9f89bf368a59a9811946687d19ba436477b2..673a75c74e18a33c2a42f0ae92bca8e40ee30603 100644 (file)
@@ -44,7 +44,7 @@
 
 #define FIJI_SMC_SIZE 0x20000
 
-struct SMU73_Discrete_GraphicsLevel avfs_graphics_level[8] = {
+static const struct SMU73_Discrete_GraphicsLevel avfs_graphics_level[8] = {
                /*  Min        Sclk       pcie     DeepSleep Activity  CgSpll      CgSpll    spllSpread  SpllSpread   CcPwr  CcPwr  Sclk   Display     Enabled     Enabled                       Voltage    Power */
                /* Voltage,  Frequency,  DpmLevel,  DivId,    Level,  FuncCntl3,  FuncCntl4,  Spectrum,   Spectrum2,  DynRm, DynRm1  Did, Watermark, ForActivity, ForThrottle, UpHyst, DownHyst, DownHyst, Throttle */
                { 0x3c0fd047, 0x30750000,   0x00,     0x03,   0x1e00, 0x00200410, 0x87020000, 0x21680000, 0x0c000000,   0,      0,   0x16,   0x00,       0x01,        0x01,      0x00,   0x00,      0x00,     0x00 },
@@ -189,7 +189,7 @@ int fiji_copy_bytes_to_smc(struct pp_smumgr *smumgr,
 
 int fiji_program_jump_on_start(struct pp_smumgr *smumgr)
 {
-       static unsigned char data[] = { 0xE0, 0x00, 0x80, 0x40 };
+       static const unsigned char data[] = { 0xE0, 0x00, 0x80, 0x40 };
 
        fiji_copy_bytes_to_smc(smumgr, 0x0, data, 4, sizeof(data) + 1);
 
@@ -665,7 +665,7 @@ int fiji_setup_pwr_virus(struct pp_smumgr *smumgr)
 {
        int i, result = -1;
        uint32_t reg, data;
-       PWR_Command_Table *virus = PwrVirusTable;
+       const PWR_Command_Table *virus = PwrVirusTable;
        struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend);
 
        priv->avfs.AvfsBtcStatus = AVFS_LOAD_VIRUS;
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
new file mode 100644 (file)
index 0000000..de618ea
--- /dev/null
@@ -0,0 +1,984 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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 "smumgr.h"
+#include "smu74.h"
+#include "smu_ucode_xfer_vi.h"
+#include "polaris10_smumgr.h"
+#include "smu74_discrete.h"
+#include "smu/smu_7_1_3_d.h"
+#include "smu/smu_7_1_3_sh_mask.h"
+#include "gmc/gmc_8_1_d.h"
+#include "gmc/gmc_8_1_sh_mask.h"
+#include "oss/oss_3_0_d.h"
+#include "gca/gfx_8_0_d.h"
+#include "bif/bif_5_0_d.h"
+#include "bif/bif_5_0_sh_mask.h"
+#include "polaris10_pwrvirus.h"
+#include "ppatomctrl.h"
+#include "pp_debug.h"
+#include "cgs_common.h"
+
+#define POLARIS10_SMC_SIZE 0x20000
+#define VOLTAGE_SCALE 4
+
+/* Microcode file is stored in this buffer */
+#define BUFFER_SIZE                 80000
+#define MAX_STRING_SIZE             15
+#define BUFFER_SIZETWO              131072  /* 128 *1024 */
+
+#define SMC_RAM_END 0x40000
+
+static const SMU74_Discrete_GraphicsLevel avfs_graphics_level_polaris10[8] = {
+       /*  Min      pcie   DeepSleep Activity  CgSpll      CgSpll    CcPwr  CcPwr  Sclk         Enabled      Enabled                       Voltage    Power */
+       /* Voltage, DpmLevel, DivId,  Level,  FuncCntl3,  FuncCntl4,  DynRm, DynRm1 Did, Padding,ForActivity, ForThrottle, UpHyst, DownHyst, DownHyst, Throttle */
+       { 0x3c0fd047, 0x00, 0x03, 0x1e00, 0x00200410, 0x87020000, 0, 0, 0x16, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x30750000, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0xa00fd047, 0x01, 0x04, 0x1e00, 0x00800510, 0x87020000, 0, 0, 0x16, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x409c0000, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0x0410d047, 0x01, 0x00, 0x1e00, 0x00600410, 0x87020000, 0, 0, 0x0e, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x50c30000, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0x6810d047, 0x01, 0x00, 0x1e00, 0x00800410, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x60ea0000, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0xcc10d047, 0x01, 0x00, 0x1e00, 0x00e00410, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0xe8fd0000, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0x3011d047, 0x01, 0x00, 0x1e00, 0x00400510, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x70110100, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0x9411d047, 0x01, 0x00, 0x1e00, 0x00a00510, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0xf8240100, 0, 0, 0, 0, 0, 0, 0 } },
+       { 0xf811d047, 0x01, 0x00, 0x1e00, 0x00000610, 0x87020000, 0, 0, 0x0c, 0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, { 0x80380100, 0, 0, 0, 0, 0, 0, 0 } }
+};
+
+static const SMU74_Discrete_MemoryLevel avfs_memory_level_polaris10 =
+       {0x50140000, 0x50140000, 0x00320000, 0x00, 0x00,
+        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0000, 0x00, 0x00};
+
+/**
+* Set the address for reading/writing the SMC SRAM space.
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    smcAddress the address in the SMC RAM to access.
+*/
+static int polaris10_set_smc_sram_address(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t limit)
+{
+       PP_ASSERT_WITH_CODE((0 == (3 & smc_addr)), "SMC address must be 4 byte aligned.", return -EINVAL);
+       PP_ASSERT_WITH_CODE((limit > (smc_addr + 3)), "SMC addr is beyond the SMC RAM area.", return -EINVAL);
+
+       cgs_write_register(smumgr->device, mmSMC_IND_INDEX_11, smc_addr);
+       SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0);
+
+       return 0;
+}
+
+/**
+* Copy bytes from SMC RAM space into driver memory.
+*
+* @param    smumgr  the address of the powerplay SMU manager.
+* @param    smc_start_address the start address in the SMC RAM to copy bytes from
+* @param    src the byte array to copy the bytes to.
+* @param    byte_count the number of bytes to copy.
+*/
+int polaris10_copy_bytes_from_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address, uint32_t *dest, uint32_t byte_count, uint32_t limit)
+{
+       uint32_t data;
+       uint32_t addr;
+       uint8_t *dest_byte;
+       uint8_t i, data_byte[4] = {0};
+       uint32_t *pdata = (uint32_t *)&data_byte;
+
+       PP_ASSERT_WITH_CODE((0 == (3 & smc_start_address)), "SMC address must be 4 byte aligned.", return -1;);
+       PP_ASSERT_WITH_CODE((limit > (smc_start_address + byte_count)), "SMC address is beyond the SMC RAM area.", return -1);
+
+       addr = smc_start_address;
+
+       while (byte_count >= 4) {
+               polaris10_read_smc_sram_dword(smumgr, addr, &data, limit);
+
+               *dest = PP_SMC_TO_HOST_UL(data);
+
+               dest += 1;
+               byte_count -= 4;
+               addr += 4;
+       }
+
+       if (byte_count) {
+               polaris10_read_smc_sram_dword(smumgr, addr, &data, limit);
+               *pdata = PP_SMC_TO_HOST_UL(data);
+       /* Cast dest into byte type in dest_byte.  This way, we don't overflow if the allocated memory is not 4-byte aligned. */
+               dest_byte = (uint8_t *)dest;
+               for (i = 0; i < byte_count; i++)
+                       dest_byte[i] = data_byte[i];
+       }
+
+       return 0;
+}
+
+/**
+* Copy bytes from an array into the SMC RAM space.
+*
+* @param    pSmuMgr  the address of the powerplay SMU manager.
+* @param    smc_start_address the start address in the SMC RAM to copy bytes to.
+* @param    src the byte array to copy the bytes from.
+* @param    byte_count the number of bytes to copy.
+*/
+int polaris10_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
+                               const uint8_t *src, uint32_t byte_count, uint32_t limit)
+{
+       int result;
+       uint32_t data = 0;
+       uint32_t original_data;
+       uint32_t addr = 0;
+       uint32_t extra_shift;
+
+       PP_ASSERT_WITH_CODE((0 == (3 & smc_start_address)), "SMC address must be 4 byte aligned.", return -1);
+       PP_ASSERT_WITH_CODE((limit > (smc_start_address + byte_count)), "SMC address is beyond the SMC RAM area.", return -1);
+
+       addr = smc_start_address;
+
+       while (byte_count >= 4) {
+       /* Bytes are written into the SMC addres space with the MSB first. */
+               data = src[0] * 0x1000000 + src[1] * 0x10000 + src[2] * 0x100 + src[3];
+
+               result = polaris10_set_smc_sram_address(smumgr, addr, limit);
+
+               if (0 != result)
+                       return result;
+
+               cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, data);
+
+               src += 4;
+               byte_count -= 4;
+               addr += 4;
+       }
+
+       if (0 != byte_count) {
+
+               data = 0;
+
+               result = polaris10_set_smc_sram_address(smumgr, addr, limit);
+
+               if (0 != result)
+                       return result;
+
+
+               original_data = cgs_read_register(smumgr->device, mmSMC_IND_DATA_11);
+
+               extra_shift = 8 * (4 - byte_count);
+
+               while (byte_count > 0) {
+                       /* Bytes are written into the SMC addres space with the MSB first. */
+                       data = (0x100 * data) + *src++;
+                       byte_count--;
+               }
+
+               data <<= extra_shift;
+
+               data |= (original_data & ~((~0UL) << extra_shift));
+
+               result = polaris10_set_smc_sram_address(smumgr, addr, limit);
+
+               if (0 != result)
+                       return result;
+
+               cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, data);
+       }
+
+       return 0;
+}
+
+
+static int polaris10_program_jump_on_start(struct pp_smumgr *smumgr)
+{
+       static const unsigned char data[4] = { 0xE0, 0x00, 0x80, 0x40 };
+
+       polaris10_copy_bytes_to_smc(smumgr, 0x0, data, 4, sizeof(data)+1);
+
+       return 0;
+}
+
+/**
+* Return if the SMC is currently running.
+*
+* @param    smumgr  the address of the powerplay hardware manager.
+*/
+bool polaris10_is_smc_ram_running(struct pp_smumgr *smumgr)
+{
+       return ((0 == SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMC_SYSCON_CLOCK_CNTL_0, ck_disable))
+       && (0x20100 <= cgs_read_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMC_PC_C)));
+}
+
+/**
+* Send a message to the SMC, and wait for its response.
+*
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    msg the message to send.
+* @return   The response that came from the SMC.
+*/
+int polaris10_send_msg_to_smc(struct pp_smumgr *smumgr, uint16_t msg)
+{
+       if (!polaris10_is_smc_ram_running(smumgr))
+               return -1;
+
+       SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
+
+       if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP))
+               printk("Failed to send Previous Message.\n");
+
+
+       cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
+
+       SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
+
+       if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP))
+               printk("Failed to send Message.\n");
+
+       return 0;
+}
+
+
+/**
+* Send a message to the SMC, and do not wait for its response.
+*
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    msg the message to send.
+* @return   Always return 0.
+*/
+int polaris10_send_msg_to_smc_without_waiting(struct pp_smumgr *smumgr, uint16_t msg)
+{
+       cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, msg);
+
+       return 0;
+}
+
+/**
+* Send a message to the SMC with parameter
+*
+* @param    smumgr:  the address of the powerplay hardware manager.
+* @param    msg: the message to send.
+* @param    parameter: the parameter to send
+* @return   The response that came from the SMC.
+*/
+int polaris10_send_msg_to_smc_with_parameter(struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
+{
+       if (!polaris10_is_smc_ram_running(smumgr)) {
+               return -1;
+       }
+
+       SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
+
+       cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, parameter);
+
+       return polaris10_send_msg_to_smc(smumgr, msg);
+}
+
+
+/**
+* Send a message to the SMC with parameter, do not wait for response
+*
+* @param    smumgr:  the address of the powerplay hardware manager.
+* @param    msg: the message to send.
+* @param    parameter: the parameter to send
+* @return   The response that came from the SMC.
+*/
+int polaris10_send_msg_to_smc_with_parameter_without_waiting(struct pp_smumgr *smumgr, uint16_t msg, uint32_t parameter)
+{
+       cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, parameter);
+
+       return polaris10_send_msg_to_smc_without_waiting(smumgr, msg);
+}
+
+int polaris10_send_msg_to_smc_offset(struct pp_smumgr *smumgr)
+{
+       cgs_write_register(smumgr->device, mmSMC_MSG_ARG_0, 0x20000);
+
+       cgs_write_register(smumgr->device, mmSMC_MESSAGE_0, PPSMC_MSG_Test);
+
+       SMUM_WAIT_FIELD_UNEQUAL(smumgr, SMC_RESP_0, SMC_RESP, 0);
+
+       if (1 != SMUM_READ_FIELD(smumgr->device, SMC_RESP_0, SMC_RESP))
+               printk("Failed to send Message.\n");
+
+       return 0;
+}
+
+/**
+* Wait until the SMC is doing nithing. Doing nothing means that the SMC is either turned off or it is sitting on the STOP instruction.
+*
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    msg the message to send.
+* @return   The response that came from the SMC.
+*/
+int polaris10_wait_for_smc_inactive(struct pp_smumgr *smumgr)
+{
+       /* If the SMC is not even on it qualifies as inactive. */
+       if (!polaris10_is_smc_ram_running(smumgr))
+               return -1;
+
+       SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, SMC_SYSCON_CLOCK_CNTL_0, cken, 0);
+       return 0;
+}
+
+
+/**
+* Upload the SMC firmware to the SMC microcontroller.
+*
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    pFirmware the data structure containing the various sections of the firmware.
+*/
+static int polaris10_upload_smc_firmware_data(struct pp_smumgr *smumgr, uint32_t length, uint32_t *src, uint32_t limit)
+{
+       uint32_t byte_count = length;
+
+       PP_ASSERT_WITH_CODE((limit >= byte_count), "SMC address is beyond the SMC RAM area.", return -1);
+
+       cgs_write_register(smumgr->device, mmSMC_IND_INDEX_11, 0x20000);
+       SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 1);
+
+       for (; byte_count >= 4; byte_count -= 4)
+               cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, *src++);
+
+       SMUM_WRITE_FIELD(smumgr->device, SMC_IND_ACCESS_CNTL, AUTO_INCREMENT_IND_11, 0);
+
+       PP_ASSERT_WITH_CODE((0 == byte_count), "SMC size must be dividable by 4.", return -1);
+
+       return 0;
+}
+
+static enum cgs_ucode_id polaris10_convert_fw_type_to_cgs(uint32_t fw_type)
+{
+       enum cgs_ucode_id result = CGS_UCODE_ID_MAXIMUM;
+
+       switch (fw_type) {
+       case UCODE_ID_SMU:
+               result = CGS_UCODE_ID_SMU;
+               break;
+       case UCODE_ID_SMU_SK:
+               result = CGS_UCODE_ID_SMU_SK;
+               break;
+       case UCODE_ID_SDMA0:
+               result = CGS_UCODE_ID_SDMA0;
+               break;
+       case UCODE_ID_SDMA1:
+               result = CGS_UCODE_ID_SDMA1;
+               break;
+       case UCODE_ID_CP_CE:
+               result = CGS_UCODE_ID_CP_CE;
+               break;
+       case UCODE_ID_CP_PFP:
+               result = CGS_UCODE_ID_CP_PFP;
+               break;
+       case UCODE_ID_CP_ME:
+               result = CGS_UCODE_ID_CP_ME;
+               break;
+       case UCODE_ID_CP_MEC:
+               result = CGS_UCODE_ID_CP_MEC;
+               break;
+       case UCODE_ID_CP_MEC_JT1:
+               result = CGS_UCODE_ID_CP_MEC_JT1;
+               break;
+       case UCODE_ID_CP_MEC_JT2:
+               result = CGS_UCODE_ID_CP_MEC_JT2;
+               break;
+       case UCODE_ID_RLC_G:
+               result = CGS_UCODE_ID_RLC_G;
+               break;
+       default:
+               break;
+       }
+
+       return result;
+}
+
+static int polaris10_upload_smu_firmware_image(struct pp_smumgr *smumgr)
+{
+       int result = 0;
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+
+       struct cgs_firmware_info info = {0};
+
+       if (smu_data->security_hard_key == 1)
+               cgs_get_firmware_info(smumgr->device,
+                       polaris10_convert_fw_type_to_cgs(UCODE_ID_SMU), &info);
+       else
+               cgs_get_firmware_info(smumgr->device,
+                       polaris10_convert_fw_type_to_cgs(UCODE_ID_SMU_SK), &info);
+
+       /* TO DO cgs_init_samu_load_smu(smumgr->device, (uint32_t *)info.kptr, info.image_size, smu_data->post_initial_boot);*/
+       result = polaris10_upload_smc_firmware_data(smumgr, info.image_size, (uint32_t *)info.kptr, POLARIS10_SMC_SIZE);
+
+       return result;
+}
+
+/**
+* Read a 32bit value from the SMC SRAM space.
+* ALL PARAMETERS ARE IN HOST BYTE ORDER.
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    smcAddress the address in the SMC RAM to access.
+* @param    value and output parameter for the data read from the SMC SRAM.
+*/
+int polaris10_read_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t *value, uint32_t limit)
+{
+       int result;
+
+       result = polaris10_set_smc_sram_address(smumgr, smc_addr, limit);
+
+       if (result)
+               return result;
+
+       *value = cgs_read_register(smumgr->device, mmSMC_IND_DATA_11);
+       return 0;
+}
+
+/**
+* Write a 32bit value to the SMC SRAM space.
+* ALL PARAMETERS ARE IN HOST BYTE ORDER.
+* @param    smumgr  the address of the powerplay hardware manager.
+* @param    smc_addr the address in the SMC RAM to access.
+* @param    value to write to the SMC SRAM.
+*/
+int polaris10_write_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t value, uint32_t limit)
+{
+       int result;
+
+       result = polaris10_set_smc_sram_address(smumgr, smc_addr, limit);
+
+       if (result)
+               return result;
+
+       cgs_write_register(smumgr->device, mmSMC_IND_DATA_11, value);
+
+       return 0;
+}
+
+
+int polaris10_smu_fini(struct pp_smumgr *smumgr)
+{
+       if (smumgr->backend) {
+               kfree(smumgr->backend);
+               smumgr->backend = NULL;
+       }
+       return 0;
+}
+
+/* Convert the firmware type to SMU type mask. For MEC, we need to check all MEC related type */
+static uint32_t polaris10_get_mask_for_firmware_type(uint32_t fw_type)
+{
+       uint32_t result = 0;
+
+       switch (fw_type) {
+       case UCODE_ID_SDMA0:
+               result = UCODE_ID_SDMA0_MASK;
+               break;
+       case UCODE_ID_SDMA1:
+               result = UCODE_ID_SDMA1_MASK;
+               break;
+       case UCODE_ID_CP_CE:
+               result = UCODE_ID_CP_CE_MASK;
+               break;
+       case UCODE_ID_CP_PFP:
+               result = UCODE_ID_CP_PFP_MASK;
+               break;
+       case UCODE_ID_CP_ME:
+               result = UCODE_ID_CP_ME_MASK;
+               break;
+       case UCODE_ID_CP_MEC_JT1:
+       case UCODE_ID_CP_MEC_JT2:
+               result = UCODE_ID_CP_MEC_MASK;
+               break;
+       case UCODE_ID_RLC_G:
+               result = UCODE_ID_RLC_G_MASK;
+               break;
+       default:
+               printk("UCode type is out of range! \n");
+               result = 0;
+       }
+
+       return result;
+}
+
+/* Populate one firmware image to the data structure */
+
+static int polaris10_populate_single_firmware_entry(struct pp_smumgr *smumgr,
+                                               uint32_t fw_type,
+                                               struct SMU_Entry *entry)
+{
+       int result = 0;
+       struct cgs_firmware_info info = {0};
+
+       result = cgs_get_firmware_info(smumgr->device,
+                               polaris10_convert_fw_type_to_cgs(fw_type),
+                               &info);
+
+       if (!result) {
+               entry->version = info.version;
+               entry->id = (uint16_t)fw_type;
+               entry->image_addr_high = smu_upper_32_bits(info.mc_addr);
+               entry->image_addr_low = smu_lower_32_bits(info.mc_addr);
+               entry->meta_data_addr_high = 0;
+               entry->meta_data_addr_low = 0;
+               entry->data_size_byte = info.image_size;
+               entry->num_register_entries = 0;
+       }
+
+       if (fw_type == UCODE_ID_RLC_G)
+               entry->flags = 1;
+       else
+               entry->flags = 0;
+
+       return 0;
+}
+
+static int polaris10_request_smu_load_fw(struct pp_smumgr *smumgr)
+{
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+       uint32_t fw_to_load;
+
+       int result = 0;
+       struct SMU_DRAMData_TOC *toc;
+
+       if (!smumgr->reload_fw) {
+               printk(KERN_INFO "[ powerplay ] skip reloading...\n");
+               return 0;
+       }
+
+       if (smu_data->soft_regs_start)
+               cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
+                                       smu_data->soft_regs_start + offsetof(SMU74_SoftRegisters, UcodeLoadStatus),
+                                       0x0);
+
+       polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_SMU_DRAM_ADDR_HI, smu_data->smu_buffer.mc_addr_high);
+       polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_SMU_DRAM_ADDR_LO, smu_data->smu_buffer.mc_addr_low);
+
+       toc = (struct SMU_DRAMData_TOC *)smu_data->header;
+       toc->num_entries = 0;
+       toc->structure_version = 1;
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_RLC_G, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_CE, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_PFP, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_ME, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_MEC, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_MEC_JT1, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_CP_MEC_JT2, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_SDMA0, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+       PP_ASSERT_WITH_CODE(0 == polaris10_populate_single_firmware_entry(smumgr, UCODE_ID_SDMA1, &toc->entry[toc->num_entries++]), "Failed to Get Firmware Entry.", return -1);
+
+       polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_data->header_buffer.mc_addr_high);
+       polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_DRV_DRAM_ADDR_LO, smu_data->header_buffer.mc_addr_low);
+
+       fw_to_load = UCODE_ID_RLC_G_MASK
+                  + UCODE_ID_SDMA0_MASK
+                  + UCODE_ID_SDMA1_MASK
+                  + UCODE_ID_CP_CE_MASK
+                  + UCODE_ID_CP_ME_MASK
+                  + UCODE_ID_CP_PFP_MASK
+                  + UCODE_ID_CP_MEC_MASK;
+
+       if (polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_LoadUcodes, fw_to_load))
+               printk(KERN_ERR "Fail to Request SMU Load uCode");
+
+       return result;
+}
+
+/* Check if the FW has been loaded, SMU will not return if loading has not finished. */
+static int polaris10_check_fw_load_finish(struct pp_smumgr *smumgr, uint32_t fw_type)
+{
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+       uint32_t fw_mask = polaris10_get_mask_for_firmware_type(fw_type);
+       uint32_t ret;
+       /* Check SOFT_REGISTERS_TABLE_28.UcodeLoadStatus */
+       ret = smum_wait_on_indirect_register(smumgr, mmSMC_IND_INDEX_11,
+                                       smu_data->soft_regs_start + offsetof(SMU74_SoftRegisters, UcodeLoadStatus),
+                                       fw_mask, fw_mask);
+
+       return ret;
+}
+
+static int polaris10_reload_firmware(struct pp_smumgr *smumgr)
+{
+       return smumgr->smumgr_funcs->start_smu(smumgr);
+}
+
+static int polaris10_setup_pwr_virus(struct pp_smumgr *smumgr)
+{
+       int i;
+       int result = -1;
+       uint32_t reg, data;
+
+       const PWR_Command_Table *pvirus = pwr_virus_table;
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+
+
+       for (i = 0; i < PWR_VIRUS_TABLE_SIZE; i++) {
+               switch (pvirus->command) {
+               case PwrCmdWrite:
+                       reg  = pvirus->reg;
+                       data = pvirus->data;
+                       cgs_write_register(smumgr->device, reg, data);
+                       break;
+
+               case PwrCmdEnd:
+                       result = 0;
+                       break;
+
+               default:
+                       printk("Table Exit with Invalid Command!");
+                       smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
+                       result = -1;
+                       break;
+               }
+               pvirus++;
+       }
+
+       return result;
+}
+
+static int polaris10_perform_btc(struct pp_smumgr *smumgr)
+{
+       int result = 0;
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+
+       if (0 != smu_data->avfs.avfs_btc_param) {
+               if (0 != polaris10_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_PerformBtc, smu_data->avfs.avfs_btc_param)) {
+                       printk("[AVFS][SmuPolaris10_PerformBtc] PerformBTC SMU msg failed");
+                       result = -1;
+               }
+       }
+       if (smu_data->avfs.avfs_btc_param > 1) {
+               /* Soft-Reset to reset the engine before loading uCode */
+               /* halt */
+               cgs_write_register(smumgr->device, mmCP_MEC_CNTL, 0x50000000);
+               /* reset everything */
+               cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0xffffffff);
+               cgs_write_register(smumgr->device, mmGRBM_SOFT_RESET, 0);
+       }
+       return result;
+}
+
+
+int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr)
+{
+       uint32_t vr_config;
+       uint32_t dpm_table_start;
+
+       uint16_t u16_boot_mvdd;
+       uint32_t graphics_level_address, vr_config_address, graphics_level_size;
+
+       graphics_level_size = sizeof(avfs_graphics_level_polaris10);
+       u16_boot_mvdd = PP_HOST_TO_SMC_US(1300 * VOLTAGE_SCALE);
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_read_smc_sram_dword(smumgr,
+                               SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, DpmTable),
+                               &dpm_table_start, 0x40000),
+                       "[AVFS][Polaris10_SetupGfxLvlStruct] SMU could not communicate starting address of DPM table",
+                       return -1);
+
+       /*  Default value for VRConfig = VR_MERGED_WITH_VDDC + VR_STATIC_VOLTAGE(VDDCI) */
+       vr_config = 0x01000500; /* Real value:0x50001 */
+
+       vr_config_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, VRConfig);
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_copy_bytes_to_smc(smumgr, vr_config_address,
+                               (uint8_t *)&vr_config, sizeof(uint32_t), 0x40000),
+                       "[AVFS][Polaris10_SetupGfxLvlStruct] Problems copying VRConfig value over to SMC",
+                       return -1);
+
+       graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, GraphicsLevel);
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_copy_bytes_to_smc(smumgr, graphics_level_address,
+                               (uint8_t *)(&avfs_graphics_level_polaris10),
+                               graphics_level_size, 0x40000),
+                       "[AVFS][Polaris10_SetupGfxLvlStruct] Copying of SCLK DPM table failed!",
+                       return -1);
+
+       graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, MemoryLevel);
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_copy_bytes_to_smc(smumgr, graphics_level_address,
+                               (uint8_t *)(&avfs_memory_level_polaris10), sizeof(avfs_memory_level_polaris10), 0x40000),
+                               "[AVFS][Polaris10_SetupGfxLvlStruct] Copying of MCLK DPM table failed!",
+                       return -1);
+
+       /* MVDD Boot value - neccessary for getting rid of the hang that occurs during Mclk DPM enablement */
+
+       graphics_level_address = dpm_table_start + offsetof(SMU74_Discrete_DpmTable, BootMVdd);
+
+       PP_ASSERT_WITH_CODE(0 == polaris10_copy_bytes_to_smc(smumgr, graphics_level_address,
+                       (uint8_t *)(&u16_boot_mvdd), sizeof(u16_boot_mvdd), 0x40000),
+                       "[AVFS][Polaris10_SetupGfxLvlStruct] Copying of DPM table failed!",
+                       return -1);
+
+       return 0;
+}
+
+int polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT)
+{
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+
+       switch (smu_data->avfs.avfs_btc_status) {
+       case AVFS_BTC_COMPLETED_PREVIOUSLY:
+               break;
+
+       case AVFS_BTC_BOOT: /* Cold Boot State - Post SMU Start */
+
+               smu_data->avfs.avfs_btc_status = AVFS_BTC_DPMTABLESETUP_FAILED;
+               PP_ASSERT_WITH_CODE(0 == polaris10_setup_graphics_level_structure(smumgr),
+               "[AVFS][Polaris10_AVFSEventMgr] Could not Copy Graphics Level table over to SMU",
+               return -1);
+
+               if (smu_data->avfs.avfs_btc_param > 1) {
+                       printk("[AVFS][Polaris10_AVFSEventMgr] AC BTC has not been successfully verified on Fiji. There may be in this setting.");
+                       smu_data->avfs.avfs_btc_status = AVFS_BTC_VIRUS_FAIL;
+                       PP_ASSERT_WITH_CODE(-1 == polaris10_setup_pwr_virus(smumgr),
+                       "[AVFS][Polaris10_AVFSEventMgr] Could not setup Pwr Virus for AVFS ",
+                       return -1);
+               }
+
+               smu_data->avfs.avfs_btc_status = AVFS_BTC_FAILED;
+               PP_ASSERT_WITH_CODE(0 == polaris10_perform_btc(smumgr),
+                                       "[AVFS][Polaris10_AVFSEventMgr] Failure at SmuPolaris10_PerformBTC. AVFS Disabled",
+                                return -1);
+
+               break;
+
+       case AVFS_BTC_DISABLED:
+       case AVFS_BTC_NOTSUPPORTED:
+               break;
+
+       default:
+               printk("[AVFS] Something is broken. See log!");
+               break;
+       }
+
+       return 0;
+}
+
+static int polaris10_start_smu_in_protection_mode(struct pp_smumgr *smumgr)
+{
+       int result = 0;
+
+       /* Wait for smc boot up */
+       /* SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, RCU_UC_EVENTS, boot_seq_done, 0) */
+
+       /* Assert reset */
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL, rst_reg, 1);
+
+       result = polaris10_upload_smu_firmware_image(smumgr);
+       if (result != 0)
+               return result;
+
+       /* Clear status */
+       cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC, ixSMU_STATUS, 0);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
+
+       /* De-assert reset */
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL, rst_reg, 0);
+
+
+       SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, RCU_UC_EVENTS, INTERRUPTS_ENABLED, 1);
+
+
+       /* Call Test SMU message with 0x20000 offset to trigger SMU start */
+       polaris10_send_msg_to_smc_offset(smumgr);
+
+       /* Wait done bit to be set */
+       /* Check pass/failed indicator */
+
+       SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, SMU_STATUS, SMU_DONE, 0);
+
+       if (1 != SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                               SMU_STATUS, SMU_PASS))
+               PP_ASSERT_WITH_CODE(false, "SMU Firmware start failed!", return -1);
+
+       cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC, ixFIRMWARE_FLAGS, 0);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL, rst_reg, 1);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL, rst_reg, 0);
+
+       /* Wait for firmware to initialize */
+       SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND, FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
+
+       return result;
+}
+
+static int polaris10_start_smu_in_non_protection_mode(struct pp_smumgr *smumgr)
+{
+       int result = 0;
+
+       /* wait for smc boot up */
+       SMUM_WAIT_VFPF_INDIRECT_FIELD_UNEQUAL(smumgr, SMC_IND, RCU_UC_EVENTS, boot_seq_done, 0);
+
+       /* Clear firmware interrupt enable flag */
+       /* SMUM_WRITE_VFPF_INDIRECT_FIELD(pSmuMgr, SMC_IND, SMC_SYSCON_MISC_CNTL, pre_fetcher_en, 1); */
+       cgs_write_ind_register(smumgr->device, CGS_IND_REG__SMC,
+                               ixFIRMWARE_FLAGS, 0);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL,
+                                       rst_reg, 1);
+
+       result = polaris10_upload_smu_firmware_image(smumgr);
+       if (result != 0)
+               return result;
+
+       /* Set smc instruct start point at 0x0 */
+       polaris10_program_jump_on_start(smumgr);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_CLOCK_CNTL_0, ck_disable, 0);
+
+       SMUM_WRITE_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC,
+                                       SMC_SYSCON_RESET_CNTL, rst_reg, 0);
+
+       /* Wait for firmware to initialize */
+
+       SMUM_WAIT_VFPF_INDIRECT_FIELD(smumgr, SMC_IND,
+                                       FIRMWARE_FLAGS, INTERRUPTS_ENABLED, 1);
+
+       return result;
+}
+
+static int polaris10_start_smu(struct pp_smumgr *smumgr)
+{
+       int result = 0;
+       struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+       bool SMU_VFT_INTACT;
+
+       /* Only start SMC if SMC RAM is not running */
+       if (!polaris10_is_smc_ram_running(smumgr)) {
+               SMU_VFT_INTACT = false;
+               smu_data->protected_mode = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_MODE));
+               smu_data->security_hard_key = (uint8_t) (SMUM_READ_VFPF_INDIRECT_FIELD(smumgr->device, CGS_IND_REG__SMC, SMU_FIRMWARE, SMU_SEL));
+
+               /* Check if SMU is running in protected mode */
+               if (smu_data->protected_mode == 0) {
+                       result = polaris10_start_smu_in_non_protection_mode(smumgr);
+               } else {
+                       result = polaris10_start_smu_in_protection_mode(smumgr);
+
+                       /* If failed, try with different security Key. */
+                       if (result != 0) {
+                               smu_data->security_hard_key ^= 1;
+                               result = polaris10_start_smu_in_protection_mode(smumgr);
+                       }
+               }
+
+               if (result != 0)
+                       PP_ASSERT_WITH_CODE(0, "Failed to load SMU ucode.", return result);
+
+               polaris10_avfs_event_mgr(smumgr, true);
+       } else
+               SMU_VFT_INTACT = true; /*Driver went offline but SMU was still alive and contains the VFT table */
+
+       smu_data->post_initial_boot = true;
+       polaris10_avfs_event_mgr(smumgr, SMU_VFT_INTACT);
+       /* Setup SoftRegsStart here for register lookup in case DummyBackEnd is used and ProcessFirmwareHeader is not executed */
+       polaris10_read_smc_sram_dword(smumgr, SMU7_FIRMWARE_HEADER_LOCATION + offsetof(SMU74_Firmware_Header, SoftRegisters),
+                                       &(smu_data->soft_regs_start), 0x40000);
+
+       result = polaris10_request_smu_load_fw(smumgr);
+
+       return result;
+}
+
+static int polaris10_smu_init(struct pp_smumgr *smumgr)
+{
+       struct polaris10_smumgr *smu_data;
+       uint8_t *internal_buf;
+       uint64_t mc_addr = 0;
+       /* Allocate memory for backend private data */
+       smu_data = (struct polaris10_smumgr *)(smumgr->backend);
+       smu_data->header_buffer.data_size =
+               ((sizeof(struct SMU_DRAMData_TOC) / 4096) + 1) * 4096;
+       smu_data->smu_buffer.data_size = 200*4096;
+       smu_data->avfs.avfs_btc_status = AVFS_BTC_NOTSUPPORTED;
+/* Allocate FW image data structure and header buffer and
+ * send the header buffer address to SMU */
+       smu_allocate_memory(smumgr->device,
+               smu_data->header_buffer.data_size,
+               CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+               PAGE_SIZE,
+               &mc_addr,
+               &smu_data->header_buffer.kaddr,
+               &smu_data->header_buffer.handle);
+
+       smu_data->header = smu_data->header_buffer.kaddr;
+       smu_data->header_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+       smu_data->header_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
+
+       PP_ASSERT_WITH_CODE((NULL != smu_data->header),
+               "Out of memory.",
+               kfree(smumgr->backend);
+               cgs_free_gpu_mem(smumgr->device,
+               (cgs_handle_t)smu_data->header_buffer.handle);
+               return -1);
+
+/* Allocate buffer for SMU internal buffer and send the address to SMU.
+ * Iceland SMU does not need internal buffer.*/
+       smu_allocate_memory(smumgr->device,
+               smu_data->smu_buffer.data_size,
+               CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB,
+               PAGE_SIZE,
+               &mc_addr,
+               &smu_data->smu_buffer.kaddr,
+               &smu_data->smu_buffer.handle);
+
+       internal_buf = smu_data->smu_buffer.kaddr;
+       smu_data->smu_buffer.mc_addr_high = smu_upper_32_bits(mc_addr);
+       smu_data->smu_buffer.mc_addr_low = smu_lower_32_bits(mc_addr);
+
+       PP_ASSERT_WITH_CODE((NULL != internal_buf),
+               "Out of memory.",
+               kfree(smumgr->backend);
+               cgs_free_gpu_mem(smumgr->device,
+               (cgs_handle_t)smu_data->smu_buffer.handle);
+               return -1;);
+
+       return 0;
+}
+
+static const struct pp_smumgr_func ellsemere_smu_funcs = {
+       .smu_init = polaris10_smu_init,
+       .smu_fini = polaris10_smu_fini,
+       .start_smu = polaris10_start_smu,
+       .check_fw_load_finish = polaris10_check_fw_load_finish,
+       .request_smu_load_fw = polaris10_reload_firmware,
+       .request_smu_load_specific_fw = NULL,
+       .send_msg_to_smc = polaris10_send_msg_to_smc,
+       .send_msg_to_smc_with_parameter = polaris10_send_msg_to_smc_with_parameter,
+       .download_pptable_settings = NULL,
+       .upload_pptable_settings = NULL,
+};
+
+int polaris10_smum_init(struct pp_smumgr *smumgr)
+{
+       struct polaris10_smumgr *polaris10_smu = NULL;
+
+       polaris10_smu = kzalloc(sizeof(struct polaris10_smumgr), GFP_KERNEL);
+
+       if (polaris10_smu == NULL)
+               return -1;
+
+       smumgr->backend = polaris10_smu;
+       smumgr->smumgr_funcs = &ellsemere_smu_funcs;
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.h b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.h
new file mode 100644 (file)
index 0000000..e5377ae
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2015 Advanced Micro Devices, 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.
+ *
+ */
+
+#ifndef _POLARIS10_SMUMANAGER_H
+#define _POLARIS10_SMUMANAGER_H
+
+#include <polaris10_ppsmc.h>
+#include <pp_endian.h>
+
+struct polaris10_avfs {
+       enum AVFS_BTC_STATUS avfs_btc_status;
+       uint32_t           avfs_btc_param;
+};
+
+struct polaris10_buffer_entry {
+       uint32_t data_size;
+       uint32_t mc_addr_low;
+       uint32_t mc_addr_high;
+       void *kaddr;
+       unsigned long  handle;
+};
+
+struct polaris10_smumgr {
+       uint8_t *header;
+       uint8_t *mec_image;
+       struct polaris10_buffer_entry smu_buffer;
+       struct polaris10_buffer_entry header_buffer;
+       uint32_t soft_regs_start;
+       uint8_t *read_rrm_straps;
+       uint32_t read_drm_straps_mc_address_high;
+       uint32_t read_drm_straps_mc_address_low;
+       uint32_t acpi_optimization;
+       bool post_initial_boot;
+       uint8_t protected_mode;
+       uint8_t security_hard_key;
+       struct polaris10_avfs  avfs;
+};
+
+
+int polaris10_smum_init(struct pp_smumgr *smumgr);
+
+int polaris10_read_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t *value, uint32_t limit);
+int polaris10_write_smc_sram_dword(struct pp_smumgr *smumgr, uint32_t smc_addr, uint32_t value, uint32_t limit);
+int polaris10_copy_bytes_to_smc(struct pp_smumgr *smumgr, uint32_t smc_start_address,
+                               const uint8_t *src, uint32_t byte_count, uint32_t limit);
+
+#endif
+
index 063ae71c983093fc231b94f11b1107a9aedd753e..c483baf6b4fbc9bb8b76d293c772f727631c0726 100644 (file)
@@ -30,6 +30,7 @@
 #include "cz_smumgr.h"
 #include "tonga_smumgr.h"
 #include "fiji_smumgr.h"
+#include "polaris10_smumgr.h"
 
 int smum_init(struct amd_pp_init *pp_init, struct pp_instance *handle)
 {
@@ -62,6 +63,10 @@ int smum_init(struct amd_pp_init *pp_init, struct pp_instance *handle)
                case CHIP_FIJI:
                        fiji_smum_init(smumgr);
                        break;
+               case CHIP_POLARIS11:
+               case CHIP_POLARIS10:
+                       polaris10_smum_init(smumgr);
+                       break;
                default:
                        return -EINVAL;
                }
index ebdb43a8daeff7c7d0636edb63e38944a81bc156..32820b680d8886104a1e8c28f7324489e9c4c375 100644 (file)
@@ -145,7 +145,7 @@ out:
 
 int tonga_program_jump_on_start(struct pp_smumgr *smumgr)
 {
-       static unsigned char pData[] = { 0xE0, 0x00, 0x80, 0x40 };
+       static const unsigned char pData[] = { 0xE0, 0x00, 0x80, 0x40 };
 
        tonga_copy_bytes_to_smc(smumgr, 0x0, pData, 4, sizeof(pData)+1);
 
index a5ff9458d359099ce5b57a033351b54219af4c54..c16248cee7799221799c15a1dc707c83fd2b295f 100644 (file)
@@ -319,6 +319,48 @@ static bool amd_sched_entity_in(struct amd_sched_job *sched_job)
        return added;
 }
 
+static void amd_sched_free_job(struct fence *f, struct fence_cb *cb) {
+       struct amd_sched_job *job = container_of(cb, struct amd_sched_job, cb_free_job);
+       schedule_work(&job->work_free_job);
+}
+
+/* job_finish is called after hw fence signaled, and
+ * the job had already been deleted from ring_mirror_list
+ */
+void amd_sched_job_finish(struct amd_sched_job *s_job)
+{
+       struct amd_sched_job *next;
+       struct amd_gpu_scheduler *sched = s_job->sched;
+
+       if (sched->timeout != MAX_SCHEDULE_TIMEOUT) {
+               if (cancel_delayed_work(&s_job->work_tdr))
+                       amd_sched_job_put(s_job);
+
+               /* queue TDR for next job */
+               next = list_first_entry_or_null(&sched->ring_mirror_list,
+                                               struct amd_sched_job, node);
+
+               if (next) {
+                       INIT_DELAYED_WORK(&next->work_tdr, s_job->timeout_callback);
+                       amd_sched_job_get(next);
+                       schedule_delayed_work(&next->work_tdr, sched->timeout);
+               }
+       }
+}
+
+void amd_sched_job_begin(struct amd_sched_job *s_job)
+{
+       struct amd_gpu_scheduler *sched = s_job->sched;
+
+       if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
+               list_first_entry_or_null(&sched->ring_mirror_list, struct amd_sched_job, node) == s_job)
+       {
+               INIT_DELAYED_WORK(&s_job->work_tdr, s_job->timeout_callback);
+               amd_sched_job_get(s_job);
+               schedule_delayed_work(&s_job->work_tdr, sched->timeout);
+       }
+}
+
 /**
  * Submit a job to the job queue
  *
@@ -330,11 +372,39 @@ void amd_sched_entity_push_job(struct amd_sched_job *sched_job)
 {
        struct amd_sched_entity *entity = sched_job->s_entity;
 
+       sched_job->use_sched = 1;
+       fence_add_callback(&sched_job->s_fence->base,
+                                       &sched_job->cb_free_job, amd_sched_free_job);
        trace_amd_sched_job(sched_job);
        wait_event(entity->sched->job_scheduled,
                   amd_sched_entity_in(sched_job));
 }
 
+/* init a sched_job with basic field */
+int amd_sched_job_init(struct amd_sched_job *job,
+                                               struct amd_gpu_scheduler *sched,
+                                               struct amd_sched_entity *entity,
+                                               void (*timeout_cb)(struct work_struct *work),
+                                               void (*free_cb)(struct kref *refcount),
+                                               void *owner, struct fence **fence)
+{
+       INIT_LIST_HEAD(&job->node);
+       kref_init(&job->refcount);
+       job->sched = sched;
+       job->s_entity = entity;
+       job->s_fence = amd_sched_fence_create(entity, owner);
+       if (!job->s_fence)
+               return -ENOMEM;
+
+       job->s_fence->s_job = job;
+       job->timeout_callback = timeout_cb;
+       job->free_callback = free_cb;
+
+       if (fence)
+               *fence = &job->s_fence->base;
+       return 0;
+}
+
 /**
  * Return ture if we can push more jobs to the hw.
  */
@@ -383,47 +453,26 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
        unsigned long flags;
 
        atomic_dec(&sched->hw_rq_count);
+
+       /* remove job from ring_mirror_list */
+       spin_lock_irqsave(&sched->job_list_lock, flags);
+       list_del_init(&s_fence->s_job->node);
+       sched->ops->finish_job(s_fence->s_job);
+       spin_unlock_irqrestore(&sched->job_list_lock, flags);
+
        amd_sched_fence_signal(s_fence);
-       if (sched->timeout != MAX_SCHEDULE_TIMEOUT) {
-               cancel_delayed_work(&s_fence->dwork);
-               spin_lock_irqsave(&sched->fence_list_lock, flags);
-               list_del_init(&s_fence->list);
-               spin_unlock_irqrestore(&sched->fence_list_lock, flags);
-       }
+
        trace_amd_sched_process_job(s_fence);
        fence_put(&s_fence->base);
        wake_up_interruptible(&sched->wake_up_worker);
 }
 
-static void amd_sched_fence_work_func(struct work_struct *work)
-{
-       struct amd_sched_fence *s_fence =
-               container_of(work, struct amd_sched_fence, dwork.work);
-       struct amd_gpu_scheduler *sched = s_fence->sched;
-       struct amd_sched_fence *entity, *tmp;
-       unsigned long flags;
-
-       DRM_ERROR("[%s] scheduler is timeout!\n", sched->name);
-
-       /* Clean all pending fences */
-       spin_lock_irqsave(&sched->fence_list_lock, flags);
-       list_for_each_entry_safe(entity, tmp, &sched->fence_list, list) {
-               DRM_ERROR("  fence no %d\n", entity->base.seqno);
-               cancel_delayed_work(&entity->dwork);
-               list_del_init(&entity->list);
-               fence_put(&entity->base);
-       }
-       spin_unlock_irqrestore(&sched->fence_list_lock, flags);
-}
-
 static int amd_sched_main(void *param)
 {
        struct sched_param sparam = {.sched_priority = 1};
        struct amd_gpu_scheduler *sched = (struct amd_gpu_scheduler *)param;
        int r, count;
 
-       spin_lock_init(&sched->fence_list_lock);
-       INIT_LIST_HEAD(&sched->fence_list);
        sched_setscheduler(current, SCHED_FIFO, &sparam);
 
        while (!kthread_should_stop()) {
@@ -431,7 +480,6 @@ static int amd_sched_main(void *param)
                struct amd_sched_fence *s_fence;
                struct amd_sched_job *sched_job;
                struct fence *fence;
-               unsigned long flags;
 
                wait_event_interruptible(sched->wake_up_worker,
                        (entity = amd_sched_select_entity(sched)) ||
@@ -446,15 +494,8 @@ static int amd_sched_main(void *param)
 
                s_fence = sched_job->s_fence;
 
-               if (sched->timeout != MAX_SCHEDULE_TIMEOUT) {
-                       INIT_DELAYED_WORK(&s_fence->dwork, amd_sched_fence_work_func);
-                       schedule_delayed_work(&s_fence->dwork, sched->timeout);
-                       spin_lock_irqsave(&sched->fence_list_lock, flags);
-                       list_add_tail(&s_fence->list, &sched->fence_list);
-                       spin_unlock_irqrestore(&sched->fence_list_lock, flags);
-               }
-
                atomic_inc(&sched->hw_rq_count);
+               amd_sched_job_pre_schedule(sched, sched_job);
                fence = sched->ops->run_job(sched_job);
                amd_sched_fence_scheduled(s_fence);
                if (fence) {
@@ -489,7 +530,7 @@ static int amd_sched_main(void *param)
  * Return 0 on success, otherwise error code.
 */
 int amd_sched_init(struct amd_gpu_scheduler *sched,
-                  struct amd_sched_backend_ops *ops,
+                  const struct amd_sched_backend_ops *ops,
                   unsigned hw_submission, long timeout, const char *name)
 {
        int i;
@@ -502,6 +543,8 @@ int amd_sched_init(struct amd_gpu_scheduler *sched,
 
        init_waitqueue_head(&sched->wake_up_worker);
        init_waitqueue_head(&sched->job_scheduled);
+       INIT_LIST_HEAD(&sched->ring_mirror_list);
+       spin_lock_init(&sched->job_list_lock);
        atomic_set(&sched->hw_rq_count, 0);
        if (atomic_inc_return(&sched_fence_slab_ref) == 1) {
                sched_fence_slab = kmem_cache_create(
index 9403145d7beebf326768672ed75bf8091801ad38..070095a9433c3f9e2aac2a25484e21169e462329 100644 (file)
@@ -37,7 +37,7 @@ extern atomic_t sched_fence_slab_ref;
 
 /**
  * A scheduler entity is a wrapper around a job queue or a group
- * of other entities. Entities take turns emitting jobs from their 
+ * of other entities. Entities take turns emitting jobs from their
  * job queues to corresponding hardware ring based on scheduling
  * policy.
 */
@@ -74,14 +74,21 @@ struct amd_sched_fence {
        struct amd_gpu_scheduler        *sched;
        spinlock_t                      lock;
        void                            *owner;
-       struct delayed_work             dwork;
-       struct list_head                list;
+       struct amd_sched_job    *s_job;
 };
 
 struct amd_sched_job {
+       struct kref refcount;
        struct amd_gpu_scheduler        *sched;
        struct amd_sched_entity         *s_entity;
        struct amd_sched_fence          *s_fence;
+       bool    use_sched;      /* true if the job goes to scheduler */
+       struct fence_cb                cb_free_job;
+       struct work_struct             work_free_job;
+       struct list_head                           node;
+       struct delayed_work work_tdr;
+       void (*timeout_callback) (struct work_struct *work);
+       void (*free_callback)(struct kref *refcount);
 };
 
 extern const struct fence_ops amd_sched_fence_ops;
@@ -102,6 +109,8 @@ static inline struct amd_sched_fence *to_amd_sched_fence(struct fence *f)
 struct amd_sched_backend_ops {
        struct fence *(*dependency)(struct amd_sched_job *sched_job);
        struct fence *(*run_job)(struct amd_sched_job *sched_job);
+       void (*begin_job)(struct amd_sched_job *sched_job);
+       void (*finish_job)(struct amd_sched_job *sched_job);
 };
 
 enum amd_sched_priority {
@@ -114,7 +123,7 @@ enum amd_sched_priority {
  * One scheduler is implemented for each hardware ring
 */
 struct amd_gpu_scheduler {
-       struct amd_sched_backend_ops    *ops;
+       const struct amd_sched_backend_ops      *ops;
        uint32_t                        hw_submission_limit;
        long                            timeout;
        const char                      *name;
@@ -122,13 +131,13 @@ struct amd_gpu_scheduler {
        wait_queue_head_t               wake_up_worker;
        wait_queue_head_t               job_scheduled;
        atomic_t                        hw_rq_count;
-       struct list_head                fence_list;
-       spinlock_t                      fence_list_lock;
        struct task_struct              *thread;
+       struct list_head        ring_mirror_list;
+       spinlock_t                      job_list_lock;
 };
 
 int amd_sched_init(struct amd_gpu_scheduler *sched,
-                  struct amd_sched_backend_ops *ops,
+                  const struct amd_sched_backend_ops *ops,
                   uint32_t hw_submission, long timeout, const char *name);
 void amd_sched_fini(struct amd_gpu_scheduler *sched);
 
@@ -144,5 +153,24 @@ struct amd_sched_fence *amd_sched_fence_create(
        struct amd_sched_entity *s_entity, void *owner);
 void amd_sched_fence_scheduled(struct amd_sched_fence *fence);
 void amd_sched_fence_signal(struct amd_sched_fence *fence);
+int amd_sched_job_init(struct amd_sched_job *job,
+                                       struct amd_gpu_scheduler *sched,
+                                       struct amd_sched_entity *entity,
+                                       void (*timeout_cb)(struct work_struct *work),
+                                       void (*free_cb)(struct kref* refcount),
+                                       void *owner, struct fence **fence);
+void amd_sched_job_pre_schedule(struct amd_gpu_scheduler *sched ,
+                                                               struct amd_sched_job *s_job);
+void amd_sched_job_finish(struct amd_sched_job *s_job);
+void amd_sched_job_begin(struct amd_sched_job *s_job);
+static inline void amd_sched_job_get(struct amd_sched_job *job) {
+       if (job)
+               kref_get(&job->refcount);
+}
+
+static inline void amd_sched_job_put(struct amd_sched_job *job) {
+       if (job)
+               kref_put(&job->refcount, job->free_callback);
+}
 
 #endif
index dc115aea352bc9771e30605ab9c83f90f03e8df8..2a732c4903755db7d3838f9b6c8ae00ee2804309 100644 (file)
@@ -57,6 +57,16 @@ void amd_sched_fence_signal(struct amd_sched_fence *fence)
                FENCE_TRACE(&fence->base, "was already signaled\n");
 }
 
+void amd_sched_job_pre_schedule(struct amd_gpu_scheduler *sched ,
+                               struct amd_sched_job *s_job)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&sched->job_list_lock, flags);
+       list_add_tail(&s_job->node, &sched->ring_mirror_list);
+       sched->ops->begin_job(s_job);
+       spin_unlock_irqrestore(&sched->job_list_lock, flags);
+}
+
 void amd_sched_fence_scheduled(struct amd_sched_fence *s_fence)
 {
        struct fence_cb *cur, *tmp;
diff --git a/drivers/gpu/drm/arc/Kconfig b/drivers/gpu/drm/arc/Kconfig
new file mode 100644 (file)
index 0000000..f9a13b6
--- /dev/null
@@ -0,0 +1,10 @@
+config DRM_ARCPGU
+       tristate "ARC PGU"
+       depends on DRM && OF
+       select DRM_KMS_CMA_HELPER
+       select DRM_KMS_FB_HELPER
+       select DRM_KMS_HELPER
+       help
+         Choose this option if you have an ARC PGU controller.
+
+         If M is selected the module will be called arcpgu.
diff --git a/drivers/gpu/drm/arc/Makefile b/drivers/gpu/drm/arc/Makefile
new file mode 100644 (file)
index 0000000..d48fda7
--- /dev/null
@@ -0,0 +1,2 @@
+arcpgu-y := arcpgu_crtc.o arcpgu_hdmi.o arcpgu_drv.o
+obj-$(CONFIG_DRM_ARCPGU) += arcpgu.o
diff --git a/drivers/gpu/drm/arc/arcpgu.h b/drivers/gpu/drm/arc/arcpgu.h
new file mode 100644 (file)
index 0000000..86574b6
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * ARC PGU DRM driver.
+ *
+ * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _ARCPGU_H_
+#define _ARCPGU_H_
+
+struct arcpgu_drm_private {
+       void __iomem            *regs;
+       struct clk              *clk;
+       struct drm_fbdev_cma    *fbdev;
+       struct drm_framebuffer  *fb;
+       struct list_head        event_list;
+       struct drm_crtc         crtc;
+       struct drm_plane        *plane;
+};
+
+#define crtc_to_arcpgu_priv(x) container_of(x, struct arcpgu_drm_private, crtc)
+
+static inline void arc_pgu_write(struct arcpgu_drm_private *arcpgu,
+                                unsigned int reg, u32 value)
+{
+       iowrite32(value, arcpgu->regs + reg);
+}
+
+static inline u32 arc_pgu_read(struct arcpgu_drm_private *arcpgu,
+                              unsigned int reg)
+{
+       return ioread32(arcpgu->regs + reg);
+}
+
+int arc_pgu_setup_crtc(struct drm_device *dev);
+int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np);
+struct drm_fbdev_cma *arcpgu_fbdev_cma_init(struct drm_device *dev,
+       unsigned int preferred_bpp, unsigned int num_crtc,
+       unsigned int max_conn_count);
+
+#endif
diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c
new file mode 100644 (file)
index 0000000..92f8bef
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * ARC PGU DRM driver.
+ *
+ * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_plane_helper.h>
+#include <linux/clk.h>
+#include <linux/platform_data/simplefb.h>
+
+#include "arcpgu.h"
+#include "arcpgu_regs.h"
+
+#define ENCODE_PGU_XY(x, y)    ((((x) - 1) << 16) | ((y) - 1))
+
+static struct simplefb_format supported_formats[] = {
+       { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0}, DRM_FORMAT_RGB565 },
+       { "r8g8b8", 24, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_RGB888 },
+};
+
+static void arc_pgu_set_pxl_fmt(struct drm_crtc *crtc)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+       uint32_t pixel_format = crtc->primary->state->fb->pixel_format;
+       struct simplefb_format *format = NULL;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(supported_formats); i++) {
+               if (supported_formats[i].fourcc == pixel_format)
+                       format = &supported_formats[i];
+       }
+
+       if (WARN_ON(!format))
+               return;
+
+       if (format->fourcc == DRM_FORMAT_RGB888)
+               arc_pgu_write(arcpgu, ARCPGU_REG_CTRL,
+                             arc_pgu_read(arcpgu, ARCPGU_REG_CTRL) |
+                                          ARCPGU_MODE_RGB888_MASK);
+
+}
+
+static const struct drm_crtc_funcs arc_pgu_crtc_funcs = {
+       .destroy = drm_crtc_cleanup,
+       .set_config = drm_atomic_helper_set_config,
+       .page_flip = drm_atomic_helper_page_flip,
+       .reset = drm_atomic_helper_crtc_reset,
+       .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+};
+
+static void arc_pgu_crtc_mode_set_nofb(struct drm_crtc *crtc)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+       struct drm_display_mode *m = &crtc->state->adjusted_mode;
+       u32 val;
+
+       arc_pgu_write(arcpgu, ARCPGU_REG_FMT,
+                     ENCODE_PGU_XY(m->crtc_htotal, m->crtc_vtotal));
+
+       arc_pgu_write(arcpgu, ARCPGU_REG_HSYNC,
+                     ENCODE_PGU_XY(m->crtc_hsync_start - m->crtc_hdisplay,
+                                   m->crtc_hsync_end - m->crtc_hdisplay));
+
+       arc_pgu_write(arcpgu, ARCPGU_REG_VSYNC,
+                     ENCODE_PGU_XY(m->crtc_vsync_start - m->crtc_vdisplay,
+                                   m->crtc_vsync_end - m->crtc_vdisplay));
+
+       arc_pgu_write(arcpgu, ARCPGU_REG_ACTIVE,
+                     ENCODE_PGU_XY(m->crtc_hblank_end - m->crtc_hblank_start,
+                                   m->crtc_vblank_end - m->crtc_vblank_start));
+
+       val = arc_pgu_read(arcpgu, ARCPGU_REG_CTRL);
+
+       if (m->flags & DRM_MODE_FLAG_PVSYNC)
+               val |= ARCPGU_CTRL_VS_POL_MASK << ARCPGU_CTRL_VS_POL_OFST;
+       else
+               val &= ~(ARCPGU_CTRL_VS_POL_MASK << ARCPGU_CTRL_VS_POL_OFST);
+
+       if (m->flags & DRM_MODE_FLAG_PHSYNC)
+               val |= ARCPGU_CTRL_HS_POL_MASK << ARCPGU_CTRL_HS_POL_OFST;
+       else
+               val &= ~(ARCPGU_CTRL_HS_POL_MASK << ARCPGU_CTRL_HS_POL_OFST);
+
+       arc_pgu_write(arcpgu, ARCPGU_REG_CTRL, val);
+       arc_pgu_write(arcpgu, ARCPGU_REG_STRIDE, 0);
+       arc_pgu_write(arcpgu, ARCPGU_REG_START_SET, 1);
+
+       arc_pgu_set_pxl_fmt(crtc);
+
+       clk_set_rate(arcpgu->clk, m->crtc_clock * 1000);
+}
+
+static void arc_pgu_crtc_enable(struct drm_crtc *crtc)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+
+       clk_prepare_enable(arcpgu->clk);
+       arc_pgu_write(arcpgu, ARCPGU_REG_CTRL,
+                     arc_pgu_read(arcpgu, ARCPGU_REG_CTRL) |
+                     ARCPGU_CTRL_ENABLE_MASK);
+}
+
+static void arc_pgu_crtc_disable(struct drm_crtc *crtc)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+
+       if (!crtc->primary->fb)
+               return;
+
+       clk_disable_unprepare(arcpgu->clk);
+       arc_pgu_write(arcpgu, ARCPGU_REG_CTRL,
+                             arc_pgu_read(arcpgu, ARCPGU_REG_CTRL) &
+                             ~ARCPGU_CTRL_ENABLE_MASK);
+}
+
+static int arc_pgu_crtc_atomic_check(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *state)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+       struct drm_display_mode *mode = &state->adjusted_mode;
+       long rate, clk_rate = mode->clock * 1000;
+
+       rate = clk_round_rate(arcpgu->clk, clk_rate);
+       if (rate != clk_rate)
+               return -EINVAL;
+
+       return 0;
+}
+
+static void arc_pgu_crtc_atomic_begin(struct drm_crtc *crtc,
+                                     struct drm_crtc_state *state)
+{
+       struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
+       unsigned long flags;
+
+       if (crtc->state->event) {
+               struct drm_pending_vblank_event *event = crtc->state->event;
+
+               crtc->state->event = NULL;
+               event->pipe = drm_crtc_index(crtc);
+
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+
+               spin_lock_irqsave(&crtc->dev->event_lock, flags);
+               list_add_tail(&event->base.link, &arcpgu->event_list);
+               spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+       }
+}
+
+static const struct drm_crtc_helper_funcs arc_pgu_crtc_helper_funcs = {
+       .mode_set       = drm_helper_crtc_mode_set,
+       .mode_set_base  = drm_helper_crtc_mode_set_base,
+       .mode_set_nofb  = arc_pgu_crtc_mode_set_nofb,
+       .enable         = arc_pgu_crtc_enable,
+       .disable        = arc_pgu_crtc_disable,
+       .prepare        = arc_pgu_crtc_disable,
+       .commit         = arc_pgu_crtc_enable,
+       .atomic_check   = arc_pgu_crtc_atomic_check,
+       .atomic_begin   = arc_pgu_crtc_atomic_begin,
+};
+
+static void arc_pgu_plane_atomic_update(struct drm_plane *plane,
+                                       struct drm_plane_state *state)
+{
+       struct arcpgu_drm_private *arcpgu;
+       struct drm_gem_cma_object *gem;
+
+       if (!plane->state->crtc || !plane->state->fb)
+               return;
+
+       arcpgu = crtc_to_arcpgu_priv(plane->state->crtc);
+       gem = drm_fb_cma_get_gem_obj(plane->state->fb, 0);
+       arc_pgu_write(arcpgu, ARCPGU_REG_BUF0_ADDR, gem->paddr);
+}
+
+static const struct drm_plane_helper_funcs arc_pgu_plane_helper_funcs = {
+       .prepare_fb = NULL,
+       .cleanup_fb = NULL,
+       .atomic_update = arc_pgu_plane_atomic_update,
+};
+
+static void arc_pgu_plane_destroy(struct drm_plane *plane)
+{
+       drm_plane_helper_disable(plane);
+       drm_plane_cleanup(plane);
+}
+
+static const struct drm_plane_funcs arc_pgu_plane_funcs = {
+       .update_plane           = drm_atomic_helper_update_plane,
+       .disable_plane          = drm_atomic_helper_disable_plane,
+       .destroy                = arc_pgu_plane_destroy,
+       .reset                  = drm_atomic_helper_plane_reset,
+       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
+       .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+};
+
+static struct drm_plane *arc_pgu_plane_init(struct drm_device *drm)
+{
+       struct arcpgu_drm_private *arcpgu = drm->dev_private;
+       struct drm_plane *plane = NULL;
+       u32 formats[ARRAY_SIZE(supported_formats)], i;
+       int ret;
+
+       plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL);
+       if (!plane)
+               return ERR_PTR(-ENOMEM);
+
+       for (i = 0; i < ARRAY_SIZE(supported_formats); i++)
+               formats[i] = supported_formats[i].fourcc;
+
+       ret = drm_universal_plane_init(drm, plane, 0xff, &arc_pgu_plane_funcs,
+                                      formats, ARRAY_SIZE(formats),
+                                      DRM_PLANE_TYPE_PRIMARY, NULL);
+       if (ret)
+               return ERR_PTR(ret);
+
+       drm_plane_helper_add(plane, &arc_pgu_plane_helper_funcs);
+       arcpgu->plane = plane;
+
+       return plane;
+}
+
+int arc_pgu_setup_crtc(struct drm_device *drm)
+{
+       struct arcpgu_drm_private *arcpgu = drm->dev_private;
+       struct drm_plane *primary;
+       int ret;
+
+       primary = arc_pgu_plane_init(drm);
+       if (IS_ERR(primary))
+               return PTR_ERR(primary);
+
+       ret = drm_crtc_init_with_planes(drm, &arcpgu->crtc, primary, NULL,
+                                       &arc_pgu_crtc_funcs, NULL);
+       if (ret) {
+               arc_pgu_plane_destroy(primary);
+               return ret;
+       }
+
+       drm_crtc_helper_add(&arcpgu->crtc, &arc_pgu_crtc_helper_funcs);
+       return 0;
+}
diff --git a/drivers/gpu/drm/arc/arcpgu_drv.c b/drivers/gpu/drm/arc/arcpgu_drv.c
new file mode 100644 (file)
index 0000000..76e187a
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * ARC PGU DRM driver.
+ *
+ * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/clk.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_atomic_helper.h>
+#include <linux/of_reserved_mem.h>
+
+#include "arcpgu.h"
+#include "arcpgu_regs.h"
+
+static void arcpgu_fb_output_poll_changed(struct drm_device *dev)
+{
+       struct arcpgu_drm_private *arcpgu = dev->dev_private;
+
+       if (arcpgu->fbdev)
+               drm_fbdev_cma_hotplug_event(arcpgu->fbdev);
+}
+
+static int arcpgu_atomic_commit(struct drm_device *dev,
+                                   struct drm_atomic_state *state, bool async)
+{
+       return drm_atomic_helper_commit(dev, state, false);
+}
+
+static struct drm_mode_config_funcs arcpgu_drm_modecfg_funcs = {
+       .fb_create  = drm_fb_cma_create,
+       .output_poll_changed = arcpgu_fb_output_poll_changed,
+       .atomic_check = drm_atomic_helper_check,
+       .atomic_commit = arcpgu_atomic_commit,
+};
+
+static void arcpgu_setup_mode_config(struct drm_device *drm)
+{
+       drm_mode_config_init(drm);
+       drm->mode_config.min_width = 0;
+       drm->mode_config.min_height = 0;
+       drm->mode_config.max_width = 1920;
+       drm->mode_config.max_height = 1080;
+       drm->mode_config.funcs = &arcpgu_drm_modecfg_funcs;
+}
+
+int arcpgu_gem_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       int ret;
+
+       ret = drm_gem_mmap(filp, vma);
+       if (ret)
+               return ret;
+
+       vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
+       return 0;
+}
+
+static const struct file_operations arcpgu_drm_ops = {
+       .owner = THIS_MODULE,
+       .open = drm_open,
+       .release = drm_release,
+       .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
+       .poll = drm_poll,
+       .read = drm_read,
+       .llseek = no_llseek,
+       .mmap = arcpgu_gem_mmap,
+};
+
+static void arcpgu_preclose(struct drm_device *drm, struct drm_file *file)
+{
+       struct arcpgu_drm_private *arcpgu = drm->dev_private;
+       struct drm_pending_vblank_event *e, *t;
+       unsigned long flags;
+
+       spin_lock_irqsave(&drm->event_lock, flags);
+       list_for_each_entry_safe(e, t, &arcpgu->event_list, base.link) {
+               if (e->base.file_priv != file)
+                       continue;
+               list_del(&e->base.link);
+               e->base.destroy(&e->base);
+       }
+       spin_unlock_irqrestore(&drm->event_lock, flags);
+}
+
+static void arcpgu_lastclose(struct drm_device *drm)
+{
+       struct arcpgu_drm_private *arcpgu = drm->dev_private;
+
+       drm_fbdev_cma_restore_mode(arcpgu->fbdev);
+}
+
+static int arcpgu_load(struct drm_device *drm)
+{
+       struct platform_device *pdev = to_platform_device(drm->dev);
+       struct arcpgu_drm_private *arcpgu;
+       struct device_node *encoder_node;
+       struct resource *res;
+       int ret;
+
+       arcpgu = devm_kzalloc(&pdev->dev, sizeof(*arcpgu), GFP_KERNEL);
+       if (arcpgu == NULL)
+               return -ENOMEM;
+
+       drm->dev_private = arcpgu;
+
+       arcpgu->clk = devm_clk_get(drm->dev, "pxlclk");
+       if (IS_ERR(arcpgu->clk))
+               return PTR_ERR(arcpgu->clk);
+
+       INIT_LIST_HEAD(&arcpgu->event_list);
+
+       arcpgu_setup_mode_config(drm);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       arcpgu->regs = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(arcpgu->regs)) {
+               dev_err(drm->dev, "Could not remap IO mem\n");
+               return PTR_ERR(arcpgu->regs);
+       }
+
+       dev_info(drm->dev, "arc_pgu ID: 0x%x\n",
+                arc_pgu_read(arcpgu, ARCPGU_REG_ID));
+
+       /* Get the optional framebuffer memory resource */
+       ret = of_reserved_mem_device_init(drm->dev);
+       if (ret && ret != -ENODEV)
+               return ret;
+
+       if (dma_set_mask_and_coherent(drm->dev, DMA_BIT_MASK(32)))
+               return -ENODEV;
+
+       if (arc_pgu_setup_crtc(drm) < 0)
+               return -ENODEV;
+
+       /* find the encoder node and initialize it */
+       encoder_node = of_parse_phandle(drm->dev->of_node, "encoder-slave", 0);
+       if (!encoder_node) {
+               dev_err(drm->dev, "failed to get an encoder slave node\n");
+               return -ENODEV;
+       }
+
+       ret = arcpgu_drm_hdmi_init(drm, encoder_node);
+       if (ret < 0)
+               return ret;
+
+       drm_mode_config_reset(drm);
+       drm_kms_helper_poll_init(drm);
+
+       arcpgu->fbdev = drm_fbdev_cma_init(drm, 16,
+                                             drm->mode_config.num_crtc,
+                                             drm->mode_config.num_connector);
+       if (IS_ERR(arcpgu->fbdev)) {
+               ret = PTR_ERR(arcpgu->fbdev);
+               arcpgu->fbdev = NULL;
+               return -ENODEV;
+       }
+
+       platform_set_drvdata(pdev, arcpgu);
+       return 0;
+}
+
+int arcpgu_unload(struct drm_device *drm)
+{
+       struct arcpgu_drm_private *arcpgu = drm->dev_private;
+
+       if (arcpgu->fbdev) {
+               drm_fbdev_cma_fini(arcpgu->fbdev);
+               arcpgu->fbdev = NULL;
+       }
+       drm_kms_helper_poll_fini(drm);
+       drm_vblank_cleanup(drm);
+       drm_mode_config_cleanup(drm);
+
+       return 0;
+}
+
+static struct drm_driver arcpgu_drm_driver = {
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
+                          DRIVER_ATOMIC,
+       .preclose = arcpgu_preclose,
+       .lastclose = arcpgu_lastclose,
+       .name = "drm-arcpgu",
+       .desc = "ARC PGU Controller",
+       .date = "20160219",
+       .major = 1,
+       .minor = 0,
+       .patchlevel = 0,
+       .fops = &arcpgu_drm_ops,
+       .dumb_create = drm_gem_cma_dumb_create,
+       .dumb_map_offset = drm_gem_cma_dumb_map_offset,
+       .dumb_destroy = drm_gem_dumb_destroy,
+       .get_vblank_counter = drm_vblank_no_hw_counter,
+       .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
+       .gem_free_object = drm_gem_cma_free_object,
+       .gem_vm_ops = &drm_gem_cma_vm_ops,
+       .gem_prime_export = drm_gem_prime_export,
+       .gem_prime_import = drm_gem_prime_import,
+       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
+       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
+       .gem_prime_vmap = drm_gem_cma_prime_vmap,
+       .gem_prime_vunmap = drm_gem_cma_prime_vunmap,
+       .gem_prime_mmap = drm_gem_cma_prime_mmap,
+};
+
+static int arcpgu_probe(struct platform_device *pdev)
+{
+       struct drm_device *drm;
+       int ret;
+
+       drm = drm_dev_alloc(&arcpgu_drm_driver, &pdev->dev);
+       if (!drm)
+               return -ENOMEM;
+
+       ret = arcpgu_load(drm);
+       if (ret)
+               goto err_unref;
+
+       ret = drm_dev_register(drm, 0);
+       if (ret)
+               goto err_unload;
+
+       ret = drm_connector_register_all(drm);
+       if (ret)
+               goto err_unregister;
+
+       return 0;
+
+err_unregister:
+       drm_dev_unregister(drm);
+
+err_unload:
+       arcpgu_unload(drm);
+
+err_unref:
+       drm_dev_unref(drm);
+
+       return ret;
+}
+
+static int arcpgu_remove(struct platform_device *pdev)
+{
+       struct drm_device *drm = platform_get_drvdata(pdev);
+
+       drm_connector_unregister_all(drm);
+       drm_dev_unregister(drm);
+       arcpgu_unload(drm);
+       drm_dev_unref(drm);
+
+       return 0;
+}
+
+static const struct of_device_id arcpgu_of_table[] = {
+       {.compatible = "snps,arcpgu"},
+       {}
+};
+
+MODULE_DEVICE_TABLE(of, arcpgu_of_table);
+
+static struct platform_driver arcpgu_platform_driver = {
+       .probe = arcpgu_probe,
+       .remove = arcpgu_remove,
+       .driver = {
+                  .name = "arcpgu",
+                  .of_match_table = arcpgu_of_table,
+                  },
+};
+
+module_platform_driver(arcpgu_platform_driver);
+
+MODULE_AUTHOR("Carlos Palminha <palminha@synopsys.com>");
+MODULE_DESCRIPTION("ARC PGU DRM driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
new file mode 100644 (file)
index 0000000..08b6bae
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * ARC PGU DRM driver.
+ *
+ * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_encoder_slave.h>
+#include <drm/drm_atomic_helper.h>
+
+#include "arcpgu.h"
+
+struct arcpgu_drm_connector {
+       struct drm_connector connector;
+       struct drm_encoder_slave *encoder_slave;
+};
+
+static int arcpgu_drm_connector_get_modes(struct drm_connector *connector)
+{
+       const struct drm_encoder_slave_funcs *sfuncs;
+       struct drm_encoder_slave *slave;
+       struct arcpgu_drm_connector *con =
+               container_of(connector, struct arcpgu_drm_connector, connector);
+
+       slave = con->encoder_slave;
+       if (slave == NULL) {
+               dev_err(connector->dev->dev,
+                       "connector_get_modes: cannot find slave encoder for connector\n");
+               return 0;
+       }
+
+       sfuncs = slave->slave_funcs;
+       if (sfuncs->get_modes == NULL)
+               return 0;
+
+       return sfuncs->get_modes(&slave->base, connector);
+}
+
+struct drm_encoder *
+arcpgu_drm_connector_best_encoder(struct drm_connector *connector)
+{
+       struct drm_encoder_slave *slave;
+       struct arcpgu_drm_connector *con =
+               container_of(connector, struct arcpgu_drm_connector, connector);
+
+       slave = con->encoder_slave;
+       if (slave == NULL) {
+               dev_err(connector->dev->dev,
+                       "connector_best_encoder: cannot find slave encoder for connector\n");
+               return NULL;
+       }
+
+       return &slave->base;
+}
+
+static enum drm_connector_status
+arcpgu_drm_connector_detect(struct drm_connector *connector, bool force)
+{
+       enum drm_connector_status status = connector_status_unknown;
+       const struct drm_encoder_slave_funcs *sfuncs;
+       struct drm_encoder_slave *slave;
+
+       struct arcpgu_drm_connector *con =
+               container_of(connector, struct arcpgu_drm_connector, connector);
+
+       slave = con->encoder_slave;
+       if (slave == NULL) {
+               dev_err(connector->dev->dev,
+                       "connector_detect: cannot find slave encoder for connector\n");
+               return status;
+       }
+
+       sfuncs = slave->slave_funcs;
+       if (sfuncs && sfuncs->detect)
+               return sfuncs->detect(&slave->base, connector);
+
+       dev_err(connector->dev->dev, "connector_detect: could not detect slave funcs\n");
+       return status;
+}
+
+static void arcpgu_drm_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+}
+
+static const struct drm_connector_helper_funcs
+arcpgu_drm_connector_helper_funcs = {
+       .get_modes = arcpgu_drm_connector_get_modes,
+       .best_encoder = arcpgu_drm_connector_best_encoder,
+};
+
+static const struct drm_connector_funcs arcpgu_drm_connector_funcs = {
+       .dpms = drm_helper_connector_dpms,
+       .reset = drm_atomic_helper_connector_reset,
+       .detect = arcpgu_drm_connector_detect,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .destroy = arcpgu_drm_connector_destroy,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static struct drm_encoder_helper_funcs arcpgu_drm_encoder_helper_funcs = {
+       .dpms = drm_i2c_encoder_dpms,
+       .mode_fixup = drm_i2c_encoder_mode_fixup,
+       .mode_set = drm_i2c_encoder_mode_set,
+       .prepare = drm_i2c_encoder_prepare,
+       .commit = drm_i2c_encoder_commit,
+       .detect = drm_i2c_encoder_detect,
+};
+
+static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = {
+       .destroy = drm_encoder_cleanup,
+};
+
+int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
+{
+       struct arcpgu_drm_connector *arcpgu_connector;
+       struct drm_i2c_encoder_driver *driver;
+       struct drm_encoder_slave *encoder;
+       struct drm_connector *connector;
+       struct i2c_client *i2c_slave;
+       int ret;
+
+       encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL);
+       if (encoder == NULL)
+               return -ENOMEM;
+
+       i2c_slave = of_find_i2c_device_by_node(np);
+       if (!i2c_slave || !i2c_get_clientdata(i2c_slave)) {
+               dev_err(drm->dev, "failed to find i2c slave encoder\n");
+               return -EPROBE_DEFER;
+       }
+
+       if (i2c_slave->dev.driver == NULL) {
+               dev_err(drm->dev, "failed to find i2c slave driver\n");
+               return -EPROBE_DEFER;
+       }
+
+       driver =
+           to_drm_i2c_encoder_driver(to_i2c_driver(i2c_slave->dev.driver));
+       ret = driver->encoder_init(i2c_slave, drm, encoder);
+       if (ret) {
+               dev_err(drm->dev, "failed to initialize i2c encoder slave\n");
+               return ret;
+       }
+
+       encoder->base.possible_crtcs = 1;
+       encoder->base.possible_clones = 0;
+       ret = drm_encoder_init(drm, &encoder->base, &arcpgu_drm_encoder_funcs,
+                              DRM_MODE_ENCODER_TMDS, NULL);
+       if (ret)
+               return ret;
+
+       drm_encoder_helper_add(&encoder->base,
+                              &arcpgu_drm_encoder_helper_funcs);
+
+       arcpgu_connector = devm_kzalloc(drm->dev, sizeof(*arcpgu_connector),
+                                       GFP_KERNEL);
+       if (!arcpgu_connector) {
+               ret = -ENOMEM;
+               goto error_encoder_cleanup;
+       }
+
+       connector = &arcpgu_connector->connector;
+       drm_connector_helper_add(connector, &arcpgu_drm_connector_helper_funcs);
+       ret = drm_connector_init(drm, connector, &arcpgu_drm_connector_funcs,
+                       DRM_MODE_CONNECTOR_HDMIA);
+       if (ret < 0) {
+               dev_err(drm->dev, "failed to initialize drm connector\n");
+               goto error_encoder_cleanup;
+       }
+
+       ret = drm_mode_connector_attach_encoder(connector, &encoder->base);
+       if (ret < 0) {
+               dev_err(drm->dev, "could not attach connector to encoder\n");
+               drm_connector_unregister(connector);
+               goto error_connector_cleanup;
+       }
+
+       arcpgu_connector->encoder_slave = encoder;
+
+       return 0;
+
+error_connector_cleanup:
+       drm_connector_cleanup(connector);
+
+error_encoder_cleanup:
+       drm_encoder_cleanup(&encoder->base);
+       return ret;
+}
diff --git a/drivers/gpu/drm/arc/arcpgu_regs.h b/drivers/gpu/drm/arc/arcpgu_regs.h
new file mode 100644 (file)
index 0000000..95a13a8
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * ARC PGU DRM driver.
+ *
+ * Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef _ARC_PGU_REGS_H_
+#define _ARC_PGU_REGS_H_
+
+#define ARCPGU_REG_CTRL                0x00
+#define ARCPGU_REG_STAT                0x04
+#define ARCPGU_REG_FMT         0x10
+#define ARCPGU_REG_HSYNC       0x14
+#define ARCPGU_REG_VSYNC       0x18
+#define ARCPGU_REG_ACTIVE      0x1c
+#define ARCPGU_REG_BUF0_ADDR   0x40
+#define ARCPGU_REG_STRIDE      0x50
+#define ARCPGU_REG_START_SET   0x84
+
+#define ARCPGU_REG_ID          0x3FC
+
+#define ARCPGU_CTRL_ENABLE_MASK        0x02
+#define ARCPGU_CTRL_VS_POL_MASK        0x1
+#define ARCPGU_CTRL_VS_POL_OFST        0x3
+#define ARCPGU_CTRL_HS_POL_MASK        0x1
+#define ARCPGU_CTRL_HS_POL_OFST        0x4
+#define ARCPGU_MODE_RGB888_MASK        0x04
+#define ARCPGU_STAT_BUSY_MASK  0x02
+
+#endif
index 3ac1ae4d8cafb69993035ab505727c3d127cc962..b987c63ba8d6a63612f7d14ab56ad5e82c15b05a 100644 (file)
@@ -113,7 +113,7 @@ static void hdlcd_fb_output_poll_changed(struct drm_device *drm)
 }
 
 static int hdlcd_atomic_commit(struct drm_device *dev,
-                              struct drm_atomic_state *state, bool async)
+                              struct drm_atomic_state *state, bool nonblock)
 {
        return drm_atomic_helper_commit(dev, state, false);
 }
@@ -379,7 +379,6 @@ static int hdlcd_drm_bind(struct device *dev)
                DRM_ERROR("failed to initialise vblank\n");
                goto err_vblank;
        }
-       drm->vblank_disable_allowed = true;
 
        drm_mode_config_reset(drm);
        drm_kms_helper_poll_init(drm);
index 0293eb74d777a8bd642326f3060c528e090b78f8..3130aa8bcdd0a18d074d285e45d3bfed44a6fc8a 100644 (file)
@@ -897,7 +897,6 @@ static void cursor_update(void *data)
 static int armada_drm_crtc_cursor_set(struct drm_crtc *crtc,
        struct drm_file *file, uint32_t handle, uint32_t w, uint32_t h)
 {
-       struct drm_device *dev = crtc->dev;
        struct armada_crtc *dcrtc = drm_to_armada_crtc(crtc);
        struct armada_gem_object *obj = NULL;
        int ret;
@@ -911,7 +910,7 @@ static int armada_drm_crtc_cursor_set(struct drm_crtc *crtc,
                if (w > 64 || h > 64 || (w > 32 && h > 32))
                        return -ENOMEM;
 
-               obj = armada_gem_object_lookup(dev, file, handle);
+               obj = armada_gem_object_lookup(file, handle);
                if (!obj)
                        return -ENOENT;
 
index 82043c204b76be3f105d6c57eac7ec2979d16ef3..439824a61aa5276e465975a8ae79e8ab6da7c552 100644 (file)
@@ -113,7 +113,6 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
                goto err_comp;
 
        dev->irq_enabled = true;
-       dev->vblank_disable_allowed = 1;
 
        ret = armada_fbdev_init(dev);
        if (ret)
index 5fa4bf20b232fcd860f827e5c561858df2bf7086..f03c212b754d273189766532d0614a5cc5f59ee5 100644 (file)
@@ -120,7 +120,7 @@ static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
                goto err;
        }
 
-       obj = armada_gem_object_lookup(dev, dfile, mode->handles[0]);
+       obj = armada_gem_object_lookup(dfile, mode->handles[0]);
        if (!obj) {
                ret = -ENOENT;
                goto err;
index aca7f9cc610929e5e75fa032b77b1ba79c4dfcc4..88e7fc7977213d323869d990275a634a70db8bf2 100644 (file)
@@ -278,7 +278,7 @@ int armada_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
        struct armada_gem_object *obj;
        int ret = 0;
 
-       obj = armada_gem_object_lookup(dev, file, handle);
+       obj = armada_gem_object_lookup(file, handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object\n");
                return -EINVAL;
@@ -348,7 +348,7 @@ int armada_gem_mmap_ioctl(struct drm_device *dev, void *data,
        struct armada_gem_object *dobj;
        unsigned long addr;
 
-       dobj = armada_gem_object_lookup(dev, file, args->handle);
+       dobj = armada_gem_object_lookup(file, args->handle);
        if (dobj == NULL)
                return -ENOENT;
 
@@ -391,7 +391,7 @@ int armada_gem_pwrite_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       dobj = armada_gem_object_lookup(dev, file, args->handle);
+       dobj = armada_gem_object_lookup(file, args->handle);
        if (dobj == NULL)
                return -ENOENT;
 
index b000ea3a829af66ca88cbaf1d314267d95623e33..b88d2b9853c77a65ef35a9d24b1952b672a6186a 100644 (file)
@@ -45,9 +45,9 @@ struct drm_gem_object *armada_gem_prime_import(struct drm_device *,
 int armada_gem_map_import(struct armada_gem_object *);
 
 static inline struct armada_gem_object *armada_gem_object_lookup(
-       struct drm_device *dev, struct drm_file *dfile, unsigned handle)
+       struct drm_file *dfile, unsigned handle)
 {
-       struct drm_gem_object *obj = drm_gem_object_lookup(dev, dfile, handle);
+       struct drm_gem_object *obj = drm_gem_object_lookup(dfile, handle);
 
        return obj ? drm_to_armada_gem(obj) : NULL;
 }
index 9a32d9dfdd269aaa1918e4340b660b5b9567ef4d..fcd9c0714836cdd2175c956d78226930846c0aca 100644 (file)
@@ -218,10 +218,8 @@ static struct drm_driver driver = {
 
 static int __init ast_init(void)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && ast_modeset == -1)
                return -EINVAL;
-#endif
 
        if (ast_modeset == 0)
                return -EINVAL;
index eb5715994ac26e7a2c0b5c4844ca55bdabee72bb..908011d2c8f5200e92cc8db772b85315d5c16343 100644 (file)
@@ -367,7 +367,7 @@ static inline int ast_bo_reserve(struct ast_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index b1480acbb3c3587c720570031eae9c41498d1d93..7bc3aa6dda8cff86f78ec0400bac76d852ebec95 100644 (file)
@@ -333,7 +333,7 @@ ast_user_framebuffer_create(struct drm_device *dev,
        struct ast_framebuffer *ast_fb;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, filp, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
@@ -574,7 +574,7 @@ ast_dumb_mmap_offset(struct drm_file *file,
        struct drm_gem_object *obj;
        struct ast_bo *bo;
 
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL)
                return -ENOENT;
 
index a965e7e8ad6e7e72ccfc439a7bb9e9e995fe8d23..c337922606e322ae9e0abdf57fc4196849f0bc39 100644 (file)
@@ -1141,7 +1141,7 @@ static int ast_cursor_set(struct drm_crtc *crtc,
        if (width > AST_MAX_HWC_WIDTH || height > AST_MAX_HWC_HEIGHT)
                return -EINVAL;
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("Cannot find cursor object %x for crtc\n", handle);
                return -ENOENT;
index 08f82eae69398509a7daf55d55a4a94a4e57b6f4..59f2f93b6f84859ea04c9d092df3f276d2f6a7a6 100644 (file)
@@ -245,6 +245,8 @@ struct ttm_bo_driver ast_bo_driver = {
        .verify_access = ast_bo_verify_access,
        .io_mem_reserve = &ast_ttm_io_mem_reserve,
        .io_mem_free = &ast_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int ast_mm_init(struct ast_private *ast)
index 58c4f785cf8427663611723013c9e8c8fa50ebbf..cf23a755f777f8b4df9fcc6b3032c01415c14bd8 100644 (file)
 
 #include "atmel_hlcdc_dc.h"
 
+/**
+ * Atmel HLCDC CRTC state structure
+ *
+ * @base: base CRTC state
+ * @output_mode: RGBXXX output mode
+ */
+struct atmel_hlcdc_crtc_state {
+       struct drm_crtc_state base;
+       unsigned int output_mode;
+};
+
+static inline struct atmel_hlcdc_crtc_state *
+drm_crtc_state_to_atmel_hlcdc_crtc_state(struct drm_crtc_state *state)
+{
+       return container_of(state, struct atmel_hlcdc_crtc_state, base);
+}
+
 /**
  * Atmel HLCDC CRTC structure
  *
@@ -59,6 +76,7 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
        struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
        struct regmap *regmap = crtc->dc->hlcdc->regmap;
        struct drm_display_mode *adj = &c->state->adjusted_mode;
+       struct atmel_hlcdc_crtc_state *state;
        unsigned long mode_rate;
        struct videomode vm;
        unsigned long prate;
@@ -112,15 +130,27 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c)
        if (adj->flags & DRM_MODE_FLAG_NHSYNC)
                cfg |= ATMEL_HLCDC_HSPOL;
 
+       state = drm_crtc_state_to_atmel_hlcdc_crtc_state(c->state);
+       cfg |= state->output_mode << 8;
+
        regmap_update_bits(regmap, ATMEL_HLCDC_CFG(5),
                           ATMEL_HLCDC_HSPOL | ATMEL_HLCDC_VSPOL |
                           ATMEL_HLCDC_VSPDLYS | ATMEL_HLCDC_VSPDLYE |
                           ATMEL_HLCDC_DISPPOL | ATMEL_HLCDC_DISPDLY |
                           ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO |
-                          ATMEL_HLCDC_GUARDTIME_MASK,
+                          ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK,
                           cfg);
 }
 
+static bool atmel_hlcdc_crtc_mode_fixup(struct drm_crtc *c,
+                                       const struct drm_display_mode *mode,
+                                       struct drm_display_mode *adjusted_mode)
+{
+       struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
+
+       return atmel_hlcdc_dc_mode_valid(crtc->dc, adjusted_mode) == MODE_OK;
+}
+
 static void atmel_hlcdc_crtc_disable(struct drm_crtc *c)
 {
        struct drm_device *dev = c->dev;
@@ -221,15 +251,79 @@ void atmel_hlcdc_crtc_resume(struct drm_crtc *c)
        }
 }
 
+#define ATMEL_HLCDC_RGB444_OUTPUT      BIT(0)
+#define ATMEL_HLCDC_RGB565_OUTPUT      BIT(1)
+#define ATMEL_HLCDC_RGB666_OUTPUT      BIT(2)
+#define ATMEL_HLCDC_RGB888_OUTPUT      BIT(3)
+#define ATMEL_HLCDC_OUTPUT_MODE_MASK   GENMASK(3, 0)
+
+static int atmel_hlcdc_crtc_select_output_mode(struct drm_crtc_state *state)
+{
+       unsigned int output_fmts = ATMEL_HLCDC_OUTPUT_MODE_MASK;
+       struct atmel_hlcdc_crtc_state *hstate;
+       struct drm_connector_state *cstate;
+       struct drm_connector *connector;
+       struct atmel_hlcdc_crtc *crtc;
+       int i;
+
+       crtc = drm_crtc_to_atmel_hlcdc_crtc(state->crtc);
+
+       for_each_connector_in_state(state->state, connector, cstate, i) {
+               struct drm_display_info *info = &connector->display_info;
+               unsigned int supported_fmts = 0;
+               int j;
+
+               if (!cstate->crtc)
+                       continue;
+
+               for (j = 0; j < info->num_bus_formats; j++) {
+                       switch (info->bus_formats[j]) {
+                       case MEDIA_BUS_FMT_RGB444_1X12:
+                               supported_fmts |= ATMEL_HLCDC_RGB444_OUTPUT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB565_1X16:
+                               supported_fmts |= ATMEL_HLCDC_RGB565_OUTPUT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB666_1X18:
+                               supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT;
+                               break;
+                       case MEDIA_BUS_FMT_RGB888_1X24:
+                               supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+               if (crtc->dc->desc->conflicting_output_formats)
+                       output_fmts &= supported_fmts;
+               else
+                       output_fmts |= supported_fmts;
+       }
+
+       if (!output_fmts)
+               return -EINVAL;
+
+       hstate = drm_crtc_state_to_atmel_hlcdc_crtc_state(state);
+       hstate->output_mode = fls(output_fmts) - 1;
+
+       return 0;
+}
+
 static int atmel_hlcdc_crtc_atomic_check(struct drm_crtc *c,
                                         struct drm_crtc_state *s)
 {
-       struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
+       int ret;
 
-       if (atmel_hlcdc_dc_mode_valid(crtc->dc, &s->adjusted_mode) != MODE_OK)
-               return -EINVAL;
+       ret = atmel_hlcdc_crtc_select_output_mode(s);
+       if (ret)
+               return ret;
+
+       ret = atmel_hlcdc_plane_prepare_disc_area(s);
+       if (ret)
+               return ret;
 
-       return atmel_hlcdc_plane_prepare_disc_area(s);
+       return atmel_hlcdc_plane_prepare_ahb_routing(s);
 }
 
 static void atmel_hlcdc_crtc_atomic_begin(struct drm_crtc *c,
@@ -254,6 +348,7 @@ static void atmel_hlcdc_crtc_atomic_flush(struct drm_crtc *crtc,
 }
 
 static const struct drm_crtc_helper_funcs lcdc_crtc_helper_funcs = {
+       .mode_fixup = atmel_hlcdc_crtc_mode_fixup,
        .mode_set = drm_helper_crtc_mode_set,
        .mode_set_nofb = atmel_hlcdc_crtc_mode_set_nofb,
        .mode_set_base = drm_helper_crtc_mode_set_base,
@@ -292,13 +387,60 @@ void atmel_hlcdc_crtc_irq(struct drm_crtc *c)
        atmel_hlcdc_crtc_finish_page_flip(drm_crtc_to_atmel_hlcdc_crtc(c));
 }
 
+void atmel_hlcdc_crtc_reset(struct drm_crtc *crtc)
+{
+       struct atmel_hlcdc_crtc_state *state;
+
+       if (crtc->state && crtc->state->mode_blob)
+               drm_property_unreference_blob(crtc->state->mode_blob);
+
+       if (crtc->state) {
+               state = drm_crtc_state_to_atmel_hlcdc_crtc_state(crtc->state);
+               kfree(state);
+       }
+
+       state = kzalloc(sizeof(*state), GFP_KERNEL);
+       if (state) {
+               crtc->state = &state->base;
+               crtc->state->crtc = crtc;
+       }
+}
+
+static struct drm_crtc_state *
+atmel_hlcdc_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+       struct atmel_hlcdc_crtc_state *state, *cur;
+
+       if (WARN_ON(!crtc->state))
+               return NULL;
+
+       state = kmalloc(sizeof(*state), GFP_KERNEL);
+       if (state)
+               __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base);
+
+       cur = drm_crtc_state_to_atmel_hlcdc_crtc_state(crtc->state);
+       state->output_mode = cur->output_mode;
+
+       return &state->base;
+}
+
+static void atmel_hlcdc_crtc_destroy_state(struct drm_crtc *crtc,
+                                          struct drm_crtc_state *s)
+{
+       struct atmel_hlcdc_crtc_state *state;
+
+       state = drm_crtc_state_to_atmel_hlcdc_crtc_state(s);
+       __drm_atomic_helper_crtc_destroy_state(s);
+       kfree(state);
+}
+
 static const struct drm_crtc_funcs atmel_hlcdc_crtc_funcs = {
        .page_flip = drm_atomic_helper_page_flip,
        .set_config = drm_atomic_helper_set_config,
        .destroy = atmel_hlcdc_crtc_destroy,
-       .reset = drm_atomic_helper_crtc_reset,
-       .atomic_duplicate_state =  drm_atomic_helper_crtc_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+       .reset = atmel_hlcdc_crtc_reset,
+       .atomic_duplicate_state =  atmel_hlcdc_crtc_duplicate_state,
+       .atomic_destroy_state = atmel_hlcdc_crtc_destroy_state,
 };
 
 int atmel_hlcdc_crtc_create(struct drm_device *dev)
index 3d8d16402d075ebba5086debbc7812167ba0cd73..8ded7645747e503ed6d3a56ae15a4417b39f5ac8 100644 (file)
@@ -50,6 +50,10 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_at91sam9n12 = {
        .min_height = 0,
        .max_width = 1280,
        .max_height = 860,
+       .max_spw = 0x3f,
+       .max_vpw = 0x3f,
+       .max_hpw = 0xff,
+       .conflicting_output_formats = true,
        .nlayers = ARRAY_SIZE(atmel_hlcdc_at91sam9n12_layers),
        .layers = atmel_hlcdc_at91sam9n12_layers,
 };
@@ -134,6 +138,10 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_at91sam9x5 = {
        .min_height = 0,
        .max_width = 800,
        .max_height = 600,
+       .max_spw = 0x3f,
+       .max_vpw = 0x3f,
+       .max_hpw = 0xff,
+       .conflicting_output_formats = true,
        .nlayers = ARRAY_SIZE(atmel_hlcdc_at91sam9x5_layers),
        .layers = atmel_hlcdc_at91sam9x5_layers,
 };
@@ -237,6 +245,10 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_sama5d3 = {
        .min_height = 0,
        .max_width = 2048,
        .max_height = 2048,
+       .max_spw = 0x3f,
+       .max_vpw = 0x3f,
+       .max_hpw = 0x1ff,
+       .conflicting_output_formats = true,
        .nlayers = ARRAY_SIZE(atmel_hlcdc_sama5d3_layers),
        .layers = atmel_hlcdc_sama5d3_layers,
 };
@@ -320,6 +332,9 @@ static const struct atmel_hlcdc_dc_desc atmel_hlcdc_dc_sama5d4 = {
        .min_height = 0,
        .max_width = 2048,
        .max_height = 2048,
+       .max_spw = 0xff,
+       .max_vpw = 0xff,
+       .max_hpw = 0x3ff,
        .nlayers = ARRAY_SIZE(atmel_hlcdc_sama5d4_layers),
        .layers = atmel_hlcdc_sama5d4_layers,
 };
@@ -358,19 +373,19 @@ int atmel_hlcdc_dc_mode_valid(struct atmel_hlcdc_dc *dc,
        int hback_porch = mode->htotal - mode->hsync_end;
        int hsync_len = mode->hsync_end - mode->hsync_start;
 
-       if (hsync_len > 0x40 || hsync_len < 1)
+       if (hsync_len > dc->desc->max_spw + 1 || hsync_len < 1)
                return MODE_HSYNC;
 
-       if (vsync_len > 0x40 || vsync_len < 1)
+       if (vsync_len > dc->desc->max_spw + 1 || vsync_len < 1)
                return MODE_VSYNC;
 
-       if (hfront_porch > 0x200 || hfront_porch < 1 ||
-           hback_porch > 0x200 || hback_porch < 1 ||
+       if (hfront_porch > dc->desc->max_hpw + 1 || hfront_porch < 1 ||
+           hback_porch > dc->desc->max_hpw + 1 || hback_porch < 1 ||
            mode->hdisplay < 1)
                return MODE_H_ILLEGAL;
 
-       if (vfront_porch > 0x40 || vfront_porch < 1 ||
-           vback_porch > 0x40 || vback_porch < 0 ||
+       if (vfront_porch > dc->desc->max_vpw + 1 || vfront_porch < 1 ||
+           vback_porch > dc->desc->max_vpw || vback_porch < 0 ||
            mode->vdisplay < 1)
                return MODE_V_ILLEGAL;
 
@@ -427,11 +442,102 @@ static void atmel_hlcdc_fb_output_poll_changed(struct drm_device *dev)
        }
 }
 
+struct atmel_hlcdc_dc_commit {
+       struct work_struct work;
+       struct drm_device *dev;
+       struct drm_atomic_state *state;
+};
+
+static void
+atmel_hlcdc_dc_atomic_complete(struct atmel_hlcdc_dc_commit *commit)
+{
+       struct drm_device *dev = commit->dev;
+       struct atmel_hlcdc_dc *dc = dev->dev_private;
+       struct drm_atomic_state *old_state = commit->state;
+
+       /* Apply the atomic update. */
+       drm_atomic_helper_commit_modeset_disables(dev, old_state);
+       drm_atomic_helper_commit_planes(dev, old_state, false);
+       drm_atomic_helper_commit_modeset_enables(dev, old_state);
+
+       drm_atomic_helper_wait_for_vblanks(dev, old_state);
+
+       drm_atomic_helper_cleanup_planes(dev, old_state);
+
+       drm_atomic_state_free(old_state);
+
+       /* Complete the commit, wake up any waiter. */
+       spin_lock(&dc->commit.wait.lock);
+       dc->commit.pending = false;
+       wake_up_all_locked(&dc->commit.wait);
+       spin_unlock(&dc->commit.wait.lock);
+
+       kfree(commit);
+}
+
+static void atmel_hlcdc_dc_atomic_work(struct work_struct *work)
+{
+       struct atmel_hlcdc_dc_commit *commit =
+               container_of(work, struct atmel_hlcdc_dc_commit, work);
+
+       atmel_hlcdc_dc_atomic_complete(commit);
+}
+
+static int atmel_hlcdc_dc_atomic_commit(struct drm_device *dev,
+                                       struct drm_atomic_state *state,
+                                       bool async)
+{
+       struct atmel_hlcdc_dc *dc = dev->dev_private;
+       struct atmel_hlcdc_dc_commit *commit;
+       int ret;
+
+       ret = drm_atomic_helper_prepare_planes(dev, state);
+       if (ret)
+               return ret;
+
+       /* Allocate the commit object. */
+       commit = kzalloc(sizeof(*commit), GFP_KERNEL);
+       if (!commit) {
+               ret = -ENOMEM;
+               goto error;
+       }
+
+       INIT_WORK(&commit->work, atmel_hlcdc_dc_atomic_work);
+       commit->dev = dev;
+       commit->state = state;
+
+       spin_lock(&dc->commit.wait.lock);
+       ret = wait_event_interruptible_locked(dc->commit.wait,
+                                             !dc->commit.pending);
+       if (ret == 0)
+               dc->commit.pending = true;
+       spin_unlock(&dc->commit.wait.lock);
+
+       if (ret) {
+               kfree(commit);
+               goto error;
+       }
+
+       /* Swap the state, this is the point of no return. */
+       drm_atomic_helper_swap_state(dev, state);
+
+       if (async)
+               queue_work(dc->wq, &commit->work);
+       else
+               atmel_hlcdc_dc_atomic_complete(commit);
+
+       return 0;
+
+error:
+       drm_atomic_helper_cleanup_planes(dev, state);
+       return ret;
+}
+
 static const struct drm_mode_config_funcs mode_config_funcs = {
        .fb_create = atmel_hlcdc_fb_create,
        .output_poll_changed = atmel_hlcdc_fb_output_poll_changed,
        .atomic_check = drm_atomic_helper_check,
-       .atomic_commit = drm_atomic_helper_commit,
+       .atomic_commit = atmel_hlcdc_dc_atomic_commit,
 };
 
 static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev)
@@ -445,7 +551,7 @@ static int atmel_hlcdc_dc_modeset_init(struct drm_device *dev)
 
        ret = atmel_hlcdc_create_outputs(dev);
        if (ret) {
-               dev_err(dev->dev, "failed to create panel: %d\n", ret);
+               dev_err(dev->dev, "failed to create HLCDC outputs: %d\n", ret);
                return ret;
        }
 
@@ -509,6 +615,7 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
        if (!dc->wq)
                return -ENOMEM;
 
+       init_waitqueue_head(&dc->commit.wait);
        dc->desc = match->data;
        dc->hlcdc = dev_get_drvdata(dev->dev->parent);
        dev->dev_private = dc;
@@ -584,38 +691,10 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)
        destroy_workqueue(dc->wq);
 }
 
-static int atmel_hlcdc_dc_connector_plug_all(struct drm_device *dev)
-{
-       struct drm_connector *connector, *failed;
-       int ret;
-
-       mutex_lock(&dev->mode_config.mutex);
-       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-               ret = drm_connector_register(connector);
-               if (ret) {
-                       failed = connector;
-                       goto err;
-               }
-       }
-       mutex_unlock(&dev->mode_config.mutex);
-       return 0;
-
-err:
-       list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-               if (failed == connector)
-                       break;
-
-               drm_connector_unregister(connector);
-       }
-       mutex_unlock(&dev->mode_config.mutex);
-
-       return ret;
-}
-
 static void atmel_hlcdc_dc_connector_unplug_all(struct drm_device *dev)
 {
        mutex_lock(&dev->mode_config.mutex);
-       drm_connector_unplug_all(dev);
+       drm_connector_unregister_all(dev);
        mutex_unlock(&dev->mode_config.mutex);
 }
 
@@ -736,7 +815,7 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device *pdev)
        if (ret)
                goto err_unload;
 
-       ret = atmel_hlcdc_dc_connector_plug_all(ddev);
+       ret = drm_connector_register_all(ddev);
        if (ret)
                goto err_unregister;
 
index fed517f297da1ead290a60c1ab0140467cefed01..7a47f8c094d021d75a3ec86263145eb8326d7f22 100644 (file)
  * @min_height: minimum height supported by the Display Controller
  * @max_width: maximum width supported by the Display Controller
  * @max_height: maximum height supported by the Display Controller
+ * @max_spw: maximum vertical/horizontal pulse width
+ * @max_vpw: maximum vertical back/front porch width
+ * @max_hpw: maximum horizontal back/front porch width
+ * @conflicting_output_formats: true if RGBXXX output formats conflict with
+ *                             each other.
  * @layers: a layer description table describing available layers
  * @nlayers: layer description table size
  */
@@ -58,6 +63,10 @@ struct atmel_hlcdc_dc_desc {
        int min_height;
        int max_width;
        int max_height;
+       int max_spw;
+       int max_vpw;
+       int max_hpw;
+       bool conflicting_output_formats;
        const struct atmel_hlcdc_layer_desc *layers;
        int nlayers;
 };
@@ -128,6 +137,7 @@ struct atmel_hlcdc_planes {
  * @planes: instantiated planes
  * @layers: active HLCDC layer
  * @wq: display controller workqueue
+ * @commit: used for async commit handling
  */
 struct atmel_hlcdc_dc {
        const struct atmel_hlcdc_dc_desc *desc;
@@ -137,6 +147,10 @@ struct atmel_hlcdc_dc {
        struct atmel_hlcdc_planes *planes;
        struct atmel_hlcdc_layer *layers[ATMEL_HLCDC_MAX_LAYERS];
        struct workqueue_struct *wq;
+       struct {
+               wait_queue_head_t wait;
+               bool pending;
+       } commit;
 };
 
 extern struct atmel_hlcdc_formats atmel_hlcdc_plane_rgb_formats;
@@ -149,6 +163,7 @@ struct atmel_hlcdc_planes *
 atmel_hlcdc_create_planes(struct drm_device *dev);
 
 int atmel_hlcdc_plane_prepare_disc_area(struct drm_crtc_state *c_state);
+int atmel_hlcdc_plane_prepare_ahb_routing(struct drm_crtc_state *c_state);
 
 void atmel_hlcdc_crtc_irq(struct drm_crtc *c);
 
index 0f7ec016e7a9695da29045d00d4b01dd636296ed..39802c0539b6ba5e2a3361f1441c20da2c5de2ec 100644 (file)
 
 #include "atmel_hlcdc_dc.h"
 
-/**
- * Atmel HLCDC RGB output mode
- */
-enum atmel_hlcdc_connector_rgb_mode {
-       ATMEL_HLCDC_CONNECTOR_RGB444,
-       ATMEL_HLCDC_CONNECTOR_RGB565,
-       ATMEL_HLCDC_CONNECTOR_RGB666,
-       ATMEL_HLCDC_CONNECTOR_RGB888,
-};
-
 /**
  * Atmel HLCDC RGB connector structure
  *
@@ -44,13 +34,13 @@ enum atmel_hlcdc_connector_rgb_mode {
  * @connector: DRM connector
  * @encoder: DRM encoder
  * @dc: pointer to the atmel_hlcdc_dc structure
- * @dpms: current DPMS mode
+ * @panel: panel connected on the RGB output
  */
 struct atmel_hlcdc_rgb_output {
        struct drm_connector connector;
        struct drm_encoder encoder;
        struct atmel_hlcdc_dc *dc;
-       int dpms;
+       struct drm_panel *panel;
 };
 
 static inline struct atmel_hlcdc_rgb_output *
@@ -66,91 +56,31 @@ drm_encoder_to_atmel_hlcdc_rgb_output(struct drm_encoder *encoder)
        return container_of(encoder, struct atmel_hlcdc_rgb_output, encoder);
 }
 
-/**
- * Atmel HLCDC Panel device structure
- *
- * This structure is specialization of the slave device structure to
- * interface with drm panels.
- *
- * @base: base slave device fields
- * @panel: drm panel attached to this slave device
- */
-struct atmel_hlcdc_panel {
-       struct atmel_hlcdc_rgb_output base;
-       struct drm_panel *panel;
-};
-
-static inline struct atmel_hlcdc_panel *
-atmel_hlcdc_rgb_output_to_panel(struct atmel_hlcdc_rgb_output *output)
-{
-       return container_of(output, struct atmel_hlcdc_panel, base);
-}
-
-static void atmel_hlcdc_panel_encoder_enable(struct drm_encoder *encoder)
+static void atmel_hlcdc_rgb_encoder_enable(struct drm_encoder *encoder)
 {
        struct atmel_hlcdc_rgb_output *rgb =
                        drm_encoder_to_atmel_hlcdc_rgb_output(encoder);
-       struct atmel_hlcdc_panel *panel = atmel_hlcdc_rgb_output_to_panel(rgb);
 
-       drm_panel_enable(panel->panel);
+       if (rgb->panel) {
+               drm_panel_prepare(rgb->panel);
+               drm_panel_enable(rgb->panel);
+       }
 }
 
-static void atmel_hlcdc_panel_encoder_disable(struct drm_encoder *encoder)
+static void atmel_hlcdc_rgb_encoder_disable(struct drm_encoder *encoder)
 {
        struct atmel_hlcdc_rgb_output *rgb =
                        drm_encoder_to_atmel_hlcdc_rgb_output(encoder);
-       struct atmel_hlcdc_panel *panel = atmel_hlcdc_rgb_output_to_panel(rgb);
 
-       drm_panel_disable(panel->panel);
-}
-
-static bool
-atmel_hlcdc_panel_encoder_mode_fixup(struct drm_encoder *encoder,
-                                    const struct drm_display_mode *mode,
-                                    struct drm_display_mode *adjusted)
-{
-       return true;
-}
-
-static void
-atmel_hlcdc_rgb_encoder_mode_set(struct drm_encoder *encoder,
-                                struct drm_display_mode *mode,
-                                struct drm_display_mode *adjusted)
-{
-       struct atmel_hlcdc_rgb_output *rgb =
-                       drm_encoder_to_atmel_hlcdc_rgb_output(encoder);
-       struct drm_display_info *info = &rgb->connector.display_info;
-       unsigned int cfg;
-
-       cfg = 0;
-
-       if (info->num_bus_formats) {
-               switch (info->bus_formats[0]) {
-               case MEDIA_BUS_FMT_RGB565_1X16:
-                       cfg |= ATMEL_HLCDC_CONNECTOR_RGB565 << 8;
-                       break;
-               case MEDIA_BUS_FMT_RGB666_1X18:
-                       cfg |= ATMEL_HLCDC_CONNECTOR_RGB666 << 8;
-                       break;
-               case MEDIA_BUS_FMT_RGB888_1X24:
-                       cfg |= ATMEL_HLCDC_CONNECTOR_RGB888 << 8;
-                       break;
-               case MEDIA_BUS_FMT_RGB444_1X12:
-               default:
-                       break;
-               }
+       if (rgb->panel) {
+               drm_panel_disable(rgb->panel);
+               drm_panel_unprepare(rgb->panel);
        }
-
-       regmap_update_bits(rgb->dc->hlcdc->regmap, ATMEL_HLCDC_CFG(5),
-                          ATMEL_HLCDC_MODE_MASK,
-                          cfg);
 }
 
 static const struct drm_encoder_helper_funcs atmel_hlcdc_panel_encoder_helper_funcs = {
-       .mode_fixup = atmel_hlcdc_panel_encoder_mode_fixup,
-       .mode_set = atmel_hlcdc_rgb_encoder_mode_set,
-       .disable = atmel_hlcdc_panel_encoder_disable,
-       .enable = atmel_hlcdc_panel_encoder_enable,
+       .disable = atmel_hlcdc_rgb_encoder_disable,
+       .enable = atmel_hlcdc_rgb_encoder_enable,
 };
 
 static void atmel_hlcdc_rgb_encoder_destroy(struct drm_encoder *encoder)
@@ -167,9 +97,11 @@ static int atmel_hlcdc_panel_get_modes(struct drm_connector *connector)
 {
        struct atmel_hlcdc_rgb_output *rgb =
                        drm_connector_to_atmel_hlcdc_rgb_output(connector);
-       struct atmel_hlcdc_panel *panel = atmel_hlcdc_rgb_output_to_panel(rgb);
 
-       return panel->panel->funcs->get_modes(panel->panel);
+       if (rgb->panel)
+               return rgb->panel->funcs->get_modes(rgb->panel);
+
+       return 0;
 }
 
 static int atmel_hlcdc_rgb_mode_valid(struct drm_connector *connector,
@@ -201,7 +133,13 @@ static const struct drm_connector_helper_funcs atmel_hlcdc_panel_connector_helpe
 static enum drm_connector_status
 atmel_hlcdc_panel_connector_detect(struct drm_connector *connector, bool force)
 {
-       return connector_status_connected;
+       struct atmel_hlcdc_rgb_output *rgb =
+                       drm_connector_to_atmel_hlcdc_rgb_output(connector);
+
+       if (rgb->panel)
+               return connector_status_connected;
+
+       return connector_status_disconnected;
 }
 
 static void
@@ -209,9 +147,10 @@ atmel_hlcdc_panel_connector_destroy(struct drm_connector *connector)
 {
        struct atmel_hlcdc_rgb_output *rgb =
                        drm_connector_to_atmel_hlcdc_rgb_output(connector);
-       struct atmel_hlcdc_panel *panel = atmel_hlcdc_rgb_output_to_panel(rgb);
 
-       drm_panel_detach(panel->panel);
+       if (rgb->panel)
+               drm_panel_detach(rgb->panel);
+
        drm_connector_cleanup(connector);
 }
 
@@ -225,88 +164,122 @@ static const struct drm_connector_funcs atmel_hlcdc_panel_connector_funcs = {
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
-static int atmel_hlcdc_create_panel_output(struct drm_device *dev,
-                                          struct of_endpoint *ep)
+static int atmel_hlcdc_check_endpoint(struct drm_device *dev,
+                                     const struct of_endpoint *ep)
 {
-       struct atmel_hlcdc_dc *dc = dev->dev_private;
        struct device_node *np;
-       struct drm_panel *p = NULL;
-       struct atmel_hlcdc_panel *panel;
-       int ret;
+       void *obj;
 
        np = of_graph_get_remote_port_parent(ep->local_node);
-       if (!np)
-               return -EINVAL;
 
-       p = of_drm_find_panel(np);
+       obj = of_drm_find_panel(np);
+       if (!obj)
+               obj = of_drm_find_bridge(np);
+
        of_node_put(np);
 
-       if (!p)
-               return -EPROBE_DEFER;
+       return obj ? 0 : -EPROBE_DEFER;
+}
 
-       panel = devm_kzalloc(dev->dev, sizeof(*panel), GFP_KERNEL);
-       if (!panel)
-               return -EINVAL;
+static int atmel_hlcdc_attach_endpoint(struct drm_device *dev,
+                                      const struct of_endpoint *ep)
+{
+       struct atmel_hlcdc_dc *dc = dev->dev_private;
+       struct atmel_hlcdc_rgb_output *output;
+       struct device_node *np;
+       struct drm_panel *panel;
+       struct drm_bridge *bridge;
+       int ret;
 
-       panel->base.dpms = DRM_MODE_DPMS_OFF;
+       output = devm_kzalloc(dev->dev, sizeof(*output), GFP_KERNEL);
+       if (!output)
+               return -EINVAL;
 
-       panel->base.dc = dc;
+       output->dc = dc;
 
-       drm_encoder_helper_add(&panel->base.encoder,
+       drm_encoder_helper_add(&output->encoder,
                               &atmel_hlcdc_panel_encoder_helper_funcs);
-       ret = drm_encoder_init(dev, &panel->base.encoder,
+       ret = drm_encoder_init(dev, &output->encoder,
                               &atmel_hlcdc_panel_encoder_funcs,
-                              DRM_MODE_ENCODER_LVDS, NULL);
+                              DRM_MODE_ENCODER_NONE, NULL);
        if (ret)
                return ret;
 
-       panel->base.connector.dpms = DRM_MODE_DPMS_OFF;
-       panel->base.connector.polled = DRM_CONNECTOR_POLL_CONNECT;
-       drm_connector_helper_add(&panel->base.connector,
-                                &atmel_hlcdc_panel_connector_helper_funcs);
-       ret = drm_connector_init(dev, &panel->base.connector,
-                                &atmel_hlcdc_panel_connector_funcs,
-                                DRM_MODE_CONNECTOR_LVDS);
-       if (ret)
-               goto err_encoder_cleanup;
+       output->encoder.possible_crtcs = 0x1;
+
+       np = of_graph_get_remote_port_parent(ep->local_node);
 
-       drm_mode_connector_attach_encoder(&panel->base.connector,
-                                         &panel->base.encoder);
-       panel->base.encoder.possible_crtcs = 0x1;
+       ret = -EPROBE_DEFER;
+
+       panel = of_drm_find_panel(np);
+       if (panel) {
+               of_node_put(np);
+               output->connector.dpms = DRM_MODE_DPMS_OFF;
+               output->connector.polled = DRM_CONNECTOR_POLL_CONNECT;
+               drm_connector_helper_add(&output->connector,
+                               &atmel_hlcdc_panel_connector_helper_funcs);
+               ret = drm_connector_init(dev, &output->connector,
+                                        &atmel_hlcdc_panel_connector_funcs,
+                                        DRM_MODE_CONNECTOR_Unknown);
+               if (ret)
+                       goto err_encoder_cleanup;
+
+               drm_mode_connector_attach_encoder(&output->connector,
+                                                 &output->encoder);
+
+               ret = drm_panel_attach(panel, &output->connector);
+               if (ret) {
+                       drm_connector_cleanup(&output->connector);
+                       goto err_encoder_cleanup;
+               }
 
-       drm_panel_attach(p, &panel->base.connector);
-       panel->panel = p;
+               output->panel = panel;
 
-       return 0;
+               return 0;
+       }
+
+       bridge = of_drm_find_bridge(np);
+       of_node_put(np);
+
+       if (bridge) {
+               output->encoder.bridge = bridge;
+               bridge->encoder = &output->encoder;
+               ret = drm_bridge_attach(dev, bridge);
+               if (!ret)
+                       return 0;
+       }
 
 err_encoder_cleanup:
-       drm_encoder_cleanup(&panel->base.encoder);
+       drm_encoder_cleanup(&output->encoder);
 
        return ret;
 }
 
 int atmel_hlcdc_create_outputs(struct drm_device *dev)
 {
-       struct device_node *port_np, *np;
+       struct device_node *ep_np = NULL;
        struct of_endpoint ep;
        int ret;
 
-       port_np = of_get_child_by_name(dev->dev->of_node, "port");
-       if (!port_np)
-               return -EINVAL;
-
-       np = of_get_child_by_name(port_np, "endpoint");
-       of_node_put(port_np);
+       for_each_endpoint_of_node(dev->dev->of_node, ep_np) {
+               ret = of_graph_parse_endpoint(ep_np, &ep);
+               if (!ret)
+                       ret = atmel_hlcdc_check_endpoint(dev, &ep);
 
-       if (!np)
-               return -EINVAL;
+               of_node_put(ep_np);
+               if (ret)
+                       return ret;
+       }
 
-       ret = of_graph_parse_endpoint(np, &ep);
-       of_node_put(port_np);
+       for_each_endpoint_of_node(dev->dev->of_node, ep_np) {
+               ret = of_graph_parse_endpoint(ep_np, &ep);
+               if (!ret)
+                       ret = atmel_hlcdc_attach_endpoint(dev, &ep);
 
-       if (ret)
-               return ret;
+               of_node_put(ep_np);
+               if (ret)
+                       return ret;
+       }
 
-       /* We currently only support panel output */
-       return atmel_hlcdc_create_panel_output(dev, &ep);
+       return 0;
 }
index d65dcaee38323c19def9c958cb31e6a9617c9c82..aef3ca8a81fae37c31c84ba13eb45ff374dab83c 100644 (file)
@@ -37,6 +37,7 @@
  * @xstride: value to add to the pixel pointer between each line
  * @pstride: value to add to the pixel pointer between each pixel
  * @nplanes: number of planes (deduced from pixel_format)
+ * @prepared: plane update has been prepared
  */
 struct atmel_hlcdc_plane_state {
        struct drm_plane_state base;
@@ -58,12 +59,15 @@ struct atmel_hlcdc_plane_state {
        int disc_w;
        int disc_h;
 
+       int ahb_id;
+
        /* These fields are private and should not be touched */
        int bpp[ATMEL_HLCDC_MAX_PLANES];
        unsigned int offsets[ATMEL_HLCDC_MAX_PLANES];
        int xstride[ATMEL_HLCDC_MAX_PLANES];
        int pstride[ATMEL_HLCDC_MAX_PLANES];
        int nplanes;
+       bool prepared;
 };
 
 static inline struct atmel_hlcdc_plane_state *
@@ -359,8 +363,10 @@ atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane,
 
        atmel_hlcdc_layer_update_cfg(&plane->layer,
                                     ATMEL_HLCDC_LAYER_DMA_CFG_ID,
-                                    ATMEL_HLCDC_LAYER_DMA_BLEN_MASK,
-                                    ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16);
+                                    ATMEL_HLCDC_LAYER_DMA_BLEN_MASK |
+                                    ATMEL_HLCDC_LAYER_DMA_SIF,
+                                    ATMEL_HLCDC_LAYER_DMA_BLEN_INCR16 |
+                                    state->ahb_id);
 
        atmel_hlcdc_layer_update_cfg(&plane->layer, layout->general_config,
                                     ATMEL_HLCDC_LAYER_ITER2BL |
@@ -435,6 +441,41 @@ static void atmel_hlcdc_plane_update_buffers(struct atmel_hlcdc_plane *plane,
        }
 }
 
+int atmel_hlcdc_plane_prepare_ahb_routing(struct drm_crtc_state *c_state)
+{
+       unsigned int ahb_load[2] = { };
+       struct drm_plane *plane;
+
+       drm_atomic_crtc_state_for_each_plane(plane, c_state) {
+               struct atmel_hlcdc_plane_state *plane_state;
+               struct drm_plane_state *plane_s;
+               unsigned int pixels, load = 0;
+               int i;
+
+               plane_s = drm_atomic_get_plane_state(c_state->state, plane);
+               if (IS_ERR(plane_s))
+                       return PTR_ERR(plane_s);
+
+               plane_state =
+                       drm_plane_state_to_atmel_hlcdc_plane_state(plane_s);
+
+               pixels = (plane_state->src_w * plane_state->src_h) -
+                        (plane_state->disc_w * plane_state->disc_h);
+
+               for (i = 0; i < plane_state->nplanes; i++)
+                       load += pixels * plane_state->bpp[i];
+
+               if (ahb_load[0] <= ahb_load[1])
+                       plane_state->ahb_id = 0;
+               else
+                       plane_state->ahb_id = 1;
+
+               ahb_load[plane_state->ahb_id] += load;
+       }
+
+       return 0;
+}
+
 int
 atmel_hlcdc_plane_prepare_disc_area(struct drm_crtc_state *c_state)
 {
@@ -714,12 +755,54 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
 static int atmel_hlcdc_plane_prepare_fb(struct drm_plane *p,
                                        const struct drm_plane_state *new_state)
 {
+       /*
+        * FIXME: we should avoid this const -> non-const cast but it's
+        * currently the only solution we have to modify the ->prepared
+        * state and rollback the update request.
+        * Ideally, we should rework the code to attach all the resources
+        * to atmel_hlcdc_plane_state (including the DMA desc allocation),
+        * but this require a complete rework of the atmel_hlcdc_layer
+        * code.
+        */
+       struct drm_plane_state *s = (struct drm_plane_state *)new_state;
+       struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
+       struct atmel_hlcdc_plane_state *state =
+                       drm_plane_state_to_atmel_hlcdc_plane_state(s);
+       int ret;
+
+       ret = atmel_hlcdc_layer_update_start(&plane->layer);
+       if (!ret)
+               state->prepared = true;
+
+       return ret;
+}
+
+static void atmel_hlcdc_plane_cleanup_fb(struct drm_plane *p,
+                               const struct drm_plane_state *old_state)
+{
+       /*
+        * FIXME: we should avoid this const -> non-const cast but it's
+        * currently the only solution we have to modify the ->prepared
+        * state and rollback the update request.
+        * Ideally, we should rework the code to attach all the resources
+        * to atmel_hlcdc_plane_state (including the DMA desc allocation),
+        * but this require a complete rework of the atmel_hlcdc_layer
+        * code.
+        */
+       struct drm_plane_state *s = (struct drm_plane_state *)old_state;
        struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
+       struct atmel_hlcdc_plane_state *state =
+                       drm_plane_state_to_atmel_hlcdc_plane_state(s);
 
-       if (!new_state->fb)
-               return 0;
+       /*
+        * The Request has already been applied or cancelled, nothing to do
+        * here.
+        */
+       if (!state->prepared)
+               return;
 
-       return atmel_hlcdc_layer_update_start(&plane->layer);
+       atmel_hlcdc_layer_update_rollback(&plane->layer);
+       state->prepared = false;
 }
 
 static void atmel_hlcdc_plane_atomic_update(struct drm_plane *p,
@@ -844,6 +927,7 @@ static void atmel_hlcdc_plane_init_properties(struct atmel_hlcdc_plane *plane,
 
 static struct drm_plane_helper_funcs atmel_hlcdc_layer_plane_helper_funcs = {
        .prepare_fb = atmel_hlcdc_plane_prepare_fb,
+       .cleanup_fb = atmel_hlcdc_plane_cleanup_fb,
        .atomic_check = atmel_hlcdc_plane_atomic_check,
        .atomic_update = atmel_hlcdc_plane_atomic_update,
        .atomic_disable = atmel_hlcdc_plane_atomic_disable,
@@ -883,6 +967,7 @@ atmel_hlcdc_plane_atomic_duplicate_state(struct drm_plane *p)
                return NULL;
 
        copy->disc_updated = false;
+       copy->prepared = false;
 
        if (copy->base.fb)
                drm_framebuffer_reference(copy->base.fb);
index 7520bf81fc253387c00c1621cfa0e885ae5e6940..e1ec498a6b6eb3fa7577ec5e575b6640111d0511 100644 (file)
@@ -82,7 +82,7 @@ static int bochsfb_create(struct drm_fb_helper *helper,
 
        bo = gem_to_bochs_bo(gobj);
 
-       ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
+       ret = ttm_bo_reserve(&bo->bo, true, false, NULL);
        if (ret)
                return ret;
 
@@ -162,22 +162,7 @@ static int bochs_fbdev_destroy(struct bochs_device *bochs)
        return 0;
 }
 
-void bochs_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
-                       u16 blue, int regno)
-{
-}
-
-void bochs_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
-                       u16 *blue, int regno)
-{
-       *red   = regno;
-       *green = regno;
-       *blue  = regno;
-}
-
 static const struct drm_fb_helper_funcs bochs_fb_helper_funcs = {
-       .gamma_set = bochs_fb_gamma_set,
-       .gamma_get = bochs_fb_gamma_get,
        .fb_probe = bochsfb_create,
 };
 
index 96926f09e0c9cdcdcaed085edcd7ccf8ebb971ca..207a2cbcc1133c829dd1b2c28138bab82fbf216d 100644 (file)
@@ -43,7 +43,7 @@ static int bochs_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
        if (old_fb) {
                bochs_fb = to_bochs_framebuffer(old_fb);
                bo = gem_to_bochs_bo(bochs_fb->obj);
-               ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
+               ret = ttm_bo_reserve(&bo->bo, true, false, NULL);
                if (ret) {
                        DRM_ERROR("failed to reserve old_fb bo\n");
                } else {
@@ -57,7 +57,7 @@ static int bochs_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 
        bochs_fb = to_bochs_framebuffer(crtc->primary->fb);
        bo = gem_to_bochs_bo(bochs_fb->obj);
-       ret = ttm_bo_reserve(&bo->bo, true, false, false, NULL);
+       ret = ttm_bo_reserve(&bo->bo, true, false, NULL);
        if (ret)
                return ret;
 
@@ -93,11 +93,6 @@ static void bochs_crtc_commit(struct drm_crtc *crtc)
 {
 }
 
-static void bochs_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
-                                u16 *blue, uint32_t start, uint32_t size)
-{
-}
-
 static int bochs_crtc_page_flip(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
                                struct drm_pending_vblank_event *event,
@@ -120,7 +115,6 @@ static int bochs_crtc_page_flip(struct drm_crtc *crtc,
 
 /* These provide the minimum set of functions required to handle a CRTC */
 static const struct drm_crtc_funcs bochs_crtc_funcs = {
-       .gamma_set = bochs_crtc_gamma_set,
        .set_config = drm_crtc_helper_set_config,
        .destroy = drm_crtc_cleanup,
        .page_flip = bochs_crtc_page_flip,
@@ -140,7 +134,6 @@ static void bochs_crtc_init(struct drm_device *dev)
        struct drm_crtc *crtc = &bochs->crtc;
 
        drm_crtc_init(dev, crtc, &bochs_crtc_funcs);
-       drm_mode_crtc_set_gamma_size(crtc, 256);
        drm_crtc_helper_add(crtc, &bochs_helper_funcs);
 }
 
index d812ad014da5c407476eb01246bdb9bd2474b2c1..6cf912c45e481c1d6a323d40bea32bc0073c275c 100644 (file)
@@ -212,6 +212,8 @@ struct ttm_bo_driver bochs_bo_driver = {
        .verify_access = bochs_bo_verify_access,
        .io_mem_reserve = &bochs_ttm_io_mem_reserve,
        .io_mem_free = &bochs_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int bochs_mm_init(struct bochs_device *bochs)
@@ -456,7 +458,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
        struct drm_gem_object *obj;
        struct bochs_bo *bo;
 
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL)
                return -ENOENT;
 
@@ -518,7 +520,7 @@ bochs_user_framebuffer_create(struct drm_device *dev,
        if (mode_cmd->pixel_format != DRM_FORMAT_XRGB8888)
                return ERR_PTR(-ENOENT);
 
-       obj = drm_gem_object_lookup(dev, filp, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
index 27e2022de89db1eb3b0807f5d34a397d8dfed214..8f7423f18da5d77ed60bbbb5ccfed55bcf01f308 100644 (file)
@@ -7,6 +7,16 @@ config DRM_BRIDGE
 menu "Display Interface Bridges"
        depends on DRM && DRM_BRIDGE
 
+config DRM_ANALOGIX_ANX78XX
+       tristate "Analogix ANX78XX bridge"
+       select DRM_KMS_HELPER
+       select REGMAP_I2C
+       ---help---
+         ANX78XX is an ultra-low Full-HD SlimPort transmitter
+         designed for portable devices. The ANX78XX transforms
+         the HDMI output of an application processor to MyDP
+         or DisplayPort.
+
 config DRM_DW_HDMI
        tristate
        select DRM_KMS_HELPER
@@ -40,4 +50,6 @@ config DRM_PARADE_PS8622
        ---help---
          Parade eDP-LVDS bridge chip driver.
 
+source "drivers/gpu/drm/bridge/analogix/Kconfig"
+
 endmenu
index f13c33d67c03c5bbfc1f294bf15e4e1737452b52..96b13b30e6ab53e9593ecc002286c16e30ae8e08 100644 (file)
@@ -1,6 +1,8 @@
 ccflags-y := -Iinclude/drm
 
+obj-$(CONFIG_DRM_ANALOGIX_ANX78XX) += analogix-anx78xx.o
 obj-$(CONFIG_DRM_DW_HDMI) += dw-hdmi.o
 obj-$(CONFIG_DRM_DW_HDMI_AHB_AUDIO) += dw-hdmi-ahb-audio.o
 obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o
 obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o
+obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix/
diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix-anx78xx.c
new file mode 100644 (file)
index 0000000..d087b05
--- /dev/null
@@ -0,0 +1,1514 @@
+/*
+ * Copyright(c) 2016, Analogix Semiconductor.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Based on anx7808 driver obtained from chromeos with copyright:
+ * Copyright(c) 2013, Google Inc.
+ *
+ */
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_gpio.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/regmap.h>
+#include <linux/types.h>
+#include <linux/gpio/consumer.h>
+#include <linux/regulator/consumer.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_dp_helper.h>
+#include <drm/drm_edid.h>
+
+#include "analogix-anx78xx.h"
+
+#define I2C_NUM_ADDRESSES      5
+#define I2C_IDX_TX_P0          0
+#define I2C_IDX_TX_P1          1
+#define I2C_IDX_TX_P2          2
+#define I2C_IDX_RX_P0          3
+#define I2C_IDX_RX_P1          4
+
+#define XTAL_CLK               270 /* 27M */
+#define AUX_CH_BUFFER_SIZE     16
+#define AUX_WAIT_TIMEOUT_MS    15
+
+static const u8 anx78xx_i2c_addresses[] = {
+       [I2C_IDX_TX_P0] = TX_P0,
+       [I2C_IDX_TX_P1] = TX_P1,
+       [I2C_IDX_TX_P2] = TX_P2,
+       [I2C_IDX_RX_P0] = RX_P0,
+       [I2C_IDX_RX_P1] = RX_P1,
+};
+
+struct anx78xx_platform_data {
+       struct regulator *dvdd10;
+       struct gpio_desc *gpiod_hpd;
+       struct gpio_desc *gpiod_pd;
+       struct gpio_desc *gpiod_reset;
+
+       int hpd_irq;
+       int intp_irq;
+};
+
+struct anx78xx {
+       struct drm_dp_aux aux;
+       struct drm_bridge bridge;
+       struct i2c_client *client;
+       struct edid *edid;
+       struct drm_connector connector;
+       struct drm_dp_link link;
+       struct anx78xx_platform_data pdata;
+       struct mutex lock;
+
+       /*
+        * I2C Slave addresses of ANX7814 are mapped as TX_P0, TX_P1, TX_P2,
+        * RX_P0 and RX_P1.
+        */
+       struct i2c_client *i2c_dummy[I2C_NUM_ADDRESSES];
+       struct regmap *map[I2C_NUM_ADDRESSES];
+
+       u16 chipid;
+       u8 dpcd[DP_RECEIVER_CAP_SIZE];
+
+       bool powered;
+};
+
+static inline struct anx78xx *connector_to_anx78xx(struct drm_connector *c)
+{
+       return container_of(c, struct anx78xx, connector);
+}
+
+static inline struct anx78xx *bridge_to_anx78xx(struct drm_bridge *bridge)
+{
+       return container_of(bridge, struct anx78xx, bridge);
+}
+
+static int anx78xx_set_bits(struct regmap *map, u8 reg, u8 mask)
+{
+       return regmap_update_bits(map, reg, mask, mask);
+}
+
+static int anx78xx_clear_bits(struct regmap *map, u8 reg, u8 mask)
+{
+       return regmap_update_bits(map, reg, mask, 0);
+}
+
+static bool anx78xx_aux_op_finished(struct anx78xx *anx78xx)
+{
+       unsigned int value;
+       int err;
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL2_REG,
+                         &value);
+       if (err < 0)
+               return false;
+
+       return (value & SP_AUX_EN) == 0;
+}
+
+static int anx78xx_aux_wait(struct anx78xx *anx78xx)
+{
+       unsigned long timeout;
+       unsigned int status;
+       int err;
+
+       timeout = jiffies + msecs_to_jiffies(AUX_WAIT_TIMEOUT_MS) + 1;
+
+       while (!anx78xx_aux_op_finished(anx78xx)) {
+               if (time_after(jiffies, timeout)) {
+                       if (!anx78xx_aux_op_finished(anx78xx)) {
+                               DRM_ERROR("Timed out waiting AUX to finish\n");
+                               return -ETIMEDOUT;
+                       }
+
+                       break;
+               }
+
+               usleep_range(1000, 2000);
+       }
+
+       /* Read the AUX channel access status */
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_CH_STATUS_REG,
+                         &status);
+       if (err < 0) {
+               DRM_ERROR("Failed to read from AUX channel: %d\n", err);
+               return err;
+       }
+
+       if (status & SP_AUX_STATUS) {
+               DRM_ERROR("Failed to wait for AUX channel (status: %02x)\n",
+                         status);
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
+static int anx78xx_aux_address(struct anx78xx *anx78xx, unsigned int addr)
+{
+       int err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_ADDR_7_0_REG,
+                          addr & 0xff);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_ADDR_15_8_REG,
+                          (addr & 0xff00) >> 8);
+       if (err)
+               return err;
+
+       /*
+        * DP AUX CH Address Register #2, only update bits[3:0]
+        * [7:4] RESERVED
+        * [3:0] AUX_ADDR[19:16], Register control AUX CH address.
+        */
+       err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_AUX_ADDR_19_16_REG,
+                                SP_AUX_ADDR_19_16_MASK,
+                                (addr & 0xf0000) >> 16);
+
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static ssize_t anx78xx_aux_transfer(struct drm_dp_aux *aux,
+                                   struct drm_dp_aux_msg *msg)
+{
+       struct anx78xx *anx78xx = container_of(aux, struct anx78xx, aux);
+       u8 ctrl1 = msg->request;
+       u8 ctrl2 = SP_AUX_EN;
+       u8 *buffer = msg->buffer;
+       int err;
+
+       /* The DP AUX transmit and receive buffer has 16 bytes. */
+       if (WARN_ON(msg->size > AUX_CH_BUFFER_SIZE))
+               return -E2BIG;
+
+       /* Zero-sized messages specify address-only transactions. */
+       if (msg->size < 1)
+               ctrl2 |= SP_ADDR_ONLY;
+       else    /* For non-zero-sized set the length field. */
+               ctrl1 |= (msg->size - 1) << SP_AUX_LENGTH_SHIFT;
+
+       if ((msg->request & DP_AUX_I2C_READ) == 0) {
+               /* When WRITE | MOT write values to data buffer */
+               err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P0],
+                                       SP_DP_BUF_DATA0_REG, buffer,
+                                       msg->size);
+               if (err)
+                       return err;
+       }
+
+       /* Write address and request */
+       err = anx78xx_aux_address(anx78xx, msg->address);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL1_REG,
+                          ctrl1);
+       if (err)
+               return err;
+
+       /* Start transaction */
+       err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_DP_AUX_CH_CTRL2_REG, SP_ADDR_ONLY |
+                                SP_AUX_EN, ctrl2);
+       if (err)
+               return err;
+
+       err = anx78xx_aux_wait(anx78xx);
+       if (err)
+               return err;
+
+       msg->reply = DP_AUX_I2C_REPLY_ACK;
+
+       if ((msg->size > 0) && (msg->request & DP_AUX_I2C_READ)) {
+               /* Read values from data buffer */
+               err = regmap_bulk_read(anx78xx->map[I2C_IDX_TX_P0],
+                                      SP_DP_BUF_DATA0_REG, buffer,
+                                      msg->size);
+               if (err)
+                       return err;
+       }
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_DP_AUX_CH_CTRL2_REG, SP_ADDR_ONLY);
+       if (err)
+               return err;
+
+       return msg->size;
+}
+
+static int anx78xx_set_hpd(struct anx78xx *anx78xx)
+{
+       int err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
+                                SP_TMDS_CTRL_BASE + 7, SP_PD_RT);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG,
+                              SP_HPD_OUT);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_clear_hpd(struct anx78xx *anx78xx)
+{
+       int err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL3_REG,
+                                SP_HPD_OUT);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
+                              SP_TMDS_CTRL_BASE + 7, SP_PD_RT);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static const struct reg_sequence tmds_phy_initialization[] = {
+       { SP_TMDS_CTRL_BASE +  1, 0x90 },
+       { SP_TMDS_CTRL_BASE +  2, 0xa9 },
+       { SP_TMDS_CTRL_BASE +  6, 0x92 },
+       { SP_TMDS_CTRL_BASE +  7, 0x80 },
+       { SP_TMDS_CTRL_BASE + 20, 0xf2 },
+       { SP_TMDS_CTRL_BASE + 22, 0xc4 },
+       { SP_TMDS_CTRL_BASE + 23, 0x18 },
+};
+
+static int anx78xx_rx_initialization(struct anx78xx *anx78xx)
+{
+       int err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG,
+                          SP_AUD_MUTE | SP_VID_MUTE);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_CHIP_CTRL_REG,
+                              SP_MAN_HDMI5V_DET | SP_PLLLOCK_CKDT_EN |
+                              SP_DIGITAL_CKDT_EN);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
+                              SP_SOFTWARE_RESET1_REG, SP_HDCP_MAN_RST |
+                              SP_SW_MAN_RST | SP_TMDS_RST | SP_VIDEO_RST);
+       if (err)
+               return err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
+                                SP_SOFTWARE_RESET1_REG, SP_HDCP_MAN_RST |
+                                SP_SW_MAN_RST | SP_TMDS_RST | SP_VIDEO_RST);
+       if (err)
+               return err;
+
+       /* Sync detect change, GP set mute */
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
+                              SP_AUD_EXCEPTION_ENABLE_BASE + 1, BIT(5) |
+                              BIT(6));
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
+                              SP_AUD_EXCEPTION_ENABLE_BASE + 3,
+                              SP_AEC_EN21);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0], SP_AUDVID_CTRL_REG,
+                              SP_AVC_EN | SP_AAC_OE | SP_AAC_EN);
+       if (err)
+               return err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_RX_P0],
+                                SP_SYSTEM_POWER_DOWN1_REG, SP_PWDN_CTRL);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_RX_P0],
+                              SP_VID_DATA_RANGE_CTRL_REG, SP_R2Y_INPUT_LIMIT);
+       if (err)
+               return err;
+
+       /* Enable DDC stretch */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_DP_EXTRA_I2C_DEV_ADDR_REG, SP_I2C_EXTRA_ADDR);
+       if (err)
+               return err;
+
+       /* TMDS phy initialization */
+       err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_RX_P0],
+                                    tmds_phy_initialization,
+                                    ARRAY_SIZE(tmds_phy_initialization));
+       if (err)
+               return err;
+
+       err = anx78xx_clear_hpd(anx78xx);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static const u8 dp_tx_output_precise_tune_bits[20] = {
+       0x01, 0x03, 0x07, 0x7f, 0x71, 0x6b, 0x7f,
+       0x73, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00,
+       0x0c, 0x42, 0x1e, 0x3e, 0x72, 0x7e,
+};
+
+static int anx78xx_link_phy_initialization(struct anx78xx *anx78xx)
+{
+       int err;
+
+       /*
+        * REVISIT : It is writing to a RESERVED bits in Analog Control 0
+        * register.
+        */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_ANALOG_CTRL0_REG,
+                          0x02);
+       if (err)
+               return err;
+
+       /*
+        * Write DP TX output emphasis precise tune bits.
+        */
+       err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P1],
+                               SP_DP_TX_LT_CTRL0_REG,
+                               dp_tx_output_precise_tune_bits,
+                               ARRAY_SIZE(dp_tx_output_precise_tune_bits));
+
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_xtal_clk_sel(struct anx78xx *anx78xx)
+{
+       unsigned int value;
+       int err;
+
+       err = regmap_update_bits(anx78xx->map[I2C_IDX_TX_P2],
+                                SP_ANALOG_DEBUG2_REG,
+                                SP_XTAL_FRQ | SP_FORCE_SW_OFF_BYPASS,
+                                SP_XTAL_FRQ_27M);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL3_REG,
+                          XTAL_CLK & SP_WAIT_COUNTER_7_0_MASK);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL4_REG,
+                          ((XTAL_CLK & 0xff00) >> 2) | (XTAL_CLK / 10));
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_I2C_GEN_10US_TIMER0_REG, XTAL_CLK & 0xff);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_I2C_GEN_10US_TIMER1_REG,
+                          (XTAL_CLK & 0xff00) >> 8);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_MISC_CTRL_REG,
+                          XTAL_CLK / 10 - 1);
+       if (err)
+               return err;
+
+       err = regmap_read(anx78xx->map[I2C_IDX_RX_P0],
+                         SP_HDMI_US_TIMER_CTRL_REG,
+                         &value);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_RX_P0],
+                          SP_HDMI_US_TIMER_CTRL_REG,
+                          (value & SP_MS_TIMER_MARGIN_10_8_MASK) |
+                          ((((XTAL_CLK / 10) >> 1) - 2) << 3));
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static const struct reg_sequence otp_key_protect[] = {
+       { SP_OTP_KEY_PROTECT1_REG, SP_OTP_PSW1 },
+       { SP_OTP_KEY_PROTECT2_REG, SP_OTP_PSW2 },
+       { SP_OTP_KEY_PROTECT3_REG, SP_OTP_PSW3 },
+};
+
+static int anx78xx_tx_initialization(struct anx78xx *anx78xx)
+{
+       int err;
+
+       /* Set terminal resistor to 50 ohm */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_AUX_CH_CTRL2_REG,
+                          0x30);
+       if (err)
+               return err;
+
+       /* Enable aux double diff output */
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_AUX_CH_CTRL2_REG, 0x08);
+       if (err)
+               return err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_DP_HDCP_CTRL_REG, SP_AUTO_EN |
+                                SP_AUTO_START);
+       if (err)
+               return err;
+
+       err = regmap_multi_reg_write(anx78xx->map[I2C_IDX_TX_P0],
+                                    otp_key_protect,
+                                    ARRAY_SIZE(otp_key_protect));
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_HDCP_KEY_COMMAND_REG, SP_DISABLE_SYNC_HDCP);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL8_REG,
+                          SP_VID_VRES_TH);
+       if (err)
+               return err;
+
+       /*
+        * DP HDCP auto authentication wait timer (when downstream starts to
+        * auth, DP side will wait for this period then do auth automatically)
+        */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_HDCP_AUTO_TIMER_REG,
+                          0x00);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_HDCP_CTRL_REG, SP_LINK_POLLING);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_LINK_DEBUG_CTRL_REG, SP_M_VID_DEBUG);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2],
+                              SP_ANALOG_DEBUG2_REG, SP_POWERON_TIME_1P5MS);
+       if (err)
+               return err;
+
+       err = anx78xx_xtal_clk_sel(anx78xx);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_AUX_DEFER_CTRL_REG,
+                          SP_DEFER_CTRL_EN | 0x0c);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_POLLING_CTRL_REG,
+                              SP_AUTO_POLLING_DISABLE);
+       if (err)
+               return err;
+
+       /*
+        * Short the link integrity check timer to speed up bstatus
+        * polling for HDCP CTS item 1A-07
+        */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_HDCP_LINK_CHECK_TIMER_REG, 0x1d);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_MISC_CTRL_REG, SP_EQ_TRAINING_LOOP);
+       if (err)
+               return err;
+
+       /* Power down the main link by default */
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_ANALOG_POWER_DOWN_REG, SP_CH0_PD);
+       if (err)
+               return err;
+
+       err = anx78xx_link_phy_initialization(anx78xx);
+       if (err)
+               return err;
+
+       /* Gen m_clk with downspreading */
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_DP_M_CALCULATION_CTRL_REG, SP_M_GEN_CLK_SEL);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_enable_interrupts(struct anx78xx *anx78xx)
+{
+       int err;
+
+       /*
+        * BIT0: INT pin assertion polarity: 1 = assert high
+        * BIT1: INT pin output type: 0 = push/pull
+        */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_INT_CTRL_REG, 0x01);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2],
+                          SP_COMMON_INT_MASK4_REG, SP_HPD_LOST | SP_HPD_PLUG);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_MASK1_REG,
+                          SP_TRAINING_FINISH);
+       if (err)
+               return err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_MASK1_REG,
+                          SP_CKDT_CHG | SP_SCDT_CHG);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static void anx78xx_poweron(struct anx78xx *anx78xx)
+{
+       struct anx78xx_platform_data *pdata = &anx78xx->pdata;
+       int err;
+
+       if (WARN_ON(anx78xx->powered))
+               return;
+
+       if (pdata->dvdd10) {
+               err = regulator_enable(pdata->dvdd10);
+               if (err) {
+                       DRM_ERROR("Failed to enable DVDD10 regulator: %d\n",
+                                 err);
+                       return;
+               }
+
+               usleep_range(1000, 2000);
+       }
+
+       gpiod_set_value_cansleep(pdata->gpiod_reset, 1);
+       usleep_range(1000, 2000);
+
+       gpiod_set_value_cansleep(pdata->gpiod_pd, 0);
+       usleep_range(1000, 2000);
+
+       gpiod_set_value_cansleep(pdata->gpiod_reset, 0);
+
+       /* Power on registers module */
+       anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
+                        SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD);
+       anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
+                          SP_REGISTER_PD | SP_TOTAL_PD);
+
+       anx78xx->powered = true;
+}
+
+static void anx78xx_poweroff(struct anx78xx *anx78xx)
+{
+       struct anx78xx_platform_data *pdata = &anx78xx->pdata;
+       int err;
+
+       if (WARN_ON(!anx78xx->powered))
+               return;
+
+       gpiod_set_value_cansleep(pdata->gpiod_reset, 1);
+       usleep_range(1000, 2000);
+
+       gpiod_set_value_cansleep(pdata->gpiod_pd, 1);
+       usleep_range(1000, 2000);
+
+       if (pdata->dvdd10) {
+               err = regulator_disable(pdata->dvdd10);
+               if (err) {
+                       DRM_ERROR("Failed to disable DVDD10 regulator: %d\n",
+                                 err);
+                       return;
+               }
+
+               usleep_range(1000, 2000);
+       }
+
+       anx78xx->powered = false;
+}
+
+static int anx78xx_start(struct anx78xx *anx78xx)
+{
+       int err;
+
+       /* Power on all modules */
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
+                                SP_POWERDOWN_CTRL_REG,
+                                SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD |
+                                SP_LINK_PD);
+
+       err = anx78xx_enable_interrupts(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to enable interrupts: %d\n", err);
+               goto err_poweroff;
+       }
+
+       err = anx78xx_rx_initialization(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed receiver initialization: %d\n", err);
+               goto err_poweroff;
+       }
+
+       err = anx78xx_tx_initialization(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed transmitter initialization: %d\n", err);
+               goto err_poweroff;
+       }
+
+       /*
+        * This delay seems to help keep the hardware in a good state. Without
+        * it, there are times where it fails silently.
+        */
+       usleep_range(10000, 15000);
+
+       return 0;
+
+err_poweroff:
+       DRM_ERROR("Failed SlimPort transmitter initialization: %d\n", err);
+       anx78xx_poweroff(anx78xx);
+
+       return err;
+}
+
+static int anx78xx_init_pdata(struct anx78xx *anx78xx)
+{
+       struct anx78xx_platform_data *pdata = &anx78xx->pdata;
+       struct device *dev = &anx78xx->client->dev;
+
+       /* 1.0V digital core power regulator  */
+       pdata->dvdd10 = devm_regulator_get(dev, "dvdd10");
+       if (IS_ERR(pdata->dvdd10)) {
+               DRM_ERROR("DVDD10 regulator not found\n");
+               return PTR_ERR(pdata->dvdd10);
+       }
+
+       /* GPIO for HPD */
+       pdata->gpiod_hpd = devm_gpiod_get(dev, "hpd", GPIOD_IN);
+       if (IS_ERR(pdata->gpiod_hpd))
+               return PTR_ERR(pdata->gpiod_hpd);
+
+       /* GPIO for chip power down */
+       pdata->gpiod_pd = devm_gpiod_get(dev, "pd", GPIOD_OUT_HIGH);
+       if (IS_ERR(pdata->gpiod_pd))
+               return PTR_ERR(pdata->gpiod_pd);
+
+       /* GPIO for chip reset */
+       pdata->gpiod_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+
+       return PTR_ERR_OR_ZERO(pdata->gpiod_reset);
+}
+
+static int anx78xx_dp_link_training(struct anx78xx *anx78xx)
+{
+       u8 dp_bw, value;
+       int err;
+
+       err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_HDMI_MUTE_CTRL_REG,
+                          0x0);
+       if (err)
+               return err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
+                                SP_POWERDOWN_CTRL_REG,
+                                SP_TOTAL_PD);
+       if (err)
+               return err;
+
+       err = drm_dp_dpcd_readb(&anx78xx->aux, DP_MAX_LINK_RATE, &dp_bw);
+       if (err < 0)
+               return err;
+
+       switch (dp_bw) {
+       case DP_LINK_BW_1_62:
+       case DP_LINK_BW_2_7:
+       case DP_LINK_BW_5_4:
+               break;
+
+       default:
+               DRM_DEBUG_KMS("DP bandwidth (%#02x) not supported\n", dp_bw);
+               return -EINVAL;
+       }
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
+                              SP_VIDEO_MUTE);
+       if (err)
+               return err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2],
+                                SP_VID_CTRL1_REG, SP_VIDEO_EN);
+       if (err)
+               return err;
+
+       /* Get DPCD info */
+       err = drm_dp_dpcd_read(&anx78xx->aux, DP_DPCD_REV,
+                              &anx78xx->dpcd, DP_RECEIVER_CAP_SIZE);
+       if (err < 0) {
+               DRM_ERROR("Failed to read DPCD: %d\n", err);
+               return err;
+       }
+
+       /* Clear channel x SERDES power down */
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_DP_ANALOG_POWER_DOWN_REG, SP_CH0_PD);
+       if (err)
+               return err;
+
+       /* Check link capabilities */
+       err = drm_dp_link_probe(&anx78xx->aux, &anx78xx->link);
+       if (err < 0) {
+               DRM_ERROR("Failed to probe link capabilities: %d\n", err);
+               return err;
+       }
+
+       /* Power up the sink */
+       err = drm_dp_link_power_up(&anx78xx->aux, &anx78xx->link);
+       if (err < 0) {
+               DRM_ERROR("Failed to power up DisplayPort link: %d\n", err);
+               return err;
+       }
+
+       /* Possibly enable downspread on the sink */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_DP_DOWNSPREAD_CTRL1_REG, 0);
+       if (err)
+               return err;
+
+       if (anx78xx->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5) {
+               DRM_DEBUG("Enable downspread on the sink\n");
+               /* 4000PPM */
+               err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                                  SP_DP_DOWNSPREAD_CTRL1_REG, 8);
+               if (err)
+                       return err;
+
+               err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL,
+                                        DP_SPREAD_AMP_0_5);
+               if (err < 0)
+                       return err;
+       } else {
+               err = drm_dp_dpcd_writeb(&anx78xx->aux, DP_DOWNSPREAD_CTRL, 0);
+               if (err < 0)
+                       return err;
+       }
+
+       /* Set the lane count and the link rate on the sink */
+       if (drm_dp_enhanced_frame_cap(anx78xx->dpcd))
+               err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                      SP_DP_SYSTEM_CTRL_BASE + 4,
+                                      SP_ENHANCED_MODE);
+       else
+               err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                        SP_DP_SYSTEM_CTRL_BASE + 4,
+                                        SP_ENHANCED_MODE);
+       if (err)
+               return err;
+
+       value = drm_dp_link_rate_to_bw_code(anx78xx->link.rate);
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0],
+                          SP_DP_MAIN_LINK_BW_SET_REG, value);
+       if (err)
+               return err;
+
+       err = drm_dp_link_configure(&anx78xx->aux, &anx78xx->link);
+       if (err < 0) {
+               DRM_ERROR("Failed to configure DisplayPort link: %d\n", err);
+               return err;
+       }
+
+       /* Start training on the source */
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P0], SP_DP_LT_CTRL_REG,
+                          SP_LT_EN);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_config_dp_output(struct anx78xx *anx78xx)
+{
+       int err;
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
+                                SP_VIDEO_MUTE);
+       if (err)
+               return err;
+
+       /* Enable DP output */
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_VID_CTRL1_REG,
+                              SP_VIDEO_EN);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_send_video_infoframe(struct anx78xx *anx78xx,
+                                       struct hdmi_avi_infoframe *frame)
+{
+       u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
+       int err;
+
+       err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
+       if (err < 0) {
+               DRM_ERROR("Failed to pack AVI infoframe: %d\n", err);
+               return err;
+       }
+
+       err = anx78xx_clear_bits(anx78xx->map[I2C_IDX_TX_P0],
+                                SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_EN);
+       if (err)
+               return err;
+
+       err = regmap_bulk_write(anx78xx->map[I2C_IDX_TX_P2],
+                               SP_INFOFRAME_AVI_DB1_REG, buffer,
+                               frame->length);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_UD);
+       if (err)
+               return err;
+
+       err = anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P0],
+                              SP_PACKET_SEND_CTRL_REG, SP_AVI_IF_EN);
+       if (err)
+               return err;
+
+       return 0;
+}
+
+static int anx78xx_get_downstream_info(struct anx78xx *anx78xx)
+{
+       u8 value;
+       int err;
+
+       err = drm_dp_dpcd_readb(&anx78xx->aux, DP_SINK_COUNT, &value);
+       if (err < 0) {
+               DRM_ERROR("Get sink count failed %d\n", err);
+               return err;
+       }
+
+       if (!DP_GET_SINK_COUNT(value)) {
+               DRM_ERROR("Downstream disconnected\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+static int anx78xx_get_modes(struct drm_connector *connector)
+{
+       struct anx78xx *anx78xx = connector_to_anx78xx(connector);
+       int err, num_modes = 0;
+
+       if (WARN_ON(!anx78xx->powered))
+               return 0;
+
+       if (anx78xx->edid)
+               return drm_add_edid_modes(connector, anx78xx->edid);
+
+       mutex_lock(&anx78xx->lock);
+
+       err = anx78xx_get_downstream_info(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to get downstream info: %d\n", err);
+               goto unlock;
+       }
+
+       anx78xx->edid = drm_get_edid(connector, &anx78xx->aux.ddc);
+       if (!anx78xx->edid) {
+               DRM_ERROR("Failed to read EDID\n");
+               goto unlock;
+       }
+
+       err = drm_mode_connector_update_edid_property(connector,
+                                                     anx78xx->edid);
+       if (err) {
+               DRM_ERROR("Failed to update EDID property: %d\n", err);
+               goto unlock;
+       }
+
+       num_modes = drm_add_edid_modes(connector, anx78xx->edid);
+       /* Store the ELD */
+       drm_edid_to_eld(connector, anx78xx->edid);
+
+unlock:
+       mutex_unlock(&anx78xx->lock);
+
+       return num_modes;
+}
+
+static struct drm_encoder *anx78xx_best_encoder(struct drm_connector *connector)
+{
+       struct anx78xx *anx78xx = connector_to_anx78xx(connector);
+
+       return anx78xx->bridge.encoder;
+}
+
+static const struct drm_connector_helper_funcs anx78xx_connector_helper_funcs = {
+       .get_modes = anx78xx_get_modes,
+       .best_encoder = anx78xx_best_encoder,
+};
+
+static enum drm_connector_status anx78xx_detect(struct drm_connector *connector,
+                                               bool force)
+{
+       struct anx78xx *anx78xx = connector_to_anx78xx(connector);
+
+       if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd))
+               return connector_status_disconnected;
+
+       return connector_status_connected;
+}
+
+static void anx78xx_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_cleanup(connector);
+}
+
+static const struct drm_connector_funcs anx78xx_connector_funcs = {
+       .dpms = drm_atomic_helper_connector_dpms,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .detect = anx78xx_detect,
+       .destroy = anx78xx_connector_destroy,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static int anx78xx_bridge_attach(struct drm_bridge *bridge)
+{
+       struct anx78xx *anx78xx = bridge_to_anx78xx(bridge);
+       int err;
+
+       if (!bridge->encoder) {
+               DRM_ERROR("Parent encoder object not found");
+               return -ENODEV;
+       }
+
+       /* Register aux channel */
+       anx78xx->aux.name = "DP-AUX";
+       anx78xx->aux.dev = &anx78xx->client->dev;
+       anx78xx->aux.transfer = anx78xx_aux_transfer;
+
+       err = drm_dp_aux_register(&anx78xx->aux);
+       if (err < 0) {
+               DRM_ERROR("Failed to register aux channel: %d\n", err);
+               return err;
+       }
+
+       err = drm_connector_init(bridge->dev, &anx78xx->connector,
+                                &anx78xx_connector_funcs,
+                                DRM_MODE_CONNECTOR_DisplayPort);
+       if (err) {
+               DRM_ERROR("Failed to initialize connector: %d\n", err);
+               return err;
+       }
+
+       drm_connector_helper_add(&anx78xx->connector,
+                                &anx78xx_connector_helper_funcs);
+
+       err = drm_connector_register(&anx78xx->connector);
+       if (err) {
+               DRM_ERROR("Failed to register connector: %d\n", err);
+               return err;
+       }
+
+       anx78xx->connector.polled = DRM_CONNECTOR_POLL_HPD;
+
+       err = drm_mode_connector_attach_encoder(&anx78xx->connector,
+                                               bridge->encoder);
+       if (err) {
+               DRM_ERROR("Failed to link up connector to encoder: %d\n", err);
+               return err;
+       }
+
+       return 0;
+}
+
+static bool anx78xx_bridge_mode_fixup(struct drm_bridge *bridge,
+                                     const struct drm_display_mode *mode,
+                                     struct drm_display_mode *adjusted_mode)
+{
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               return false;
+
+       /* Max 1200p at 5.4 Ghz, one lane */
+       if (mode->clock > 154000)
+               return false;
+
+       return true;
+}
+
+static void anx78xx_bridge_disable(struct drm_bridge *bridge)
+{
+       struct anx78xx *anx78xx = bridge_to_anx78xx(bridge);
+
+       /* Power off all modules except configuration registers access */
+       anx78xx_set_bits(anx78xx->map[I2C_IDX_TX_P2], SP_POWERDOWN_CTRL_REG,
+                        SP_HDCP_PD | SP_AUDIO_PD | SP_VIDEO_PD | SP_LINK_PD);
+}
+
+static void anx78xx_bridge_mode_set(struct drm_bridge *bridge,
+                                   struct drm_display_mode *mode,
+                                   struct drm_display_mode *adjusted_mode)
+{
+       struct anx78xx *anx78xx = bridge_to_anx78xx(bridge);
+       struct hdmi_avi_infoframe frame;
+       int err;
+
+       if (WARN_ON(!anx78xx->powered))
+               return;
+
+       mutex_lock(&anx78xx->lock);
+
+       err = drm_hdmi_avi_infoframe_from_display_mode(&frame, adjusted_mode);
+       if (err) {
+               DRM_ERROR("Failed to setup AVI infoframe: %d\n", err);
+               goto unlock;
+       }
+
+       err = anx78xx_send_video_infoframe(anx78xx, &frame);
+       if (err)
+               DRM_ERROR("Failed to send AVI infoframe: %d\n", err);
+
+unlock:
+       mutex_unlock(&anx78xx->lock);
+}
+
+static void anx78xx_bridge_enable(struct drm_bridge *bridge)
+{
+       struct anx78xx *anx78xx = bridge_to_anx78xx(bridge);
+       int err;
+
+       err = anx78xx_start(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to initialize: %d\n", err);
+               return;
+       }
+
+       err = anx78xx_set_hpd(anx78xx);
+       if (err)
+               DRM_ERROR("Failed to set HPD: %d\n", err);
+}
+
+static const struct drm_bridge_funcs anx78xx_bridge_funcs = {
+       .attach = anx78xx_bridge_attach,
+       .mode_fixup = anx78xx_bridge_mode_fixup,
+       .disable = anx78xx_bridge_disable,
+       .mode_set = anx78xx_bridge_mode_set,
+       .enable = anx78xx_bridge_enable,
+};
+
+static irqreturn_t anx78xx_hpd_threaded_handler(int irq, void *data)
+{
+       struct anx78xx *anx78xx = data;
+       int err;
+
+       if (anx78xx->powered)
+               return IRQ_HANDLED;
+
+       mutex_lock(&anx78xx->lock);
+
+       /* Cable is pulled, power on the chip */
+       anx78xx_poweron(anx78xx);
+
+       err = anx78xx_enable_interrupts(anx78xx);
+       if (err)
+               DRM_ERROR("Failed to enable interrupts: %d\n", err);
+
+       mutex_unlock(&anx78xx->lock);
+
+       return IRQ_HANDLED;
+}
+
+static int anx78xx_handle_dp_int_1(struct anx78xx *anx78xx, u8 irq)
+{
+       int err;
+
+       DRM_DEBUG_KMS("Handle DP interrupt 1: %02x\n", irq);
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG,
+                          irq);
+       if (err)
+               return err;
+
+       if (irq & SP_TRAINING_FINISH) {
+               DRM_DEBUG_KMS("IRQ: hardware link training finished\n");
+               err = anx78xx_config_dp_output(anx78xx);
+       }
+
+       return err;
+}
+
+static bool anx78xx_handle_common_int_4(struct anx78xx *anx78xx, u8 irq)
+{
+       bool event = false;
+       int err;
+
+       DRM_DEBUG_KMS("Handle common interrupt 4: %02x\n", irq);
+
+       err = regmap_write(anx78xx->map[I2C_IDX_TX_P2],
+                          SP_COMMON_INT_STATUS4_REG, irq);
+       if (err) {
+               DRM_ERROR("Failed to write SP_COMMON_INT_STATUS4 %d\n", err);
+               return event;
+       }
+
+       if (irq & SP_HPD_LOST) {
+               DRM_DEBUG_KMS("IRQ: Hot plug detect - cable is pulled out\n");
+               event = true;
+               anx78xx_poweroff(anx78xx);
+               /* Free cached EDID */
+               kfree(anx78xx->edid);
+               anx78xx->edid = NULL;
+       } else if (irq & SP_HPD_PLUG) {
+               DRM_DEBUG_KMS("IRQ: Hot plug detect - cable plug\n");
+               event = true;
+       }
+
+       return event;
+}
+
+static void anx78xx_handle_hdmi_int_1(struct anx78xx *anx78xx, u8 irq)
+{
+       unsigned int value;
+       int err;
+
+       DRM_DEBUG_KMS("Handle HDMI interrupt 1: %02x\n", irq);
+
+       err = regmap_write(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG,
+                          irq);
+       if (err) {
+               DRM_ERROR("Write HDMI int 1 failed: %d\n", err);
+               return;
+       }
+
+       if ((irq & SP_CKDT_CHG) || (irq & SP_SCDT_CHG)) {
+               DRM_DEBUG_KMS("IRQ: HDMI input detected\n");
+
+               err = regmap_read(anx78xx->map[I2C_IDX_RX_P0],
+                                 SP_SYSTEM_STATUS_REG, &value);
+               if (err) {
+                       DRM_ERROR("Read system status reg failed: %d\n", err);
+                       return;
+               }
+
+               if (!(value & SP_TMDS_CLOCK_DET)) {
+                       DRM_DEBUG_KMS("IRQ: *** Waiting for HDMI clock ***\n");
+                       return;
+               }
+
+               if (!(value & SP_TMDS_DE_DET)) {
+                       DRM_DEBUG_KMS("IRQ: *** Waiting for HDMI signal ***\n");
+                       return;
+               }
+
+               err = anx78xx_dp_link_training(anx78xx);
+               if (err)
+                       DRM_ERROR("Failed to start link training: %d\n", err);
+       }
+}
+
+static irqreturn_t anx78xx_intp_threaded_handler(int unused, void *data)
+{
+       struct anx78xx *anx78xx = data;
+       bool event = false;
+       unsigned int irq;
+       int err;
+
+       mutex_lock(&anx78xx->lock);
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DP_INT_STATUS1_REG,
+                         &irq);
+       if (err) {
+               DRM_ERROR("Failed to read DP interrupt 1 status: %d\n", err);
+               goto unlock;
+       }
+
+       if (irq)
+               anx78xx_handle_dp_int_1(anx78xx, irq);
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P2],
+                         SP_COMMON_INT_STATUS4_REG, &irq);
+       if (err) {
+               DRM_ERROR("Failed to read common interrupt 4 status: %d\n",
+                         err);
+               goto unlock;
+       }
+
+       if (irq)
+               event = anx78xx_handle_common_int_4(anx78xx, irq);
+
+       /* Make sure we are still powered after handle HPD events */
+       if (!anx78xx->powered)
+               goto unlock;
+
+       err = regmap_read(anx78xx->map[I2C_IDX_RX_P0], SP_INT_STATUS1_REG,
+                         &irq);
+       if (err) {
+               DRM_ERROR("Failed to read HDMI int 1 status: %d\n", err);
+               goto unlock;
+       }
+
+       if (irq)
+               anx78xx_handle_hdmi_int_1(anx78xx, irq);
+
+unlock:
+       mutex_unlock(&anx78xx->lock);
+
+       if (event)
+               drm_helper_hpd_irq_event(anx78xx->connector.dev);
+
+       return IRQ_HANDLED;
+}
+
+static void unregister_i2c_dummy_clients(struct anx78xx *anx78xx)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(anx78xx->i2c_dummy); i++)
+               if (anx78xx->i2c_dummy[i])
+                       i2c_unregister_device(anx78xx->i2c_dummy[i]);
+}
+
+static const struct regmap_config anx78xx_regmap_config = {
+       .reg_bits = 8,
+       .val_bits = 8,
+};
+
+static const u16 anx78xx_chipid_list[] = {
+       0x7812,
+       0x7814,
+       0x7818,
+};
+
+static int anx78xx_i2c_probe(struct i2c_client *client,
+                            const struct i2c_device_id *id)
+{
+       struct anx78xx *anx78xx;
+       struct anx78xx_platform_data *pdata;
+       unsigned int i, idl, idh, version;
+       bool found = false;
+       int err;
+
+       anx78xx = devm_kzalloc(&client->dev, sizeof(*anx78xx), GFP_KERNEL);
+       if (!anx78xx)
+               return -ENOMEM;
+
+       pdata = &anx78xx->pdata;
+
+       mutex_init(&anx78xx->lock);
+
+#if IS_ENABLED(CONFIG_OF)
+       anx78xx->bridge.of_node = client->dev.of_node;
+#endif
+
+       anx78xx->client = client;
+       i2c_set_clientdata(client, anx78xx);
+
+       err = anx78xx_init_pdata(anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to initialize pdata: %d\n", err);
+               return err;
+       }
+
+       pdata->hpd_irq = gpiod_to_irq(pdata->gpiod_hpd);
+       if (pdata->hpd_irq < 0) {
+               DRM_ERROR("Failed to get HPD IRQ: %d\n", pdata->hpd_irq);
+               return -ENODEV;
+       }
+
+       pdata->intp_irq = client->irq;
+       if (!pdata->intp_irq) {
+               DRM_ERROR("Failed to get CABLE_DET and INTP IRQ\n");
+               return -ENODEV;
+       }
+
+       /* Map slave addresses of ANX7814 */
+       for (i = 0; i < I2C_NUM_ADDRESSES; i++) {
+               anx78xx->i2c_dummy[i] = i2c_new_dummy(client->adapter,
+                                               anx78xx_i2c_addresses[i] >> 1);
+               if (!anx78xx->i2c_dummy[i]) {
+                       err = -ENOMEM;
+                       DRM_ERROR("Failed to reserve I2C bus %02x\n",
+                                 anx78xx_i2c_addresses[i]);
+                       goto err_unregister_i2c;
+               }
+
+               anx78xx->map[i] = devm_regmap_init_i2c(anx78xx->i2c_dummy[i],
+                                                      &anx78xx_regmap_config);
+               if (IS_ERR(anx78xx->map[i])) {
+                       err = PTR_ERR(anx78xx->map[i]);
+                       DRM_ERROR("Failed regmap initialization %02x\n",
+                                 anx78xx_i2c_addresses[i]);
+                       goto err_unregister_i2c;
+               }
+       }
+
+       /* Look for supported chip ID */
+       anx78xx_poweron(anx78xx);
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDL_REG,
+                         &idl);
+       if (err)
+               goto err_poweroff;
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_IDH_REG,
+                         &idh);
+       if (err)
+               goto err_poweroff;
+
+       anx78xx->chipid = (u8)idl | ((u8)idh << 8);
+
+       err = regmap_read(anx78xx->map[I2C_IDX_TX_P2], SP_DEVICE_VERSION_REG,
+                         &version);
+       if (err)
+               goto err_poweroff;
+
+       for (i = 0; i < ARRAY_SIZE(anx78xx_chipid_list); i++) {
+               if (anx78xx->chipid == anx78xx_chipid_list[i]) {
+                       DRM_INFO("Found ANX%x (ver. %d) SlimPort Transmitter\n",
+                                anx78xx->chipid, version);
+                       found = true;
+                       break;
+               }
+       }
+
+       if (!found) {
+               DRM_ERROR("ANX%x (ver. %d) not supported by this driver\n",
+                         anx78xx->chipid, version);
+               err = -ENODEV;
+               goto err_poweroff;
+       }
+
+       err = devm_request_threaded_irq(&client->dev, pdata->hpd_irq, NULL,
+                                       anx78xx_hpd_threaded_handler,
+                                       IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+                                       "anx78xx-hpd", anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to request CABLE_DET threaded IRQ: %d\n",
+                         err);
+               goto err_poweroff;
+       }
+
+       err = devm_request_threaded_irq(&client->dev, pdata->intp_irq, NULL,
+                                       anx78xx_intp_threaded_handler,
+                                       IRQF_TRIGGER_RISING | IRQF_ONESHOT,
+                                       "anx78xx-intp", anx78xx);
+       if (err) {
+               DRM_ERROR("Failed to request INTP threaded IRQ: %d\n", err);
+               goto err_poweroff;
+       }
+
+       anx78xx->bridge.funcs = &anx78xx_bridge_funcs;
+
+       err = drm_bridge_add(&anx78xx->bridge);
+       if (err < 0) {
+               DRM_ERROR("Failed to add drm bridge: %d\n", err);
+               goto err_poweroff;
+       }
+
+       /* If cable is pulled out, just poweroff and wait for HPD event */
+       if (!gpiod_get_value(anx78xx->pdata.gpiod_hpd))
+               anx78xx_poweroff(anx78xx);
+
+       return 0;
+
+err_poweroff:
+       anx78xx_poweroff(anx78xx);
+
+err_unregister_i2c:
+       unregister_i2c_dummy_clients(anx78xx);
+       return err;
+}
+
+static int anx78xx_i2c_remove(struct i2c_client *client)
+{
+       struct anx78xx *anx78xx = i2c_get_clientdata(client);
+
+       drm_bridge_remove(&anx78xx->bridge);
+
+       unregister_i2c_dummy_clients(anx78xx);
+
+       kfree(anx78xx->edid);
+
+       return 0;
+}
+
+static const struct i2c_device_id anx78xx_id[] = {
+       { "anx7814", 0 },
+       { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(i2c, anx78xx_id);
+
+#if IS_ENABLED(CONFIG_OF)
+static const struct of_device_id anx78xx_match_table[] = {
+       { .compatible = "analogix,anx7814", },
+       { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, anx78xx_match_table);
+#endif
+
+static struct i2c_driver anx78xx_driver = {
+       .driver = {
+                  .name = "anx7814",
+                  .of_match_table = of_match_ptr(anx78xx_match_table),
+                 },
+       .probe = anx78xx_i2c_probe,
+       .remove = anx78xx_i2c_remove,
+       .id_table = anx78xx_id,
+};
+module_i2c_driver(anx78xx_driver);
+
+MODULE_DESCRIPTION("ANX78xx SlimPort Transmitter driver");
+MODULE_AUTHOR("Enric Balletbo i Serra <enric.balletbo@collabora.com>");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.h b/drivers/gpu/drm/bridge/analogix-anx78xx.h
new file mode 100644 (file)
index 0000000..38753c8
--- /dev/null
@@ -0,0 +1,719 @@
+/*
+ * Copyright(c) 2016, Analogix Semiconductor. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __ANX78xx_H
+#define __ANX78xx_H
+
+#define TX_P0                          0x70
+#define TX_P1                          0x7a
+#define TX_P2                          0x72
+
+#define RX_P0                          0x7e
+#define RX_P1                          0x80
+
+/***************************************************************/
+/* Register definition of device address 0x7e                  */
+/***************************************************************/
+
+/*
+ * System Control and Status
+ */
+
+/* Software Reset Register 1 */
+#define SP_SOFTWARE_RESET1_REG         0x11
+#define SP_VIDEO_RST                   BIT(4)
+#define SP_HDCP_MAN_RST                        BIT(2)
+#define SP_TMDS_RST                    BIT(1)
+#define SP_SW_MAN_RST                  BIT(0)
+
+/* System Status Register */
+#define SP_SYSTEM_STATUS_REG           0x14
+#define SP_TMDS_CLOCK_DET              BIT(1)
+#define SP_TMDS_DE_DET                 BIT(0)
+
+/* HDMI Status Register */
+#define SP_HDMI_STATUS_REG             0x15
+#define SP_HDMI_AUD_LAYOUT             BIT(3)
+#define SP_HDMI_DET                    BIT(0)
+#  define SP_DVI_MODE                  0
+#  define SP_HDMI_MODE                 1
+
+/* HDMI Mute Control Register */
+#define SP_HDMI_MUTE_CTRL_REG          0x16
+#define SP_AUD_MUTE                    BIT(1)
+#define SP_VID_MUTE                    BIT(0)
+
+/* System Power Down Register 1 */
+#define SP_SYSTEM_POWER_DOWN1_REG      0x18
+#define SP_PWDN_CTRL                   BIT(0)
+
+/*
+ * Audio and Video Auto Control
+ */
+
+/* Auto Audio and Video Control register */
+#define SP_AUDVID_CTRL_REG             0x20
+#define SP_AVC_OE                      BIT(7)
+#define SP_AAC_OE                      BIT(6)
+#define SP_AVC_EN                      BIT(1)
+#define SP_AAC_EN                      BIT(0)
+
+/* Audio Exception Enable Registers */
+#define SP_AUD_EXCEPTION_ENABLE_BASE   (0x24 - 1)
+/* Bits for Audio Exception Enable Register 3 */
+#define SP_AEC_EN21                    BIT(5)
+
+/*
+ * Interrupt
+ */
+
+/* Interrupt Status Register 1 */
+#define SP_INT_STATUS1_REG             0x31
+/* Bits for Interrupt Status Register 1 */
+#define SP_HDMI_DVI                    BIT(7)
+#define SP_CKDT_CHG                    BIT(6)
+#define SP_SCDT_CHG                    BIT(5)
+#define SP_PCLK_CHG                    BIT(4)
+#define SP_PLL_UNLOCK                  BIT(3)
+#define SP_CABLE_PLUG_CHG              BIT(2)
+#define SP_SET_MUTE                    BIT(1)
+#define SP_SW_INTR                     BIT(0)
+/* Bits for Interrupt Status Register 2 */
+#define SP_HDCP_ERR                    BIT(5)
+#define SP_AUDIO_SAMPLE_CHG            BIT(0)  /* undocumented */
+/* Bits for Interrupt Status Register 3 */
+#define SP_AUD_MODE_CHG                        BIT(0)
+/* Bits for Interrupt Status Register 5 */
+#define SP_AUDIO_RCV                   BIT(0)
+/* Bits for Interrupt Status Register 6 */
+#define SP_INT_STATUS6_REG             0x36
+#define SP_CTS_RCV                     BIT(7)
+#define SP_NEW_AUD_PKT                 BIT(4)
+#define SP_NEW_AVI_PKT                 BIT(1)
+#define SP_NEW_CP_PKT                  BIT(0)
+/* Bits for Interrupt Status Register 7 */
+#define SP_NO_VSI                      BIT(7)
+#define SP_NEW_VS                      BIT(4)
+
+/* Interrupt Mask 1 Status Registers */
+#define SP_INT_MASK1_REG               0x41
+
+/* HDMI US TIMER Control Register */
+#define SP_HDMI_US_TIMER_CTRL_REG      0x49
+#define SP_MS_TIMER_MARGIN_10_8_MASK   0x07
+
+/*
+ * TMDS Control
+ */
+
+/* TMDS Control Registers */
+#define SP_TMDS_CTRL_BASE              (0x50 - 1)
+/* Bits for TMDS Control Register 7 */
+#define SP_PD_RT                       BIT(0)
+
+/*
+ * Video Control
+ */
+
+/* Video Status Register */
+#define SP_VIDEO_STATUS_REG            0x70
+#define SP_COLOR_DEPTH_MASK            0xf0
+#define SP_COLOR_DEPTH_SHIFT           4
+#  define SP_COLOR_DEPTH_MODE_LEGACY   0x00
+#  define SP_COLOR_DEPTH_MODE_24BIT    0x04
+#  define SP_COLOR_DEPTH_MODE_30BIT    0x05
+#  define SP_COLOR_DEPTH_MODE_36BIT    0x06
+#  define SP_COLOR_DEPTH_MODE_48BIT    0x07
+
+/* Video Data Range Control Register */
+#define SP_VID_DATA_RANGE_CTRL_REG     0x83
+#define SP_R2Y_INPUT_LIMIT             BIT(1)
+
+/* Pixel Clock High Resolution Counter Registers */
+#define SP_PCLK_HIGHRES_CNT_BASE       (0x8c - 1)
+
+/*
+ * Audio Control
+ */
+
+/* Number of Audio Channels Status Registers */
+#define SP_AUD_CH_STATUS_REG_NUM       6
+
+/* Audio IN S/PDIF Channel Status Registers */
+#define SP_AUD_SPDIF_CH_STATUS_BASE    0xc7
+
+/* Audio IN S/PDIF Channel Status Register 4 */
+#define SP_FS_FREQ_MASK                        0x0f
+#  define SP_FS_FREQ_44100HZ           0x00
+#  define SP_FS_FREQ_48000HZ           0x02
+#  define SP_FS_FREQ_32000HZ           0x03
+#  define SP_FS_FREQ_88200HZ           0x08
+#  define SP_FS_FREQ_96000HZ           0x0a
+#  define SP_FS_FREQ_176400HZ          0x0c
+#  define SP_FS_FREQ_192000HZ          0x0e
+
+/*
+ * Micellaneous Control Block
+ */
+
+/* CHIP Control Register */
+#define SP_CHIP_CTRL_REG               0xe3
+#define SP_MAN_HDMI5V_DET              BIT(3)
+#define SP_PLLLOCK_CKDT_EN             BIT(2)
+#define SP_ANALOG_CKDT_EN              BIT(1)
+#define SP_DIGITAL_CKDT_EN             BIT(0)
+
+/* Packet Receiving Status Register */
+#define SP_PACKET_RECEIVING_STATUS_REG 0xf3
+#define SP_AVI_RCVD                    BIT(5)
+#define SP_VSI_RCVD                    BIT(1)
+
+/***************************************************************/
+/* Register definition of device address 0x80                  */
+/***************************************************************/
+
+/* HDCP BCAPS Shadow Register */
+#define SP_HDCP_BCAPS_SHADOW_REG       0x2a
+#define SP_BCAPS_REPEATER              BIT(5)
+
+/* HDCP Status Register */
+#define SP_RX_HDCP_STATUS_REG          0x3f
+#define SP_AUTH_EN                     BIT(4)
+
+/*
+ * InfoFrame and Control Packet Registers
+ */
+
+/* AVI InfoFrame packet checksum */
+#define SP_AVI_INFOFRAME_CHECKSUM      0xa3
+
+/* AVI InfoFrame Registers */
+#define SP_AVI_INFOFRAME_DATA_BASE     0xa4
+
+#define SP_AVI_COLOR_F_MASK            0x60
+#define SP_AVI_COLOR_F_SHIFT           5
+
+/* Audio InfoFrame Registers */
+#define SP_AUD_INFOFRAME_DATA_BASE     0xc4
+#define SP_AUD_INFOFRAME_LAYOUT_MASK   0x0f
+
+/* MPEG/HDMI Vendor Specific InfoFrame Packet type code */
+#define SP_MPEG_VS_INFOFRAME_TYPE_REG  0xe0
+
+/* MPEG/HDMI Vendor Specific InfoFrame Packet length */
+#define SP_MPEG_VS_INFOFRAME_LEN_REG   0xe2
+
+/* MPEG/HDMI Vendor Specific InfoFrame Packet version number */
+#define SP_MPEG_VS_INFOFRAME_VER_REG   0xe1
+
+/* MPEG/HDMI Vendor Specific InfoFrame Packet content */
+#define SP_MPEG_VS_INFOFRAME_DATA_BASE 0xe4
+
+/* General Control Packet Register */
+#define SP_GENERAL_CTRL_PACKET_REG     0x9f
+#define SP_CLEAR_AVMUTE                        BIT(4)
+#define SP_SET_AVMUTE                  BIT(0)
+
+/***************************************************************/
+/* Register definition of device address 0x70                  */
+/***************************************************************/
+
+/* HDCP Status Register */
+#define SP_TX_HDCP_STATUS_REG          0x00
+#define SP_AUTH_FAIL                   BIT(5)
+#define SP_AUTHEN_PASS                 BIT(1)
+
+/* HDCP Control Register 0 */
+#define SP_HDCP_CTRL0_REG              0x01
+#define SP_RX_REPEATER                 BIT(6)
+#define SP_RE_AUTH                     BIT(5)
+#define SP_SW_AUTH_OK                  BIT(4)
+#define SP_HARD_AUTH_EN                        BIT(3)
+#define SP_HDCP_ENC_EN                 BIT(2)
+#define SP_BKSV_SRM_PASS               BIT(1)
+#define SP_KSVLIST_VLD                 BIT(0)
+/* HDCP Function Enabled */
+#define SP_HDCP_FUNCTION_ENABLED       (BIT(0) | BIT(1) | BIT(2) | BIT(3))
+
+/* HDCP Receiver BSTATUS Register 0 */
+#define        SP_HDCP_RX_BSTATUS0_REG         0x1b
+/* HDCP Receiver BSTATUS Register 1 */
+#define        SP_HDCP_RX_BSTATUS1_REG         0x1c
+
+/* HDCP Embedded "Blue Screen" Content Registers */
+#define SP_HDCP_VID0_BLUE_SCREEN_REG   0x2c
+#define SP_HDCP_VID1_BLUE_SCREEN_REG   0x2d
+#define SP_HDCP_VID2_BLUE_SCREEN_REG   0x2e
+
+/* HDCP Wait R0 Timing Register */
+#define SP_HDCP_WAIT_R0_TIME_REG       0x40
+
+/* HDCP Link Integrity Check Timer Register */
+#define SP_HDCP_LINK_CHECK_TIMER_REG   0x41
+
+/* HDCP Repeater Ready Wait Timer Register */
+#define SP_HDCP_RPTR_RDY_WAIT_TIME_REG 0x42
+
+/* HDCP Auto Timer Register */
+#define SP_HDCP_AUTO_TIMER_REG         0x51
+
+/* HDCP Key Status Register */
+#define SP_HDCP_KEY_STATUS_REG         0x5e
+
+/* HDCP Key Command Register */
+#define SP_HDCP_KEY_COMMAND_REG                0x5f
+#define SP_DISABLE_SYNC_HDCP           BIT(2)
+
+/* OTP Memory Key Protection Registers */
+#define SP_OTP_KEY_PROTECT1_REG                0x60
+#define SP_OTP_KEY_PROTECT2_REG                0x61
+#define SP_OTP_KEY_PROTECT3_REG                0x62
+#define SP_OTP_PSW1                    0xa2
+#define SP_OTP_PSW2                    0x7e
+#define SP_OTP_PSW3                    0xc6
+
+/* DP System Control Registers */
+#define SP_DP_SYSTEM_CTRL_BASE         (0x80 - 1)
+/* Bits for DP System Control Register 2 */
+#define SP_CHA_STA                     BIT(2)
+/* Bits for DP System Control Register 3 */
+#define SP_HPD_STATUS                  BIT(6)
+#define SP_STRM_VALID                  BIT(2)
+/* Bits for DP System Control Register 4 */
+#define SP_ENHANCED_MODE               BIT(3)
+
+/* DP Video Control Register */
+#define SP_DP_VIDEO_CTRL_REG           0x84
+#define SP_COLOR_F_MASK                        0x06
+#define SP_COLOR_F_SHIFT               1
+#define SP_BPC_MASK                    0xe0
+#define SP_BPC_SHIFT                   5
+#  define SP_BPC_6BITS                 0x00
+#  define SP_BPC_8BITS                 0x01
+#  define SP_BPC_10BITS                        0x02
+#  define SP_BPC_12BITS                        0x03
+
+/* DP Audio Control Register */
+#define SP_DP_AUDIO_CTRL_REG           0x87
+#define SP_AUD_EN                      BIT(0)
+
+/* 10us Pulse Generate Timer Registers */
+#define SP_I2C_GEN_10US_TIMER0_REG     0x88
+#define SP_I2C_GEN_10US_TIMER1_REG     0x89
+
+/* Packet Send Control Register */
+#define SP_PACKET_SEND_CTRL_REG                0x90
+#define SP_AUD_IF_UP                   BIT(7)
+#define SP_AVI_IF_UD                   BIT(6)
+#define SP_MPEG_IF_UD                  BIT(5)
+#define SP_SPD_IF_UD                   BIT(4)
+#define SP_AUD_IF_EN                   BIT(3)
+#define SP_AVI_IF_EN                   BIT(2)
+#define SP_MPEG_IF_EN                  BIT(1)
+#define SP_SPD_IF_EN                   BIT(0)
+
+/* DP HDCP Control Register */
+#define SP_DP_HDCP_CTRL_REG            0x92
+#define SP_AUTO_EN                     BIT(7)
+#define SP_AUTO_START                  BIT(5)
+#define SP_LINK_POLLING                        BIT(1)
+
+/* DP Main Link Bandwidth Setting Register */
+#define SP_DP_MAIN_LINK_BW_SET_REG     0xa0
+#define SP_LINK_BW_SET_MASK            0x1f
+#define SP_INITIAL_SLIM_M_AUD_SEL      BIT(5)
+
+/* DP Training Pattern Set Register */
+#define SP_DP_TRAINING_PATTERN_SET_REG 0xa2
+
+/* DP Lane 0 Link Training Control Register */
+#define SP_DP_LANE0_LT_CTRL_REG                0xa3
+#define SP_TX_SW_SET_MASK              0x1b
+#define SP_MAX_PRE_REACH               BIT(5)
+#define SP_MAX_DRIVE_REACH             BIT(4)
+#define SP_PRE_EMP_LEVEL1              BIT(3)
+#define SP_DRVIE_CURRENT_LEVEL1                BIT(0)
+
+/* DP Link Training Control Register */
+#define SP_DP_LT_CTRL_REG              0xa8
+#define SP_LT_ERROR_TYPE_MASK          0x70
+#  define SP_LT_NO_ERROR               0x00
+#  define SP_LT_AUX_WRITE_ERROR                0x01
+#  define SP_LT_MAX_DRIVE_REACHED      0x02
+#  define SP_LT_WRONG_LANE_COUNT_SET   0x03
+#  define SP_LT_LOOP_SAME_5_TIME       0x04
+#  define SP_LT_CR_FAIL_IN_EQ          0x05
+#  define SP_LT_EQ_LOOP_5_TIME         0x06
+#define SP_LT_EN                       BIT(0)
+
+/* DP CEP Training Control Registers */
+#define SP_DP_CEP_TRAINING_CTRL0_REG   0xa9
+#define SP_DP_CEP_TRAINING_CTRL1_REG   0xaa
+
+/* DP Debug Register 1 */
+#define SP_DP_DEBUG1_REG               0xb0
+#define SP_DEBUG_PLL_LOCK              BIT(4)
+#define SP_POLLING_EN                  BIT(1)
+
+/* DP Polling Control Register */
+#define SP_DP_POLLING_CTRL_REG         0xb4
+#define SP_AUTO_POLLING_DISABLE                BIT(0)
+
+/* DP Link Debug Control Register */
+#define SP_DP_LINK_DEBUG_CTRL_REG      0xb8
+#define SP_M_VID_DEBUG                 BIT(5)
+#define SP_NEW_PRBS7                   BIT(4)
+#define SP_INSERT_ER                   BIT(1)
+#define SP_PRBS31_EN                   BIT(0)
+
+/* AUX Misc control Register */
+#define SP_AUX_MISC_CTRL_REG           0xbf
+
+/* DP PLL control Register */
+#define SP_DP_PLL_CTRL_REG             0xc7
+#define SP_PLL_RST                     BIT(6)
+
+/* DP Analog Power Down Register */
+#define SP_DP_ANALOG_POWER_DOWN_REG    0xc8
+#define SP_CH0_PD                      BIT(0)
+
+/* DP Misc Control Register */
+#define SP_DP_MISC_CTRL_REG            0xcd
+#define SP_EQ_TRAINING_LOOP            BIT(6)
+
+/* DP Extra I2C Device Address Register */
+#define SP_DP_EXTRA_I2C_DEV_ADDR_REG   0xce
+#define SP_I2C_STRETCH_DISABLE         BIT(7)
+
+#define SP_I2C_EXTRA_ADDR              0x50
+
+/* DP Downspread Control Register 1 */
+#define SP_DP_DOWNSPREAD_CTRL1_REG     0xd0
+
+/* DP M Value Calculation Control Register */
+#define SP_DP_M_CALCULATION_CTRL_REG   0xd9
+#define SP_M_GEN_CLK_SEL               BIT(0)
+
+/* AUX Channel Access Status Register */
+#define SP_AUX_CH_STATUS_REG           0xe0
+#define SP_AUX_STATUS                  0x0f
+
+/* AUX Channel DEFER Control Register */
+#define SP_AUX_DEFER_CTRL_REG          0xe2
+#define SP_DEFER_CTRL_EN               BIT(7)
+
+/* DP Buffer Data Count Register */
+#define SP_BUF_DATA_COUNT_REG          0xe4
+#define SP_BUF_DATA_COUNT_MASK         0x1f
+#define SP_BUF_CLR                     BIT(7)
+
+/* DP AUX Channel Control Register 1 */
+#define SP_DP_AUX_CH_CTRL1_REG         0xe5
+#define SP_AUX_TX_COMM_MASK            0x0f
+#define SP_AUX_LENGTH_MASK             0xf0
+#define SP_AUX_LENGTH_SHIFT            4
+
+/* DP AUX CH Address Register 0 */
+#define SP_AUX_ADDR_7_0_REG            0xe6
+
+/* DP AUX CH Address Register 1 */
+#define SP_AUX_ADDR_15_8_REG           0xe7
+
+/* DP AUX CH Address Register 2 */
+#define SP_AUX_ADDR_19_16_REG          0xe8
+#define SP_AUX_ADDR_19_16_MASK         0x0f
+
+/* DP AUX Channel Control Register 2 */
+#define SP_DP_AUX_CH_CTRL2_REG         0xe9
+#define SP_AUX_SEL_RXCM                        BIT(6)
+#define SP_AUX_CHSEL                   BIT(3)
+#define SP_AUX_PN_INV                  BIT(2)
+#define SP_ADDR_ONLY                   BIT(1)
+#define SP_AUX_EN                      BIT(0)
+
+/* DP Video Stream Control InfoFrame Register */
+#define SP_DP_3D_VSC_CTRL_REG          0xea
+#define SP_INFO_FRAME_VSC_EN           BIT(0)
+
+/* DP Video Stream Data Byte 1 Register */
+#define SP_DP_VSC_DB1_REG              0xeb
+
+/* DP AUX Channel Control Register 3 */
+#define SP_DP_AUX_CH_CTRL3_REG         0xec
+#define SP_WAIT_COUNTER_7_0_MASK       0xff
+
+/* DP AUX Channel Control Register 4 */
+#define SP_DP_AUX_CH_CTRL4_REG         0xed
+
+/* DP AUX Buffer Data Registers */
+#define SP_DP_BUF_DATA0_REG            0xf0
+
+/***************************************************************/
+/* Register definition of device address 0x72                  */
+/***************************************************************/
+
+/*
+ * Core Register Definitions
+ */
+
+/* Device ID Low Byte Register */
+#define SP_DEVICE_IDL_REG              0x02
+
+/* Device ID High Byte Register */
+#define SP_DEVICE_IDH_REG              0x03
+
+/* Device version register */
+#define SP_DEVICE_VERSION_REG          0x04
+
+/* Power Down Control Register */
+#define SP_POWERDOWN_CTRL_REG          0x05
+#define SP_REGISTER_PD                 BIT(7)
+#define SP_HDCP_PD                     BIT(5)
+#define SP_AUDIO_PD                    BIT(4)
+#define SP_VIDEO_PD                    BIT(3)
+#define SP_LINK_PD                     BIT(2)
+#define SP_TOTAL_PD                    BIT(1)
+
+/* Reset Control Register 1 */
+#define SP_RESET_CTRL1_REG             0x06
+#define SP_MISC_RST                    BIT(7)
+#define SP_VIDCAP_RST                  BIT(6)
+#define SP_VIDFIF_RST                  BIT(5)
+#define SP_AUDFIF_RST                  BIT(4)
+#define SP_AUDCAP_RST                  BIT(3)
+#define SP_HDCP_RST                    BIT(2)
+#define SP_SW_RST                      BIT(1)
+#define SP_HW_RST                      BIT(0)
+
+/* Reset Control Register 2 */
+#define SP_RESET_CTRL2_REG             0x07
+#define SP_AUX_RST                     BIT(2)
+#define SP_SERDES_FIFO_RST             BIT(1)
+#define SP_I2C_REG_RST                 BIT(0)
+
+/* Video Control Register 1 */
+#define SP_VID_CTRL1_REG               0x08
+#define SP_VIDEO_EN                    BIT(7)
+#define SP_VIDEO_MUTE                  BIT(2)
+#define SP_DE_GEN                      BIT(1)
+#define SP_DEMUX                       BIT(0)
+
+/* Video Control Register 2 */
+#define SP_VID_CTRL2_REG               0x09
+#define SP_IN_COLOR_F_MASK             0x03
+#define SP_IN_YC_BIT_SEL               BIT(2)
+#define SP_IN_BPC_MASK                 0x70
+#define SP_IN_BPC_SHIFT                        4
+#  define SP_IN_BPC_12BIT              0x03
+#  define SP_IN_BPC_10BIT              0x02
+#  define SP_IN_BPC_8BIT               0x01
+#  define SP_IN_BPC_6BIT               0x00
+#define SP_IN_D_RANGE                  BIT(7)
+
+/* Video Control Register 3 */
+#define SP_VID_CTRL3_REG               0x0a
+#define SP_HPD_OUT                     BIT(6)
+
+/* Video Control Register 5 */
+#define SP_VID_CTRL5_REG               0x0c
+#define SP_CSC_STD_SEL                 BIT(7)
+#define SP_XVYCC_RNG_LMT               BIT(6)
+#define SP_RANGE_Y2R                   BIT(5)
+#define SP_CSPACE_Y2R                  BIT(4)
+#define SP_RGB_RNG_LMT                 BIT(3)
+#define SP_Y_RNG_LMT                   BIT(2)
+#define SP_RANGE_R2Y                   BIT(1)
+#define SP_CSPACE_R2Y                  BIT(0)
+
+/* Video Control Register 6 */
+#define SP_VID_CTRL6_REG               0x0d
+#define SP_TEST_PATTERN_EN             BIT(7)
+#define SP_VIDEO_PROCESS_EN            BIT(6)
+#define SP_VID_US_MODE                 BIT(3)
+#define SP_VID_DS_MODE                 BIT(2)
+#define SP_UP_SAMPLE                   BIT(1)
+#define SP_DOWN_SAMPLE                 BIT(0)
+
+/* Video Control Register 8 */
+#define SP_VID_CTRL8_REG               0x0f
+#define SP_VID_VRES_TH                 BIT(0)
+
+/* Total Line Status Low Byte Register */
+#define SP_TOTAL_LINE_STAL_REG         0x24
+
+/* Total Line Status High Byte Register */
+#define SP_TOTAL_LINE_STAH_REG         0x25
+
+/* Active Line Status Low Byte Register */
+#define SP_ACT_LINE_STAL_REG           0x26
+
+/* Active Line Status High Byte Register */
+#define SP_ACT_LINE_STAH_REG           0x27
+
+/* Vertical Front Porch Status Register */
+#define SP_V_F_PORCH_STA_REG           0x28
+
+/* Vertical SYNC Width Status Register */
+#define SP_V_SYNC_STA_REG              0x29
+
+/* Vertical Back Porch Status Register */
+#define SP_V_B_PORCH_STA_REG           0x2a
+
+/* Total Pixel Status Low Byte Register */
+#define SP_TOTAL_PIXEL_STAL_REG                0x2b
+
+/* Total Pixel Status High Byte Register */
+#define SP_TOTAL_PIXEL_STAH_REG                0x2c
+
+/* Active Pixel Status Low Byte Register */
+#define SP_ACT_PIXEL_STAL_REG          0x2d
+
+/* Active Pixel Status High Byte Register */
+#define SP_ACT_PIXEL_STAH_REG          0x2e
+
+/* Horizontal Front Porch Status Low Byte Register */
+#define SP_H_F_PORCH_STAL_REG          0x2f
+
+/* Horizontal Front Porch Statys High Byte Register */
+#define SP_H_F_PORCH_STAH_REG          0x30
+
+/* Horizontal SYNC Width Status Low Byte Register */
+#define SP_H_SYNC_STAL_REG             0x31
+
+/* Horizontal SYNC Width Status High Byte Register */
+#define SP_H_SYNC_STAH_REG             0x32
+
+/* Horizontal Back Porch Status Low Byte Register */
+#define SP_H_B_PORCH_STAL_REG          0x33
+
+/* Horizontal Back Porch Status High Byte Register */
+#define SP_H_B_PORCH_STAH_REG          0x34
+
+/* InfoFrame AVI Packet DB1 Register */
+#define SP_INFOFRAME_AVI_DB1_REG       0x70
+
+/* Bit Control Specific Register */
+#define SP_BIT_CTRL_SPECIFIC_REG       0x80
+#define SP_BIT_CTRL_SELECT_SHIFT       1
+#define SP_ENABLE_BIT_CTRL             BIT(0)
+
+/* InfoFrame Audio Packet DB1 Register */
+#define SP_INFOFRAME_AUD_DB1_REG       0x83
+
+/* InfoFrame MPEG Packet DB1 Register */
+#define SP_INFOFRAME_MPEG_DB1_REG      0xb0
+
+/* Audio Channel Status Registers */
+#define SP_AUD_CH_STATUS_BASE          0xd0
+
+/* Audio Channel Num Register 5 */
+#define SP_I2S_CHANNEL_NUM_MASK                0xe0
+#  define SP_I2S_CH_NUM_1              (0x00 << 5)
+#  define SP_I2S_CH_NUM_2              (0x01 << 5)
+#  define SP_I2S_CH_NUM_3              (0x02 << 5)
+#  define SP_I2S_CH_NUM_4              (0x03 << 5)
+#  define SP_I2S_CH_NUM_5              (0x04 << 5)
+#  define SP_I2S_CH_NUM_6              (0x05 << 5)
+#  define SP_I2S_CH_NUM_7              (0x06 << 5)
+#  define SP_I2S_CH_NUM_8              (0x07 << 5)
+#define SP_EXT_VUCP                    BIT(2)
+#define SP_VBIT                                BIT(1)
+#define SP_AUDIO_LAYOUT                        BIT(0)
+
+/* Analog Debug Register 2 */
+#define SP_ANALOG_DEBUG2_REG           0xdd
+#define SP_FORCE_SW_OFF_BYPASS         0x20
+#define SP_XTAL_FRQ                    0x1c
+#  define SP_XTAL_FRQ_19M2             (0x00 << 2)
+#  define SP_XTAL_FRQ_24M              (0x01 << 2)
+#  define SP_XTAL_FRQ_25M              (0x02 << 2)
+#  define SP_XTAL_FRQ_26M              (0x03 << 2)
+#  define SP_XTAL_FRQ_27M              (0x04 << 2)
+#  define SP_XTAL_FRQ_38M4             (0x05 << 2)
+#  define SP_XTAL_FRQ_52M              (0x06 << 2)
+#define SP_POWERON_TIME_1P5MS          0x03
+
+/* Analog Control 0 Register */
+#define SP_ANALOG_CTRL0_REG            0xe1
+
+/* Common Interrupt Status Register 1 */
+#define SP_COMMON_INT_STATUS_BASE      (0xf1 - 1)
+#define SP_PLL_LOCK_CHG                        0x40
+
+/* Common Interrupt Status Register 2 */
+#define SP_COMMON_INT_STATUS2          0xf2
+#define SP_HDCP_AUTH_CHG               BIT(1)
+#define SP_HDCP_AUTH_DONE              BIT(0)
+
+#define SP_HDCP_LINK_CHECK_FAIL                BIT(0)
+
+/* Common Interrupt Status Register 4 */
+#define SP_COMMON_INT_STATUS4_REG      0xf4
+#define SP_HPD_IRQ                     BIT(6)
+#define SP_HPD_ESYNC_ERR               BIT(4)
+#define SP_HPD_CHG                     BIT(2)
+#define SP_HPD_LOST                    BIT(1)
+#define SP_HPD_PLUG                    BIT(0)
+
+/* DP Interrupt Status Register */
+#define SP_DP_INT_STATUS1_REG          0xf7
+#define SP_TRAINING_FINISH             BIT(5)
+#define SP_POLLING_ERR                 BIT(4)
+
+/* Common Interrupt Mask Register */
+#define SP_COMMON_INT_MASK_BASE                (0xf8 - 1)
+
+#define SP_COMMON_INT_MASK4_REG                0xfb
+
+/* DP Interrupts Mask Register */
+#define SP_DP_INT_MASK1_REG            0xfe
+
+/* Interrupt Control Register */
+#define SP_INT_CTRL_REG                        0xff
+
+/***************************************************************/
+/* Register definition of device address 0x7a                  */
+/***************************************************************/
+
+/* DP TX Link Training Control Register */
+#define SP_DP_TX_LT_CTRL0_REG          0x30
+
+/* PD 1.2 Lint Training 80bit Pattern Register */
+#define SP_DP_LT_80BIT_PATTERN0_REG    0x80
+#define SP_DP_LT_80BIT_PATTERN_REG_NUM 10
+
+/* Audio Interface Control Register 0 */
+#define SP_AUD_INTERFACE_CTRL0_REG     0x5f
+#define SP_AUD_INTERFACE_DISABLE       0x80
+
+/* Audio Interface Control Register 2 */
+#define SP_AUD_INTERFACE_CTRL2_REG     0x60
+#define SP_M_AUD_ADJUST_ST             0x04
+
+/* Audio Interface Control Register 3 */
+#define SP_AUD_INTERFACE_CTRL3_REG     0x62
+
+/* Audio Interface Control Register 4 */
+#define SP_AUD_INTERFACE_CTRL4_REG     0x67
+
+/* Audio Interface Control Register 5 */
+#define SP_AUD_INTERFACE_CTRL5_REG     0x68
+
+/* Audio Interface Control Register 6 */
+#define SP_AUD_INTERFACE_CTRL6_REG     0x69
+
+/* Firmware Version Register */
+#define SP_FW_VER_REG                  0xb7
+
+#endif
diff --git a/drivers/gpu/drm/bridge/analogix/Kconfig b/drivers/gpu/drm/bridge/analogix/Kconfig
new file mode 100644 (file)
index 0000000..80f286f
--- /dev/null
@@ -0,0 +1,3 @@
+config DRM_ANALOGIX_DP
+       tristate
+       depends on DRM
diff --git a/drivers/gpu/drm/bridge/analogix/Makefile b/drivers/gpu/drm/bridge/analogix/Makefile
new file mode 100644 (file)
index 0000000..cd4010b
--- /dev/null
@@ -0,0 +1,2 @@
+analogix_dp-objs := analogix_dp_core.o analogix_dp_reg.o
+obj-$(CONFIG_DRM_ANALOGIX_DP) += analogix_dp.o
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
new file mode 100644 (file)
index 0000000..7699597
--- /dev/null
@@ -0,0 +1,1430 @@
+/*
+* Analogix DP (Display Port) core interface driver.
+*
+* Copyright (C) 2012 Samsung Electronics Co., Ltd.
+* Author: Jingoo Han <jg1.han@samsung.com>
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*/
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/gpio.h>
+#include <linux/component.h>
+#include <linux/phy/phy.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_panel.h>
+
+#include <drm/bridge/analogix_dp.h>
+
+#include "analogix_dp_core.h"
+
+#define to_dp(nm)      container_of(nm, struct analogix_dp_device, nm)
+
+struct bridge_init {
+       struct i2c_client *client;
+       struct device_node *node;
+};
+
+static void analogix_dp_init_dp(struct analogix_dp_device *dp)
+{
+       analogix_dp_reset(dp);
+
+       analogix_dp_swreset(dp);
+
+       analogix_dp_init_analog_param(dp);
+       analogix_dp_init_interrupt(dp);
+
+       /* SW defined function Normal operation */
+       analogix_dp_enable_sw_function(dp);
+
+       analogix_dp_config_interrupt(dp);
+       analogix_dp_init_analog_func(dp);
+
+       analogix_dp_init_hpd(dp);
+       analogix_dp_init_aux(dp);
+}
+
+static int analogix_dp_detect_hpd(struct analogix_dp_device *dp)
+{
+       int timeout_loop = 0;
+
+       while (timeout_loop < DP_TIMEOUT_LOOP_COUNT) {
+               if (analogix_dp_get_plug_in_status(dp) == 0)
+                       return 0;
+
+               timeout_loop++;
+               usleep_range(10, 11);
+       }
+
+       /*
+        * Some edp screen do not have hpd signal, so we can't just
+        * return failed when hpd plug in detect failed, DT property
+        * "force-hpd" would indicate whether driver need this.
+        */
+       if (!dp->force_hpd)
+               return -ETIMEDOUT;
+
+       /*
+        * The eDP TRM indicate that if HPD_STATUS(RO) is 0, AUX CH
+        * will not work, so we need to give a force hpd action to
+        * set HPD_STATUS manually.
+        */
+       dev_dbg(dp->dev, "failed to get hpd plug status, try to force hpd\n");
+
+       analogix_dp_force_hpd(dp);
+
+       if (analogix_dp_get_plug_in_status(dp) != 0) {
+               dev_err(dp->dev, "failed to get hpd plug in status\n");
+               return -EINVAL;
+       }
+
+       dev_dbg(dp->dev, "success to get plug in status after force hpd\n");
+
+       return 0;
+}
+
+static unsigned char analogix_dp_calc_edid_check_sum(unsigned char *edid_data)
+{
+       int i;
+       unsigned char sum = 0;
+
+       for (i = 0; i < EDID_BLOCK_LENGTH; i++)
+               sum = sum + edid_data[i];
+
+       return sum;
+}
+
+static int analogix_dp_read_edid(struct analogix_dp_device *dp)
+{
+       unsigned char *edid = dp->edid;
+       unsigned int extend_block = 0;
+       unsigned char sum;
+       unsigned char test_vector;
+       int retval;
+
+       /*
+        * EDID device address is 0x50.
+        * However, if necessary, you must have set upper address
+        * into E-EDID in I2C device, 0x30.
+        */
+
+       /* Read Extension Flag, Number of 128-byte EDID extension blocks */
+       retval = analogix_dp_read_byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR,
+                                               EDID_EXTENSION_FLAG,
+                                               &extend_block);
+       if (retval)
+               return retval;
+
+       if (extend_block > 0) {
+               dev_dbg(dp->dev, "EDID data includes a single extension!\n");
+
+               /* Read EDID data */
+               retval = analogix_dp_read_bytes_from_i2c(dp,
+                                               I2C_EDID_DEVICE_ADDR,
+                                               EDID_HEADER_PATTERN,
+                                               EDID_BLOCK_LENGTH,
+                                               &edid[EDID_HEADER_PATTERN]);
+               if (retval != 0) {
+                       dev_err(dp->dev, "EDID Read failed!\n");
+                       return -EIO;
+               }
+               sum = analogix_dp_calc_edid_check_sum(edid);
+               if (sum != 0) {
+                       dev_err(dp->dev, "EDID bad checksum!\n");
+                       return -EIO;
+               }
+
+               /* Read additional EDID data */
+               retval = analogix_dp_read_bytes_from_i2c(dp,
+                               I2C_EDID_DEVICE_ADDR,
+                               EDID_BLOCK_LENGTH,
+                               EDID_BLOCK_LENGTH,
+                               &edid[EDID_BLOCK_LENGTH]);
+               if (retval != 0) {
+                       dev_err(dp->dev, "EDID Read failed!\n");
+                       return -EIO;
+               }
+               sum = analogix_dp_calc_edid_check_sum(&edid[EDID_BLOCK_LENGTH]);
+               if (sum != 0) {
+                       dev_err(dp->dev, "EDID bad checksum!\n");
+                       return -EIO;
+               }
+
+               analogix_dp_read_byte_from_dpcd(dp, DP_TEST_REQUEST,
+                                               &test_vector);
+               if (test_vector & DP_TEST_LINK_EDID_READ) {
+                       analogix_dp_write_byte_to_dpcd(dp,
+                               DP_TEST_EDID_CHECKSUM,
+                               edid[EDID_BLOCK_LENGTH + EDID_CHECKSUM]);
+                       analogix_dp_write_byte_to_dpcd(dp,
+                               DP_TEST_RESPONSE,
+                               DP_TEST_EDID_CHECKSUM_WRITE);
+               }
+       } else {
+               dev_info(dp->dev, "EDID data does not include any extensions.\n");
+
+               /* Read EDID data */
+               retval = analogix_dp_read_bytes_from_i2c(dp,
+                               I2C_EDID_DEVICE_ADDR, EDID_HEADER_PATTERN,
+                               EDID_BLOCK_LENGTH, &edid[EDID_HEADER_PATTERN]);
+               if (retval != 0) {
+                       dev_err(dp->dev, "EDID Read failed!\n");
+                       return -EIO;
+               }
+               sum = analogix_dp_calc_edid_check_sum(edid);
+               if (sum != 0) {
+                       dev_err(dp->dev, "EDID bad checksum!\n");
+                       return -EIO;
+               }
+
+               analogix_dp_read_byte_from_dpcd(dp, DP_TEST_REQUEST,
+                                               &test_vector);
+               if (test_vector & DP_TEST_LINK_EDID_READ) {
+                       analogix_dp_write_byte_to_dpcd(dp,
+                               DP_TEST_EDID_CHECKSUM, edid[EDID_CHECKSUM]);
+                       analogix_dp_write_byte_to_dpcd(dp,
+                               DP_TEST_RESPONSE, DP_TEST_EDID_CHECKSUM_WRITE);
+               }
+       }
+
+       dev_dbg(dp->dev, "EDID Read success!\n");
+       return 0;
+}
+
+static int analogix_dp_handle_edid(struct analogix_dp_device *dp)
+{
+       u8 buf[12];
+       int i;
+       int retval;
+
+       /* Read DPCD DP_DPCD_REV~RECEIVE_PORT1_CAP_1 */
+       retval = analogix_dp_read_bytes_from_dpcd(dp, DP_DPCD_REV, 12, buf);
+       if (retval)
+               return retval;
+
+       /* Read EDID */
+       for (i = 0; i < 3; i++) {
+               retval = analogix_dp_read_edid(dp);
+               if (!retval)
+                       break;
+       }
+
+       return retval;
+}
+
+static void
+analogix_dp_enable_rx_to_enhanced_mode(struct analogix_dp_device *dp,
+                                      bool enable)
+{
+       u8 data;
+
+       analogix_dp_read_byte_from_dpcd(dp, DP_LANE_COUNT_SET, &data);
+
+       if (enable)
+               analogix_dp_write_byte_to_dpcd(dp, DP_LANE_COUNT_SET,
+                                              DP_LANE_COUNT_ENHANCED_FRAME_EN |
+                                              DPCD_LANE_COUNT_SET(data));
+       else
+               analogix_dp_write_byte_to_dpcd(dp, DP_LANE_COUNT_SET,
+                                              DPCD_LANE_COUNT_SET(data));
+}
+
+static int analogix_dp_is_enhanced_mode_available(struct analogix_dp_device *dp)
+{
+       u8 data;
+       int retval;
+
+       analogix_dp_read_byte_from_dpcd(dp, DP_MAX_LANE_COUNT, &data);
+       retval = DPCD_ENHANCED_FRAME_CAP(data);
+
+       return retval;
+}
+
+static void analogix_dp_set_enhanced_mode(struct analogix_dp_device *dp)
+{
+       u8 data;
+
+       data = analogix_dp_is_enhanced_mode_available(dp);
+       analogix_dp_enable_rx_to_enhanced_mode(dp, data);
+       analogix_dp_enable_enhanced_mode(dp, data);
+}
+
+static void analogix_dp_training_pattern_dis(struct analogix_dp_device *dp)
+{
+       analogix_dp_set_training_pattern(dp, DP_NONE);
+
+       analogix_dp_write_byte_to_dpcd(dp, DP_TRAINING_PATTERN_SET,
+                                      DP_TRAINING_PATTERN_DISABLE);
+}
+
+static void
+analogix_dp_set_lane_lane_pre_emphasis(struct analogix_dp_device *dp,
+                                      int pre_emphasis, int lane)
+{
+       switch (lane) {
+       case 0:
+               analogix_dp_set_lane0_pre_emphasis(dp, pre_emphasis);
+               break;
+       case 1:
+               analogix_dp_set_lane1_pre_emphasis(dp, pre_emphasis);
+               break;
+
+       case 2:
+               analogix_dp_set_lane2_pre_emphasis(dp, pre_emphasis);
+               break;
+
+       case 3:
+               analogix_dp_set_lane3_pre_emphasis(dp, pre_emphasis);
+               break;
+       }
+}
+
+static int analogix_dp_link_start(struct analogix_dp_device *dp)
+{
+       u8 buf[4];
+       int lane, lane_count, pll_tries, retval;
+
+       lane_count = dp->link_train.lane_count;
+
+       dp->link_train.lt_state = CLOCK_RECOVERY;
+       dp->link_train.eq_loop = 0;
+
+       for (lane = 0; lane < lane_count; lane++)
+               dp->link_train.cr_loop[lane] = 0;
+
+       /* Set link rate and count as you want to establish*/
+       analogix_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
+       analogix_dp_set_lane_count(dp, dp->link_train.lane_count);
+
+       /* Setup RX configuration */
+       buf[0] = dp->link_train.link_rate;
+       buf[1] = dp->link_train.lane_count;
+       retval = analogix_dp_write_bytes_to_dpcd(dp, DP_LINK_BW_SET, 2, buf);
+       if (retval)
+               return retval;
+
+       /* Set TX pre-emphasis to minimum */
+       for (lane = 0; lane < lane_count; lane++)
+               analogix_dp_set_lane_lane_pre_emphasis(dp,
+                       PRE_EMPHASIS_LEVEL_0, lane);
+
+       /* Wait for PLL lock */
+       pll_tries = 0;
+       while (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
+               if (pll_tries == DP_TIMEOUT_LOOP_COUNT) {
+                       dev_err(dp->dev, "Wait for PLL lock timed out\n");
+                       return -ETIMEDOUT;
+               }
+
+               pll_tries++;
+               usleep_range(90, 120);
+       }
+
+       /* Set training pattern 1 */
+       analogix_dp_set_training_pattern(dp, TRAINING_PTN1);
+
+       /* Set RX training pattern */
+       retval = analogix_dp_write_byte_to_dpcd(dp,
+                       DP_TRAINING_PATTERN_SET,
+                       DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_1);
+       if (retval)
+               return retval;
+
+       for (lane = 0; lane < lane_count; lane++)
+               buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
+                           DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
+
+       retval = analogix_dp_write_bytes_to_dpcd(dp, DP_TRAINING_LANE0_SET,
+                                                lane_count, buf);
+
+       return retval;
+}
+
+static unsigned char analogix_dp_get_lane_status(u8 link_status[2], int lane)
+{
+       int shift = (lane & 1) * 4;
+       u8 link_value = link_status[lane >> 1];
+
+       return (link_value >> shift) & 0xf;
+}
+
+static int analogix_dp_clock_recovery_ok(u8 link_status[2], int lane_count)
+{
+       int lane;
+       u8 lane_status;
+
+       for (lane = 0; lane < lane_count; lane++) {
+               lane_status = analogix_dp_get_lane_status(link_status, lane);
+               if ((lane_status & DP_LANE_CR_DONE) == 0)
+                       return -EINVAL;
+       }
+       return 0;
+}
+
+static int analogix_dp_channel_eq_ok(u8 link_status[2], u8 link_align,
+                                    int lane_count)
+{
+       int lane;
+       u8 lane_status;
+
+       if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0)
+               return -EINVAL;
+
+       for (lane = 0; lane < lane_count; lane++) {
+               lane_status = analogix_dp_get_lane_status(link_status, lane);
+               lane_status &= DP_CHANNEL_EQ_BITS;
+               if (lane_status != DP_CHANNEL_EQ_BITS)
+                       return -EINVAL;
+       }
+
+       return 0;
+}
+
+static unsigned char
+analogix_dp_get_adjust_request_voltage(u8 adjust_request[2], int lane)
+{
+       int shift = (lane & 1) * 4;
+       u8 link_value = adjust_request[lane >> 1];
+
+       return (link_value >> shift) & 0x3;
+}
+
+static unsigned char analogix_dp_get_adjust_request_pre_emphasis(
+                                       u8 adjust_request[2],
+                                       int lane)
+{
+       int shift = (lane & 1) * 4;
+       u8 link_value = adjust_request[lane >> 1];
+
+       return ((link_value >> shift) & 0xc) >> 2;
+}
+
+static void analogix_dp_set_lane_link_training(struct analogix_dp_device *dp,
+                                              u8 training_lane_set, int lane)
+{
+       switch (lane) {
+       case 0:
+               analogix_dp_set_lane0_link_training(dp, training_lane_set);
+               break;
+       case 1:
+               analogix_dp_set_lane1_link_training(dp, training_lane_set);
+               break;
+
+       case 2:
+               analogix_dp_set_lane2_link_training(dp, training_lane_set);
+               break;
+
+       case 3:
+               analogix_dp_set_lane3_link_training(dp, training_lane_set);
+               break;
+       }
+}
+
+static unsigned int
+analogix_dp_get_lane_link_training(struct analogix_dp_device *dp,
+                                  int lane)
+{
+       u32 reg;
+
+       switch (lane) {
+       case 0:
+               reg = analogix_dp_get_lane0_link_training(dp);
+               break;
+       case 1:
+               reg = analogix_dp_get_lane1_link_training(dp);
+               break;
+       case 2:
+               reg = analogix_dp_get_lane2_link_training(dp);
+               break;
+       case 3:
+               reg = analogix_dp_get_lane3_link_training(dp);
+               break;
+       default:
+               WARN_ON(1);
+               return 0;
+       }
+
+       return reg;
+}
+
+static void analogix_dp_reduce_link_rate(struct analogix_dp_device *dp)
+{
+       analogix_dp_training_pattern_dis(dp);
+       analogix_dp_set_enhanced_mode(dp);
+
+       dp->link_train.lt_state = FAILED;
+}
+
+static void analogix_dp_get_adjust_training_lane(struct analogix_dp_device *dp,
+                                                u8 adjust_request[2])
+{
+       int lane, lane_count;
+       u8 voltage_swing, pre_emphasis, training_lane;
+
+       lane_count = dp->link_train.lane_count;
+       for (lane = 0; lane < lane_count; lane++) {
+               voltage_swing = analogix_dp_get_adjust_request_voltage(
+                                               adjust_request, lane);
+               pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
+                                               adjust_request, lane);
+               training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) |
+                               DPCD_PRE_EMPHASIS_SET(pre_emphasis);
+
+               if (voltage_swing == VOLTAGE_LEVEL_3)
+                       training_lane |= DP_TRAIN_MAX_SWING_REACHED;
+               if (pre_emphasis == PRE_EMPHASIS_LEVEL_3)
+                       training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
+
+               dp->link_train.training_lane[lane] = training_lane;
+       }
+}
+
+static int analogix_dp_process_clock_recovery(struct analogix_dp_device *dp)
+{
+       int lane, lane_count, retval;
+       u8 voltage_swing, pre_emphasis, training_lane;
+       u8 link_status[2], adjust_request[2];
+
+       usleep_range(100, 101);
+
+       lane_count = dp->link_train.lane_count;
+
+       retval =  analogix_dp_read_bytes_from_dpcd(dp,
+                       DP_LANE0_1_STATUS, 2, link_status);
+       if (retval)
+               return retval;
+
+       retval =  analogix_dp_read_bytes_from_dpcd(dp,
+                       DP_ADJUST_REQUEST_LANE0_1, 2, adjust_request);
+       if (retval)
+               return retval;
+
+       if (analogix_dp_clock_recovery_ok(link_status, lane_count) == 0) {
+               /* set training pattern 2 for EQ */
+               analogix_dp_set_training_pattern(dp, TRAINING_PTN2);
+
+               retval = analogix_dp_write_byte_to_dpcd(dp,
+                               DP_TRAINING_PATTERN_SET,
+                               DP_LINK_SCRAMBLING_DISABLE |
+                               DP_TRAINING_PATTERN_2);
+               if (retval)
+                       return retval;
+
+               dev_info(dp->dev, "Link Training Clock Recovery success\n");
+               dp->link_train.lt_state = EQUALIZER_TRAINING;
+       } else {
+               for (lane = 0; lane < lane_count; lane++) {
+                       training_lane = analogix_dp_get_lane_link_training(
+                                                       dp, lane);
+                       voltage_swing = analogix_dp_get_adjust_request_voltage(
+                                                       adjust_request, lane);
+                       pre_emphasis = analogix_dp_get_adjust_request_pre_emphasis(
+                                                       adjust_request, lane);
+
+                       if (DPCD_VOLTAGE_SWING_GET(training_lane) ==
+                                       voltage_swing &&
+                           DPCD_PRE_EMPHASIS_GET(training_lane) ==
+                                       pre_emphasis)
+                               dp->link_train.cr_loop[lane]++;
+
+                       if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
+                           voltage_swing == VOLTAGE_LEVEL_3 ||
+                           pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
+                               dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
+                                       dp->link_train.cr_loop[lane],
+                                       voltage_swing, pre_emphasis);
+                               analogix_dp_reduce_link_rate(dp);
+                               return -EIO;
+                       }
+               }
+       }
+
+       analogix_dp_get_adjust_training_lane(dp, adjust_request);
+
+       for (lane = 0; lane < lane_count; lane++)
+               analogix_dp_set_lane_link_training(dp,
+                       dp->link_train.training_lane[lane], lane);
+
+       retval = analogix_dp_write_bytes_to_dpcd(dp,
+                       DP_TRAINING_LANE0_SET, lane_count,
+                       dp->link_train.training_lane);
+       if (retval)
+               return retval;
+
+       return retval;
+}
+
+static int analogix_dp_process_equalizer_training(struct analogix_dp_device *dp)
+{
+       int lane, lane_count, retval;
+       u32 reg;
+       u8 link_align, link_status[2], adjust_request[2];
+
+       usleep_range(400, 401);
+
+       lane_count = dp->link_train.lane_count;
+
+       retval = analogix_dp_read_bytes_from_dpcd(dp,
+                       DP_LANE0_1_STATUS, 2, link_status);
+       if (retval)
+               return retval;
+
+       if (analogix_dp_clock_recovery_ok(link_status, lane_count)) {
+               analogix_dp_reduce_link_rate(dp);
+               return -EIO;
+       }
+
+       retval = analogix_dp_read_bytes_from_dpcd(dp,
+                       DP_ADJUST_REQUEST_LANE0_1, 2, adjust_request);
+       if (retval)
+               return retval;
+
+       retval = analogix_dp_read_byte_from_dpcd(dp,
+                       DP_LANE_ALIGN_STATUS_UPDATED, &link_align);
+       if (retval)
+               return retval;
+
+       analogix_dp_get_adjust_training_lane(dp, adjust_request);
+
+       if (!analogix_dp_channel_eq_ok(link_status, link_align, lane_count)) {
+               /* traing pattern Set to Normal */
+               analogix_dp_training_pattern_dis(dp);
+
+               dev_info(dp->dev, "Link Training success!\n");
+
+               analogix_dp_get_link_bandwidth(dp, &reg);
+               dp->link_train.link_rate = reg;
+               dev_dbg(dp->dev, "final bandwidth = %.2x\n",
+                       dp->link_train.link_rate);
+
+               analogix_dp_get_lane_count(dp, &reg);
+               dp->link_train.lane_count = reg;
+               dev_dbg(dp->dev, "final lane count = %.2x\n",
+                       dp->link_train.lane_count);
+
+               /* set enhanced mode if available */
+               analogix_dp_set_enhanced_mode(dp);
+               dp->link_train.lt_state = FINISHED;
+
+               return 0;
+       }
+
+       /* not all locked */
+       dp->link_train.eq_loop++;
+
+       if (dp->link_train.eq_loop > MAX_EQ_LOOP) {
+               dev_err(dp->dev, "EQ Max loop\n");
+               analogix_dp_reduce_link_rate(dp);
+               return -EIO;
+       }
+
+       for (lane = 0; lane < lane_count; lane++)
+               analogix_dp_set_lane_link_training(dp,
+                       dp->link_train.training_lane[lane], lane);
+
+       retval = analogix_dp_write_bytes_to_dpcd(dp, DP_TRAINING_LANE0_SET,
+                       lane_count, dp->link_train.training_lane);
+
+       return retval;
+}
+
+static void analogix_dp_get_max_rx_bandwidth(struct analogix_dp_device *dp,
+                                            u8 *bandwidth)
+{
+       u8 data;
+
+       /*
+        * For DP rev.1.1, Maximum link rate of Main Link lanes
+        * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps
+        * For DP rev.1.2, Maximum link rate of Main Link lanes
+        * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps, 0x14 = 5.4Gbps
+        */
+       analogix_dp_read_byte_from_dpcd(dp, DP_MAX_LINK_RATE, &data);
+       *bandwidth = data;
+}
+
+static void analogix_dp_get_max_rx_lane_count(struct analogix_dp_device *dp,
+                                             u8 *lane_count)
+{
+       u8 data;
+
+       /*
+        * For DP rev.1.1, Maximum number of Main Link lanes
+        * 0x01 = 1 lane, 0x02 = 2 lanes, 0x04 = 4 lanes
+        */
+       analogix_dp_read_byte_from_dpcd(dp, DP_MAX_LANE_COUNT, &data);
+       *lane_count = DPCD_MAX_LANE_COUNT(data);
+}
+
+static void analogix_dp_init_training(struct analogix_dp_device *dp,
+                                     enum link_lane_count_type max_lane,
+                                     int max_rate)
+{
+       /*
+        * MACRO_RST must be applied after the PLL_LOCK to avoid
+        * the DP inter pair skew issue for at least 10 us
+        */
+       analogix_dp_reset_macro(dp);
+
+       /* Initialize by reading RX's DPCD */
+       analogix_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate);
+       analogix_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count);
+
+       if ((dp->link_train.link_rate != DP_LINK_BW_1_62) &&
+           (dp->link_train.link_rate != DP_LINK_BW_2_7) &&
+           (dp->link_train.link_rate != DP_LINK_BW_5_4)) {
+               dev_err(dp->dev, "Rx Max Link Rate is abnormal :%x !\n",
+                       dp->link_train.link_rate);
+               dp->link_train.link_rate = DP_LINK_BW_1_62;
+       }
+
+       if (dp->link_train.lane_count == 0) {
+               dev_err(dp->dev, "Rx Max Lane count is abnormal :%x !\n",
+                       dp->link_train.lane_count);
+               dp->link_train.lane_count = (u8)LANE_COUNT1;
+       }
+
+       /* Setup TX lane count & rate */
+       if (dp->link_train.lane_count > max_lane)
+               dp->link_train.lane_count = max_lane;
+       if (dp->link_train.link_rate > max_rate)
+               dp->link_train.link_rate = max_rate;
+
+       /* All DP analog module power up */
+       analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
+}
+
+static int analogix_dp_sw_link_training(struct analogix_dp_device *dp)
+{
+       int retval = 0, training_finished = 0;
+
+       dp->link_train.lt_state = START;
+
+       /* Process here */
+       while (!retval && !training_finished) {
+               switch (dp->link_train.lt_state) {
+               case START:
+                       retval = analogix_dp_link_start(dp);
+                       if (retval)
+                               dev_err(dp->dev, "LT link start failed!\n");
+                       break;
+               case CLOCK_RECOVERY:
+                       retval = analogix_dp_process_clock_recovery(dp);
+                       if (retval)
+                               dev_err(dp->dev, "LT CR failed!\n");
+                       break;
+               case EQUALIZER_TRAINING:
+                       retval = analogix_dp_process_equalizer_training(dp);
+                       if (retval)
+                               dev_err(dp->dev, "LT EQ failed!\n");
+                       break;
+               case FINISHED:
+                       training_finished = 1;
+                       break;
+               case FAILED:
+                       return -EREMOTEIO;
+               }
+       }
+       if (retval)
+               dev_err(dp->dev, "eDP link training failed (%d)\n", retval);
+
+       return retval;
+}
+
+static int analogix_dp_set_link_train(struct analogix_dp_device *dp,
+                                     u32 count, u32 bwtype)
+{
+       int i;
+       int retval;
+
+       for (i = 0; i < DP_TIMEOUT_LOOP_COUNT; i++) {
+               analogix_dp_init_training(dp, count, bwtype);
+               retval = analogix_dp_sw_link_training(dp);
+               if (retval == 0)
+                       break;
+
+               usleep_range(100, 110);
+       }
+
+       return retval;
+}
+
+static int analogix_dp_config_video(struct analogix_dp_device *dp)
+{
+       int retval = 0;
+       int timeout_loop = 0;
+       int done_count = 0;
+
+       analogix_dp_config_video_slave_mode(dp);
+
+       analogix_dp_set_video_color_format(dp);
+
+       if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
+               dev_err(dp->dev, "PLL is not locked yet.\n");
+               return -EINVAL;
+       }
+
+       for (;;) {
+               timeout_loop++;
+               if (analogix_dp_is_slave_video_stream_clock_on(dp) == 0)
+                       break;
+               if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
+                       dev_err(dp->dev, "Timeout of video streamclk ok\n");
+                       return -ETIMEDOUT;
+               }
+
+               usleep_range(1, 2);
+       }
+
+       /* Set to use the register calculated M/N video */
+       analogix_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0);
+
+       /* For video bist, Video timing must be generated by register */
+       analogix_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_CAPTURE);
+
+       /* Disable video mute */
+       analogix_dp_enable_video_mute(dp, 0);
+
+       /* Configure video slave mode */
+       analogix_dp_enable_video_master(dp, 0);
+
+       timeout_loop = 0;
+
+       for (;;) {
+               timeout_loop++;
+               if (analogix_dp_is_video_stream_on(dp) == 0) {
+                       done_count++;
+                       if (done_count > 10)
+                               break;
+               } else if (done_count) {
+                       done_count = 0;
+               }
+               if (timeout_loop > DP_TIMEOUT_LOOP_COUNT) {
+                       dev_err(dp->dev, "Timeout of video streamclk ok\n");
+                       return -ETIMEDOUT;
+               }
+
+               usleep_range(1000, 1001);
+       }
+
+       if (retval != 0)
+               dev_err(dp->dev, "Video stream is not detected!\n");
+
+       return retval;
+}
+
+static void analogix_dp_enable_scramble(struct analogix_dp_device *dp,
+                                       bool enable)
+{
+       u8 data;
+
+       if (enable) {
+               analogix_dp_enable_scrambling(dp);
+
+               analogix_dp_read_byte_from_dpcd(dp, DP_TRAINING_PATTERN_SET,
+                                               &data);
+               analogix_dp_write_byte_to_dpcd(dp,
+                       DP_TRAINING_PATTERN_SET,
+                       (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE));
+       } else {
+               analogix_dp_disable_scrambling(dp);
+
+               analogix_dp_read_byte_from_dpcd(dp, DP_TRAINING_PATTERN_SET,
+                                               &data);
+               analogix_dp_write_byte_to_dpcd(dp,
+                       DP_TRAINING_PATTERN_SET,
+                       (u8)(data | DP_LINK_SCRAMBLING_DISABLE));
+       }
+}
+
+static irqreturn_t analogix_dp_hardirq(int irq, void *arg)
+{
+       struct analogix_dp_device *dp = arg;
+       irqreturn_t ret = IRQ_NONE;
+       enum dp_irq_type irq_type;
+
+       irq_type = analogix_dp_get_irq_type(dp);
+       if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
+               analogix_dp_mute_hpd_interrupt(dp);
+               ret = IRQ_WAKE_THREAD;
+       }
+
+       return ret;
+}
+
+static irqreturn_t analogix_dp_irq_thread(int irq, void *arg)
+{
+       struct analogix_dp_device *dp = arg;
+       enum dp_irq_type irq_type;
+
+       irq_type = analogix_dp_get_irq_type(dp);
+       if (irq_type & DP_IRQ_TYPE_HP_CABLE_IN ||
+           irq_type & DP_IRQ_TYPE_HP_CABLE_OUT) {
+               dev_dbg(dp->dev, "Detected cable status changed!\n");
+               if (dp->drm_dev)
+                       drm_helper_hpd_irq_event(dp->drm_dev);
+       }
+
+       if (irq_type != DP_IRQ_TYPE_UNKNOWN) {
+               analogix_dp_clear_hotplug_interrupts(dp);
+               analogix_dp_unmute_hpd_interrupt(dp);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static void analogix_dp_commit(struct analogix_dp_device *dp)
+{
+       int ret;
+
+       /* Keep the panel disabled while we configure video */
+       if (dp->plat_data->panel) {
+               if (drm_panel_disable(dp->plat_data->panel))
+                       DRM_ERROR("failed to disable the panel\n");
+       }
+
+       ret = analogix_dp_set_link_train(dp, dp->video_info.max_lane_count,
+                                        dp->video_info.max_link_rate);
+       if (ret) {
+               dev_err(dp->dev, "unable to do link train\n");
+               return;
+       }
+
+       analogix_dp_enable_scramble(dp, 1);
+       analogix_dp_enable_rx_to_enhanced_mode(dp, 1);
+       analogix_dp_enable_enhanced_mode(dp, 1);
+
+       analogix_dp_init_video(dp);
+       ret = analogix_dp_config_video(dp);
+       if (ret)
+               dev_err(dp->dev, "unable to config video\n");
+
+       /* Safe to enable the panel now */
+       if (dp->plat_data->panel) {
+               if (drm_panel_enable(dp->plat_data->panel))
+                       DRM_ERROR("failed to enable the panel\n");
+       }
+
+       /* Enable video */
+       analogix_dp_start_video(dp);
+}
+
+int analogix_dp_get_modes(struct drm_connector *connector)
+{
+       struct analogix_dp_device *dp = to_dp(connector);
+       struct edid *edid = (struct edid *)dp->edid;
+       int num_modes = 0;
+
+       if (analogix_dp_handle_edid(dp) == 0) {
+               drm_mode_connector_update_edid_property(&dp->connector, edid);
+               num_modes += drm_add_edid_modes(&dp->connector, edid);
+       }
+
+       if (dp->plat_data->panel)
+               num_modes += drm_panel_get_modes(dp->plat_data->panel);
+
+       if (dp->plat_data->get_modes)
+               num_modes += dp->plat_data->get_modes(dp->plat_data);
+
+       return num_modes;
+}
+
+static struct drm_encoder *
+analogix_dp_best_encoder(struct drm_connector *connector)
+{
+       struct analogix_dp_device *dp = to_dp(connector);
+
+       return dp->encoder;
+}
+
+static const struct drm_connector_helper_funcs analogix_dp_connector_helper_funcs = {
+       .get_modes = analogix_dp_get_modes,
+       .best_encoder = analogix_dp_best_encoder,
+};
+
+enum drm_connector_status
+analogix_dp_detect(struct drm_connector *connector, bool force)
+{
+       struct analogix_dp_device *dp = to_dp(connector);
+
+       if (analogix_dp_detect_hpd(dp))
+               return connector_status_disconnected;
+
+       return connector_status_connected;
+}
+
+static void analogix_dp_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+
+}
+
+static const struct drm_connector_funcs analogix_dp_connector_funcs = {
+       .dpms = drm_atomic_helper_connector_dpms,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .detect = analogix_dp_detect,
+       .destroy = analogix_dp_connector_destroy,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static int analogix_dp_bridge_attach(struct drm_bridge *bridge)
+{
+       struct analogix_dp_device *dp = bridge->driver_private;
+       struct drm_encoder *encoder = dp->encoder;
+       struct drm_connector *connector = &dp->connector;
+       int ret;
+
+       if (!bridge->encoder) {
+               DRM_ERROR("Parent encoder object not found");
+               return -ENODEV;
+       }
+
+       connector->polled = DRM_CONNECTOR_POLL_HPD;
+
+       ret = drm_connector_init(dp->drm_dev, connector,
+                                &analogix_dp_connector_funcs,
+                                DRM_MODE_CONNECTOR_eDP);
+       if (ret) {
+               DRM_ERROR("Failed to initialize connector with drm\n");
+               return ret;
+       }
+
+       drm_connector_helper_add(connector,
+                                &analogix_dp_connector_helper_funcs);
+       drm_mode_connector_attach_encoder(connector, encoder);
+
+       /*
+        * NOTE: the connector registration is implemented in analogix
+        * platform driver, that to say connector would be exist after
+        * plat_data->attch return, that's why we record the connector
+        * point after plat attached.
+        */
+        if (dp->plat_data->attach) {
+                ret = dp->plat_data->attach(dp->plat_data, bridge, connector);
+                if (ret) {
+                        DRM_ERROR("Failed at platform attch func\n");
+                        return ret;
+                }
+       }
+
+       if (dp->plat_data->panel) {
+               ret = drm_panel_attach(dp->plat_data->panel, &dp->connector);
+               if (ret) {
+                       DRM_ERROR("Failed to attach panel\n");
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static void analogix_dp_bridge_enable(struct drm_bridge *bridge)
+{
+       struct analogix_dp_device *dp = bridge->driver_private;
+
+       if (dp->dpms_mode == DRM_MODE_DPMS_ON)
+               return;
+
+       pm_runtime_get_sync(dp->dev);
+
+       if (dp->plat_data->power_on)
+               dp->plat_data->power_on(dp->plat_data);
+
+       phy_power_on(dp->phy);
+       analogix_dp_init_dp(dp);
+       enable_irq(dp->irq);
+       analogix_dp_commit(dp);
+
+       dp->dpms_mode = DRM_MODE_DPMS_ON;
+}
+
+static void analogix_dp_bridge_disable(struct drm_bridge *bridge)
+{
+       struct analogix_dp_device *dp = bridge->driver_private;
+
+       if (dp->dpms_mode != DRM_MODE_DPMS_ON)
+               return;
+
+       if (dp->plat_data->panel) {
+               if (drm_panel_disable(dp->plat_data->panel)) {
+                       DRM_ERROR("failed to disable the panel\n");
+                       return;
+               }
+       }
+
+       disable_irq(dp->irq);
+       phy_power_off(dp->phy);
+
+       if (dp->plat_data->power_off)
+               dp->plat_data->power_off(dp->plat_data);
+
+       pm_runtime_put_sync(dp->dev);
+
+       dp->dpms_mode = DRM_MODE_DPMS_OFF;
+}
+
+static void analogix_dp_bridge_mode_set(struct drm_bridge *bridge,
+                                       struct drm_display_mode *orig_mode,
+                                       struct drm_display_mode *mode)
+{
+       struct analogix_dp_device *dp = bridge->driver_private;
+       struct drm_display_info *display_info = &dp->connector.display_info;
+       struct video_info *video = &dp->video_info;
+       struct device_node *dp_node = dp->dev->of_node;
+       int vic;
+
+       /* Input video interlaces & hsync pol & vsync pol */
+       video->interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+       video->v_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NVSYNC);
+       video->h_sync_polarity = !!(mode->flags & DRM_MODE_FLAG_NHSYNC);
+
+       /* Input video dynamic_range & colorimetry */
+       vic = drm_match_cea_mode(mode);
+       if ((vic == 6) || (vic == 7) || (vic == 21) || (vic == 22) ||
+           (vic == 2) || (vic == 3) || (vic == 17) || (vic == 18)) {
+               video->dynamic_range = CEA;
+               video->ycbcr_coeff = COLOR_YCBCR601;
+       } else if (vic) {
+               video->dynamic_range = CEA;
+               video->ycbcr_coeff = COLOR_YCBCR709;
+       } else {
+               video->dynamic_range = VESA;
+               video->ycbcr_coeff = COLOR_YCBCR709;
+       }
+
+       /* Input vide bpc and color_formats */
+       switch (display_info->bpc) {
+       case 12:
+               video->color_depth = COLOR_12;
+               break;
+       case 10:
+               video->color_depth = COLOR_10;
+               break;
+       case 8:
+               video->color_depth = COLOR_8;
+               break;
+       case 6:
+               video->color_depth = COLOR_6;
+               break;
+       default:
+               video->color_depth = COLOR_8;
+               break;
+       }
+       if (display_info->color_formats & DRM_COLOR_FORMAT_YCRCB444)
+               video->color_space = COLOR_YCBCR444;
+       else if (display_info->color_formats & DRM_COLOR_FORMAT_YCRCB422)
+               video->color_space = COLOR_YCBCR422;
+       else if (display_info->color_formats & DRM_COLOR_FORMAT_RGB444)
+               video->color_space = COLOR_RGB;
+       else
+               video->color_space = COLOR_RGB;
+
+       /*
+        * NOTE: those property parsing code is used for providing backward
+        * compatibility for samsung platform.
+        * Due to we used the "of_property_read_u32" interfaces, when this
+        * property isn't present, the "video_info" can keep the original
+        * values and wouldn't be modified.
+        */
+       of_property_read_u32(dp_node, "samsung,color-space",
+                            &video->color_space);
+       of_property_read_u32(dp_node, "samsung,dynamic-range",
+                            &video->dynamic_range);
+       of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
+                            &video->ycbcr_coeff);
+       of_property_read_u32(dp_node, "samsung,color-depth",
+                            &video->color_depth);
+       if (of_property_read_bool(dp_node, "hsync-active-high"))
+               video->h_sync_polarity = true;
+       if (of_property_read_bool(dp_node, "vsync-active-high"))
+               video->v_sync_polarity = true;
+       if (of_property_read_bool(dp_node, "interlaced"))
+               video->interlaced = true;
+}
+
+static void analogix_dp_bridge_nop(struct drm_bridge *bridge)
+{
+       /* do nothing */
+}
+
+static const struct drm_bridge_funcs analogix_dp_bridge_funcs = {
+       .enable = analogix_dp_bridge_enable,
+       .disable = analogix_dp_bridge_disable,
+       .pre_enable = analogix_dp_bridge_nop,
+       .post_disable = analogix_dp_bridge_nop,
+       .mode_set = analogix_dp_bridge_mode_set,
+       .attach = analogix_dp_bridge_attach,
+};
+
+static int analogix_dp_create_bridge(struct drm_device *drm_dev,
+                                    struct analogix_dp_device *dp)
+{
+       struct drm_bridge *bridge;
+       int ret;
+
+       bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
+       if (!bridge) {
+               DRM_ERROR("failed to allocate for drm bridge\n");
+               return -ENOMEM;
+       }
+
+       dp->bridge = bridge;
+
+       dp->encoder->bridge = bridge;
+       bridge->driver_private = dp;
+       bridge->encoder = dp->encoder;
+       bridge->funcs = &analogix_dp_bridge_funcs;
+
+       ret = drm_bridge_attach(drm_dev, bridge);
+       if (ret) {
+               DRM_ERROR("failed to attach drm bridge\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int analogix_dp_dt_parse_pdata(struct analogix_dp_device *dp)
+{
+       struct device_node *dp_node = dp->dev->of_node;
+       struct video_info *video_info = &dp->video_info;
+
+       switch (dp->plat_data->dev_type) {
+       case RK3288_DP:
+               /*
+                * Like Rk3288 DisplayPort TRM indicate that "Main link
+                * containing 4 physical lanes of 2.7/1.62 Gbps/lane".
+                */
+               video_info->max_link_rate = 0x0A;
+               video_info->max_lane_count = 0x04;
+               break;
+       case EXYNOS_DP:
+               /*
+                * NOTE: those property parseing code is used for
+                * providing backward compatibility for samsung platform.
+                */
+               of_property_read_u32(dp_node, "samsung,link-rate",
+                                    &video_info->max_link_rate);
+               of_property_read_u32(dp_node, "samsung,lane-count",
+                                    &video_info->max_lane_count);
+               break;
+       }
+
+       return 0;
+}
+
+int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
+                    struct analogix_dp_plat_data *plat_data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct analogix_dp_device *dp;
+       struct resource *res;
+       unsigned int irq_flags;
+       int ret;
+
+       if (!plat_data) {
+               dev_err(dev, "Invalided input plat_data\n");
+               return -EINVAL;
+       }
+
+       dp = devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL);
+       if (!dp)
+               return -ENOMEM;
+
+       dev_set_drvdata(dev, dp);
+
+       dp->dev = &pdev->dev;
+       dp->dpms_mode = DRM_MODE_DPMS_OFF;
+
+       /*
+        * platform dp driver need containor_of the plat_data to get
+        * the driver private data, so we need to store the point of
+        * plat_data, not the context of plat_data.
+        */
+       dp->plat_data = plat_data;
+
+       ret = analogix_dp_dt_parse_pdata(dp);
+       if (ret)
+               return ret;
+
+       dp->phy = devm_phy_get(dp->dev, "dp");
+       if (IS_ERR(dp->phy)) {
+               dev_err(dp->dev, "no DP phy configured\n");
+               ret = PTR_ERR(dp->phy);
+               if (ret) {
+                       /*
+                        * phy itself is not enabled, so we can move forward
+                        * assigning NULL to phy pointer.
+                        */
+                       if (ret == -ENOSYS || ret == -ENODEV)
+                               dp->phy = NULL;
+                       else
+                               return ret;
+               }
+       }
+
+       dp->clock = devm_clk_get(&pdev->dev, "dp");
+       if (IS_ERR(dp->clock)) {
+               dev_err(&pdev->dev, "failed to get clock\n");
+               return PTR_ERR(dp->clock);
+       }
+
+       clk_prepare_enable(dp->clock);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+       dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(dp->reg_base))
+               return PTR_ERR(dp->reg_base);
+
+       dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
+
+       dp->hpd_gpio = of_get_named_gpio(dev->of_node, "hpd-gpios", 0);
+       if (!gpio_is_valid(dp->hpd_gpio))
+               dp->hpd_gpio = of_get_named_gpio(dev->of_node,
+                                                "samsung,hpd-gpio", 0);
+
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               /*
+                * Set up the hotplug GPIO from the device tree as an interrupt.
+                * Simply specifying a different interrupt in the device tree
+                * doesn't work since we handle hotplug rather differently when
+                * using a GPIO.  We also need the actual GPIO specifier so
+                * that we can get the current state of the GPIO.
+                */
+               ret = devm_gpio_request_one(&pdev->dev, dp->hpd_gpio, GPIOF_IN,
+                                           "hpd_gpio");
+               if (ret) {
+                       dev_err(&pdev->dev, "failed to get hpd gpio\n");
+                       return ret;
+               }
+               dp->irq = gpio_to_irq(dp->hpd_gpio);
+               irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
+       } else {
+               dp->hpd_gpio = -ENODEV;
+               dp->irq = platform_get_irq(pdev, 0);
+               irq_flags = 0;
+       }
+
+       if (dp->irq == -ENXIO) {
+               dev_err(&pdev->dev, "failed to get irq\n");
+               return -ENODEV;
+       }
+
+       pm_runtime_enable(dev);
+
+       phy_power_on(dp->phy);
+
+       if (dp->plat_data->panel) {
+               if (drm_panel_prepare(dp->plat_data->panel)) {
+                       DRM_ERROR("failed to setup the panel\n");
+                       return -EBUSY;
+               }
+       }
+
+       analogix_dp_init_dp(dp);
+
+       ret = devm_request_threaded_irq(&pdev->dev, dp->irq,
+                                       analogix_dp_hardirq,
+                                       analogix_dp_irq_thread,
+                                       irq_flags, "analogix-dp", dp);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to request irq\n");
+               goto err_disable_pm_runtime;
+       }
+       disable_irq(dp->irq);
+
+       dp->drm_dev = drm_dev;
+       dp->encoder = dp->plat_data->encoder;
+
+       ret = analogix_dp_create_bridge(drm_dev, dp);
+       if (ret) {
+               DRM_ERROR("failed to create bridge (%d)\n", ret);
+               drm_encoder_cleanup(dp->encoder);
+               goto err_disable_pm_runtime;
+       }
+
+       return 0;
+
+err_disable_pm_runtime:
+       pm_runtime_disable(dev);
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(analogix_dp_bind);
+
+void analogix_dp_unbind(struct device *dev, struct device *master,
+                       void *data)
+{
+       struct analogix_dp_device *dp = dev_get_drvdata(dev);
+
+       analogix_dp_bridge_disable(dp->bridge);
+
+       if (dp->plat_data->panel) {
+               if (drm_panel_unprepare(dp->plat_data->panel))
+                       DRM_ERROR("failed to turnoff the panel\n");
+       }
+
+       pm_runtime_disable(dev);
+}
+EXPORT_SYMBOL_GPL(analogix_dp_unbind);
+
+#ifdef CONFIG_PM
+int analogix_dp_suspend(struct device *dev)
+{
+       struct analogix_dp_device *dp = dev_get_drvdata(dev);
+
+       clk_disable_unprepare(dp->clock);
+
+       if (dp->plat_data->panel) {
+               if (drm_panel_unprepare(dp->plat_data->panel))
+                       DRM_ERROR("failed to turnoff the panel\n");
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(analogix_dp_suspend);
+
+int analogix_dp_resume(struct device *dev)
+{
+       struct analogix_dp_device *dp = dev_get_drvdata(dev);
+       int ret;
+
+       ret = clk_prepare_enable(dp->clock);
+       if (ret < 0) {
+               DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
+               return ret;
+       }
+
+       if (dp->plat_data->panel) {
+               if (drm_panel_prepare(dp->plat_data->panel)) {
+                       DRM_ERROR("failed to setup the panel\n");
+                       return -EBUSY;
+               }
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(analogix_dp_resume);
+#endif
+
+MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
+MODULE_DESCRIPTION("Analogix DP Core Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.h
new file mode 100644 (file)
index 0000000..f09275d
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * Header file for Analogix DP (Display Port) core interface driver.
+ *
+ * Copyright (C) 2012 Samsung Electronics Co., Ltd.
+ * Author: Jingoo Han <jg1.han@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#ifndef _ANALOGIX_DP_CORE_H
+#define _ANALOGIX_DP_CORE_H
+
+#include <drm/drm_crtc.h>
+#include <drm/drm_dp_helper.h>
+
+#define DP_TIMEOUT_LOOP_COUNT 100
+#define MAX_CR_LOOP 5
+#define MAX_EQ_LOOP 5
+
+/* I2C EDID Chip ID, Slave Address */
+#define I2C_EDID_DEVICE_ADDR                   0x50
+#define I2C_E_EDID_DEVICE_ADDR                 0x30
+
+#define EDID_BLOCK_LENGTH                      0x80
+#define EDID_HEADER_PATTERN                    0x00
+#define EDID_EXTENSION_FLAG                    0x7e
+#define EDID_CHECKSUM                          0x7f
+
+/* DP_MAX_LANE_COUNT */
+#define DPCD_ENHANCED_FRAME_CAP(x)             (((x) >> 7) & 0x1)
+#define DPCD_MAX_LANE_COUNT(x)                 ((x) & 0x1f)
+
+/* DP_LANE_COUNT_SET */
+#define DPCD_LANE_COUNT_SET(x)                 ((x) & 0x1f)
+
+/* DP_TRAINING_LANE0_SET */
+#define DPCD_PRE_EMPHASIS_SET(x)               (((x) & 0x3) << 3)
+#define DPCD_PRE_EMPHASIS_GET(x)               (((x) >> 3) & 0x3)
+#define DPCD_VOLTAGE_SWING_SET(x)              (((x) & 0x3) << 0)
+#define DPCD_VOLTAGE_SWING_GET(x)              (((x) >> 0) & 0x3)
+
+enum link_lane_count_type {
+       LANE_COUNT1 = 1,
+       LANE_COUNT2 = 2,
+       LANE_COUNT4 = 4
+};
+
+enum link_training_state {
+       START,
+       CLOCK_RECOVERY,
+       EQUALIZER_TRAINING,
+       FINISHED,
+       FAILED
+};
+
+enum voltage_swing_level {
+       VOLTAGE_LEVEL_0,
+       VOLTAGE_LEVEL_1,
+       VOLTAGE_LEVEL_2,
+       VOLTAGE_LEVEL_3,
+};
+
+enum pre_emphasis_level {
+       PRE_EMPHASIS_LEVEL_0,
+       PRE_EMPHASIS_LEVEL_1,
+       PRE_EMPHASIS_LEVEL_2,
+       PRE_EMPHASIS_LEVEL_3,
+};
+
+enum pattern_set {
+       PRBS7,
+       D10_2,
+       TRAINING_PTN1,
+       TRAINING_PTN2,
+       DP_NONE
+};
+
+enum color_space {
+       COLOR_RGB,
+       COLOR_YCBCR422,
+       COLOR_YCBCR444
+};
+
+enum color_depth {
+       COLOR_6,
+       COLOR_8,
+       COLOR_10,
+       COLOR_12
+};
+
+enum color_coefficient {
+       COLOR_YCBCR601,
+       COLOR_YCBCR709
+};
+
+enum dynamic_range {
+       VESA,
+       CEA
+};
+
+enum pll_status {
+       PLL_UNLOCKED,
+       PLL_LOCKED
+};
+
+enum clock_recovery_m_value_type {
+       CALCULATED_M,
+       REGISTER_M
+};
+
+enum video_timing_recognition_type {
+       VIDEO_TIMING_FROM_CAPTURE,
+       VIDEO_TIMING_FROM_REGISTER
+};
+
+enum analog_power_block {
+       AUX_BLOCK,
+       CH0_BLOCK,
+       CH1_BLOCK,
+       CH2_BLOCK,
+       CH3_BLOCK,
+       ANALOG_TOTAL,
+       POWER_ALL
+};
+
+enum dp_irq_type {
+       DP_IRQ_TYPE_HP_CABLE_IN,
+       DP_IRQ_TYPE_HP_CABLE_OUT,
+       DP_IRQ_TYPE_HP_CHANGE,
+       DP_IRQ_TYPE_UNKNOWN,
+};
+
+struct video_info {
+       char *name;
+
+       bool h_sync_polarity;
+       bool v_sync_polarity;
+       bool interlaced;
+
+       enum color_space color_space;
+       enum dynamic_range dynamic_range;
+       enum color_coefficient ycbcr_coeff;
+       enum color_depth color_depth;
+
+       int max_link_rate;
+       enum link_lane_count_type max_lane_count;
+};
+
+struct link_train {
+       int eq_loop;
+       int cr_loop[4];
+
+       u8 link_rate;
+       u8 lane_count;
+       u8 training_lane[4];
+
+       enum link_training_state lt_state;
+};
+
+struct analogix_dp_device {
+       struct drm_encoder      *encoder;
+       struct device           *dev;
+       struct drm_device       *drm_dev;
+       struct drm_connector    connector;
+       struct drm_bridge       *bridge;
+       struct clk              *clock;
+       unsigned int            irq;
+       void __iomem            *reg_base;
+
+       struct video_info       video_info;
+       struct link_train       link_train;
+       struct phy              *phy;
+       int                     dpms_mode;
+       int                     hpd_gpio;
+       bool                    force_hpd;
+       unsigned char           edid[EDID_BLOCK_LENGTH * 2];
+
+       struct analogix_dp_plat_data *plat_data;
+};
+
+/* analogix_dp_reg.c */
+void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable);
+void analogix_dp_stop_video(struct analogix_dp_device *dp);
+void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable);
+void analogix_dp_init_analog_param(struct analogix_dp_device *dp);
+void analogix_dp_init_interrupt(struct analogix_dp_device *dp);
+void analogix_dp_reset(struct analogix_dp_device *dp);
+void analogix_dp_swreset(struct analogix_dp_device *dp);
+void analogix_dp_config_interrupt(struct analogix_dp_device *dp);
+void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp);
+void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp);
+enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp);
+void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable);
+void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp,
+                                      enum analog_power_block block,
+                                      bool enable);
+void analogix_dp_init_analog_func(struct analogix_dp_device *dp);
+void analogix_dp_init_hpd(struct analogix_dp_device *dp);
+void analogix_dp_force_hpd(struct analogix_dp_device *dp);
+enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp);
+void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp);
+void analogix_dp_reset_aux(struct analogix_dp_device *dp);
+void analogix_dp_init_aux(struct analogix_dp_device *dp);
+int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp);
+void analogix_dp_enable_sw_function(struct analogix_dp_device *dp);
+int analogix_dp_start_aux_transaction(struct analogix_dp_device *dp);
+int analogix_dp_write_byte_to_dpcd(struct analogix_dp_device *dp,
+                                  unsigned int reg_addr,
+                                  unsigned char data);
+int analogix_dp_read_byte_from_dpcd(struct analogix_dp_device *dp,
+                                   unsigned int reg_addr,
+                                   unsigned char *data);
+int analogix_dp_write_bytes_to_dpcd(struct analogix_dp_device *dp,
+                                   unsigned int reg_addr,
+                                   unsigned int count,
+                                   unsigned char data[]);
+int analogix_dp_read_bytes_from_dpcd(struct analogix_dp_device *dp,
+                                    unsigned int reg_addr,
+                                    unsigned int count,
+                                    unsigned char data[]);
+int analogix_dp_select_i2c_device(struct analogix_dp_device *dp,
+                                 unsigned int device_addr,
+                                 unsigned int reg_addr);
+int analogix_dp_read_byte_from_i2c(struct analogix_dp_device *dp,
+                                  unsigned int device_addr,
+                                  unsigned int reg_addr,
+                                  unsigned int *data);
+int analogix_dp_read_bytes_from_i2c(struct analogix_dp_device *dp,
+                                   unsigned int device_addr,
+                                   unsigned int reg_addr,
+                                   unsigned int count,
+                                   unsigned char edid[]);
+void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype);
+void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype);
+void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count);
+void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count);
+void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
+                                     bool enable);
+void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
+                                     enum pattern_set pattern);
+void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level);
+void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level);
+void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level);
+void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level);
+void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane);
+void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane);
+void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane);
+void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane);
+u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp);
+u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp);
+u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp);
+u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp);
+void analogix_dp_reset_macro(struct analogix_dp_device *dp);
+void analogix_dp_init_video(struct analogix_dp_device *dp);
+
+void analogix_dp_set_video_color_format(struct analogix_dp_device *dp);
+int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp);
+void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp,
+                                enum clock_recovery_m_value_type type,
+                                u32 m_value,
+                                u32 n_value);
+void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type);
+void analogix_dp_enable_video_master(struct analogix_dp_device *dp,
+                                    bool enable);
+void analogix_dp_start_video(struct analogix_dp_device *dp);
+int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp);
+void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp);
+void analogix_dp_enable_scrambling(struct analogix_dp_device *dp);
+void analogix_dp_disable_scrambling(struct analogix_dp_device *dp);
+#endif /* _ANALOGIX_DP_CORE_H */
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
new file mode 100644 (file)
index 0000000..49205ef
--- /dev/null
@@ -0,0 +1,1320 @@
+/*
+ * Analogix DP (Display port) core register interface driver.
+ *
+ * Copyright (C) 2012 Samsung Electronics Co., Ltd.
+ * Author: Jingoo Han <jg1.han@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
+
+#include <drm/bridge/analogix_dp.h>
+
+#include "analogix_dp_core.h"
+#include "analogix_dp_reg.h"
+
+#define COMMON_INT_MASK_1      0
+#define COMMON_INT_MASK_2      0
+#define COMMON_INT_MASK_3      0
+#define COMMON_INT_MASK_4      (HOTPLUG_CHG | HPD_LOST | PLUG)
+#define INT_STA_MASK           INT_HPD
+
+void analogix_dp_enable_video_mute(struct analogix_dp_device *dp, bool enable)
+{
+       u32 reg;
+
+       if (enable) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+               reg |= HDCP_VIDEO_MUTE;
+               writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+               reg &= ~HDCP_VIDEO_MUTE;
+               writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+       }
+}
+
+void analogix_dp_stop_video(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+       reg &= ~VIDEO_EN;
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+}
+
+void analogix_dp_lane_swap(struct analogix_dp_device *dp, bool enable)
+{
+       u32 reg;
+
+       if (enable)
+               reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
+                     LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
+       else
+               reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
+                     LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
+
+       writel(reg, dp->reg_base + ANALOGIX_DP_LANE_MAP);
+}
+
+void analogix_dp_init_analog_param(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = TX_TERMINAL_CTRL_50_OHM;
+       writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_1);
+
+       reg = SEL_24M | TX_DVDD_BIT_1_0625V;
+       writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_2);
+
+       if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP)) {
+               writel(REF_CLK_24M, dp->reg_base + ANALOGIX_DP_PLL_REG_1);
+               writel(0x95, dp->reg_base + ANALOGIX_DP_PLL_REG_2);
+               writel(0x40, dp->reg_base + ANALOGIX_DP_PLL_REG_3);
+               writel(0x58, dp->reg_base + ANALOGIX_DP_PLL_REG_4);
+               writel(0x22, dp->reg_base + ANALOGIX_DP_PLL_REG_5);
+       }
+
+       reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
+       writel(reg, dp->reg_base + ANALOGIX_DP_ANALOG_CTL_3);
+
+       reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
+               TX_CUR1_2X | TX_CUR_16_MA;
+       writel(reg, dp->reg_base + ANALOGIX_DP_PLL_FILTER_CTL_1);
+
+       reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
+               CH1_AMP_400_MV | CH0_AMP_400_MV;
+       writel(reg, dp->reg_base + ANALOGIX_DP_TX_AMP_TUNING_CTL);
+}
+
+void analogix_dp_init_interrupt(struct analogix_dp_device *dp)
+{
+       /* Set interrupt pin assertion polarity as high */
+       writel(INT_POL1 | INT_POL0, dp->reg_base + ANALOGIX_DP_INT_CTL);
+
+       /* Clear pending regisers */
+       writel(0xff, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
+       writel(0x4f, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_2);
+       writel(0xe0, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_3);
+       writel(0xe7, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
+       writel(0x63, dp->reg_base + ANALOGIX_DP_INT_STA);
+
+       /* 0:mask,1: unmask */
+       writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
+       writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
+       writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
+       writel(0x00, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
+       writel(0x00, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+}
+
+void analogix_dp_reset(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       analogix_dp_stop_video(dp);
+       analogix_dp_enable_video_mute(dp, 0);
+
+       reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
+               AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
+               HDCP_FUNC_EN_N | SW_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
+
+       reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
+               SERDES_FIFO_FUNC_EN_N |
+               LS_CLK_DOMAIN_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+
+       usleep_range(20, 30);
+
+       analogix_dp_lane_swap(dp, 0);
+
+       writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
+       writel(0x40, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
+       writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+       writel(0x0, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+
+       writel(0x0, dp->reg_base + ANALOGIX_DP_PKT_SEND_CTL);
+       writel(0x0, dp->reg_base + ANALOGIX_DP_HDCP_CTL);
+
+       writel(0x5e, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_L);
+       writel(0x1a, dp->reg_base + ANALOGIX_DP_HPD_DEGLITCH_H);
+
+       writel(0x10, dp->reg_base + ANALOGIX_DP_LINK_DEBUG_CTL);
+
+       writel(0x0, dp->reg_base + ANALOGIX_DP_PHY_TEST);
+
+       writel(0x0, dp->reg_base + ANALOGIX_DP_VIDEO_FIFO_THRD);
+       writel(0x20, dp->reg_base + ANALOGIX_DP_AUDIO_MARGIN);
+
+       writel(0x4, dp->reg_base + ANALOGIX_DP_M_VID_GEN_FILTER_TH);
+       writel(0x2, dp->reg_base + ANALOGIX_DP_M_AUD_GEN_FILTER_TH);
+
+       writel(0x00000101, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+}
+
+void analogix_dp_swreset(struct analogix_dp_device *dp)
+{
+       writel(RESET_DP_TX, dp->reg_base + ANALOGIX_DP_TX_SW_RESET);
+}
+
+void analogix_dp_config_interrupt(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* 0: mask, 1: unmask */
+       reg = COMMON_INT_MASK_1;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_1);
+
+       reg = COMMON_INT_MASK_2;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_2);
+
+       reg = COMMON_INT_MASK_3;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_3);
+
+       reg = COMMON_INT_MASK_4;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
+
+       reg = INT_STA_MASK;
+       writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+}
+
+void analogix_dp_mute_hpd_interrupt(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* 0: mask, 1: unmask */
+       reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
+       reg &= ~COMMON_INT_MASK_4;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+       reg &= ~INT_STA_MASK;
+       writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+}
+
+void analogix_dp_unmute_hpd_interrupt(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* 0: mask, 1: unmask */
+       reg = COMMON_INT_MASK_4;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_MASK_4);
+
+       reg = INT_STA_MASK;
+       writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA_MASK);
+}
+
+enum pll_status analogix_dp_get_pll_lock_status(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
+       if (reg & PLL_LOCK)
+               return PLL_LOCKED;
+       else
+               return PLL_UNLOCKED;
+}
+
+void analogix_dp_set_pll_power_down(struct analogix_dp_device *dp, bool enable)
+{
+       u32 reg;
+
+       if (enable) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
+               reg |= DP_PLL_PD;
+               writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_PLL_CTL);
+               reg &= ~DP_PLL_PD;
+               writel(reg, dp->reg_base + ANALOGIX_DP_PLL_CTL);
+       }
+}
+
+void analogix_dp_set_analog_power_down(struct analogix_dp_device *dp,
+                                      enum analog_power_block block,
+                                      bool enable)
+{
+       u32 reg;
+       u32 phy_pd_addr = ANALOGIX_DP_PHY_PD;
+
+       if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP))
+               phy_pd_addr = ANALOGIX_DP_PD;
+
+       switch (block) {
+       case AUX_BLOCK:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= AUX_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~AUX_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case CH0_BLOCK:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= CH0_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~CH0_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case CH1_BLOCK:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= CH1_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~CH1_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case CH2_BLOCK:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= CH2_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~CH2_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case CH3_BLOCK:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= CH3_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~CH3_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case ANALOG_TOTAL:
+               if (enable) {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg |= DP_PHY_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       reg = readl(dp->reg_base + phy_pd_addr);
+                       reg &= ~DP_PHY_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       case POWER_ALL:
+               if (enable) {
+                       reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
+                               CH1_PD | CH0_PD;
+                       writel(reg, dp->reg_base + phy_pd_addr);
+               } else {
+                       writel(0x00, dp->reg_base + phy_pd_addr);
+               }
+               break;
+       default:
+               break;
+       }
+}
+
+void analogix_dp_init_analog_func(struct analogix_dp_device *dp)
+{
+       u32 reg;
+       int timeout_loop = 0;
+
+       analogix_dp_set_analog_power_down(dp, POWER_ALL, 0);
+
+       reg = PLL_LOCK_CHG;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
+       reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
+       writel(reg, dp->reg_base + ANALOGIX_DP_DEBUG_CTL);
+
+       /* Power up PLL */
+       if (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
+               analogix_dp_set_pll_power_down(dp, 0);
+
+               while (analogix_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
+                       timeout_loop++;
+                       if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
+                               dev_err(dp->dev, "failed to get pll lock status\n");
+                               return;
+                       }
+                       usleep_range(10, 20);
+               }
+       }
+
+       /* Enable Serdes FIFO function and Link symbol clock domain module */
+       reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+       reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
+               | AUX_FUNC_EN_N);
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+}
+
+void analogix_dp_clear_hotplug_interrupts(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       if (gpio_is_valid(dp->hpd_gpio))
+               return;
+
+       reg = HOTPLUG_CHG | HPD_LOST | PLUG;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
+
+       reg = INT_HPD;
+       writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
+}
+
+void analogix_dp_init_hpd(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       if (gpio_is_valid(dp->hpd_gpio))
+               return;
+
+       analogix_dp_clear_hotplug_interrupts(dp);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+       reg &= ~(F_HPD | HPD_CTRL);
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+}
+
+void analogix_dp_force_hpd(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+       reg = (F_HPD | HPD_CTRL);
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+}
+
+enum dp_irq_type analogix_dp_get_irq_type(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               reg = gpio_get_value(dp->hpd_gpio);
+               if (reg)
+                       return DP_IRQ_TYPE_HP_CABLE_IN;
+               else
+                       return DP_IRQ_TYPE_HP_CABLE_OUT;
+       } else {
+               /* Parse hotplug interrupt status register */
+               reg = readl(dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_4);
+
+               if (reg & PLUG)
+                       return DP_IRQ_TYPE_HP_CABLE_IN;
+
+               if (reg & HPD_LOST)
+                       return DP_IRQ_TYPE_HP_CABLE_OUT;
+
+               if (reg & HOTPLUG_CHG)
+                       return DP_IRQ_TYPE_HP_CHANGE;
+
+               return DP_IRQ_TYPE_UNKNOWN;
+       }
+}
+
+void analogix_dp_reset_aux(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* Disable AUX channel module */
+       reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+       reg |= AUX_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+}
+
+void analogix_dp_init_aux(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* Clear inerrupts related to AUX channel */
+       reg = RPLY_RECEIV | AUX_ERR;
+       writel(reg, dp->reg_base + ANALOGIX_DP_INT_STA);
+
+       analogix_dp_reset_aux(dp);
+
+       /* Disable AUX transaction H/W retry */
+       if (dp->plat_data && (dp->plat_data->dev_type == RK3288_DP))
+               reg = AUX_BIT_PERIOD_EXPECTED_DELAY(0) |
+                     AUX_HW_RETRY_COUNT_SEL(3) |
+                     AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
+       else
+               reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) |
+                     AUX_HW_RETRY_COUNT_SEL(0) |
+                     AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
+       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_HW_RETRY_CTL);
+
+       /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
+       reg = DEFER_CTRL_EN | DEFER_COUNT(1);
+       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_DEFER_CTL);
+
+       /* Enable AUX channel module */
+       reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+       reg &= ~AUX_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_2);
+}
+
+int analogix_dp_get_plug_in_status(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       if (gpio_is_valid(dp->hpd_gpio)) {
+               if (gpio_get_value(dp->hpd_gpio))
+                       return 0;
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+               if (reg & HPD_STATUS)
+                       return 0;
+       }
+
+       return -EINVAL;
+}
+
+void analogix_dp_enable_sw_function(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
+       reg &= ~SW_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
+}
+
+int analogix_dp_start_aux_transaction(struct analogix_dp_device *dp)
+{
+       int reg;
+       int retval = 0;
+       int timeout_loop = 0;
+
+       /* Enable AUX CH operation */
+       reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
+       reg |= AUX_EN;
+       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
+
+       /* Is AUX CH command reply received? */
+       reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
+       while (!(reg & RPLY_RECEIV)) {
+               timeout_loop++;
+               if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
+                       dev_err(dp->dev, "AUX CH command reply failed!\n");
+                       return -ETIMEDOUT;
+               }
+               reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
+               usleep_range(10, 11);
+       }
+
+       /* Clear interrupt source for AUX CH command reply */
+       writel(RPLY_RECEIV, dp->reg_base + ANALOGIX_DP_INT_STA);
+
+       /* Clear interrupt source for AUX CH access error */
+       reg = readl(dp->reg_base + ANALOGIX_DP_INT_STA);
+       if (reg & AUX_ERR) {
+               writel(AUX_ERR, dp->reg_base + ANALOGIX_DP_INT_STA);
+               return -EREMOTEIO;
+       }
+
+       /* Check AUX CH error access status */
+       reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_STA);
+       if ((reg & AUX_STATUS_MASK) != 0) {
+               dev_err(dp->dev, "AUX CH error happens: %d\n\n",
+                       reg & AUX_STATUS_MASK);
+               return -EREMOTEIO;
+       }
+
+       return retval;
+}
+
+int analogix_dp_write_byte_to_dpcd(struct analogix_dp_device *dp,
+                                  unsigned int reg_addr,
+                                  unsigned char data)
+{
+       u32 reg;
+       int i;
+       int retval;
+
+       for (i = 0; i < 3; i++) {
+               /* Clear AUX CH data buffer */
+               reg = BUF_CLR;
+               writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+               /* Select DPCD device address */
+               reg = AUX_ADDR_7_0(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
+               reg = AUX_ADDR_15_8(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
+               reg = AUX_ADDR_19_16(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
+
+               /* Write data buffer */
+               reg = (unsigned int)data;
+               writel(reg, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
+
+               /*
+                * Set DisplayPort transaction and write 1 byte
+                * If bit 3 is 1, DisplayPort transaction.
+                * If Bit 3 is 0, I2C transaction.
+                */
+               reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+               /* Start AUX transaction */
+               retval = analogix_dp_start_aux_transaction(dp);
+               if (retval == 0)
+                       break;
+
+               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
+       }
+
+       return retval;
+}
+
+int analogix_dp_read_byte_from_dpcd(struct analogix_dp_device *dp,
+                                   unsigned int reg_addr,
+                                   unsigned char *data)
+{
+       u32 reg;
+       int i;
+       int retval;
+
+       for (i = 0; i < 3; i++) {
+               /* Clear AUX CH data buffer */
+               reg = BUF_CLR;
+               writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+               /* Select DPCD device address */
+               reg = AUX_ADDR_7_0(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
+               reg = AUX_ADDR_15_8(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
+               reg = AUX_ADDR_19_16(reg_addr);
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
+
+               /*
+                * Set DisplayPort transaction and read 1 byte
+                * If bit 3 is 1, DisplayPort transaction.
+                * If Bit 3 is 0, I2C transaction.
+                */
+               reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+               /* Start AUX transaction */
+               retval = analogix_dp_start_aux_transaction(dp);
+               if (retval == 0)
+                       break;
+
+               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
+       }
+
+       /* Read data buffer */
+       reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
+       *data = (unsigned char)(reg & 0xff);
+
+       return retval;
+}
+
+int analogix_dp_write_bytes_to_dpcd(struct analogix_dp_device *dp,
+                                   unsigned int reg_addr,
+                                   unsigned int count,
+                                   unsigned char data[])
+{
+       u32 reg;
+       unsigned int start_offset;
+       unsigned int cur_data_count;
+       unsigned int cur_data_idx;
+       int i;
+       int retval = 0;
+
+       /* Clear AUX CH data buffer */
+       reg = BUF_CLR;
+       writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+       start_offset = 0;
+       while (start_offset < count) {
+               /* Buffer size of AUX CH is 16 * 4bytes */
+               if ((count - start_offset) > 16)
+                       cur_data_count = 16;
+               else
+                       cur_data_count = count - start_offset;
+
+               for (i = 0; i < 3; i++) {
+                       /* Select DPCD device address */
+                       reg = AUX_ADDR_7_0(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
+                       reg = AUX_ADDR_15_8(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
+                       reg = AUX_ADDR_19_16(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
+
+                       for (cur_data_idx = 0; cur_data_idx < cur_data_count;
+                            cur_data_idx++) {
+                               reg = data[start_offset + cur_data_idx];
+                               writel(reg, dp->reg_base +
+                                      ANALOGIX_DP_BUF_DATA_0 +
+                                      4 * cur_data_idx);
+                       }
+
+                       /*
+                        * Set DisplayPort transaction and write
+                        * If bit 3 is 1, DisplayPort transaction.
+                        * If Bit 3 is 0, I2C transaction.
+                        */
+                       reg = AUX_LENGTH(cur_data_count) |
+                               AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+                       /* Start AUX transaction */
+                       retval = analogix_dp_start_aux_transaction(dp);
+                       if (retval == 0)
+                               break;
+
+                       dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
+                               __func__);
+               }
+
+               start_offset += cur_data_count;
+       }
+
+       return retval;
+}
+
+int analogix_dp_read_bytes_from_dpcd(struct analogix_dp_device *dp,
+                                    unsigned int reg_addr,
+                                    unsigned int count,
+                                    unsigned char data[])
+{
+       u32 reg;
+       unsigned int start_offset;
+       unsigned int cur_data_count;
+       unsigned int cur_data_idx;
+       int i;
+       int retval = 0;
+
+       /* Clear AUX CH data buffer */
+       reg = BUF_CLR;
+       writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+       start_offset = 0;
+       while (start_offset < count) {
+               /* Buffer size of AUX CH is 16 * 4bytes */
+               if ((count - start_offset) > 16)
+                       cur_data_count = 16;
+               else
+                       cur_data_count = count - start_offset;
+
+               /* AUX CH Request Transaction process */
+               for (i = 0; i < 3; i++) {
+                       /* Select DPCD device address */
+                       reg = AUX_ADDR_7_0(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
+                       reg = AUX_ADDR_15_8(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
+                       reg = AUX_ADDR_19_16(reg_addr + start_offset);
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
+
+                       /*
+                        * Set DisplayPort transaction and read
+                        * If bit 3 is 1, DisplayPort transaction.
+                        * If Bit 3 is 0, I2C transaction.
+                        */
+                       reg = AUX_LENGTH(cur_data_count) |
+                               AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+                       /* Start AUX transaction */
+                       retval = analogix_dp_start_aux_transaction(dp);
+                       if (retval == 0)
+                               break;
+
+                       dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
+                               __func__);
+               }
+
+               for (cur_data_idx = 0; cur_data_idx < cur_data_count;
+                   cur_data_idx++) {
+                       reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
+                                                + 4 * cur_data_idx);
+                       data[start_offset + cur_data_idx] =
+                               (unsigned char)reg;
+               }
+
+               start_offset += cur_data_count;
+       }
+
+       return retval;
+}
+
+int analogix_dp_select_i2c_device(struct analogix_dp_device *dp,
+                                 unsigned int device_addr,
+                                 unsigned int reg_addr)
+{
+       u32 reg;
+       int retval;
+
+       /* Set EDID device address */
+       reg = device_addr;
+       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_ADDR_7_0);
+       writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_15_8);
+       writel(0x0, dp->reg_base + ANALOGIX_DP_AUX_ADDR_19_16);
+
+       /* Set offset from base address of EDID device */
+       writel(reg_addr, dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
+
+       /*
+        * Set I2C transaction and write address
+        * If bit 3 is 1, DisplayPort transaction.
+        * If Bit 3 is 0, I2C transaction.
+        */
+       reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
+               AUX_TX_COMM_WRITE;
+       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+       /* Start AUX transaction */
+       retval = analogix_dp_start_aux_transaction(dp);
+       if (retval != 0)
+               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
+
+       return retval;
+}
+
+int analogix_dp_read_byte_from_i2c(struct analogix_dp_device *dp,
+                                  unsigned int device_addr,
+                                  unsigned int reg_addr,
+                                  unsigned int *data)
+{
+       u32 reg;
+       int i;
+       int retval;
+
+       for (i = 0; i < 3; i++) {
+               /* Clear AUX CH data buffer */
+               reg = BUF_CLR;
+               writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+               /* Select EDID device */
+               retval = analogix_dp_select_i2c_device(dp, device_addr,
+                                                      reg_addr);
+               if (retval != 0)
+                       continue;
+
+               /*
+                * Set I2C transaction and read data
+                * If bit 3 is 1, DisplayPort transaction.
+                * If Bit 3 is 0, I2C transaction.
+                */
+               reg = AUX_TX_COMM_I2C_TRANSACTION |
+                       AUX_TX_COMM_READ;
+               writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_1);
+
+               /* Start AUX transaction */
+               retval = analogix_dp_start_aux_transaction(dp);
+               if (retval == 0)
+                       break;
+
+               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
+       }
+
+       /* Read data */
+       if (retval == 0)
+               *data = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0);
+
+       return retval;
+}
+
+int analogix_dp_read_bytes_from_i2c(struct analogix_dp_device *dp,
+                                   unsigned int device_addr,
+                                   unsigned int reg_addr,
+                                   unsigned int count,
+                                   unsigned char edid[])
+{
+       u32 reg;
+       unsigned int i, j;
+       unsigned int cur_data_idx;
+       unsigned int defer = 0;
+       int retval = 0;
+
+       for (i = 0; i < count; i += 16) {
+               for (j = 0; j < 3; j++) {
+                       /* Clear AUX CH data buffer */
+                       reg = BUF_CLR;
+                       writel(reg, dp->reg_base + ANALOGIX_DP_BUFFER_DATA_CTL);
+
+                       /* Set normal AUX CH command */
+                       reg = readl(dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
+                       reg &= ~ADDR_ONLY;
+                       writel(reg, dp->reg_base + ANALOGIX_DP_AUX_CH_CTL_2);
+
+                       /*
+                        * If Rx sends defer, Tx sends only reads
+                        * request without sending address
+                        */
+                       if (!defer)
+                               retval = analogix_dp_select_i2c_device(dp,
+                                               device_addr, reg_addr + i);
+                       else
+                               defer = 0;
+
+                       if (retval == 0) {
+                               /*
+                                * Set I2C transaction and write data
+                                * If bit 3 is 1, DisplayPort transaction.
+                                * If Bit 3 is 0, I2C transaction.
+                                */
+                               reg = AUX_LENGTH(16) |
+                                       AUX_TX_COMM_I2C_TRANSACTION |
+                                       AUX_TX_COMM_READ;
+                               writel(reg, dp->reg_base +
+                                       ANALOGIX_DP_AUX_CH_CTL_1);
+
+                               /* Start AUX transaction */
+                               retval = analogix_dp_start_aux_transaction(dp);
+                               if (retval == 0)
+                                       break;
+
+                               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
+                                       __func__);
+                       }
+                       /* Check if Rx sends defer */
+                       reg = readl(dp->reg_base + ANALOGIX_DP_AUX_RX_COMM);
+                       if (reg == AUX_RX_COMM_AUX_DEFER ||
+                           reg == AUX_RX_COMM_I2C_DEFER) {
+                               dev_err(dp->dev, "Defer: %d\n\n", reg);
+                               defer = 1;
+                       }
+               }
+
+               for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
+                       reg = readl(dp->reg_base + ANALOGIX_DP_BUF_DATA_0
+                                                + 4 * cur_data_idx);
+                       edid[i + cur_data_idx] = (unsigned char)reg;
+               }
+       }
+
+       return retval;
+}
+
+void analogix_dp_set_link_bandwidth(struct analogix_dp_device *dp, u32 bwtype)
+{
+       u32 reg;
+
+       reg = bwtype;
+       if ((bwtype == DP_LINK_BW_2_7) || (bwtype == DP_LINK_BW_1_62))
+               writel(reg, dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
+}
+
+void analogix_dp_get_link_bandwidth(struct analogix_dp_device *dp, u32 *bwtype)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LINK_BW_SET);
+       *bwtype = reg;
+}
+
+void analogix_dp_set_lane_count(struct analogix_dp_device *dp, u32 count)
+{
+       u32 reg;
+
+       reg = count;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
+}
+
+void analogix_dp_get_lane_count(struct analogix_dp_device *dp, u32 *count)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LANE_COUNT_SET);
+       *count = reg;
+}
+
+void analogix_dp_enable_enhanced_mode(struct analogix_dp_device *dp,
+                                     bool enable)
+{
+       u32 reg;
+
+       if (enable) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+               reg |= ENHANCED;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+               reg &= ~ENHANCED;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+       }
+}
+
+void analogix_dp_set_training_pattern(struct analogix_dp_device *dp,
+                                     enum pattern_set pattern)
+{
+       u32 reg;
+
+       switch (pattern) {
+       case PRBS7:
+               reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
+               writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+               break;
+       case D10_2:
+               reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
+               writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+               break;
+       case TRAINING_PTN1:
+               reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
+               writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+               break;
+       case TRAINING_PTN2:
+               reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
+               writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+               break;
+       case DP_NONE:
+               reg = SCRAMBLING_ENABLE |
+                       LINK_QUAL_PATTERN_SET_DISABLE |
+                       SW_TRAINING_PATTERN_SET_NORMAL;
+               writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+               break;
+       default:
+               break;
+       }
+}
+
+void analogix_dp_set_lane0_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
+       reg &= ~PRE_EMPHASIS_SET_MASK;
+       reg |= level << PRE_EMPHASIS_SET_SHIFT;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane1_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
+       reg &= ~PRE_EMPHASIS_SET_MASK;
+       reg |= level << PRE_EMPHASIS_SET_SHIFT;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane2_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
+       reg &= ~PRE_EMPHASIS_SET_MASK;
+       reg |= level << PRE_EMPHASIS_SET_SHIFT;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane3_pre_emphasis(struct analogix_dp_device *dp,
+                                       u32 level)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
+       reg &= ~PRE_EMPHASIS_SET_MASK;
+       reg |= level << PRE_EMPHASIS_SET_SHIFT;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane0_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane)
+{
+       u32 reg;
+
+       reg = training_lane;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane1_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane)
+{
+       u32 reg;
+
+       reg = training_lane;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane2_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane)
+{
+       u32 reg;
+
+       reg = training_lane;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
+}
+
+void analogix_dp_set_lane3_link_training(struct analogix_dp_device *dp,
+                                        u32 training_lane)
+{
+       u32 reg;
+
+       reg = training_lane;
+       writel(reg, dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
+}
+
+u32 analogix_dp_get_lane0_link_training(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN0_LINK_TRAINING_CTL);
+       return reg;
+}
+
+u32 analogix_dp_get_lane1_link_training(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN1_LINK_TRAINING_CTL);
+       return reg;
+}
+
+u32 analogix_dp_get_lane2_link_training(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN2_LINK_TRAINING_CTL);
+       return reg;
+}
+
+u32 analogix_dp_get_lane3_link_training(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_LN3_LINK_TRAINING_CTL);
+       return reg;
+}
+
+void analogix_dp_reset_macro(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_PHY_TEST);
+       reg |= MACRO_RST;
+       writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
+
+       /* 10 us is the minimum reset time. */
+       usleep_range(10, 20);
+
+       reg &= ~MACRO_RST;
+       writel(reg, dp->reg_base + ANALOGIX_DP_PHY_TEST);
+}
+
+void analogix_dp_init_video(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
+       writel(reg, dp->reg_base + ANALOGIX_DP_COMMON_INT_STA_1);
+
+       reg = 0x0;
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
+
+       reg = CHA_CRI(4) | CHA_CTRL;
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
+
+       reg = 0x0;
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+
+       reg = VID_HRES_TH(2) | VID_VRES_TH(0);
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_8);
+}
+
+void analogix_dp_set_video_color_format(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       /* Configure the input color depth, color space, dynamic range */
+       reg = (dp->video_info.dynamic_range << IN_D_RANGE_SHIFT) |
+               (dp->video_info.color_depth << IN_BPC_SHIFT) |
+               (dp->video_info.color_space << IN_COLOR_F_SHIFT);
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_2);
+
+       /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
+       reg &= ~IN_YC_COEFFI_MASK;
+       if (dp->video_info.ycbcr_coeff)
+               reg |= IN_YC_COEFFI_ITU709;
+       else
+               reg |= IN_YC_COEFFI_ITU601;
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_3);
+}
+
+int analogix_dp_is_slave_video_stream_clock_on(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_1);
+
+       if (!(reg & DET_STA)) {
+               dev_dbg(dp->dev, "Input stream clock not detected.\n");
+               return -EINVAL;
+       }
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_2);
+       dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
+
+       if (reg & CHA_STA) {
+               dev_dbg(dp->dev, "Input stream clk is changing\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+void analogix_dp_set_video_cr_mn(struct analogix_dp_device *dp,
+                                enum clock_recovery_m_value_type type,
+                                u32 m_value, u32 n_value)
+{
+       u32 reg;
+
+       if (type == REGISTER_M) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+               reg |= FIX_M_VID;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+               reg = m_value & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_0);
+               reg = (m_value >> 8) & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_1);
+               reg = (m_value >> 16) & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_M_VID_2);
+
+               reg = n_value & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_0);
+               reg = (n_value >> 8) & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_1);
+               reg = (n_value >> 16) & 0xff;
+               writel(reg, dp->reg_base + ANALOGIX_DP_N_VID_2);
+       } else  {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+               reg &= ~FIX_M_VID;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_4);
+
+               writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_0);
+               writel(0x80, dp->reg_base + ANALOGIX_DP_N_VID_1);
+               writel(0x00, dp->reg_base + ANALOGIX_DP_N_VID_2);
+       }
+}
+
+void analogix_dp_set_video_timing_mode(struct analogix_dp_device *dp, u32 type)
+{
+       u32 reg;
+
+       if (type == VIDEO_TIMING_FROM_CAPTURE) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+               reg &= ~FORMAT_SEL;
+               writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+               reg |= FORMAT_SEL;
+               writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+       }
+}
+
+void analogix_dp_enable_video_master(struct analogix_dp_device *dp, bool enable)
+{
+       u32 reg;
+
+       if (enable) {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+               reg &= ~VIDEO_MODE_MASK;
+               reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+       } else {
+               reg = readl(dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+               reg &= ~VIDEO_MODE_MASK;
+               reg |= VIDEO_MODE_SLAVE_MODE;
+               writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+       }
+}
+
+void analogix_dp_start_video(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+       reg |= VIDEO_EN;
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_1);
+}
+
+int analogix_dp_is_video_stream_on(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+       writel(reg, dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_SYS_CTL_3);
+       if (!(reg & STRM_VALID)) {
+               dev_dbg(dp->dev, "Input video stream is not detected.\n");
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+void analogix_dp_config_video_slave_mode(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
+       reg &= ~(MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N);
+       reg |= MASTER_VID_FUNC_EN_N;
+       writel(reg, dp->reg_base + ANALOGIX_DP_FUNC_EN_1);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+       reg &= ~INTERACE_SCAN_CFG;
+       reg |= (dp->video_info.interlaced << 2);
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+       reg &= ~VSYNC_POLARITY_CFG;
+       reg |= (dp->video_info.v_sync_polarity << 1);
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+       reg &= ~HSYNC_POLARITY_CFG;
+       reg |= (dp->video_info.h_sync_polarity << 0);
+       writel(reg, dp->reg_base + ANALOGIX_DP_VIDEO_CTL_10);
+
+       reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
+       writel(reg, dp->reg_base + ANALOGIX_DP_SOC_GENERAL_CTL);
+}
+
+void analogix_dp_enable_scrambling(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+       reg &= ~SCRAMBLING_DISABLE;
+       writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+}
+
+void analogix_dp_disable_scrambling(struct analogix_dp_device *dp)
+{
+       u32 reg;
+
+       reg = readl(dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+       reg |= SCRAMBLING_DISABLE;
+       writel(reg, dp->reg_base + ANALOGIX_DP_TRAINING_PTN_SET);
+}
similarity index 62%
rename from drivers/gpu/drm/exynos/exynos_dp_reg.h
rename to drivers/gpu/drm/bridge/analogix/analogix_dp_reg.h
index 2e9bd0e0b9f2e1fc722b6c9ca0db4708f8cd4898..337912b0aeabc9382f9ffdbd546ecddba1b691da 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Register definition file for Samsung DP driver
+ * Register definition file for Analogix DP core driver
  *
  * Copyright (C) 2012 Samsung Electronics Co., Ltd.
  * Author: Jingoo Han <jg1.han@samsung.com>
  * published by the Free Software Foundation.
  */
 
-#ifndef _EXYNOS_DP_REG_H
-#define _EXYNOS_DP_REG_H
-
-#define EXYNOS_DP_TX_SW_RESET                  0x14
-#define EXYNOS_DP_FUNC_EN_1                    0x18
-#define EXYNOS_DP_FUNC_EN_2                    0x1C
-#define EXYNOS_DP_VIDEO_CTL_1                  0x20
-#define EXYNOS_DP_VIDEO_CTL_2                  0x24
-#define EXYNOS_DP_VIDEO_CTL_3                  0x28
-
-#define EXYNOS_DP_VIDEO_CTL_8                  0x3C
-#define EXYNOS_DP_VIDEO_CTL_10                 0x44
-
-#define EXYNOS_DP_LANE_MAP                     0x35C
-
-#define EXYNOS_DP_ANALOG_CTL_1                 0x370
-#define EXYNOS_DP_ANALOG_CTL_2                 0x374
-#define EXYNOS_DP_ANALOG_CTL_3                 0x378
-#define EXYNOS_DP_PLL_FILTER_CTL_1             0x37C
-#define EXYNOS_DP_TX_AMP_TUNING_CTL            0x380
-
-#define EXYNOS_DP_AUX_HW_RETRY_CTL             0x390
-
-#define EXYNOS_DP_COMMON_INT_STA_1             0x3C4
-#define EXYNOS_DP_COMMON_INT_STA_2             0x3C8
-#define EXYNOS_DP_COMMON_INT_STA_3             0x3CC
-#define EXYNOS_DP_COMMON_INT_STA_4             0x3D0
-#define EXYNOS_DP_INT_STA                      0x3DC
-#define EXYNOS_DP_COMMON_INT_MASK_1            0x3E0
-#define EXYNOS_DP_COMMON_INT_MASK_2            0x3E4
-#define EXYNOS_DP_COMMON_INT_MASK_3            0x3E8
-#define EXYNOS_DP_COMMON_INT_MASK_4            0x3EC
-#define EXYNOS_DP_INT_STA_MASK                 0x3F8
-#define EXYNOS_DP_INT_CTL                      0x3FC
-
-#define EXYNOS_DP_SYS_CTL_1                    0x600
-#define EXYNOS_DP_SYS_CTL_2                    0x604
-#define EXYNOS_DP_SYS_CTL_3                    0x608
-#define EXYNOS_DP_SYS_CTL_4                    0x60C
-
-#define EXYNOS_DP_PKT_SEND_CTL                 0x640
-#define EXYNOS_DP_HDCP_CTL                     0x648
-
-#define EXYNOS_DP_LINK_BW_SET                  0x680
-#define EXYNOS_DP_LANE_COUNT_SET               0x684
-#define EXYNOS_DP_TRAINING_PTN_SET             0x688
-#define EXYNOS_DP_LN0_LINK_TRAINING_CTL                0x68C
-#define EXYNOS_DP_LN1_LINK_TRAINING_CTL                0x690
-#define EXYNOS_DP_LN2_LINK_TRAINING_CTL                0x694
-#define EXYNOS_DP_LN3_LINK_TRAINING_CTL                0x698
-
-#define EXYNOS_DP_DEBUG_CTL                    0x6C0
-#define EXYNOS_DP_HPD_DEGLITCH_L               0x6C4
-#define EXYNOS_DP_HPD_DEGLITCH_H               0x6C8
-#define EXYNOS_DP_LINK_DEBUG_CTL               0x6E0
-
-#define EXYNOS_DP_M_VID_0                      0x700
-#define EXYNOS_DP_M_VID_1                      0x704
-#define EXYNOS_DP_M_VID_2                      0x708
-#define EXYNOS_DP_N_VID_0                      0x70C
-#define EXYNOS_DP_N_VID_1                      0x710
-#define EXYNOS_DP_N_VID_2                      0x714
-
-#define EXYNOS_DP_PLL_CTL                      0x71C
-#define EXYNOS_DP_PHY_PD                       0x720
-#define EXYNOS_DP_PHY_TEST                     0x724
-
-#define EXYNOS_DP_VIDEO_FIFO_THRD              0x730
-#define EXYNOS_DP_AUDIO_MARGIN                 0x73C
-
-#define EXYNOS_DP_M_VID_GEN_FILTER_TH          0x764
-#define EXYNOS_DP_M_AUD_GEN_FILTER_TH          0x778
-#define EXYNOS_DP_AUX_CH_STA                   0x780
-#define EXYNOS_DP_AUX_CH_DEFER_CTL             0x788
-#define EXYNOS_DP_AUX_RX_COMM                  0x78C
-#define EXYNOS_DP_BUFFER_DATA_CTL              0x790
-#define EXYNOS_DP_AUX_CH_CTL_1                 0x794
-#define EXYNOS_DP_AUX_ADDR_7_0                 0x798
-#define EXYNOS_DP_AUX_ADDR_15_8                        0x79C
-#define EXYNOS_DP_AUX_ADDR_19_16               0x7A0
-#define EXYNOS_DP_AUX_CH_CTL_2                 0x7A4
-
-#define EXYNOS_DP_BUF_DATA_0                   0x7C0
-
-#define EXYNOS_DP_SOC_GENERAL_CTL              0x800
-
-/* EXYNOS_DP_TX_SW_RESET */
+#ifndef _ANALOGIX_DP_REG_H
+#define _ANALOGIX_DP_REG_H
+
+#define ANALOGIX_DP_TX_SW_RESET                        0x14
+#define ANALOGIX_DP_FUNC_EN_1                  0x18
+#define ANALOGIX_DP_FUNC_EN_2                  0x1C
+#define ANALOGIX_DP_VIDEO_CTL_1                        0x20
+#define ANALOGIX_DP_VIDEO_CTL_2                        0x24
+#define ANALOGIX_DP_VIDEO_CTL_3                        0x28
+
+#define ANALOGIX_DP_VIDEO_CTL_8                        0x3C
+#define ANALOGIX_DP_VIDEO_CTL_10               0x44
+
+#define ANALOGIX_DP_PLL_REG_1                  0xfc
+#define ANALOGIX_DP_PLL_REG_2                  0x9e4
+#define ANALOGIX_DP_PLL_REG_3                  0x9e8
+#define ANALOGIX_DP_PLL_REG_4                  0x9ec
+#define ANALOGIX_DP_PLL_REG_5                  0xa00
+
+#define ANALOGIX_DP_PD                         0x12c
+
+#define ANALOGIX_DP_LANE_MAP                   0x35C
+
+#define ANALOGIX_DP_ANALOG_CTL_1               0x370
+#define ANALOGIX_DP_ANALOG_CTL_2               0x374
+#define ANALOGIX_DP_ANALOG_CTL_3               0x378
+#define ANALOGIX_DP_PLL_FILTER_CTL_1           0x37C
+#define ANALOGIX_DP_TX_AMP_TUNING_CTL          0x380
+
+#define ANALOGIX_DP_AUX_HW_RETRY_CTL           0x390
+
+#define ANALOGIX_DP_COMMON_INT_STA_1           0x3C4
+#define ANALOGIX_DP_COMMON_INT_STA_2           0x3C8
+#define ANALOGIX_DP_COMMON_INT_STA_3           0x3CC
+#define ANALOGIX_DP_COMMON_INT_STA_4           0x3D0
+#define ANALOGIX_DP_INT_STA                    0x3DC
+#define ANALOGIX_DP_COMMON_INT_MASK_1          0x3E0
+#define ANALOGIX_DP_COMMON_INT_MASK_2          0x3E4
+#define ANALOGIX_DP_COMMON_INT_MASK_3          0x3E8
+#define ANALOGIX_DP_COMMON_INT_MASK_4          0x3EC
+#define ANALOGIX_DP_INT_STA_MASK               0x3F8
+#define ANALOGIX_DP_INT_CTL                    0x3FC
+
+#define ANALOGIX_DP_SYS_CTL_1                  0x600
+#define ANALOGIX_DP_SYS_CTL_2                  0x604
+#define ANALOGIX_DP_SYS_CTL_3                  0x608
+#define ANALOGIX_DP_SYS_CTL_4                  0x60C
+
+#define ANALOGIX_DP_PKT_SEND_CTL               0x640
+#define ANALOGIX_DP_HDCP_CTL                   0x648
+
+#define ANALOGIX_DP_LINK_BW_SET                        0x680
+#define ANALOGIX_DP_LANE_COUNT_SET             0x684
+#define ANALOGIX_DP_TRAINING_PTN_SET           0x688
+#define ANALOGIX_DP_LN0_LINK_TRAINING_CTL      0x68C
+#define ANALOGIX_DP_LN1_LINK_TRAINING_CTL      0x690
+#define ANALOGIX_DP_LN2_LINK_TRAINING_CTL      0x694
+#define ANALOGIX_DP_LN3_LINK_TRAINING_CTL      0x698
+
+#define ANALOGIX_DP_DEBUG_CTL                  0x6C0
+#define ANALOGIX_DP_HPD_DEGLITCH_L             0x6C4
+#define ANALOGIX_DP_HPD_DEGLITCH_H             0x6C8
+#define ANALOGIX_DP_LINK_DEBUG_CTL             0x6E0
+
+#define ANALOGIX_DP_M_VID_0                    0x700
+#define ANALOGIX_DP_M_VID_1                    0x704
+#define ANALOGIX_DP_M_VID_2                    0x708
+#define ANALOGIX_DP_N_VID_0                    0x70C
+#define ANALOGIX_DP_N_VID_1                    0x710
+#define ANALOGIX_DP_N_VID_2                    0x714
+
+#define ANALOGIX_DP_PLL_CTL                    0x71C
+#define ANALOGIX_DP_PHY_PD                     0x720
+#define ANALOGIX_DP_PHY_TEST                   0x724
+
+#define ANALOGIX_DP_VIDEO_FIFO_THRD            0x730
+#define ANALOGIX_DP_AUDIO_MARGIN               0x73C
+
+#define ANALOGIX_DP_M_VID_GEN_FILTER_TH                0x764
+#define ANALOGIX_DP_M_AUD_GEN_FILTER_TH                0x778
+#define ANALOGIX_DP_AUX_CH_STA                 0x780
+#define ANALOGIX_DP_AUX_CH_DEFER_CTL           0x788
+#define ANALOGIX_DP_AUX_RX_COMM                        0x78C
+#define ANALOGIX_DP_BUFFER_DATA_CTL            0x790
+#define ANALOGIX_DP_AUX_CH_CTL_1               0x794
+#define ANALOGIX_DP_AUX_ADDR_7_0               0x798
+#define ANALOGIX_DP_AUX_ADDR_15_8              0x79C
+#define ANALOGIX_DP_AUX_ADDR_19_16             0x7A0
+#define ANALOGIX_DP_AUX_CH_CTL_2               0x7A4
+
+#define ANALOGIX_DP_BUF_DATA_0                 0x7C0
+
+#define ANALOGIX_DP_SOC_GENERAL_CTL            0x800
+
+/* ANALOGIX_DP_TX_SW_RESET */
 #define RESET_DP_TX                            (0x1 << 0)
 
-/* EXYNOS_DP_FUNC_EN_1 */
+/* ANALOGIX_DP_FUNC_EN_1 */
 #define MASTER_VID_FUNC_EN_N                   (0x1 << 7)
 #define SLAVE_VID_FUNC_EN_N                    (0x1 << 5)
 #define AUD_FIFO_FUNC_EN_N                     (0x1 << 4)
 #define CRC_FUNC_EN_N                          (0x1 << 1)
 #define SW_FUNC_EN_N                           (0x1 << 0)
 
-/* EXYNOS_DP_FUNC_EN_2 */
+/* ANALOGIX_DP_FUNC_EN_2 */
 #define SSC_FUNC_EN_N                          (0x1 << 7)
 #define AUX_FUNC_EN_N                          (0x1 << 2)
 #define SERDES_FIFO_FUNC_EN_N                  (0x1 << 1)
 #define LS_CLK_DOMAIN_FUNC_EN_N                        (0x1 << 0)
 
-/* EXYNOS_DP_VIDEO_CTL_1 */
+/* ANALOGIX_DP_VIDEO_CTL_1 */
 #define VIDEO_EN                               (0x1 << 7)
 #define HDCP_VIDEO_MUTE                                (0x1 << 6)
 
-/* EXYNOS_DP_VIDEO_CTL_1 */
+/* ANALOGIX_DP_VIDEO_CTL_1 */
 #define IN_D_RANGE_MASK                                (0x1 << 7)
 #define IN_D_RANGE_SHIFT                       (7)
 #define IN_D_RANGE_CEA                         (0x1 << 7)
 #define IN_COLOR_F_YCBCR422                    (0x1 << 0)
 #define IN_COLOR_F_RGB                         (0x0 << 0)
 
-/* EXYNOS_DP_VIDEO_CTL_3 */
+/* ANALOGIX_DP_VIDEO_CTL_3 */
 #define IN_YC_COEFFI_MASK                      (0x1 << 7)
 #define IN_YC_COEFFI_SHIFT                     (7)
 #define IN_YC_COEFFI_ITU709                    (0x1 << 7)
 #define VID_CHK_UPDATE_TYPE_1                  (0x1 << 4)
 #define VID_CHK_UPDATE_TYPE_0                  (0x0 << 4)
 
-/* EXYNOS_DP_VIDEO_CTL_8 */
+/* ANALOGIX_DP_VIDEO_CTL_8 */
 #define VID_HRES_TH(x)                         (((x) & 0xf) << 4)
 #define VID_VRES_TH(x)                         (((x) & 0xf) << 0)
 
-/* EXYNOS_DP_VIDEO_CTL_10 */
+/* ANALOGIX_DP_VIDEO_CTL_10 */
 #define FORMAT_SEL                             (0x1 << 4)
 #define INTERACE_SCAN_CFG                      (0x1 << 2)
 #define VSYNC_POLARITY_CFG                     (0x1 << 1)
 #define HSYNC_POLARITY_CFG                     (0x1 << 0)
 
-/* EXYNOS_DP_LANE_MAP */
+/* ANALOGIX_DP_PLL_REG_1 */
+#define REF_CLK_24M                            (0x1 << 1)
+#define REF_CLK_27M                            (0x0 << 1)
+
+/* ANALOGIX_DP_LANE_MAP */
 #define LANE3_MAP_LOGIC_LANE_0                 (0x0 << 6)
 #define LANE3_MAP_LOGIC_LANE_1                 (0x1 << 6)
 #define LANE3_MAP_LOGIC_LANE_2                 (0x2 << 6)
 #define LANE0_MAP_LOGIC_LANE_2                 (0x2 << 0)
 #define LANE0_MAP_LOGIC_LANE_3                 (0x3 << 0)
 
-/* EXYNOS_DP_ANALOG_CTL_1 */
+/* ANALOGIX_DP_ANALOG_CTL_1 */
 #define TX_TERMINAL_CTRL_50_OHM                        (0x1 << 4)
 
-/* EXYNOS_DP_ANALOG_CTL_2 */
+/* ANALOGIX_DP_ANALOG_CTL_2 */
 #define SEL_24M                                        (0x1 << 3)
 #define TX_DVDD_BIT_1_0625V                    (0x4 << 0)
 
-/* EXYNOS_DP_ANALOG_CTL_3 */
+/* ANALOGIX_DP_ANALOG_CTL_3 */
 #define DRIVE_DVDD_BIT_1_0625V                 (0x4 << 5)
 #define VCO_BIT_600_MICRO                      (0x5 << 0)
 
-/* EXYNOS_DP_PLL_FILTER_CTL_1 */
+/* ANALOGIX_DP_PLL_FILTER_CTL_1 */
 #define PD_RING_OSC                            (0x1 << 6)
 #define AUX_TERMINAL_CTRL_50_OHM               (0x2 << 4)
 #define TX_CUR1_2X                             (0x1 << 2)
 #define TX_CUR_16_MA                           (0x3 << 0)
 
-/* EXYNOS_DP_TX_AMP_TUNING_CTL */
+/* ANALOGIX_DP_TX_AMP_TUNING_CTL */
 #define CH3_AMP_400_MV                         (0x0 << 24)
 #define CH2_AMP_400_MV                         (0x0 << 16)
 #define CH1_AMP_400_MV                         (0x0 << 8)
 #define CH0_AMP_400_MV                         (0x0 << 0)
 
-/* EXYNOS_DP_AUX_HW_RETRY_CTL */
+/* ANALOGIX_DP_AUX_HW_RETRY_CTL */
 #define AUX_BIT_PERIOD_EXPECTED_DELAY(x)       (((x) & 0x7) << 8)
 #define AUX_HW_RETRY_INTERVAL_MASK             (0x3 << 3)
 #define AUX_HW_RETRY_INTERVAL_600_MICROSECONDS (0x0 << 3)
 #define AUX_HW_RETRY_INTERVAL_1800_MICROSECONDS        (0x3 << 3)
 #define AUX_HW_RETRY_COUNT_SEL(x)              (((x) & 0x7) << 0)
 
-/* EXYNOS_DP_COMMON_INT_STA_1 */
+/* ANALOGIX_DP_COMMON_INT_STA_1 */
 #define VSYNC_DET                              (0x1 << 7)
 #define PLL_LOCK_CHG                           (0x1 << 6)
 #define SPDIF_ERR                              (0x1 << 5)
 #define VID_CLK_CHG                            (0x1 << 1)
 #define SW_INT                                 (0x1 << 0)
 
-/* EXYNOS_DP_COMMON_INT_STA_2 */
+/* ANALOGIX_DP_COMMON_INT_STA_2 */
 #define ENC_EN_CHG                             (0x1 << 6)
 #define HW_BKSV_RDY                            (0x1 << 3)
 #define HW_SHA_DONE                            (0x1 << 2)
 #define HW_AUTH_STATE_CHG                      (0x1 << 1)
 #define HW_AUTH_DONE                           (0x1 << 0)
 
-/* EXYNOS_DP_COMMON_INT_STA_3 */
+/* ANALOGIX_DP_COMMON_INT_STA_3 */
 #define AFIFO_UNDER                            (0x1 << 7)
 #define AFIFO_OVER                             (0x1 << 6)
 #define R0_CHK_FLAG                            (0x1 << 5)
 
-/* EXYNOS_DP_COMMON_INT_STA_4 */
+/* ANALOGIX_DP_COMMON_INT_STA_4 */
 #define PSR_ACTIVE                             (0x1 << 7)
 #define PSR_INACTIVE                           (0x1 << 6)
 #define SPDIF_BI_PHASE_ERR                     (0x1 << 5)
 #define HPD_LOST                               (0x1 << 1)
 #define PLUG                                   (0x1 << 0)
 
-/* EXYNOS_DP_INT_STA */
+/* ANALOGIX_DP_INT_STA */
 #define INT_HPD                                        (0x1 << 6)
 #define HW_TRAINING_FINISH                     (0x1 << 5)
 #define RPLY_RECEIV                            (0x1 << 1)
 #define AUX_ERR                                        (0x1 << 0)
 
-/* EXYNOS_DP_INT_CTL */
+/* ANALOGIX_DP_INT_CTL */
 #define SOFT_INT_CTRL                          (0x1 << 2)
 #define INT_POL1                               (0x1 << 1)
 #define INT_POL0                               (0x1 << 0)
 
-/* EXYNOS_DP_SYS_CTL_1 */
+/* ANALOGIX_DP_SYS_CTL_1 */
 #define DET_STA                                        (0x1 << 2)
 #define FORCE_DET                              (0x1 << 1)
 #define DET_CTRL                               (0x1 << 0)
 
-/* EXYNOS_DP_SYS_CTL_2 */
+/* ANALOGIX_DP_SYS_CTL_2 */
 #define CHA_CRI(x)                             (((x) & 0xf) << 4)
 #define CHA_STA                                        (0x1 << 2)
 #define FORCE_CHA                              (0x1 << 1)
 #define CHA_CTRL                               (0x1 << 0)
 
-/* EXYNOS_DP_SYS_CTL_3 */
+/* ANALOGIX_DP_SYS_CTL_3 */
 #define HPD_STATUS                             (0x1 << 6)
 #define F_HPD                                  (0x1 << 5)
 #define HPD_CTRL                               (0x1 << 4)
 #define F_VALID                                        (0x1 << 1)
 #define VALID_CTRL                             (0x1 << 0)
 
-/* EXYNOS_DP_SYS_CTL_4 */
+/* ANALOGIX_DP_SYS_CTL_4 */
 #define FIX_M_AUD                              (0x1 << 4)
 #define ENHANCED                               (0x1 << 3)
 #define FIX_M_VID                              (0x1 << 2)
 #define M_VID_UPDATE_CTRL                      (0x3 << 0)
 
-/* EXYNOS_DP_TRAINING_PTN_SET */
+/* ANALOGIX_DP_TRAINING_PTN_SET */
 #define SCRAMBLER_TYPE                         (0x1 << 9)
 #define HW_LINK_TRAINING_PATTERN               (0x1 << 8)
 #define SCRAMBLING_DISABLE                     (0x1 << 5)
 #define SW_TRAINING_PATTERN_SET_PTN1           (0x1 << 0)
 #define SW_TRAINING_PATTERN_SET_NORMAL         (0x0 << 0)
 
-/* EXYNOS_DP_LN0_LINK_TRAINING_CTL */
+/* ANALOGIX_DP_LN0_LINK_TRAINING_CTL */
 #define PRE_EMPHASIS_SET_MASK                  (0x3 << 3)
 #define PRE_EMPHASIS_SET_SHIFT                 (3)
 
-/* EXYNOS_DP_DEBUG_CTL */
+/* ANALOGIX_DP_DEBUG_CTL */
 #define PLL_LOCK                               (0x1 << 4)
 #define F_PLL_LOCK                             (0x1 << 3)
 #define PLL_LOCK_CTRL                          (0x1 << 2)
 #define PN_INV                                 (0x1 << 0)
 
-/* EXYNOS_DP_PLL_CTL */
+/* ANALOGIX_DP_PLL_CTL */
 #define DP_PLL_PD                              (0x1 << 7)
 #define DP_PLL_RESET                           (0x1 << 6)
 #define DP_PLL_LOOP_BIT_DEFAULT                        (0x1 << 4)
 #define DP_PLL_REF_BIT_1_1250V                 (0x5 << 0)
 #define DP_PLL_REF_BIT_1_2500V                 (0x7 << 0)
 
-/* EXYNOS_DP_PHY_PD */
+/* ANALOGIX_DP_PHY_PD */
 #define DP_PHY_PD                              (0x1 << 5)
 #define AUX_PD                                 (0x1 << 4)
 #define CH3_PD                                 (0x1 << 3)
 #define CH1_PD                                 (0x1 << 1)
 #define CH0_PD                                 (0x1 << 0)
 
-/* EXYNOS_DP_PHY_TEST */
+/* ANALOGIX_DP_PHY_TEST */
 #define MACRO_RST                              (0x1 << 5)
 #define CH1_TEST                               (0x1 << 1)
 #define CH0_TEST                               (0x1 << 0)
 
-/* EXYNOS_DP_AUX_CH_STA */
+/* ANALOGIX_DP_AUX_CH_STA */
 #define AUX_BUSY                               (0x1 << 4)
 #define AUX_STATUS_MASK                                (0xf << 0)
 
-/* EXYNOS_DP_AUX_CH_DEFER_CTL */
+/* ANALOGIX_DP_AUX_CH_DEFER_CTL */
 #define DEFER_CTRL_EN                          (0x1 << 7)
 #define DEFER_COUNT(x)                         (((x) & 0x7f) << 0)
 
-/* EXYNOS_DP_AUX_RX_COMM */
+/* ANALOGIX_DP_AUX_RX_COMM */
 #define AUX_RX_COMM_I2C_DEFER                  (0x2 << 2)
 #define AUX_RX_COMM_AUX_DEFER                  (0x2 << 0)
 
-/* EXYNOS_DP_BUFFER_DATA_CTL */
+/* ANALOGIX_DP_BUFFER_DATA_CTL */
 #define BUF_CLR                                        (0x1 << 7)
 #define BUF_DATA_COUNT(x)                      (((x) & 0x1f) << 0)
 
-/* EXYNOS_DP_AUX_CH_CTL_1 */
+/* ANALOGIX_DP_AUX_CH_CTL_1 */
 #define AUX_LENGTH(x)                          (((x - 1) & 0xf) << 4)
 #define AUX_TX_COMM_MASK                       (0xf << 0)
 #define AUX_TX_COMM_DP_TRANSACTION             (0x1 << 3)
 #define AUX_TX_COMM_WRITE                      (0x0 << 0)
 #define AUX_TX_COMM_READ                       (0x1 << 0)
 
-/* EXYNOS_DP_AUX_ADDR_7_0 */
+/* ANALOGIX_DP_AUX_ADDR_7_0 */
 #define AUX_ADDR_7_0(x)                                (((x) >> 0) & 0xff)
 
-/* EXYNOS_DP_AUX_ADDR_15_8 */
+/* ANALOGIX_DP_AUX_ADDR_15_8 */
 #define AUX_ADDR_15_8(x)                       (((x) >> 8) & 0xff)
 
-/* EXYNOS_DP_AUX_ADDR_19_16 */
+/* ANALOGIX_DP_AUX_ADDR_19_16 */
 #define AUX_ADDR_19_16(x)                      (((x) >> 16) & 0x0f)
 
-/* EXYNOS_DP_AUX_CH_CTL_2 */
+/* ANALOGIX_DP_AUX_CH_CTL_2 */
 #define ADDR_ONLY                              (0x1 << 1)
 #define AUX_EN                                 (0x1 << 0)
 
-/* EXYNOS_DP_SOC_GENERAL_CTL */
+/* ANALOGIX_DP_SOC_GENERAL_CTL */
 #define AUDIO_MODE_SPDIF_MODE                  (0x1 << 8)
 #define AUDIO_MODE_MASTER_MODE                 (0x0 << 8)
 #define MASTER_VIDEO_INTERLACE_EN              (0x1 << 4)
 #define VIDEO_MODE_SLAVE_MODE                  (0x1 << 0)
 #define VIDEO_MODE_MASTER_MODE                 (0x0 << 0)
 
-#endif /* _EXYNOS_DP_REG_H */
+#endif /* _ANALOGIX_DP_REG_H */
index 9795b72472babc1a39c084fb69562ca7ac636e06..c9d941283d309a847d9a1f4a4708c91f5e7063f0 100644 (file)
@@ -1413,11 +1413,6 @@ static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
        mutex_unlock(&hdmi->mutex);
 }
 
-static void dw_hdmi_bridge_nop(struct drm_bridge *bridge)
-{
-       /* do nothing */
-}
-
 static enum drm_connector_status
 dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
 {
@@ -1536,8 +1531,6 @@ static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs =
 static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
        .enable = dw_hdmi_bridge_enable,
        .disable = dw_hdmi_bridge_disable,
-       .pre_enable = dw_hdmi_bridge_nop,
-       .post_disable = dw_hdmi_bridge_nop,
        .mode_set = dw_hdmi_bridge_mode_set,
 };
 
index 7bc394ec9fb3af7985ab746eeb3b9f1d020a852e..dc83f69da6f1c6513cc797ac0776ce24e3d0ba9a 100644 (file)
@@ -163,10 +163,8 @@ static struct pci_driver cirrus_pci_driver = {
 
 static int __init cirrus_init(void)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && cirrus_modeset == -1)
                return -EINVAL;
-#endif
 
        if (cirrus_modeset == 0)
                return -EINVAL;
index b774d637a00f8a020bce2018c31dd42f69744b25..2188d6b61b3ead5c2ad712ba60082d9d1327b348 100644 (file)
@@ -245,7 +245,7 @@ static inline int cirrus_bo_reserve(struct cirrus_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index 0907715e90fdad228091e8c34efa3fcec58f7784..32d32c5b7b17448bdb252301d5cea65f3e3cacbf 100644 (file)
@@ -61,7 +61,7 @@ cirrus_user_framebuffer_create(struct drm_device *dev,
                                      bpp, mode_cmd->pitches[0]))
                return ERR_PTR(-EINVAL);
 
-       obj = drm_gem_object_lookup(dev, filp, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
@@ -295,7 +295,7 @@ cirrus_dumb_mmap_offset(struct drm_file *file,
        struct drm_gem_object *obj;
        struct cirrus_bo *bo;
 
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL)
                return -ENOENT;
 
index dfffd528517a53b1783e8f5c22d1f622d1e7d537..6768b7b1af32d98bc26c259870ac471983e4a62d 100644 (file)
@@ -245,6 +245,8 @@ struct ttm_bo_driver cirrus_bo_driver = {
        .verify_access = cirrus_bo_verify_access,
        .io_mem_reserve = &cirrus_ttm_io_mem_reserve,
        .io_mem_free = &cirrus_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int cirrus_mm_init(struct cirrus_device *cirrus)
index a10ea6aec6291f4c233a0b1d49a12fcbace37f17..605bd243fb36d1fc69bf79f9aa46cc46268175ec 100644 (file)
@@ -423,7 +423,7 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
 }
 
 /**
- * drm_agp_clear - Clear AGP resource list
+ * drm_legacy_agp_clear - Clear AGP resource list
  * @dev: DRM device
  *
  * Iterate over all AGP resources and remove them. But keep the AGP head
@@ -434,7 +434,7 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
  * resources from getting destroyed. Drivers are responsible of cleaning them up
  * during device shutdown.
  */
-void drm_agp_clear(struct drm_device *dev)
+void drm_legacy_agp_clear(struct drm_device *dev)
 {
        struct drm_agp_mem *entry, *tempe;
 
index 8ee1db866e8004c95d9e7bbb038aff5f7daf2f84..3ff1ed7b33dbeb74aa036204f90931958eb5ee23 100644 (file)
@@ -31,6 +31,8 @@
 #include <drm/drm_mode.h>
 #include <drm/drm_plane_helper.h>
 
+#include "drm_crtc_internal.h"
+
 /**
  * drm_atomic_state_default_release -
  * release memory initialized by drm_atomic_state_init
@@ -142,18 +144,11 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
                if (!connector)
                        continue;
 
-               /*
-                * FIXME: Async commits can race with connector unplugging and
-                * there's currently nothing that prevents cleanup up state for
-                * deleted connectors. As long as the callback doesn't look at
-                * the connector we'll be fine though, so make sure that's the
-                * case by setting all connector pointers to NULL.
-                */
-               state->connector_states[i]->connector = NULL;
-               connector->funcs->atomic_destroy_state(NULL,
+               connector->funcs->atomic_destroy_state(connector,
                                                       state->connector_states[i]);
                state->connectors[i] = NULL;
                state->connector_states[i] = NULL;
+               drm_connector_unreference(connector);
        }
 
        for (i = 0; i < config->num_crtc; i++) {
@@ -261,6 +256,8 @@ drm_atomic_get_crtc_state(struct drm_atomic_state *state,
        int ret, index = drm_crtc_index(crtc);
        struct drm_crtc_state *crtc_state;
 
+       WARN_ON(!state->acquire_ctx);
+
        crtc_state = drm_atomic_get_existing_crtc_state(state, crtc);
        if (crtc_state)
                return crtc_state;
@@ -620,6 +617,8 @@ drm_atomic_get_plane_state(struct drm_atomic_state *state,
        int ret, index = drm_plane_index(plane);
        struct drm_plane_state *plane_state;
 
+       WARN_ON(!state->acquire_ctx);
+
        plane_state = drm_atomic_get_existing_plane_state(state, plane);
        if (plane_state)
                return plane_state;
@@ -888,6 +887,8 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
        struct drm_mode_config *config = &connector->dev->mode_config;
        struct drm_connector_state *connector_state;
 
+       WARN_ON(!state->acquire_ctx);
+
        ret = drm_modeset_lock(&config->connection_mutex, state->acquire_ctx);
        if (ret)
                return ERR_PTR(ret);
@@ -924,6 +925,7 @@ drm_atomic_get_connector_state(struct drm_atomic_state *state,
        if (!connector_state)
                return ERR_PTR(-ENOMEM);
 
+       drm_connector_reference(connector);
        state->connector_states[index] = connector_state;
        state->connectors[index] = connector;
        connector_state->state = state;
@@ -1158,12 +1160,18 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
 {
        struct drm_crtc_state *crtc_state;
 
-       if (conn_state->crtc && conn_state->crtc != crtc) {
+       if (conn_state->crtc == crtc)
+               return 0;
+
+       if (conn_state->crtc) {
                crtc_state = drm_atomic_get_existing_crtc_state(conn_state->state,
                                                                conn_state->crtc);
 
                crtc_state->connector_mask &=
                        ~(1 << drm_connector_index(conn_state->connector));
+
+               drm_connector_unreference(conn_state->connector);
+               conn_state->crtc = NULL;
        }
 
        if (crtc) {
@@ -1173,16 +1181,16 @@ drm_atomic_set_crtc_for_connector(struct drm_connector_state *conn_state,
 
                crtc_state->connector_mask |=
                        1 << drm_connector_index(conn_state->connector);
-       }
 
-       conn_state->crtc = crtc;
+               drm_connector_reference(conn_state->connector);
+               conn_state->crtc = crtc;
 
-       if (crtc)
                DRM_DEBUG_ATOMIC("Link connector state %p to [CRTC:%d:%s]\n",
                                 conn_state, crtc->base.id, crtc->name);
-       else
+       } else {
                DRM_DEBUG_ATOMIC("Link connector state %p to [NOCRTC]\n",
                                 conn_state);
+       }
 
        return 0;
 }
@@ -1388,7 +1396,7 @@ int drm_atomic_commit(struct drm_atomic_state *state)
 EXPORT_SYMBOL(drm_atomic_commit);
 
 /**
- * drm_atomic_async_commit - atomic&async configuration commit
+ * drm_atomic_nonblocking_commit - atomic&nonblocking configuration commit
  * @state: atomic configuration to check
  *
  * Note that this function can return -EDEADLK if the driver needed to acquire
@@ -1403,7 +1411,7 @@ EXPORT_SYMBOL(drm_atomic_commit);
  * Returns:
  * 0 on success, negative error code on failure.
  */
-int drm_atomic_async_commit(struct drm_atomic_state *state)
+int drm_atomic_nonblocking_commit(struct drm_atomic_state *state)
 {
        struct drm_mode_config *config = &state->dev->mode_config;
        int ret;
@@ -1412,11 +1420,11 @@ int drm_atomic_async_commit(struct drm_atomic_state *state)
        if (ret)
                return ret;
 
-       DRM_DEBUG_ATOMIC("commiting %p asynchronously\n", state);
+       DRM_DEBUG_ATOMIC("commiting %p nonblocking\n", state);
 
        return config->funcs->atomic_commit(state->dev, state, true);
 }
-EXPORT_SYMBOL(drm_atomic_async_commit);
+EXPORT_SYMBOL(drm_atomic_nonblocking_commit);
 
 /*
  * The big monstor ioctl
@@ -1614,12 +1622,19 @@ retry:
                }
 
                obj = drm_mode_object_find(dev, obj_id, DRM_MODE_OBJECT_ANY);
-               if (!obj || !obj->properties) {
+               if (!obj) {
+                       ret = -ENOENT;
+                       goto out;
+               }
+
+               if (!obj->properties) {
+                       drm_mode_object_unreference(obj);
                        ret = -ENOENT;
                        goto out;
                }
 
                if (get_user(count_props, count_props_ptr + copied_objs)) {
+                       drm_mode_object_unreference(obj);
                        ret = -EFAULT;
                        goto out;
                }
@@ -1632,12 +1647,14 @@ retry:
                        struct drm_property *prop;
 
                        if (get_user(prop_id, props_ptr + copied_props)) {
+                               drm_mode_object_unreference(obj);
                                ret = -EFAULT;
                                goto out;
                        }
 
                        prop = drm_property_find(dev, prop_id);
                        if (!prop) {
+                               drm_mode_object_unreference(obj);
                                ret = -ENOENT;
                                goto out;
                        }
@@ -1645,13 +1662,16 @@ retry:
                        if (copy_from_user(&prop_value,
                                           prop_values_ptr + copied_props,
                                           sizeof(prop_value))) {
+                               drm_mode_object_unreference(obj);
                                ret = -EFAULT;
                                goto out;
                        }
 
                        ret = atomic_set_prop(state, obj, prop, prop_value);
-                       if (ret)
+                       if (ret) {
+                               drm_mode_object_unreference(obj);
                                goto out;
+                       }
 
                        copied_props++;
                }
@@ -1662,6 +1682,7 @@ retry:
                        plane_mask |= (1 << drm_plane_index(plane));
                        plane->old_fb = plane->fb;
                }
+               drm_mode_object_unreference(obj);
        }
 
        if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
@@ -1685,7 +1706,7 @@ retry:
                 */
                ret = drm_atomic_check_only(state);
        } else if (arg->flags & DRM_MODE_ATOMIC_NONBLOCK) {
-               ret = drm_atomic_async_commit(state);
+               ret = drm_atomic_nonblocking_commit(state);
        } else {
                ret = drm_atomic_commit(state);
        }
index 4befe25c81c7b1d89aa5a47dc87a46542136b381..ddfa0d120e398a63f755c677dcdb1b5e58f371e5 100644 (file)
@@ -384,8 +384,6 @@ mode_fixup(struct drm_atomic_state *state)
                 */
                encoder = conn_state->best_encoder;
                funcs = encoder->helper_private;
-               if (!funcs)
-                       continue;
 
                ret = drm_bridge_mode_fixup(encoder->bridge, &crtc_state->mode,
                                &crtc_state->adjusted_mode);
@@ -394,7 +392,7 @@ mode_fixup(struct drm_atomic_state *state)
                        return -EINVAL;
                }
 
-               if (funcs->atomic_check) {
+               if (funcs && funcs->atomic_check) {
                        ret = funcs->atomic_check(encoder, crtc_state,
                                                  conn_state);
                        if (ret) {
@@ -402,7 +400,7 @@ mode_fixup(struct drm_atomic_state *state)
                                                 encoder->base.id, encoder->name);
                                return ret;
                        }
-               } else if (funcs->mode_fixup) {
+               } else if (funcs && funcs->mode_fixup) {
                        ret = funcs->mode_fixup(encoder, &crtc_state->mode,
                                                &crtc_state->adjusted_mode);
                        if (!ret) {
@@ -707,12 +705,14 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
                drm_bridge_disable(encoder->bridge);
 
                /* Right function depends upon target state. */
-               if (connector->state->crtc && funcs->prepare)
-                       funcs->prepare(encoder);
-               else if (funcs->disable)
-                       funcs->disable(encoder);
-               else
-                       funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
+               if (funcs) {
+                       if (connector->state->crtc && funcs->prepare)
+                               funcs->prepare(encoder);
+                       else if (funcs->disable)
+                               funcs->disable(encoder);
+                       else if (funcs->dpms)
+                               funcs->dpms(encoder, DRM_MODE_DPMS_OFF);
+               }
 
                drm_bridge_post_disable(encoder->bridge);
        }
@@ -873,7 +873,7 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
                 * Each encoder has at most one connector (since we always steal
                 * it away), so we won't call mode_set hooks twice.
                 */
-               if (funcs->mode_set)
+               if (funcs && funcs->mode_set)
                        funcs->mode_set(encoder, mode, adjusted_mode);
 
                drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
@@ -974,17 +974,29 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
                 */
                drm_bridge_pre_enable(encoder->bridge);
 
-               if (funcs->enable)
-                       funcs->enable(encoder);
-               else
-                       funcs->commit(encoder);
+               if (funcs) {
+                       if (funcs->enable)
+                               funcs->enable(encoder);
+                       else if (funcs->commit)
+                               funcs->commit(encoder);
+               }
 
                drm_bridge_enable(encoder->bridge);
        }
 }
 EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
 
-static void wait_for_fences(struct drm_device *dev,
+/**
+ * drm_atomic_helper_wait_for_fences - wait for fences stashed in plane state
+ * @dev: DRM device
+ * @state: atomic state object with old state structures
+ *
+ * For implicit sync, driver should fish the exclusive fence out from the
+ * incoming fb's and stash it in the drm_plane_state.  This is called after
+ * drm_atomic_helper_swap_state() so it uses the current plane state (and
+ * just uses the atomic state to find the changed planes)
+ */
+void drm_atomic_helper_wait_for_fences(struct drm_device *dev,
                            struct drm_atomic_state *state)
 {
        struct drm_plane *plane;
@@ -1002,6 +1014,7 @@ static void wait_for_fences(struct drm_device *dev,
                plane->state->fence = NULL;
        }
 }
+EXPORT_SYMBOL(drm_atomic_helper_wait_for_fences);
 
 /**
  * drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
@@ -1092,6 +1105,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
                                        drm_crtc_vblank_count(crtc),
                                msecs_to_jiffies(50));
 
+               WARN(!ret, "[CRTC:%d] vblank wait timed out\n", crtc->base.id);
+
                drm_crtc_vblank_put(crtc);
        }
 }
@@ -1101,13 +1116,13 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
  * drm_atomic_helper_commit - commit validated state object
  * @dev: DRM device
  * @state: the driver state object
- * @async: asynchronous commit
+ * @nonblocking: whether nonblocking behavior is requested.
  *
  * This function commits a with drm_atomic_helper_check() pre-validated state
  * object. This can still fail when e.g. the framebuffer reservation fails. For
- * now this doesn't implement asynchronous commits.
+ * now this doesn't implement nonblocking commits.
  *
- * Note that right now this function does not support async commits, and hence
+ * Note that right now this function does not support nonblocking commits, hence
  * driver writers must implement their own version for now. Also note that the
  * default ordering of how the various stages are called is to match the legacy
  * modeset helper library closest. One peculiarity of that is that it doesn't
@@ -1128,11 +1143,11 @@ EXPORT_SYMBOL(drm_atomic_helper_wait_for_vblanks);
  */
 int drm_atomic_helper_commit(struct drm_device *dev,
                             struct drm_atomic_state *state,
-                            bool async)
+                            bool nonblock)
 {
        int ret;
 
-       if (async)
+       if (nonblock)
                return -EBUSY;
 
        ret = drm_atomic_helper_prepare_planes(dev, state);
@@ -1163,7 +1178,7 @@ int drm_atomic_helper_commit(struct drm_device *dev,
         * current layout.
         */
 
-       wait_for_fences(dev, state);
+       drm_atomic_helper_wait_for_fences(dev, state);
 
        drm_atomic_helper_commit_modeset_disables(dev, state);
 
@@ -1182,20 +1197,20 @@ int drm_atomic_helper_commit(struct drm_device *dev,
 EXPORT_SYMBOL(drm_atomic_helper_commit);
 
 /**
- * DOC: implementing async commit
+ * DOC: implementing nonblocking commit
  *
- * For now the atomic helpers don't support async commit directly. If there is
- * real need it could be added though, using the dma-buf fence infrastructure
- * for generic synchronization with outstanding rendering.
+ * For now the atomic helpers don't support nonblocking commit directly. If
+ * there is real need it could be added though, using the dma-buf fence
+ * infrastructure for generic synchronization with outstanding rendering.
  *
- * For now drivers have to implement async commit themselves, with the following
- * sequence being the recommended one:
+ * For now drivers have to implement nonblocking commit themselves, with the
+ * following sequence being the recommended one:
  *
  * 1. Run drm_atomic_helper_prepare_planes() first. This is the only function
  * which commit needs to call which can fail, so we want to run it first and
  * synchronously.
  *
- * 2. Synchronize with any outstanding asynchronous commit worker threads which
+ * 2. Synchronize with any outstanding nonblocking commit worker threads which
  * might be affected the new state update. This can be done by either cancelling
  * or flushing the work items, depending upon whether the driver can deal with
  * cancelled updates. Note that it is important to ensure that the framebuffer
@@ -1209,9 +1224,9 @@ EXPORT_SYMBOL(drm_atomic_helper_commit);
  * 3. The software state is updated synchronously with
  * drm_atomic_helper_swap_state(). Doing this under the protection of all modeset
  * locks means concurrent callers never see inconsistent state. And doing this
- * while it's guaranteed that no relevant async worker runs means that async
- * workers do not need grab any locks. Actually they must not grab locks, for
- * otherwise the work flushing will deadlock.
+ * while it's guaranteed that no relevant nonblocking worker runs means that
+ * nonblocking workers do not need grab any locks. Actually they must not grab
+ * locks, for otherwise the work flushing will deadlock.
  *
  * 4. Schedule a work item to do all subsequent steps, using the split-out
  * commit helpers: a) pre-plane commit b) plane commit c) post-plane commit and
@@ -2358,11 +2373,11 @@ retry:
                goto fail;
        }
 
-       ret = drm_atomic_async_commit(state);
+       ret = drm_atomic_nonblocking_commit(state);
        if (ret != 0)
                goto fail;
 
-       /* Driver takes ownership of state on successful async commit. */
+       /* Driver takes ownership of state on successful commit. */
        return 0;
 fail:
        if (ret == -EDEADLK)
@@ -2467,6 +2482,23 @@ backoff:
 }
 EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
 
+/**
+ * drm_atomic_helper_best_encoder - Helper for &drm_connector_helper_funcs
+ *                                  ->best_encoder callback
+ * @connector: Connector control structure
+ *
+ * This is a &drm_connector_helper_funcs ->best_encoder callback helper for
+ * connectors that support exactly 1 encoder, statically determined at driver
+ * init time.
+ */
+struct drm_encoder *
+drm_atomic_helper_best_encoder(struct drm_connector *connector)
+{
+       WARN_ON(connector->encoder_ids[1]);
+       return drm_encoder_find(connector->dev, connector->encoder_ids[0]);
+}
+EXPORT_SYMBOL(drm_atomic_helper_best_encoder);
+
 /**
  * DOC: atomic state reset and initialization
  *
@@ -2497,12 +2529,9 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_dpms);
  */
 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc)
 {
-       if (crtc->state) {
-               drm_property_unreference_blob(crtc->state->mode_blob);
-               drm_property_unreference_blob(crtc->state->degamma_lut);
-               drm_property_unreference_blob(crtc->state->ctm);
-               drm_property_unreference_blob(crtc->state->gamma_lut);
-       }
+       if (crtc->state)
+               __drm_atomic_helper_crtc_destroy_state(crtc->state);
+
        kfree(crtc->state);
        crtc->state = kzalloc(sizeof(*crtc->state), GFP_KERNEL);
 
@@ -2566,15 +2595,13 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_duplicate_state);
 
 /**
  * __drm_atomic_helper_crtc_destroy_state - release CRTC state
- * @crtc: CRTC object
  * @state: CRTC state object to release
  *
  * Releases all resources stored in the CRTC state without actually freeing
  * the memory of the CRTC state. This is useful for drivers that subclass the
  * CRTC state.
  */
-void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
-                                           struct drm_crtc_state *state)
+void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state)
 {
        drm_property_unreference_blob(state->mode_blob);
        drm_property_unreference_blob(state->degamma_lut);
@@ -2594,7 +2621,7 @@ EXPORT_SYMBOL(__drm_atomic_helper_crtc_destroy_state);
 void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
                                          struct drm_crtc_state *state)
 {
-       __drm_atomic_helper_crtc_destroy_state(crtc, state);
+       __drm_atomic_helper_crtc_destroy_state(state);
        kfree(state);
 }
 EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
@@ -2608,8 +2635,8 @@ EXPORT_SYMBOL(drm_atomic_helper_crtc_destroy_state);
  */
 void drm_atomic_helper_plane_reset(struct drm_plane *plane)
 {
-       if (plane->state && plane->state->fb)
-               drm_framebuffer_unreference(plane->state->fb);
+       if (plane->state)
+               __drm_atomic_helper_plane_destroy_state(plane->state);
 
        kfree(plane->state);
        plane->state = kzalloc(sizeof(*plane->state), GFP_KERNEL);
@@ -2664,15 +2691,13 @@ EXPORT_SYMBOL(drm_atomic_helper_plane_duplicate_state);
 
 /**
  * __drm_atomic_helper_plane_destroy_state - release plane state
- * @plane: plane object
  * @state: plane state object to release
  *
  * Releases all resources stored in the plane state without actually freeing
  * the memory of the plane state. This is useful for drivers that subclass the
  * plane state.
  */
-void __drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
-                                            struct drm_plane_state *state)
+void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state)
 {
        if (state->fb)
                drm_framebuffer_unreference(state->fb);
@@ -2690,7 +2715,7 @@ EXPORT_SYMBOL(__drm_atomic_helper_plane_destroy_state);
 void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
                                           struct drm_plane_state *state)
 {
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
        kfree(state);
 }
 EXPORT_SYMBOL(drm_atomic_helper_plane_destroy_state);
@@ -2730,6 +2755,9 @@ void drm_atomic_helper_connector_reset(struct drm_connector *connector)
        struct drm_connector_state *conn_state =
                kzalloc(sizeof(*conn_state), GFP_KERNEL);
 
+       if (connector->state)
+               __drm_atomic_helper_connector_destroy_state(connector->state);
+
        kfree(connector->state);
        __drm_atomic_helper_connector_reset(connector, conn_state);
 }
@@ -2748,6 +2776,8 @@ __drm_atomic_helper_connector_duplicate_state(struct drm_connector *connector,
                                            struct drm_connector_state *state)
 {
        memcpy(state, connector->state, sizeof(*state));
+       if (state->crtc)
+               drm_connector_reference(connector);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_duplicate_state);
 
@@ -2859,7 +2889,6 @@ EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
 
 /**
  * __drm_atomic_helper_connector_destroy_state - release connector state
- * @connector: connector object
  * @state: connector state object to release
  *
  * Releases all resources stored in the connector state without actually
@@ -2867,14 +2896,15 @@ EXPORT_SYMBOL(drm_atomic_helper_duplicate_state);
  * subclass the connector state.
  */
 void
-__drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
-                                           struct drm_connector_state *state)
+__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state)
 {
        /*
         * This is currently a placeholder so that drivers that subclass the
         * state will automatically do the right thing if code is ever added
         * to this function.
         */
+       if (state->crtc)
+               drm_connector_unreference(state->connector);
 }
 EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
 
@@ -2889,7 +2919,7 @@ EXPORT_SYMBOL(__drm_atomic_helper_connector_destroy_state);
 void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
                                          struct drm_connector_state *state)
 {
-       __drm_atomic_helper_connector_destroy_state(connector, state);
+       __drm_atomic_helper_connector_destroy_state(state);
        kfree(state);
 }
 EXPORT_SYMBOL(drm_atomic_helper_connector_destroy_state);
index f1a204d253cce0bfb2616cd4a9b0ebb400e5718c..9b34158c0f77b71a5d27051c281a57fff5895888 100644 (file)
@@ -396,6 +396,10 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
        if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
                return -EPERM;
 
+       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+           drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
        err = drm_addmap_core(dev, map->offset, map->size, map->type,
                              map->flags, &maplist);
 
@@ -416,6 +420,62 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
        return 0;
 }
 
+/*
+ * Get a mapping information.
+ *
+ * \param inode device inode.
+ * \param file_priv DRM file private.
+ * \param cmd command.
+ * \param arg user argument, pointing to a drm_map structure.
+ *
+ * \return zero on success or a negative number on failure.
+ *
+ * Searches for the mapping with the specified offset and copies its information
+ * into userspace
+ */
+int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data,
+                           struct drm_file *file_priv)
+{
+       struct drm_map *map = data;
+       struct drm_map_list *r_list = NULL;
+       struct list_head *list;
+       int idx;
+       int i;
+
+       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+           drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
+       idx = map->offset;
+       if (idx < 0)
+               return -EINVAL;
+
+       i = 0;
+       mutex_lock(&dev->struct_mutex);
+       list_for_each(list, &dev->maplist) {
+               if (i == idx) {
+                       r_list = list_entry(list, struct drm_map_list, head);
+                       break;
+               }
+               i++;
+       }
+       if (!r_list || !r_list->map) {
+               mutex_unlock(&dev->struct_mutex);
+               return -EINVAL;
+       }
+
+       map->offset = r_list->map->offset;
+       map->size = r_list->map->size;
+       map->type = r_list->map->type;
+       map->flags = r_list->map->flags;
+       map->handle = (void *)(unsigned long) r_list->user_token;
+       map->mtrr = arch_phys_wc_index(r_list->map->mtrr);
+
+       mutex_unlock(&dev->struct_mutex);
+
+       return 0;
+}
+
 /**
  * Remove a map private from list and deallocate resources if the mapping
  * isn't in use.
@@ -482,18 +542,35 @@ int drm_legacy_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
 }
 EXPORT_SYMBOL(drm_legacy_rmmap_locked);
 
-int drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map)
+void drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map)
 {
-       int ret;
+       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+           drm_core_check_feature(dev, DRIVER_MODESET))
+               return;
 
        mutex_lock(&dev->struct_mutex);
-       ret = drm_legacy_rmmap_locked(dev, map);
+       drm_legacy_rmmap_locked(dev, map);
        mutex_unlock(&dev->struct_mutex);
-
-       return ret;
 }
 EXPORT_SYMBOL(drm_legacy_rmmap);
 
+void drm_legacy_master_rmmaps(struct drm_device *dev, struct drm_master *master)
+{
+       struct drm_map_list *r_list, *list_temp;
+
+       if (drm_core_check_feature(dev, DRIVER_MODESET))
+               return;
+
+       mutex_lock(&dev->struct_mutex);
+       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
+               if (r_list->master == master) {
+                       drm_legacy_rmmap_locked(dev, r_list->map);
+                       r_list = NULL;
+               }
+       }
+       mutex_unlock(&dev->struct_mutex);
+}
+
 /* The rmmap ioctl appears to be unnecessary.  All mappings are torn down on
  * the last close of the device, and this is necessary for cleanup when things
  * exit uncleanly.  Therefore, having userland manually remove mappings seems
@@ -517,6 +594,10 @@ int drm_legacy_rmmap_ioctl(struct drm_device *dev, void *data,
        struct drm_map_list *r_list;
        int ret;
 
+       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
+           drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
        mutex_lock(&dev->struct_mutex);
        list_for_each_entry(r_list, &dev->maplist, head) {
                if (r_list->map &&
index e08f962288d91ceea3257d2122573fc168a1b084..d2a6d958ca76068bf45b59e98dbe2a709ecf8817 100644 (file)
@@ -168,6 +168,7 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] = {
        { DRM_MODE_CONNECTOR_eDP, "eDP" },
        { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
        { DRM_MODE_CONNECTOR_DSI, "DSI" },
+       { DRM_MODE_CONNECTOR_DPI, "DPI" },
 };
 
 static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
@@ -179,6 +180,7 @@ static const struct drm_prop_enum_list drm_encoder_enum_list[] = {
        { DRM_MODE_ENCODER_VIRTUAL, "Virtual" },
        { DRM_MODE_ENCODER_DSI, "DSI" },
        { DRM_MODE_ENCODER_DPMST, "DP MST" },
+       { DRM_MODE_ENCODER_DPI, "DPI" },
 };
 
 static const struct drm_prop_enum_list drm_subpixel_enum_list[] = {
@@ -275,7 +277,8 @@ EXPORT_SYMBOL(drm_get_format_name);
 static int drm_mode_object_get_reg(struct drm_device *dev,
                                   struct drm_mode_object *obj,
                                   uint32_t obj_type,
-                                  bool register_obj)
+                                  bool register_obj,
+                                  void (*obj_free_cb)(struct kref *kref))
 {
        int ret;
 
@@ -288,6 +291,10 @@ static int drm_mode_object_get_reg(struct drm_device *dev,
                 */
                obj->id = ret;
                obj->type = obj_type;
+               if (obj_free_cb) {
+                       obj->free_cb = obj_free_cb;
+                       kref_init(&obj->refcount);
+               }
        }
        mutex_unlock(&dev->mode_config.idr_mutex);
 
@@ -311,7 +318,7 @@ static int drm_mode_object_get_reg(struct drm_device *dev,
 int drm_mode_object_get(struct drm_device *dev,
                        struct drm_mode_object *obj, uint32_t obj_type)
 {
-       return drm_mode_object_get_reg(dev, obj, obj_type, true);
+       return drm_mode_object_get_reg(dev, obj, obj_type, true, NULL);
 }
 
 static void drm_mode_object_register(struct drm_device *dev,
@@ -323,19 +330,24 @@ static void drm_mode_object_register(struct drm_device *dev,
 }
 
 /**
- * drm_mode_object_put - free a modeset identifer
+ * drm_mode_object_unregister - free a modeset identifer
  * @dev: DRM device
  * @object: object to free
  *
- * Free @id from @dev's unique identifier pool. Note that despite the _get
- * postfix modeset identifiers are _not_ reference counted. Hence don't use this
+ * Free @id from @dev's unique identifier pool.
+ * This function can be called multiple times, and guards against
+ * multiple removals.
+ * These modeset identifiers are _not_ reference counted. Hence don't use this
  * for reference counted modeset objects like framebuffers.
  */
-void drm_mode_object_put(struct drm_device *dev,
+void drm_mode_object_unregister(struct drm_device *dev,
                         struct drm_mode_object *object)
 {
        mutex_lock(&dev->mode_config.idr_mutex);
-       idr_remove(&dev->mode_config.crtc_idr, object->id);
+       if (object->id) {
+               idr_remove(&dev->mode_config.crtc_idr, object->id);
+               object->id = 0;
+       }
        mutex_unlock(&dev->mode_config.idr_mutex);
 }
 
@@ -350,11 +362,11 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
                obj = NULL;
        if (obj && obj->id != id)
                obj = NULL;
-       /* don't leak out unref'd fb's */
-       if (obj &&
-           (obj->type == DRM_MODE_OBJECT_FB ||
-            obj->type == DRM_MODE_OBJECT_BLOB))
-               obj = NULL;
+
+       if (obj && obj->free_cb) {
+               if (!kref_get_unless_zero(&obj->refcount))
+                       obj = NULL;
+       }
        mutex_unlock(&dev->mode_config.idr_mutex);
 
        return obj;
@@ -366,24 +378,69 @@ static struct drm_mode_object *_object_find(struct drm_device *dev,
  * @id: id of the mode object
  * @type: type of the mode object
  *
- * Note that framebuffers cannot be looked up with this functions - since those
- * are reference counted, they need special treatment.  Even with
- * DRM_MODE_OBJECT_ANY (although that will simply return NULL
- * rather than WARN_ON()).
+ * This function is used to look up a modeset object. It will acquire a
+ * reference for reference counted objects. This reference must be dropped again
+ * by callind drm_mode_object_unreference().
  */
 struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
                uint32_t id, uint32_t type)
 {
        struct drm_mode_object *obj = NULL;
 
-       /* Framebuffers are reference counted and need their own lookup
-        * function.*/
-       WARN_ON(type == DRM_MODE_OBJECT_FB || type == DRM_MODE_OBJECT_BLOB);
        obj = _object_find(dev, id, type);
        return obj;
 }
 EXPORT_SYMBOL(drm_mode_object_find);
 
+/**
+ * drm_mode_object_unreference - decr the object refcnt
+ * @obj: mode_object
+ *
+ * This functions decrements the object's refcount if it is a refcounted modeset
+ * object. It is a no-op on any other object. This is used to drop references
+ * acquired with drm_mode_object_reference().
+ */
+void drm_mode_object_unreference(struct drm_mode_object *obj)
+{
+       if (obj->free_cb) {
+               DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, atomic_read(&obj->refcount.refcount));
+               kref_put(&obj->refcount, obj->free_cb);
+       }
+}
+EXPORT_SYMBOL(drm_mode_object_unreference);
+
+/**
+ * drm_mode_object_reference - incr the object refcnt
+ * @obj: mode_object
+ *
+ * This functions increments the object's refcount if it is a refcounted modeset
+ * object. It is a no-op on any other object. References should be dropped again
+ * by calling drm_mode_object_unreference().
+ */
+void drm_mode_object_reference(struct drm_mode_object *obj)
+{
+       if (obj->free_cb) {
+               DRM_DEBUG("OBJ ID: %d (%d)\n", obj->id, atomic_read(&obj->refcount.refcount));
+               kref_get(&obj->refcount);
+       }
+}
+EXPORT_SYMBOL(drm_mode_object_reference);
+
+static void drm_framebuffer_free(struct kref *kref)
+{
+       struct drm_framebuffer *fb =
+                       container_of(kref, struct drm_framebuffer, base.refcount);
+       struct drm_device *dev = fb->dev;
+
+       /*
+        * The lookup idr holds a weak reference, which has not necessarily been
+        * removed at this point. Check for that.
+        */
+       drm_mode_object_unregister(dev, &fb->base);
+
+       fb->funcs->destroy(fb);
+}
+
 /**
  * drm_framebuffer_init - initialize a framebuffer
  * @dev: DRM device
@@ -407,71 +464,26 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
 {
        int ret;
 
-       mutex_lock(&dev->mode_config.fb_lock);
-       kref_init(&fb->refcount);
        INIT_LIST_HEAD(&fb->filp_head);
        fb->dev = dev;
        fb->funcs = funcs;
 
-       ret = drm_mode_object_get(dev, &fb->base, DRM_MODE_OBJECT_FB);
+       ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB,
+                                     false, drm_framebuffer_free);
        if (ret)
                goto out;
 
+       mutex_lock(&dev->mode_config.fb_lock);
        dev->mode_config.num_fb++;
        list_add(&fb->head, &dev->mode_config.fb_list);
-out:
        mutex_unlock(&dev->mode_config.fb_lock);
 
+       drm_mode_object_register(dev, &fb->base);
+out:
        return ret;
 }
 EXPORT_SYMBOL(drm_framebuffer_init);
 
-/* dev->mode_config.fb_lock must be held! */
-static void __drm_framebuffer_unregister(struct drm_device *dev,
-                                        struct drm_framebuffer *fb)
-{
-       drm_mode_object_put(dev, &fb->base);
-
-       fb->base.id = 0;
-}
-
-static void drm_framebuffer_free(struct kref *kref)
-{
-       struct drm_framebuffer *fb =
-                       container_of(kref, struct drm_framebuffer, refcount);
-       struct drm_device *dev = fb->dev;
-
-       /*
-        * The lookup idr holds a weak reference, which has not necessarily been
-        * removed at this point. Check for that.
-        */
-       mutex_lock(&dev->mode_config.fb_lock);
-       if (fb->base.id) {
-               /* Mark fb as reaped and drop idr ref. */
-               __drm_framebuffer_unregister(dev, fb);
-       }
-       mutex_unlock(&dev->mode_config.fb_lock);
-
-       fb->funcs->destroy(fb);
-}
-
-static struct drm_framebuffer *__drm_framebuffer_lookup(struct drm_device *dev,
-                                                       uint32_t id)
-{
-       struct drm_mode_object *obj = NULL;
-       struct drm_framebuffer *fb;
-
-       mutex_lock(&dev->mode_config.idr_mutex);
-       obj = idr_find(&dev->mode_config.crtc_idr, id);
-       if (!obj || (obj->type != DRM_MODE_OBJECT_FB) || (obj->id != id))
-               fb = NULL;
-       else
-               fb = obj_to_fb(obj);
-       mutex_unlock(&dev->mode_config.idr_mutex);
-
-       return fb;
-}
-
 /**
  * drm_framebuffer_lookup - look up a drm framebuffer and grab a reference
  * @dev: drm device
@@ -484,46 +496,16 @@ static struct drm_framebuffer *__drm_framebuffer_lookup(struct drm_device *dev,
 struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
                                               uint32_t id)
 {
-       struct drm_framebuffer *fb;
-
-       mutex_lock(&dev->mode_config.fb_lock);
-       fb = __drm_framebuffer_lookup(dev, id);
-       if (fb) {
-               if (!kref_get_unless_zero(&fb->refcount))
-                       fb = NULL;
-       }
-       mutex_unlock(&dev->mode_config.fb_lock);
+       struct drm_mode_object *obj;
+       struct drm_framebuffer *fb = NULL;
 
+       obj = _object_find(dev, id, DRM_MODE_OBJECT_FB);
+       if (obj)
+               fb = obj_to_fb(obj);
        return fb;
 }
 EXPORT_SYMBOL(drm_framebuffer_lookup);
 
-/**
- * drm_framebuffer_unreference - unref a framebuffer
- * @fb: framebuffer to unref
- *
- * This functions decrements the fb's refcount and frees it if it drops to zero.
- */
-void drm_framebuffer_unreference(struct drm_framebuffer *fb)
-{
-       DRM_DEBUG("%p: FB ID: %d (%d)\n", fb, fb->base.id, atomic_read(&fb->refcount.refcount));
-       kref_put(&fb->refcount, drm_framebuffer_free);
-}
-EXPORT_SYMBOL(drm_framebuffer_unreference);
-
-/**
- * drm_framebuffer_reference - incr the fb refcnt
- * @fb: framebuffer
- *
- * This functions increments the fb's refcount.
- */
-void drm_framebuffer_reference(struct drm_framebuffer *fb)
-{
-       DRM_DEBUG("%p: FB ID: %d (%d)\n", fb, fb->base.id, atomic_read(&fb->refcount.refcount));
-       kref_get(&fb->refcount);
-}
-EXPORT_SYMBOL(drm_framebuffer_reference);
-
 /**
  * drm_framebuffer_unregister_private - unregister a private fb from the lookup idr
  * @fb: fb to unregister
@@ -542,10 +524,8 @@ void drm_framebuffer_unregister_private(struct drm_framebuffer *fb)
 
        dev = fb->dev;
 
-       mutex_lock(&dev->mode_config.fb_lock);
        /* Mark fb as reaped and drop idr ref. */
-       __drm_framebuffer_unregister(dev, fb);
-       mutex_unlock(&dev->mode_config.fb_lock);
+       drm_mode_object_unregister(dev, &fb->base);
 }
 EXPORT_SYMBOL(drm_framebuffer_unregister_private);
 
@@ -619,7 +599,7 @@ void drm_framebuffer_remove(struct drm_framebuffer *fb)
         * in-use fb with fb-id == 0. Userspace is allowed to shoot its own foot
         * in this manner.
         */
-       if (atomic_read(&fb->refcount.refcount) > 1) {
+       if (drm_framebuffer_read_refcount(fb) > 1) {
                drm_modeset_lock_all(dev);
                /* remove from any CRTC */
                drm_for_each_crtc(crtc, dev) {
@@ -705,7 +685,7 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc,
                                       drm_num_crtcs(dev));
        }
        if (!crtc->name) {
-               drm_mode_object_put(dev, &crtc->base);
+               drm_mode_object_unregister(dev, &crtc->base);
                return -ENOMEM;
        }
 
@@ -747,7 +727,7 @@ void drm_crtc_cleanup(struct drm_crtc *crtc)
 
        drm_modeset_lock_fini(&crtc->mutex);
 
-       drm_mode_object_put(dev, &crtc->base);
+       drm_mode_object_unregister(dev, &crtc->base);
        list_del(&crtc->head);
        dev->mode_config.num_crtc--;
 
@@ -884,6 +864,16 @@ static void drm_connector_get_cmdline_mode(struct drm_connector *connector)
                      mode->interlace ?  " interlaced" : "");
 }
 
+static void drm_connector_free(struct kref *kref)
+{
+       struct drm_connector *connector =
+               container_of(kref, struct drm_connector, base.refcount);
+       struct drm_device *dev = connector->dev;
+
+       drm_mode_object_unregister(dev, &connector->base);
+       connector->funcs->destroy(connector);
+}
+
 /**
  * drm_connector_init - Init a preallocated connector
  * @dev: DRM device
@@ -909,7 +899,9 @@ int drm_connector_init(struct drm_device *dev,
 
        drm_modeset_lock_all(dev);
 
-       ret = drm_mode_object_get_reg(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR, false);
+       ret = drm_mode_object_get_reg(dev, &connector->base,
+                                     DRM_MODE_OBJECT_CONNECTOR,
+                                     false, drm_connector_free);
        if (ret)
                goto out_unlock;
 
@@ -972,7 +964,7 @@ out_put_id:
                ida_remove(&config->connector_ida, connector->connector_id);
 out_put:
        if (ret)
-               drm_mode_object_put(dev, &connector->base);
+               drm_mode_object_unregister(dev, &connector->base);
 
 out_unlock:
        drm_modeset_unlock_all(dev);
@@ -1010,7 +1002,7 @@ void drm_connector_cleanup(struct drm_connector *connector)
                   connector->connector_id);
 
        kfree(connector->display_info.bus_formats);
-       drm_mode_object_put(dev, &connector->base);
+       drm_mode_object_unregister(dev, &connector->base);
        kfree(connector->name);
        connector->name = NULL;
        list_del(&connector->head);
@@ -1038,8 +1030,6 @@ int drm_connector_register(struct drm_connector *connector)
 {
        int ret;
 
-       drm_mode_object_register(connector->dev, &connector->base);
-
        ret = drm_sysfs_connector_add(connector);
        if (ret)
                return ret;
@@ -1050,6 +1040,8 @@ int drm_connector_register(struct drm_connector *connector)
                return ret;
        }
 
+       drm_mode_object_register(connector->dev, &connector->base);
+
        return 0;
 }
 EXPORT_SYMBOL(drm_connector_register);
@@ -1067,25 +1059,65 @@ void drm_connector_unregister(struct drm_connector *connector)
 }
 EXPORT_SYMBOL(drm_connector_unregister);
 
+/**
+ * drm_connector_register_all - register all connectors
+ * @dev: drm device
+ *
+ * This function registers all connectors in sysfs and other places so that
+ * userspace can start to access them. Drivers can call it after calling
+ * drm_dev_register() to complete the device registration, if they don't call
+ * drm_connector_register() on each connector individually.
+ *
+ * When a device is unplugged and should be removed from userspace access,
+ * call drm_connector_unregister_all(), which is the inverse of this
+ * function.
+ *
+ * Returns:
+ * Zero on success, error code on failure.
+ */
+int drm_connector_register_all(struct drm_device *dev)
+{
+       struct drm_connector *connector;
+       int ret;
+
+       mutex_lock(&dev->mode_config.mutex);
+
+       drm_for_each_connector(connector, dev) {
+               ret = drm_connector_register(connector);
+               if (ret)
+                       goto err;
+       }
+
+       mutex_unlock(&dev->mode_config.mutex);
+
+       return 0;
+
+err:
+       mutex_unlock(&dev->mode_config.mutex);
+       drm_connector_unregister_all(dev);
+       return ret;
+}
+EXPORT_SYMBOL(drm_connector_register_all);
 
 /**
- * drm_connector_unplug_all - unregister connector userspace interfaces
+ * drm_connector_unregister_all - unregister connector userspace interfaces
  * @dev: drm device
  *
- * This function unregisters all connector userspace interfaces in sysfs. Should
- * be call when the device is disconnected, e.g. from an usb driver's
- * ->disconnect callback.
+ * This functions unregisters all connectors from sysfs and other places so
+ * that userspace can no longer access them. Drivers should call this as the
+ * first step tearing down the device instace, or when the underlying
+ * physical device disappeared (e.g. USB unplug), right before calling
+ * drm_dev_unregister().
  */
-void drm_connector_unplug_all(struct drm_device *dev)
+void drm_connector_unregister_all(struct drm_device *dev)
 {
        struct drm_connector *connector;
 
        /* FIXME: taking the mode config mutex ends up in a clash with sysfs */
        list_for_each_entry(connector, &dev->mode_config.connector_list, head)
                drm_connector_unregister(connector);
-
 }
-EXPORT_SYMBOL(drm_connector_unplug_all);
+EXPORT_SYMBOL(drm_connector_unregister_all);
 
 /**
  * drm_encoder_init - Init a preallocated encoder
@@ -1138,7 +1170,7 @@ int drm_encoder_init(struct drm_device *dev,
 
 out_put:
        if (ret)
-               drm_mode_object_put(dev, &encoder->base);
+               drm_mode_object_unregister(dev, &encoder->base);
 
 out_unlock:
        drm_modeset_unlock_all(dev);
@@ -1181,7 +1213,7 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
        struct drm_device *dev = encoder->dev;
 
        drm_modeset_lock_all(dev);
-       drm_mode_object_put(dev, &encoder->base);
+       drm_mode_object_unregister(dev, &encoder->base);
        kfree(encoder->name);
        list_del(&encoder->head);
        dev->mode_config.num_encoder--;
@@ -1242,7 +1274,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
                                            GFP_KERNEL);
        if (!plane->format_types) {
                DRM_DEBUG_KMS("out of memory when allocating plane\n");
-               drm_mode_object_put(dev, &plane->base);
+               drm_mode_object_unregister(dev, &plane->base);
                return -ENOMEM;
        }
 
@@ -1258,7 +1290,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane,
        }
        if (!plane->name) {
                kfree(plane->format_types);
-               drm_mode_object_put(dev, &plane->base);
+               drm_mode_object_unregister(dev, &plane->base);
                return -ENOMEM;
        }
 
@@ -1338,7 +1370,7 @@ void drm_plane_cleanup(struct drm_plane *plane)
 
        drm_modeset_lock_all(dev);
        kfree(plane->format_types);
-       drm_mode_object_put(dev, &plane->base);
+       drm_mode_object_unregister(dev, &plane->base);
 
        BUG_ON(list_empty(&plane->head));
 
@@ -1918,8 +1950,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
                copied = 0;
                crtc_id = (uint32_t __user *)(unsigned long)card_res->crtc_id_ptr;
                drm_for_each_crtc(crtc, dev) {
-                       DRM_DEBUG_KMS("[CRTC:%d:%s]\n",
-                                     crtc->base.id, crtc->name);
                        if (put_user(crtc->base.id, crtc_id + copied)) {
                                ret = -EFAULT;
                                goto out;
@@ -1934,8 +1964,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
                copied = 0;
                encoder_id = (uint32_t __user *)(unsigned long)card_res->encoder_id_ptr;
                drm_for_each_encoder(encoder, dev) {
-                       DRM_DEBUG_KMS("[ENCODER:%d:%s]\n", encoder->base.id,
-                                       encoder->name);
                        if (put_user(encoder->base.id, encoder_id +
                                     copied)) {
                                ret = -EFAULT;
@@ -1951,9 +1979,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
                copied = 0;
                connector_id = (uint32_t __user *)(unsigned long)card_res->connector_id_ptr;
                drm_for_each_connector(connector, dev) {
-                       DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
-                               connector->base.id,
-                               connector->name);
                        if (put_user(connector->base.id,
                                     connector_id + copied)) {
                                ret = -EFAULT;
@@ -1964,9 +1989,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
        }
        card_res->count_connectors = connector_count;
 
-       DRM_DEBUG_KMS("CRTC[%d] CONNECTORS[%d] ENCODERS[%d]\n", card_res->count_crtcs,
-                 card_res->count_connectors, card_res->count_encoders);
-
 out:
        mutex_unlock(&dev->mode_config.mutex);
        return ret;
@@ -2125,11 +2147,9 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 
        memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo));
 
-       DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id);
-
        mutex_lock(&dev->mode_config.mutex);
 
-       connector = drm_connector_find(dev, out_resp->connector_id);
+       connector = drm_connector_lookup(dev, out_resp->connector_id);
        if (!connector) {
                ret = -ENOENT;
                goto out_unlock;
@@ -2213,6 +2233,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data,
 out:
        drm_modeset_unlock(&dev->mode_config.connection_mutex);
 
+       drm_connector_unreference(connector);
 out_unlock:
        mutex_unlock(&dev->mode_config.mutex);
 
@@ -2857,13 +2878,14 @@ int drm_mode_setcrtc(struct drm_device *dev, void *data,
                }
 
                for (i = 0; i < crtc_req->count_connectors; i++) {
+                       connector_set[i] = NULL;
                        set_connectors_ptr = (uint32_t __user *)(unsigned long)crtc_req->set_connectors_ptr;
                        if (get_user(out_id, &set_connectors_ptr[i])) {
                                ret = -EFAULT;
                                goto out;
                        }
 
-                       connector = drm_connector_find(dev, out_id);
+                       connector = drm_connector_lookup(dev, out_id);
                        if (!connector) {
                                DRM_DEBUG_KMS("Connector id %d unknown\n",
                                                out_id);
@@ -2891,6 +2913,12 @@ out:
        if (fb)
                drm_framebuffer_unreference(fb);
 
+       if (connector_set) {
+               for (i = 0; i < crtc_req->count_connectors; i++) {
+                       if (connector_set[i])
+                               drm_connector_unreference(connector_set[i]);
+               }
+       }
        kfree(connector_set);
        drm_mode_destroy(dev, mode);
        drm_modeset_unlock_all(dev);
@@ -3423,17 +3451,35 @@ int drm_mode_addfb2(struct drm_device *dev,
        if (IS_ERR(fb))
                return PTR_ERR(fb);
 
-       /* Transfer ownership to the filp for reaping on close */
-
        DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);
-       mutex_lock(&file_priv->fbs_lock);
        r->fb_id = fb->base.id;
+
+       /* Transfer ownership to the filp for reaping on close */
+       mutex_lock(&file_priv->fbs_lock);
        list_add(&fb->filp_head, &file_priv->fbs);
        mutex_unlock(&file_priv->fbs_lock);
 
        return 0;
 }
 
+struct drm_mode_rmfb_work {
+       struct work_struct work;
+       struct list_head fbs;
+};
+
+static void drm_mode_rmfb_work_fn(struct work_struct *w)
+{
+       struct drm_mode_rmfb_work *arg = container_of(w, typeof(*arg), work);
+
+       while (!list_empty(&arg->fbs)) {
+               struct drm_framebuffer *fb =
+                       list_first_entry(&arg->fbs, typeof(*fb), filp_head);
+
+               list_del_init(&fb->filp_head);
+               drm_framebuffer_remove(fb);
+       }
+}
+
 /**
  * drm_mode_rmfb - remove an FB from the configuration
  * @dev: drm device for the ioctl
@@ -3458,30 +3504,49 @@ int drm_mode_rmfb(struct drm_device *dev,
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       mutex_lock(&file_priv->fbs_lock);
-       mutex_lock(&dev->mode_config.fb_lock);
-       fb = __drm_framebuffer_lookup(dev, *id);
+       fb = drm_framebuffer_lookup(dev, *id);
        if (!fb)
-               goto fail_lookup;
+               return -ENOENT;
 
+       mutex_lock(&file_priv->fbs_lock);
        list_for_each_entry(fbl, &file_priv->fbs, filp_head)
                if (fb == fbl)
                        found = 1;
-       if (!found)
-               goto fail_lookup;
+       if (!found) {
+               mutex_unlock(&file_priv->fbs_lock);
+               goto fail_unref;
+       }
 
        list_del_init(&fb->filp_head);
-       mutex_unlock(&dev->mode_config.fb_lock);
        mutex_unlock(&file_priv->fbs_lock);
 
+       /* drop the reference we picked up in framebuffer lookup */
        drm_framebuffer_unreference(fb);
 
-       return 0;
+       /*
+        * we now own the reference that was stored in the fbs list
+        *
+        * drm_framebuffer_remove may fail with -EINTR on pending signals,
+        * so run this in a separate stack as there's no way to correctly
+        * handle this after the fb is already removed from the lookup table.
+        */
+       if (drm_framebuffer_read_refcount(fb) > 1) {
+               struct drm_mode_rmfb_work arg;
 
-fail_lookup:
-       mutex_unlock(&dev->mode_config.fb_lock);
-       mutex_unlock(&file_priv->fbs_lock);
+               INIT_WORK_ONSTACK(&arg.work, drm_mode_rmfb_work_fn);
+               INIT_LIST_HEAD(&arg.fbs);
+               list_add_tail(&fb->filp_head, &arg.fbs);
 
+               schedule_work(&arg.work);
+               flush_work(&arg.work);
+               destroy_work_on_stack(&arg.work);
+       } else
+               drm_framebuffer_unreference(fb);
+
+       return 0;
+
+fail_unref:
+       drm_framebuffer_unreference(fb);
        return -ENOENT;
 }
 
@@ -3627,7 +3692,6 @@ out_err1:
        return ret;
 }
 
-
 /**
  * drm_fb_release - remove and free the FBs on this file
  * @priv: drm file for the ioctl
@@ -3642,6 +3706,9 @@ out_err1:
 void drm_fb_release(struct drm_file *priv)
 {
        struct drm_framebuffer *fb, *tfb;
+       struct drm_mode_rmfb_work arg;
+
+       INIT_LIST_HEAD(&arg.fbs);
 
        /*
         * When the file gets released that means no one else can access the fb
@@ -3654,10 +3721,22 @@ void drm_fb_release(struct drm_file *priv)
         * at it any more.
         */
        list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) {
-               list_del_init(&fb->filp_head);
+               if (drm_framebuffer_read_refcount(fb) > 1) {
+                       list_move_tail(&fb->filp_head, &arg.fbs);
+               } else {
+                       list_del_init(&fb->filp_head);
 
-               /* This drops the fpriv->fbs reference. */
-               drm_framebuffer_unreference(fb);
+                       /* This drops the fpriv->fbs reference. */
+                       drm_framebuffer_unreference(fb);
+               }
+       }
+
+       if (!list_empty(&arg.fbs)) {
+               INIT_WORK_ONSTACK(&arg.work, drm_mode_rmfb_work_fn);
+
+               schedule_work(&arg.work);
+               flush_work(&arg.work);
+               destroy_work_on_stack(&arg.work);
        }
 }
 
@@ -4029,7 +4108,7 @@ void drm_property_destroy(struct drm_device *dev, struct drm_property *property)
 
        if (property->num_values)
                kfree(property->values);
-       drm_mode_object_put(dev, &property->base);
+       drm_mode_object_unregister(dev, &property->base);
        list_del(&property->head);
        kfree(property);
 }
@@ -4234,6 +4313,20 @@ done:
        return ret;
 }
 
+static void drm_property_free_blob(struct kref *kref)
+{
+       struct drm_property_blob *blob =
+               container_of(kref, struct drm_property_blob, base.refcount);
+
+       mutex_lock(&blob->dev->mode_config.blob_lock);
+       list_del(&blob->head_global);
+       mutex_unlock(&blob->dev->mode_config.blob_lock);
+
+       drm_mode_object_unregister(blob->dev, &blob->base);
+
+       kfree(blob);
+}
+
 /**
  * drm_property_create_blob - Create new blob property
  *
@@ -4271,47 +4364,22 @@ drm_property_create_blob(struct drm_device *dev, size_t length,
        if (data)
                memcpy(blob->data, data, length);
 
-       mutex_lock(&dev->mode_config.blob_lock);
-
-       ret = drm_mode_object_get(dev, &blob->base, DRM_MODE_OBJECT_BLOB);
+       ret = drm_mode_object_get_reg(dev, &blob->base, DRM_MODE_OBJECT_BLOB,
+                                     true, drm_property_free_blob);
        if (ret) {
                kfree(blob);
-               mutex_unlock(&dev->mode_config.blob_lock);
                return ERR_PTR(-EINVAL);
        }
 
-       kref_init(&blob->refcount);
-
+       mutex_lock(&dev->mode_config.blob_lock);
        list_add_tail(&blob->head_global,
                      &dev->mode_config.property_blob_list);
-
        mutex_unlock(&dev->mode_config.blob_lock);
 
        return blob;
 }
 EXPORT_SYMBOL(drm_property_create_blob);
 
-/**
- * drm_property_free_blob - Blob property destructor
- *
- * Internal free function for blob properties; must not be used directly.
- *
- * @kref: Reference
- */
-static void drm_property_free_blob(struct kref *kref)
-{
-       struct drm_property_blob *blob =
-               container_of(kref, struct drm_property_blob, refcount);
-
-       WARN_ON(!mutex_is_locked(&blob->dev->mode_config.blob_lock));
-
-       list_del(&blob->head_global);
-       list_del(&blob->head_file);
-       drm_mode_object_put(blob->dev, &blob->base);
-
-       kfree(blob);
-}
-
 /**
  * drm_property_unreference_blob - Unreference a blob property
  *
@@ -4321,41 +4389,13 @@ static void drm_property_free_blob(struct kref *kref)
  */
 void drm_property_unreference_blob(struct drm_property_blob *blob)
 {
-       struct drm_device *dev;
-
        if (!blob)
                return;
 
-       dev = blob->dev;
-
-       DRM_DEBUG("%p: blob ID: %d (%d)\n", blob, blob->base.id, atomic_read(&blob->refcount.refcount));
-
-       if (kref_put_mutex(&blob->refcount, drm_property_free_blob,
-                          &dev->mode_config.blob_lock))
-               mutex_unlock(&dev->mode_config.blob_lock);
-       else
-               might_lock(&dev->mode_config.blob_lock);
+       drm_mode_object_unreference(&blob->base);
 }
 EXPORT_SYMBOL(drm_property_unreference_blob);
 
-/**
- * drm_property_unreference_blob_locked - Unreference a blob property with blob_lock held
- *
- * Drop a reference on a blob property. May free the object. This must be
- * called with blob_lock held.
- *
- * @blob: Pointer to blob property
- */
-static void drm_property_unreference_blob_locked(struct drm_property_blob *blob)
-{
-       if (!blob)
-               return;
-
-       DRM_DEBUG("%p: blob ID: %d (%d)\n", blob, blob->base.id, atomic_read(&blob->refcount.refcount));
-
-       kref_put(&blob->refcount, drm_property_free_blob);
-}
-
 /**
  * drm_property_destroy_user_blobs - destroy all blobs created by this client
  * @dev:       DRM device
@@ -4366,14 +4406,14 @@ void drm_property_destroy_user_blobs(struct drm_device *dev,
 {
        struct drm_property_blob *blob, *bt;
 
-       mutex_lock(&dev->mode_config.blob_lock);
-
+       /*
+        * When the file gets released that means no one else can access the
+        * blob list any more, so no need to grab dev->blob_lock.
+        */
        list_for_each_entry_safe(blob, bt, &file_priv->blobs, head_file) {
                list_del_init(&blob->head_file);
-               drm_property_unreference_blob_locked(blob);
+               drm_property_unreference_blob(blob);
        }
-
-       mutex_unlock(&dev->mode_config.blob_lock);
 }
 
 /**
@@ -4385,35 +4425,11 @@ void drm_property_destroy_user_blobs(struct drm_device *dev,
  */
 struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob)
 {
-       DRM_DEBUG("%p: blob ID: %d (%d)\n", blob, blob->base.id, atomic_read(&blob->refcount.refcount));
-       kref_get(&blob->refcount);
+       drm_mode_object_reference(&blob->base);
        return blob;
 }
 EXPORT_SYMBOL(drm_property_reference_blob);
 
-/*
- * Like drm_property_lookup_blob, but does not return an additional reference.
- * Must be called with blob_lock held.
- */
-static struct drm_property_blob *__drm_property_lookup_blob(struct drm_device *dev,
-                                                           uint32_t id)
-{
-       struct drm_mode_object *obj = NULL;
-       struct drm_property_blob *blob;
-
-       WARN_ON(!mutex_is_locked(&dev->mode_config.blob_lock));
-
-       mutex_lock(&dev->mode_config.idr_mutex);
-       obj = idr_find(&dev->mode_config.crtc_idr, id);
-       if (!obj || (obj->type != DRM_MODE_OBJECT_BLOB) || (obj->id != id))
-               blob = NULL;
-       else
-               blob = obj_to_blob(obj);
-       mutex_unlock(&dev->mode_config.idr_mutex);
-
-       return blob;
-}
-
 /**
  * drm_property_lookup_blob - look up a blob property and take a reference
  * @dev: drm device
@@ -4426,16 +4442,12 @@ static struct drm_property_blob *__drm_property_lookup_blob(struct drm_device *d
 struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev,
                                                   uint32_t id)
 {
-       struct drm_property_blob *blob;
-
-       mutex_lock(&dev->mode_config.blob_lock);
-       blob = __drm_property_lookup_blob(dev, id);
-       if (blob) {
-               if (!kref_get_unless_zero(&blob->refcount))
-                       blob = NULL;
-       }
-       mutex_unlock(&dev->mode_config.blob_lock);
+       struct drm_mode_object *obj;
+       struct drm_property_blob *blob = NULL;
 
+       obj = _object_find(dev, id, DRM_MODE_OBJECT_BLOB);
+       if (obj)
+               blob = obj_to_blob(obj);
        return blob;
 }
 EXPORT_SYMBOL(drm_property_lookup_blob);
@@ -4540,26 +4552,21 @@ int drm_mode_getblob_ioctl(struct drm_device *dev,
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       drm_modeset_lock_all(dev);
-       mutex_lock(&dev->mode_config.blob_lock);
-       blob = __drm_property_lookup_blob(dev, out_resp->blob_id);
-       if (!blob) {
-               ret = -ENOENT;
-               goto done;
-       }
+       blob = drm_property_lookup_blob(dev, out_resp->blob_id);
+       if (!blob)
+               return -ENOENT;
 
        if (out_resp->length == blob->length) {
                blob_ptr = (void __user *)(unsigned long)out_resp->data;
                if (copy_to_user(blob_ptr, blob->data, blob->length)) {
                        ret = -EFAULT;
-                       goto done;
+                       goto unref;
                }
        }
        out_resp->length = blob->length;
+unref:
+       drm_property_unreference_blob(blob);
 
-done:
-       mutex_unlock(&dev->mode_config.blob_lock);
-       drm_modeset_unlock_all(dev);
        return ret;
 }
 
@@ -4638,13 +4645,11 @@ int drm_mode_destroyblob_ioctl(struct drm_device *dev,
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
 
-       mutex_lock(&dev->mode_config.blob_lock);
-       blob = __drm_property_lookup_blob(dev, out_resp->blob_id);
-       if (!blob) {
-               ret = -ENOENT;
-               goto err;
-       }
+       blob = drm_property_lookup_blob(dev, out_resp->blob_id);
+       if (!blob)
+               return -ENOENT;
 
+       mutex_lock(&dev->mode_config.blob_lock);
        /* Ensure the property was actually created by this user. */
        list_for_each_entry(bt, &file_priv->blobs, head_file) {
                if (bt == blob) {
@@ -4661,13 +4666,18 @@ int drm_mode_destroyblob_ioctl(struct drm_device *dev,
        /* We must drop head_file here, because we may not be the last
         * reference on the blob. */
        list_del_init(&blob->head_file);
-       drm_property_unreference_blob_locked(blob);
        mutex_unlock(&dev->mode_config.blob_lock);
 
+       /* One reference from lookup, and one from the filp. */
+       drm_property_unreference_blob(blob);
+       drm_property_unreference_blob(blob);
+
        return 0;
 
 err:
        mutex_unlock(&dev->mode_config.blob_lock);
+       drm_property_unreference_blob(blob);
+
        return ret;
 }
 
@@ -4831,19 +4841,7 @@ bool drm_property_change_valid_get(struct drm_property *property,
                if (value == 0)
                        return true;
 
-               /* handle refcnt'd objects specially: */
-               if (property->values[0] == DRM_MODE_OBJECT_FB) {
-                       struct drm_framebuffer *fb;
-                       fb = drm_framebuffer_lookup(property->dev, value);
-                       if (fb) {
-                               *ref = &fb->base;
-                               return true;
-                       } else {
-                               return false;
-                       }
-               } else {
-                       return _object_find(property->dev, value, property->values[0]) != NULL;
-               }
+               return _object_find(property->dev, value, property->values[0]) != NULL;
        }
 
        for (i = 0; i < property->num_values; i++)
@@ -4859,8 +4857,7 @@ void drm_property_change_valid_put(struct drm_property *property,
                return;
 
        if (drm_property_type_is(property, DRM_MODE_PROP_OBJECT)) {
-               if (property->values[0] == DRM_MODE_OBJECT_FB)
-                       drm_framebuffer_unreference(obj_to_fb(ref));
+               drm_mode_object_unreference(ref);
        } else if (drm_property_type_is(property, DRM_MODE_PROP_BLOB))
                drm_property_unreference_blob(obj_to_blob(ref));
 }
@@ -4991,7 +4988,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
        }
        if (!obj->properties) {
                ret = -EINVAL;
-               goto out;
+               goto out_unref;
        }
 
        ret = get_properties(obj, file_priv->atomic,
@@ -4999,6 +4996,8 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
                        (uint64_t __user *)(unsigned long)(arg->prop_values_ptr),
                        &arg->count_props);
 
+out_unref:
+       drm_mode_object_unreference(obj);
 out:
        drm_modeset_unlock_all(dev);
        return ret;
@@ -5041,25 +5040,25 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
                goto out;
        }
        if (!arg_obj->properties)
-               goto out;
+               goto out_unref;
 
        for (i = 0; i < arg_obj->properties->count; i++)
                if (arg_obj->properties->properties[i]->base.id == arg->prop_id)
                        break;
 
        if (i == arg_obj->properties->count)
-               goto out;
+               goto out_unref;
 
        prop_obj = drm_mode_object_find(dev, arg->prop_id,
                                        DRM_MODE_OBJECT_PROPERTY);
        if (!prop_obj) {
                ret = -ENOENT;
-               goto out;
+               goto out_unref;
        }
        property = obj_to_property(prop_obj);
 
        if (!drm_property_change_valid_get(property, arg->value, &ref))
-               goto out;
+               goto out_unref;
 
        switch (arg_obj->type) {
        case DRM_MODE_OBJECT_CONNECTOR:
@@ -5077,6 +5076,8 @@ int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
 
        drm_property_change_valid_put(property, ref);
 
+out_unref:
+       drm_mode_object_unreference(arg_obj);
 out:
        drm_modeset_unlock_all(dev);
        return ret;
@@ -5914,6 +5915,15 @@ void drm_mode_config_cleanup(struct drm_device *dev)
                drm_property_destroy(dev, property);
        }
 
+       list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list,
+                                head) {
+               plane->funcs->destroy(plane);
+       }
+
+       list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
+               crtc->funcs->destroy(crtc);
+       }
+
        list_for_each_entry_safe(blob, bt, &dev->mode_config.property_blob_list,
                                 head_global) {
                drm_property_unreference_blob(blob);
@@ -5929,16 +5939,7 @@ void drm_mode_config_cleanup(struct drm_device *dev)
         */
        WARN_ON(!list_empty(&dev->mode_config.fb_list));
        list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) {
-               drm_framebuffer_free(&fb->refcount);
-       }
-
-       list_for_each_entry_safe(plane, plt, &dev->mode_config.plane_list,
-                                head) {
-               plane->funcs->destroy(plane);
-       }
-
-       list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) {
-               crtc->funcs->destroy(crtc);
+               drm_framebuffer_free(&fb->base.refcount);
        }
 
        ida_destroy(&dev->mode_config.connector_ida);
index 79555d2b1b87c2760a241f34d7f7661ff808280c..a6e42433ef0e0d5cde2d87739fb778e59336b705 100644 (file)
@@ -170,11 +170,14 @@ drm_encoder_disable(struct drm_encoder *encoder)
 {
        const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
 
+       if (!encoder_funcs)
+               return;
+
        drm_bridge_disable(encoder->bridge);
 
        if (encoder_funcs->disable)
                (*encoder_funcs->disable)(encoder);
-       else
+       else if (encoder_funcs->dpms)
                (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF);
 
        drm_bridge_post_disable(encoder->bridge);
@@ -248,6 +251,9 @@ drm_crtc_prepare_encoders(struct drm_device *dev)
 
        drm_for_each_encoder(encoder, dev) {
                encoder_funcs = encoder->helper_private;
+               if (!encoder_funcs)
+                       continue;
+
                /* Disable unused encoders */
                if (encoder->crtc == NULL)
                        drm_encoder_disable(encoder);
@@ -326,6 +332,10 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                if (encoder->crtc != crtc)
                        continue;
 
+               encoder_funcs = encoder->helper_private;
+               if (!encoder_funcs)
+                       continue;
+
                ret = drm_bridge_mode_fixup(encoder->bridge,
                        mode, adjusted_mode);
                if (!ret) {
@@ -360,11 +370,15 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                if (encoder->crtc != crtc)
                        continue;
 
+               encoder_funcs = encoder->helper_private;
+               if (!encoder_funcs)
+                       continue;
+
                drm_bridge_disable(encoder->bridge);
 
-               encoder_funcs = encoder->helper_private;
                /* Disable the encoders as the first thing we do. */
-               encoder_funcs->prepare(encoder);
+               if (encoder_funcs->prepare)
+                       encoder_funcs->prepare(encoder);
 
                drm_bridge_post_disable(encoder->bridge);
        }
@@ -385,11 +399,15 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                if (encoder->crtc != crtc)
                        continue;
 
+               encoder_funcs = encoder->helper_private;
+               if (!encoder_funcs)
+                       continue;
+
                DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n",
                        encoder->base.id, encoder->name,
                        mode->base.id, mode->name);
-               encoder_funcs = encoder->helper_private;
-               encoder_funcs->mode_set(encoder, mode, adjusted_mode);
+               if (encoder_funcs->mode_set)
+                       encoder_funcs->mode_set(encoder, mode, adjusted_mode);
 
                drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode);
        }
@@ -402,10 +420,14 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                if (encoder->crtc != crtc)
                        continue;
 
+               encoder_funcs = encoder->helper_private;
+               if (!encoder_funcs)
+                       continue;
+
                drm_bridge_pre_enable(encoder->bridge);
 
-               encoder_funcs = encoder->helper_private;
-               encoder_funcs->commit(encoder);
+               if (encoder_funcs->commit)
+                       encoder_funcs->commit(encoder);
 
                drm_bridge_enable(encoder->bridge);
        }
@@ -456,6 +478,9 @@ drm_crtc_helper_disable(struct drm_crtc *crtc)
                         * between them is henceforth no longer available.
                         */
                        connector->dpms = DRM_MODE_DPMS_OFF;
+
+                       /* we keep a reference while the encoder is bound */
+                       drm_connector_unreference(connector);
                }
        }
 
@@ -606,6 +631,11 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
                mode_changed = true;
        }
 
+       /* take a reference on all connectors in set */
+       for (ro = 0; ro < set->num_connectors; ro++) {
+               drm_connector_reference(set->connectors[ro]);
+       }
+
        /* a) traverse passed in connector list and get encoders for them */
        count = 0;
        drm_for_each_connector(connector, dev) {
@@ -724,6 +754,12 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
                }
        }
 
+       /* after fail drop reference on all connectors in save set */
+       count = 0;
+       drm_for_each_connector(connector, dev) {
+               drm_connector_unreference(&save_connectors[count++]);
+       }
+
        kfree(save_connectors);
        kfree(save_encoders);
        return 0;
@@ -740,6 +776,11 @@ fail:
                *connector = save_connectors[count++];
        }
 
+       /* after fail drop reference on all connectors in set */
+       for (ro = 0; ro < set->num_connectors; ro++) {
+               drm_connector_unreference(set->connectors[ro]);
+       }
+
        /* Try to restore the config */
        if (mode_changed &&
            !drm_crtc_helper_set_mode(save_set.crtc, save_set.mode, save_set.x,
@@ -771,12 +812,15 @@ static void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode)
        struct drm_bridge *bridge = encoder->bridge;
        const struct drm_encoder_helper_funcs *encoder_funcs;
 
+       encoder_funcs = encoder->helper_private;
+       if (!encoder_funcs)
+               return;
+
        if (mode == DRM_MODE_DPMS_ON)
                drm_bridge_pre_enable(bridge);
        else
                drm_bridge_disable(bridge);
 
-       encoder_funcs = encoder->helper_private;
        if (encoder_funcs->dpms)
                encoder_funcs->dpms(encoder, mode);
 
@@ -1053,10 +1097,12 @@ int drm_helper_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 
        if (plane->funcs->atomic_duplicate_state)
                plane_state = plane->funcs->atomic_duplicate_state(plane);
-       else if (plane->state)
+       else {
+               if (!plane->state)
+                       drm_atomic_helper_plane_reset(plane);
+
                plane_state = drm_atomic_helper_plane_duplicate_state(plane);
-       else
-               plane_state = kzalloc(sizeof(*plane_state), GFP_KERNEL);
+       }
        if (!plane_state)
                return -ENOMEM;
        plane_state->plane = plane;
index 247dc8b625645b308631201486df4bfd1556eef8..a78c138282ea7a90a0bacd09a127ada643db1a16 100644 (file)
@@ -33,8 +33,8 @@
 
 int drm_mode_object_get(struct drm_device *dev,
                        struct drm_mode_object *obj, uint32_t obj_type);
-void drm_mode_object_put(struct drm_device *dev,
-                        struct drm_mode_object *object);
+void drm_mode_object_unregister(struct drm_device *dev,
+                               struct drm_mode_object *object);
 
 /* drm_atomic.c */
 int drm_atomic_get_property(struct drm_mode_object *obj,
index f73b38b33a8eb0c22ba0edfabbd07bdc82b3212c..3334baacf43d8d98d15546f9bb7019348cc6a2fb 100644 (file)
@@ -159,6 +159,12 @@ static ssize_t auxdev_read(struct file *file, char __user *buf, size_t count,
                uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
                ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
 
+               if (signal_pending(current)) {
+                       res = num_bytes_processed ?
+                               num_bytes_processed : -ERESTARTSYS;
+                       goto out;
+               }
+
                res = drm_dp_dpcd_read(aux_dev->aux, *offset, localbuf, todo);
                if (res <= 0) {
                        res = num_bytes_processed ? num_bytes_processed : res;
@@ -202,6 +208,12 @@ static ssize_t auxdev_write(struct file *file, const char __user *buf,
                uint8_t localbuf[DP_AUX_MAX_PAYLOAD_BYTES];
                ssize_t todo = min_t(size_t, bytes_pending, sizeof(localbuf));
 
+               if (signal_pending(current)) {
+                       res = num_bytes_processed ?
+                               num_bytes_processed : -ERESTARTSYS;
+                       goto out;
+               }
+
                if (__copy_from_user(localbuf,
                                     buf + num_bytes_processed, todo)) {
                        res = num_bytes_processed ?
index df64ed1c0139e9213912e0f05043489ce6f0d0ba..eeaf5a7c3aa767a6676b9b6054a020b3fea87445 100644 (file)
@@ -178,8 +178,8 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request,
                              unsigned int offset, void *buffer, size_t size)
 {
        struct drm_dp_aux_msg msg;
-       unsigned int retry;
-       int err = 0;
+       unsigned int retry, native_reply;
+       int err = 0, ret = 0;
 
        memset(&msg, 0, sizeof(msg));
        msg.address = offset;
@@ -196,38 +196,39 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request,
         * sufficient, bump to 32 which makes Dell 4k monitors happier.
         */
        for (retry = 0; retry < 32; retry++) {
-
-               err = aux->transfer(aux, &msg);
-               if (err < 0) {
-                       if (err == -EBUSY)
-                               continue;
-
-                       goto unlock;
+               if (ret != 0 && ret != -ETIMEDOUT) {
+                       usleep_range(AUX_RETRY_INTERVAL,
+                                    AUX_RETRY_INTERVAL + 100);
                }
 
+               ret = aux->transfer(aux, &msg);
 
-               switch (msg.reply & DP_AUX_NATIVE_REPLY_MASK) {
-               case DP_AUX_NATIVE_REPLY_ACK:
-                       if (err < size)
-                               err = -EPROTO;
-                       goto unlock;
+               if (ret > 0) {
+                       native_reply = msg.reply & DP_AUX_NATIVE_REPLY_MASK;
+                       if (native_reply == DP_AUX_NATIVE_REPLY_ACK) {
+                               if (ret == size)
+                                       goto unlock;
 
-               case DP_AUX_NATIVE_REPLY_NACK:
-                       err = -EIO;
-                       goto unlock;
-
-               case DP_AUX_NATIVE_REPLY_DEFER:
-                       usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100);
-                       break;
+                               ret = -EPROTO;
+                       } else
+                               ret = -EIO;
                }
+
+               /*
+                * We want the error we return to be the error we received on
+                * the first transaction, since we may get a different error the
+                * next time we retry
+                */
+               if (!err)
+                       err = ret;
        }
 
        DRM_DEBUG_KMS("too many retries, giving up\n");
-       err = -EIO;
+       ret = err;
 
 unlock:
        mutex_unlock(&aux->hw_mutex);
-       return err;
+       return ret;
 }
 
 /**
@@ -247,6 +248,25 @@ unlock:
 ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,
                         void *buffer, size_t size)
 {
+       int ret;
+
+       /*
+        * HP ZR24w corrupts the first DPCD access after entering power save
+        * mode. Eg. on a read, the entire buffer will be filled with the same
+        * byte. Do a throw away read to avoid corrupting anything we care
+        * about. Afterwards things will work correctly until the monitor
+        * gets woken up and subsequently re-enters power save mode.
+        *
+        * The user pressing any button on the monitor is enough to wake it
+        * up, so there is no particularly good place to do the workaround.
+        * We just have to do it before any DPCD access and hope that the
+        * monitor doesn't power down exactly after the throw away read.
+        */
+       ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, DP_DPCD_REV, buffer,
+                                1);
+       if (ret != 1)
+               return ret;
+
        return drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, buffer,
                                  size);
 }
index 71ea0521ea96a94673752d56371516c33be84e1b..a13edf5de2d6daafc0e89849a6cdd1c324835345 100644 (file)
@@ -2756,7 +2756,7 @@ static void drm_dp_mst_dump_mstb(struct seq_file *m,
 
        seq_printf(m, "%smst: %p, %d\n", prefix, mstb, mstb->num_ports);
        list_for_each_entry(port, &mstb->ports, next) {
-               seq_printf(m, "%sport: %d: ddps: %d ldps: %d, sdp: %d/%d, %p, conn: %p\n", prefix, port->port_num, port->ddps, port->ldps, port->num_sdp_streams, port->num_sdp_stream_sinks, port, port->connector);
+               seq_printf(m, "%sport: %d: input: %d: pdt: %d, ddps: %d ldps: %d, sdp: %d/%d, %p, conn: %p\n", prefix, port->port_num, port->input, port->pdt, port->ddps, port->ldps, port->num_sdp_streams, port->num_sdp_stream_sinks, port, port->connector);
                if (port->mstb)
                        drm_dp_mst_dump_mstb(m, port->mstb);
        }
@@ -2777,6 +2777,16 @@ static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
        return false;
 }
 
+static void fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr,
+                              struct drm_dp_mst_port *port, char *name,
+                              int namelen)
+{
+       struct edid *mst_edid;
+
+       mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port);
+       drm_edid_get_monitor_name(mst_edid, name, namelen);
+}
+
 /**
  * drm_dp_mst_dump_topology(): dump topology to seq file.
  * @m: seq_file to dump output to
@@ -2789,6 +2799,7 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
 {
        int i;
        struct drm_dp_mst_port *port;
+
        mutex_lock(&mgr->lock);
        if (mgr->mst_primary)
                drm_dp_mst_dump_mstb(m, mgr->mst_primary);
@@ -2797,14 +2808,21 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
        mutex_unlock(&mgr->lock);
 
        mutex_lock(&mgr->payload_lock);
-       seq_printf(m, "vcpi: %lx %lx\n", mgr->payload_mask, mgr->vcpi_mask);
+       seq_printf(m, "vcpi: %lx %lx %d\n", mgr->payload_mask, mgr->vcpi_mask,
+               mgr->max_payloads);
 
        for (i = 0; i < mgr->max_payloads; i++) {
                if (mgr->proposed_vcpis[i]) {
+                       char name[14];
+
                        port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);
-                       seq_printf(m, "vcpi %d: %d %d %d\n", i, port->port_num, port->vcpi.vcpi, port->vcpi.num_slots);
+                       fetch_monitor_name(mgr, port, name, sizeof(name));
+                       seq_printf(m, "vcpi %d: %d %d %d sink name: %s\n", i,
+                                  port->port_num, port->vcpi.vcpi,
+                                  port->vcpi.num_slots,
+                                  (*name != 0) ? name :  "Unknown");
                } else
-                       seq_printf(m, "vcpi %d:unsed\n", i);
+                       seq_printf(m, "vcpi %d:unused\n", i);
        }
        for (i = 0; i < mgr->max_payloads; i++) {
                seq_printf(m, "payload %d: %d, %d, %d\n",
@@ -2844,8 +2862,9 @@ void drm_dp_mst_dump_topology(struct seq_file *m,
                for (i = 0; i < 0x3; i++)
                        seq_printf(m, "%02x", buf[i]);
                seq_printf(m, " devid: ");
-               for (i = 0x3; i < 0x8; i++)
+               for (i = 0x3; i < 0x8 && buf[i]; i++)
                        seq_printf(m, "%c", buf[i]);
+
                seq_printf(m, " revision: hw: %x.%x sw: %x.%x", buf[0x9] >> 4, buf[0x9] & 0xf, buf[0xa], buf[0xb]);
                seq_printf(m, "\n");
                bret = dump_dp_payload_table(mgr, buf);
index 167c8d3d4a31e7fd14006fa5dedd946fb221301e..bff89226a344bb292071d26dff56efb98760f951 100644 (file)
 #include "drm_legacy.h"
 #include "drm_internal.h"
 
-unsigned int drm_debug = 0;    /* bitmask of DRM_UT_x */
+/*
+ * drm_debug: Enable debug output.
+ * Bitmask of DRM_UT_x. See include/drm/drmP.h for details.
+ */
+unsigned int drm_debug = 0;
 EXPORT_SYMBOL(drm_debug);
 
 MODULE_AUTHOR(CORE_AUTHOR);
 MODULE_DESCRIPTION(CORE_DESC);
 MODULE_LICENSE("GPL and additional rights");
-MODULE_PARM_DESC(debug, "Enable debug output");
+MODULE_PARM_DESC(debug, "Enable debug output, where each bit enables a debug category.\n"
+"\t\tBit 0 (0x01) will enable CORE messages (drm core code)\n"
+"\t\tBit 1 (0x02) will enable DRIVER messages (drm controller code)\n"
+"\t\tBit 2 (0x04) will enable KMS messages (modesetting code)\n"
+"\t\tBit 3 (0x08) will enable PRIME messages (prime code)\n"
+"\t\tBit 4 (0x10) will enable ATOMIC messages (atomic code)\n"
+"\t\tBit 5 (0x20) will enable VBL messages (vblank code)");
 module_param_named(debug, drm_debug, int, 0600);
 
 static DEFINE_SPINLOCK(drm_minor_lock);
@@ -111,19 +121,11 @@ static void drm_master_destroy(struct kref *kref)
 {
        struct drm_master *master = container_of(kref, struct drm_master, refcount);
        struct drm_device *dev = master->minor->dev;
-       struct drm_map_list *r_list, *list_temp;
 
-       mutex_lock(&dev->struct_mutex);
        if (dev->driver->master_destroy)
                dev->driver->master_destroy(dev, master);
 
-       list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
-               if (r_list->master == master) {
-                       drm_legacy_rmmap_locked(dev, r_list->map);
-                       r_list = NULL;
-               }
-       }
-       mutex_unlock(&dev->struct_mutex);
+       drm_legacy_master_rmmaps(dev, master);
 
        idr_destroy(&master->magic_map);
        kfree(master->unique);
@@ -588,6 +590,7 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
        spin_lock_init(&dev->buf_lock);
        spin_lock_init(&dev->event_lock);
        mutex_init(&dev->struct_mutex);
+       mutex_init(&dev->filelist_mutex);
        mutex_init(&dev->ctxlist_mutex);
        mutex_init(&dev->master_mutex);
 
@@ -715,7 +718,11 @@ EXPORT_SYMBOL(drm_dev_unref);
  *
  * Register the DRM device @dev with the system, advertise device to user-space
  * and start normal device operation. @dev must be allocated via drm_dev_alloc()
- * previously.
+ * previously. Right after drm_dev_register() the driver should call
+ * drm_connector_register_all() to register all connectors in sysfs. This is
+ * a separate call for backward compatibility with drivers still using
+ * the deprecated ->load() callback, where connectors are registered from within
+ * the ->load() callback.
  *
  * Never call this twice on any device!
  *
index 558ef9fc39e6c2104b90725950fb7a562e9eefa4..7df26d4b7ad8b5775c97df7e5ab3fdab315195e5 100644 (file)
@@ -3293,6 +3293,46 @@ monitor_name(struct detailed_timing *t, void *data)
                *(u8 **)data = t->data.other_data.data.str.str;
 }
 
+static int get_monitor_name(struct edid *edid, char name[13])
+{
+       char *edid_name = NULL;
+       int mnl;
+
+       if (!edid || !name)
+               return 0;
+
+       drm_for_each_detailed_block((u8 *)edid, monitor_name, &edid_name);
+       for (mnl = 0; edid_name && mnl < 13; mnl++) {
+               if (edid_name[mnl] == 0x0a)
+                       break;
+
+               name[mnl] = edid_name[mnl];
+       }
+
+       return mnl;
+}
+
+/**
+ * drm_edid_get_monitor_name - fetch the monitor name from the edid
+ * @edid: monitor EDID information
+ * @name: pointer to a character array to hold the name of the monitor
+ * @bufsize: The size of the name buffer (should be at least 14 chars.)
+ *
+ */
+void drm_edid_get_monitor_name(struct edid *edid, char *name, int bufsize)
+{
+       int name_length;
+       char buf[13];
+       
+       if (bufsize <= 0)
+               return;
+
+       name_length = min(get_monitor_name(edid, buf), bufsize - 1);
+       memcpy(name, buf, name_length);
+       name[name_length] = '\0';
+}
+EXPORT_SYMBOL(drm_edid_get_monitor_name);
+
 /**
  * drm_edid_to_eld - build ELD from EDID
  * @connector: connector corresponding to the HDMI/DP sink
@@ -3306,7 +3346,6 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
 {
        uint8_t *eld = connector->eld;
        u8 *cea;
-       u8 *name;
        u8 *db;
        int total_sad_count = 0;
        int mnl;
@@ -3320,14 +3359,8 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
                return;
        }
 
-       name = NULL;
-       drm_for_each_detailed_block((u8 *)edid, monitor_name, &name);
-       /* max: 13 bytes EDID, 16 bytes ELD */
-       for (mnl = 0; name && mnl < 13; mnl++) {
-               if (name[mnl] == 0x0a)
-                       break;
-               eld[20 + mnl] = name[mnl];
-       }
+       mnl = get_monitor_name(edid, eld + 20);
+
        eld[4] = (cea[1] << 5) | mnl;
        DRM_DEBUG_KMS("ELD monitor %s\n", eld + 20);
 
@@ -3868,6 +3901,133 @@ static void drm_add_display_info(struct edid *edid,
                info->color_formats |= DRM_COLOR_FORMAT_YCRCB422;
 }
 
+static int validate_displayid(u8 *displayid, int length, int idx)
+{
+       int i;
+       u8 csum = 0;
+       struct displayid_hdr *base;
+
+       base = (struct displayid_hdr *)&displayid[idx];
+
+       DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
+                     base->rev, base->bytes, base->prod_id, base->ext_count);
+
+       if (base->bytes + 5 > length - idx)
+               return -EINVAL;
+       for (i = idx; i <= base->bytes + 5; i++) {
+               csum += displayid[i];
+       }
+       if (csum) {
+               DRM_ERROR("DisplayID checksum invalid, remainder is %d\n", csum);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
+                                                           struct displayid_detailed_timings_1 *timings)
+{
+       struct drm_display_mode *mode;
+       unsigned pixel_clock = (timings->pixel_clock[0] |
+                               (timings->pixel_clock[1] << 8) |
+                               (timings->pixel_clock[2] << 16));
+       unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
+       unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
+       unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
+       unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1;
+       unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1;
+       unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1;
+       unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1;
+       unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1;
+       bool hsync_positive = (timings->hsync[1] >> 7) & 0x1;
+       bool vsync_positive = (timings->vsync[1] >> 7) & 0x1;
+       mode = drm_mode_create(dev);
+       if (!mode)
+               return NULL;
+
+       mode->clock = pixel_clock * 10;
+       mode->hdisplay = hactive;
+       mode->hsync_start = mode->hdisplay + hsync;
+       mode->hsync_end = mode->hsync_start + hsync_width;
+       mode->htotal = mode->hdisplay + hblank;
+
+       mode->vdisplay = vactive;
+       mode->vsync_start = mode->vdisplay + vsync;
+       mode->vsync_end = mode->vsync_start + vsync_width;
+       mode->vtotal = mode->vdisplay + vblank;
+
+       mode->flags = 0;
+       mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC;
+       mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC;
+       mode->type = DRM_MODE_TYPE_DRIVER;
+
+       if (timings->flags & 0x80)
+               mode->type |= DRM_MODE_TYPE_PREFERRED;
+       mode->vrefresh = drm_mode_vrefresh(mode);
+       drm_mode_set_name(mode);
+
+       return mode;
+}
+
+static int add_displayid_detailed_1_modes(struct drm_connector *connector,
+                                         struct displayid_block *block)
+{
+       struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
+       int i;
+       int num_timings;
+       struct drm_display_mode *newmode;
+       int num_modes = 0;
+       /* blocks must be multiple of 20 bytes length */
+       if (block->num_bytes % 20)
+               return 0;
+
+       num_timings = block->num_bytes / 20;
+       for (i = 0; i < num_timings; i++) {
+               struct displayid_detailed_timings_1 *timings = &det->timings[i];
+
+               newmode = drm_mode_displayid_detailed(connector->dev, timings);
+               if (!newmode)
+                       continue;
+
+               drm_mode_probed_add(connector, newmode);
+               num_modes++;
+       }
+       return num_modes;
+}
+
+static int add_displayid_detailed_modes(struct drm_connector *connector,
+                                       struct edid *edid)
+{
+       u8 *displayid;
+       int ret;
+       int idx = 1;
+       int length = EDID_LENGTH;
+       struct displayid_block *block;
+       int num_modes = 0;
+
+       displayid = drm_find_displayid_extension(edid);
+       if (!displayid)
+               return 0;
+
+       ret = validate_displayid(displayid, length, idx);
+       if (ret)
+               return 0;
+
+       idx += sizeof(struct displayid_hdr);
+       while (block = (struct displayid_block *)&displayid[idx],
+              idx + sizeof(struct displayid_block) <= length &&
+              idx + sizeof(struct displayid_block) + block->num_bytes <= length &&
+              block->num_bytes > 0) {
+               idx += block->num_bytes + sizeof(struct displayid_block);
+               switch (block->tag) {
+               case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
+                       num_modes += add_displayid_detailed_1_modes(connector, block);
+                       break;
+               }
+       }
+       return num_modes;
+}
+
 /**
  * drm_add_edid_modes - add modes from EDID data, if available
  * @connector: connector we're probing
@@ -3913,6 +4073,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
        num_modes += add_established_modes(connector, edid);
        num_modes += add_cea_modes(connector, edid);
        num_modes += add_alternate_cea_modes(connector, edid);
+       num_modes += add_displayid_detailed_modes(connector, edid);
        if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
                num_modes += add_inferred_modes(connector, edid);
 
@@ -4119,96 +4280,98 @@ drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame,
 }
 EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode);
 
+static int drm_parse_tiled_block(struct drm_connector *connector,
+                                struct displayid_block *block)
+{
+       struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
+       u16 w, h;
+       u8 tile_v_loc, tile_h_loc;
+       u8 num_v_tile, num_h_tile;
+       struct drm_tile_group *tg;
+
+       w = tile->tile_size[0] | tile->tile_size[1] << 8;
+       h = tile->tile_size[2] | tile->tile_size[3] << 8;
+
+       num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
+       num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
+       tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
+       tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
+
+       connector->has_tile = true;
+       if (tile->tile_cap & 0x80)
+               connector->tile_is_single_monitor = true;
+
+       connector->num_h_tile = num_h_tile + 1;
+       connector->num_v_tile = num_v_tile + 1;
+       connector->tile_h_loc = tile_h_loc;
+       connector->tile_v_loc = tile_v_loc;
+       connector->tile_h_size = w + 1;
+       connector->tile_v_size = h + 1;
+
+       DRM_DEBUG_KMS("tile cap 0x%x\n", tile->tile_cap);
+       DRM_DEBUG_KMS("tile_size %d x %d\n", w + 1, h + 1);
+       DRM_DEBUG_KMS("topo num tiles %dx%d, location %dx%d\n",
+                     num_h_tile + 1, num_v_tile + 1, tile_h_loc, tile_v_loc);
+       DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
+
+       tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
+       if (!tg) {
+               tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
+       }
+       if (!tg)
+               return -ENOMEM;
+
+       if (connector->tile_group != tg) {
+               /* if we haven't got a pointer,
+                  take the reference, drop ref to old tile group */
+               if (connector->tile_group) {
+                       drm_mode_put_tile_group(connector->dev, connector->tile_group);
+               }
+               connector->tile_group = tg;
+       } else
+               /* if same tile group, then release the ref we just took. */
+               drm_mode_put_tile_group(connector->dev, tg);
+       return 0;
+}
+
 static int drm_parse_display_id(struct drm_connector *connector,
                                u8 *displayid, int length,
                                bool is_edid_extension)
 {
        /* if this is an EDID extension the first byte will be 0x70 */
        int idx = 0;
-       struct displayid_hdr *base;
        struct displayid_block *block;
-       u8 csum = 0;
-       int i;
+       int ret;
 
        if (is_edid_extension)
                idx = 1;
 
-       base = (struct displayid_hdr *)&displayid[idx];
-
-       DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
-                     base->rev, base->bytes, base->prod_id, base->ext_count);
-
-       if (base->bytes + 5 > length - idx)
-               return -EINVAL;
-
-       for (i = idx; i <= base->bytes + 5; i++) {
-               csum += displayid[i];
-       }
-       if (csum) {
-               DRM_ERROR("DisplayID checksum invalid, remainder is %d\n", csum);
-               return -EINVAL;
-       }
+       ret = validate_displayid(displayid, length, idx);
+       if (ret)
+               return ret;
 
-       block = (struct displayid_block *)&displayid[idx + 4];
-       DRM_DEBUG_KMS("block id %d, rev %d, len %d\n",
-                     block->tag, block->rev, block->num_bytes);
-
-       switch (block->tag) {
-       case DATA_BLOCK_TILED_DISPLAY: {
-               struct displayid_tiled_block *tile = (struct displayid_tiled_block *)block;
-
-               u16 w, h;
-               u8 tile_v_loc, tile_h_loc;
-               u8 num_v_tile, num_h_tile;
-               struct drm_tile_group *tg;
-
-               w = tile->tile_size[0] | tile->tile_size[1] << 8;
-               h = tile->tile_size[2] | tile->tile_size[3] << 8;
-
-               num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30);
-               num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30);
-               tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4);
-               tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4);
-
-               connector->has_tile = true;
-               if (tile->tile_cap & 0x80)
-                       connector->tile_is_single_monitor = true;
-
-               connector->num_h_tile = num_h_tile + 1;
-               connector->num_v_tile = num_v_tile + 1;
-               connector->tile_h_loc = tile_h_loc;
-               connector->tile_v_loc = tile_v_loc;
-               connector->tile_h_size = w + 1;
-               connector->tile_v_size = h + 1;
-
-               DRM_DEBUG_KMS("tile cap 0x%x\n", tile->tile_cap);
-               DRM_DEBUG_KMS("tile_size %d x %d\n", w + 1, h + 1);
-               DRM_DEBUG_KMS("topo num tiles %dx%d, location %dx%d\n",
-                      num_h_tile + 1, num_v_tile + 1, tile_h_loc, tile_v_loc);
-               DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]);
-
-               tg = drm_mode_get_tile_group(connector->dev, tile->topology_id);
-               if (!tg) {
-                       tg = drm_mode_create_tile_group(connector->dev, tile->topology_id);
+       idx += sizeof(struct displayid_hdr);
+       while (block = (struct displayid_block *)&displayid[idx],
+              idx + sizeof(struct displayid_block) <= length &&
+              idx + sizeof(struct displayid_block) + block->num_bytes <= length &&
+              block->num_bytes > 0) {
+               idx += block->num_bytes + sizeof(struct displayid_block);
+               DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n",
+                             block->tag, block->rev, block->num_bytes);
+
+               switch (block->tag) {
+               case DATA_BLOCK_TILED_DISPLAY:
+                       ret = drm_parse_tiled_block(connector, block);
+                       if (ret)
+                               return ret;
+                       break;
+               case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
+                       /* handled in mode gathering code. */
+                       break;
+               default:
+                       DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag);
+                       break;
                }
-               if (!tg)
-                       return -ENOMEM;
-
-               if (connector->tile_group != tg) {
-                       /* if we haven't got a pointer,
-                          take the reference, drop ref to old tile group */
-                       if (connector->tile_group) {
-                               drm_mode_put_tile_group(connector->dev, connector->tile_group);
-                       }
-                       connector->tile_group = tg;
-               } else
-                       /* if same tile group, then release the ref we just took. */
-                       drm_mode_put_tile_group(connector->dev, tg);
-       }
-               break;
-       default:
-               printk("unknown displayid tag %d\n", block->tag);
-               break;
        }
        return 0;
 }
index bb88e3df925712e52af66869e4a23563221dc36c..172cafe11c7109397f554d50fcc1da9ba550937f 100644 (file)
@@ -25,6 +25,8 @@
 #include <drm/drm_fb_cma_helper.h>
 #include <linux/module.h>
 
+#define DEFAULT_FBDEFIO_DELAY_MS 50
+
 struct drm_fb_cma {
        struct drm_framebuffer          fb;
        struct drm_gem_cma_object       *obj[4];
@@ -35,6 +37,59 @@ struct drm_fbdev_cma {
        struct drm_fb_cma       *fb;
 };
 
+/**
+ * DOC: framebuffer cma helper functions
+ *
+ * Provides helper functions for creating a cma (contiguous memory allocator)
+ * backed framebuffer.
+ *
+ * drm_fb_cma_create() is used in the &drm_mode_config_funcs ->fb_create
+ * callback function to create a cma backed framebuffer.
+ *
+ * An fbdev framebuffer backed by cma is also available by calling
+ * drm_fbdev_cma_init(). drm_fbdev_cma_fini() tears it down.
+ * If the &drm_framebuffer_funcs ->dirty callback is set, fb_deferred_io
+ * will be set up automatically. dirty() is called by
+ * drm_fb_helper_deferred_io() in process context (struct delayed_work).
+ *
+ * Example fbdev deferred io code:
+ *
+ *     static int driver_fbdev_fb_dirty(struct drm_framebuffer *fb,
+ *                                      struct drm_file *file_priv,
+ *                                      unsigned flags, unsigned color,
+ *                                      struct drm_clip_rect *clips,
+ *                                      unsigned num_clips)
+ *     {
+ *         struct drm_gem_cma_object *cma = drm_fb_cma_get_gem_obj(fb, 0);
+ *         ... push changes ...
+ *         return 0;
+ *     }
+ *
+ *     static struct drm_framebuffer_funcs driver_fbdev_fb_funcs = {
+ *         .destroy       = drm_fb_cma_destroy,
+ *         .create_handle = drm_fb_cma_create_handle,
+ *         .dirty         = driver_fbdev_fb_dirty,
+ *     };
+ *
+ *     static int driver_fbdev_create(struct drm_fb_helper *helper,
+ *             struct drm_fb_helper_surface_size *sizes)
+ *     {
+ *         return drm_fbdev_cma_create_with_funcs(helper, sizes,
+ *                                                &driver_fbdev_fb_funcs);
+ *     }
+ *
+ *     static const struct drm_fb_helper_funcs driver_fb_helper_funcs = {
+ *         .fb_probe = driver_fbdev_create,
+ *     };
+ *
+ *     Initialize:
+ *     fbdev = drm_fbdev_cma_init_with_funcs(dev, 16,
+ *                                           dev->mode_config.num_crtc,
+ *                                           dev->mode_config.num_connector,
+ *                                           &driver_fb_helper_funcs);
+ *
+ */
+
 static inline struct drm_fbdev_cma *to_fbdev_cma(struct drm_fb_helper *helper)
 {
        return container_of(helper, struct drm_fbdev_cma, fb_helper);
@@ -45,7 +100,7 @@ static inline struct drm_fb_cma *to_fb_cma(struct drm_framebuffer *fb)
        return container_of(fb, struct drm_fb_cma, fb);
 }
 
-static void drm_fb_cma_destroy(struct drm_framebuffer *fb)
+void drm_fb_cma_destroy(struct drm_framebuffer *fb)
 {
        struct drm_fb_cma *fb_cma = to_fb_cma(fb);
        int i;
@@ -58,8 +113,9 @@ static void drm_fb_cma_destroy(struct drm_framebuffer *fb)
        drm_framebuffer_cleanup(fb);
        kfree(fb_cma);
 }
+EXPORT_SYMBOL(drm_fb_cma_destroy);
 
-static int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
+int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
        struct drm_file *file_priv, unsigned int *handle)
 {
        struct drm_fb_cma *fb_cma = to_fb_cma(fb);
@@ -67,6 +123,7 @@ static int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
        return drm_gem_handle_create(file_priv,
                        &fb_cma->obj[0]->base, handle);
 }
+EXPORT_SYMBOL(drm_fb_cma_create_handle);
 
 static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
        .destroy        = drm_fb_cma_destroy,
@@ -76,7 +133,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
 static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
        const struct drm_mode_fb_cmd2 *mode_cmd,
        struct drm_gem_cma_object **obj,
-       unsigned int num_planes)
+       unsigned int num_planes, const struct drm_framebuffer_funcs *funcs)
 {
        struct drm_fb_cma *fb_cma;
        int ret;
@@ -91,7 +148,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
        for (i = 0; i < num_planes; i++)
                fb_cma->obj[i] = obj[i];
 
-       ret = drm_framebuffer_init(dev, &fb_cma->fb, &drm_fb_cma_funcs);
+       ret = drm_framebuffer_init(dev, &fb_cma->fb, funcs);
        if (ret) {
                dev_err(dev->dev, "Failed to initialize framebuffer: %d\n", ret);
                kfree(fb_cma);
@@ -102,13 +159,17 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
 }
 
 /**
- * drm_fb_cma_create() - (struct drm_mode_config_funcs *)->fb_create callback function
+ * drm_fb_cma_create_with_funcs() - helper function for the
+ *                                  &drm_mode_config_funcs ->fb_create
+ *                                  callback function
  *
- * If your hardware has special alignment or pitch requirements these should be
- * checked before calling this function.
+ * This can be used to set &drm_framebuffer_funcs for drivers that need the
+ * dirty() callback. Use drm_fb_cma_create() if you don't need to change
+ * &drm_framebuffer_funcs.
  */
-struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
-       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
+struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
+       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
+       const struct drm_framebuffer_funcs *funcs)
 {
        struct drm_fb_cma *fb_cma;
        struct drm_gem_cma_object *objs[4];
@@ -126,7 +187,7 @@ struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
                unsigned int height = mode_cmd->height / (i ? vsub : 1);
                unsigned int min_size;
 
-               obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[i]);
+               obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
                if (!obj) {
                        dev_err(dev->dev, "Failed to lookup GEM object\n");
                        ret = -ENXIO;
@@ -145,7 +206,7 @@ struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
                objs[i] = to_drm_gem_cma_obj(obj);
        }
 
-       fb_cma = drm_fb_cma_alloc(dev, mode_cmd, objs, i);
+       fb_cma = drm_fb_cma_alloc(dev, mode_cmd, objs, i, funcs);
        if (IS_ERR(fb_cma)) {
                ret = PTR_ERR(fb_cma);
                goto err_gem_object_unreference;
@@ -158,6 +219,21 @@ err_gem_object_unreference:
                drm_gem_object_unreference_unlocked(&objs[i]->base);
        return ERR_PTR(ret);
 }
+EXPORT_SYMBOL_GPL(drm_fb_cma_create_with_funcs);
+
+/**
+ * drm_fb_cma_create() - &drm_mode_config_funcs ->fb_create callback function
+ *
+ * If your hardware has special alignment or pitch requirements these should be
+ * checked before calling this function. Use drm_fb_cma_create_with_funcs() if
+ * you need to set &drm_framebuffer_funcs ->dirty.
+ */
+struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
+       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
+{
+       return drm_fb_cma_create_with_funcs(dev, file_priv, mode_cmd,
+                                           &drm_fb_cma_funcs);
+}
 EXPORT_SYMBOL_GPL(drm_fb_cma_create);
 
 /**
@@ -233,8 +309,67 @@ static struct fb_ops drm_fbdev_cma_ops = {
        .fb_setcmap     = drm_fb_helper_setcmap,
 };
 
-static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
-       struct drm_fb_helper_surface_size *sizes)
+static int drm_fbdev_cma_deferred_io_mmap(struct fb_info *info,
+                                         struct vm_area_struct *vma)
+{
+       fb_deferred_io_mmap(info, vma);
+       vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+       return 0;
+}
+
+static int drm_fbdev_cma_defio_init(struct fb_info *fbi,
+                                   struct drm_gem_cma_object *cma_obj)
+{
+       struct fb_deferred_io *fbdefio;
+       struct fb_ops *fbops;
+
+       /*
+        * Per device structures are needed because:
+        * fbops: fb_deferred_io_cleanup() clears fbops.fb_mmap
+        * fbdefio: individual delays
+        */
+       fbdefio = kzalloc(sizeof(*fbdefio), GFP_KERNEL);
+       fbops = kzalloc(sizeof(*fbops), GFP_KERNEL);
+       if (!fbdefio || !fbops) {
+               kfree(fbdefio);
+               return -ENOMEM;
+       }
+
+       /* can't be offset from vaddr since dirty() uses cma_obj */
+       fbi->screen_buffer = cma_obj->vaddr;
+       /* fb_deferred_io_fault() needs a physical address */
+       fbi->fix.smem_start = page_to_phys(virt_to_page(fbi->screen_buffer));
+
+       *fbops = *fbi->fbops;
+       fbi->fbops = fbops;
+
+       fbdefio->delay = msecs_to_jiffies(DEFAULT_FBDEFIO_DELAY_MS);
+       fbdefio->deferred_io = drm_fb_helper_deferred_io;
+       fbi->fbdefio = fbdefio;
+       fb_deferred_io_init(fbi);
+       fbi->fbops->fb_mmap = drm_fbdev_cma_deferred_io_mmap;
+
+       return 0;
+}
+
+static void drm_fbdev_cma_defio_fini(struct fb_info *fbi)
+{
+       if (!fbi->fbdefio)
+               return;
+
+       fb_deferred_io_cleanup(fbi);
+       kfree(fbi->fbdefio);
+       kfree(fbi->fbops);
+}
+
+/*
+ * For use in a (struct drm_fb_helper_funcs *)->fb_probe callback function that
+ * needs custom struct drm_framebuffer_funcs, like dirty() for deferred_io use.
+ */
+int drm_fbdev_cma_create_with_funcs(struct drm_fb_helper *helper,
+       struct drm_fb_helper_surface_size *sizes,
+       const struct drm_framebuffer_funcs *funcs)
 {
        struct drm_fbdev_cma *fbdev_cma = to_fbdev_cma(helper);
        struct drm_mode_fb_cmd2 mode_cmd = { 0 };
@@ -270,7 +405,7 @@ static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
                goto err_gem_free_object;
        }
 
-       fbdev_cma->fb = drm_fb_cma_alloc(dev, &mode_cmd, &obj, 1);
+       fbdev_cma->fb = drm_fb_cma_alloc(dev, &mode_cmd, &obj, 1, funcs);
        if (IS_ERR(fbdev_cma->fb)) {
                dev_err(dev->dev, "Failed to allocate DRM framebuffer.\n");
                ret = PTR_ERR(fbdev_cma->fb);
@@ -296,31 +431,48 @@ static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
        fbi->screen_size = size;
        fbi->fix.smem_len = size;
 
+       if (funcs->dirty) {
+               ret = drm_fbdev_cma_defio_init(fbi, obj);
+               if (ret)
+                       goto err_cma_destroy;
+       }
+
        return 0;
 
+err_cma_destroy:
+       drm_framebuffer_unregister_private(&fbdev_cma->fb->fb);
+       drm_fb_cma_destroy(&fbdev_cma->fb->fb);
 err_fb_info_destroy:
        drm_fb_helper_release_fbi(helper);
 err_gem_free_object:
        dev->driver->gem_free_object(&obj->base);
        return ret;
 }
+EXPORT_SYMBOL(drm_fbdev_cma_create_with_funcs);
+
+static int drm_fbdev_cma_create(struct drm_fb_helper *helper,
+       struct drm_fb_helper_surface_size *sizes)
+{
+       return drm_fbdev_cma_create_with_funcs(helper, sizes, &drm_fb_cma_funcs);
+}
 
 static const struct drm_fb_helper_funcs drm_fb_cma_helper_funcs = {
        .fb_probe = drm_fbdev_cma_create,
 };
 
 /**
- * drm_fbdev_cma_init() - Allocate and initializes a drm_fbdev_cma struct
+ * drm_fbdev_cma_init_with_funcs() - Allocate and initializes a drm_fbdev_cma struct
  * @dev: DRM device
  * @preferred_bpp: Preferred bits per pixel for the device
  * @num_crtc: Number of CRTCs
  * @max_conn_count: Maximum number of connectors
+ * @funcs: fb helper functions, in particular fb_probe()
  *
  * Returns a newly allocated drm_fbdev_cma struct or a ERR_PTR.
  */
-struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
+struct drm_fbdev_cma *drm_fbdev_cma_init_with_funcs(struct drm_device *dev,
        unsigned int preferred_bpp, unsigned int num_crtc,
-       unsigned int max_conn_count)
+       unsigned int max_conn_count, const struct drm_fb_helper_funcs *funcs)
 {
        struct drm_fbdev_cma *fbdev_cma;
        struct drm_fb_helper *helper;
@@ -334,7 +486,7 @@ struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
 
        helper = &fbdev_cma->fb_helper;
 
-       drm_fb_helper_prepare(dev, helper, &drm_fb_cma_helper_funcs);
+       drm_fb_helper_prepare(dev, helper, funcs);
 
        ret = drm_fb_helper_init(dev, helper, num_crtc, max_conn_count);
        if (ret < 0) {
@@ -364,6 +516,24 @@ err_free:
 
        return ERR_PTR(ret);
 }
+EXPORT_SYMBOL_GPL(drm_fbdev_cma_init_with_funcs);
+
+/**
+ * drm_fbdev_cma_init() - Allocate and initializes a drm_fbdev_cma struct
+ * @dev: DRM device
+ * @preferred_bpp: Preferred bits per pixel for the device
+ * @num_crtc: Number of CRTCs
+ * @max_conn_count: Maximum number of connectors
+ *
+ * Returns a newly allocated drm_fbdev_cma struct or a ERR_PTR.
+ */
+struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
+       unsigned int preferred_bpp, unsigned int num_crtc,
+       unsigned int max_conn_count)
+{
+       return drm_fbdev_cma_init_with_funcs(dev, preferred_bpp, num_crtc,
+                               max_conn_count, &drm_fb_cma_helper_funcs);
+}
 EXPORT_SYMBOL_GPL(drm_fbdev_cma_init);
 
 /**
@@ -373,6 +543,7 @@ EXPORT_SYMBOL_GPL(drm_fbdev_cma_init);
 void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma)
 {
        drm_fb_helper_unregister_fbi(&fbdev_cma->fb_helper);
+       drm_fbdev_cma_defio_fini(fbdev_cma->fb_helper.fbdev);
        drm_fb_helper_release_fbi(&fbdev_cma->fb_helper);
 
        if (fbdev_cma->fb) {
index 855108e6e1bd27f77fbc3be1da95cff8ad3da242..7c2eb75db60f102d9526aebab1a6f7993e124f9b 100644 (file)
@@ -84,6 +84,15 @@ static LIST_HEAD(kernel_fb_helper_list);
  * and set up an initial configuration using the detected hardware, drivers
  * should call drm_fb_helper_single_add_all_connectors() followed by
  * drm_fb_helper_initial_config().
+ *
+ * If &drm_framebuffer_funcs ->dirty is set, the
+ * drm_fb_helper_{cfb,sys}_{write,fillrect,copyarea,imageblit} functions will
+ * accumulate changes and schedule &drm_fb_helper ->dirty_work to run right
+ * away. This worker then calls the dirty() function ensuring that it will
+ * always run in process context since the fb_*() function could be running in
+ * atomic context. If drm_fb_helper_deferred_io() is used as the deferred_io
+ * callback it will also schedule dirty_work with the damage collected from the
+ * mmap page writes.
  */
 
 /**
@@ -153,40 +162,13 @@ int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_
        if (!fb_helper_connector)
                return -ENOMEM;
 
+       drm_connector_reference(connector);
        fb_helper_connector->connector = connector;
        fb_helper->connector_info[fb_helper->connector_count++] = fb_helper_connector;
        return 0;
 }
 EXPORT_SYMBOL(drm_fb_helper_add_one_connector);
 
-static void remove_from_modeset(struct drm_mode_set *set,
-               struct drm_connector *connector)
-{
-       int i, j;
-
-       for (i = 0; i < set->num_connectors; i++) {
-               if (set->connectors[i] == connector)
-                       break;
-       }
-
-       if (i == set->num_connectors)
-               return;
-
-       for (j = i + 1; j < set->num_connectors; j++) {
-               set->connectors[j - 1] = set->connectors[j];
-       }
-       set->num_connectors--;
-
-       /*
-        * TODO maybe need to makes sure we set it back to !=NULL somewhere?
-        */
-       if (set->num_connectors == 0) {
-               set->fb = NULL;
-               drm_mode_destroy(connector->dev, set->mode);
-               set->mode = NULL;
-       }
-}
-
 int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
                                       struct drm_connector *connector)
 {
@@ -206,6 +188,7 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
        if (i == fb_helper->connector_count)
                return -EINVAL;
        fb_helper_connector = fb_helper->connector_info[i];
+       drm_connector_unreference(fb_helper_connector->connector);
 
        for (j = i + 1; j < fb_helper->connector_count; j++) {
                fb_helper->connector_info[j - 1] = fb_helper->connector_info[j];
@@ -213,10 +196,6 @@ int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
        fb_helper->connector_count--;
        kfree(fb_helper_connector);
 
-       /* also cleanup dangling references to the connector: */
-       for (i = 0; i < fb_helper->crtc_count; i++)
-               remove_from_modeset(&fb_helper->crtc_info[i].mode_set, connector);
-
        return 0;
 }
 EXPORT_SYMBOL(drm_fb_helper_remove_one_connector);
@@ -626,8 +605,10 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
 {
        int i;
 
-       for (i = 0; i < helper->connector_count; i++)
+       for (i = 0; i < helper->connector_count; i++) {
+               drm_connector_unreference(helper->connector_info[i]->connector);
                kfree(helper->connector_info[i]);
+       }
        kfree(helper->connector_info);
        for (i = 0; i < helper->crtc_count; i++) {
                kfree(helper->crtc_info[i].mode_set.connectors);
@@ -637,6 +618,23 @@ static void drm_fb_helper_crtc_free(struct drm_fb_helper *helper)
        kfree(helper->crtc_info);
 }
 
+static void drm_fb_helper_dirty_work(struct work_struct *work)
+{
+       struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper,
+                                                   dirty_work);
+       struct drm_clip_rect *clip = &helper->dirty_clip;
+       struct drm_clip_rect clip_copy;
+       unsigned long flags;
+
+       spin_lock_irqsave(&helper->dirty_lock, flags);
+       clip_copy = *clip;
+       clip->x1 = clip->y1 = ~0;
+       clip->x2 = clip->y2 = 0;
+       spin_unlock_irqrestore(&helper->dirty_lock, flags);
+
+       helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, &clip_copy, 1);
+}
+
 /**
  * drm_fb_helper_prepare - setup a drm_fb_helper structure
  * @dev: DRM device
@@ -650,6 +648,9 @@ void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
                           const struct drm_fb_helper_funcs *funcs)
 {
        INIT_LIST_HEAD(&helper->kernel_fb_list);
+       spin_lock_init(&helper->dirty_lock);
+       INIT_WORK(&helper->dirty_work, drm_fb_helper_dirty_work);
+       helper->dirty_clip.x1 = helper->dirty_clip.y1 = ~0;
        helper->funcs = funcs;
        helper->dev = dev;
 }
@@ -834,6 +835,59 @@ void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
 }
 EXPORT_SYMBOL(drm_fb_helper_unlink_fbi);
 
+static void drm_fb_helper_dirty(struct fb_info *info, u32 x, u32 y,
+                               u32 width, u32 height)
+{
+       struct drm_fb_helper *helper = info->par;
+       struct drm_clip_rect *clip = &helper->dirty_clip;
+       unsigned long flags;
+
+       if (!helper->fb->funcs->dirty)
+               return;
+
+       spin_lock_irqsave(&helper->dirty_lock, flags);
+       clip->x1 = min_t(u32, clip->x1, x);
+       clip->y1 = min_t(u32, clip->y1, y);
+       clip->x2 = max_t(u32, clip->x2, x + width);
+       clip->y2 = max_t(u32, clip->y2, y + height);
+       spin_unlock_irqrestore(&helper->dirty_lock, flags);
+
+       schedule_work(&helper->dirty_work);
+}
+
+/**
+ * drm_fb_helper_deferred_io() - fbdev deferred_io callback function
+ * @info: fb_info struct pointer
+ * @pagelist: list of dirty mmap framebuffer pages
+ *
+ * This function is used as the &fb_deferred_io ->deferred_io
+ * callback function for flushing the fbdev mmap writes.
+ */
+void drm_fb_helper_deferred_io(struct fb_info *info,
+                              struct list_head *pagelist)
+{
+       unsigned long start, end, min, max;
+       struct page *page;
+       u32 y1, y2;
+
+       min = ULONG_MAX;
+       max = 0;
+       list_for_each_entry(page, pagelist, lru) {
+               start = page->index << PAGE_SHIFT;
+               end = start + PAGE_SIZE - 1;
+               min = min(min, start);
+               max = max(max, end);
+       }
+
+       if (min < max) {
+               y1 = min / info->fix.line_length;
+               y2 = min_t(u32, DIV_ROUND_UP(max, info->fix.line_length),
+                          info->var.yres);
+               drm_fb_helper_dirty(info, 0, y1, info->var.xres, y2 - y1);
+       }
+}
+EXPORT_SYMBOL(drm_fb_helper_deferred_io);
+
 /**
  * drm_fb_helper_sys_read - wrapper around fb_sys_read
  * @info: fb_info struct pointer
@@ -862,7 +916,14 @@ EXPORT_SYMBOL(drm_fb_helper_sys_read);
 ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
                                size_t count, loff_t *ppos)
 {
-       return fb_sys_write(info, buf, count, ppos);
+       ssize_t ret;
+
+       ret = fb_sys_write(info, buf, count, ppos);
+       if (ret > 0)
+               drm_fb_helper_dirty(info, 0, 0, info->var.xres,
+                                   info->var.yres);
+
+       return ret;
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_write);
 
@@ -877,6 +938,8 @@ void drm_fb_helper_sys_fillrect(struct fb_info *info,
                                const struct fb_fillrect *rect)
 {
        sys_fillrect(info, rect);
+       drm_fb_helper_dirty(info, rect->dx, rect->dy,
+                           rect->width, rect->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_fillrect);
 
@@ -891,6 +954,8 @@ void drm_fb_helper_sys_copyarea(struct fb_info *info,
                                const struct fb_copyarea *area)
 {
        sys_copyarea(info, area);
+       drm_fb_helper_dirty(info, area->dx, area->dy,
+                           area->width, area->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_copyarea);
 
@@ -905,6 +970,8 @@ void drm_fb_helper_sys_imageblit(struct fb_info *info,
                                 const struct fb_image *image)
 {
        sys_imageblit(info, image);
+       drm_fb_helper_dirty(info, image->dx, image->dy,
+                           image->width, image->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_sys_imageblit);
 
@@ -919,6 +986,8 @@ void drm_fb_helper_cfb_fillrect(struct fb_info *info,
                                const struct fb_fillrect *rect)
 {
        cfb_fillrect(info, rect);
+       drm_fb_helper_dirty(info, rect->dx, rect->dy,
+                           rect->width, rect->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_fillrect);
 
@@ -933,6 +1002,8 @@ void drm_fb_helper_cfb_copyarea(struct fb_info *info,
                                const struct fb_copyarea *area)
 {
        cfb_copyarea(info, area);
+       drm_fb_helper_dirty(info, area->dx, area->dy,
+                           area->width, area->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_copyarea);
 
@@ -947,6 +1018,8 @@ void drm_fb_helper_cfb_imageblit(struct fb_info *info,
                                 const struct fb_image *image)
 {
        cfb_imageblit(info, image);
+       drm_fb_helper_dirty(info, image->dx, image->dy,
+                           image->width, image->height);
 }
 EXPORT_SYMBOL(drm_fb_helper_cfb_imageblit);
 
@@ -1895,7 +1968,6 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
                          int n, int width, int height)
 {
        int c, o;
-       struct drm_device *dev = fb_helper->dev;
        struct drm_connector *connector;
        const struct drm_connector_helper_funcs *connector_funcs;
        struct drm_encoder *encoder;
@@ -1914,7 +1986,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
        if (modes[n] == NULL)
                return best_score;
 
-       crtcs = kzalloc(dev->mode_config.num_connector *
+       crtcs = kzalloc(fb_helper->connector_count *
                        sizeof(struct drm_fb_helper_crtc *), GFP_KERNEL);
        if (!crtcs)
                return best_score;
@@ -1960,7 +2032,7 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper,
                if (score > best_score) {
                        best_score = score;
                        memcpy(best_crtcs, crtcs,
-                              dev->mode_config.num_connector *
+                              fb_helper->connector_count *
                               sizeof(struct drm_fb_helper_crtc *));
                }
        }
@@ -2104,8 +2176,8 @@ out:
  * cmdline option.
  *
  * The other option is to just disable fbdev emulation since very likely the
- * first modest from userspace will crash in the same way, and is even easier to
- * debug. This can be done by setting the drm_kms_helper.fbdev_emulation=0
+ * first modeset from userspace will crash in the same way, and is even easier
+ * to debug. This can be done by setting the drm_kms_helper.fbdev_emulation=0
  * kernel cmdline option.
  *
  * RETURNS:
@@ -2150,7 +2222,7 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config);
  * hotplug interrupt).
  *
  * Note that drivers may call this even before calling
- * drm_fb_helper_initial_config but only aftert drm_fb_helper_init. This allows
+ * drm_fb_helper_initial_config but only after drm_fb_helper_init. This allows
  * for a race-free fbcon setup and will make sure that the fbdev emulation will
  * not miss any hotplug events.
  *
index aeef58ed359b7ab2fc8ac146bcc22dea271f6b93..7af7f8bcb3558244781c0ac4f486452e852deca9 100644 (file)
@@ -297,9 +297,9 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
        }
        mutex_unlock(&dev->master_mutex);
 
-       mutex_lock(&dev->struct_mutex);
+       mutex_lock(&dev->filelist_mutex);
        list_add(&priv->lhead, &dev->filelist);
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->filelist_mutex);
 
 #ifdef __alpha__
        /*
@@ -381,14 +381,26 @@ static void drm_events_release(struct drm_file *file_priv)
  */
 static void drm_legacy_dev_reinit(struct drm_device *dev)
 {
-       if (drm_core_check_feature(dev, DRIVER_MODESET))
-               return;
+       if (dev->irq_enabled)
+               drm_irq_uninstall(dev);
+
+       mutex_lock(&dev->struct_mutex);
+
+       drm_legacy_agp_clear(dev);
+
+       drm_legacy_sg_cleanup(dev);
+       drm_legacy_vma_flush(dev);
+       drm_legacy_dma_takedown(dev);
+
+       mutex_unlock(&dev->struct_mutex);
 
        dev->sigdata.lock = NULL;
 
        dev->context_flag = 0;
        dev->last_context = 0;
        dev->if_version = 0;
+
+       DRM_DEBUG("lastclose completed\n");
 }
 
 /*
@@ -400,7 +412,7 @@ static void drm_legacy_dev_reinit(struct drm_device *dev)
  *
  * \sa drm_device
  */
-int drm_lastclose(struct drm_device * dev)
+void drm_lastclose(struct drm_device * dev)
 {
        DRM_DEBUG("\n");
 
@@ -408,23 +420,8 @@ int drm_lastclose(struct drm_device * dev)
                dev->driver->lastclose(dev);
        DRM_DEBUG("driver lastclose completed\n");
 
-       if (dev->irq_enabled && !drm_core_check_feature(dev, DRIVER_MODESET))
-               drm_irq_uninstall(dev);
-
-       mutex_lock(&dev->struct_mutex);
-
-       drm_agp_clear(dev);
-
-       drm_legacy_sg_cleanup(dev);
-       drm_legacy_vma_flush(dev);
-       drm_legacy_dma_takedown(dev);
-
-       mutex_unlock(&dev->struct_mutex);
-
-       drm_legacy_dev_reinit(dev);
-
-       DRM_DEBUG("lastclose completed\n");
-       return 0;
+       if (!drm_core_check_feature(dev, DRIVER_MODESET))
+               drm_legacy_dev_reinit(dev);
 }
 
 /**
@@ -445,14 +442,16 @@ int drm_release(struct inode *inode, struct file *filp)
        struct drm_file *file_priv = filp->private_data;
        struct drm_minor *minor = file_priv->minor;
        struct drm_device *dev = minor->dev;
-       int retcode = 0;
 
        mutex_lock(&drm_global_mutex);
 
        DRM_DEBUG("open_count = %d\n", dev->open_count);
 
-       mutex_lock(&dev->struct_mutex);
+       mutex_lock(&dev->filelist_mutex);
        list_del(&file_priv->lhead);
+       mutex_unlock(&dev->filelist_mutex);
+
+       mutex_lock(&dev->struct_mutex);
        if (file_priv->magic)
                idr_remove(&file_priv->master->magic_map, file_priv->magic);
        mutex_unlock(&dev->struct_mutex);
@@ -538,7 +537,7 @@ int drm_release(struct inode *inode, struct file *filp)
         */
 
        if (!--dev->open_count) {
-               retcode = drm_lastclose(dev);
+               drm_lastclose(dev);
                if (drm_device_is_unplugged(dev))
                        drm_put_dev(dev);
        }
@@ -546,7 +545,7 @@ int drm_release(struct inode *inode, struct file *filp)
 
        drm_minor_release(minor);
 
-       return retcode;
+       return 0;
 }
 EXPORT_SYMBOL(drm_release);
 
index da0c5320789fbf96a44869618e2cbdda704d2d3f..32156060b9c96bb9ccfe0c0b06dc5057a0160fb6 100644 (file)
@@ -279,7 +279,6 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
 int
 drm_gem_handle_delete(struct drm_file *filp, u32 handle)
 {
-       struct drm_device *dev;
        struct drm_gem_object *obj;
 
        /* This is gross. The idr system doesn't let us try a delete and
@@ -294,18 +293,19 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
        spin_lock(&filp->table_lock);
 
        /* Check if we currently have a reference on the object */
-       obj = idr_find(&filp->object_idr, handle);
-       if (obj == NULL) {
-               spin_unlock(&filp->table_lock);
+       obj = idr_replace(&filp->object_idr, NULL, handle);
+       spin_unlock(&filp->table_lock);
+       if (IS_ERR_OR_NULL(obj))
                return -EINVAL;
-       }
-       dev = obj->dev;
 
-       /* Release reference and decrement refcount. */
+       /* Release driver's reference and decrement refcount. */
+       drm_gem_object_release_handle(handle, obj, filp);
+
+       /* And finally make the handle available for future allocations. */
+       spin_lock(&filp->table_lock);
        idr_remove(&filp->object_idr, handle);
        spin_unlock(&filp->table_lock);
 
-       drm_gem_object_release_handle(handle, obj, filp);
        return 0;
 }
 EXPORT_SYMBOL(drm_gem_handle_delete);
@@ -422,6 +422,10 @@ EXPORT_SYMBOL(drm_gem_handle_create);
  * @obj: obj in question
  *
  * This routine frees fake offsets allocated by drm_gem_create_mmap_offset().
+ *
+ * Note that drm_gem_object_release() already calls this function, so drivers
+ * don't have to take care of releasing the mmap offset themselves when freeing
+ * the GEM object.
  */
 void
 drm_gem_free_mmap_offset(struct drm_gem_object *obj)
@@ -445,6 +449,9 @@ EXPORT_SYMBOL(drm_gem_free_mmap_offset);
  * This routine allocates and attaches a fake offset for @obj, in cases where
  * the virtual size differs from the physical size (ie. obj->size).  Otherwise
  * just use drm_gem_create_mmap_offset().
+ *
+ * This function is idempotent and handles an already allocated mmap offset
+ * transparently. Drivers do not need to check for this case.
  */
 int
 drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size)
@@ -466,6 +473,9 @@ EXPORT_SYMBOL(drm_gem_create_mmap_offset_size);
  * structures.
  *
  * This routine allocates and attaches a fake offset for @obj.
+ *
+ * Drivers can call drm_gem_free_mmap_offset() before freeing @obj to release
+ * the fake offset again.
  */
 int drm_gem_create_mmap_offset(struct drm_gem_object *obj)
 {
@@ -578,7 +588,6 @@ EXPORT_SYMBOL(drm_gem_put_pages);
 
 /**
  * drm_gem_object_lookup - look up a GEM object from it's handle
- * @dev: DRM device
  * @filp: DRM file private date
  * @handle: userspace handle
  *
@@ -588,8 +597,7 @@ EXPORT_SYMBOL(drm_gem_put_pages);
  * otherwise.
  */
 struct drm_gem_object *
-drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp,
-                     u32 handle)
+drm_gem_object_lookup(struct drm_file *filp, u32 handle)
 {
        struct drm_gem_object *obj;
 
@@ -597,12 +605,8 @@ drm_gem_object_lookup(struct drm_device *dev, struct drm_file *filp,
 
        /* Check if we currently have a reference on the object */
        obj = idr_find(&filp->object_idr, handle);
-       if (obj == NULL) {
-               spin_unlock(&filp->table_lock);
-               return NULL;
-       }
-
-       drm_gem_object_reference(obj);
+       if (obj)
+               drm_gem_object_reference(obj);
 
        spin_unlock(&filp->table_lock);
 
@@ -655,7 +659,7 @@ drm_gem_flink_ioctl(struct drm_device *dev, void *data,
        if (!drm_core_check_feature(dev, DRIVER_GEM))
                return -ENODEV;
 
-       obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       obj = drm_gem_object_lookup(file_priv, args->handle);
        if (obj == NULL)
                return -ENOENT;
 
@@ -759,6 +763,13 @@ drm_gem_release(struct drm_device *dev, struct drm_file *file_private)
        idr_destroy(&file_private->object_idr);
 }
 
+/**
+ * drm_gem_object_release - release GEM buffer object resources
+ * @obj: GEM buffer object
+ *
+ * This releases any structures and resources used by @obj and is the invers of
+ * drm_gem_object_init().
+ */
 void
 drm_gem_object_release(struct drm_gem_object *obj)
 {
@@ -787,13 +798,66 @@ drm_gem_object_free(struct kref *kref)
                container_of(kref, struct drm_gem_object, refcount);
        struct drm_device *dev = obj->dev;
 
-       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+       if (dev->driver->gem_free_object_unlocked) {
+               dev->driver->gem_free_object_unlocked(obj);
+       } else if (dev->driver->gem_free_object) {
+               WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 
-       if (dev->driver->gem_free_object != NULL)
                dev->driver->gem_free_object(obj);
+       }
 }
 EXPORT_SYMBOL(drm_gem_object_free);
 
+/**
+ * drm_gem_object_unreference_unlocked - release a GEM BO reference
+ * @obj: GEM buffer object
+ *
+ * This releases a reference to @obj. Callers must not hold the
+ * dev->struct_mutex lock when calling this function.
+ *
+ * See also __drm_gem_object_unreference().
+ */
+void
+drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
+{
+       struct drm_device *dev;
+
+       if (!obj)
+               return;
+
+       dev = obj->dev;
+       might_lock(&dev->struct_mutex);
+
+       if (dev->driver->gem_free_object_unlocked)
+               kref_put(&obj->refcount, drm_gem_object_free);
+       else if (kref_put_mutex(&obj->refcount, drm_gem_object_free,
+                               &dev->struct_mutex))
+               mutex_unlock(&dev->struct_mutex);
+}
+EXPORT_SYMBOL(drm_gem_object_unreference_unlocked);
+
+/**
+ * drm_gem_object_unreference - release a GEM BO reference
+ * @obj: GEM buffer object
+ *
+ * This releases a reference to @obj. Callers must hold the dev->struct_mutex
+ * lock when calling this function, even when the driver doesn't use
+ * dev->struct_mutex for anything.
+ *
+ * For drivers not encumbered with legacy locking use
+ * drm_gem_object_unreference_unlocked() instead.
+ */
+void
+drm_gem_object_unreference(struct drm_gem_object *obj)
+{
+       if (obj) {
+               WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
+
+               kref_put(&obj->refcount, drm_gem_object_free);
+       }
+}
+EXPORT_SYMBOL(drm_gem_object_unreference);
+
 /**
  * drm_gem_vm_open - vma->ops->open implementation for GEM
  * @vma: VM area structure
index 1f500a1b99695a6bb83b3d596b9a2101f6f1f8ef..e1ab008b3f0841675d5b06ae6ceb4fc037b985f5 100644 (file)
@@ -291,7 +291,7 @@ int drm_gem_cma_dumb_map_offset(struct drm_file *file_priv,
 {
        struct drm_gem_object *gem_obj;
 
-       gem_obj = drm_gem_object_lookup(drm, file_priv, handle);
+       gem_obj = drm_gem_object_lookup(file_priv, handle);
        if (!gem_obj) {
                dev_err(drm->dev, "failed to lookup GEM object\n");
                return -EINVAL;
index cbb4fc0fc969ee2236e112cbb5974742ceffc191..5d469b2f26f46c611c3a2dca3c6359a813d3aab2 100644 (file)
@@ -174,7 +174,7 @@ int drm_clients_info(struct seq_file *m, void *data)
        /* dev->filelist is sorted youngest first, but we want to present
         * oldest first (i.e. kernel, servers, clients), so walk backwardss.
         */
-       mutex_lock(&dev->struct_mutex);
+       mutex_lock(&dev->filelist_mutex);
        list_for_each_entry_reverse(priv, &dev->filelist, lhead) {
                struct task_struct *task;
 
@@ -190,7 +190,7 @@ int drm_clients_info(struct seq_file *m, void *data)
                           priv->magic);
                rcu_read_unlock();
        }
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->filelist_mutex);
        return 0;
 }
 
index 43cbda3306ac060674b2ec6dfd233ace6a93be33..902cf6a152128231f60bb15aab51028262d17f8f 100644 (file)
@@ -26,7 +26,7 @@ extern unsigned int drm_timestamp_monotonic;
 
 /* drm_fops.c */
 extern struct mutex drm_global_mutex;
-int drm_lastclose(struct drm_device *dev);
+void drm_lastclose(struct drm_device *dev);
 
 /* drm_pci.c */
 int drm_pci_set_unique(struct drm_device *dev,
@@ -37,8 +37,6 @@ int drm_irq_by_busid(struct drm_device *dev, void *data,
 
 /* drm_vm.c */
 int drm_vma_info(struct seq_file *m, void *data);
-void drm_vm_open_locked(struct drm_device *dev, struct vm_area_struct *vma);
-void drm_vm_close_locked(struct drm_device *dev, struct vm_area_struct *vma);
 
 /* drm_prime.c */
 int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
index 8ce2a0c591165018c49392e7ad2b828a1fb3b94b..b7a39771c152e0b48ff4fd8cce4a6e9ab7fcbe95 100644 (file)
@@ -149,58 +149,6 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
        return 0;
 }
 
-/*
- * Get a mapping information.
- *
- * \param inode device inode.
- * \param file_priv DRM file private.
- * \param cmd command.
- * \param arg user argument, pointing to a drm_map structure.
- *
- * \return zero on success or a negative number on failure.
- *
- * Searches for the mapping with the specified offset and copies its information
- * into userspace
- */
-static int drm_getmap(struct drm_device *dev, void *data,
-              struct drm_file *file_priv)
-{
-       struct drm_map *map = data;
-       struct drm_map_list *r_list = NULL;
-       struct list_head *list;
-       int idx;
-       int i;
-
-       idx = map->offset;
-       if (idx < 0)
-               return -EINVAL;
-
-       i = 0;
-       mutex_lock(&dev->struct_mutex);
-       list_for_each(list, &dev->maplist) {
-               if (i == idx) {
-                       r_list = list_entry(list, struct drm_map_list, head);
-                       break;
-               }
-               i++;
-       }
-       if (!r_list || !r_list->map) {
-               mutex_unlock(&dev->struct_mutex);
-               return -EINVAL;
-       }
-
-       map->offset = r_list->map->offset;
-       map->size = r_list->map->size;
-       map->type = r_list->map->type;
-       map->flags = r_list->map->flags;
-       map->handle = (void *)(unsigned long) r_list->user_token;
-       map->mtrr = arch_phys_wc_index(r_list->map->mtrr);
-
-       mutex_unlock(&dev->struct_mutex);
-
-       return 0;
-}
-
 /*
  * Get client information.
  *
@@ -558,7 +506,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
        DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0),
        DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0),
        DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, DRM_UNLOCKED),
+       DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, DRM_UNLOCKED),
        DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
        DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
        DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
index 881c5a6c180c61e2b4f971c0cb394afd8155a7f2..0fac801c18fe941f7114ed141a336e92f90108c2 100644 (file)
@@ -348,9 +348,6 @@ static void vblank_disable_fn(unsigned long arg)
        unsigned int pipe = vblank->pipe;
        unsigned long irqflags;
 
-       if (!dev->vblank_disable_allowed)
-               return;
-
        spin_lock_irqsave(&dev->vbl_lock, irqflags);
        if (atomic_read(&vblank->refcount) == 0 && vblank->enabled) {
                DRM_DEBUG("disabling vblank on crtc %u\n", pipe);
@@ -437,8 +434,6 @@ int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs)
                         "get_vblank_timestamp == NULL\n");
        }
 
-       dev->vblank_disable_allowed = false;
-
        return 0;
 
 err:
@@ -863,10 +858,7 @@ int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
        /* Subtract time delta from raw timestamp to get final
         * vblank_time timestamp for end of vblank.
         */
-       if (delta_ns < 0)
-               etime = ktime_add_ns(etime, -delta_ns);
-       else
-               etime = ktime_sub_ns(etime, delta_ns);
+       etime = ktime_sub_ns(etime, delta_ns);
        *vblank_time = ktime_to_timeval(etime);
 
        DRM_DEBUG_VBL("crtc %u : v 0x%x p(%d,%d)@ %ld.%ld -> %ld.%ld [e %d us, %d rep]\n",
@@ -1588,7 +1580,6 @@ void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe)
 
        if (vblank->inmodeset) {
                spin_lock_irqsave(&dev->vbl_lock, irqflags);
-               dev->vblank_disable_allowed = true;
                drm_reset_vblank_timestamp(dev, pipe);
                spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
 
index 9b731786e4db2d90b95ff6020e253b0c6f883ee7..d3b6ee357a2b432aee09fb5b3780c6df84c7a577 100644 (file)
@@ -63,6 +63,8 @@ int drm_legacy_getsareactx(struct drm_device *d, void *v, struct drm_file *f);
 
 #define DRM_MAP_HASH_OFFSET 0x10000000
 
+int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data,
+                           struct drm_file *file_priv);
 int drm_legacy_addmap_ioctl(struct drm_device *d, void *v, struct drm_file *f);
 int drm_legacy_rmmap_ioctl(struct drm_device *d, void *v, struct drm_file *f);
 int drm_legacy_addbufs(struct drm_device *d, void *v, struct drm_file *f);
index f7448a5e95a9b3bf6fcdf491a079581ea5d8e7c1..7def3d58da188990390ee84fcca75b312ea22735 100644 (file)
@@ -98,7 +98,7 @@ void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode)
        if (!mode)
                return;
 
-       drm_mode_object_put(dev, &mode->base);
+       drm_mode_object_unregister(dev, &mode->base);
 
        kfree(mode);
 }
index 2ef988e037b7e8933682ac19653675d01d6b927c..3dfe3c886502d8b9abac5492075aded558f26b3e 100644 (file)
 static DEFINE_MUTEX(panel_lock);
 static LIST_HEAD(panel_list);
 
+/**
+ * DOC: drm panel
+ *
+ * The DRM panel helpers allow drivers to register panel objects with a
+ * central registry and provide functions to retrieve those panels in display
+ * drivers.
+ */
+
+/**
+ * drm_panel_init - initialize a panel
+ * @panel: DRM panel
+ *
+ * Sets up internal fields of the panel so that it can subsequently be added
+ * to the registry.
+ */
 void drm_panel_init(struct drm_panel *panel)
 {
        INIT_LIST_HEAD(&panel->list);
 }
 EXPORT_SYMBOL(drm_panel_init);
 
+/**
+ * drm_panel_add - add a panel to the global registry
+ * @panel: panel to add
+ *
+ * Add a panel to the global registry so that it can be looked up by display
+ * drivers.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 int drm_panel_add(struct drm_panel *panel)
 {
        mutex_lock(&panel_lock);
@@ -46,6 +70,12 @@ int drm_panel_add(struct drm_panel *panel)
 }
 EXPORT_SYMBOL(drm_panel_add);
 
+/**
+ * drm_panel_remove - remove a panel from the global registry
+ * @panel: DRM panel
+ *
+ * Removes a panel from the global registry.
+ */
 void drm_panel_remove(struct drm_panel *panel)
 {
        mutex_lock(&panel_lock);
@@ -54,6 +84,18 @@ void drm_panel_remove(struct drm_panel *panel)
 }
 EXPORT_SYMBOL(drm_panel_remove);
 
+/**
+ * drm_panel_attach - attach a panel to a connector
+ * @panel: DRM panel
+ * @connector: DRM connector
+ *
+ * After obtaining a pointer to a DRM panel a display driver calls this
+ * function to attach a panel to a connector.
+ *
+ * An error is returned if the panel is already attached to another connector.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector)
 {
        if (panel->connector)
@@ -66,6 +108,15 @@ int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector)
 }
 EXPORT_SYMBOL(drm_panel_attach);
 
+/**
+ * drm_panel_detach - detach a panel from a connector
+ * @panel: DRM panel
+ *
+ * Detaches a panel from the connector it is attached to. If a panel is not
+ * attached to any connector this is effectively a no-op.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 int drm_panel_detach(struct drm_panel *panel)
 {
        panel->connector = NULL;
@@ -76,6 +127,16 @@ int drm_panel_detach(struct drm_panel *panel)
 EXPORT_SYMBOL(drm_panel_detach);
 
 #ifdef CONFIG_OF
+/**
+ * of_drm_find_panel - look up a panel using a device tree node
+ * @np: device tree node of the panel
+ *
+ * Searches the set of registered panels for one that matches the given device
+ * tree node. If a matching panel is found, return a pointer to it.
+ *
+ * Return: A pointer to the panel registered for the specified device tree
+ * node or NULL if no panel matching the device tree node can be found.
+ */
 struct drm_panel *of_drm_find_panel(struct device_node *np)
 {
        struct drm_panel *panel;
index a1fff1179a97ae5ec55e5f7489e367619de322f8..29d5a548d07a70c1fad5b5e13dc7413dd509c1b0 100644 (file)
@@ -250,7 +250,7 @@ void drm_pci_agp_destroy(struct drm_device *dev)
 {
        if (dev->agp) {
                arch_phys_wc_del(dev->agp->agp_mtrr);
-               drm_agp_clear(dev);
+               drm_legacy_agp_clear(dev);
                kfree(dev->agp);
                dev->agp = NULL;
        }
index df6cdc76a16e2ed3586dd61edab3bcc553da77dc..aab0f3f1f42d5528efb184770d9f5bc9d949ce9d 100644 (file)
@@ -407,7 +407,7 @@ int drm_gem_prime_handle_to_fd(struct drm_device *dev,
        struct dma_buf *dmabuf;
 
        mutex_lock(&file_priv->prime.lock);
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj)  {
                ret = -ENOENT;
                goto out_unlock;
index e714b5a7955f4fa7a8da56970d5dc2684182130a..0329080d7f7cb5410a1d903a606d6a38d1b0c74e 100644 (file)
@@ -264,10 +264,8 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
                count = drm_add_edid_modes(connector, edid);
                drm_edid_to_eld(connector, edid);
        } else {
-#ifdef CONFIG_DRM_LOAD_EDID_FIRMWARE
                count = drm_load_edid_firmware(connector);
                if (count == 0)
-#endif
                        count = (*connector_funcs->get_modes)(connector);
        }
 
index d503f8e8c2d1c44cb66fa61ee56c02e7975013f2..fa7fadce8063fec0933ab14b6c64b43ac28adcd2 100644 (file)
@@ -208,9 +208,12 @@ static ssize_t status_show(struct device *device,
                           char *buf)
 {
        struct drm_connector *connector = to_drm_connector(device);
+       enum drm_connector_status status;
+
+       status = READ_ONCE(connector->status);
 
        return snprintf(buf, PAGE_SIZE, "%s\n",
-                       drm_get_connector_status_name(connector->status));
+                       drm_get_connector_status_name(status));
 }
 
 static ssize_t dpms_show(struct device *device,
@@ -231,9 +234,11 @@ static ssize_t enabled_show(struct device *device,
                           char *buf)
 {
        struct drm_connector *connector = to_drm_connector(device);
+       bool enabled;
+
+       enabled = READ_ONCE(connector->encoder);
 
-       return snprintf(buf, PAGE_SIZE, "%s\n", connector->encoder ? "enabled" :
-                       "disabled");
+       return snprintf(buf, PAGE_SIZE, enabled ? "enabled\n" : "disabled\n");
 }
 
 static ssize_t edid_show(struct file *filp, struct kobject *kobj,
@@ -287,102 +292,6 @@ static ssize_t modes_show(struct device *device,
        return written;
 }
 
-static ssize_t tv_subconnector_show(struct device *device,
-                                   struct device_attribute *attr,
-                                   char *buf)
-{
-       struct drm_connector *connector = to_drm_connector(device);
-       struct drm_device *dev = connector->dev;
-       struct drm_property *prop;
-       uint64_t subconnector;
-       int ret;
-
-       prop = dev->mode_config.tv_subconnector_property;
-       if (!prop) {
-               DRM_ERROR("Unable to find subconnector property\n");
-               return 0;
-       }
-
-       ret = drm_object_property_get_value(&connector->base, prop, &subconnector);
-       if (ret)
-               return 0;
-
-       return snprintf(buf, PAGE_SIZE, "%s",
-                       drm_get_tv_subconnector_name((int)subconnector));
-}
-
-static ssize_t tv_select_subconnector_show(struct device *device,
-                                          struct device_attribute *attr,
-                                          char *buf)
-{
-       struct drm_connector *connector = to_drm_connector(device);
-       struct drm_device *dev = connector->dev;
-       struct drm_property *prop;
-       uint64_t subconnector;
-       int ret;
-
-       prop = dev->mode_config.tv_select_subconnector_property;
-       if (!prop) {
-               DRM_ERROR("Unable to find select subconnector property\n");
-               return 0;
-       }
-
-       ret = drm_object_property_get_value(&connector->base, prop, &subconnector);
-       if (ret)
-               return 0;
-
-       return snprintf(buf, PAGE_SIZE, "%s",
-                       drm_get_tv_select_name((int)subconnector));
-}
-
-static ssize_t dvii_subconnector_show(struct device *device,
-                                     struct device_attribute *attr,
-                                     char *buf)
-{
-       struct drm_connector *connector = to_drm_connector(device);
-       struct drm_device *dev = connector->dev;
-       struct drm_property *prop;
-       uint64_t subconnector;
-       int ret;
-
-       prop = dev->mode_config.dvi_i_subconnector_property;
-       if (!prop) {
-               DRM_ERROR("Unable to find subconnector property\n");
-               return 0;
-       }
-
-       ret = drm_object_property_get_value(&connector->base, prop, &subconnector);
-       if (ret)
-               return 0;
-
-       return snprintf(buf, PAGE_SIZE, "%s",
-                       drm_get_dvi_i_subconnector_name((int)subconnector));
-}
-
-static ssize_t dvii_select_subconnector_show(struct device *device,
-                                            struct device_attribute *attr,
-                                            char *buf)
-{
-       struct drm_connector *connector = to_drm_connector(device);
-       struct drm_device *dev = connector->dev;
-       struct drm_property *prop;
-       uint64_t subconnector;
-       int ret;
-
-       prop = dev->mode_config.dvi_i_select_subconnector_property;
-       if (!prop) {
-               DRM_ERROR("Unable to find select subconnector property\n");
-               return 0;
-       }
-
-       ret = drm_object_property_get_value(&connector->base, prop, &subconnector);
-       if (ret)
-               return 0;
-
-       return snprintf(buf, PAGE_SIZE, "%s",
-                       drm_get_dvi_i_select_name((int)subconnector));
-}
-
 static DEVICE_ATTR_RW(status);
 static DEVICE_ATTR_RO(enabled);
 static DEVICE_ATTR_RO(dpms);
@@ -396,54 +305,6 @@ static struct attribute *connector_dev_attrs[] = {
        NULL
 };
 
-static DEVICE_ATTR_RO(tv_subconnector);
-static DEVICE_ATTR_RO(tv_select_subconnector);
-
-static struct attribute *connector_tv_dev_attrs[] = {
-       &dev_attr_tv_subconnector.attr,
-       &dev_attr_tv_select_subconnector.attr,
-       NULL
-};
-
-static DEVICE_ATTR_RO(dvii_subconnector);
-static DEVICE_ATTR_RO(dvii_select_subconnector);
-
-static struct attribute *connector_dvii_dev_attrs[] = {
-       &dev_attr_dvii_subconnector.attr,
-       &dev_attr_dvii_select_subconnector.attr,
-       NULL
-};
-
-/* Connector type related helpers */
-static int kobj_connector_type(struct kobject *kobj)
-{
-       struct device *dev = kobj_to_dev(kobj);
-       struct drm_connector *connector = to_drm_connector(dev);
-
-       return connector->connector_type;
-}
-
-static umode_t connector_is_dvii(struct kobject *kobj,
-                                struct attribute *attr, int idx)
-{
-       return kobj_connector_type(kobj) == DRM_MODE_CONNECTOR_DVII ?
-               attr->mode : 0;
-}
-
-static umode_t connector_is_tv(struct kobject *kobj,
-                              struct attribute *attr, int idx)
-{
-       switch (kobj_connector_type(kobj)) {
-       case DRM_MODE_CONNECTOR_Composite:
-       case DRM_MODE_CONNECTOR_SVIDEO:
-       case DRM_MODE_CONNECTOR_Component:
-       case DRM_MODE_CONNECTOR_TV:
-               return attr->mode;
-       }
-
-       return 0;
-}
-
 static struct bin_attribute edid_attr = {
        .attr.name = "edid",
        .attr.mode = 0444,
@@ -461,20 +322,8 @@ static const struct attribute_group connector_dev_group = {
        .bin_attrs = connector_bin_attrs,
 };
 
-static const struct attribute_group connector_tv_dev_group = {
-       .attrs = connector_tv_dev_attrs,
-       .is_visible = connector_is_tv,
-};
-
-static const struct attribute_group connector_dvii_dev_group = {
-       .attrs = connector_dvii_dev_attrs,
-       .is_visible = connector_is_dvii,
-};
-
 static const struct attribute_group *connector_dev_groups[] = {
        &connector_dev_group,
-       &connector_tv_dev_group,
-       &connector_dvii_dev_group,
        NULL
 };
 
index f90bd5fe35babbc6b6eb216cefd0f0dad054932d..ac9f4b3ec615c5fb73cd00c4947d985ab4fa18b4 100644 (file)
@@ -395,16 +395,8 @@ static const struct vm_operations_struct drm_vm_sg_ops = {
        .close = drm_vm_close,
 };
 
-/**
- * \c open method for shared virtual memory.
- *
- * \param vma virtual memory area.
- *
- * Create a new drm_vma_entry structure as the \p vma private data entry and
- * add it to drm_device::vmalist.
- */
-void drm_vm_open_locked(struct drm_device *dev,
-               struct vm_area_struct *vma)
+static void drm_vm_open_locked(struct drm_device *dev,
+                              struct vm_area_struct *vma)
 {
        struct drm_vma_entry *vma_entry;
 
@@ -429,8 +421,8 @@ static void drm_vm_open(struct vm_area_struct *vma)
        mutex_unlock(&dev->struct_mutex);
 }
 
-void drm_vm_close_locked(struct drm_device *dev,
-               struct vm_area_struct *vma)
+static void drm_vm_close_locked(struct drm_device *dev,
+                               struct vm_area_struct *vma)
 {
        struct drm_vma_entry *pt, *temp;
 
index e8858985f01ea0fb5a17e39a3c7b246d6ae562d9..3d4f56df8359e6ae81a77c574e9e9a42105b6963 100644 (file)
@@ -314,7 +314,7 @@ static int etnaviv_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
        if (args->op & ~(ETNA_PREP_READ | ETNA_PREP_WRITE | ETNA_PREP_NOSYNC))
                return -EINVAL;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -335,7 +335,7 @@ static int etnaviv_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
        if (args->flags)
                return -EINVAL;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -356,7 +356,7 @@ static int etnaviv_ioctl_gem_info(struct drm_device *dev, void *data,
        if (args->pad)
                return -EINVAL;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -441,7 +441,7 @@ static int etnaviv_ioctl_gem_wait(struct drm_device *dev, void *data,
        if (!gpu)
                return -ENXIO;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -497,7 +497,7 @@ static struct drm_driver etnaviv_drm_driver = {
        .open               = etnaviv_open,
        .preclose           = etnaviv_preclose,
        .set_busid          = drm_platform_set_busid,
-       .gem_free_object    = etnaviv_gem_free_object,
+       .gem_free_object_unlocked = etnaviv_gem_free_object,
        .gem_vm_ops         = &vm_ops,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
index 281c6eca20a85524cc34b615f5bc5d0567b4d7ba..df9bcbab922f359bd1837f5b3a5fde457e827457 100644 (file)
@@ -129,10 +129,9 @@ void etnaviv_gem_put_pages(struct etnaviv_gem_object *etnaviv_obj)
        /* when we start tracking the pin count, then do something here */
 }
 
-static int etnaviv_gem_mmap_obj(struct drm_gem_object *obj,
+static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
                struct vm_area_struct *vma)
 {
-       struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
        pgprot_t vm_page_prot;
 
        vma->vm_flags &= ~VM_PFNMAP;
@@ -151,9 +150,9 @@ static int etnaviv_gem_mmap_obj(struct drm_gem_object *obj,
                 * in particular in the case of mmap'd dmabufs)
                 */
                fput(vma->vm_file);
-               get_file(obj->filp);
+               get_file(etnaviv_obj->base.filp);
                vma->vm_pgoff = 0;
-               vma->vm_file  = obj->filp;
+               vma->vm_file  = etnaviv_obj->base.filp;
 
                vma->vm_page_prot = vm_page_prot;
        }
@@ -173,7 +172,7 @@ int etnaviv_gem_mmap(struct file *filp, struct vm_area_struct *vma)
        }
 
        obj = to_etnaviv_bo(vma->vm_private_data);
-       return etnaviv_gem_mmap_obj(vma->vm_private_data, vma);
+       return obj->ops->mmap(obj, vma);
 }
 
 int etnaviv_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
@@ -545,6 +544,7 @@ static const struct etnaviv_gem_ops etnaviv_gem_shmem_ops = {
        .get_pages = etnaviv_gem_shmem_get_pages,
        .release = etnaviv_gem_shmem_release,
        .vmap = etnaviv_gem_vmap_impl,
+       .mmap = etnaviv_gem_mmap_obj,
 };
 
 void etnaviv_gem_free_object(struct drm_gem_object *obj)
@@ -886,10 +886,17 @@ static void etnaviv_gem_userptr_release(struct etnaviv_gem_object *etnaviv_obj)
        put_task_struct(etnaviv_obj->userptr.task);
 }
 
+static int etnaviv_gem_userptr_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
+               struct vm_area_struct *vma)
+{
+       return -EINVAL;
+}
+
 static const struct etnaviv_gem_ops etnaviv_gem_userptr_ops = {
        .get_pages = etnaviv_gem_userptr_get_pages,
        .release = etnaviv_gem_userptr_release,
        .vmap = etnaviv_gem_vmap_impl,
+       .mmap = etnaviv_gem_userptr_mmap_obj,
 };
 
 int etnaviv_gem_new_userptr(struct drm_device *dev, struct drm_file *file,
index 02665d8c10eea6a032c1aa4e38bd3e3e71334ccb..e63ff116a3b3df15e15897068d37e0f366803978 100644 (file)
@@ -79,6 +79,7 @@ struct etnaviv_gem_ops {
        int (*get_pages)(struct etnaviv_gem_object *);
        void (*release)(struct etnaviv_gem_object *);
        void *(*vmap)(struct etnaviv_gem_object *);
+       int (*mmap)(struct etnaviv_gem_object *, struct vm_area_struct *);
 };
 
 static inline bool is_active(struct etnaviv_gem_object *etnaviv_obj)
index 4e67395f5fa1c1572aa7051a86538aa16389f807..b93618c1aa69e6c77609d1bc0ce18f308cab7b3f 100644 (file)
@@ -84,10 +84,17 @@ static void *etnaviv_gem_prime_vmap_impl(struct etnaviv_gem_object *etnaviv_obj)
        return dma_buf_vmap(etnaviv_obj->base.import_attach->dmabuf);
 }
 
+static int etnaviv_gem_prime_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
+               struct vm_area_struct *vma)
+{
+       return dma_buf_mmap(etnaviv_obj->base.dma_buf, vma, 0);
+}
+
 static const struct etnaviv_gem_ops etnaviv_gem_prime_ops = {
        /* .get_pages should never be called */
        .release = etnaviv_gem_prime_release,
        .vmap = etnaviv_gem_prime_vmap_impl,
+       .mmap = etnaviv_gem_prime_mmap_obj,
 };
 
 struct drm_gem_object *etnaviv_gem_prime_import_sg_table(struct drm_device *dev,
index d8a9a9c68e98e8b861c821d85ae5c50db107a566..ff6aa5dfb2d7574556f9f8d97310c4c127f1c212 100644 (file)
@@ -1528,8 +1528,8 @@ static int etnaviv_gpu_bind(struct device *dev, struct device *master,
        INIT_WORK(&gpu->recover_work, recover_worker);
        init_waitqueue_head(&gpu->fence_event);
 
-       setup_timer(&gpu->hangcheck_timer, hangcheck_handler,
-                       (unsigned long)gpu);
+       setup_deferrable_timer(&gpu->hangcheck_timer, hangcheck_handler,
+                              (unsigned long)gpu);
 
        priv->gpu[priv->num_gpus++] = gpu;
 
index baddf33fb475863379bcffcd7befb4da085e37f2..d814b3048ee5bfe1b0ee08cccfcfd8ff9e6ad1de 100644 (file)
@@ -71,8 +71,9 @@ config DRM_EXYNOS_DSI
          This enables support for Exynos MIPI-DSI device.
 
 config DRM_EXYNOS_DP
-       bool "Display Port"
+       bool "EXYNOS specific extensions for Analogix DP driver"
        depends on DRM_EXYNOS_FIMD || DRM_EXYNOS7_DECON
+       select DRM_ANALOGIX_DP
        default DRM_EXYNOS
        select DRM_PANEL
        help
index 23d2f958739b187b7bd28ae4e0f7f7ec7522da6f..f663490e949db59f3f087b9fcaa1f7c589d81c34 100644 (file)
@@ -12,7 +12,7 @@ exynosdrm-$(CONFIG_DRM_EXYNOS5433_DECON)      += exynos5433_drm_decon.o
 exynosdrm-$(CONFIG_DRM_EXYNOS7_DECON)  += exynos7_drm_decon.o
 exynosdrm-$(CONFIG_DRM_EXYNOS_DPI)     += exynos_drm_dpi.o
 exynosdrm-$(CONFIG_DRM_EXYNOS_DSI)     += exynos_drm_dsi.o
-exynosdrm-$(CONFIG_DRM_EXYNOS_DP)      += exynos_dp_core.o exynos_dp_reg.o
+exynosdrm-$(CONFIG_DRM_EXYNOS_DP)      += exynos_dp.o
 exynosdrm-$(CONFIG_DRM_EXYNOS_MIXER)   += exynos_mixer.o
 exynosdrm-$(CONFIG_DRM_EXYNOS_HDMI)    += exynos_hdmi.o
 exynosdrm-$(CONFIG_DRM_EXYNOS_VIDI)    += exynos_drm_vidi.o
index 5245bc5e82e934cc77ba71353ef6fa8b3df12fb1..ac21b40008358efc49f357deceb09a58cb138356 100644 (file)
 #define WINDOWS_NR     3
 #define MIN_FB_WIDTH_FOR_16WORD_BURST  128
 
+#define IFTYPE_I80     (1 << 0)
+#define I80_HW_TRG     (1 << 1)
+#define IFTYPE_HDMI    (1 << 2)
+
 static const char * const decon_clks_name[] = {
        "pclk",
        "aclk_decon",
@@ -38,12 +42,6 @@ static const char * const decon_clks_name[] = {
        "sclk_decon_eclk",
 };
 
-enum decon_iftype {
-       IFTYPE_RGB,
-       IFTYPE_I80,
-       IFTYPE_HDMI
-};
-
 enum decon_flag_bits {
        BIT_CLKS_ENABLED,
        BIT_IRQS_ENABLED,
@@ -61,7 +59,7 @@ struct decon_context {
        struct clk                      *clks[ARRAY_SIZE(decon_clks_name)];
        int                             pipe;
        unsigned long                   flags;
-       enum decon_iftype               out_type;
+       unsigned long                   out_type;
        int                             first_win;
 };
 
@@ -95,7 +93,7 @@ static int decon_enable_vblank(struct exynos_drm_crtc *crtc)
 
        if (!test_and_set_bit(BIT_IRQS_ENABLED, &ctx->flags)) {
                val = VIDINTCON0_INTEN;
-               if (ctx->out_type == IFTYPE_I80)
+               if (ctx->out_type & IFTYPE_I80)
                        val |= VIDINTCON0_FRAMEDONE;
                else
                        val |= VIDINTCON0_INTFRMEN;
@@ -119,11 +117,11 @@ static void decon_disable_vblank(struct exynos_drm_crtc *crtc)
 
 static void decon_setup_trigger(struct decon_context *ctx)
 {
-       u32 val = (ctx->out_type != IFTYPE_HDMI)
+       u32 val = !(ctx->out_type & I80_HW_TRG)
                ? TRIGCON_TRIGEN_PER_F | TRIGCON_TRIGEN_F |
                  TRIGCON_TE_AUTO_MASK | TRIGCON_SWTRIGEN
                : TRIGCON_TRIGEN_PER_F | TRIGCON_TRIGEN_F |
-                 TRIGCON_HWTRIGMASK_I80_RGB | TRIGCON_HWTRIGEN_I80_RGB;
+                 TRIGCON_HWTRIGMASK | TRIGCON_HWTRIGEN;
        writel(val, ctx->addr + DECON_TRIGCON);
 }
 
@@ -136,7 +134,7 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
        if (test_bit(BIT_SUSPENDED, &ctx->flags))
                return;
 
-       if (ctx->out_type == IFTYPE_HDMI) {
+       if (ctx->out_type & IFTYPE_HDMI) {
                m->crtc_hsync_start = m->crtc_hdisplay + 10;
                m->crtc_hsync_end = m->crtc_htotal - 92;
                m->crtc_vsync_start = m->crtc_vdisplay + 1;
@@ -149,19 +147,24 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
        val = CMU_CLKGAGE_MODE_SFR_F | CMU_CLKGAGE_MODE_MEM_F;
        writel(val, ctx->addr + DECON_CMU);
 
+       if (ctx->out_type & (IFTYPE_I80 | I80_HW_TRG))
+               decon_setup_trigger(ctx);
+
        /* lcd on and use command if */
        val = VIDOUT_LCD_ON;
-       if (ctx->out_type == IFTYPE_I80)
+       if (ctx->out_type & IFTYPE_I80) {
                val |= VIDOUT_COMMAND_IF;
-       else
+       } else {
                val |= VIDOUT_RGB_IF;
+       }
+
        writel(val, ctx->addr + DECON_VIDOUTCON0);
 
        val = VIDTCON2_LINEVAL(m->vdisplay - 1) |
                VIDTCON2_HOZVAL(m->hdisplay - 1);
        writel(val, ctx->addr + DECON_VIDTCON2);
 
-       if (ctx->out_type != IFTYPE_I80) {
+       if (!(ctx->out_type & IFTYPE_I80)) {
                val = VIDTCON00_VBPD_F(
                                m->crtc_vtotal - m->crtc_vsync_end - 1) |
                        VIDTCON00_VFPD_F(
@@ -183,10 +186,10 @@ static void decon_commit(struct exynos_drm_crtc *crtc)
                writel(val, ctx->addr + DECON_VIDTCON11);
        }
 
-       decon_setup_trigger(ctx);
-
        /* enable output and display signal */
        decon_set_bits(ctx, DECON_VIDCON0, VIDCON0_ENVID | VIDCON0_ENVID_F, ~0);
+
+       decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
 }
 
 static void decon_win_set_pixfmt(struct decon_context *ctx, unsigned int win,
@@ -300,7 +303,7 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
        val = dma_addr + pitch * state->src.h;
        writel(val, ctx->addr + DECON_VIDW0xADD1B0(win));
 
-       if (ctx->out_type != IFTYPE_HDMI)
+       if (!(ctx->out_type & IFTYPE_HDMI))
                val = BIT_VAL(pitch - state->crtc.w * bpp, 27, 14)
                        | BIT_VAL(state->crtc.w * bpp, 13, 0);
        else
@@ -312,9 +315,6 @@ static void decon_update_plane(struct exynos_drm_crtc *crtc,
 
        /* window enable */
        decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, ~0);
-
-       /* standalone update */
-       decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
 }
 
 static void decon_disable_plane(struct exynos_drm_crtc *crtc,
@@ -326,15 +326,7 @@ static void decon_disable_plane(struct exynos_drm_crtc *crtc,
        if (test_bit(BIT_SUSPENDED, &ctx->flags))
                return;
 
-       decon_shadow_protect_win(ctx, win, true);
-
-       /* window disable */
        decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, 0);
-
-       decon_shadow_protect_win(ctx, win, false);
-
-       /* standalone update */
-       decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
 }
 
 static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
@@ -348,7 +340,10 @@ static void decon_atomic_flush(struct exynos_drm_crtc *crtc)
        for (i = ctx->first_win; i < WINDOWS_NR; i++)
                decon_shadow_protect_win(ctx, i, false);
 
-       if (ctx->out_type == IFTYPE_I80)
+       /* standalone update */
+       decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
+
+       if (ctx->out_type & IFTYPE_I80)
                set_bit(BIT_WIN_UPDATED, &ctx->flags);
 }
 
@@ -374,7 +369,7 @@ static void decon_swreset(struct decon_context *ctx)
 
        WARN(tries == 0, "failed to software reset DECON\n");
 
-       if (ctx->out_type != IFTYPE_HDMI)
+       if (!(ctx->out_type & IFTYPE_HDMI))
                return;
 
        writel(VIDCON0_CLKVALUP | VIDCON0_VLCKFREE, ctx->addr + DECON_VIDCON0);
@@ -383,7 +378,6 @@ static void decon_swreset(struct decon_context *ctx)
        writel(VIDCON1_VCLK_RUN_VDEN_DISABLE, ctx->addr + DECON_VIDCON1);
        writel(CRCCTRL_CRCEN | CRCCTRL_CRCSTART_F | CRCCTRL_CRCCLKEN,
               ctx->addr + DECON_CRCCTRL);
-       decon_setup_trigger(ctx);
 }
 
 static void decon_enable(struct exynos_drm_crtc *crtc)
@@ -395,8 +389,12 @@ static void decon_enable(struct exynos_drm_crtc *crtc)
 
        pm_runtime_get_sync(ctx->dev);
 
+       exynos_drm_pipe_clk_enable(crtc, true);
+
        set_bit(BIT_CLKS_ENABLED, &ctx->flags);
 
+       decon_swreset(ctx);
+
        /* if vblank was enabled status, enable it again. */
        if (test_and_clear_bit(BIT_IRQS_ENABLED, &ctx->flags))
                decon_enable_vblank(ctx->crtc);
@@ -424,6 +422,8 @@ static void decon_disable(struct exynos_drm_crtc *crtc)
 
        clear_bit(BIT_CLKS_ENABLED, &ctx->flags);
 
+       exynos_drm_pipe_clk_enable(crtc, false);
+
        pm_runtime_put_sync(ctx->dev);
 
        set_bit(BIT_SUSPENDED, &ctx->flags);
@@ -433,13 +433,12 @@ static void decon_te_irq_handler(struct exynos_drm_crtc *crtc)
 {
        struct decon_context *ctx = crtc->ctx;
 
-       if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags))
+       if (!test_bit(BIT_CLKS_ENABLED, &ctx->flags) ||
+           (ctx->out_type & I80_HW_TRG))
                return;
 
        if (test_and_clear_bit(BIT_WIN_UPDATED, &ctx->flags))
                decon_set_bits(ctx, DECON_TRIGCON, TRIGCON_SWTRIGCMD, ~0);
-
-       drm_crtc_handle_vblank(&ctx->crtc->base);
 }
 
 static void decon_clear_channels(struct exynos_drm_crtc *crtc)
@@ -459,8 +458,10 @@ static void decon_clear_channels(struct exynos_drm_crtc *crtc)
                decon_shadow_protect_win(ctx, win, true);
                decon_set_bits(ctx, DECON_WINCONx(win), WINCONx_ENWIN_F, 0);
                decon_shadow_protect_win(ctx, win, false);
-               decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
        }
+
+       decon_set_bits(ctx, DECON_UPDATE, STANDALONE_UPDATE_F, ~0);
+
        /* TODO: wait for possible vsync */
        msleep(50);
 
@@ -509,7 +510,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
        }
 
        exynos_plane = &ctx->planes[ctx->first_win];
-       out_type = (ctx->out_type == IFTYPE_HDMI) ? EXYNOS_DISPLAY_TYPE_HDMI
+       out_type = (ctx->out_type & IFTYPE_HDMI) ? EXYNOS_DISPLAY_TYPE_HDMI
                                                  : EXYNOS_DISPLAY_TYPE_LCD;
        ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
                                        ctx->pipe, out_type,
@@ -570,6 +571,7 @@ static irqreturn_t decon_irq_handler(int irq, void *dev_id)
 
                /* clear */
                writel(val, ctx->addr + DECON_VIDINTCON1);
+               drm_crtc_handle_vblank(&ctx->crtc->base);
        }
 
 out:
@@ -617,11 +619,11 @@ static const struct dev_pm_ops exynos5433_decon_pm_ops = {
 static const struct of_device_id exynos5433_decon_driver_dt_match[] = {
        {
                .compatible = "samsung,exynos5433-decon",
-               .data = (void *)IFTYPE_RGB
+               .data = (void *)I80_HW_TRG
        },
        {
                .compatible = "samsung,exynos5433-decon-tv",
-               .data = (void *)IFTYPE_HDMI
+               .data = (void *)(I80_HW_TRG | IFTYPE_HDMI)
        },
        {},
 };
@@ -629,7 +631,6 @@ MODULE_DEVICE_TABLE(of, exynos5433_decon_driver_dt_match);
 
 static int exynos5433_decon_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *of_id;
        struct device *dev = &pdev->dev;
        struct decon_context *ctx;
        struct resource *res;
@@ -642,14 +643,13 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
 
        __set_bit(BIT_SUSPENDED, &ctx->flags);
        ctx->dev = dev;
+       ctx->out_type = (unsigned long)of_device_get_match_data(dev);
 
-       of_id = of_match_device(exynos5433_decon_driver_dt_match, &pdev->dev);
-       ctx->out_type = (enum decon_iftype)of_id->data;
-
-       if (ctx->out_type == IFTYPE_HDMI)
+       if (ctx->out_type & IFTYPE_HDMI) {
                ctx->first_win = 1;
-       else if (of_get_child_by_name(dev->of_node, "i80-if-timings"))
-               ctx->out_type = IFTYPE_I80;
+       } else if (of_get_child_by_name(dev->of_node, "i80-if-timings")) {
+               ctx->out_type |= IFTYPE_I80;
+       }
 
        for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++) {
                struct clk *clk;
@@ -674,7 +674,7 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
        }
 
        res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
-                       (ctx->out_type == IFTYPE_I80) ? "lcd_sys" : "vsync");
+                       (ctx->out_type & IFTYPE_I80) ? "lcd_sys" : "vsync");
        if (!res) {
                dev_err(dev, "cannot find IRQ resource\n");
                return -ENXIO;
index 93361073af9aa667471753843fe7f335ab1077aa..f6223f907c158fbdfcf176da6aef13536966c5bb 100644 (file)
@@ -593,7 +593,6 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
        .commit = decon_commit,
        .enable_vblank = decon_enable_vblank,
        .disable_vblank = decon_disable_vblank,
-       .wait_for_vblank = decon_wait_for_vblank,
        .atomic_begin = decon_atomic_begin,
        .update_plane = decon_update_plane,
        .disable_plane = decon_disable_plane,
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
new file mode 100644 (file)
index 0000000..468498e
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * Samsung SoC DP (Display Port) interface driver.
+ *
+ * Copyright (C) 2012 Samsung Electronics Co., Ltd.
+ * Author: Jingoo Han <jg1.han@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/of_graph.h>
+#include <linux/component.h>
+#include <video/of_display_timing.h>
+#include <video/of_videomode.h>
+#include <video/videomode.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_panel.h>
+
+#include <drm/bridge/analogix_dp.h>
+#include <drm/exynos_drm.h>
+
+#include "exynos_drm_crtc.h"
+
+#define to_dp(nm)      container_of(nm, struct exynos_dp_device, nm)
+
+struct exynos_dp_device {
+       struct drm_encoder         encoder;
+       struct drm_connector       connector;
+       struct drm_bridge          *ptn_bridge;
+       struct drm_device          *drm_dev;
+       struct device              *dev;
+
+       struct videomode           vm;
+       struct analogix_dp_plat_data plat_data;
+};
+
+int exynos_dp_crtc_clock_enable(struct analogix_dp_plat_data *plat_data,
+                               bool enable)
+{
+       struct exynos_dp_device *dp = to_dp(plat_data);
+       struct drm_encoder *encoder = &dp->encoder;
+
+       if (!encoder->crtc)
+               return -EPERM;
+
+       exynos_drm_pipe_clk_enable(to_exynos_crtc(encoder->crtc), enable);
+
+       return 0;
+}
+
+static int exynos_dp_poweron(struct analogix_dp_plat_data *plat_data)
+{
+       return exynos_dp_crtc_clock_enable(plat_data, true);
+}
+
+static int exynos_dp_poweroff(struct analogix_dp_plat_data *plat_data)
+{
+       return exynos_dp_crtc_clock_enable(plat_data, false);
+}
+
+static int exynos_dp_get_modes(struct analogix_dp_plat_data *plat_data)
+{
+       struct exynos_dp_device *dp = to_dp(plat_data);
+       struct drm_connector *connector = &dp->connector;
+       struct drm_display_mode *mode;
+       int num_modes = 0;
+
+       if (dp->plat_data.panel)
+               return num_modes;
+
+       mode = drm_mode_create(connector->dev);
+       if (!mode) {
+               DRM_ERROR("failed to create a new display mode.\n");
+               return num_modes;
+       }
+
+       drm_display_mode_from_videomode(&dp->vm, mode);
+       connector->display_info.width_mm = mode->width_mm;
+       connector->display_info.height_mm = mode->height_mm;
+
+       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+       drm_mode_set_name(mode);
+       drm_mode_probed_add(connector, mode);
+
+       return num_modes + 1;
+}
+
+static int exynos_dp_bridge_attach(struct analogix_dp_plat_data *plat_data,
+                                  struct drm_bridge *bridge,
+                                  struct drm_connector *connector)
+{
+       struct exynos_dp_device *dp = to_dp(plat_data);
+       struct drm_encoder *encoder = &dp->encoder;
+       int ret;
+
+       drm_connector_register(connector);
+
+       /* Pre-empt DP connector creation if there's a bridge */
+       if (dp->ptn_bridge) {
+               bridge->next = dp->ptn_bridge;
+               dp->ptn_bridge->encoder = encoder;
+               ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
+               if (ret) {
+                       DRM_ERROR("Failed to attach bridge to drm\n");
+                       bridge->next = NULL;
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
+static void exynos_dp_mode_set(struct drm_encoder *encoder,
+                              struct drm_display_mode *mode,
+                              struct drm_display_mode *adjusted_mode)
+{
+}
+
+static void exynos_dp_nop(struct drm_encoder *encoder)
+{
+       /* do nothing */
+}
+
+static const struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs = {
+       .mode_set = exynos_dp_mode_set,
+       .enable = exynos_dp_nop,
+       .disable = exynos_dp_nop,
+};
+
+static const struct drm_encoder_funcs exynos_dp_encoder_funcs = {
+       .destroy = drm_encoder_cleanup,
+};
+
+static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
+{
+       int ret;
+
+       ret = of_get_videomode(dp->dev->of_node, &dp->vm, OF_USE_NATIVE_MODE);
+       if (ret) {
+               DRM_ERROR("failed: of_get_videomode() : %d\n", ret);
+               return ret;
+       }
+       return 0;
+}
+
+static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
+{
+       struct exynos_dp_device *dp = dev_get_drvdata(dev);
+       struct drm_encoder *encoder = &dp->encoder;
+       struct drm_device *drm_dev = data;
+       int pipe, ret;
+
+       /*
+        * Just like the probe function said, we don't need the
+        * device drvrate anymore, we should leave the charge to
+        * analogix dp driver, set the device drvdata to NULL.
+        */
+       dev_set_drvdata(dev, NULL);
+
+       dp->dev = dev;
+       dp->drm_dev = drm_dev;
+
+       dp->plat_data.dev_type = EXYNOS_DP;
+       dp->plat_data.power_on = exynos_dp_poweron;
+       dp->plat_data.power_off = exynos_dp_poweroff;
+       dp->plat_data.attach = exynos_dp_bridge_attach;
+       dp->plat_data.get_modes = exynos_dp_get_modes;
+
+       if (!dp->plat_data.panel && !dp->ptn_bridge) {
+               ret = exynos_dp_dt_parse_panel(dp);
+               if (ret)
+                       return ret;
+       }
+
+       pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
+                                                 EXYNOS_DISPLAY_TYPE_LCD);
+       if (pipe < 0)
+               return pipe;
+
+       encoder->possible_crtcs = 1 << pipe;
+
+       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
+
+       drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
+                        DRM_MODE_ENCODER_TMDS, NULL);
+
+       drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
+
+       dp->plat_data.encoder = encoder;
+
+       return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+}
+
+static void exynos_dp_unbind(struct device *dev, struct device *master,
+                            void *data)
+{
+       return analogix_dp_unbind(dev, master, data);
+}
+
+static const struct component_ops exynos_dp_ops = {
+       .bind   = exynos_dp_bind,
+       .unbind = exynos_dp_unbind,
+};
+
+static int exynos_dp_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = NULL, *endpoint = NULL;
+       struct exynos_dp_device *dp;
+
+       dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
+                         GFP_KERNEL);
+       if (!dp)
+               return -ENOMEM;
+
+       /*
+        * We just use the drvdata until driver run into component
+        * add function, and then we would set drvdata to null, so
+        * that analogix dp driver would take charge of the drvdata.
+        */
+       platform_set_drvdata(pdev, dp);
+
+       /* This is for the backward compatibility. */
+       np = of_parse_phandle(dev->of_node, "panel", 0);
+       if (np) {
+               dp->plat_data.panel = of_drm_find_panel(np);
+               of_node_put(np);
+               if (!dp->plat_data.panel)
+                       return -EPROBE_DEFER;
+               goto out;
+       }
+
+       endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+       if (endpoint) {
+               np = of_graph_get_remote_port_parent(endpoint);
+               if (np) {
+                       /* The remote port can be either a panel or a bridge */
+                       dp->plat_data.panel = of_drm_find_panel(np);
+                       if (!dp->plat_data.panel) {
+                               dp->ptn_bridge = of_drm_find_bridge(np);
+                               if (!dp->ptn_bridge) {
+                                       of_node_put(np);
+                                       return -EPROBE_DEFER;
+                               }
+                       }
+                       of_node_put(np);
+               } else {
+                       DRM_ERROR("no remote endpoint device node found.\n");
+                       return -EINVAL;
+               }
+       } else {
+               DRM_ERROR("no port endpoint subnode found.\n");
+               return -EINVAL;
+       }
+
+out:
+       return component_add(&pdev->dev, &exynos_dp_ops);
+}
+
+static int exynos_dp_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &exynos_dp_ops);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM
+static int exynos_dp_suspend(struct device *dev)
+{
+       return analogix_dp_suspend(dev);
+}
+
+static int exynos_dp_resume(struct device *dev)
+{
+       return analogix_dp_resume(dev);
+}
+#endif
+
+static const struct dev_pm_ops exynos_dp_pm_ops = {
+       SET_RUNTIME_PM_OPS(exynos_dp_suspend, exynos_dp_resume, NULL)
+};
+
+static const struct of_device_id exynos_dp_match[] = {
+       { .compatible = "samsung,exynos5-dp" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, exynos_dp_match);
+
+struct platform_driver dp_driver = {
+       .probe          = exynos_dp_probe,
+       .remove         = exynos_dp_remove,
+       .driver         = {
+               .name   = "exynos-dp",
+               .owner  = THIS_MODULE,
+               .pm     = &exynos_dp_pm_ops,
+               .of_match_table = exynos_dp_match,
+       },
+};
+
+MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
+MODULE_DESCRIPTION("Samsung Specific Analogix-DP Driver Extension");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.c b/drivers/gpu/drm/exynos/exynos_dp_core.c
deleted file mode 100644 (file)
index cff8dc7..0000000
+++ /dev/null
@@ -1,1499 +0,0 @@
-/*
- * Samsung SoC DP (Display Port) interface driver.
- *
- * Copyright (C) 2012 Samsung Electronics Co., Ltd.
- * Author: Jingoo Han <jg1.han@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/interrupt.h>
-#include <linux/of.h>
-#include <linux/of_gpio.h>
-#include <linux/of_graph.h>
-#include <linux/gpio.h>
-#include <linux/component.h>
-#include <linux/phy/phy.h>
-#include <video/of_display_timing.h>
-#include <video/of_videomode.h>
-
-#include <drm/drmP.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_atomic_helper.h>
-#include <drm/drm_panel.h>
-
-#include "exynos_dp_core.h"
-#include "exynos_drm_crtc.h"
-
-#define ctx_from_connector(c)  container_of(c, struct exynos_dp_device, \
-                                       connector)
-
-static inline struct exynos_drm_crtc *dp_to_crtc(struct exynos_dp_device *dp)
-{
-       return to_exynos_crtc(dp->encoder.crtc);
-}
-
-static inline struct exynos_dp_device *encoder_to_dp(
-                                               struct drm_encoder *e)
-{
-       return container_of(e, struct exynos_dp_device, encoder);
-}
-
-struct bridge_init {
-       struct i2c_client *client;
-       struct device_node *node;
-};
-
-static void exynos_dp_init_dp(struct exynos_dp_device *dp)
-{
-       exynos_dp_reset(dp);
-
-       exynos_dp_swreset(dp);
-
-       exynos_dp_init_analog_param(dp);
-       exynos_dp_init_interrupt(dp);
-
-       /* SW defined function Normal operation */
-       exynos_dp_enable_sw_function(dp);
-
-       exynos_dp_config_interrupt(dp);
-       exynos_dp_init_analog_func(dp);
-
-       exynos_dp_init_hpd(dp);
-       exynos_dp_init_aux(dp);
-}
-
-static int exynos_dp_detect_hpd(struct exynos_dp_device *dp)
-{
-       int timeout_loop = 0;
-
-       while (exynos_dp_get_plug_in_status(dp) != 0) {
-               timeout_loop++;
-               if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
-                       dev_err(dp->dev, "failed to get hpd plug status\n");
-                       return -ETIMEDOUT;
-               }
-               usleep_range(10, 11);
-       }
-
-       return 0;
-}
-
-static unsigned char exynos_dp_calc_edid_check_sum(unsigned char *edid_data)
-{
-       int i;
-       unsigned char sum = 0;
-
-       for (i = 0; i < EDID_BLOCK_LENGTH; i++)
-               sum = sum + edid_data[i];
-
-       return sum;
-}
-
-static int exynos_dp_read_edid(struct exynos_dp_device *dp)
-{
-       unsigned char edid[EDID_BLOCK_LENGTH * 2];
-       unsigned int extend_block = 0;
-       unsigned char sum;
-       unsigned char test_vector;
-       int retval;
-
-       /*
-        * EDID device address is 0x50.
-        * However, if necessary, you must have set upper address
-        * into E-EDID in I2C device, 0x30.
-        */
-
-       /* Read Extension Flag, Number of 128-byte EDID extension blocks */
-       retval = exynos_dp_read_byte_from_i2c(dp, I2C_EDID_DEVICE_ADDR,
-                               EDID_EXTENSION_FLAG,
-                               &extend_block);
-       if (retval)
-               return retval;
-
-       if (extend_block > 0) {
-               dev_dbg(dp->dev, "EDID data includes a single extension!\n");
-
-               /* Read EDID data */
-               retval = exynos_dp_read_bytes_from_i2c(dp, I2C_EDID_DEVICE_ADDR,
-                                               EDID_HEADER_PATTERN,
-                                               EDID_BLOCK_LENGTH,
-                                               &edid[EDID_HEADER_PATTERN]);
-               if (retval != 0) {
-                       dev_err(dp->dev, "EDID Read failed!\n");
-                       return -EIO;
-               }
-               sum = exynos_dp_calc_edid_check_sum(edid);
-               if (sum != 0) {
-                       dev_err(dp->dev, "EDID bad checksum!\n");
-                       return -EIO;
-               }
-
-               /* Read additional EDID data */
-               retval = exynos_dp_read_bytes_from_i2c(dp,
-                               I2C_EDID_DEVICE_ADDR,
-                               EDID_BLOCK_LENGTH,
-                               EDID_BLOCK_LENGTH,
-                               &edid[EDID_BLOCK_LENGTH]);
-               if (retval != 0) {
-                       dev_err(dp->dev, "EDID Read failed!\n");
-                       return -EIO;
-               }
-               sum = exynos_dp_calc_edid_check_sum(&edid[EDID_BLOCK_LENGTH]);
-               if (sum != 0) {
-                       dev_err(dp->dev, "EDID bad checksum!\n");
-                       return -EIO;
-               }
-
-               exynos_dp_read_byte_from_dpcd(dp, DP_TEST_REQUEST,
-                                       &test_vector);
-               if (test_vector & DP_TEST_LINK_EDID_READ) {
-                       exynos_dp_write_byte_to_dpcd(dp,
-                               DP_TEST_EDID_CHECKSUM,
-                               edid[EDID_BLOCK_LENGTH + EDID_CHECKSUM]);
-                       exynos_dp_write_byte_to_dpcd(dp,
-                               DP_TEST_RESPONSE,
-                               DP_TEST_EDID_CHECKSUM_WRITE);
-               }
-       } else {
-               dev_info(dp->dev, "EDID data does not include any extensions.\n");
-
-               /* Read EDID data */
-               retval = exynos_dp_read_bytes_from_i2c(dp,
-                               I2C_EDID_DEVICE_ADDR,
-                               EDID_HEADER_PATTERN,
-                               EDID_BLOCK_LENGTH,
-                               &edid[EDID_HEADER_PATTERN]);
-               if (retval != 0) {
-                       dev_err(dp->dev, "EDID Read failed!\n");
-                       return -EIO;
-               }
-               sum = exynos_dp_calc_edid_check_sum(edid);
-               if (sum != 0) {
-                       dev_err(dp->dev, "EDID bad checksum!\n");
-                       return -EIO;
-               }
-
-               exynos_dp_read_byte_from_dpcd(dp,
-                       DP_TEST_REQUEST,
-                       &test_vector);
-               if (test_vector & DP_TEST_LINK_EDID_READ) {
-                       exynos_dp_write_byte_to_dpcd(dp,
-                               DP_TEST_EDID_CHECKSUM,
-                               edid[EDID_CHECKSUM]);
-                       exynos_dp_write_byte_to_dpcd(dp,
-                               DP_TEST_RESPONSE,
-                               DP_TEST_EDID_CHECKSUM_WRITE);
-               }
-       }
-
-       dev_dbg(dp->dev, "EDID Read success!\n");
-       return 0;
-}
-
-static int exynos_dp_handle_edid(struct exynos_dp_device *dp)
-{
-       u8 buf[12];
-       int i;
-       int retval;
-
-       /* Read DPCD DP_DPCD_REV~RECEIVE_PORT1_CAP_1 */
-       retval = exynos_dp_read_bytes_from_dpcd(dp, DP_DPCD_REV,
-                               12, buf);
-       if (retval)
-               return retval;
-
-       /* Read EDID */
-       for (i = 0; i < 3; i++) {
-               retval = exynos_dp_read_edid(dp);
-               if (!retval)
-                       break;
-       }
-
-       return retval;
-}
-
-static void exynos_dp_enable_rx_to_enhanced_mode(struct exynos_dp_device *dp,
-                                               bool enable)
-{
-       u8 data;
-
-       exynos_dp_read_byte_from_dpcd(dp, DP_LANE_COUNT_SET, &data);
-
-       if (enable)
-               exynos_dp_write_byte_to_dpcd(dp, DP_LANE_COUNT_SET,
-                       DP_LANE_COUNT_ENHANCED_FRAME_EN |
-                       DPCD_LANE_COUNT_SET(data));
-       else
-               exynos_dp_write_byte_to_dpcd(dp, DP_LANE_COUNT_SET,
-                       DPCD_LANE_COUNT_SET(data));
-}
-
-static int exynos_dp_is_enhanced_mode_available(struct exynos_dp_device *dp)
-{
-       u8 data;
-       int retval;
-
-       exynos_dp_read_byte_from_dpcd(dp, DP_MAX_LANE_COUNT, &data);
-       retval = DPCD_ENHANCED_FRAME_CAP(data);
-
-       return retval;
-}
-
-static void exynos_dp_set_enhanced_mode(struct exynos_dp_device *dp)
-{
-       u8 data;
-
-       data = exynos_dp_is_enhanced_mode_available(dp);
-       exynos_dp_enable_rx_to_enhanced_mode(dp, data);
-       exynos_dp_enable_enhanced_mode(dp, data);
-}
-
-static void exynos_dp_training_pattern_dis(struct exynos_dp_device *dp)
-{
-       exynos_dp_set_training_pattern(dp, DP_NONE);
-
-       exynos_dp_write_byte_to_dpcd(dp,
-               DP_TRAINING_PATTERN_SET,
-               DP_TRAINING_PATTERN_DISABLE);
-}
-
-static void exynos_dp_set_lane_lane_pre_emphasis(struct exynos_dp_device *dp,
-                                       int pre_emphasis, int lane)
-{
-       switch (lane) {
-       case 0:
-               exynos_dp_set_lane0_pre_emphasis(dp, pre_emphasis);
-               break;
-       case 1:
-               exynos_dp_set_lane1_pre_emphasis(dp, pre_emphasis);
-               break;
-
-       case 2:
-               exynos_dp_set_lane2_pre_emphasis(dp, pre_emphasis);
-               break;
-
-       case 3:
-               exynos_dp_set_lane3_pre_emphasis(dp, pre_emphasis);
-               break;
-       }
-}
-
-static int exynos_dp_link_start(struct exynos_dp_device *dp)
-{
-       u8 buf[4];
-       int lane, lane_count, pll_tries, retval;
-
-       lane_count = dp->link_train.lane_count;
-
-       dp->link_train.lt_state = CLOCK_RECOVERY;
-       dp->link_train.eq_loop = 0;
-
-       for (lane = 0; lane < lane_count; lane++)
-               dp->link_train.cr_loop[lane] = 0;
-
-       /* Set link rate and count as you want to establish*/
-       exynos_dp_set_link_bandwidth(dp, dp->link_train.link_rate);
-       exynos_dp_set_lane_count(dp, dp->link_train.lane_count);
-
-       /* Setup RX configuration */
-       buf[0] = dp->link_train.link_rate;
-       buf[1] = dp->link_train.lane_count;
-       retval = exynos_dp_write_bytes_to_dpcd(dp, DP_LINK_BW_SET,
-                               2, buf);
-       if (retval)
-               return retval;
-
-       /* Set TX pre-emphasis to minimum */
-       for (lane = 0; lane < lane_count; lane++)
-               exynos_dp_set_lane_lane_pre_emphasis(dp,
-                       PRE_EMPHASIS_LEVEL_0, lane);
-
-       /* Wait for PLL lock */
-       pll_tries = 0;
-       while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
-               if (pll_tries == DP_TIMEOUT_LOOP_COUNT) {
-                       dev_err(dp->dev, "Wait for PLL lock timed out\n");
-                       return -ETIMEDOUT;
-               }
-
-               pll_tries++;
-               usleep_range(90, 120);
-       }
-
-       /* Set training pattern 1 */
-       exynos_dp_set_training_pattern(dp, TRAINING_PTN1);
-
-       /* Set RX training pattern */
-       retval = exynos_dp_write_byte_to_dpcd(dp,
-                       DP_TRAINING_PATTERN_SET,
-                       DP_LINK_SCRAMBLING_DISABLE | DP_TRAINING_PATTERN_1);
-       if (retval)
-               return retval;
-
-       for (lane = 0; lane < lane_count; lane++)
-               buf[lane] = DP_TRAIN_PRE_EMPH_LEVEL_0 |
-                           DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
-
-       retval = exynos_dp_write_bytes_to_dpcd(dp, DP_TRAINING_LANE0_SET,
-                       lane_count, buf);
-
-       return retval;
-}
-
-static unsigned char exynos_dp_get_lane_status(u8 link_status[2], int lane)
-{
-       int shift = (lane & 1) * 4;
-       u8 link_value = link_status[lane>>1];
-
-       return (link_value >> shift) & 0xf;
-}
-
-static int exynos_dp_clock_recovery_ok(u8 link_status[2], int lane_count)
-{
-       int lane;
-       u8 lane_status;
-
-       for (lane = 0; lane < lane_count; lane++) {
-               lane_status = exynos_dp_get_lane_status(link_status, lane);
-               if ((lane_status & DP_LANE_CR_DONE) == 0)
-                       return -EINVAL;
-       }
-       return 0;
-}
-
-static int exynos_dp_channel_eq_ok(u8 link_status[2], u8 link_align,
-                               int lane_count)
-{
-       int lane;
-       u8 lane_status;
-
-       if ((link_align & DP_INTERLANE_ALIGN_DONE) == 0)
-               return -EINVAL;
-
-       for (lane = 0; lane < lane_count; lane++) {
-               lane_status = exynos_dp_get_lane_status(link_status, lane);
-               lane_status &= DP_CHANNEL_EQ_BITS;
-               if (lane_status != DP_CHANNEL_EQ_BITS)
-                       return -EINVAL;
-       }
-
-       return 0;
-}
-
-static unsigned char exynos_dp_get_adjust_request_voltage(u8 adjust_request[2],
-                                                       int lane)
-{
-       int shift = (lane & 1) * 4;
-       u8 link_value = adjust_request[lane>>1];
-
-       return (link_value >> shift) & 0x3;
-}
-
-static unsigned char exynos_dp_get_adjust_request_pre_emphasis(
-                                       u8 adjust_request[2],
-                                       int lane)
-{
-       int shift = (lane & 1) * 4;
-       u8 link_value = adjust_request[lane>>1];
-
-       return ((link_value >> shift) & 0xc) >> 2;
-}
-
-static void exynos_dp_set_lane_link_training(struct exynos_dp_device *dp,
-                                       u8 training_lane_set, int lane)
-{
-       switch (lane) {
-       case 0:
-               exynos_dp_set_lane0_link_training(dp, training_lane_set);
-               break;
-       case 1:
-               exynos_dp_set_lane1_link_training(dp, training_lane_set);
-               break;
-
-       case 2:
-               exynos_dp_set_lane2_link_training(dp, training_lane_set);
-               break;
-
-       case 3:
-               exynos_dp_set_lane3_link_training(dp, training_lane_set);
-               break;
-       }
-}
-
-static unsigned int exynos_dp_get_lane_link_training(
-                               struct exynos_dp_device *dp,
-                               int lane)
-{
-       u32 reg;
-
-       switch (lane) {
-       case 0:
-               reg = exynos_dp_get_lane0_link_training(dp);
-               break;
-       case 1:
-               reg = exynos_dp_get_lane1_link_training(dp);
-               break;
-       case 2:
-               reg = exynos_dp_get_lane2_link_training(dp);
-               break;
-       case 3:
-               reg = exynos_dp_get_lane3_link_training(dp);
-               break;
-       default:
-               WARN_ON(1);
-               return 0;
-       }
-
-       return reg;
-}
-
-static void exynos_dp_reduce_link_rate(struct exynos_dp_device *dp)
-{
-       exynos_dp_training_pattern_dis(dp);
-       exynos_dp_set_enhanced_mode(dp);
-
-       dp->link_train.lt_state = FAILED;
-}
-
-static void exynos_dp_get_adjust_training_lane(struct exynos_dp_device *dp,
-                                       u8 adjust_request[2])
-{
-       int lane, lane_count;
-       u8 voltage_swing, pre_emphasis, training_lane;
-
-       lane_count = dp->link_train.lane_count;
-       for (lane = 0; lane < lane_count; lane++) {
-               voltage_swing = exynos_dp_get_adjust_request_voltage(
-                                               adjust_request, lane);
-               pre_emphasis = exynos_dp_get_adjust_request_pre_emphasis(
-                                               adjust_request, lane);
-               training_lane = DPCD_VOLTAGE_SWING_SET(voltage_swing) |
-                               DPCD_PRE_EMPHASIS_SET(pre_emphasis);
-
-               if (voltage_swing == VOLTAGE_LEVEL_3)
-                       training_lane |= DP_TRAIN_MAX_SWING_REACHED;
-               if (pre_emphasis == PRE_EMPHASIS_LEVEL_3)
-                       training_lane |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
-
-               dp->link_train.training_lane[lane] = training_lane;
-       }
-}
-
-static int exynos_dp_process_clock_recovery(struct exynos_dp_device *dp)
-{
-       int lane, lane_count, retval;
-       u8 voltage_swing, pre_emphasis, training_lane;
-       u8 link_status[2], adjust_request[2];
-
-       usleep_range(100, 101);
-
-       lane_count = dp->link_train.lane_count;
-
-       retval =  exynos_dp_read_bytes_from_dpcd(dp,
-                       DP_LANE0_1_STATUS, 2, link_status);
-       if (retval)
-               return retval;
-
-       retval =  exynos_dp_read_bytes_from_dpcd(dp,
-                       DP_ADJUST_REQUEST_LANE0_1, 2, adjust_request);
-       if (retval)
-               return retval;
-
-       if (exynos_dp_clock_recovery_ok(link_status, lane_count) == 0) {
-               /* set training pattern 2 for EQ */
-               exynos_dp_set_training_pattern(dp, TRAINING_PTN2);
-
-               retval = exynos_dp_write_byte_to_dpcd(dp,
-                               DP_TRAINING_PATTERN_SET,
-                               DP_LINK_SCRAMBLING_DISABLE |
-                               DP_TRAINING_PATTERN_2);
-               if (retval)
-                       return retval;
-
-               dev_info(dp->dev, "Link Training Clock Recovery success\n");
-               dp->link_train.lt_state = EQUALIZER_TRAINING;
-       } else {
-               for (lane = 0; lane < lane_count; lane++) {
-                       training_lane = exynos_dp_get_lane_link_training(
-                                                       dp, lane);
-                       voltage_swing = exynos_dp_get_adjust_request_voltage(
-                                                       adjust_request, lane);
-                       pre_emphasis = exynos_dp_get_adjust_request_pre_emphasis(
-                                                       adjust_request, lane);
-
-                       if (DPCD_VOLTAGE_SWING_GET(training_lane) ==
-                                       voltage_swing &&
-                           DPCD_PRE_EMPHASIS_GET(training_lane) ==
-                                       pre_emphasis)
-                               dp->link_train.cr_loop[lane]++;
-
-                       if (dp->link_train.cr_loop[lane] == MAX_CR_LOOP ||
-                           voltage_swing == VOLTAGE_LEVEL_3 ||
-                           pre_emphasis == PRE_EMPHASIS_LEVEL_3) {
-                               dev_err(dp->dev, "CR Max reached (%d,%d,%d)\n",
-                                       dp->link_train.cr_loop[lane],
-                                       voltage_swing, pre_emphasis);
-                               exynos_dp_reduce_link_rate(dp);
-                               return -EIO;
-                       }
-               }
-       }
-
-       exynos_dp_get_adjust_training_lane(dp, adjust_request);
-
-       for (lane = 0; lane < lane_count; lane++)
-               exynos_dp_set_lane_link_training(dp,
-                       dp->link_train.training_lane[lane], lane);
-
-       retval = exynos_dp_write_bytes_to_dpcd(dp,
-                       DP_TRAINING_LANE0_SET, lane_count,
-                       dp->link_train.training_lane);
-       if (retval)
-               return retval;
-
-       return retval;
-}
-
-static int exynos_dp_process_equalizer_training(struct exynos_dp_device *dp)
-{
-       int lane, lane_count, retval;
-       u32 reg;
-       u8 link_align, link_status[2], adjust_request[2];
-
-       usleep_range(400, 401);
-
-       lane_count = dp->link_train.lane_count;
-
-       retval = exynos_dp_read_bytes_from_dpcd(dp,
-                       DP_LANE0_1_STATUS, 2, link_status);
-       if (retval)
-               return retval;
-
-       if (exynos_dp_clock_recovery_ok(link_status, lane_count)) {
-               exynos_dp_reduce_link_rate(dp);
-               return -EIO;
-       }
-
-       retval = exynos_dp_read_bytes_from_dpcd(dp,
-                       DP_ADJUST_REQUEST_LANE0_1, 2, adjust_request);
-       if (retval)
-               return retval;
-
-       retval = exynos_dp_read_byte_from_dpcd(dp,
-                       DP_LANE_ALIGN_STATUS_UPDATED, &link_align);
-       if (retval)
-               return retval;
-
-       exynos_dp_get_adjust_training_lane(dp, adjust_request);
-
-       if (!exynos_dp_channel_eq_ok(link_status, link_align, lane_count)) {
-               /* traing pattern Set to Normal */
-               exynos_dp_training_pattern_dis(dp);
-
-               dev_info(dp->dev, "Link Training success!\n");
-
-               exynos_dp_get_link_bandwidth(dp, &reg);
-               dp->link_train.link_rate = reg;
-               dev_dbg(dp->dev, "final bandwidth = %.2x\n",
-                       dp->link_train.link_rate);
-
-               exynos_dp_get_lane_count(dp, &reg);
-               dp->link_train.lane_count = reg;
-               dev_dbg(dp->dev, "final lane count = %.2x\n",
-                       dp->link_train.lane_count);
-
-               /* set enhanced mode if available */
-               exynos_dp_set_enhanced_mode(dp);
-               dp->link_train.lt_state = FINISHED;
-
-               return 0;
-       }
-
-       /* not all locked */
-       dp->link_train.eq_loop++;
-
-       if (dp->link_train.eq_loop > MAX_EQ_LOOP) {
-               dev_err(dp->dev, "EQ Max loop\n");
-               exynos_dp_reduce_link_rate(dp);
-               return -EIO;
-       }
-
-       for (lane = 0; lane < lane_count; lane++)
-               exynos_dp_set_lane_link_training(dp,
-                       dp->link_train.training_lane[lane], lane);
-
-       retval = exynos_dp_write_bytes_to_dpcd(dp, DP_TRAINING_LANE0_SET,
-                       lane_count, dp->link_train.training_lane);
-
-       return retval;
-}
-
-static void exynos_dp_get_max_rx_bandwidth(struct exynos_dp_device *dp,
-                                       u8 *bandwidth)
-{
-       u8 data;
-
-       /*
-        * For DP rev.1.1, Maximum link rate of Main Link lanes
-        * 0x06 = 1.62 Gbps, 0x0a = 2.7 Gbps
-        */
-       exynos_dp_read_byte_from_dpcd(dp, DP_MAX_LINK_RATE, &data);
-       *bandwidth = data;
-}
-
-static void exynos_dp_get_max_rx_lane_count(struct exynos_dp_device *dp,
-                                       u8 *lane_count)
-{
-       u8 data;
-
-       /*
-        * For DP rev.1.1, Maximum number of Main Link lanes
-        * 0x01 = 1 lane, 0x02 = 2 lanes, 0x04 = 4 lanes
-        */
-       exynos_dp_read_byte_from_dpcd(dp, DP_MAX_LANE_COUNT, &data);
-       *lane_count = DPCD_MAX_LANE_COUNT(data);
-}
-
-static void exynos_dp_init_training(struct exynos_dp_device *dp,
-                       enum link_lane_count_type max_lane,
-                       enum link_rate_type max_rate)
-{
-       /*
-        * MACRO_RST must be applied after the PLL_LOCK to avoid
-        * the DP inter pair skew issue for at least 10 us
-        */
-       exynos_dp_reset_macro(dp);
-
-       /* Initialize by reading RX's DPCD */
-       exynos_dp_get_max_rx_bandwidth(dp, &dp->link_train.link_rate);
-       exynos_dp_get_max_rx_lane_count(dp, &dp->link_train.lane_count);
-
-       if ((dp->link_train.link_rate != LINK_RATE_1_62GBPS) &&
-          (dp->link_train.link_rate != LINK_RATE_2_70GBPS)) {
-               dev_err(dp->dev, "Rx Max Link Rate is abnormal :%x !\n",
-                       dp->link_train.link_rate);
-               dp->link_train.link_rate = LINK_RATE_1_62GBPS;
-       }
-
-       if (dp->link_train.lane_count == 0) {
-               dev_err(dp->dev, "Rx Max Lane count is abnormal :%x !\n",
-                       dp->link_train.lane_count);
-               dp->link_train.lane_count = (u8)LANE_COUNT1;
-       }
-
-       /* Setup TX lane count & rate */
-       if (dp->link_train.lane_count > max_lane)
-               dp->link_train.lane_count = max_lane;
-       if (dp->link_train.link_rate > max_rate)
-               dp->link_train.link_rate = max_rate;
-
-       /* All DP analog module power up */
-       exynos_dp_set_analog_power_down(dp, POWER_ALL, 0);
-}
-
-static int exynos_dp_sw_link_training(struct exynos_dp_device *dp)
-{
-       int retval = 0, training_finished = 0;
-
-       dp->link_train.lt_state = START;
-
-       /* Process here */
-       while (!retval && !training_finished) {
-               switch (dp->link_train.lt_state) {
-               case START:
-                       retval = exynos_dp_link_start(dp);
-                       if (retval)
-                               dev_err(dp->dev, "LT link start failed!\n");
-                       break;
-               case CLOCK_RECOVERY:
-                       retval = exynos_dp_process_clock_recovery(dp);
-                       if (retval)
-                               dev_err(dp->dev, "LT CR failed!\n");
-                       break;
-               case EQUALIZER_TRAINING:
-                       retval = exynos_dp_process_equalizer_training(dp);
-                       if (retval)
-                               dev_err(dp->dev, "LT EQ failed!\n");
-                       break;
-               case FINISHED:
-                       training_finished = 1;
-                       break;
-               case FAILED:
-                       return -EREMOTEIO;
-               }
-       }
-       if (retval)
-               dev_err(dp->dev, "eDP link training failed (%d)\n", retval);
-
-       return retval;
-}
-
-static int exynos_dp_set_link_train(struct exynos_dp_device *dp,
-                               u32 count,
-                               u32 bwtype)
-{
-       int i;
-       int retval;
-
-       for (i = 0; i < DP_TIMEOUT_LOOP_COUNT; i++) {
-               exynos_dp_init_training(dp, count, bwtype);
-               retval = exynos_dp_sw_link_training(dp);
-               if (retval == 0)
-                       break;
-
-               usleep_range(100, 110);
-       }
-
-       return retval;
-}
-
-static int exynos_dp_config_video(struct exynos_dp_device *dp)
-{
-       int retval = 0;
-       int timeout_loop = 0;
-       int done_count = 0;
-
-       exynos_dp_config_video_slave_mode(dp);
-
-       exynos_dp_set_video_color_format(dp);
-
-       if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
-               dev_err(dp->dev, "PLL is not locked yet.\n");
-               return -EINVAL;
-       }
-
-       for (;;) {
-               timeout_loop++;
-               if (exynos_dp_is_slave_video_stream_clock_on(dp) == 0)
-                       break;
-               if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
-                       dev_err(dp->dev, "Timeout of video streamclk ok\n");
-                       return -ETIMEDOUT;
-               }
-
-               usleep_range(1, 2);
-       }
-
-       /* Set to use the register calculated M/N video */
-       exynos_dp_set_video_cr_mn(dp, CALCULATED_M, 0, 0);
-
-       /* For video bist, Video timing must be generated by register */
-       exynos_dp_set_video_timing_mode(dp, VIDEO_TIMING_FROM_CAPTURE);
-
-       /* Disable video mute */
-       exynos_dp_enable_video_mute(dp, 0);
-
-       /* Configure video slave mode */
-       exynos_dp_enable_video_master(dp, 0);
-
-       timeout_loop = 0;
-
-       for (;;) {
-               timeout_loop++;
-               if (exynos_dp_is_video_stream_on(dp) == 0) {
-                       done_count++;
-                       if (done_count > 10)
-                               break;
-               } else if (done_count) {
-                       done_count = 0;
-               }
-               if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
-                       dev_err(dp->dev, "Timeout of video streamclk ok\n");
-                       return -ETIMEDOUT;
-               }
-
-               usleep_range(1000, 1001);
-       }
-
-       if (retval != 0)
-               dev_err(dp->dev, "Video stream is not detected!\n");
-
-       return retval;
-}
-
-static void exynos_dp_enable_scramble(struct exynos_dp_device *dp, bool enable)
-{
-       u8 data;
-
-       if (enable) {
-               exynos_dp_enable_scrambling(dp);
-
-               exynos_dp_read_byte_from_dpcd(dp,
-                       DP_TRAINING_PATTERN_SET,
-                       &data);
-               exynos_dp_write_byte_to_dpcd(dp,
-                       DP_TRAINING_PATTERN_SET,
-                       (u8)(data & ~DP_LINK_SCRAMBLING_DISABLE));
-       } else {
-               exynos_dp_disable_scrambling(dp);
-
-               exynos_dp_read_byte_from_dpcd(dp,
-                       DP_TRAINING_PATTERN_SET,
-                       &data);
-               exynos_dp_write_byte_to_dpcd(dp,
-                       DP_TRAINING_PATTERN_SET,
-                       (u8)(data | DP_LINK_SCRAMBLING_DISABLE));
-       }
-}
-
-static irqreturn_t exynos_dp_irq_handler(int irq, void *arg)
-{
-       struct exynos_dp_device *dp = arg;
-
-       enum dp_irq_type irq_type;
-
-       irq_type = exynos_dp_get_irq_type(dp);
-       switch (irq_type) {
-       case DP_IRQ_TYPE_HP_CABLE_IN:
-               dev_dbg(dp->dev, "Received irq - cable in\n");
-               schedule_work(&dp->hotplug_work);
-               exynos_dp_clear_hotplug_interrupts(dp);
-               break;
-       case DP_IRQ_TYPE_HP_CABLE_OUT:
-               dev_dbg(dp->dev, "Received irq - cable out\n");
-               exynos_dp_clear_hotplug_interrupts(dp);
-               break;
-       case DP_IRQ_TYPE_HP_CHANGE:
-               /*
-                * We get these change notifications once in a while, but there
-                * is nothing we can do with them. Just ignore it for now and
-                * only handle cable changes.
-                */
-               dev_dbg(dp->dev, "Received irq - hotplug change; ignoring.\n");
-               exynos_dp_clear_hotplug_interrupts(dp);
-               break;
-       default:
-               dev_err(dp->dev, "Received irq - unknown type!\n");
-               break;
-       }
-       return IRQ_HANDLED;
-}
-
-static void exynos_dp_hotplug(struct work_struct *work)
-{
-       struct exynos_dp_device *dp;
-
-       dp = container_of(work, struct exynos_dp_device, hotplug_work);
-
-       if (dp->drm_dev)
-               drm_helper_hpd_irq_event(dp->drm_dev);
-}
-
-static void exynos_dp_commit(struct drm_encoder *encoder)
-{
-       struct exynos_dp_device *dp = encoder_to_dp(encoder);
-       int ret;
-
-       /* Keep the panel disabled while we configure video */
-       if (dp->panel) {
-               if (drm_panel_disable(dp->panel))
-                       DRM_ERROR("failed to disable the panel\n");
-       }
-
-       ret = exynos_dp_detect_hpd(dp);
-       if (ret) {
-               /* Cable has been disconnected, we're done */
-               return;
-       }
-
-       ret = exynos_dp_handle_edid(dp);
-       if (ret) {
-               dev_err(dp->dev, "unable to handle edid\n");
-               return;
-       }
-
-       ret = exynos_dp_set_link_train(dp, dp->video_info->lane_count,
-                                       dp->video_info->link_rate);
-       if (ret) {
-               dev_err(dp->dev, "unable to do link train\n");
-               return;
-       }
-
-       exynos_dp_enable_scramble(dp, 1);
-       exynos_dp_enable_rx_to_enhanced_mode(dp, 1);
-       exynos_dp_enable_enhanced_mode(dp, 1);
-
-       exynos_dp_set_lane_count(dp, dp->video_info->lane_count);
-       exynos_dp_set_link_bandwidth(dp, dp->video_info->link_rate);
-
-       exynos_dp_init_video(dp);
-       ret = exynos_dp_config_video(dp);
-       if (ret)
-               dev_err(dp->dev, "unable to config video\n");
-
-       /* Safe to enable the panel now */
-       if (dp->panel) {
-               if (drm_panel_enable(dp->panel))
-                       DRM_ERROR("failed to enable the panel\n");
-       }
-
-       /* Enable video */
-       exynos_dp_start_video(dp);
-}
-
-static enum drm_connector_status exynos_dp_detect(
-                               struct drm_connector *connector, bool force)
-{
-       return connector_status_connected;
-}
-
-static void exynos_dp_connector_destroy(struct drm_connector *connector)
-{
-       drm_connector_unregister(connector);
-       drm_connector_cleanup(connector);
-}
-
-static const struct drm_connector_funcs exynos_dp_connector_funcs = {
-       .dpms = drm_atomic_helper_connector_dpms,
-       .fill_modes = drm_helper_probe_single_connector_modes,
-       .detect = exynos_dp_detect,
-       .destroy = exynos_dp_connector_destroy,
-       .reset = drm_atomic_helper_connector_reset,
-       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static int exynos_dp_get_modes(struct drm_connector *connector)
-{
-       struct exynos_dp_device *dp = ctx_from_connector(connector);
-       struct drm_display_mode *mode;
-
-       if (dp->panel)
-               return drm_panel_get_modes(dp->panel);
-
-       mode = drm_mode_create(connector->dev);
-       if (!mode) {
-               DRM_ERROR("failed to create a new display mode.\n");
-               return 0;
-       }
-
-       drm_display_mode_from_videomode(&dp->vm, mode);
-       connector->display_info.width_mm = mode->width_mm;
-       connector->display_info.height_mm = mode->height_mm;
-
-       mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
-       drm_mode_set_name(mode);
-       drm_mode_probed_add(connector, mode);
-
-       return 1;
-}
-
-static struct drm_encoder *exynos_dp_best_encoder(
-                       struct drm_connector *connector)
-{
-       struct exynos_dp_device *dp = ctx_from_connector(connector);
-
-       return &dp->encoder;
-}
-
-static const struct drm_connector_helper_funcs exynos_dp_connector_helper_funcs = {
-       .get_modes = exynos_dp_get_modes,
-       .best_encoder = exynos_dp_best_encoder,
-};
-
-/* returns the number of bridges attached */
-static int exynos_drm_attach_lcd_bridge(struct exynos_dp_device *dp,
-               struct drm_encoder *encoder)
-{
-       int ret;
-
-       encoder->bridge->next = dp->ptn_bridge;
-       dp->ptn_bridge->encoder = encoder;
-       ret = drm_bridge_attach(encoder->dev, dp->ptn_bridge);
-       if (ret) {
-               DRM_ERROR("Failed to attach bridge to drm\n");
-               return ret;
-       }
-
-       return 0;
-}
-
-static int exynos_dp_bridge_attach(struct drm_bridge *bridge)
-{
-       struct exynos_dp_device *dp = bridge->driver_private;
-       struct drm_encoder *encoder = &dp->encoder;
-       struct drm_connector *connector = &dp->connector;
-       int ret;
-
-       /* Pre-empt DP connector creation if there's a bridge */
-       if (dp->ptn_bridge) {
-               ret = exynos_drm_attach_lcd_bridge(dp, encoder);
-               if (!ret)
-                       return 0;
-       }
-
-       connector->polled = DRM_CONNECTOR_POLL_HPD;
-
-       ret = drm_connector_init(dp->drm_dev, connector,
-                       &exynos_dp_connector_funcs, DRM_MODE_CONNECTOR_eDP);
-       if (ret) {
-               DRM_ERROR("Failed to initialize connector with drm\n");
-               return ret;
-       }
-
-       drm_connector_helper_add(connector, &exynos_dp_connector_helper_funcs);
-       drm_connector_register(connector);
-       drm_mode_connector_attach_encoder(connector, encoder);
-
-       if (dp->panel)
-               ret = drm_panel_attach(dp->panel, &dp->connector);
-
-       return ret;
-}
-
-static void exynos_dp_bridge_enable(struct drm_bridge *bridge)
-{
-       struct exynos_dp_device *dp = bridge->driver_private;
-       struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
-
-       if (dp->dpms_mode == DRM_MODE_DPMS_ON)
-               return;
-
-       pm_runtime_get_sync(dp->dev);
-
-       if (dp->panel) {
-               if (drm_panel_prepare(dp->panel)) {
-                       DRM_ERROR("failed to setup the panel\n");
-                       return;
-               }
-       }
-
-       if (crtc->ops->clock_enable)
-               crtc->ops->clock_enable(dp_to_crtc(dp), true);
-
-       phy_power_on(dp->phy);
-       exynos_dp_init_dp(dp);
-       enable_irq(dp->irq);
-       exynos_dp_commit(&dp->encoder);
-
-       dp->dpms_mode = DRM_MODE_DPMS_ON;
-}
-
-static void exynos_dp_bridge_disable(struct drm_bridge *bridge)
-{
-       struct exynos_dp_device *dp = bridge->driver_private;
-       struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
-
-       if (dp->dpms_mode != DRM_MODE_DPMS_ON)
-               return;
-
-       if (dp->panel) {
-               if (drm_panel_disable(dp->panel)) {
-                       DRM_ERROR("failed to disable the panel\n");
-                       return;
-               }
-       }
-
-       disable_irq(dp->irq);
-       flush_work(&dp->hotplug_work);
-       phy_power_off(dp->phy);
-
-       if (crtc->ops->clock_enable)
-               crtc->ops->clock_enable(dp_to_crtc(dp), false);
-
-       if (dp->panel) {
-               if (drm_panel_unprepare(dp->panel))
-                       DRM_ERROR("failed to turnoff the panel\n");
-       }
-
-       pm_runtime_put_sync(dp->dev);
-
-       dp->dpms_mode = DRM_MODE_DPMS_OFF;
-}
-
-static void exynos_dp_bridge_nop(struct drm_bridge *bridge)
-{
-       /* do nothing */
-}
-
-static const struct drm_bridge_funcs exynos_dp_bridge_funcs = {
-       .enable = exynos_dp_bridge_enable,
-       .disable = exynos_dp_bridge_disable,
-       .pre_enable = exynos_dp_bridge_nop,
-       .post_disable = exynos_dp_bridge_nop,
-       .attach = exynos_dp_bridge_attach,
-};
-
-static int exynos_dp_create_connector(struct drm_encoder *encoder)
-{
-       struct exynos_dp_device *dp = encoder_to_dp(encoder);
-       struct drm_device *drm_dev = dp->drm_dev;
-       struct drm_bridge *bridge;
-       int ret;
-
-       bridge = devm_kzalloc(drm_dev->dev, sizeof(*bridge), GFP_KERNEL);
-       if (!bridge) {
-               DRM_ERROR("failed to allocate for drm bridge\n");
-               return -ENOMEM;
-       }
-
-       dp->bridge = bridge;
-
-       encoder->bridge = bridge;
-       bridge->driver_private = dp;
-       bridge->encoder = encoder;
-       bridge->funcs = &exynos_dp_bridge_funcs;
-
-       ret = drm_bridge_attach(drm_dev, bridge);
-       if (ret) {
-               DRM_ERROR("failed to attach drm bridge\n");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static void exynos_dp_mode_set(struct drm_encoder *encoder,
-                              struct drm_display_mode *mode,
-                              struct drm_display_mode *adjusted_mode)
-{
-}
-
-static void exynos_dp_enable(struct drm_encoder *encoder)
-{
-}
-
-static void exynos_dp_disable(struct drm_encoder *encoder)
-{
-}
-
-static const struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs = {
-       .mode_set = exynos_dp_mode_set,
-       .enable = exynos_dp_enable,
-       .disable = exynos_dp_disable,
-};
-
-static const struct drm_encoder_funcs exynos_dp_encoder_funcs = {
-       .destroy = drm_encoder_cleanup,
-};
-
-static struct video_info *exynos_dp_dt_parse_pdata(struct device *dev)
-{
-       struct device_node *dp_node = dev->of_node;
-       struct video_info *dp_video_config;
-
-       dp_video_config = devm_kzalloc(dev,
-                               sizeof(*dp_video_config), GFP_KERNEL);
-       if (!dp_video_config)
-               return ERR_PTR(-ENOMEM);
-
-       dp_video_config->h_sync_polarity =
-               of_property_read_bool(dp_node, "hsync-active-high");
-
-       dp_video_config->v_sync_polarity =
-               of_property_read_bool(dp_node, "vsync-active-high");
-
-       dp_video_config->interlaced =
-               of_property_read_bool(dp_node, "interlaced");
-
-       if (of_property_read_u32(dp_node, "samsung,color-space",
-                               &dp_video_config->color_space)) {
-               dev_err(dev, "failed to get color-space\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (of_property_read_u32(dp_node, "samsung,dynamic-range",
-                               &dp_video_config->dynamic_range)) {
-               dev_err(dev, "failed to get dynamic-range\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (of_property_read_u32(dp_node, "samsung,ycbcr-coeff",
-                               &dp_video_config->ycbcr_coeff)) {
-               dev_err(dev, "failed to get ycbcr-coeff\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (of_property_read_u32(dp_node, "samsung,color-depth",
-                               &dp_video_config->color_depth)) {
-               dev_err(dev, "failed to get color-depth\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (of_property_read_u32(dp_node, "samsung,link-rate",
-                               &dp_video_config->link_rate)) {
-               dev_err(dev, "failed to get link-rate\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (of_property_read_u32(dp_node, "samsung,lane-count",
-                               &dp_video_config->lane_count)) {
-               dev_err(dev, "failed to get lane-count\n");
-               return ERR_PTR(-EINVAL);
-       }
-
-       return dp_video_config;
-}
-
-static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
-{
-       int ret;
-
-       ret = of_get_videomode(dp->dev->of_node, &dp->vm, OF_USE_NATIVE_MODE);
-       if (ret) {
-               DRM_ERROR("failed: of_get_videomode() : %d\n", ret);
-               return ret;
-       }
-       return 0;
-}
-
-static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
-{
-       struct exynos_dp_device *dp = dev_get_drvdata(dev);
-       struct platform_device *pdev = to_platform_device(dev);
-       struct drm_device *drm_dev = data;
-       struct drm_encoder *encoder = &dp->encoder;
-       struct resource *res;
-       unsigned int irq_flags;
-       int pipe, ret = 0;
-
-       dp->dev = &pdev->dev;
-       dp->dpms_mode = DRM_MODE_DPMS_OFF;
-
-       dp->video_info = exynos_dp_dt_parse_pdata(&pdev->dev);
-       if (IS_ERR(dp->video_info))
-               return PTR_ERR(dp->video_info);
-
-       dp->phy = devm_phy_get(dp->dev, "dp");
-       if (IS_ERR(dp->phy)) {
-               dev_err(dp->dev, "no DP phy configured\n");
-               ret = PTR_ERR(dp->phy);
-               if (ret) {
-                       /*
-                        * phy itself is not enabled, so we can move forward
-                        * assigning NULL to phy pointer.
-                        */
-                       if (ret == -ENOSYS || ret == -ENODEV)
-                               dp->phy = NULL;
-                       else
-                               return ret;
-               }
-       }
-
-       if (!dp->panel && !dp->ptn_bridge) {
-               ret = exynos_dp_dt_parse_panel(dp);
-               if (ret)
-                       return ret;
-       }
-
-       dp->clock = devm_clk_get(&pdev->dev, "dp");
-       if (IS_ERR(dp->clock)) {
-               dev_err(&pdev->dev, "failed to get clock\n");
-               return PTR_ERR(dp->clock);
-       }
-
-       clk_prepare_enable(dp->clock);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-       dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(dp->reg_base))
-               return PTR_ERR(dp->reg_base);
-
-       dp->hpd_gpio = of_get_named_gpio(dev->of_node, "samsung,hpd-gpio", 0);
-
-       if (gpio_is_valid(dp->hpd_gpio)) {
-               /*
-                * Set up the hotplug GPIO from the device tree as an interrupt.
-                * Simply specifying a different interrupt in the device tree
-                * doesn't work since we handle hotplug rather differently when
-                * using a GPIO.  We also need the actual GPIO specifier so
-                * that we can get the current state of the GPIO.
-                */
-               ret = devm_gpio_request_one(&pdev->dev, dp->hpd_gpio, GPIOF_IN,
-                                           "hpd_gpio");
-               if (ret) {
-                       dev_err(&pdev->dev, "failed to get hpd gpio\n");
-                       return ret;
-               }
-               dp->irq = gpio_to_irq(dp->hpd_gpio);
-               irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
-       } else {
-               dp->hpd_gpio = -ENODEV;
-               dp->irq = platform_get_irq(pdev, 0);
-               irq_flags = 0;
-       }
-
-       if (dp->irq == -ENXIO) {
-               dev_err(&pdev->dev, "failed to get irq\n");
-               return -ENODEV;
-       }
-
-       INIT_WORK(&dp->hotplug_work, exynos_dp_hotplug);
-
-       ret = devm_request_irq(&pdev->dev, dp->irq, exynos_dp_irq_handler,
-                       irq_flags, "exynos-dp", dp);
-       if (ret) {
-               dev_err(&pdev->dev, "failed to request irq\n");
-               return ret;
-       }
-       disable_irq(dp->irq);
-
-       dp->drm_dev = drm_dev;
-
-       pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
-                                                 EXYNOS_DISPLAY_TYPE_LCD);
-       if (pipe < 0)
-               return pipe;
-
-       encoder->possible_crtcs = 1 << pipe;
-
-       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
-
-       drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
-                        DRM_MODE_ENCODER_TMDS, NULL);
-
-       drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
-
-       ret = exynos_dp_create_connector(encoder);
-       if (ret) {
-               DRM_ERROR("failed to create connector ret = %d\n", ret);
-               drm_encoder_cleanup(encoder);
-               return ret;
-       }
-
-       return 0;
-}
-
-static void exynos_dp_unbind(struct device *dev, struct device *master,
-                               void *data)
-{
-       struct exynos_dp_device *dp = dev_get_drvdata(dev);
-
-       exynos_dp_disable(&dp->encoder);
-}
-
-static const struct component_ops exynos_dp_ops = {
-       .bind   = exynos_dp_bind,
-       .unbind = exynos_dp_unbind,
-};
-
-static int exynos_dp_probe(struct platform_device *pdev)
-{
-       struct device *dev = &pdev->dev;
-       struct device_node *np = NULL, *endpoint = NULL;
-       struct exynos_dp_device *dp;
-       int ret;
-
-       dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device),
-                               GFP_KERNEL);
-       if (!dp)
-               return -ENOMEM;
-
-       platform_set_drvdata(pdev, dp);
-
-       /* This is for the backward compatibility. */
-       np = of_parse_phandle(dev->of_node, "panel", 0);
-       if (np) {
-               dp->panel = of_drm_find_panel(np);
-               of_node_put(np);
-               if (!dp->panel)
-                       return -EPROBE_DEFER;
-               goto out;
-       }
-
-       endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
-       if (endpoint) {
-               np = of_graph_get_remote_port_parent(endpoint);
-               if (np) {
-                       /* The remote port can be either a panel or a bridge */
-                       dp->panel = of_drm_find_panel(np);
-                       if (!dp->panel) {
-                               dp->ptn_bridge = of_drm_find_bridge(np);
-                               if (!dp->ptn_bridge) {
-                                       of_node_put(np);
-                                       return -EPROBE_DEFER;
-                               }
-                       }
-                       of_node_put(np);
-               } else {
-                       DRM_ERROR("no remote endpoint device node found.\n");
-                       return -EINVAL;
-               }
-       } else {
-               DRM_ERROR("no port endpoint subnode found.\n");
-               return -EINVAL;
-       }
-
-out:
-       pm_runtime_enable(dev);
-
-       ret = component_add(&pdev->dev, &exynos_dp_ops);
-       if (ret)
-               goto err_disable_pm_runtime;
-
-       return ret;
-
-err_disable_pm_runtime:
-       pm_runtime_disable(dev);
-
-       return ret;
-}
-
-static int exynos_dp_remove(struct platform_device *pdev)
-{
-       pm_runtime_disable(&pdev->dev);
-       component_del(&pdev->dev, &exynos_dp_ops);
-
-       return 0;
-}
-
-#ifdef CONFIG_PM
-static int exynos_dp_suspend(struct device *dev)
-{
-       struct exynos_dp_device *dp = dev_get_drvdata(dev);
-
-       clk_disable_unprepare(dp->clock);
-
-       return 0;
-}
-
-static int exynos_dp_resume(struct device *dev)
-{
-       struct exynos_dp_device *dp = dev_get_drvdata(dev);
-       int ret;
-
-       ret = clk_prepare_enable(dp->clock);
-       if (ret < 0) {
-               DRM_ERROR("Failed to prepare_enable the clock clk [%d]\n", ret);
-               return ret;
-       }
-
-       return 0;
-}
-#endif
-
-static const struct dev_pm_ops exynos_dp_pm_ops = {
-       SET_RUNTIME_PM_OPS(exynos_dp_suspend, exynos_dp_resume, NULL)
-};
-
-static const struct of_device_id exynos_dp_match[] = {
-       { .compatible = "samsung,exynos5-dp" },
-       {},
-};
-MODULE_DEVICE_TABLE(of, exynos_dp_match);
-
-struct platform_driver dp_driver = {
-       .probe          = exynos_dp_probe,
-       .remove         = exynos_dp_remove,
-       .driver         = {
-               .name   = "exynos-dp",
-               .owner  = THIS_MODULE,
-               .pm     = &exynos_dp_pm_ops,
-               .of_match_table = exynos_dp_match,
-       },
-};
-
-MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>");
-MODULE_DESCRIPTION("Samsung SoC DP Driver");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/exynos/exynos_dp_core.h b/drivers/gpu/drm/exynos/exynos_dp_core.h
deleted file mode 100644 (file)
index b5c2d8f..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Header file for Samsung DP (Display Port) interface driver.
- *
- * Copyright (C) 2012 Samsung Electronics Co., Ltd.
- * Author: Jingoo Han <jg1.han@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#ifndef _EXYNOS_DP_CORE_H
-#define _EXYNOS_DP_CORE_H
-
-#include <drm/drm_crtc.h>
-#include <drm/drm_dp_helper.h>
-#include <drm/exynos_drm.h>
-#include <video/videomode.h>
-
-#include "exynos_drm_drv.h"
-
-#define DP_TIMEOUT_LOOP_COUNT 100
-#define MAX_CR_LOOP 5
-#define MAX_EQ_LOOP 5
-
-enum link_rate_type {
-       LINK_RATE_1_62GBPS = 0x06,
-       LINK_RATE_2_70GBPS = 0x0a
-};
-
-enum link_lane_count_type {
-       LANE_COUNT1 = 1,
-       LANE_COUNT2 = 2,
-       LANE_COUNT4 = 4
-};
-
-enum link_training_state {
-       START,
-       CLOCK_RECOVERY,
-       EQUALIZER_TRAINING,
-       FINISHED,
-       FAILED
-};
-
-enum voltage_swing_level {
-       VOLTAGE_LEVEL_0,
-       VOLTAGE_LEVEL_1,
-       VOLTAGE_LEVEL_2,
-       VOLTAGE_LEVEL_3,
-};
-
-enum pre_emphasis_level {
-       PRE_EMPHASIS_LEVEL_0,
-       PRE_EMPHASIS_LEVEL_1,
-       PRE_EMPHASIS_LEVEL_2,
-       PRE_EMPHASIS_LEVEL_3,
-};
-
-enum pattern_set {
-       PRBS7,
-       D10_2,
-       TRAINING_PTN1,
-       TRAINING_PTN2,
-       DP_NONE
-};
-
-enum color_space {
-       COLOR_RGB,
-       COLOR_YCBCR422,
-       COLOR_YCBCR444
-};
-
-enum color_depth {
-       COLOR_6,
-       COLOR_8,
-       COLOR_10,
-       COLOR_12
-};
-
-enum color_coefficient {
-       COLOR_YCBCR601,
-       COLOR_YCBCR709
-};
-
-enum dynamic_range {
-       VESA,
-       CEA
-};
-
-enum pll_status {
-       PLL_UNLOCKED,
-       PLL_LOCKED
-};
-
-enum clock_recovery_m_value_type {
-       CALCULATED_M,
-       REGISTER_M
-};
-
-enum video_timing_recognition_type {
-       VIDEO_TIMING_FROM_CAPTURE,
-       VIDEO_TIMING_FROM_REGISTER
-};
-
-enum analog_power_block {
-       AUX_BLOCK,
-       CH0_BLOCK,
-       CH1_BLOCK,
-       CH2_BLOCK,
-       CH3_BLOCK,
-       ANALOG_TOTAL,
-       POWER_ALL
-};
-
-enum dp_irq_type {
-       DP_IRQ_TYPE_HP_CABLE_IN,
-       DP_IRQ_TYPE_HP_CABLE_OUT,
-       DP_IRQ_TYPE_HP_CHANGE,
-       DP_IRQ_TYPE_UNKNOWN,
-};
-
-struct video_info {
-       char *name;
-
-       bool h_sync_polarity;
-       bool v_sync_polarity;
-       bool interlaced;
-
-       enum color_space color_space;
-       enum dynamic_range dynamic_range;
-       enum color_coefficient ycbcr_coeff;
-       enum color_depth color_depth;
-
-       enum link_rate_type link_rate;
-       enum link_lane_count_type lane_count;
-};
-
-struct link_train {
-       int eq_loop;
-       int cr_loop[4];
-
-       u8 link_rate;
-       u8 lane_count;
-       u8 training_lane[4];
-
-       enum link_training_state lt_state;
-};
-
-struct exynos_dp_device {
-       struct drm_encoder      encoder;
-       struct device           *dev;
-       struct drm_device       *drm_dev;
-       struct drm_connector    connector;
-       struct drm_panel        *panel;
-       struct drm_bridge       *bridge;
-       struct drm_bridge       *ptn_bridge;
-       struct clk              *clock;
-       unsigned int            irq;
-       void __iomem            *reg_base;
-
-       struct video_info       *video_info;
-       struct link_train       link_train;
-       struct work_struct      hotplug_work;
-       struct phy              *phy;
-       int                     dpms_mode;
-       int                     hpd_gpio;
-       struct videomode        vm;
-};
-
-/* exynos_dp_reg.c */
-void exynos_dp_enable_video_mute(struct exynos_dp_device *dp, bool enable);
-void exynos_dp_stop_video(struct exynos_dp_device *dp);
-void exynos_dp_lane_swap(struct exynos_dp_device *dp, bool enable);
-void exynos_dp_init_analog_param(struct exynos_dp_device *dp);
-void exynos_dp_init_interrupt(struct exynos_dp_device *dp);
-void exynos_dp_reset(struct exynos_dp_device *dp);
-void exynos_dp_swreset(struct exynos_dp_device *dp);
-void exynos_dp_config_interrupt(struct exynos_dp_device *dp);
-enum pll_status exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp);
-void exynos_dp_set_pll_power_down(struct exynos_dp_device *dp, bool enable);
-void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp,
-                               enum analog_power_block block,
-                               bool enable);
-void exynos_dp_init_analog_func(struct exynos_dp_device *dp);
-void exynos_dp_init_hpd(struct exynos_dp_device *dp);
-enum dp_irq_type exynos_dp_get_irq_type(struct exynos_dp_device *dp);
-void exynos_dp_clear_hotplug_interrupts(struct exynos_dp_device *dp);
-void exynos_dp_reset_aux(struct exynos_dp_device *dp);
-void exynos_dp_init_aux(struct exynos_dp_device *dp);
-int exynos_dp_get_plug_in_status(struct exynos_dp_device *dp);
-void exynos_dp_enable_sw_function(struct exynos_dp_device *dp);
-int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp);
-int exynos_dp_write_byte_to_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned char data);
-int exynos_dp_read_byte_from_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned char *data);
-int exynos_dp_write_bytes_to_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char data[]);
-int exynos_dp_read_bytes_from_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char data[]);
-int exynos_dp_select_i2c_device(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr);
-int exynos_dp_read_byte_from_i2c(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr,
-                               unsigned int *data);
-int exynos_dp_read_bytes_from_i2c(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char edid[]);
-void exynos_dp_set_link_bandwidth(struct exynos_dp_device *dp, u32 bwtype);
-void exynos_dp_get_link_bandwidth(struct exynos_dp_device *dp, u32 *bwtype);
-void exynos_dp_set_lane_count(struct exynos_dp_device *dp, u32 count);
-void exynos_dp_get_lane_count(struct exynos_dp_device *dp, u32 *count);
-void exynos_dp_enable_enhanced_mode(struct exynos_dp_device *dp, bool enable);
-void exynos_dp_set_training_pattern(struct exynos_dp_device *dp,
-                                enum pattern_set pattern);
-void exynos_dp_set_lane0_pre_emphasis(struct exynos_dp_device *dp, u32 level);
-void exynos_dp_set_lane1_pre_emphasis(struct exynos_dp_device *dp, u32 level);
-void exynos_dp_set_lane2_pre_emphasis(struct exynos_dp_device *dp, u32 level);
-void exynos_dp_set_lane3_pre_emphasis(struct exynos_dp_device *dp, u32 level);
-void exynos_dp_set_lane0_link_training(struct exynos_dp_device *dp,
-                               u32 training_lane);
-void exynos_dp_set_lane1_link_training(struct exynos_dp_device *dp,
-                               u32 training_lane);
-void exynos_dp_set_lane2_link_training(struct exynos_dp_device *dp,
-                               u32 training_lane);
-void exynos_dp_set_lane3_link_training(struct exynos_dp_device *dp,
-                               u32 training_lane);
-u32 exynos_dp_get_lane0_link_training(struct exynos_dp_device *dp);
-u32 exynos_dp_get_lane1_link_training(struct exynos_dp_device *dp);
-u32 exynos_dp_get_lane2_link_training(struct exynos_dp_device *dp);
-u32 exynos_dp_get_lane3_link_training(struct exynos_dp_device *dp);
-void exynos_dp_reset_macro(struct exynos_dp_device *dp);
-void exynos_dp_init_video(struct exynos_dp_device *dp);
-
-void exynos_dp_set_video_color_format(struct exynos_dp_device *dp);
-int exynos_dp_is_slave_video_stream_clock_on(struct exynos_dp_device *dp);
-void exynos_dp_set_video_cr_mn(struct exynos_dp_device *dp,
-                       enum clock_recovery_m_value_type type,
-                       u32 m_value,
-                       u32 n_value);
-void exynos_dp_set_video_timing_mode(struct exynos_dp_device *dp, u32 type);
-void exynos_dp_enable_video_master(struct exynos_dp_device *dp, bool enable);
-void exynos_dp_start_video(struct exynos_dp_device *dp);
-int exynos_dp_is_video_stream_on(struct exynos_dp_device *dp);
-void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp);
-void exynos_dp_enable_scrambling(struct exynos_dp_device *dp);
-void exynos_dp_disable_scrambling(struct exynos_dp_device *dp);
-
-/* I2C EDID Chip ID, Slave Address */
-#define I2C_EDID_DEVICE_ADDR                   0x50
-#define I2C_E_EDID_DEVICE_ADDR                 0x30
-
-#define EDID_BLOCK_LENGTH                      0x80
-#define EDID_HEADER_PATTERN                    0x00
-#define EDID_EXTENSION_FLAG                    0x7e
-#define EDID_CHECKSUM                          0x7f
-
-/* DP_MAX_LANE_COUNT */
-#define DPCD_ENHANCED_FRAME_CAP(x)             (((x) >> 7) & 0x1)
-#define DPCD_MAX_LANE_COUNT(x)                 ((x) & 0x1f)
-
-/* DP_LANE_COUNT_SET */
-#define DPCD_LANE_COUNT_SET(x)                 ((x) & 0x1f)
-
-/* DP_TRAINING_LANE0_SET */
-#define DPCD_PRE_EMPHASIS_SET(x)               (((x) & 0x3) << 3)
-#define DPCD_PRE_EMPHASIS_GET(x)               (((x) >> 3) & 0x3)
-#define DPCD_VOLTAGE_SWING_SET(x)              (((x) & 0x3) << 0)
-#define DPCD_VOLTAGE_SWING_GET(x)              (((x) >> 0) & 0x3)
-
-#endif /* _EXYNOS_DP_CORE_H */
diff --git a/drivers/gpu/drm/exynos/exynos_dp_reg.c b/drivers/gpu/drm/exynos/exynos_dp_reg.c
deleted file mode 100644 (file)
index c1f87a2..0000000
+++ /dev/null
@@ -1,1263 +0,0 @@
-/*
- * Samsung DP (Display port) register interface driver.
- *
- * Copyright (C) 2012 Samsung Electronics Co., Ltd.
- * Author: Jingoo Han <jg1.han@samsung.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- */
-
-#include <linux/device.h>
-#include <linux/io.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-
-#include "exynos_dp_core.h"
-#include "exynos_dp_reg.h"
-
-#define COMMON_INT_MASK_1      0
-#define COMMON_INT_MASK_2      0
-#define COMMON_INT_MASK_3      0
-#define COMMON_INT_MASK_4      (HOTPLUG_CHG | HPD_LOST | PLUG)
-#define INT_STA_MASK           INT_HPD
-
-void exynos_dp_enable_video_mute(struct exynos_dp_device *dp, bool enable)
-{
-       u32 reg;
-
-       if (enable) {
-               reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-               reg |= HDCP_VIDEO_MUTE;
-               writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-               reg &= ~HDCP_VIDEO_MUTE;
-               writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-       }
-}
-
-void exynos_dp_stop_video(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-       reg &= ~VIDEO_EN;
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-}
-
-void exynos_dp_lane_swap(struct exynos_dp_device *dp, bool enable)
-{
-       u32 reg;
-
-       if (enable)
-               reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
-                       LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
-       else
-               reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
-                       LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
-
-       writel(reg, dp->reg_base + EXYNOS_DP_LANE_MAP);
-}
-
-void exynos_dp_init_analog_param(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = TX_TERMINAL_CTRL_50_OHM;
-       writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_1);
-
-       reg = SEL_24M | TX_DVDD_BIT_1_0625V;
-       writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_2);
-
-       reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
-       writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_3);
-
-       reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
-               TX_CUR1_2X | TX_CUR_16_MA;
-       writel(reg, dp->reg_base + EXYNOS_DP_PLL_FILTER_CTL_1);
-
-       reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
-               CH1_AMP_400_MV | CH0_AMP_400_MV;
-       writel(reg, dp->reg_base + EXYNOS_DP_TX_AMP_TUNING_CTL);
-}
-
-void exynos_dp_init_interrupt(struct exynos_dp_device *dp)
-{
-       /* Set interrupt pin assertion polarity as high */
-       writel(INT_POL1 | INT_POL0, dp->reg_base + EXYNOS_DP_INT_CTL);
-
-       /* Clear pending regisers */
-       writel(0xff, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
-       writel(0x4f, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_2);
-       writel(0xe0, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_3);
-       writel(0xe7, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
-       writel(0x63, dp->reg_base + EXYNOS_DP_INT_STA);
-
-       /* 0:mask,1: unmask */
-       writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
-       writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
-       writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
-       writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
-       writel(0x00, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
-}
-
-void exynos_dp_reset(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       exynos_dp_stop_video(dp);
-       exynos_dp_enable_video_mute(dp, 0);
-
-       reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
-               AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
-               HDCP_FUNC_EN_N | SW_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
-
-       reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
-               SERDES_FIFO_FUNC_EN_N |
-               LS_CLK_DOMAIN_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-
-       usleep_range(20, 30);
-
-       exynos_dp_lane_swap(dp, 0);
-
-       writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
-       writel(0x40, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
-       writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-       writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-
-       writel(0x0, dp->reg_base + EXYNOS_DP_PKT_SEND_CTL);
-       writel(0x0, dp->reg_base + EXYNOS_DP_HDCP_CTL);
-
-       writel(0x5e, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_L);
-       writel(0x1a, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_H);
-
-       writel(0x10, dp->reg_base + EXYNOS_DP_LINK_DEBUG_CTL);
-
-       writel(0x0, dp->reg_base + EXYNOS_DP_PHY_TEST);
-
-       writel(0x0, dp->reg_base + EXYNOS_DP_VIDEO_FIFO_THRD);
-       writel(0x20, dp->reg_base + EXYNOS_DP_AUDIO_MARGIN);
-
-       writel(0x4, dp->reg_base + EXYNOS_DP_M_VID_GEN_FILTER_TH);
-       writel(0x2, dp->reg_base + EXYNOS_DP_M_AUD_GEN_FILTER_TH);
-
-       writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-}
-
-void exynos_dp_swreset(struct exynos_dp_device *dp)
-{
-       writel(RESET_DP_TX, dp->reg_base + EXYNOS_DP_TX_SW_RESET);
-}
-
-void exynos_dp_config_interrupt(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       /* 0: mask, 1: unmask */
-       reg = COMMON_INT_MASK_1;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
-
-       reg = COMMON_INT_MASK_2;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
-
-       reg = COMMON_INT_MASK_3;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
-
-       reg = COMMON_INT_MASK_4;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
-
-       reg = INT_STA_MASK;
-       writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
-}
-
-enum pll_status exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
-       if (reg & PLL_LOCK)
-               return PLL_LOCKED;
-       else
-               return PLL_UNLOCKED;
-}
-
-void exynos_dp_set_pll_power_down(struct exynos_dp_device *dp, bool enable)
-{
-       u32 reg;
-
-       if (enable) {
-               reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
-               reg |= DP_PLL_PD;
-               writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
-               reg &= ~DP_PLL_PD;
-               writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
-       }
-}
-
-void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp,
-                               enum analog_power_block block,
-                               bool enable)
-{
-       u32 reg;
-
-       switch (block) {
-       case AUX_BLOCK:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= AUX_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~AUX_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case CH0_BLOCK:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= CH0_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~CH0_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case CH1_BLOCK:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= CH1_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~CH1_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case CH2_BLOCK:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= CH2_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~CH2_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case CH3_BLOCK:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= CH3_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~CH3_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case ANALOG_TOTAL:
-               if (enable) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg |= DP_PHY_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
-                       reg &= ~DP_PHY_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       case POWER_ALL:
-               if (enable) {
-                       reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
-                               CH1_PD | CH0_PD;
-                       writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
-               } else {
-                       writel(0x00, dp->reg_base + EXYNOS_DP_PHY_PD);
-               }
-               break;
-       default:
-               break;
-       }
-}
-
-void exynos_dp_init_analog_func(struct exynos_dp_device *dp)
-{
-       u32 reg;
-       int timeout_loop = 0;
-
-       exynos_dp_set_analog_power_down(dp, POWER_ALL, 0);
-
-       reg = PLL_LOCK_CHG;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
-       reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
-       writel(reg, dp->reg_base + EXYNOS_DP_DEBUG_CTL);
-
-       /* Power up PLL */
-       if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
-               exynos_dp_set_pll_power_down(dp, 0);
-
-               while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
-                       timeout_loop++;
-                       if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
-                               dev_err(dp->dev, "failed to get pll lock status\n");
-                               return;
-                       }
-                       usleep_range(10, 20);
-               }
-       }
-
-       /* Enable Serdes FIFO function and Link symbol clock domain module */
-       reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-       reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
-               | AUX_FUNC_EN_N);
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-}
-
-void exynos_dp_clear_hotplug_interrupts(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       if (gpio_is_valid(dp->hpd_gpio))
-               return;
-
-       reg = HOTPLUG_CHG | HPD_LOST | PLUG;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
-
-       reg = INT_HPD;
-       writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
-}
-
-void exynos_dp_init_hpd(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       if (gpio_is_valid(dp->hpd_gpio))
-               return;
-
-       exynos_dp_clear_hotplug_interrupts(dp);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-       reg &= ~(F_HPD | HPD_CTRL);
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-}
-
-enum dp_irq_type exynos_dp_get_irq_type(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       if (gpio_is_valid(dp->hpd_gpio)) {
-               reg = gpio_get_value(dp->hpd_gpio);
-               if (reg)
-                       return DP_IRQ_TYPE_HP_CABLE_IN;
-               else
-                       return DP_IRQ_TYPE_HP_CABLE_OUT;
-       } else {
-               /* Parse hotplug interrupt status register */
-               reg = readl(dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
-
-               if (reg & PLUG)
-                       return DP_IRQ_TYPE_HP_CABLE_IN;
-
-               if (reg & HPD_LOST)
-                       return DP_IRQ_TYPE_HP_CABLE_OUT;
-
-               if (reg & HOTPLUG_CHG)
-                       return DP_IRQ_TYPE_HP_CHANGE;
-
-               return DP_IRQ_TYPE_UNKNOWN;
-       }
-}
-
-void exynos_dp_reset_aux(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       /* Disable AUX channel module */
-       reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-       reg |= AUX_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-}
-
-void exynos_dp_init_aux(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       /* Clear inerrupts related to AUX channel */
-       reg = RPLY_RECEIV | AUX_ERR;
-       writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
-
-       exynos_dp_reset_aux(dp);
-
-       /* Disable AUX transaction H/W retry */
-       reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(0)|
-               AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
-       writel(reg, dp->reg_base + EXYNOS_DP_AUX_HW_RETRY_CTL);
-
-       /* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
-       reg = DEFER_CTRL_EN | DEFER_COUNT(1);
-       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_DEFER_CTL);
-
-       /* Enable AUX channel module */
-       reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-       reg &= ~AUX_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
-}
-
-int exynos_dp_get_plug_in_status(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       if (gpio_is_valid(dp->hpd_gpio)) {
-               if (gpio_get_value(dp->hpd_gpio))
-                       return 0;
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-               if (reg & HPD_STATUS)
-                       return 0;
-       }
-
-       return -EINVAL;
-}
-
-void exynos_dp_enable_sw_function(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
-       reg &= ~SW_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
-}
-
-int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp)
-{
-       int reg;
-       int retval = 0;
-       int timeout_loop = 0;
-
-       /* Enable AUX CH operation */
-       reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
-       reg |= AUX_EN;
-       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
-
-       /* Is AUX CH command reply received? */
-       reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
-       while (!(reg & RPLY_RECEIV)) {
-               timeout_loop++;
-               if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
-                       dev_err(dp->dev, "AUX CH command reply failed!\n");
-                       return -ETIMEDOUT;
-               }
-               reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
-               usleep_range(10, 11);
-       }
-
-       /* Clear interrupt source for AUX CH command reply */
-       writel(RPLY_RECEIV, dp->reg_base + EXYNOS_DP_INT_STA);
-
-       /* Clear interrupt source for AUX CH access error */
-       reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
-       if (reg & AUX_ERR) {
-               writel(AUX_ERR, dp->reg_base + EXYNOS_DP_INT_STA);
-               return -EREMOTEIO;
-       }
-
-       /* Check AUX CH error access status */
-       reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_STA);
-       if ((reg & AUX_STATUS_MASK) != 0) {
-               dev_err(dp->dev, "AUX CH error happens: %d\n\n",
-                       reg & AUX_STATUS_MASK);
-               return -EREMOTEIO;
-       }
-
-       return retval;
-}
-
-int exynos_dp_write_byte_to_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned char data)
-{
-       u32 reg;
-       int i;
-       int retval;
-
-       for (i = 0; i < 3; i++) {
-               /* Clear AUX CH data buffer */
-               reg = BUF_CLR;
-               writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-               /* Select DPCD device address */
-               reg = AUX_ADDR_7_0(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
-               reg = AUX_ADDR_15_8(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
-               reg = AUX_ADDR_19_16(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
-
-               /* Write data buffer */
-               reg = (unsigned int)data;
-               writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
-
-               /*
-                * Set DisplayPort transaction and write 1 byte
-                * If bit 3 is 1, DisplayPort transaction.
-                * If Bit 3 is 0, I2C transaction.
-                */
-               reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-               /* Start AUX transaction */
-               retval = exynos_dp_start_aux_transaction(dp);
-               if (retval == 0)
-                       break;
-               else
-                       dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
-                               __func__);
-       }
-
-       return retval;
-}
-
-int exynos_dp_read_byte_from_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned char *data)
-{
-       u32 reg;
-       int i;
-       int retval;
-
-       for (i = 0; i < 3; i++) {
-               /* Clear AUX CH data buffer */
-               reg = BUF_CLR;
-               writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-               /* Select DPCD device address */
-               reg = AUX_ADDR_7_0(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
-               reg = AUX_ADDR_15_8(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
-               reg = AUX_ADDR_19_16(reg_addr);
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
-
-               /*
-                * Set DisplayPort transaction and read 1 byte
-                * If bit 3 is 1, DisplayPort transaction.
-                * If Bit 3 is 0, I2C transaction.
-                */
-               reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-               /* Start AUX transaction */
-               retval = exynos_dp_start_aux_transaction(dp);
-               if (retval == 0)
-                       break;
-               else
-                       dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
-                               __func__);
-       }
-
-       /* Read data buffer */
-       reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
-       *data = (unsigned char)(reg & 0xff);
-
-       return retval;
-}
-
-int exynos_dp_write_bytes_to_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char data[])
-{
-       u32 reg;
-       unsigned int start_offset;
-       unsigned int cur_data_count;
-       unsigned int cur_data_idx;
-       int i;
-       int retval = 0;
-
-       /* Clear AUX CH data buffer */
-       reg = BUF_CLR;
-       writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-       start_offset = 0;
-       while (start_offset < count) {
-               /* Buffer size of AUX CH is 16 * 4bytes */
-               if ((count - start_offset) > 16)
-                       cur_data_count = 16;
-               else
-                       cur_data_count = count - start_offset;
-
-               for (i = 0; i < 3; i++) {
-                       /* Select DPCD device address */
-                       reg = AUX_ADDR_7_0(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
-                       reg = AUX_ADDR_15_8(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
-                       reg = AUX_ADDR_19_16(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
-
-                       for (cur_data_idx = 0; cur_data_idx < cur_data_count;
-                            cur_data_idx++) {
-                               reg = data[start_offset + cur_data_idx];
-                               writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0
-                                                         + 4 * cur_data_idx);
-                       }
-
-                       /*
-                        * Set DisplayPort transaction and write
-                        * If bit 3 is 1, DisplayPort transaction.
-                        * If Bit 3 is 0, I2C transaction.
-                        */
-                       reg = AUX_LENGTH(cur_data_count) |
-                               AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-                       /* Start AUX transaction */
-                       retval = exynos_dp_start_aux_transaction(dp);
-                       if (retval == 0)
-                               break;
-                       else
-                               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
-                                       __func__);
-               }
-
-               start_offset += cur_data_count;
-       }
-
-       return retval;
-}
-
-int exynos_dp_read_bytes_from_dpcd(struct exynos_dp_device *dp,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char data[])
-{
-       u32 reg;
-       unsigned int start_offset;
-       unsigned int cur_data_count;
-       unsigned int cur_data_idx;
-       int i;
-       int retval = 0;
-
-       /* Clear AUX CH data buffer */
-       reg = BUF_CLR;
-       writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-       start_offset = 0;
-       while (start_offset < count) {
-               /* Buffer size of AUX CH is 16 * 4bytes */
-               if ((count - start_offset) > 16)
-                       cur_data_count = 16;
-               else
-                       cur_data_count = count - start_offset;
-
-               /* AUX CH Request Transaction process */
-               for (i = 0; i < 3; i++) {
-                       /* Select DPCD device address */
-                       reg = AUX_ADDR_7_0(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
-                       reg = AUX_ADDR_15_8(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
-                       reg = AUX_ADDR_19_16(reg_addr + start_offset);
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
-
-                       /*
-                        * Set DisplayPort transaction and read
-                        * If bit 3 is 1, DisplayPort transaction.
-                        * If Bit 3 is 0, I2C transaction.
-                        */
-                       reg = AUX_LENGTH(cur_data_count) |
-                               AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-                       /* Start AUX transaction */
-                       retval = exynos_dp_start_aux_transaction(dp);
-                       if (retval == 0)
-                               break;
-                       else
-                               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
-                                       __func__);
-               }
-
-               for (cur_data_idx = 0; cur_data_idx < cur_data_count;
-                   cur_data_idx++) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
-                                                + 4 * cur_data_idx);
-                       data[start_offset + cur_data_idx] =
-                               (unsigned char)reg;
-               }
-
-               start_offset += cur_data_count;
-       }
-
-       return retval;
-}
-
-int exynos_dp_select_i2c_device(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr)
-{
-       u32 reg;
-       int retval;
-
-       /* Set EDID device address */
-       reg = device_addr;
-       writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
-       writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
-       writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
-
-       /* Set offset from base address of EDID device */
-       writel(reg_addr, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
-
-       /*
-        * Set I2C transaction and write address
-        * If bit 3 is 1, DisplayPort transaction.
-        * If Bit 3 is 0, I2C transaction.
-        */
-       reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
-               AUX_TX_COMM_WRITE;
-       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-       /* Start AUX transaction */
-       retval = exynos_dp_start_aux_transaction(dp);
-       if (retval != 0)
-               dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
-
-       return retval;
-}
-
-int exynos_dp_read_byte_from_i2c(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr,
-                               unsigned int *data)
-{
-       u32 reg;
-       int i;
-       int retval;
-
-       for (i = 0; i < 3; i++) {
-               /* Clear AUX CH data buffer */
-               reg = BUF_CLR;
-               writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-               /* Select EDID device */
-               retval = exynos_dp_select_i2c_device(dp, device_addr, reg_addr);
-               if (retval != 0)
-                       continue;
-
-               /*
-                * Set I2C transaction and read data
-                * If bit 3 is 1, DisplayPort transaction.
-                * If Bit 3 is 0, I2C transaction.
-                */
-               reg = AUX_TX_COMM_I2C_TRANSACTION |
-                       AUX_TX_COMM_READ;
-               writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
-
-               /* Start AUX transaction */
-               retval = exynos_dp_start_aux_transaction(dp);
-               if (retval == 0)
-                       break;
-               else
-                       dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
-                               __func__);
-       }
-
-       /* Read data */
-       if (retval == 0)
-               *data = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
-
-       return retval;
-}
-
-int exynos_dp_read_bytes_from_i2c(struct exynos_dp_device *dp,
-                               unsigned int device_addr,
-                               unsigned int reg_addr,
-                               unsigned int count,
-                               unsigned char edid[])
-{
-       u32 reg;
-       unsigned int i, j;
-       unsigned int cur_data_idx;
-       unsigned int defer = 0;
-       int retval = 0;
-
-       for (i = 0; i < count; i += 16) {
-               for (j = 0; j < 3; j++) {
-                       /* Clear AUX CH data buffer */
-                       reg = BUF_CLR;
-                       writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
-
-                       /* Set normal AUX CH command */
-                       reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
-                       reg &= ~ADDR_ONLY;
-                       writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
-
-                       /*
-                        * If Rx sends defer, Tx sends only reads
-                        * request without sending address
-                        */
-                       if (!defer)
-                               retval = exynos_dp_select_i2c_device(dp,
-                                               device_addr, reg_addr + i);
-                       else
-                               defer = 0;
-
-                       if (retval == 0) {
-                               /*
-                                * Set I2C transaction and write data
-                                * If bit 3 is 1, DisplayPort transaction.
-                                * If Bit 3 is 0, I2C transaction.
-                                */
-                               reg = AUX_LENGTH(16) |
-                                       AUX_TX_COMM_I2C_TRANSACTION |
-                                       AUX_TX_COMM_READ;
-                               writel(reg, dp->reg_base +
-                                       EXYNOS_DP_AUX_CH_CTL_1);
-
-                               /* Start AUX transaction */
-                               retval = exynos_dp_start_aux_transaction(dp);
-                               if (retval == 0)
-                                       break;
-                               else
-                                       dev_dbg(dp->dev,
-                                               "%s: Aux Transaction fail!\n",
-                                               __func__);
-                       }
-                       /* Check if Rx sends defer */
-                       reg = readl(dp->reg_base + EXYNOS_DP_AUX_RX_COMM);
-                       if (reg == AUX_RX_COMM_AUX_DEFER ||
-                               reg == AUX_RX_COMM_I2C_DEFER) {
-                               dev_err(dp->dev, "Defer: %d\n\n", reg);
-                               defer = 1;
-                       }
-               }
-
-               for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
-                       reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
-                                                + 4 * cur_data_idx);
-                       edid[i + cur_data_idx] = (unsigned char)reg;
-               }
-       }
-
-       return retval;
-}
-
-void exynos_dp_set_link_bandwidth(struct exynos_dp_device *dp, u32 bwtype)
-{
-       u32 reg;
-
-       reg = bwtype;
-       if ((bwtype == LINK_RATE_2_70GBPS) || (bwtype == LINK_RATE_1_62GBPS))
-               writel(reg, dp->reg_base + EXYNOS_DP_LINK_BW_SET);
-}
-
-void exynos_dp_get_link_bandwidth(struct exynos_dp_device *dp, u32 *bwtype)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LINK_BW_SET);
-       *bwtype = reg;
-}
-
-void exynos_dp_set_lane_count(struct exynos_dp_device *dp, u32 count)
-{
-       u32 reg;
-
-       reg = count;
-       writel(reg, dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
-}
-
-void exynos_dp_get_lane_count(struct exynos_dp_device *dp, u32 *count)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
-       *count = reg;
-}
-
-void exynos_dp_enable_enhanced_mode(struct exynos_dp_device *dp, bool enable)
-{
-       u32 reg;
-
-       if (enable) {
-               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-               reg |= ENHANCED;
-               writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-               reg &= ~ENHANCED;
-               writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-       }
-}
-
-void exynos_dp_set_training_pattern(struct exynos_dp_device *dp,
-                                enum pattern_set pattern)
-{
-       u32 reg;
-
-       switch (pattern) {
-       case PRBS7:
-               reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
-               writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-               break;
-       case D10_2:
-               reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
-               writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-               break;
-       case TRAINING_PTN1:
-               reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
-               writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-               break;
-       case TRAINING_PTN2:
-               reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
-               writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-               break;
-       case DP_NONE:
-               reg = SCRAMBLING_ENABLE |
-                       LINK_QUAL_PATTERN_SET_DISABLE |
-                       SW_TRAINING_PATTERN_SET_NORMAL;
-               writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-               break;
-       default:
-               break;
-       }
-}
-
-void exynos_dp_set_lane0_pre_emphasis(struct exynos_dp_device *dp, u32 level)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
-       reg &= ~PRE_EMPHASIS_SET_MASK;
-       reg |= level << PRE_EMPHASIS_SET_SHIFT;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane1_pre_emphasis(struct exynos_dp_device *dp, u32 level)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
-       reg &= ~PRE_EMPHASIS_SET_MASK;
-       reg |= level << PRE_EMPHASIS_SET_SHIFT;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane2_pre_emphasis(struct exynos_dp_device *dp, u32 level)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
-       reg &= ~PRE_EMPHASIS_SET_MASK;
-       reg |= level << PRE_EMPHASIS_SET_SHIFT;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane3_pre_emphasis(struct exynos_dp_device *dp, u32 level)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
-       reg &= ~PRE_EMPHASIS_SET_MASK;
-       reg |= level << PRE_EMPHASIS_SET_SHIFT;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane0_link_training(struct exynos_dp_device *dp,
-                                       u32 training_lane)
-{
-       u32 reg;
-
-       reg = training_lane;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane1_link_training(struct exynos_dp_device *dp,
-                                       u32 training_lane)
-{
-       u32 reg;
-
-       reg = training_lane;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane2_link_training(struct exynos_dp_device *dp,
-                                       u32 training_lane)
-{
-       u32 reg;
-
-       reg = training_lane;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
-}
-
-void exynos_dp_set_lane3_link_training(struct exynos_dp_device *dp,
-                                       u32 training_lane)
-{
-       u32 reg;
-
-       reg = training_lane;
-       writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
-}
-
-u32 exynos_dp_get_lane0_link_training(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
-       return reg;
-}
-
-u32 exynos_dp_get_lane1_link_training(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
-       return reg;
-}
-
-u32 exynos_dp_get_lane2_link_training(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
-       return reg;
-}
-
-u32 exynos_dp_get_lane3_link_training(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
-       return reg;
-}
-
-void exynos_dp_reset_macro(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_PHY_TEST);
-       reg |= MACRO_RST;
-       writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
-
-       /* 10 us is the minimum reset time. */
-       usleep_range(10, 20);
-
-       reg &= ~MACRO_RST;
-       writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
-}
-
-void exynos_dp_init_video(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
-       writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
-
-       reg = 0x0;
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
-
-       reg = CHA_CRI(4) | CHA_CTRL;
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
-
-       reg = 0x0;
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-
-       reg = VID_HRES_TH(2) | VID_VRES_TH(0);
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_8);
-}
-
-void exynos_dp_set_video_color_format(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       /* Configure the input color depth, color space, dynamic range */
-       reg = (dp->video_info->dynamic_range << IN_D_RANGE_SHIFT) |
-               (dp->video_info->color_depth << IN_BPC_SHIFT) |
-               (dp->video_info->color_space << IN_COLOR_F_SHIFT);
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_2);
-
-       /* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
-       reg &= ~IN_YC_COEFFI_MASK;
-       if (dp->video_info->ycbcr_coeff)
-               reg |= IN_YC_COEFFI_ITU709;
-       else
-               reg |= IN_YC_COEFFI_ITU601;
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
-}
-
-int exynos_dp_is_slave_video_stream_clock_on(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
-
-       if (!(reg & DET_STA)) {
-               dev_dbg(dp->dev, "Input stream clock not detected.\n");
-               return -EINVAL;
-       }
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
-       dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
-
-       if (reg & CHA_STA) {
-               dev_dbg(dp->dev, "Input stream clk is changing\n");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-void exynos_dp_set_video_cr_mn(struct exynos_dp_device *dp,
-               enum clock_recovery_m_value_type type,
-               u32 m_value,
-               u32 n_value)
-{
-       u32 reg;
-
-       if (type == REGISTER_M) {
-               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-               reg |= FIX_M_VID;
-               writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-               reg = m_value & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_M_VID_0);
-               reg = (m_value >> 8) & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_M_VID_1);
-               reg = (m_value >> 16) & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_M_VID_2);
-
-               reg = n_value & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_N_VID_0);
-               reg = (n_value >> 8) & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_N_VID_1);
-               reg = (n_value >> 16) & 0xff;
-               writel(reg, dp->reg_base + EXYNOS_DP_N_VID_2);
-       } else  {
-               reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-               reg &= ~FIX_M_VID;
-               writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
-
-               writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_0);
-               writel(0x80, dp->reg_base + EXYNOS_DP_N_VID_1);
-               writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_2);
-       }
-}
-
-void exynos_dp_set_video_timing_mode(struct exynos_dp_device *dp, u32 type)
-{
-       u32 reg;
-
-       if (type == VIDEO_TIMING_FROM_CAPTURE) {
-               reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-               reg &= ~FORMAT_SEL;
-               writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-               reg |= FORMAT_SEL;
-               writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-       }
-}
-
-void exynos_dp_enable_video_master(struct exynos_dp_device *dp, bool enable)
-{
-       u32 reg;
-
-       if (enable) {
-               reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-               reg &= ~VIDEO_MODE_MASK;
-               reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
-               writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-       } else {
-               reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-               reg &= ~VIDEO_MODE_MASK;
-               reg |= VIDEO_MODE_SLAVE_MODE;
-               writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-       }
-}
-
-void exynos_dp_start_video(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-       reg |= VIDEO_EN;
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
-}
-
-int exynos_dp_is_video_stream_on(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-       writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
-       if (!(reg & STRM_VALID)) {
-               dev_dbg(dp->dev, "Input video stream is not detected.\n");
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
-       reg &= ~(MASTER_VID_FUNC_EN_N|SLAVE_VID_FUNC_EN_N);
-       reg |= MASTER_VID_FUNC_EN_N;
-       writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-       reg &= ~INTERACE_SCAN_CFG;
-       reg |= (dp->video_info->interlaced << 2);
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-       reg &= ~VSYNC_POLARITY_CFG;
-       reg |= (dp->video_info->v_sync_polarity << 1);
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-
-       reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-       reg &= ~HSYNC_POLARITY_CFG;
-       reg |= (dp->video_info->h_sync_polarity << 0);
-       writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
-
-       reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
-       writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
-}
-
-void exynos_dp_enable_scrambling(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-       reg &= ~SCRAMBLING_DISABLE;
-       writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-}
-
-void exynos_dp_disable_scrambling(struct exynos_dp_device *dp)
-{
-       u32 reg;
-
-       reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-       reg |= SCRAMBLING_DISABLE;
-       writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
-}
index e36579c1c025bc97b2ae2c7b59e2cd46931a54ee..785ffa6cc30976694e6a31c6843038700b3e00cf 100644 (file)
@@ -157,9 +157,8 @@ err_crtc:
 
 int exynos_drm_crtc_enable_vblank(struct drm_device *dev, unsigned int pipe)
 {
-       struct exynos_drm_private *private = dev->dev_private;
-       struct exynos_drm_crtc *exynos_crtc =
-               to_exynos_crtc(private->crtc[pipe]);
+       struct exynos_drm_crtc *exynos_crtc = exynos_drm_crtc_from_pipe(dev,
+                                                                       pipe);
 
        if (exynos_crtc->ops->enable_vblank)
                return exynos_crtc->ops->enable_vblank(exynos_crtc);
@@ -169,9 +168,8 @@ int exynos_drm_crtc_enable_vblank(struct drm_device *dev, unsigned int pipe)
 
 void exynos_drm_crtc_disable_vblank(struct drm_device *dev, unsigned int pipe)
 {
-       struct exynos_drm_private *private = dev->dev_private;
-       struct exynos_drm_crtc *exynos_crtc =
-               to_exynos_crtc(private->crtc[pipe]);
+       struct exynos_drm_crtc *exynos_crtc = exynos_drm_crtc_from_pipe(dev,
+                                                                       pipe);
 
        if (exynos_crtc->ops->disable_vblank)
                exynos_crtc->ops->disable_vblank(exynos_crtc);
@@ -235,20 +233,15 @@ void exynos_drm_crtc_cancel_page_flip(struct drm_crtc *crtc,
        unsigned long flags;
 
        spin_lock_irqsave(&crtc->dev->event_lock, flags);
+
        e = exynos_crtc->event;
        if (e && e->base.file_priv == file) {
                exynos_crtc->event = NULL;
-               /*
-                * event will be destroyed by core part
-                * so below line should be removed later with core changes
-                */
-               e->base.destroy(&e->base);
-               /*
-                * event_space will be increased by core part
-                * so below line should be removed later with core changes.
-                */
-               file->event_space += sizeof(e->event);
                atomic_dec(&exynos_crtc->pending_update);
        }
+
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+
+       if (e && e->base.file_priv == file)
+               drm_event_cancel_free(crtc->dev, &e->base);
 }
index 75e570f45259d50b3185e62233f62522d8b75a7d..5e38e749ac17e17898d4bcc54ad90d4b08301047 100644 (file)
@@ -15,6 +15,7 @@
 #include <drm/drm_panel.h>
 #include <drm/drm_atomic_helper.h>
 
+#include <linux/of_graph.h>
 #include <linux/regulator/consumer.h>
 
 #include <video/of_videomode.h>
@@ -164,67 +165,6 @@ static const struct drm_encoder_funcs exynos_dpi_encoder_funcs = {
        .destroy = drm_encoder_cleanup,
 };
 
-/* of_* functions will be removed after merge of of_graph patches */
-static struct device_node *
-of_get_child_by_name_reg(struct device_node *parent, const char *name, u32 reg)
-{
-       struct device_node *np;
-
-       for_each_child_of_node(parent, np) {
-               u32 r;
-
-               if (!np->name || of_node_cmp(np->name, name))
-                       continue;
-
-               if (of_property_read_u32(np, "reg", &r) < 0)
-                       r = 0;
-
-               if (reg == r)
-                       break;
-       }
-
-       return np;
-}
-
-static struct device_node *of_graph_get_port_by_reg(struct device_node *parent,
-                                                   u32 reg)
-{
-       struct device_node *ports, *port;
-
-       ports = of_get_child_by_name(parent, "ports");
-       if (ports)
-               parent = ports;
-
-       port = of_get_child_by_name_reg(parent, "port", reg);
-
-       of_node_put(ports);
-
-       return port;
-}
-
-static struct device_node *
-of_graph_get_endpoint_by_reg(struct device_node *port, u32 reg)
-{
-       return of_get_child_by_name_reg(port, "endpoint", reg);
-}
-
-static struct device_node *
-of_graph_get_remote_port_parent(const struct device_node *node)
-{
-       struct device_node *np;
-       unsigned int depth;
-
-       np = of_parse_phandle(node, "remote-endpoint", 0);
-
-       /* Walk 3 levels up only if there is 'ports' node. */
-       for (depth = 3; depth && np; depth--) {
-               np = of_get_next_parent(np);
-               if (depth == 2 && of_node_cmp(np->name, "ports"))
-                       break;
-       }
-       return np;
-}
-
 enum {
        FIMD_PORT_IN0,
        FIMD_PORT_IN1,
@@ -237,12 +177,7 @@ static struct device_node *exynos_dpi_of_find_panel_node(struct device *dev)
 {
        struct device_node *np, *ep;
 
-       np = of_graph_get_port_by_reg(dev->of_node, FIMD_PORT_RGB);
-       if (!np)
-               return NULL;
-
-       ep = of_graph_get_endpoint_by_reg(np, 0);
-       of_node_put(np);
+       ep = of_graph_get_endpoint_by_regs(dev->of_node, FIMD_PORT_RGB, 0);
        if (!ep)
                return NULL;
 
index 5344940c8a07a5e9fbc375538e5a28b9ee5d38b9..2dd820e23b0cb43b45f047798d2e5e69b141b4a1 100644 (file)
@@ -212,13 +212,6 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
         */
        dev->irq_enabled = true;
 
-       /*
-        * with vblank_disable_allowed = true, vblank interrupt will be disabled
-        * by drm timer once a current process gives up ownership of
-        * vblank event.(after drm_vblank_put function is called)
-        */
-       dev->vblank_disable_allowed = true;
-
        /* init kms poll for handling hpd */
        drm_kms_helper_poll_init(dev);
 
@@ -270,7 +263,7 @@ static int commit_is_pending(struct exynos_drm_private *priv, u32 crtcs)
 }
 
 int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
-                        bool async)
+                        bool nonblock)
 {
        struct exynos_drm_private *priv = dev->dev_private;
        struct exynos_atomic_commit *commit;
@@ -308,7 +301,7 @@ int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
 
        drm_atomic_helper_swap_state(dev, state);
 
-       if (async)
+       if (nonblock)
                schedule_work(&commit->work);
        else
                exynos_atomic_commit_complete(commit);
@@ -418,7 +411,7 @@ static struct drm_driver exynos_drm_driver = {
        .get_vblank_counter     = drm_vblank_no_hw_counter,
        .enable_vblank          = exynos_drm_crtc_enable_vblank,
        .disable_vblank         = exynos_drm_crtc_disable_vblank,
-       .gem_free_object        = exynos_drm_gem_free_object,
+       .gem_free_object_unlocked = exynos_drm_gem_free_object,
        .gem_vm_ops             = &exynos_drm_gem_vm_ops,
        .dumb_create            = exynos_drm_gem_dumb_create,
        .dumb_map_offset        = exynos_drm_gem_dumb_map_offset,
@@ -431,6 +424,7 @@ static struct drm_driver exynos_drm_driver = {
        .gem_prime_import_sg_table      = exynos_drm_gem_prime_import_sg_table,
        .gem_prime_vmap         = exynos_drm_gem_prime_vmap,
        .gem_prime_vunmap       = exynos_drm_gem_prime_vunmap,
+       .gem_prime_mmap         = exynos_drm_gem_prime_mmap,
        .ioctls                 = exynos_ioctls,
        .num_ioctls             = ARRAY_SIZE(exynos_ioctls),
        .fops                   = &exynos_drm_driver_fops,
index 502f750bad2a6598287ea0b55d339c83e3fb121b..cc33ec9296e7e15b80cf110cc3f6f860a2e226de 100644 (file)
@@ -120,8 +120,6 @@ struct exynos_drm_plane_config {
  * @commit: set current hw specific display mode to hw.
  * @enable_vblank: specific driver callback for enabling vblank interrupt.
  * @disable_vblank: specific driver callback for disabling vblank interrupt.
- * @wait_for_vblank: wait for vblank interrupt to make sure that
- *     hardware overlay is updated.
  * @atomic_check: validate state
  * @atomic_begin: prepare device to receive an update
  * @atomic_flush: mark the end of device update
@@ -129,10 +127,6 @@ struct exynos_drm_plane_config {
  * @disable_plane: disable hardware specific overlay.
  * @te_handler: trigger to transfer video image at the tearing effect
  *     synchronization signal if there is a page flip request.
- * @clock_enable: optional function enabling/disabling display domain clock,
- *     called from exynos-dp driver before powering up (with
- *     'enable' argument as true) and after powering down (with
- *     'enable' as false).
  */
 struct exynos_drm_crtc;
 struct exynos_drm_crtc_ops {
@@ -141,7 +135,6 @@ struct exynos_drm_crtc_ops {
        void (*commit)(struct exynos_drm_crtc *crtc);
        int (*enable_vblank)(struct exynos_drm_crtc *crtc);
        void (*disable_vblank)(struct exynos_drm_crtc *crtc);
-       void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
        int (*atomic_check)(struct exynos_drm_crtc *crtc,
                            struct drm_crtc_state *state);
        void (*atomic_begin)(struct exynos_drm_crtc *crtc);
@@ -151,7 +144,10 @@ struct exynos_drm_crtc_ops {
                              struct exynos_drm_plane *plane);
        void (*atomic_flush)(struct exynos_drm_crtc *crtc);
        void (*te_handler)(struct exynos_drm_crtc *crtc);
-       void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
+};
+
+struct exynos_drm_clk {
+       void (*enable)(struct exynos_drm_clk *clk, bool enable);
 };
 
 /*
@@ -182,8 +178,16 @@ struct exynos_drm_crtc {
        atomic_t                        pending_update;
        const struct exynos_drm_crtc_ops        *ops;
        void                            *ctx;
+       struct exynos_drm_clk           *pipe_clk;
 };
 
+static inline void exynos_drm_pipe_clk_enable(struct exynos_drm_crtc *crtc,
+                                             bool enable)
+{
+       if (crtc->pipe_clk)
+               crtc->pipe_clk->enable(crtc->pipe_clk, enable);
+}
+
 struct exynos_drm_g2d_private {
        struct device           *dev;
        struct list_head        inuse_cmdlist;
@@ -232,6 +236,14 @@ struct exynos_drm_private {
        wait_queue_head_t       wait;
 };
 
+static inline struct exynos_drm_crtc *
+exynos_drm_crtc_from_pipe(struct drm_device *dev, int pipe)
+{
+       struct exynos_drm_private *private = dev->dev_private;
+
+       return to_exynos_crtc(private->crtc[pipe]);
+}
+
 static inline struct device *to_dma_dev(struct drm_device *dev)
 {
        struct exynos_drm_private *priv = dev->dev_private;
@@ -296,7 +308,7 @@ static inline int exynos_dpi_bind(struct drm_device *dev,
 #endif
 
 int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
-                        bool async);
+                        bool nonblock);
 
 
 extern struct platform_driver fimd_driver;
index 63c84a106c0ba255d0e08cf925623008e4f7adad..601ecf8006a7be748b93fcd47036ee64b3336e53 100644 (file)
@@ -280,7 +280,7 @@ struct exynos_dsi {
        spinlock_t transfer_lock; /* protects transfer_list */
        struct list_head transfer_list;
 
-       struct exynos_dsi_driver_data *driver_data;
+       const struct exynos_dsi_driver_data *driver_data;
        struct device_node *bridge_node;
 };
 
@@ -532,15 +532,6 @@ static const struct of_device_id exynos_dsi_of_match[] = {
        { }
 };
 
-static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
-                                               struct platform_device *pdev)
-{
-       const struct of_device_id *of_id =
-                       of_match_device(exynos_dsi_of_match, &pdev->dev);
-
-       return (struct exynos_dsi_driver_data *)of_id->data;
-}
-
 static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
 {
        if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
@@ -564,7 +555,7 @@ static void exynos_dsi_reset(struct exynos_dsi *dsi)
 static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi,
                unsigned long fin, unsigned long fout, u8 *p, u16 *m, u8 *s)
 {
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        unsigned long best_freq = 0;
        u32 min_delta = 0xffffffff;
        u8 p_min, p_max;
@@ -618,7 +609,7 @@ static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi,
 static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
                                        unsigned long freq)
 {
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        unsigned long fin, fout;
        int timeout;
        u8 p, s;
@@ -712,7 +703,7 @@ static int exynos_dsi_enable_clock(struct exynos_dsi *dsi)
 
 static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi)
 {
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        const unsigned int *reg_values = driver_data->reg_values;
        u32 reg;
 
@@ -790,7 +781,7 @@ static void exynos_dsi_enable_lane(struct exynos_dsi *dsi, u32 lane)
 
 static int exynos_dsi_init_link(struct exynos_dsi *dsi)
 {
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        int timeout;
        u32 reg;
        u32 lanes_mask;
@@ -1334,7 +1325,7 @@ static void exynos_dsi_disable_irq(struct exynos_dsi *dsi)
 
 static int exynos_dsi_init(struct exynos_dsi *dsi)
 {
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
 
        exynos_dsi_reset(dsi);
        exynos_dsi_enable_irq(dsi);
@@ -1641,50 +1632,6 @@ static const struct drm_encoder_funcs exynos_dsi_encoder_funcs = {
 
 MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
 
-/* of_* functions will be removed after merge of of_graph patches */
-static struct device_node *
-of_get_child_by_name_reg(struct device_node *parent, const char *name, u32 reg)
-{
-       struct device_node *np;
-
-       for_each_child_of_node(parent, np) {
-               u32 r;
-
-               if (!np->name || of_node_cmp(np->name, name))
-                       continue;
-
-               if (of_property_read_u32(np, "reg", &r) < 0)
-                       r = 0;
-
-               if (reg == r)
-                       break;
-       }
-
-       return np;
-}
-
-static struct device_node *of_graph_get_port_by_reg(struct device_node *parent,
-                                                   u32 reg)
-{
-       struct device_node *ports, *port;
-
-       ports = of_get_child_by_name(parent, "ports");
-       if (ports)
-               parent = ports;
-
-       port = of_get_child_by_name_reg(parent, "port", reg);
-
-       of_node_put(ports);
-
-       return port;
-}
-
-static struct device_node *
-of_graph_get_endpoint_by_reg(struct device_node *port, u32 reg)
-{
-       return of_get_child_by_name_reg(port, "endpoint", reg);
-}
-
 static int exynos_dsi_of_read_u32(const struct device_node *np,
                                  const char *propname, u32 *out_value)
 {
@@ -1706,7 +1653,7 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
 {
        struct device *dev = dsi->dev;
        struct device_node *node = dev->of_node;
-       struct device_node *port, *ep;
+       struct device_node *ep;
        int ret;
 
        ret = exynos_dsi_of_read_u32(node, "samsung,pll-clock-frequency",
@@ -1714,16 +1661,9 @@ static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
        if (ret < 0)
                return ret;
 
-       port = of_graph_get_port_by_reg(node, DSI_PORT_OUT);
-       if (!port) {
-               dev_err(dev, "no output port specified\n");
-               return -EINVAL;
-       }
-
-       ep = of_graph_get_endpoint_by_reg(port, 0);
-       of_node_put(port);
+       ep = of_graph_get_endpoint_by_regs(node, DSI_PORT_OUT, 0);
        if (!ep) {
-               dev_err(dev, "no endpoint specified in output port\n");
+               dev_err(dev, "no output port with endpoint specified\n");
                return -EINVAL;
        }
 
@@ -1833,7 +1773,7 @@ static int exynos_dsi_probe(struct platform_device *pdev)
        dsi->dsi_host.dev = dev;
 
        dsi->dev = dev;
-       dsi->driver_data = exynos_dsi_get_driver_data(pdev);
+       dsi->driver_data = of_device_get_match_data(dev);
 
        ret = exynos_dsi_parse_dt(dsi);
        if (ret)
@@ -1917,7 +1857,7 @@ static int __maybe_unused exynos_dsi_suspend(struct device *dev)
 {
        struct drm_encoder *encoder = dev_get_drvdata(dev);
        struct exynos_dsi *dsi = encoder_to_dsi(encoder);
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        int ret, i;
 
        usleep_range(10000, 20000);
@@ -1948,7 +1888,7 @@ static int __maybe_unused exynos_dsi_resume(struct device *dev)
 {
        struct drm_encoder *encoder = dev_get_drvdata(dev);
        struct exynos_dsi *dsi = encoder_to_dsi(encoder);
-       struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
+       const struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
        int ret, i;
 
        ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
index 81cc5537cf2577899bd5c1d011beb404584e08a6..e0166403b4bd5849cab6418a4d5de90b1a18e11c 100644 (file)
@@ -97,20 +97,9 @@ static int exynos_drm_fb_create_handle(struct drm_framebuffer *fb,
                                     &exynos_fb->exynos_gem[0]->base, handle);
 }
 
-static int exynos_drm_fb_dirty(struct drm_framebuffer *fb,
-                               struct drm_file *file_priv, unsigned flags,
-                               unsigned color, struct drm_clip_rect *clips,
-                               unsigned num_clips)
-{
-       /* TODO */
-
-       return 0;
-}
-
 static const struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
        .destroy        = exynos_drm_fb_destroy,
        .create_handle  = exynos_drm_fb_create_handle,
-       .dirty          = exynos_drm_fb_dirty,
 };
 
 struct drm_framebuffer *
@@ -163,8 +152,7 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
        int ret;
 
        for (i = 0; i < drm_format_num_planes(mode_cmd->pixel_format); i++) {
-               obj = drm_gem_object_lookup(dev, file_priv,
-                                           mode_cmd->handles[i]);
+               obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
                if (!obj) {
                        DRM_ERROR("failed to lookup gem object\n");
                        ret = -ENOENT;
index 72d7c0b7c216531c7f3d7af2d1136ee5a3ecb01b..67dcd6831291fac5f96f26d29ecd9dae8476d8e9 100644 (file)
@@ -138,8 +138,6 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
        mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
                                                          sizes->surface_depth);
 
-       mutex_lock(&dev->struct_mutex);
-
        size = mode_cmd.pitches[0] * mode_cmd.height;
 
        exynos_gem = exynos_drm_gem_create(dev, EXYNOS_BO_CONTIG, size);
@@ -154,10 +152,8 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
                                                   size);
        }
 
-       if (IS_ERR(exynos_gem)) {
-               ret = PTR_ERR(exynos_gem);
-               goto out;
-       }
+       if (IS_ERR(exynos_gem))
+               return PTR_ERR(exynos_gem);
 
        exynos_fbdev->exynos_gem = exynos_gem;
 
@@ -173,7 +169,6 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
        if (ret < 0)
                goto err_destroy_framebuffer;
 
-       mutex_unlock(&dev->struct_mutex);
        return ret;
 
 err_destroy_framebuffer:
@@ -181,13 +176,12 @@ err_destroy_framebuffer:
 err_destroy_gem:
        exynos_drm_gem_destroy(exynos_gem);
 
-/*
- * if failed, all resources allocated above would be released by
- * drm_mode_config_cleanup() when drm_load() had been called prior
- * to any specific driver such as fimd or hdmi driver.
- */
-out:
-       mutex_unlock(&dev->struct_mutex);
+       /*
+        * if failed, all resources allocated above would be released by
+        * drm_mode_config_cleanup() when drm_load() had been called prior
+        * to any specific driver such as fimd or hdmi driver.
+        */
+
        return ret;
 }
 
index 018449f8d55750d0546ac0891e78662a67a65ab3..3efe1aa89416701223745cec1ec587fb3ef0e2db 100644 (file)
 /* color key value register for hardware window 1 ~ 4. */
 #define WKEYCON1_BASE(x)               ((WKEYCON1 + 0x140) + ((x - 1) * 8))
 
-/* I80 / RGB trigger control register */
+/* I80 trigger control register */
 #define TRIGCON                                0x1A4
-#define TRGMODE_I80_RGB_ENABLE_I80     (1 << 0)
-#define SWTRGCMD_I80_RGB_ENABLE                (1 << 1)
+#define TRGMODE_ENABLE                 (1 << 0)
+#define SWTRGCMD_ENABLE                        (1 << 1)
+/* Exynos3250, 3472, 4415, 5260 5410, 5420 and 5422 only supported. */
+#define HWTRGEN_ENABLE                 (1 << 3)
+#define HWTRGMASK_ENABLE               (1 << 4)
+/* Exynos3250, 3472, 4415, 5260, 5420 and 5422 only supported. */
+#define HWTRIGEN_PER_ENABLE            (1 << 31)
 
 /* display mode change control register except exynos4 */
 #define VIDOUT_CON                     0x000
 /* FIMD has totally five hardware windows. */
 #define WINDOWS_NR     5
 
+/* HW trigger flag on i80 panel. */
+#define I80_HW_TRG     (1 << 1)
+
 struct fimd_driver_data {
        unsigned int timing_base;
        unsigned int lcdblk_offset;
        unsigned int lcdblk_vt_shift;
        unsigned int lcdblk_bypass_shift;
        unsigned int lcdblk_mic_bypass_shift;
+       unsigned int trg_type;
 
        unsigned int has_shadowcon:1;
        unsigned int has_clksel:1;
@@ -102,20 +111,26 @@ struct fimd_driver_data {
        unsigned int has_vidoutcon:1;
        unsigned int has_vtsel:1;
        unsigned int has_mic_bypass:1;
+       unsigned int has_dp_clk:1;
+       unsigned int has_hw_trigger:1;
+       unsigned int has_trigger_per_te:1;
 };
 
 static struct fimd_driver_data s3c64xx_fimd_driver_data = {
        .timing_base = 0x0,
        .has_clksel = 1,
        .has_limited_fmt = 1,
+       .has_hw_trigger = 1,
 };
 
 static struct fimd_driver_data exynos3_fimd_driver_data = {
        .timing_base = 0x20000,
        .lcdblk_offset = 0x210,
        .lcdblk_bypass_shift = 1,
+       .trg_type = I80_HW_TRG,
        .has_shadowcon = 1,
        .has_vidoutcon = 1,
+       .has_trigger_per_te = 1,
 };
 
 static struct fimd_driver_data exynos4_fimd_driver_data = {
@@ -132,9 +147,11 @@ static struct fimd_driver_data exynos4415_fimd_driver_data = {
        .lcdblk_offset = 0x210,
        .lcdblk_vt_shift = 10,
        .lcdblk_bypass_shift = 1,
+       .trg_type = I80_HW_TRG,
        .has_shadowcon = 1,
        .has_vidoutcon = 1,
        .has_vtsel = 1,
+       .has_trigger_per_te = 1,
 };
 
 static struct fimd_driver_data exynos5_fimd_driver_data = {
@@ -145,6 +162,7 @@ static struct fimd_driver_data exynos5_fimd_driver_data = {
        .has_shadowcon = 1,
        .has_vidoutcon = 1,
        .has_vtsel = 1,
+       .has_dp_clk = 1,
 };
 
 static struct fimd_driver_data exynos5420_fimd_driver_data = {
@@ -153,10 +171,14 @@ static struct fimd_driver_data exynos5420_fimd_driver_data = {
        .lcdblk_vt_shift = 24,
        .lcdblk_bypass_shift = 15,
        .lcdblk_mic_bypass_shift = 11,
+       .trg_type = I80_HW_TRG,
        .has_shadowcon = 1,
        .has_vidoutcon = 1,
        .has_vtsel = 1,
        .has_mic_bypass = 1,
+       .has_dp_clk = 1,
+       .has_hw_trigger = 1,
+       .has_trigger_per_te = 1,
 };
 
 struct fimd_context {
@@ -182,8 +204,9 @@ struct fimd_context {
        atomic_t                        win_updated;
        atomic_t                        triggering;
 
-       struct fimd_driver_data *driver_data;
+       const struct fimd_driver_data *driver_data;
        struct drm_encoder *encoder;
+       struct exynos_drm_clk           dp_clk;
 };
 
 static const struct of_device_id fimd_driver_dt_match[] = {
@@ -219,15 +242,6 @@ static const uint32_t fimd_formats[] = {
        DRM_FORMAT_ARGB8888,
 };
 
-static inline struct fimd_driver_data *drm_fimd_get_driver_data(
-       struct platform_device *pdev)
-{
-       const struct of_device_id *of_id =
-                       of_match_device(fimd_driver_dt_match, &pdev->dev);
-
-       return (struct fimd_driver_data *)of_id->data;
-}
-
 static int fimd_enable_vblank(struct exynos_drm_crtc *crtc)
 {
        struct fimd_context *ctx = crtc->ctx;
@@ -383,9 +397,16 @@ static void fimd_clear_channels(struct exynos_drm_crtc *crtc)
 static u32 fimd_calc_clkdiv(struct fimd_context *ctx,
                const struct drm_display_mode *mode)
 {
-       unsigned long ideal_clk = mode->htotal * mode->vtotal * mode->vrefresh;
+       unsigned long ideal_clk;
        u32 clkdiv;
 
+       if (mode->clock == 0) {
+               DRM_ERROR("Mode has zero clock value.\n");
+               return 0xff;
+       }
+
+       ideal_clk = mode->clock * 1000;
+
        if (ctx->i80_if) {
                /*
                 * The frame done interrupt should be occurred prior to the
@@ -400,11 +421,31 @@ static u32 fimd_calc_clkdiv(struct fimd_context *ctx,
        return (clkdiv < 0x100) ? clkdiv : 0xff;
 }
 
+static void fimd_setup_trigger(struct fimd_context *ctx)
+{
+       void __iomem *timing_base = ctx->regs + ctx->driver_data->timing_base;
+       u32 trg_type = ctx->driver_data->trg_type;
+       u32 val = readl(timing_base + TRIGCON);
+
+       val &= ~(TRGMODE_ENABLE);
+
+       if (trg_type == I80_HW_TRG) {
+               if (ctx->driver_data->has_hw_trigger)
+                       val |= HWTRGEN_ENABLE | HWTRGMASK_ENABLE;
+               if (ctx->driver_data->has_trigger_per_te)
+                       val |= HWTRIGEN_PER_ENABLE;
+       } else {
+               val |= TRGMODE_ENABLE;
+       }
+
+       writel(val, timing_base + TRIGCON);
+}
+
 static void fimd_commit(struct exynos_drm_crtc *crtc)
 {
        struct fimd_context *ctx = crtc->ctx;
        struct drm_display_mode *mode = &crtc->base.state->adjusted_mode;
-       struct fimd_driver_data *driver_data = ctx->driver_data;
+       const struct fimd_driver_data *driver_data = ctx->driver_data;
        void *timing_base = ctx->regs + driver_data->timing_base;
        u32 val, clkdiv;
 
@@ -495,6 +536,8 @@ static void fimd_commit(struct exynos_drm_crtc *crtc)
               VIDTCON2_HOZVAL_E(mode->hdisplay - 1);
        writel(val, ctx->regs + driver_data->timing_base + VIDTCON2);
 
+       fimd_setup_trigger(ctx);
+
        /*
         * fields of register with prefix '_F' would be updated
         * at vsync(same as dma start)
@@ -827,7 +870,7 @@ static void fimd_disable(struct exynos_drm_crtc *crtc)
 static void fimd_trigger(struct device *dev)
 {
        struct fimd_context *ctx = dev_get_drvdata(dev);
-       struct fimd_driver_data *driver_data = ctx->driver_data;
+       const struct fimd_driver_data *driver_data = ctx->driver_data;
        void *timing_base = ctx->regs + driver_data->timing_base;
        u32 reg;
 
@@ -842,7 +885,7 @@ static void fimd_trigger(struct device *dev)
        atomic_set(&ctx->triggering, 1);
 
        reg = readl(timing_base + TRIGCON);
-       reg |= (TRGMODE_I80_RGB_ENABLE_I80 | SWTRGCMD_I80_RGB_ENABLE);
+       reg |= (TRGMODE_ENABLE | SWTRGCMD_ENABLE);
        writel(reg, timing_base + TRIGCON);
 
        /*
@@ -856,11 +899,15 @@ static void fimd_trigger(struct device *dev)
 static void fimd_te_handler(struct exynos_drm_crtc *crtc)
 {
        struct fimd_context *ctx = crtc->ctx;
+       u32 trg_type = ctx->driver_data->trg_type;
 
        /* Checks the crtc is detached already from encoder */
        if (ctx->pipe < 0 || !ctx->drm_dev)
                return;
 
+       if (trg_type == I80_HW_TRG)
+               goto out;
+
        /*
         * If there is a page flip request, triggers and handles the page flip
         * event so that current fb can be updated into panel GRAM.
@@ -868,6 +915,7 @@ static void fimd_te_handler(struct exynos_drm_crtc *crtc)
        if (atomic_add_unless(&ctx->win_updated, -1, 0))
                fimd_trigger(ctx->dev);
 
+out:
        /* Wakes up vsync event queue */
        if (atomic_read(&ctx->wait_vsync_event)) {
                atomic_set(&ctx->wait_vsync_event, 0);
@@ -878,21 +926,11 @@ static void fimd_te_handler(struct exynos_drm_crtc *crtc)
                drm_crtc_handle_vblank(&ctx->crtc->base);
 }
 
-static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable)
+static void fimd_dp_clock_enable(struct exynos_drm_clk *clk, bool enable)
 {
-       struct fimd_context *ctx = crtc->ctx;
-       u32 val;
-
-       /*
-        * Only Exynos 5250, 5260, 5410 and 542x requires enabling DP/MIE
-        * clock. On these SoCs the bootloader may enable it but any
-        * power domain off/on will reset it to disable state.
-        */
-       if (ctx->driver_data != &exynos5_fimd_driver_data &&
-           ctx->driver_data != &exynos5420_fimd_driver_data)
-               return;
-
-       val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE;
+       struct fimd_context *ctx = container_of(clk, struct fimd_context,
+                                               dp_clk);
+       u32 val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE;
        writel(val, ctx->regs + DP_MIE_CLKCON);
 }
 
@@ -902,13 +940,11 @@ static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
        .commit = fimd_commit,
        .enable_vblank = fimd_enable_vblank,
        .disable_vblank = fimd_disable_vblank,
-       .wait_for_vblank = fimd_wait_for_vblank,
        .atomic_begin = fimd_atomic_begin,
        .update_plane = fimd_update_plane,
        .disable_plane = fimd_disable_plane,
        .atomic_flush = fimd_atomic_flush,
        .te_handler = fimd_te_handler,
-       .clock_enable = fimd_dp_clock_enable,
 };
 
 static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
@@ -987,6 +1023,11 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
        if (IS_ERR(ctx->crtc))
                return PTR_ERR(ctx->crtc);
 
+       if (ctx->driver_data->has_dp_clk) {
+               ctx->dp_clk.enable = fimd_dp_clock_enable;
+               ctx->crtc->pipe_clk = &ctx->dp_clk;
+       }
+
        if (ctx->encoder)
                exynos_dpi_bind(drm_dev, ctx->encoder);
 
@@ -1035,7 +1076,7 @@ static int fimd_probe(struct platform_device *pdev)
 
        ctx->dev = dev;
        ctx->suspended = true;
-       ctx->driver_data = drm_fimd_get_driver_data(pdev);
+       ctx->driver_data = of_device_get_match_data(dev);
 
        if (of_property_read_bool(dev->of_node, "samsung,invert-vden"))
                ctx->vidcon1 |= VIDCON1_INV_VDEN;
index 193d3602dffbcccadc2f5994cb48b3a249e2d693..493552368295288c091dff811ab02c7939dac2e0 100644 (file)
@@ -383,8 +383,8 @@ static void g2d_userptr_put_dma_addr(struct drm_device *drm_dev,
                return;
 
 out:
-       exynos_gem_unmap_sgt_from_dma(drm_dev, g2d_userptr->sgt,
-                                       DMA_BIDIRECTIONAL);
+       dma_unmap_sg(to_dma_dev(drm_dev), g2d_userptr->sgt->sgl,
+                       g2d_userptr->sgt->nents, DMA_BIDIRECTIONAL);
 
        pages = frame_vector_pages(g2d_userptr->vec);
        if (!IS_ERR(pages)) {
@@ -501,10 +501,10 @@ static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
 
        g2d_userptr->sgt = sgt;
 
-       ret = exynos_gem_map_sgt_with_dma(drm_dev, g2d_userptr->sgt,
-                                               DMA_BIDIRECTIONAL);
-       if (ret < 0) {
+       if (!dma_map_sg(to_dma_dev(drm_dev), sgt->sgl, sgt->nents,
+                               DMA_BIDIRECTIONAL)) {
                DRM_ERROR("failed to map sgt with dma region.\n");
+               ret = -ENOMEM;
                goto err_sg_free_table;
        }
 
index 2914d62d0d8096a343085cb775b94b7dec1c8d67..cdf9f1af4347e87a0e832168d1e580d9f5968b74 100644 (file)
@@ -177,7 +177,7 @@ unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
        struct exynos_drm_gem *exynos_gem;
        struct drm_gem_object *obj;
 
-       obj = drm_gem_object_lookup(dev, file_priv, gem_handle);
+       obj = drm_gem_object_lookup(file_priv, gem_handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
                return 0;
@@ -296,7 +296,7 @@ dma_addr_t *exynos_drm_gem_get_dma_addr(struct drm_device *dev,
        struct exynos_drm_gem *exynos_gem;
        struct drm_gem_object *obj;
 
-       obj = drm_gem_object_lookup(dev, filp, gem_handle);
+       obj = drm_gem_object_lookup(filp, gem_handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
                return ERR_PTR(-EINVAL);
@@ -313,7 +313,7 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
 {
        struct drm_gem_object *obj;
 
-       obj = drm_gem_object_lookup(dev, filp, gem_handle);
+       obj = drm_gem_object_lookup(filp, gem_handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
                return;
@@ -362,12 +362,9 @@ int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
        struct drm_exynos_gem_info *args = data;
        struct drm_gem_object *obj;
 
-       mutex_lock(&dev->struct_mutex);
-
-       obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
-               mutex_unlock(&dev->struct_mutex);
                return -EINVAL;
        }
 
@@ -376,38 +373,11 @@ int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
        args->flags = exynos_gem->flags;
        args->size = exynos_gem->size;
 
-       drm_gem_object_unreference(obj);
-       mutex_unlock(&dev->struct_mutex);
-
-       return 0;
-}
-
-int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev,
-                               struct sg_table *sgt,
-                               enum dma_data_direction dir)
-{
-       int nents;
-
-       mutex_lock(&drm_dev->struct_mutex);
-
-       nents = dma_map_sg(to_dma_dev(drm_dev), sgt->sgl, sgt->nents, dir);
-       if (!nents) {
-               DRM_ERROR("failed to map sgl with dma.\n");
-               mutex_unlock(&drm_dev->struct_mutex);
-               return nents;
-       }
+       drm_gem_object_unreference_unlocked(obj);
 
-       mutex_unlock(&drm_dev->struct_mutex);
        return 0;
 }
 
-void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev,
-                               struct sg_table *sgt,
-                               enum dma_data_direction dir)
-{
-       dma_unmap_sg(to_dma_dev(drm_dev), sgt->sgl, sgt->nents, dir);
-}
-
 void exynos_drm_gem_free_object(struct drm_gem_object *obj)
 {
        exynos_drm_gem_destroy(to_exynos_gem(obj));
@@ -458,27 +428,22 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
        struct drm_gem_object *obj;
        int ret = 0;
 
-       mutex_lock(&dev->struct_mutex);
-
        /*
         * get offset of memory allocated for drm framebuffer.
         * - this callback would be called by user application
         *      with DRM_IOCTL_MODE_MAP_DUMB command.
         */
 
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
-               ret = -EINVAL;
-               goto unlock;
+               return -EINVAL;
        }
 
        *offset = drm_vma_node_offset_addr(&obj->vma_node);
        DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset);
 
-       drm_gem_object_unreference(obj);
-unlock:
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(obj);
        return ret;
 }
 
@@ -516,22 +481,12 @@ out:
        }
 }
 
-int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
+static int exynos_drm_gem_mmap_obj(struct drm_gem_object *obj,
+                                  struct vm_area_struct *vma)
 {
-       struct exynos_drm_gem *exynos_gem;
-       struct drm_gem_object *obj;
+       struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj);
        int ret;
 
-       /* set vm_area_struct. */
-       ret = drm_gem_mmap(filp, vma);
-       if (ret < 0) {
-               DRM_ERROR("failed to mmap.\n");
-               return ret;
-       }
-
-       obj = vma->vm_private_data;
-       exynos_gem = to_exynos_gem(obj);
-
        DRM_DEBUG_KMS("flags = 0x%x\n", exynos_gem->flags);
 
        /* non-cachable as default. */
@@ -556,6 +511,26 @@ err_close_vm:
        return ret;
 }
 
+int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       struct drm_gem_object *obj;
+       int ret;
+
+       /* set vm_area_struct. */
+       ret = drm_gem_mmap(filp, vma);
+       if (ret < 0) {
+               DRM_ERROR("failed to mmap.\n");
+               return ret;
+       }
+
+       obj = vma->vm_private_data;
+
+       if (obj->import_attach)
+               return dma_buf_mmap(obj->dma_buf, vma, 0);
+
+       return exynos_drm_gem_mmap_obj(obj, vma);
+}
+
 /* low-level interface prime helpers */
 struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj)
 {
@@ -630,3 +605,15 @@ void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
 {
        /* Nothing to do */
 }
+
+int exynos_drm_gem_prime_mmap(struct drm_gem_object *obj,
+                             struct vm_area_struct *vma)
+{
+       int ret;
+
+       ret = drm_gem_mmap_obj(obj, obj->size, vma);
+       if (ret < 0)
+               return ret;
+
+       return exynos_drm_gem_mmap_obj(obj, vma);
+}
index 00223052b87bb420ac97b6a331890922e4e7858e..78100742281d44c6a11ab64ddb7f090361924a30 100644 (file)
@@ -121,16 +121,6 @@ int exynos_drm_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
 /* set vm_flags and we can change the vm attribute to other one at here. */
 int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
 
-/* map sgt with dma region. */
-int exynos_gem_map_sgt_with_dma(struct drm_device *drm_dev,
-                               struct sg_table *sgt,
-                               enum dma_data_direction dir);
-
-/* unmap sgt from dma region. */
-void exynos_gem_unmap_sgt_from_dma(struct drm_device *drm_dev,
-                               struct sg_table *sgt,
-                               enum dma_data_direction dir);
-
 /* low-level interface prime helpers */
 struct sg_table *exynos_drm_gem_prime_get_sg_table(struct drm_gem_object *obj);
 struct drm_gem_object *
@@ -139,5 +129,7 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
                                     struct sg_table *sgt);
 void *exynos_drm_gem_prime_vmap(struct drm_gem_object *obj);
 void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
+int exynos_drm_gem_prime_mmap(struct drm_gem_object *obj,
+                             struct vm_area_struct *vma);
 
 #endif
index 50185ac347b24352202b7d38b314222438ca9b20..55f1d37c666a9cde7d2fd9d92322fc31f3294a5c 100644 (file)
@@ -166,7 +166,7 @@ static void exynos_drm_plane_destroy_state(struct drm_plane *plane,
 {
        struct exynos_drm_plane_state *old_exynos_state =
                                        to_exynos_plane_state(old_state);
-       __drm_atomic_helper_plane_destroy_state(plane, old_state);
+       __drm_atomic_helper_plane_destroy_state(old_state);
        kfree(old_exynos_state);
 }
 
index f18fbe43f55f2cf23c9b1b3b2f44f7826b380bc0..404367a430b54ffc6d9bab0d73b8f3427ee8e2f5 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
+#include <linux/of_device.h>
 #include <linux/pm_runtime.h>
 
 #include <drm/drmP.h>
@@ -696,7 +697,6 @@ static int rotator_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct rot_context *rot;
        struct exynos_drm_ippdrv *ippdrv;
-       const struct of_device_id *match;
        int ret;
 
        if (!dev->of_node) {
@@ -708,13 +708,8 @@ static int rotator_probe(struct platform_device *pdev)
        if (!rot)
                return -ENOMEM;
 
-       match = of_match_node(exynos_rotator_match, dev->of_node);
-       if (!match) {
-               dev_err(dev, "failed to match node\n");
-               return -ENODEV;
-       }
-       rot->limit_tbl = (struct rot_limit_table *)match->data;
-
+       rot->limit_tbl = (struct rot_limit_table *)
+                               of_device_get_match_data(dev);
        rot->regs_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        rot->regs = devm_ioremap_resource(dev, rot->regs_res);
        if (IS_ERR(rot->regs))
index e148d728e28c3231c9e9b07abda958fe19df649a..58de5a4305080bfe3ec15b02c6684b4b2ee19848 100644 (file)
@@ -7,9 +7,9 @@
  *
  * Based on drivers/media/video/s5p-tv/hdmi_drv.c
  *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
  * option) any later version.
  *
  */
 
 /* AVI header and aspect ratio */
 #define HDMI_AVI_VERSION               0x02
-#define HDMI_AVI_LENGTH                0x0D
+#define HDMI_AVI_LENGTH                        0x0d
 
 /* AUI header info */
-#define HDMI_AUI_VERSION       0x01
-#define HDMI_AUI_LENGTH        0x0A
-#define AVI_SAME_AS_PIC_ASPECT_RATIO 0x8
-#define AVI_4_3_CENTER_RATIO   0x9
-#define AVI_16_9_CENTER_RATIO  0xa
+#define HDMI_AUI_VERSION               0x01
+#define HDMI_AUI_LENGTH                        0x0a
+
+/* AVI active format aspect ratio */
+#define AVI_SAME_AS_PIC_ASPECT_RATIO   0x08
+#define AVI_4_3_CENTER_RATIO           0x09
+#define AVI_16_9_CENTER_RATIO          0x0a
 
 enum hdmi_type {
        HDMI_TYPE13,
@@ -90,11 +92,34 @@ static const char * const supply[] = {
        "vdd_pll",
 };
 
+struct hdmiphy_config {
+       int pixel_clock;
+       u8 conf[32];
+};
+
+struct hdmiphy_configs {
+       int count;
+       const struct hdmiphy_config *data;
+};
+
+struct string_array_spec {
+       int count;
+       const char * const *data;
+};
+
+#define INIT_ARRAY_SPEC(a) { .count = ARRAY_SIZE(a), .data = a }
+
 struct hdmi_driver_data {
        unsigned int type;
-       const struct hdmiphy_config *phy_confs;
-       unsigned int phy_conf_count;
        unsigned int is_apb_phy:1;
+       unsigned int has_sysreg:1;
+       struct hdmiphy_configs phy_confs;
+       struct string_array_spec clk_gates;
+       /*
+        * Array of triplets (p_off, p_on, clock), where p_off and p_on are
+        * required parents of clock when HDMI-PHY is respectively off or on.
+        */
+       struct string_array_spec clk_muxes;
 };
 
 struct hdmi_context {
@@ -116,13 +141,12 @@ struct hdmi_context {
        struct gpio_desc                *hpd_gpio;
        int                             irq;
        struct regmap                   *pmureg;
-       struct clk                      *hdmi;
-       struct clk                      *sclk_hdmi;
-       struct clk                      *sclk_pixel;
-       struct clk                      *sclk_hdmiphy;
-       struct clk                      *mout_hdmi;
+       struct regmap                   *sysreg;
+       struct clk                      **clk_gates;
+       struct clk                      **clk_muxes;
        struct regulator_bulk_data      regul_bulk[ARRAY_SIZE(supply)];
        struct regulator                *reg_hdmi_en;
+       struct exynos_drm_clk           phy_clk;
 };
 
 static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e)
@@ -135,12 +159,6 @@ static inline struct hdmi_context *connector_to_hdmi(struct drm_connector *c)
        return container_of(c, struct hdmi_context, connector);
 }
 
-struct hdmiphy_config {
-       int pixel_clock;
-       u8 conf[32];
-};
-
-/* list of phy config settings */
 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
        {
                .pixel_clock = 27000000,
@@ -501,25 +519,136 @@ static const struct hdmiphy_config hdmiphy_5420_configs[] = {
        },
 };
 
-static struct hdmi_driver_data exynos5420_hdmi_driver_data = {
+static const struct hdmiphy_config hdmiphy_5433_configs[] = {
+       {
+               .pixel_clock = 27000000,
+               .conf = {
+                       0x01, 0x51, 0x22, 0x51, 0x08, 0xfc, 0x88, 0x46,
+                       0x72, 0x50, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
+                       0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 27027000,
+               .conf = {
+                       0x01, 0x51, 0x2d, 0x72, 0x64, 0x09, 0x88, 0xc3,
+                       0x71, 0x50, 0x24, 0x14, 0x24, 0x0f, 0x7c, 0xa5,
+                       0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x28, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 40000000,
+               .conf = {
+                       0x01, 0x51, 0x32, 0x55, 0x01, 0x00, 0x88, 0x02,
+                       0x4d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 50000000,
+               .conf = {
+                       0x01, 0x51, 0x34, 0x40, 0x64, 0x09, 0x88, 0xc3,
+                       0x3d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 65000000,
+               .conf = {
+                       0x01, 0x51, 0x36, 0x31, 0x40, 0x10, 0x04, 0xc6,
+                       0x2e, 0xe8, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 74176000,
+               .conf = {
+                       0x01, 0x51, 0x3E, 0x35, 0x5B, 0xDE, 0x88, 0x42,
+                       0x53, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 74250000,
+               .conf = {
+                       0x01, 0x51, 0x3E, 0x35, 0x40, 0xF0, 0x88, 0xC2,
+                       0x52, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 108000000,
+               .conf = {
+                       0x01, 0x51, 0x2d, 0x15, 0x01, 0x00, 0x88, 0x02,
+                       0x72, 0x52, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
+                       0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
+               },
+       },
+       {
+               .pixel_clock = 148500000,
+               .conf = {
+                       0x01, 0x51, 0x1f, 0x00, 0x40, 0xf8, 0x88, 0xc1,
+                       0x52, 0x52, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
+                       0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
+                       0x08, 0x10, 0x01, 0x01, 0x48, 0x4a, 0x00, 0x40,
+               },
+       },
+};
+
+static const char * const hdmi_clk_gates4[] = {
+       "hdmi", "sclk_hdmi"
+};
+
+static const char * const hdmi_clk_muxes4[] = {
+       "sclk_pixel", "sclk_hdmiphy", "mout_hdmi"
+};
+
+static const char * const hdmi_clk_gates5433[] = {
+       "hdmi_pclk", "hdmi_i_pclk", "i_tmds_clk", "i_pixel_clk", "i_spdif_clk"
+};
+
+static const char * const hdmi_clk_muxes5433[] = {
+       "oscclk", "tmds_clko", "tmds_clko_user",
+       "oscclk", "pixel_clko", "pixel_clko_user"
+};
+
+static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
+       .type           = HDMI_TYPE13,
+       .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_v13_configs),
+       .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
+       .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
+};
+
+static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
        .type           = HDMI_TYPE14,
-       .phy_confs      = hdmiphy_5420_configs,
-       .phy_conf_count = ARRAY_SIZE(hdmiphy_5420_configs),
-       .is_apb_phy     = 1,
+       .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_v14_configs),
+       .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
+       .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
 };
 
-static struct hdmi_driver_data exynos4212_hdmi_driver_data = {
+static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
        .type           = HDMI_TYPE14,
-       .phy_confs      = hdmiphy_v14_configs,
-       .phy_conf_count = ARRAY_SIZE(hdmiphy_v14_configs),
-       .is_apb_phy     = 0,
+       .is_apb_phy     = 1,
+       .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_5420_configs),
+       .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
+       .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
 };
 
-static struct hdmi_driver_data exynos4210_hdmi_driver_data = {
-       .type           = HDMI_TYPE13,
-       .phy_confs      = hdmiphy_v13_configs,
-       .phy_conf_count = ARRAY_SIZE(hdmiphy_v13_configs),
-       .is_apb_phy     = 0,
+static const struct hdmi_driver_data exynos5433_hdmi_driver_data = {
+       .type           = HDMI_TYPE14,
+       .is_apb_phy     = 1,
+       .has_sysreg     = 1,
+       .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_5433_configs),
+       .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates5433),
+       .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes5433),
 };
 
 static inline u32 hdmi_map_reg(struct hdmi_context *hdata, u32 reg_id)
@@ -585,266 +714,52 @@ static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
        }
 }
 
-static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
+static int hdmi_clk_enable_gates(struct hdmi_context *hdata)
 {
-#define DUMPREG(reg_id) \
-       DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
-       readl(hdata->regs + reg_id))
-       DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_INTC_FLAG);
-       DUMPREG(HDMI_INTC_CON);
-       DUMPREG(HDMI_HPD_STATUS);
-       DUMPREG(HDMI_V13_PHY_RSTOUT);
-       DUMPREG(HDMI_V13_PHY_VPLL);
-       DUMPREG(HDMI_V13_PHY_CMU);
-       DUMPREG(HDMI_V13_CORE_RSTOUT);
-
-       DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_CON_0);
-       DUMPREG(HDMI_CON_1);
-       DUMPREG(HDMI_CON_2);
-       DUMPREG(HDMI_SYS_STATUS);
-       DUMPREG(HDMI_V13_PHY_STATUS);
-       DUMPREG(HDMI_STATUS_EN);
-       DUMPREG(HDMI_HPD);
-       DUMPREG(HDMI_MODE_SEL);
-       DUMPREG(HDMI_V13_HPD_GEN);
-       DUMPREG(HDMI_V13_DC_CONTROL);
-       DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
-
-       DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_H_BLANK_0);
-       DUMPREG(HDMI_H_BLANK_1);
-       DUMPREG(HDMI_V13_V_BLANK_0);
-       DUMPREG(HDMI_V13_V_BLANK_1);
-       DUMPREG(HDMI_V13_V_BLANK_2);
-       DUMPREG(HDMI_V13_H_V_LINE_0);
-       DUMPREG(HDMI_V13_H_V_LINE_1);
-       DUMPREG(HDMI_V13_H_V_LINE_2);
-       DUMPREG(HDMI_VSYNC_POL);
-       DUMPREG(HDMI_INT_PRO_MODE);
-       DUMPREG(HDMI_V13_V_BLANK_F_0);
-       DUMPREG(HDMI_V13_V_BLANK_F_1);
-       DUMPREG(HDMI_V13_V_BLANK_F_2);
-       DUMPREG(HDMI_V13_H_SYNC_GEN_0);
-       DUMPREG(HDMI_V13_H_SYNC_GEN_1);
-       DUMPREG(HDMI_V13_H_SYNC_GEN_2);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
-       DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
-
-       DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_TG_CMD);
-       DUMPREG(HDMI_TG_H_FSZ_L);
-       DUMPREG(HDMI_TG_H_FSZ_H);
-       DUMPREG(HDMI_TG_HACT_ST_L);
-       DUMPREG(HDMI_TG_HACT_ST_H);
-       DUMPREG(HDMI_TG_HACT_SZ_L);
-       DUMPREG(HDMI_TG_HACT_SZ_H);
-       DUMPREG(HDMI_TG_V_FSZ_L);
-       DUMPREG(HDMI_TG_V_FSZ_H);
-       DUMPREG(HDMI_TG_VSYNC_L);
-       DUMPREG(HDMI_TG_VSYNC_H);
-       DUMPREG(HDMI_TG_VSYNC2_L);
-       DUMPREG(HDMI_TG_VSYNC2_H);
-       DUMPREG(HDMI_TG_VACT_ST_L);
-       DUMPREG(HDMI_TG_VACT_ST_H);
-       DUMPREG(HDMI_TG_VACT_SZ_L);
-       DUMPREG(HDMI_TG_VACT_SZ_H);
-       DUMPREG(HDMI_TG_FIELD_CHG_L);
-       DUMPREG(HDMI_TG_FIELD_CHG_H);
-       DUMPREG(HDMI_TG_VACT_ST2_L);
-       DUMPREG(HDMI_TG_VACT_ST2_H);
-       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
-       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
-       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
-       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
-       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
-       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
-       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
-       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
-#undef DUMPREG
+       int i, ret;
+
+       for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) {
+               ret = clk_prepare_enable(hdata->clk_gates[i]);
+               if (!ret)
+                       continue;
+
+               dev_err(hdata->dev, "Cannot enable clock '%s', %d\n",
+                       hdata->drv_data->clk_gates.data[i], ret);
+               while (i--)
+                       clk_disable_unprepare(hdata->clk_gates[i]);
+               return ret;
+       }
+
+       return 0;
 }
 
-static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
+static void hdmi_clk_disable_gates(struct hdmi_context *hdata)
 {
-       int i;
+       int i = hdata->drv_data->clk_gates.count;
 
-#define DUMPREG(reg_id) \
-       DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
-       readl(hdata->regs + reg_id))
-
-       DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_INTC_CON);
-       DUMPREG(HDMI_INTC_FLAG);
-       DUMPREG(HDMI_HPD_STATUS);
-       DUMPREG(HDMI_INTC_CON_1);
-       DUMPREG(HDMI_INTC_FLAG_1);
-       DUMPREG(HDMI_PHY_STATUS_0);
-       DUMPREG(HDMI_PHY_STATUS_PLL);
-       DUMPREG(HDMI_PHY_CON_0);
-       DUMPREG(HDMI_V14_PHY_RSTOUT);
-       DUMPREG(HDMI_PHY_VPLL);
-       DUMPREG(HDMI_PHY_CMU);
-       DUMPREG(HDMI_CORE_RSTOUT);
-
-       DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_CON_0);
-       DUMPREG(HDMI_CON_1);
-       DUMPREG(HDMI_CON_2);
-       DUMPREG(HDMI_SYS_STATUS);
-       DUMPREG(HDMI_PHY_STATUS_0);
-       DUMPREG(HDMI_STATUS_EN);
-       DUMPREG(HDMI_HPD);
-       DUMPREG(HDMI_MODE_SEL);
-       DUMPREG(HDMI_ENC_EN);
-       DUMPREG(HDMI_DC_CONTROL);
-       DUMPREG(HDMI_VIDEO_PATTERN_GEN);
-
-       DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_H_BLANK_0);
-       DUMPREG(HDMI_H_BLANK_1);
-       DUMPREG(HDMI_V2_BLANK_0);
-       DUMPREG(HDMI_V2_BLANK_1);
-       DUMPREG(HDMI_V1_BLANK_0);
-       DUMPREG(HDMI_V1_BLANK_1);
-       DUMPREG(HDMI_V_LINE_0);
-       DUMPREG(HDMI_V_LINE_1);
-       DUMPREG(HDMI_H_LINE_0);
-       DUMPREG(HDMI_H_LINE_1);
-       DUMPREG(HDMI_HSYNC_POL);
-
-       DUMPREG(HDMI_VSYNC_POL);
-       DUMPREG(HDMI_INT_PRO_MODE);
-       DUMPREG(HDMI_V_BLANK_F0_0);
-       DUMPREG(HDMI_V_BLANK_F0_1);
-       DUMPREG(HDMI_V_BLANK_F1_0);
-       DUMPREG(HDMI_V_BLANK_F1_1);
-
-       DUMPREG(HDMI_H_SYNC_START_0);
-       DUMPREG(HDMI_H_SYNC_START_1);
-       DUMPREG(HDMI_H_SYNC_END_0);
-       DUMPREG(HDMI_H_SYNC_END_1);
-
-       DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
-       DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
-       DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
-       DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
-
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
-
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
-
-       DUMPREG(HDMI_V_BLANK_F2_0);
-       DUMPREG(HDMI_V_BLANK_F2_1);
-       DUMPREG(HDMI_V_BLANK_F3_0);
-       DUMPREG(HDMI_V_BLANK_F3_1);
-       DUMPREG(HDMI_V_BLANK_F4_0);
-       DUMPREG(HDMI_V_BLANK_F4_1);
-       DUMPREG(HDMI_V_BLANK_F5_0);
-       DUMPREG(HDMI_V_BLANK_F5_1);
-
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
-
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
-       DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
-
-       DUMPREG(HDMI_VACT_SPACE_1_0);
-       DUMPREG(HDMI_VACT_SPACE_1_1);
-       DUMPREG(HDMI_VACT_SPACE_2_0);
-       DUMPREG(HDMI_VACT_SPACE_2_1);
-       DUMPREG(HDMI_VACT_SPACE_3_0);
-       DUMPREG(HDMI_VACT_SPACE_3_1);
-       DUMPREG(HDMI_VACT_SPACE_4_0);
-       DUMPREG(HDMI_VACT_SPACE_4_1);
-       DUMPREG(HDMI_VACT_SPACE_5_0);
-       DUMPREG(HDMI_VACT_SPACE_5_1);
-       DUMPREG(HDMI_VACT_SPACE_6_0);
-       DUMPREG(HDMI_VACT_SPACE_6_1);
-
-       DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_TG_CMD);
-       DUMPREG(HDMI_TG_H_FSZ_L);
-       DUMPREG(HDMI_TG_H_FSZ_H);
-       DUMPREG(HDMI_TG_HACT_ST_L);
-       DUMPREG(HDMI_TG_HACT_ST_H);
-       DUMPREG(HDMI_TG_HACT_SZ_L);
-       DUMPREG(HDMI_TG_HACT_SZ_H);
-       DUMPREG(HDMI_TG_V_FSZ_L);
-       DUMPREG(HDMI_TG_V_FSZ_H);
-       DUMPREG(HDMI_TG_VSYNC_L);
-       DUMPREG(HDMI_TG_VSYNC_H);
-       DUMPREG(HDMI_TG_VSYNC2_L);
-       DUMPREG(HDMI_TG_VSYNC2_H);
-       DUMPREG(HDMI_TG_VACT_ST_L);
-       DUMPREG(HDMI_TG_VACT_ST_H);
-       DUMPREG(HDMI_TG_VACT_SZ_L);
-       DUMPREG(HDMI_TG_VACT_SZ_H);
-       DUMPREG(HDMI_TG_FIELD_CHG_L);
-       DUMPREG(HDMI_TG_FIELD_CHG_H);
-       DUMPREG(HDMI_TG_VACT_ST2_L);
-       DUMPREG(HDMI_TG_VACT_ST2_H);
-       DUMPREG(HDMI_TG_VACT_ST3_L);
-       DUMPREG(HDMI_TG_VACT_ST3_H);
-       DUMPREG(HDMI_TG_VACT_ST4_L);
-       DUMPREG(HDMI_TG_VACT_ST4_H);
-       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
-       DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
-       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
-       DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
-       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
-       DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
-       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
-       DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
-       DUMPREG(HDMI_TG_3D);
-
-       DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
-       DUMPREG(HDMI_AVI_CON);
-       DUMPREG(HDMI_AVI_HEADER0);
-       DUMPREG(HDMI_AVI_HEADER1);
-       DUMPREG(HDMI_AVI_HEADER2);
-       DUMPREG(HDMI_AVI_CHECK_SUM);
-       DUMPREG(HDMI_VSI_CON);
-       DUMPREG(HDMI_VSI_HEADER0);
-       DUMPREG(HDMI_VSI_HEADER1);
-       DUMPREG(HDMI_VSI_HEADER2);
-       for (i = 0; i < 7; ++i)
-               DUMPREG(HDMI_VSI_DATA(i));
-
-#undef DUMPREG
+       while (i--)
+               clk_disable_unprepare(hdata->clk_gates[i]);
 }
 
-static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
+static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy)
 {
-       if (hdata->drv_data->type == HDMI_TYPE13)
-               hdmi_v13_regs_dump(hdata, prefix);
-       else
-               hdmi_v14_regs_dump(hdata, prefix);
+       struct device *dev = hdata->dev;
+       int ret = 0;
+       int i;
+
+       for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) {
+               struct clk **c = &hdata->clk_muxes[i];
+
+               ret = clk_set_parent(c[2], c[to_phy]);
+               if (!ret)
+                       continue;
+
+               dev_err(dev, "Cannot set clock parent of '%s' to '%s', %d\n",
+                       hdata->drv_data->clk_muxes.data[i + 2],
+                       hdata->drv_data->clk_muxes.data[i + to_phy], ret);
+       }
+
+       return ret;
 }
 
 static u8 hdmi_chksum(struct hdmi_context *hdata,
@@ -993,10 +908,11 @@ static int hdmi_get_modes(struct drm_connector *connector)
 
 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
 {
+       const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs;
        int i;
 
-       for (i = 0; i < hdata->drv_data->phy_conf_count; i++)
-               if (hdata->drv_data->phy_confs[i].pixel_clock == pixel_clock)
+       for (i = 0; i < confs->count; i++)
+               if (confs->data[i].pixel_clock == pixel_clock)
                        return i;
 
        DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
@@ -1078,13 +994,11 @@ static bool hdmi_mode_fixup(struct drm_encoder *encoder,
 
        mode_ok = hdmi_mode_valid(connector, adjusted_mode);
 
-       /* just return if user desired mode exists. */
        if (mode_ok == MODE_OK)
                return true;
 
        /*
-        * otherwise, find the most suitable mode among modes and change it
-        * to adjusted_mode.
+        * Find the most suitable mode and copy it to adjusted_mode.
         */
        list_for_each_entry(m, &connector->modes, head) {
                mode_ok = hdmi_mode_valid(connector, m);
@@ -1129,15 +1043,15 @@ static void hdmi_audio_init(struct hdmi_context *hdata)
        switch (bits_per_sample) {
        case 20:
                data_num = 2;
-               bit_ch  = 1;
+               bit_ch = 1;
                break;
        case 24:
                data_num = 3;
-               bit_ch  = 1;
+               bit_ch = 1;
                break;
        default:
                data_num = 1;
-               bit_ch  = 0;
+               bit_ch = 0;
                break;
        }
 
@@ -1230,13 +1144,12 @@ static void hdmi_conf_init(struct hdmi_context *hdata)
        /* choose HDMI mode */
        hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
                HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
-       /* Apply Video preable and Guard band in HDMI mode only */
+       /* apply video pre-amble and guard band in HDMI mode only */
        hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
        /* disable bluescreen */
        hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
 
        if (hdata->dvi_mode) {
-               /* choose DVI mode */
                hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
                                HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
                hdmi_reg_writeb(hdata, HDMI_CON_2,
@@ -1308,7 +1221,7 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
 
        val = (m->hsync_start - m->hdisplay - 2);
        val |= ((m->hsync_end - m->hdisplay - 2) << 10);
-       val |= ((m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0)<<20;
+       val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
        hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val);
 
        /*
@@ -1319,7 +1232,6 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
 
        /* Following values & calculations differ for different type of modes */
        if (m->flags & DRM_MODE_FLAG_INTERLACE) {
-               /* Interlaced Mode */
                val = ((m->vsync_end - m->vdisplay) / 2);
                val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
                hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
@@ -1348,8 +1260,6 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
 
                hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249);
        } else {
-               /* Progressive Mode */
-
                val = m->vtotal;
                val |= (m->vtotal - m->vdisplay) << 11;
                hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
@@ -1365,21 +1275,12 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
                hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
                                m->vtotal - m->vdisplay);
                hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
-               hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x248);
        }
 
-       /* Timing generator registers */
        hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
        hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
        hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
        hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2, 0x233);
-       hdmi_reg_writev(hdata, HDMI_TG_FIELD_CHG_L, 2, 0x233);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2, 0x233);
-       hdmi_reg_writev(hdata, HDMI_TG_FIELD_TOP_HDMI_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2, 0x233);
 }
 
 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
@@ -1390,7 +1291,7 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
        hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal);
        hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal);
        hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1,
-                       (m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0);
+                       (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
        hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1,
                        (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
        hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1,
@@ -1404,7 +1305,6 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
 
        /* Following values & calculations differ for different type of modes */
        if (m->flags & DRM_MODE_FLAG_INTERLACE) {
-               /* Interlaced Mode */
                hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
                        (m->vsync_end - m->vdisplay) / 2);
                hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
@@ -1437,7 +1337,6 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
                hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0);
                hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0);
        } else {
-               /* Progressive Mode */
                hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
                        m->vsync_end - m->vdisplay);
                hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
@@ -1454,15 +1353,8 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
                hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
                                m->vtotal - m->vdisplay);
                hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
-               hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x248);
-               hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x47b);
-               hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x6ae);
-               hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2, 0x233);
-               hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2, 0x233);
-               hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2, 0x233);
        }
 
-       /* Following values & calculations are same irrespective of mode type */
        hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2,
                        m->hsync_start - m->hdisplay - 2);
        hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2,
@@ -1486,16 +1378,12 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
        hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff);
        hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff);
 
-       /* Timing generator registers */
        hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
        hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
        hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
        hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_FIELD_CHG_L, 2, 0x233);
-       hdmi_reg_writev(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_FIELD_TOP_HDMI_L, 2, 0x1);
-       hdmi_reg_writev(hdata, HDMI_TG_3D, 1, 0x0);
+       if (hdata->drv_data == &exynos5433_hdmi_driver_data)
+               hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1);
 }
 
 static void hdmi_mode_apply(struct hdmi_context *hdata)
@@ -1505,62 +1393,64 @@ static void hdmi_mode_apply(struct hdmi_context *hdata)
        else
                hdmi_v14_mode_apply(hdata);
 
-       hdmiphy_wait_for_pll(hdata);
-
-       clk_set_parent(hdata->mout_hdmi, hdata->sclk_hdmiphy);
-
-       /* enable HDMI and timing generator */
        hdmi_start(hdata, true);
 }
 
 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
 {
-       clk_set_parent(hdata->mout_hdmi, hdata->sclk_pixel);
-
-       /* reset hdmiphy */
+       hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, 0, 1);
+       usleep_range(10000, 12000);
+       hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, 1);
+       usleep_range(10000, 12000);
        hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
        usleep_range(10000, 12000);
-       hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT,  0, HDMI_PHY_SW_RSTOUT);
+       hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT);
        usleep_range(10000, 12000);
 }
 
+static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable)
+{
+       u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET;
+
+       if (hdata->drv_data == &exynos5433_hdmi_driver_data)
+               writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE);
+}
+
 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
 {
        int ret;
-       int i;
+       const u8 *phy_conf;
 
-       /* pixel clock */
-       i = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000);
-       if (i < 0) {
+       ret = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000);
+       if (ret < 0) {
                DRM_ERROR("failed to find hdmiphy conf\n");
                return;
        }
+       phy_conf = hdata->drv_data->phy_confs.data[ret].conf;
+
+       hdmi_clk_set_parents(hdata, false);
+
+       hdmiphy_conf_reset(hdata);
 
-       ret = hdmiphy_reg_write_buf(hdata, 0,
-                       hdata->drv_data->phy_confs[i].conf, 32);
+       hdmiphy_enable_mode_set(hdata, true);
+       ret = hdmiphy_reg_write_buf(hdata, 0, phy_conf, 32);
        if (ret) {
                DRM_ERROR("failed to configure hdmiphy\n");
                return;
        }
-
+       hdmiphy_enable_mode_set(hdata, false);
+       hdmi_clk_set_parents(hdata, true);
        usleep_range(10000, 12000);
+       hdmiphy_wait_for_pll(hdata);
 }
 
 static void hdmi_conf_apply(struct hdmi_context *hdata)
 {
-       hdmiphy_conf_reset(hdata);
-       hdmiphy_conf_apply(hdata);
-
        hdmi_start(hdata, false);
        hdmi_conf_init(hdata);
-
        hdmi_audio_init(hdata);
-
-       /* setting core registers */
        hdmi_mode_apply(hdata);
        hdmi_audio_control(hdata, true);
-
-       hdmi_regs_dump(hdata, "start");
 }
 
 static void hdmi_mode_set(struct drm_encoder *encoder,
@@ -1579,10 +1469,17 @@ static void hdmi_mode_set(struct drm_encoder *encoder,
        hdata->cea_video_id = drm_match_cea_mode(mode);
 }
 
-static void hdmi_enable(struct drm_encoder *encoder)
+static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
 {
-       struct hdmi_context *hdata = encoder_to_hdmi(encoder);
+       if (!hdata->sysreg)
+               return;
 
+       regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY,
+                          SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0);
+}
+
+static void hdmiphy_enable(struct hdmi_context *hdata)
+{
        if (hdata->powered)
                return;
 
@@ -1591,15 +1488,47 @@ static void hdmi_enable(struct drm_encoder *encoder)
        if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk))
                DRM_DEBUG_KMS("failed to enable regulator bulk\n");
 
-       /* set pmu hdmiphy control bit to enable hdmiphy */
        regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
                        PMU_HDMI_PHY_ENABLE_BIT, 1);
 
-       hdmi_conf_apply(hdata);
+       hdmi_set_refclk(hdata, true);
+
+       hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0, HDMI_PHY_POWER_OFF_EN);
+
+       hdmiphy_conf_apply(hdata);
 
        hdata->powered = true;
 }
 
+static void hdmiphy_disable(struct hdmi_context *hdata)
+{
+       if (!hdata->powered)
+               return;
+
+       hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
+
+       hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0, HDMI_PHY_POWER_OFF_EN);
+
+       hdmi_set_refclk(hdata, false);
+
+       regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
+                       PMU_HDMI_PHY_ENABLE_BIT, 0);
+
+       regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
+
+       pm_runtime_put_sync(hdata->dev);
+
+       hdata->powered = false;
+}
+
+static void hdmi_enable(struct drm_encoder *encoder)
+{
+       struct hdmi_context *hdata = encoder_to_hdmi(encoder);
+
+       hdmiphy_enable(hdata);
+       hdmi_conf_apply(hdata);
+}
+
 static void hdmi_disable(struct drm_encoder *encoder)
 {
        struct hdmi_context *hdata = encoder_to_hdmi(encoder);
@@ -1623,20 +1552,9 @@ static void hdmi_disable(struct drm_encoder *encoder)
        if (funcs && funcs->disable)
                (*funcs->disable)(crtc);
 
-       /* HDMI System Disable */
-       hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
-
        cancel_delayed_work(&hdata->hotplug_work);
 
-       /* reset pmu hdmiphy control bit to disable hdmiphy */
-       regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
-                       PMU_HDMI_PHY_ENABLE_BIT, 0);
-
-       regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
-
-       pm_runtime_put_sync(hdata->dev);
-
-       hdata->powered = false;
+       hdmiphy_disable(hdata);
 }
 
 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
@@ -1670,6 +1588,68 @@ static irqreturn_t hdmi_irq_thread(int irq, void *arg)
        return IRQ_HANDLED;
 }
 
+static int hdmi_clks_get(struct hdmi_context *hdata,
+                        const struct string_array_spec *names,
+                        struct clk **clks)
+{
+       struct device *dev = hdata->dev;
+       int i;
+
+       for (i = 0; i < names->count; ++i) {
+               struct clk *clk = devm_clk_get(dev, names->data[i]);
+
+               if (IS_ERR(clk)) {
+                       int ret = PTR_ERR(clk);
+
+                       dev_err(dev, "Cannot get clock %s, %d\n",
+                               names->data[i], ret);
+
+                       return ret;
+               }
+
+               clks[i] = clk;
+       }
+
+       return 0;
+}
+
+static int hdmi_clk_init(struct hdmi_context *hdata)
+{
+       const struct hdmi_driver_data *drv_data = hdata->drv_data;
+       int count = drv_data->clk_gates.count + drv_data->clk_muxes.count;
+       struct device *dev = hdata->dev;
+       struct clk **clks;
+       int ret;
+
+       if (!count)
+               return 0;
+
+       clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL);
+       if (!clks)
+               return -ENOMEM;
+
+       hdata->clk_gates = clks;
+       hdata->clk_muxes = clks + drv_data->clk_gates.count;
+
+       ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates);
+       if (ret)
+               return ret;
+
+       return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes);
+}
+
+
+static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable)
+{
+       struct hdmi_context *hdata = container_of(clk, struct hdmi_context,
+                                                 phy_clk);
+
+       if (enable)
+               hdmiphy_enable(hdata);
+       else
+               hdmiphy_disable(hdata);
+}
+
 static int hdmi_resources_init(struct hdmi_context *hdata)
 {
        struct device *dev = hdata->dev;
@@ -1688,39 +1668,14 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
                DRM_ERROR("failed to get GPIO irq\n");
                return  hdata->irq;
        }
-       /* get clocks, power */
-       hdata->hdmi = devm_clk_get(dev, "hdmi");
-       if (IS_ERR(hdata->hdmi)) {
-               DRM_ERROR("failed to get clock 'hdmi'\n");
-               ret = PTR_ERR(hdata->hdmi);
-               goto fail;
-       }
-       hdata->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
-       if (IS_ERR(hdata->sclk_hdmi)) {
-               DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
-               ret = PTR_ERR(hdata->sclk_hdmi);
-               goto fail;
-       }
-       hdata->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
-       if (IS_ERR(hdata->sclk_pixel)) {
-               DRM_ERROR("failed to get clock 'sclk_pixel'\n");
-               ret = PTR_ERR(hdata->sclk_pixel);
-               goto fail;
-       }
-       hdata->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
-       if (IS_ERR(hdata->sclk_hdmiphy)) {
-               DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
-               ret = PTR_ERR(hdata->sclk_hdmiphy);
-               goto fail;
-       }
-       hdata->mout_hdmi = devm_clk_get(dev, "mout_hdmi");
-       if (IS_ERR(hdata->mout_hdmi)) {
-               DRM_ERROR("failed to get clock 'mout_hdmi'\n");
-               ret = PTR_ERR(hdata->mout_hdmi);
-               goto fail;
-       }
 
-       clk_set_parent(hdata->mout_hdmi, hdata->sclk_pixel);
+       ret = hdmi_clk_init(hdata);
+       if (ret)
+               return ret;
+
+       ret = hdmi_clk_set_parents(hdata, false);
+       if (ret)
+               return ret;
 
        for (i = 0; i < ARRAY_SIZE(supply); ++i) {
                hdata->regul_bulk[i].supply = supply[i];
@@ -1728,7 +1683,8 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
        }
        ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk);
        if (ret) {
-               DRM_ERROR("failed to get regulators\n");
+               if (ret != -EPROBE_DEFER)
+                       DRM_ERROR("failed to get regulators\n");
                return ret;
        }
 
@@ -1745,9 +1701,6 @@ static int hdmi_resources_init(struct hdmi_context *hdata)
                DRM_ERROR("failed to enable hdmi-en regulator\n");
 
        return ret;
-fail:
-       DRM_ERROR("HDMI resource init - failed\n");
-       return ret;
 }
 
 static struct of_device_id hdmi_match_types[] = {
@@ -1760,6 +1713,9 @@ static struct of_device_id hdmi_match_types[] = {
        }, {
                .compatible = "samsung,exynos5420-hdmi",
                .data = &exynos5420_hdmi_driver_data,
+       }, {
+               .compatible = "samsung,exynos5433-hdmi",
+               .data = &exynos5433_hdmi_driver_data,
        }, {
                /* end node */
        }
@@ -1780,6 +1736,10 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
        if (pipe < 0)
                return pipe;
 
+       hdata->phy_clk.enable = hdmiphy_clk_enable;
+
+       exynos_drm_crtc_from_pipe(drm_dev, pipe)->pipe_clk = &hdata->phy_clk;
+
        encoder->possible_crtcs = 1 << pipe;
 
        DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
@@ -1830,7 +1790,6 @@ static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
 static int hdmi_probe(struct platform_device *pdev)
 {
        struct device_node *ddc_node, *phy_node;
-       const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct hdmi_context *hdata;
        struct resource *res;
@@ -1840,11 +1799,7 @@ static int hdmi_probe(struct platform_device *pdev)
        if (!hdata)
                return -ENOMEM;
 
-       match = of_match_device(hdmi_match_types, dev);
-       if (!match)
-               return -ENODEV;
-
-       hdata->drv_data = match->data;
+       hdata->drv_data = of_device_get_match_data(dev);
 
        platform_set_drvdata(pdev, hdata);
 
@@ -1852,7 +1807,8 @@ static int hdmi_probe(struct platform_device *pdev)
 
        ret = hdmi_resources_init(hdata);
        if (ret) {
-               DRM_ERROR("hdmi_resources_init failed\n");
+               if (ret != -EPROBE_DEFER)
+                       DRM_ERROR("hdmi_resources_init failed\n");
                return ret;
        }
 
@@ -1867,7 +1823,6 @@ static int hdmi_probe(struct platform_device *pdev)
        if (ddc_node)
                goto out_get_ddc_adpt;
 
-       /* DDC i2c driver */
        ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
        if (!ddc_node) {
                DRM_ERROR("Failed to find ddc node in device tree\n");
@@ -1885,7 +1840,6 @@ out_get_ddc_adpt:
        if (phy_node)
                goto out_get_phy_port;
 
-       /* hdmiphy i2c driver */
        phy_node = of_parse_phandle(dev->of_node, "phy", 0);
        if (!phy_node) {
                DRM_ERROR("Failed to find hdmiphy node in device tree\n");
@@ -1929,6 +1883,16 @@ out_get_phy_port:
                goto err_hdmiphy;
        }
 
+       if (hdata->drv_data->has_sysreg) {
+               hdata->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
+                               "samsung,sysreg-phandle");
+               if (IS_ERR(hdata->sysreg)) {
+                       DRM_ERROR("sysreg regmap lookup failed.\n");
+                       ret = -EPROBE_DEFER;
+                       goto err_hdmiphy;
+               }
+       }
+
        pm_runtime_enable(dev);
 
        ret = component_add(&pdev->dev, &hdmi_component_ops);
@@ -1975,8 +1939,7 @@ static int exynos_hdmi_suspend(struct device *dev)
 {
        struct hdmi_context *hdata = dev_get_drvdata(dev);
 
-       clk_disable_unprepare(hdata->sclk_hdmi);
-       clk_disable_unprepare(hdata->hdmi);
+       hdmi_clk_disable_gates(hdata);
 
        return 0;
 }
@@ -1986,17 +1949,9 @@ static int exynos_hdmi_resume(struct device *dev)
        struct hdmi_context *hdata = dev_get_drvdata(dev);
        int ret;
 
-       ret = clk_prepare_enable(hdata->hdmi);
-       if (ret < 0) {
-               DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret);
-               return ret;
-       }
-       ret = clk_prepare_enable(hdata->sclk_hdmi);
-       if (ret < 0) {
-               DRM_ERROR("Failed to prepare_enable the sclk_mixer clk [%d]\n",
-                         ret);
+       ret = hdmi_clk_enable_gates(hdata);
+       if (ret < 0)
                return ret;
-       }
 
        return 0;
 }
index 0a5a60005f7e5711e14147dfa21990be1b88a2b8..74a4269cc1b0a17cb527f3616b8e9fcfa87b00ff 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/clk.h>
 #include <linux/regulator/consumer.h>
 #include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/component.h>
 
 #include <drm/exynos_drm.h>
@@ -103,8 +104,6 @@ struct mixer_context {
 
        struct mixer_resources  mixer_res;
        enum mixer_version_id   mxr_ver;
-       wait_queue_head_t       wait_vsync_queue;
-       atomic_t                wait_vsync_event;
 };
 
 struct mixer_drv_data {
@@ -787,12 +786,6 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg)
 
                        exynos_drm_crtc_finish_update(ctx->crtc, plane);
                }
-
-               /* set wait vsync event to zero and wake up queue. */
-               if (atomic_read(&ctx->wait_vsync_event)) {
-                       atomic_set(&ctx->wait_vsync_event, 0);
-                       wake_up(&ctx->wait_vsync_queue);
-               }
        }
 
 out:
@@ -1027,34 +1020,6 @@ static void mixer_atomic_flush(struct exynos_drm_crtc *crtc)
        mixer_vsync_set_update(mixer_ctx, true);
 }
 
-static void mixer_wait_for_vblank(struct exynos_drm_crtc *crtc)
-{
-       struct mixer_context *mixer_ctx = crtc->ctx;
-       int err;
-
-       if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
-               return;
-
-       err = drm_vblank_get(mixer_ctx->drm_dev, mixer_ctx->pipe);
-       if (err < 0) {
-               DRM_DEBUG_KMS("failed to acquire vblank counter\n");
-               return;
-       }
-
-       atomic_set(&mixer_ctx->wait_vsync_event, 1);
-
-       /*
-        * wait for MIXER to signal VSYNC interrupt or return after
-        * timeout which is set to 50ms (refresh rate of 20).
-        */
-       if (!wait_event_timeout(mixer_ctx->wait_vsync_queue,
-                               !atomic_read(&mixer_ctx->wait_vsync_event),
-                               HZ/20))
-               DRM_DEBUG_KMS("vblank wait timed out.\n");
-
-       drm_vblank_put(mixer_ctx->drm_dev, mixer_ctx->pipe);
-}
-
 static void mixer_enable(struct exynos_drm_crtc *crtc)
 {
        struct mixer_context *ctx = crtc->ctx;
@@ -1065,6 +1030,8 @@ static void mixer_enable(struct exynos_drm_crtc *crtc)
 
        pm_runtime_get_sync(ctx->dev);
 
+       exynos_drm_pipe_clk_enable(crtc, true);
+
        mixer_vsync_set_update(ctx, false);
 
        mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET);
@@ -1094,6 +1061,8 @@ static void mixer_disable(struct exynos_drm_crtc *crtc)
        for (i = 0; i < MIXER_WIN_NR; i++)
                mixer_disable_plane(crtc, &ctx->planes[i]);
 
+       exynos_drm_pipe_clk_enable(crtc, false);
+
        pm_runtime_put(ctx->dev);
 
        clear_bit(MXR_BIT_POWERED, &ctx->flags);
@@ -1126,7 +1095,6 @@ static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
        .disable                = mixer_disable,
        .enable_vblank          = mixer_enable_vblank,
        .disable_vblank         = mixer_disable_vblank,
-       .wait_for_vblank        = mixer_wait_for_vblank,
        .atomic_begin           = mixer_atomic_begin,
        .update_plane           = mixer_update_plane,
        .disable_plane          = mixer_disable_plane,
@@ -1155,18 +1123,6 @@ static struct mixer_drv_data exynos4210_mxr_drv_data = {
        .has_sclk = 1,
 };
 
-static const struct platform_device_id mixer_driver_types[] = {
-       {
-               .name           = "s5p-mixer",
-               .driver_data    = (unsigned long)&exynos4210_mxr_drv_data,
-       }, {
-               .name           = "exynos5-mixer",
-               .driver_data    = (unsigned long)&exynos5250_mxr_drv_data,
-       }, {
-               /* end node */
-       }
-};
-
 static struct of_device_id mixer_match_types[] = {
        {
                .compatible = "samsung,exynos4210-mixer",
@@ -1243,7 +1199,7 @@ static const struct component_ops mixer_component_ops = {
 static int mixer_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
-       struct mixer_drv_data *drv;
+       const struct mixer_drv_data *drv;
        struct mixer_context *ctx;
        int ret;
 
@@ -1253,23 +1209,13 @@ static int mixer_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       if (dev->of_node) {
-               const struct of_device_id *match;
-
-               match = of_match_node(mixer_match_types, dev->of_node);
-               drv = (struct mixer_drv_data *)match->data;
-       } else {
-               drv = (struct mixer_drv_data *)
-                       platform_get_device_id(pdev)->driver_data;
-       }
+       drv = of_device_get_match_data(dev);
 
        ctx->pdev = pdev;
        ctx->dev = dev;
        ctx->vp_enabled = drv->is_vp_enabled;
        ctx->has_sclk = drv->has_sclk;
        ctx->mxr_ver = drv->version;
-       init_waitqueue_head(&ctx->wait_vsync_queue);
-       atomic_set(&ctx->wait_vsync_event, 0);
 
        platform_set_drvdata(pdev, ctx);
 
@@ -1355,5 +1301,4 @@ struct platform_driver mixer_driver = {
        },
        .probe = mixer_probe,
        .remove = mixer_remove,
-       .id_table       = mixer_driver_types,
 };
index 8c891e59be21e16a05353426bb64ae3a3d681620..169667a22bdc1f40a308ad3deeebc8a8efcbb8a2 100644 (file)
 #define HDMI_TG_VACT_ST4_L             HDMI_TG_BASE(0x0070)
 #define HDMI_TG_VACT_ST4_H             HDMI_TG_BASE(0x0074)
 #define HDMI_TG_3D                     HDMI_TG_BASE(0x00F0)
+#define HDMI_TG_DECON_EN               HDMI_TG_BASE(0x01e0)
 
 /* HDMI PHY Registers Offsets*/
-#define HDMIPHY_POWER          (0x74 >> 2)
-#define HDMIPHY_MODE_SET_DONE          (0x7c >> 2)
+#define HDMIPHY_POWER                  0x74
+#define HDMIPHY_MODE_SET_DONE          0x7c
+#define HDMIPHY5433_MODE_SET_DONE      0x84
 
 /* HDMI PHY Values */
 #define HDMI_PHY_POWER_ON              0x80
 #define PMU_HDMI_PHY_CONTROL           0x700
 #define PMU_HDMI_PHY_ENABLE_BIT                BIT(0)
 
+#define EXYNOS5433_SYSREG_DISP_HDMI_PHY        0x1008
+#define SYSREG_HDMI_REFCLK_INT_CLK     1
+
 #endif /* SAMSUNG_REGS_HDMI_H */
index c78cf3f605d06193948d8861230da8e67eeb9214..b9c714de6e40cdfd2dbb48b0e5a5311076a286ca 100644 (file)
@@ -1,6 +1,6 @@
 config DRM_FSL_DCU
        tristate "DRM Support for Freescale DCU"
-       depends on DRM && OF && ARM
+       depends on DRM && OF && ARM && COMMON_CLK
        select BACKLIGHT_CLASS_DEVICE
        select BACKLIGHT_LCD_SUPPORT
        select DRM_KMS_HELPER
index 6ea1523ae6ec39affef7831997d660763b68b1d0..b35a292287f3476a591e8c6647ecca7920f94518 100644 (file)
@@ -3,5 +3,6 @@ fsl-dcu-drm-y := fsl_dcu_drm_drv.o \
                 fsl_dcu_drm_rgb.o \
                 fsl_dcu_drm_plane.o \
                 fsl_dcu_drm_crtc.o \
-                fsl_dcu_drm_fbdev.o
+                fsl_dcu_drm_fbdev.o \
+                fsl_tcon.o
 obj-$(CONFIG_DRM_FSL_DCU)      += fsl-dcu-drm.o
index 4ed7798533f9104bda0b870f7bbaa6c661a43097..89c0084c28140091c129a72304ef129186c91a4b 100644 (file)
@@ -66,13 +66,12 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
        struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+       struct drm_connector *con = &fsl_dev->connector.base;
        struct drm_display_mode *mode = &crtc->state->mode;
-       unsigned int hbp, hfp, hsw, vbp, vfp, vsw, div, index, pol = 0;
-       unsigned long dcuclk;
+       unsigned int hbp, hfp, hsw, vbp, vfp, vsw, index, pol = 0;
 
        index = drm_crtc_index(crtc);
-       dcuclk = clk_get_rate(fsl_dev->clk);
-       div = dcuclk / mode->clock / 1000;
+       clk_set_rate(fsl_dev->pix_clk, mode->clock * 1000);
 
        /* Configure timings: */
        hbp = mode->htotal - mode->hsync_end;
@@ -82,6 +81,10 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
        vfp = mode->vsync_start - mode->vdisplay;
        vsw = mode->vsync_end - mode->vsync_start;
 
+       /* INV_PXCK as default (most display sample data on rising edge) */
+       if (!(con->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE))
+               pol |= DCU_SYN_POL_INV_PXCK;
+
        if (mode->flags & DRM_MODE_FLAG_NHSYNC)
                pol |= DCU_SYN_POL_INV_HS_LOW;
 
@@ -99,7 +102,6 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
        regmap_write(fsl_dev->regmap, DCU_DISP_SIZE,
                     DCU_DISP_SIZE_DELTA_Y(mode->vdisplay) |
                     DCU_DISP_SIZE_DELTA_X(mode->hdisplay));
-       regmap_write(fsl_dev->regmap, DCU_DIV_RATIO, div);
        regmap_write(fsl_dev->regmap, DCU_SYN_POL, pol);
        regmap_write(fsl_dev->regmap, DCU_BGND, DCU_BGND_R(0) |
                     DCU_BGND_G(0) | DCU_BGND_B(0));
index e8d9337a66d8704805ad62121714f95be91a340c..0ec1ad961e0dbee6bf50de70cf05f23592241f51 100644 (file)
 
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
 
 #include "fsl_dcu_drm_crtc.h"
 #include "fsl_dcu_drm_drv.h"
+#include "fsl_tcon.h"
 
 static bool fsl_dcu_drm_is_volatile_reg(struct device *dev, unsigned int reg)
 {
@@ -62,46 +64,54 @@ static int fsl_dcu_drm_irq_init(struct drm_device *dev)
        return ret;
 }
 
-static int fsl_dcu_load(struct drm_device *drm, unsigned long flags)
+static int fsl_dcu_load(struct drm_device *dev, unsigned long flags)
 {
-       struct device *dev = drm->dev;
-       struct fsl_dcu_drm_device *fsl_dev = drm->dev_private;
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
        int ret;
 
        ret = fsl_dcu_drm_modeset_init(fsl_dev);
        if (ret < 0) {
-               dev_err(dev, "failed to initialize mode setting\n");
+               dev_err(dev->dev, "failed to initialize mode setting\n");
                return ret;
        }
 
-       ret = drm_vblank_init(drm, drm->mode_config.num_crtc);
+       ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
        if (ret < 0) {
-               dev_err(dev, "failed to initialize vblank\n");
+               dev_err(dev->dev, "failed to initialize vblank\n");
                goto done;
        }
-       drm->vblank_disable_allowed = true;
 
-       ret = fsl_dcu_drm_irq_init(drm);
+       ret = fsl_dcu_drm_irq_init(dev);
        if (ret < 0)
                goto done;
-       drm->irq_enabled = true;
+       dev->irq_enabled = true;
 
-       fsl_dcu_fbdev_init(drm);
+       fsl_dcu_fbdev_init(dev);
 
        return 0;
 done:
-       if (ret) {
-               drm_mode_config_cleanup(drm);
-               drm_vblank_cleanup(drm);
-               drm_irq_uninstall(drm);
-               drm->dev_private = NULL;
-       }
+       drm_kms_helper_poll_fini(dev);
+
+       if (fsl_dev->fbdev)
+               drm_fbdev_cma_fini(fsl_dev->fbdev);
+
+       drm_mode_config_cleanup(dev);
+       drm_vblank_cleanup(dev);
+       drm_irq_uninstall(dev);
+       dev->dev_private = NULL;
 
        return ret;
 }
 
 static int fsl_dcu_unload(struct drm_device *dev)
 {
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+
+       drm_kms_helper_poll_fini(dev);
+
+       if (fsl_dev->fbdev)
+               drm_fbdev_cma_fini(fsl_dev->fbdev);
+
        drm_mode_config_cleanup(dev);
        drm_vblank_cleanup(dev);
        drm_irq_uninstall(dev);
@@ -157,6 +167,13 @@ static void fsl_dcu_drm_disable_vblank(struct drm_device *dev,
        regmap_write(fsl_dev->regmap, DCU_INT_MASK, value);
 }
 
+static void fsl_dcu_drm_lastclose(struct drm_device *dev)
+{
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+
+       drm_fbdev_cma_restore_mode(fsl_dev->fbdev);
+}
+
 static const struct file_operations fsl_dcu_drm_fops = {
        .owner          = THIS_MODULE,
        .open           = drm_open,
@@ -174,6 +191,7 @@ static const struct file_operations fsl_dcu_drm_fops = {
 static struct drm_driver fsl_dcu_drm_driver = {
        .driver_features        = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET
                                | DRIVER_PRIME | DRIVER_ATOMIC,
+       .lastclose              = fsl_dcu_drm_lastclose,
        .load                   = fsl_dcu_load,
        .unload                 = fsl_dcu_unload,
        .irq_handler            = fsl_dcu_drm_irq,
@@ -197,9 +215,9 @@ static struct drm_driver fsl_dcu_drm_driver = {
        .fops                   = &fsl_dcu_drm_fops,
        .name                   = "fsl-dcu-drm",
        .desc                   = "Freescale DCU DRM",
-       .date                   = "20150213",
+       .date                   = "20160425",
        .major                  = 1,
-       .minor                  = 0,
+       .minor                  = 1,
 };
 
 #ifdef CONFIG_PM_SLEEP
@@ -283,6 +301,9 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
        struct resource *res;
        void __iomem *base;
        struct drm_driver *driver = &fsl_dcu_drm_driver;
+       struct clk *pix_clk_in;
+       char pix_clk_name[32];
+       const char *pix_clk_in_name;
        const struct of_device_id *id;
        int ret;
 
@@ -290,6 +311,11 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
        if (!fsl_dev)
                return -ENOMEM;
 
+       id = of_match_node(fsl_dcu_of_match, pdev->dev.of_node);
+       if (!id)
+               return -ENODEV;
+       fsl_dev->soc = id->data;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(dev, "could not get memory IO resource\n");
@@ -308,39 +334,54 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
                return -ENXIO;
        }
 
+       fsl_dev->regmap = devm_regmap_init_mmio(dev, base,
+                       &fsl_dcu_regmap_config);
+       if (IS_ERR(fsl_dev->regmap)) {
+               dev_err(dev, "regmap init failed\n");
+               return PTR_ERR(fsl_dev->regmap);
+       }
+
        fsl_dev->clk = devm_clk_get(dev, "dcu");
        if (IS_ERR(fsl_dev->clk)) {
-               ret = PTR_ERR(fsl_dev->clk);
                dev_err(dev, "failed to get dcu clock\n");
-               return ret;
-       }
-       ret = clk_prepare(fsl_dev->clk);
-       if (ret < 0) {
-               dev_err(dev, "failed to prepare dcu clk\n");
-               return ret;
+               return PTR_ERR(fsl_dev->clk);
        }
-       ret = clk_enable(fsl_dev->clk);
+       ret = clk_prepare_enable(fsl_dev->clk);
        if (ret < 0) {
                dev_err(dev, "failed to enable dcu clk\n");
-               clk_unprepare(fsl_dev->clk);
                return ret;
        }
 
-       fsl_dev->regmap = devm_regmap_init_mmio(dev, base,
-                       &fsl_dcu_regmap_config);
-       if (IS_ERR(fsl_dev->regmap)) {
-               dev_err(dev, "regmap init failed\n");
-               return PTR_ERR(fsl_dev->regmap);
+       pix_clk_in = devm_clk_get(dev, "pix");
+       if (IS_ERR(pix_clk_in)) {
+               /* legancy binding, use dcu clock as pixel clock input */
+               pix_clk_in = fsl_dev->clk;
        }
 
-       id = of_match_node(fsl_dcu_of_match, pdev->dev.of_node);
-       if (!id)
-               return -ENODEV;
-       fsl_dev->soc = id->data;
+       pix_clk_in_name = __clk_get_name(pix_clk_in);
+       snprintf(pix_clk_name, sizeof(pix_clk_name), "%s_pix", pix_clk_in_name);
+       fsl_dev->pix_clk = clk_register_divider(dev, pix_clk_name,
+                       pix_clk_in_name, 0, base + DCU_DIV_RATIO,
+                       0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL);
+       if (IS_ERR(fsl_dev->pix_clk)) {
+               dev_err(dev, "failed to register pix clk\n");
+               ret = PTR_ERR(fsl_dev->pix_clk);
+               goto disable_clk;
+       }
+
+       ret = clk_prepare_enable(fsl_dev->pix_clk);
+       if (ret < 0) {
+               dev_err(dev, "failed to enable pix clk\n");
+               goto unregister_pix_clk;
+       }
+
+       fsl_dev->tcon = fsl_tcon_init(dev);
 
        drm = drm_dev_alloc(driver, dev);
-       if (!drm)
-               return -ENOMEM;
+       if (!drm) {
+               ret = -ENOMEM;
+               goto disable_pix_clk;
+       }
 
        fsl_dev->dev = dev;
        fsl_dev->drm = drm;
@@ -360,6 +401,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
 
 unref:
        drm_dev_unref(drm);
+disable_pix_clk:
+       clk_disable_unprepare(fsl_dev->pix_clk);
+unregister_pix_clk:
+       clk_unregister(fsl_dev->pix_clk);
+disable_clk:
+       clk_disable_unprepare(fsl_dev->clk);
        return ret;
 }
 
@@ -367,6 +414,9 @@ static int fsl_dcu_drm_remove(struct platform_device *pdev)
 {
        struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
 
+       clk_disable_unprepare(fsl_dev->clk);
+       clk_disable_unprepare(fsl_dev->pix_clk);
+       clk_unregister(fsl_dev->pix_clk);
        drm_put_dev(fsl_dev->drm);
 
        return 0;
index 6413ac9e47699a1e97b8f91531b96ad22987944f..c275f900ff231a564256bc84c2b1252b90dde6f1 100644 (file)
@@ -47,8 +47,8 @@
 #define DCU_VSYN_PARA_FP(x)            (x)
 
 #define DCU_SYN_POL                    0x0024
-#define DCU_SYN_POL_INV_PXCK_FALL      (0 << 6)
-#define DCU_SYN_POL_NEG_REMAIN         (0 << 5)
+#define DCU_SYN_POL_INV_PXCK           BIT(6)
+#define DCU_SYN_POL_NEG                        BIT(5)
 #define DCU_SYN_POL_INV_VS_LOW         BIT(1)
 #define DCU_SYN_POL_INV_HS_LOW         BIT(0)
 
@@ -183,6 +183,8 @@ struct fsl_dcu_drm_device {
        struct regmap *regmap;
        int irq;
        struct clk *clk;
+       struct clk *pix_clk;
+       struct fsl_tcon *tcon;
        /*protects hardware register*/
        spinlock_t irq_lock;
        struct drm_device *drm;
index 8780deba5e8aa34fc58405592144a3f7a1c99a3e..98c998da91eb04f55824aa55b3ffb6cdbb030b8c 100644 (file)
@@ -17,6 +17,7 @@
 #include <drm/drm_panel.h>
 
 #include "fsl_dcu_drm_drv.h"
+#include "fsl_tcon.h"
 
 static int
 fsl_dcu_drm_encoder_atomic_check(struct drm_encoder *encoder,
@@ -28,10 +29,20 @@ fsl_dcu_drm_encoder_atomic_check(struct drm_encoder *encoder,
 
 static void fsl_dcu_drm_encoder_disable(struct drm_encoder *encoder)
 {
+       struct drm_device *dev = encoder->dev;
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+
+       if (fsl_dev->tcon)
+               fsl_tcon_bypass_disable(fsl_dev->tcon);
 }
 
 static void fsl_dcu_drm_encoder_enable(struct drm_encoder *encoder)
 {
+       struct drm_device *dev = encoder->dev;
+       struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
+
+       if (fsl_dev->tcon)
+               fsl_tcon_bypass_enable(fsl_dev->tcon);
 }
 
 static const struct drm_encoder_helper_funcs encoder_helper_funcs = {
@@ -68,7 +79,10 @@ int fsl_dcu_drm_encoder_create(struct fsl_dcu_drm_device *fsl_dev,
 
 static void fsl_dcu_drm_connector_destroy(struct drm_connector *connector)
 {
+       struct fsl_dcu_drm_connector *fsl_con = to_fsl_dcu_connector(connector);
+
        drm_connector_unregister(connector);
+       drm_panel_detach(fsl_con->panel);
        drm_connector_cleanup(connector);
 }
 
@@ -131,7 +145,7 @@ int fsl_dcu_drm_connector_create(struct fsl_dcu_drm_device *fsl_dev,
                                 struct drm_encoder *encoder)
 {
        struct drm_connector *connector = &fsl_dev->connector.base;
-       struct drm_mode_config mode_config = fsl_dev->drm->mode_config;
+       struct drm_mode_config *mode_config = &fsl_dev->drm->mode_config;
        struct device_node *panel_node;
        int ret;
 
@@ -153,19 +167,23 @@ int fsl_dcu_drm_connector_create(struct fsl_dcu_drm_device *fsl_dev,
                goto err_sysfs;
 
        drm_object_property_set_value(&connector->base,
-                                     mode_config.dpms_property,
+                                     mode_config->dpms_property,
                                      DRM_MODE_DPMS_OFF);
 
        panel_node = of_parse_phandle(fsl_dev->np, "fsl,panel", 0);
-       if (panel_node) {
-               fsl_dev->connector.panel = of_drm_find_panel(panel_node);
-               if (!fsl_dev->connector.panel) {
-                       ret = -EPROBE_DEFER;
-                       goto err_sysfs;
-               }
-       of_node_put(panel_node);
+       if (!panel_node) {
+               dev_err(fsl_dev->dev, "fsl,panel property not found\n");
+               ret = -ENODEV;
+               goto err_sysfs;
        }
 
+       fsl_dev->connector.panel = of_drm_find_panel(panel_node);
+       if (!fsl_dev->connector.panel) {
+               ret = -EPROBE_DEFER;
+               goto err_panel;
+       }
+       of_node_put(panel_node);
+
        ret = drm_panel_attach(fsl_dev->connector.panel, connector);
        if (ret) {
                dev_err(fsl_dev->dev, "failed to attach panel\n");
@@ -174,6 +192,8 @@ int fsl_dcu_drm_connector_create(struct fsl_dcu_drm_device *fsl_dev,
 
        return 0;
 
+err_panel:
+       of_node_put(panel_node);
 err_sysfs:
        drm_connector_unregister(connector);
 err_cleanup:
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_tcon.c b/drivers/gpu/drm/fsl-dcu/fsl_tcon.c
new file mode 100644 (file)
index 0000000..bbe34f1
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 Toradex AG
+ *
+ * Stefan Agner <stefan@agner.ch>
+ *
+ * Freescale TCON device driver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/clk.h>
+#include <linux/io.h>
+#include <linux/mm.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "fsl_tcon.h"
+
+void fsl_tcon_bypass_disable(struct fsl_tcon *tcon)
+{
+       regmap_update_bits(tcon->regs, FSL_TCON_CTRL1,
+                          FSL_TCON_CTRL1_TCON_BYPASS, 0);
+}
+
+void fsl_tcon_bypass_enable(struct fsl_tcon *tcon)
+{
+       regmap_update_bits(tcon->regs, FSL_TCON_CTRL1,
+                          FSL_TCON_CTRL1_TCON_BYPASS,
+                          FSL_TCON_CTRL1_TCON_BYPASS);
+}
+
+static struct regmap_config fsl_tcon_regmap_config = {
+       .reg_bits = 32,
+       .reg_stride = 4,
+       .val_bits = 32,
+
+       .name = "tcon",
+};
+
+static int fsl_tcon_init_regmap(struct device *dev,
+                               struct fsl_tcon *tcon,
+                               struct device_node *np)
+{
+       struct resource res;
+       void __iomem *regs;
+
+       if (of_address_to_resource(np, 0, &res))
+               return -EINVAL;
+
+       regs = devm_ioremap_resource(dev, &res);
+       if (IS_ERR(regs))
+               return PTR_ERR(regs);
+
+       tcon->regs = devm_regmap_init_mmio(dev, regs,
+                                          &fsl_tcon_regmap_config);
+       if (IS_ERR(tcon->regs))
+               return PTR_ERR(tcon->regs);
+
+       return 0;
+}
+
+struct fsl_tcon *fsl_tcon_init(struct device *dev)
+{
+       struct fsl_tcon *tcon;
+       struct device_node *np;
+       int ret;
+
+       /* TCON node is not mandatory, some devices do not provide TCON */
+       np = of_parse_phandle(dev->of_node, "fsl,tcon", 0);
+       if (!np)
+               return NULL;
+
+       tcon = devm_kzalloc(dev, sizeof(*tcon), GFP_KERNEL);
+       if (!tcon) {
+               ret = -ENOMEM;
+               goto err_node_put;
+       }
+
+       ret = fsl_tcon_init_regmap(dev, tcon, np);
+       if (ret) {
+               dev_err(dev, "Couldn't create the TCON regmap\n");
+               goto err_node_put;
+       }
+
+       tcon->ipg_clk = of_clk_get_by_name(np, "ipg");
+       if (IS_ERR(tcon->ipg_clk)) {
+               dev_err(dev, "Couldn't get the TCON bus clock\n");
+               goto err_node_put;
+       }
+
+       clk_prepare_enable(tcon->ipg_clk);
+
+       dev_info(dev, "Using TCON in bypass mode\n");
+
+       return tcon;
+
+err_node_put:
+       of_node_put(np);
+       return NULL;
+}
+
+void fsl_tcon_free(struct fsl_tcon *tcon)
+{
+       clk_disable_unprepare(tcon->ipg_clk);
+       clk_put(tcon->ipg_clk);
+}
+
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_tcon.h b/drivers/gpu/drm/fsl-dcu/fsl_tcon.h
new file mode 100644 (file)
index 0000000..80a7617
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2015 Toradex AG
+ *
+ * Stefan Agner <stefan@agner.ch>
+ *
+ * Freescale TCON device driver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __FSL_TCON_H__
+#define __FSL_TCON_H__
+
+#include <linux/bitops.h>
+
+#define FSL_TCON_CTRL1                 0x0
+#define FSL_TCON_CTRL1_TCON_BYPASS     BIT(29)
+
+struct fsl_tcon {
+       struct regmap           *regs;
+       struct clk              *ipg_clk;
+};
+
+struct fsl_tcon *fsl_tcon_init(struct device *dev);
+void fsl_tcon_free(struct fsl_tcon *tcon);
+
+void fsl_tcon_bypass_disable(struct fsl_tcon *tcon);
+void fsl_tcon_bypass_enable(struct fsl_tcon *tcon);
+
+#endif /* __FSL_TCON_H__ */
index 033d894d030e476fed14e393482dfa0d2d10dbb6..7440bf90ac9c397f4fe888e9b9d68804bd39e8a2 100644 (file)
@@ -411,7 +411,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
        info = drm_fb_helper_alloc_fbi(&fbdev->psb_fb_helper);
        if (IS_ERR(info)) {
                ret = PTR_ERR(info);
-               goto out_err1;
+               goto err_free_range;
        }
        info->par = fbdev;
 
@@ -419,7 +419,7 @@ static int psbfb_create(struct psb_fbdev *fbdev,
 
        ret = psb_framebuffer_init(dev, psbfb, &mode_cmd, backing);
        if (ret)
-               goto out_unref;
+               goto err_release;
 
        fb = &psbfb->base;
        psbfb->fbdev = info;
@@ -464,14 +464,9 @@ static int psbfb_create(struct psb_fbdev *fbdev,
                                        psbfb->base.width, psbfb->base.height);
 
        return 0;
-out_unref:
-       if (backing->stolen)
-               psb_gtt_free_range(dev, backing);
-       else
-               drm_gem_object_unreference_unlocked(&backing->gem);
-
+err_release:
        drm_fb_helper_release_fbi(&fbdev->psb_fb_helper);
-out_err1:
+err_free_range:
        psb_gtt_free_range(dev, backing);
        return ret;
 }
@@ -495,7 +490,7 @@ static struct drm_framebuffer *psb_user_framebuffer_create
         *      Find the GEM object and thus the gtt range object that is
         *      to back this space
         */
-       obj = drm_gem_object_lookup(dev, filp, cmd->handles[0]);
+       obj = drm_gem_object_lookup(filp, cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
index 506224b3a0adf298ea5d5f4d71416df4aa88d41e..6d1cb6b370b194742745bc5a005f43e43a1a823a 100644 (file)
@@ -63,7 +63,7 @@ int psb_gem_dumb_map_gtt(struct drm_file *file, struct drm_device *dev,
        struct drm_gem_object *obj;
 
        /* GEM does all our handle to object mapping */
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL)
                return -ENOENT;
 
index 5bf765de251789624fbb6a58158138e79cda72b6..c95406e6f44de21f23d6e9093f59151e0924b176 100644 (file)
@@ -372,7 +372,7 @@ int gma_crtc_cursor_set(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                ret = -ENOENT;
                goto unlock;
index 7cd87a0c2385c5469ada4778a2cd9e09041b5e95..a05c020602bda439b03fabdae42781d3dc627385 100644 (file)
@@ -979,11 +979,7 @@ struct mdfld_dsi_encoder *mdfld_dsi_dpi_init(struct drm_device *dev,
                return NULL;
        }
 
-       if (dsi_connector->pipe)
-               dpi_output->panel_on = 0;
-       else
-               dpi_output->panel_on = 0;
-
+       dpi_output->panel_on = 0;
        dpi_output->dev = dev;
        if (mdfld_get_panel_type(dev, pipe) != TC35876X)
                dpi_output->p_funcs = p_funcs;
index 6b43ae3ffd73e067f7b52a51cdde68fbab3f259a..1616af209bfcf89f9890b2d7a52a19c677f2802d 100644 (file)
@@ -72,7 +72,7 @@ static const char *const dsi_errors[] = {
        "RX Prot Violation",
        "HS Generic Write FIFO Full",
        "LP Generic Write FIFO Full",
-       "Generic Read Data Avail"
+       "Generic Read Data Avail",
        "Special Packet Sent",
        "Tearing Effect",
 };
index 4e1c6850520ee50bd024fb3da610a0f5ab8c754d..82b8ce418b276bae50b94c75f1b2b8f40af6b417 100644 (file)
@@ -374,7 +374,6 @@ static int psb_driver_load(struct drm_device *dev, unsigned long flags)
 
        drm_irq_install(dev, dev->pdev->irq);
 
-       dev->vblank_disable_allowed = true;
        dev->max_vblank_count = 0xffffff; /* only 24 bits of frame count */
        dev->driver->get_vblank_counter = psb_get_vblank_counter;
 
diff --git a/drivers/gpu/drm/hisilicon/Kconfig b/drivers/gpu/drm/hisilicon/Kconfig
new file mode 100644 (file)
index 0000000..558c61b
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# hisilicon drm device configuration.
+# Please keep this list sorted alphabetically
+
+source "drivers/gpu/drm/hisilicon/kirin/Kconfig"
diff --git a/drivers/gpu/drm/hisilicon/Makefile b/drivers/gpu/drm/hisilicon/Makefile
new file mode 100644 (file)
index 0000000..e3f6d49
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for hisilicon drm drivers.
+# Please keep this list sorted alphabetically
+
+obj-$(CONFIG_DRM_HISI_KIRIN) += kirin/
diff --git a/drivers/gpu/drm/hisilicon/kirin/Kconfig b/drivers/gpu/drm/hisilicon/kirin/Kconfig
new file mode 100644 (file)
index 0000000..ea0df61
--- /dev/null
@@ -0,0 +1,18 @@
+config DRM_HISI_KIRIN
+       tristate "DRM Support for Hisilicon Kirin series SoCs Platform"
+       depends on DRM && OF && ARM64
+       select DRM_KMS_HELPER
+       select DRM_GEM_CMA_HELPER
+       select DRM_KMS_CMA_HELPER
+       help
+         Choose this option if you have a hisilicon Kirin chipsets(hi6220).
+         If M is selected the module will be called kirin-drm.
+
+config HISI_KIRIN_DW_DSI
+       tristate "HiSilicon Kirin specific extensions for Synopsys DW MIPI DSI"
+       depends on DRM_HISI_KIRIN
+       select DRM_MIPI_DSI
+       help
+        This selects support for HiSilicon Kirin SoC specific extensions for
+        the Synopsys DesignWare DSI driver. If you want to enable MIPI DSI on
+        hi6220 based SoC, you should selet this option.
diff --git a/drivers/gpu/drm/hisilicon/kirin/Makefile b/drivers/gpu/drm/hisilicon/kirin/Makefile
new file mode 100644 (file)
index 0000000..cdf6158
--- /dev/null
@@ -0,0 +1,6 @@
+kirin-drm-y := kirin_drm_drv.o \
+              kirin_drm_ade.o
+
+obj-$(CONFIG_DRM_HISI_KIRIN) += kirin-drm.o
+
+obj-$(CONFIG_HISI_KIRIN_DW_DSI) += dw_drm_dsi.o
diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
new file mode 100644 (file)
index 0000000..998452a
--- /dev/null
@@ -0,0 +1,858 @@
+/*
+ * DesignWare MIPI DSI Host Controller v1.02 driver
+ *
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * Author:
+ *     Xinliang Liu <z.liuxinliang@hisilicon.com>
+ *     Xinliang Liu <xinliang.liu@linaro.org>
+ *     Xinwei Kong <kong.kongxinwei@hisilicon.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_graph.h>
+
+#include <drm/drm_of.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_encoder_slave.h>
+#include <drm/drm_atomic_helper.h>
+
+#include "dw_dsi_reg.h"
+
+#define MAX_TX_ESC_CLK         10
+#define ROUND(x, y)            ((x) / (y) + \
+                               ((x) % (y) * 10 / (y) >= 5 ? 1 : 0))
+#define PHY_REF_CLK_RATE       19200000
+#define PHY_REF_CLK_PERIOD_PS  (1000000000 / (PHY_REF_CLK_RATE / 1000))
+
+#define encoder_to_dsi(encoder) \
+       container_of(encoder, struct dw_dsi, encoder)
+#define host_to_dsi(host) \
+       container_of(host, struct dw_dsi, host)
+
+struct mipi_phy_params {
+       u32 clk_t_lpx;
+       u32 clk_t_hs_prepare;
+       u32 clk_t_hs_zero;
+       u32 clk_t_hs_trial;
+       u32 clk_t_wakeup;
+       u32 data_t_lpx;
+       u32 data_t_hs_prepare;
+       u32 data_t_hs_zero;
+       u32 data_t_hs_trial;
+       u32 data_t_ta_go;
+       u32 data_t_ta_get;
+       u32 data_t_wakeup;
+       u32 hstx_ckg_sel;
+       u32 pll_fbd_div5f;
+       u32 pll_fbd_div1f;
+       u32 pll_fbd_2p;
+       u32 pll_enbwt;
+       u32 pll_fbd_p;
+       u32 pll_fbd_s;
+       u32 pll_pre_div1p;
+       u32 pll_pre_p;
+       u32 pll_vco_750M;
+       u32 pll_lpf_rs;
+       u32 pll_lpf_cs;
+       u32 clklp2hs_time;
+       u32 clkhs2lp_time;
+       u32 lp2hs_time;
+       u32 hs2lp_time;
+       u32 clk_to_data_delay;
+       u32 data_to_clk_delay;
+       u32 lane_byte_clk_kHz;
+       u32 clk_division;
+};
+
+struct dsi_hw_ctx {
+       void __iomem *base;
+       struct clk *pclk;
+};
+
+struct dw_dsi {
+       struct drm_encoder encoder;
+       struct drm_bridge *bridge;
+       struct mipi_dsi_host host;
+       struct drm_display_mode cur_mode;
+       struct dsi_hw_ctx *ctx;
+       struct mipi_phy_params phy;
+
+       u32 lanes;
+       enum mipi_dsi_pixel_format format;
+       unsigned long mode_flags;
+       bool enable;
+};
+
+struct dsi_data {
+       struct dw_dsi dsi;
+       struct dsi_hw_ctx ctx;
+};
+
+struct dsi_phy_range {
+       u32 min_range_kHz;
+       u32 max_range_kHz;
+       u32 pll_vco_750M;
+       u32 hstx_ckg_sel;
+};
+
+static const struct dsi_phy_range dphy_range_info[] = {
+       {   46875,    62500,   1,    7 },
+       {   62500,    93750,   0,    7 },
+       {   93750,   125000,   1,    6 },
+       {  125000,   187500,   0,    6 },
+       {  187500,   250000,   1,    5 },
+       {  250000,   375000,   0,    5 },
+       {  375000,   500000,   1,    4 },
+       {  500000,   750000,   0,    4 },
+       {  750000,  1000000,   1,    0 },
+       { 1000000,  1500000,   0,    0 }
+};
+
+static u32 dsi_calc_phy_rate(u32 req_kHz, struct mipi_phy_params *phy)
+{
+       u32 ref_clk_ps = PHY_REF_CLK_PERIOD_PS;
+       u32 tmp_kHz = req_kHz;
+       u32 i = 0;
+       u32 q_pll = 1;
+       u32 m_pll = 0;
+       u32 n_pll = 0;
+       u32 r_pll = 1;
+       u32 m_n = 0;
+       u32 m_n_int = 0;
+       u32 f_kHz = 0;
+       u64 temp;
+
+       /*
+        * Find a rate >= req_kHz.
+        */
+       do {
+               f_kHz = tmp_kHz;
+
+               for (i = 0; i < ARRAY_SIZE(dphy_range_info); i++)
+                       if (f_kHz >= dphy_range_info[i].min_range_kHz &&
+                           f_kHz <= dphy_range_info[i].max_range_kHz)
+                               break;
+
+               if (i == ARRAY_SIZE(dphy_range_info)) {
+                       DRM_ERROR("%dkHz out of range\n", f_kHz);
+                       return 0;
+               }
+
+               phy->pll_vco_750M = dphy_range_info[i].pll_vco_750M;
+               phy->hstx_ckg_sel = dphy_range_info[i].hstx_ckg_sel;
+
+               if (phy->hstx_ckg_sel <= 7 &&
+                   phy->hstx_ckg_sel >= 4)
+                       q_pll = 0x10 >> (7 - phy->hstx_ckg_sel);
+
+               temp = f_kHz * (u64)q_pll * (u64)ref_clk_ps;
+               m_n_int = temp / (u64)1000000000;
+               m_n = (temp % (u64)1000000000) / (u64)100000000;
+
+               if (m_n_int % 2 == 0) {
+                       if (m_n * 6 >= 50) {
+                               n_pll = 2;
+                               m_pll = (m_n_int + 1) * n_pll;
+                       } else if (m_n * 6 >= 30) {
+                               n_pll = 3;
+                               m_pll = m_n_int * n_pll + 2;
+                       } else {
+                               n_pll = 1;
+                               m_pll = m_n_int * n_pll;
+                       }
+               } else {
+                       if (m_n * 6 >= 50) {
+                               n_pll = 1;
+                               m_pll = (m_n_int + 1) * n_pll;
+                       } else if (m_n * 6 >= 30) {
+                               n_pll = 1;
+                               m_pll = (m_n_int + 1) * n_pll;
+                       } else if (m_n * 6 >= 10) {
+                               n_pll = 3;
+                               m_pll = m_n_int * n_pll + 1;
+                       } else {
+                               n_pll = 2;
+                               m_pll = m_n_int * n_pll;
+                       }
+               }
+
+               if (n_pll == 1) {
+                       phy->pll_fbd_p = 0;
+                       phy->pll_pre_div1p = 1;
+               } else {
+                       phy->pll_fbd_p = n_pll;
+                       phy->pll_pre_div1p = 0;
+               }
+
+               if (phy->pll_fbd_2p <= 7 && phy->pll_fbd_2p >= 4)
+                       r_pll = 0x10 >> (7 - phy->pll_fbd_2p);
+
+               if (m_pll == 2) {
+                       phy->pll_pre_p = 0;
+                       phy->pll_fbd_s = 0;
+                       phy->pll_fbd_div1f = 0;
+                       phy->pll_fbd_div5f = 1;
+               } else if (m_pll >= 2 * 2 * r_pll && m_pll <= 2 * 4 * r_pll) {
+                       phy->pll_pre_p = m_pll / (2 * r_pll);
+                       phy->pll_fbd_s = 0;
+                       phy->pll_fbd_div1f = 1;
+                       phy->pll_fbd_div5f = 0;
+               } else if (m_pll >= 2 * 5 * r_pll && m_pll <= 2 * 150 * r_pll) {
+                       if (((m_pll / (2 * r_pll)) % 2) == 0) {
+                               phy->pll_pre_p =
+                                       (m_pll / (2 * r_pll)) / 2 - 1;
+                               phy->pll_fbd_s =
+                                       (m_pll / (2 * r_pll)) % 2 + 2;
+                       } else {
+                               phy->pll_pre_p =
+                                       (m_pll / (2 * r_pll)) / 2;
+                               phy->pll_fbd_s =
+                                       (m_pll / (2 * r_pll)) % 2;
+                       }
+                       phy->pll_fbd_div1f = 0;
+                       phy->pll_fbd_div5f = 0;
+               } else {
+                       phy->pll_pre_p = 0;
+                       phy->pll_fbd_s = 0;
+                       phy->pll_fbd_div1f = 0;
+                       phy->pll_fbd_div5f = 1;
+               }
+
+               f_kHz = (u64)1000000000 * (u64)m_pll /
+                       ((u64)ref_clk_ps * (u64)n_pll * (u64)q_pll);
+
+               if (f_kHz >= req_kHz)
+                       break;
+
+               tmp_kHz += 10;
+
+       } while (true);
+
+       return f_kHz;
+}
+
+static void dsi_get_phy_params(u32 phy_req_kHz,
+                              struct mipi_phy_params *phy)
+{
+       u32 ref_clk_ps = PHY_REF_CLK_PERIOD_PS;
+       u32 phy_rate_kHz;
+       u32 ui;
+
+       memset(phy, 0, sizeof(*phy));
+
+       phy_rate_kHz = dsi_calc_phy_rate(phy_req_kHz, phy);
+       if (!phy_rate_kHz)
+               return;
+
+       ui = 1000000 / phy_rate_kHz;
+
+       phy->clk_t_lpx = ROUND(50, 8 * ui);
+       phy->clk_t_hs_prepare = ROUND(133, 16 * ui) - 1;
+
+       phy->clk_t_hs_zero = ROUND(262, 8 * ui);
+       phy->clk_t_hs_trial = 2 * (ROUND(60, 8 * ui) - 1);
+       phy->clk_t_wakeup = ROUND(1000000, (ref_clk_ps / 1000) - 1);
+       if (phy->clk_t_wakeup > 0xff)
+               phy->clk_t_wakeup = 0xff;
+       phy->data_t_wakeup = phy->clk_t_wakeup;
+       phy->data_t_lpx = phy->clk_t_lpx;
+       phy->data_t_hs_prepare = ROUND(125 + 10 * ui, 16 * ui) - 1;
+       phy->data_t_hs_zero = ROUND(105 + 6 * ui, 8 * ui);
+       phy->data_t_hs_trial = 2 * (ROUND(60 + 4 * ui, 8 * ui) - 1);
+       phy->data_t_ta_go = 3;
+       phy->data_t_ta_get = 4;
+
+       phy->pll_enbwt = 1;
+       phy->clklp2hs_time = ROUND(407, 8 * ui) + 12;
+       phy->clkhs2lp_time = ROUND(105 + 12 * ui, 8 * ui);
+       phy->lp2hs_time = ROUND(240 + 12 * ui, 8 * ui) + 1;
+       phy->hs2lp_time = phy->clkhs2lp_time;
+       phy->clk_to_data_delay = 1 + phy->clklp2hs_time;
+       phy->data_to_clk_delay = ROUND(60 + 52 * ui, 8 * ui) +
+                               phy->clkhs2lp_time;
+
+       phy->lane_byte_clk_kHz = phy_rate_kHz / 8;
+       phy->clk_division =
+               DIV_ROUND_UP(phy->lane_byte_clk_kHz, MAX_TX_ESC_CLK);
+}
+
+static u32 dsi_get_dpi_color_coding(enum mipi_dsi_pixel_format format)
+{
+       u32 val;
+
+       /*
+        * TODO: only support RGB888 now, to support more
+        */
+       switch (format) {
+       case MIPI_DSI_FMT_RGB888:
+               val = DSI_24BITS_1;
+               break;
+       default:
+               val = DSI_24BITS_1;
+               break;
+       }
+
+       return val;
+}
+
+/*
+ * dsi phy reg write function
+ */
+static void dsi_phy_tst_set(void __iomem *base, u32 reg, u32 val)
+{
+       u32 reg_write = 0x10000 + reg;
+
+       /*
+        * latch reg first
+        */
+       writel(reg_write, base + PHY_TST_CTRL1);
+       writel(0x02, base + PHY_TST_CTRL0);
+       writel(0x00, base + PHY_TST_CTRL0);
+
+       /*
+        * then latch value
+        */
+       writel(val, base + PHY_TST_CTRL1);
+       writel(0x02, base + PHY_TST_CTRL0);
+       writel(0x00, base + PHY_TST_CTRL0);
+}
+
+static void dsi_set_phy_timer(void __iomem *base,
+                             struct mipi_phy_params *phy,
+                             u32 lanes)
+{
+       u32 val;
+
+       /*
+        * Set lane value and phy stop wait time.
+        */
+       val = (lanes - 1) | (PHY_STOP_WAIT_TIME << 8);
+       writel(val, base + PHY_IF_CFG);
+
+       /*
+        * Set phy clk division.
+        */
+       val = readl(base + CLKMGR_CFG) | phy->clk_division;
+       writel(val, base + CLKMGR_CFG);
+
+       /*
+        * Set lp and hs switching params.
+        */
+       dw_update_bits(base + PHY_TMR_CFG, 24, MASK(8), phy->hs2lp_time);
+       dw_update_bits(base + PHY_TMR_CFG, 16, MASK(8), phy->lp2hs_time);
+       dw_update_bits(base + PHY_TMR_LPCLK_CFG, 16, MASK(10),
+                      phy->clkhs2lp_time);
+       dw_update_bits(base + PHY_TMR_LPCLK_CFG, 0, MASK(10),
+                      phy->clklp2hs_time);
+       dw_update_bits(base + CLK_DATA_TMR_CFG, 8, MASK(8),
+                      phy->data_to_clk_delay);
+       dw_update_bits(base + CLK_DATA_TMR_CFG, 0, MASK(8),
+                      phy->clk_to_data_delay);
+}
+
+static void dsi_set_mipi_phy(void __iomem *base,
+                            struct mipi_phy_params *phy,
+                            u32 lanes)
+{
+       u32 delay_count;
+       u32 val;
+       u32 i;
+
+       /* phy timer setting */
+       dsi_set_phy_timer(base, phy, lanes);
+
+       /*
+        * Reset to clean up phy tst params.
+        */
+       writel(0, base + PHY_RSTZ);
+       writel(0, base + PHY_TST_CTRL0);
+       writel(1, base + PHY_TST_CTRL0);
+       writel(0, base + PHY_TST_CTRL0);
+
+       /*
+        * Clock lane timing control setting: TLPX, THS-PREPARE,
+        * THS-ZERO, THS-TRAIL, TWAKEUP.
+        */
+       dsi_phy_tst_set(base, CLK_TLPX, phy->clk_t_lpx);
+       dsi_phy_tst_set(base, CLK_THS_PREPARE, phy->clk_t_hs_prepare);
+       dsi_phy_tst_set(base, CLK_THS_ZERO, phy->clk_t_hs_zero);
+       dsi_phy_tst_set(base, CLK_THS_TRAIL, phy->clk_t_hs_trial);
+       dsi_phy_tst_set(base, CLK_TWAKEUP, phy->clk_t_wakeup);
+
+       /*
+        * Data lane timing control setting: TLPX, THS-PREPARE,
+        * THS-ZERO, THS-TRAIL, TTA-GO, TTA-GET, TWAKEUP.
+        */
+       for (i = 0; i < lanes; i++) {
+               dsi_phy_tst_set(base, DATA_TLPX(i), phy->data_t_lpx);
+               dsi_phy_tst_set(base, DATA_THS_PREPARE(i),
+                               phy->data_t_hs_prepare);
+               dsi_phy_tst_set(base, DATA_THS_ZERO(i), phy->data_t_hs_zero);
+               dsi_phy_tst_set(base, DATA_THS_TRAIL(i), phy->data_t_hs_trial);
+               dsi_phy_tst_set(base, DATA_TTA_GO(i), phy->data_t_ta_go);
+               dsi_phy_tst_set(base, DATA_TTA_GET(i), phy->data_t_ta_get);
+               dsi_phy_tst_set(base, DATA_TWAKEUP(i), phy->data_t_wakeup);
+       }
+
+       /*
+        * physical configuration: I, pll I, pll II, pll III,
+        * pll IV, pll V.
+        */
+       dsi_phy_tst_set(base, PHY_CFG_I, phy->hstx_ckg_sel);
+       val = (phy->pll_fbd_div5f << 5) + (phy->pll_fbd_div1f << 4) +
+                               (phy->pll_fbd_2p << 1) + phy->pll_enbwt;
+       dsi_phy_tst_set(base, PHY_CFG_PLL_I, val);
+       dsi_phy_tst_set(base, PHY_CFG_PLL_II, phy->pll_fbd_p);
+       dsi_phy_tst_set(base, PHY_CFG_PLL_III, phy->pll_fbd_s);
+       val = (phy->pll_pre_div1p << 7) + phy->pll_pre_p;
+       dsi_phy_tst_set(base, PHY_CFG_PLL_IV, val);
+       val = (5 << 5) + (phy->pll_vco_750M << 4) + (phy->pll_lpf_rs << 2) +
+               phy->pll_lpf_cs;
+       dsi_phy_tst_set(base, PHY_CFG_PLL_V, val);
+
+       writel(PHY_ENABLECLK, base + PHY_RSTZ);
+       udelay(1);
+       writel(PHY_ENABLECLK | PHY_UNSHUTDOWNZ, base + PHY_RSTZ);
+       udelay(1);
+       writel(PHY_ENABLECLK | PHY_UNRSTZ | PHY_UNSHUTDOWNZ, base + PHY_RSTZ);
+       usleep_range(1000, 1500);
+
+       /*
+        * wait for phy's clock ready
+        */
+       delay_count = 100;
+       while (delay_count) {
+               val = readl(base +  PHY_STATUS);
+               if ((BIT(0) | BIT(2)) & val)
+                       break;
+
+               udelay(1);
+               delay_count--;
+       }
+
+       if (!delay_count)
+               DRM_INFO("phylock and phystopstateclklane is not ready.\n");
+}
+
+static void dsi_set_mode_timing(void __iomem *base,
+                               u32 lane_byte_clk_kHz,
+                               struct drm_display_mode *mode,
+                               enum mipi_dsi_pixel_format format)
+{
+       u32 hfp, hbp, hsw, vfp, vbp, vsw;
+       u32 hline_time;
+       u32 hsa_time;
+       u32 hbp_time;
+       u32 pixel_clk_kHz;
+       int htot, vtot;
+       u32 val;
+       u64 tmp;
+
+       val = dsi_get_dpi_color_coding(format);
+       writel(val, base + DPI_COLOR_CODING);
+
+       val = (mode->flags & DRM_MODE_FLAG_NHSYNC ? 1 : 0) << 2;
+       val |= (mode->flags & DRM_MODE_FLAG_NVSYNC ? 1 : 0) << 1;
+       writel(val, base +  DPI_CFG_POL);
+
+       /*
+        * The DSI IP accepts vertical timing using lines as normal,
+        * but horizontal timing is a mixture of pixel-clocks for the
+        * active region and byte-lane clocks for the blanking-related
+        * timings.  hfp is specified as the total hline_time in byte-
+        * lane clocks minus hsa, hbp and active.
+        */
+       pixel_clk_kHz = mode->clock;
+       htot = mode->htotal;
+       vtot = mode->vtotal;
+       hfp = mode->hsync_start - mode->hdisplay;
+       hbp = mode->htotal - mode->hsync_end;
+       hsw = mode->hsync_end - mode->hsync_start;
+       vfp = mode->vsync_start - mode->vdisplay;
+       vbp = mode->vtotal - mode->vsync_end;
+       vsw = mode->vsync_end - mode->vsync_start;
+       if (vsw > 15) {
+               DRM_DEBUG_DRIVER("vsw exceeded 15\n");
+               vsw = 15;
+       }
+
+       hsa_time = (hsw * lane_byte_clk_kHz) / pixel_clk_kHz;
+       hbp_time = (hbp * lane_byte_clk_kHz) / pixel_clk_kHz;
+       tmp = (u64)htot * (u64)lane_byte_clk_kHz;
+       hline_time = DIV_ROUND_UP(tmp, pixel_clk_kHz);
+
+       /* all specified in byte-lane clocks */
+       writel(hsa_time, base + VID_HSA_TIME);
+       writel(hbp_time, base + VID_HBP_TIME);
+       writel(hline_time, base + VID_HLINE_TIME);
+
+       writel(vsw, base + VID_VSA_LINES);
+       writel(vbp, base + VID_VBP_LINES);
+       writel(vfp, base + VID_VFP_LINES);
+       writel(mode->vdisplay, base + VID_VACTIVE_LINES);
+       writel(mode->hdisplay, base + VID_PKT_SIZE);
+
+       DRM_DEBUG_DRIVER("htot=%d, hfp=%d, hbp=%d, hsw=%d\n",
+                        htot, hfp, hbp, hsw);
+       DRM_DEBUG_DRIVER("vtol=%d, vfp=%d, vbp=%d, vsw=%d\n",
+                        vtot, vfp, vbp, vsw);
+       DRM_DEBUG_DRIVER("hsa_time=%d, hbp_time=%d, hline_time=%d\n",
+                        hsa_time, hbp_time, hline_time);
+}
+
+static void dsi_set_video_mode(void __iomem *base, unsigned long flags)
+{
+       u32 val;
+       u32 mode_mask = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
+               MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+       u32 non_burst_sync_pulse = MIPI_DSI_MODE_VIDEO |
+               MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
+       u32 non_burst_sync_event = MIPI_DSI_MODE_VIDEO;
+
+       /*
+        * choose video mode type
+        */
+       if ((flags & mode_mask) == non_burst_sync_pulse)
+               val = DSI_NON_BURST_SYNC_PULSES;
+       else if ((flags & mode_mask) == non_burst_sync_event)
+               val = DSI_NON_BURST_SYNC_EVENTS;
+       else
+               val = DSI_BURST_SYNC_PULSES_1;
+       writel(val, base + VID_MODE_CFG);
+
+       writel(PHY_TXREQUESTCLKHS, base + LPCLK_CTRL);
+       writel(DSI_VIDEO_MODE, base + MODE_CFG);
+}
+
+static void dsi_mipi_init(struct dw_dsi *dsi)
+{
+       struct dsi_hw_ctx *ctx = dsi->ctx;
+       struct mipi_phy_params *phy = &dsi->phy;
+       struct drm_display_mode *mode = &dsi->cur_mode;
+       u32 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
+       void __iomem *base = ctx->base;
+       u32 dphy_req_kHz;
+
+       /*
+        * count phy params
+        */
+       dphy_req_kHz = mode->clock * bpp / dsi->lanes;
+       dsi_get_phy_params(dphy_req_kHz, phy);
+
+       /* reset Core */
+       writel(RESET, base + PWR_UP);
+
+       /* set dsi phy params */
+       dsi_set_mipi_phy(base, phy, dsi->lanes);
+
+       /* set dsi mode timing */
+       dsi_set_mode_timing(base, phy->lane_byte_clk_kHz, mode, dsi->format);
+
+       /* set dsi video mode */
+       dsi_set_video_mode(base, dsi->mode_flags);
+
+       /* dsi wake up */
+       writel(POWERUP, base + PWR_UP);
+
+       DRM_DEBUG_DRIVER("lanes=%d, pixel_clk=%d kHz, bytes_freq=%d kHz\n",
+                        dsi->lanes, mode->clock, phy->lane_byte_clk_kHz);
+}
+
+static void dsi_encoder_disable(struct drm_encoder *encoder)
+{
+       struct dw_dsi *dsi = encoder_to_dsi(encoder);
+       struct dsi_hw_ctx *ctx = dsi->ctx;
+       void __iomem *base = ctx->base;
+
+       if (!dsi->enable)
+               return;
+
+       writel(0, base + PWR_UP);
+       writel(0, base + LPCLK_CTRL);
+       writel(0, base + PHY_RSTZ);
+       clk_disable_unprepare(ctx->pclk);
+
+       dsi->enable = false;
+}
+
+static void dsi_encoder_enable(struct drm_encoder *encoder)
+{
+       struct dw_dsi *dsi = encoder_to_dsi(encoder);
+       struct dsi_hw_ctx *ctx = dsi->ctx;
+       int ret;
+
+       if (dsi->enable)
+               return;
+
+       ret = clk_prepare_enable(ctx->pclk);
+       if (ret) {
+               DRM_ERROR("fail to enable pclk: %d\n", ret);
+               return;
+       }
+
+       dsi_mipi_init(dsi);
+
+       dsi->enable = true;
+}
+
+static void dsi_encoder_mode_set(struct drm_encoder *encoder,
+                                struct drm_display_mode *mode,
+                                struct drm_display_mode *adj_mode)
+{
+       struct dw_dsi *dsi = encoder_to_dsi(encoder);
+
+       drm_mode_copy(&dsi->cur_mode, adj_mode);
+}
+
+static int dsi_encoder_atomic_check(struct drm_encoder *encoder,
+                                   struct drm_crtc_state *crtc_state,
+                                   struct drm_connector_state *conn_state)
+{
+       /* do nothing */
+       return 0;
+}
+
+static const struct drm_encoder_helper_funcs dw_encoder_helper_funcs = {
+       .atomic_check   = dsi_encoder_atomic_check,
+       .mode_set       = dsi_encoder_mode_set,
+       .enable         = dsi_encoder_enable,
+       .disable        = dsi_encoder_disable
+};
+
+static const struct drm_encoder_funcs dw_encoder_funcs = {
+       .destroy = drm_encoder_cleanup,
+};
+
+static int dw_drm_encoder_init(struct device *dev,
+                              struct drm_device *drm_dev,
+                              struct drm_encoder *encoder)
+{
+       int ret;
+       u32 crtc_mask = drm_of_find_possible_crtcs(drm_dev, dev->of_node);
+
+       if (!crtc_mask) {
+               DRM_ERROR("failed to find crtc mask\n");
+               return -EINVAL;
+       }
+
+       encoder->possible_crtcs = crtc_mask;
+       ret = drm_encoder_init(drm_dev, encoder, &dw_encoder_funcs,
+                              DRM_MODE_ENCODER_DSI, NULL);
+       if (ret) {
+               DRM_ERROR("failed to init dsi encoder\n");
+               return ret;
+       }
+
+       drm_encoder_helper_add(encoder, &dw_encoder_helper_funcs);
+
+       return 0;
+}
+
+static int dsi_host_attach(struct mipi_dsi_host *host,
+                          struct mipi_dsi_device *mdsi)
+{
+       struct dw_dsi *dsi = host_to_dsi(host);
+
+       if (mdsi->lanes < 1 || mdsi->lanes > 4) {
+               DRM_ERROR("dsi device params invalid\n");
+               return -EINVAL;
+       }
+
+       dsi->lanes = mdsi->lanes;
+       dsi->format = mdsi->format;
+       dsi->mode_flags = mdsi->mode_flags;
+
+       return 0;
+}
+
+static int dsi_host_detach(struct mipi_dsi_host *host,
+                          struct mipi_dsi_device *mdsi)
+{
+       /* do nothing */
+       return 0;
+}
+
+static const struct mipi_dsi_host_ops dsi_host_ops = {
+       .attach = dsi_host_attach,
+       .detach = dsi_host_detach,
+};
+
+static int dsi_host_init(struct device *dev, struct dw_dsi *dsi)
+{
+       struct mipi_dsi_host *host = &dsi->host;
+       int ret;
+
+       host->dev = dev;
+       host->ops = &dsi_host_ops;
+       ret = mipi_dsi_host_register(host);
+       if (ret) {
+               DRM_ERROR("failed to register dsi host\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int dsi_bridge_init(struct drm_device *dev, struct dw_dsi *dsi)
+{
+       struct drm_encoder *encoder = &dsi->encoder;
+       struct drm_bridge *bridge = dsi->bridge;
+       int ret;
+
+       /* associate the bridge to dsi encoder */
+       encoder->bridge = bridge;
+       bridge->encoder = encoder;
+
+       ret = drm_bridge_attach(dev, bridge);
+       if (ret) {
+               DRM_ERROR("failed to attach external bridge\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int dsi_bind(struct device *dev, struct device *master, void *data)
+{
+       struct dsi_data *ddata = dev_get_drvdata(dev);
+       struct dw_dsi *dsi = &ddata->dsi;
+       struct drm_device *drm_dev = data;
+       int ret;
+
+       ret = dw_drm_encoder_init(dev, drm_dev, &dsi->encoder);
+       if (ret)
+               return ret;
+
+       ret = dsi_host_init(dev, dsi);
+       if (ret)
+               return ret;
+
+       ret = dsi_bridge_init(drm_dev, dsi);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static void dsi_unbind(struct device *dev, struct device *master, void *data)
+{
+       /* do nothing */
+}
+
+static const struct component_ops dsi_ops = {
+       .bind   = dsi_bind,
+       .unbind = dsi_unbind,
+};
+
+static int dsi_parse_dt(struct platform_device *pdev, struct dw_dsi *dsi)
+{
+       struct dsi_hw_ctx *ctx = dsi->ctx;
+       struct device_node *np = pdev->dev.of_node;
+       struct device_node *endpoint, *bridge_node;
+       struct drm_bridge *bridge;
+       struct resource *res;
+
+       /*
+        * Get the endpoint node. In our case, dsi has one output port1
+        * to which the external HDMI bridge is connected.
+        */
+       endpoint = of_graph_get_endpoint_by_regs(np, 1, -1);
+       if (!endpoint) {
+               DRM_ERROR("no valid endpoint node\n");
+               return -ENODEV;
+       }
+       of_node_put(endpoint);
+
+       bridge_node = of_graph_get_remote_port_parent(endpoint);
+       if (!bridge_node) {
+               DRM_ERROR("no valid bridge node\n");
+               return -ENODEV;
+       }
+       of_node_put(bridge_node);
+
+       bridge = of_drm_find_bridge(bridge_node);
+       if (!bridge) {
+               DRM_INFO("wait for external HDMI bridge driver.\n");
+               return -EPROBE_DEFER;
+       }
+       dsi->bridge = bridge;
+
+       ctx->pclk = devm_clk_get(&pdev->dev, "pclk");
+       if (IS_ERR(ctx->pclk)) {
+               DRM_ERROR("failed to get pclk clock\n");
+               return PTR_ERR(ctx->pclk);
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       ctx->base = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(ctx->base)) {
+               DRM_ERROR("failed to remap dsi io region\n");
+               return PTR_ERR(ctx->base);
+       }
+
+       return 0;
+}
+
+static int dsi_probe(struct platform_device *pdev)
+{
+       struct dsi_data *data;
+       struct dw_dsi *dsi;
+       struct dsi_hw_ctx *ctx;
+       int ret;
+
+       data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+       if (!data) {
+               DRM_ERROR("failed to allocate dsi data.\n");
+               return -ENOMEM;
+       }
+       dsi = &data->dsi;
+       ctx = &data->ctx;
+       dsi->ctx = ctx;
+
+       ret = dsi_parse_dt(pdev, dsi);
+       if (ret)
+               return ret;
+
+       platform_set_drvdata(pdev, data);
+
+       return component_add(&pdev->dev, &dsi_ops);
+}
+
+static int dsi_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &dsi_ops);
+
+       return 0;
+}
+
+static const struct of_device_id dsi_of_match[] = {
+       {.compatible = "hisilicon,hi6220-dsi"},
+       { }
+};
+MODULE_DEVICE_TABLE(of, dsi_of_match);
+
+static struct platform_driver dsi_driver = {
+       .probe = dsi_probe,
+       .remove = dsi_remove,
+       .driver = {
+               .name = "dw-dsi",
+               .of_match_table = dsi_of_match,
+       },
+};
+
+module_platform_driver(dsi_driver);
+
+MODULE_AUTHOR("Xinliang Liu <xinliang.liu@linaro.org>");
+MODULE_AUTHOR("Xinliang Liu <z.liuxinliang@hisilicon.com>");
+MODULE_AUTHOR("Xinwei Kong <kong.kongxinwei@hisilicon.com>");
+MODULE_DESCRIPTION("DesignWare MIPI DSI Host Controller v1.02 driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h b/drivers/gpu/drm/hisilicon/kirin/dw_dsi_reg.h
new file mode 100644 (file)
index 0000000..18808fc
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DW_DSI_REG_H__
+#define __DW_DSI_REG_H__
+
+#define MASK(x)                                (BIT(x) - 1)
+
+/*
+ * regs
+ */
+#define PWR_UP                  0x04  /* Core power-up */
+#define RESET                   0
+#define POWERUP                 BIT(0)
+#define PHY_IF_CFG              0xA4  /* D-PHY interface configuration */
+#define CLKMGR_CFG              0x08  /* the internal clock dividers */
+#define PHY_RSTZ                0xA0  /* D-PHY reset control */
+#define PHY_ENABLECLK           BIT(2)
+#define PHY_UNRSTZ              BIT(1)
+#define PHY_UNSHUTDOWNZ         BIT(0)
+#define PHY_TST_CTRL0           0xB4  /* D-PHY test interface control 0 */
+#define PHY_TST_CTRL1           0xB8  /* D-PHY test interface control 1 */
+#define CLK_TLPX                0x10
+#define CLK_THS_PREPARE         0x11
+#define CLK_THS_ZERO            0x12
+#define CLK_THS_TRAIL           0x13
+#define CLK_TWAKEUP             0x14
+#define DATA_TLPX(x)            (0x20 + ((x) << 4))
+#define DATA_THS_PREPARE(x)     (0x21 + ((x) << 4))
+#define DATA_THS_ZERO(x)        (0x22 + ((x) << 4))
+#define DATA_THS_TRAIL(x)       (0x23 + ((x) << 4))
+#define DATA_TTA_GO(x)          (0x24 + ((x) << 4))
+#define DATA_TTA_GET(x)         (0x25 + ((x) << 4))
+#define DATA_TWAKEUP(x)         (0x26 + ((x) << 4))
+#define PHY_CFG_I               0x60
+#define PHY_CFG_PLL_I           0x63
+#define PHY_CFG_PLL_II          0x64
+#define PHY_CFG_PLL_III         0x65
+#define PHY_CFG_PLL_IV          0x66
+#define PHY_CFG_PLL_V           0x67
+#define DPI_COLOR_CODING        0x10  /* DPI color coding */
+#define DPI_CFG_POL             0x14  /* DPI polarity configuration */
+#define VID_HSA_TIME            0x48  /* Horizontal Sync Active time */
+#define VID_HBP_TIME            0x4C  /* Horizontal Back Porch time */
+#define VID_HLINE_TIME          0x50  /* Line time */
+#define VID_VSA_LINES           0x54  /* Vertical Sync Active period */
+#define VID_VBP_LINES           0x58  /* Vertical Back Porch period */
+#define VID_VFP_LINES           0x5C  /* Vertical Front Porch period */
+#define VID_VACTIVE_LINES       0x60  /* Vertical resolution */
+#define VID_PKT_SIZE            0x3C  /* Video packet size */
+#define VID_MODE_CFG            0x38  /* Video mode configuration */
+#define PHY_TMR_CFG             0x9C  /* Data lanes timing configuration */
+#define BTA_TO_CNT              0x8C  /* Response timeout definition */
+#define PHY_TMR_LPCLK_CFG       0x98  /* clock lane timing configuration */
+#define CLK_DATA_TMR_CFG        0xCC
+#define LPCLK_CTRL              0x94  /* Low-power in clock lane */
+#define PHY_TXREQUESTCLKHS      BIT(0)
+#define MODE_CFG                0x34  /* Video or Command mode selection */
+#define PHY_STATUS              0xB0  /* D-PHY PPI status interface */
+
+#define        PHY_STOP_WAIT_TIME      0x30
+
+/*
+ * regs relevant enum
+ */
+enum dpi_color_coding {
+       DSI_24BITS_1 = 5,
+};
+
+enum dsi_video_mode_type {
+       DSI_NON_BURST_SYNC_PULSES = 0,
+       DSI_NON_BURST_SYNC_EVENTS,
+       DSI_BURST_SYNC_PULSES_1,
+       DSI_BURST_SYNC_PULSES_2
+};
+
+enum dsi_work_mode {
+       DSI_VIDEO_MODE = 0,
+       DSI_COMMAND_MODE
+};
+
+/*
+ * Register Write/Read Helper functions
+ */
+static inline void dw_update_bits(void __iomem *addr, u32 bit_start,
+                                 u32 mask, u32 val)
+{
+       u32 tmp, orig;
+
+       orig = readl(addr);
+       tmp = orig & ~(mask << bit_start);
+       tmp |= (val & mask) << bit_start;
+       writel(tmp, addr);
+}
+
+#endif /* __DW_DRM_DSI_H__ */
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h b/drivers/gpu/drm/hisilicon/kirin/kirin_ade_reg.h
new file mode 100644 (file)
index 0000000..4cf281b
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __KIRIN_ADE_REG_H__
+#define __KIRIN_ADE_REG_H__
+
+/*
+ * ADE Registers
+ */
+#define MASK(x)                                (BIT(x) - 1)
+
+#define ADE_CTRL                       0x0004
+#define FRM_END_START_OFST             0
+#define FRM_END_START_MASK             MASK(2)
+#define AUTO_CLK_GATE_EN_OFST          0
+#define AUTO_CLK_GATE_EN               BIT(0)
+#define ADE_DISP_SRC_CFG               0x0018
+#define ADE_CTRL1                      0x008C
+#define ADE_EN                         0x0100
+#define ADE_DISABLE                    0
+#define ADE_ENABLE                     1
+/* reset and reload regs */
+#define ADE_SOFT_RST_SEL(x)            (0x0078 + (x) * 0x4)
+#define ADE_RELOAD_DIS(x)              (0x00AC + (x) * 0x4)
+#define RDMA_OFST                      0
+#define CLIP_OFST                      15
+#define SCL_OFST                       21
+#define CTRAN_OFST                     24
+#define OVLY_OFST                      37 /* 32+5 */
+/* channel regs */
+#define RD_CH_CTRL(x)                  (0x1004 + (x) * 0x80)
+#define RD_CH_ADDR(x)                  (0x1008 + (x) * 0x80)
+#define RD_CH_SIZE(x)                  (0x100C + (x) * 0x80)
+#define RD_CH_STRIDE(x)                        (0x1010 + (x) * 0x80)
+#define RD_CH_SPACE(x)                 (0x1014 + (x) * 0x80)
+#define RD_CH_EN(x)                    (0x1020 + (x) * 0x80)
+/* overlay regs */
+#define ADE_OVLY1_TRANS_CFG            0x002C
+#define ADE_OVLY_CTL                   0x0098
+#define ADE_OVLY_CH_XY0(x)             (0x2004 + (x) * 4)
+#define ADE_OVLY_CH_XY1(x)             (0x2024 + (x) * 4)
+#define ADE_OVLY_CH_CTL(x)             (0x204C + (x) * 4)
+#define ADE_OVLY_OUTPUT_SIZE(x)                (0x2070 + (x) * 8)
+#define OUTPUT_XSIZE_OFST              16
+#define ADE_OVLYX_CTL(x)               (0x209C + (x) * 4)
+#define CH_OVLY_SEL_OFST(x)            ((x) * 4)
+#define CH_OVLY_SEL_MASK               MASK(2)
+#define CH_OVLY_SEL_VAL(x)             ((x) + 1)
+#define CH_ALP_MODE_OFST               0
+#define CH_ALP_SEL_OFST                        2
+#define CH_UNDER_ALP_SEL_OFST          4
+#define CH_EN_OFST                     6
+#define CH_ALP_GBL_OFST                        15
+#define CH_SEL_OFST                    28
+/* ctran regs */
+#define ADE_CTRAN_DIS(x)               (0x5004 + (x) * 0x100)
+#define CTRAN_BYPASS_ON                        1
+#define CTRAN_BYPASS_OFF               0
+#define ADE_CTRAN_IMAGE_SIZE(x)                (0x503C + (x) * 0x100)
+/* clip regs */
+#define ADE_CLIP_DISABLE(x)            (0x6800 + (x) * 0x100)
+#define ADE_CLIP_SIZE0(x)              (0x6804 + (x) * 0x100)
+#define ADE_CLIP_SIZE1(x)              (0x6808 + (x) * 0x100)
+
+/*
+ * LDI Registers
+ */
+#define LDI_HRZ_CTRL0                  0x7400
+#define HBP_OFST                       20
+#define LDI_HRZ_CTRL1                  0x7404
+#define LDI_VRT_CTRL0                  0x7408
+#define VBP_OFST                       20
+#define LDI_VRT_CTRL1                  0x740C
+#define LDI_PLR_CTRL                   0x7410
+#define FLAG_NVSYNC                    BIT(0)
+#define FLAG_NHSYNC                    BIT(1)
+#define FLAG_NPIXCLK                   BIT(2)
+#define FLAG_NDE                       BIT(3)
+#define LDI_DSP_SIZE                   0x7414
+#define VSIZE_OFST                     20
+#define LDI_INT_EN                     0x741C
+#define FRAME_END_INT_EN_OFST          1
+#define LDI_CTRL                       0x7420
+#define BPP_OFST                       3
+#define DATA_GATE_EN                   BIT(2)
+#define LDI_EN                         BIT(0)
+#define LDI_MSK_INT                    0x7428
+#define LDI_INT_CLR                    0x742C
+#define LDI_WORK_MODE                  0x7430
+#define LDI_HDMI_DSI_GT                        0x7434
+
+/*
+ * ADE media bus service regs
+ */
+#define ADE0_QOSGENERATOR_MODE         0x010C
+#define QOSGENERATOR_MODE_MASK         MASK(2)
+#define ADE0_QOSGENERATOR_EXTCONTROL   0x0118
+#define SOCKET_QOS_EN                  BIT(0)
+#define ADE1_QOSGENERATOR_MODE         0x020C
+#define ADE1_QOSGENERATOR_EXTCONTROL   0x0218
+
+/*
+ * ADE regs relevant enums
+ */
+enum frame_end_start {
+       /* regs take effect in every vsync */
+       REG_EFFECTIVE_IN_VSYNC = 0,
+       /* regs take effect in fist ade en and every frame end */
+       REG_EFFECTIVE_IN_ADEEN_FRMEND,
+       /* regs take effect in ade en immediately */
+       REG_EFFECTIVE_IN_ADEEN,
+       /* regs take effect in first vsync and every frame end */
+       REG_EFFECTIVE_IN_VSYNC_FRMEND
+};
+
+enum ade_fb_format {
+       ADE_RGB_565 = 0,
+       ADE_BGR_565,
+       ADE_XRGB_8888,
+       ADE_XBGR_8888,
+       ADE_ARGB_8888,
+       ADE_ABGR_8888,
+       ADE_RGBA_8888,
+       ADE_BGRA_8888,
+       ADE_RGB_888,
+       ADE_BGR_888 = 9,
+       ADE_FORMAT_UNSUPPORT = 800
+};
+
+enum ade_channel {
+       ADE_CH1 = 0,    /* channel 1 for primary plane */
+       ADE_CH_NUM
+};
+
+enum ade_scale {
+       ADE_SCL1 = 0,
+       ADE_SCL2,
+       ADE_SCL3,
+       ADE_SCL_NUM
+};
+
+enum ade_ctran {
+       ADE_CTRAN1 = 0,
+       ADE_CTRAN2,
+       ADE_CTRAN3,
+       ADE_CTRAN4,
+       ADE_CTRAN5,
+       ADE_CTRAN6,
+       ADE_CTRAN_NUM
+};
+
+enum ade_overlay {
+       ADE_OVLY1 = 0,
+       ADE_OVLY2,
+       ADE_OVLY3,
+       ADE_OVLY_NUM
+};
+
+enum ade_alpha_mode {
+       ADE_ALP_GLOBAL = 0,
+       ADE_ALP_PIXEL,
+       ADE_ALP_PIXEL_AND_GLB
+};
+
+enum ade_alpha_blending_mode {
+       ADE_ALP_MUL_COEFF_0 = 0,        /* alpha */
+       ADE_ALP_MUL_COEFF_1,            /* 1-alpha */
+       ADE_ALP_MUL_COEFF_2,            /* 0 */
+       ADE_ALP_MUL_COEFF_3             /* 1 */
+};
+
+/*
+ * LDI regs relevant enums
+ */
+enum dsi_pclk_en {
+       DSI_PCLK_ON = 0,
+       DSI_PCLK_OFF
+};
+
+enum ldi_output_format {
+       LDI_OUT_RGB_565 = 0,
+       LDI_OUT_RGB_666,
+       LDI_OUT_RGB_888
+};
+
+enum ldi_work_mode {
+       TEST_MODE = 0,
+       NORMAL_MODE
+};
+
+enum ldi_input_source {
+       DISP_SRC_NONE = 0,
+       DISP_SRC_OVLY2,
+       DISP_SRC_DISP,
+       DISP_SRC_ROT,
+       DISP_SRC_SCL2
+};
+
+/*
+ * ADE media bus service relevant enums
+ */
+enum qos_generator_mode {
+       FIXED_MODE = 0,
+       LIMITER_MODE,
+       BYPASS_MODE,
+       REGULATOR_MODE
+};
+
+/*
+ * Register Write/Read Helper functions
+ */
+static inline void ade_update_bits(void __iomem *addr, u32 bit_start,
+                                  u32 mask, u32 val)
+{
+       u32 tmp, orig;
+
+       orig = readl(addr);
+       tmp = orig & ~(mask << bit_start);
+       tmp |= (val & mask) << bit_start;
+       writel(tmp, addr);
+}
+
+#endif
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c
new file mode 100644 (file)
index 0000000..fba6372
--- /dev/null
@@ -0,0 +1,1057 @@
+/*
+ * Hisilicon Hi6220 SoC ADE(Advanced Display Engine)'s crtc&plane driver
+ *
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * Author:
+ *     Xinliang Liu <z.liuxinliang@hisilicon.com>
+ *     Xinliang Liu <xinliang.liu@linaro.org>
+ *     Xinwei Kong <kong.kongxinwei@hisilicon.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/bitops.h>
+#include <linux/clk.h>
+#include <video/display_timing.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_plane_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+
+#include "kirin_drm_drv.h"
+#include "kirin_ade_reg.h"
+
+#define PRIMARY_CH     ADE_CH1 /* primary plane */
+#define OUT_OVLY       ADE_OVLY2 /* output overlay compositor */
+#define ADE_DEBUG      1
+
+#define to_ade_crtc(crtc) \
+       container_of(crtc, struct ade_crtc, base)
+
+#define to_ade_plane(plane) \
+       container_of(plane, struct ade_plane, base)
+
+struct ade_hw_ctx {
+       void __iomem  *base;
+       struct regmap *noc_regmap;
+       struct clk *ade_core_clk;
+       struct clk *media_noc_clk;
+       struct clk *ade_pix_clk;
+       struct reset_control *reset;
+       bool power_on;
+       int irq;
+};
+
+struct ade_crtc {
+       struct drm_crtc base;
+       struct ade_hw_ctx *ctx;
+       bool enable;
+       u32 out_format;
+};
+
+struct ade_plane {
+       struct drm_plane base;
+       void *ctx;
+       u8 ch; /* channel */
+};
+
+struct ade_data {
+       struct ade_crtc acrtc;
+       struct ade_plane aplane[ADE_CH_NUM];
+       struct ade_hw_ctx ctx;
+};
+
+/* ade-format info: */
+struct ade_format {
+       u32 pixel_format;
+       enum ade_fb_format ade_format;
+};
+
+static const struct ade_format ade_formats[] = {
+       /* 16bpp RGB: */
+       { DRM_FORMAT_RGB565, ADE_RGB_565 },
+       { DRM_FORMAT_BGR565, ADE_BGR_565 },
+       /* 24bpp RGB: */
+       { DRM_FORMAT_RGB888, ADE_RGB_888 },
+       { DRM_FORMAT_BGR888, ADE_BGR_888 },
+       /* 32bpp [A]RGB: */
+       { DRM_FORMAT_XRGB8888, ADE_XRGB_8888 },
+       { DRM_FORMAT_XBGR8888, ADE_XBGR_8888 },
+       { DRM_FORMAT_RGBA8888, ADE_RGBA_8888 },
+       { DRM_FORMAT_BGRA8888, ADE_BGRA_8888 },
+       { DRM_FORMAT_ARGB8888, ADE_ARGB_8888 },
+       { DRM_FORMAT_ABGR8888, ADE_ABGR_8888 },
+};
+
+static const u32 channel_formats1[] = {
+       /* channel 1,2,3,4 */
+       DRM_FORMAT_RGB565, DRM_FORMAT_BGR565, DRM_FORMAT_RGB888,
+       DRM_FORMAT_BGR888, DRM_FORMAT_XRGB8888, DRM_FORMAT_XBGR8888,
+       DRM_FORMAT_RGBA8888, DRM_FORMAT_BGRA8888, DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_ABGR8888
+};
+
+u32 ade_get_channel_formats(u8 ch, const u32 **formats)
+{
+       switch (ch) {
+       case ADE_CH1:
+               *formats = channel_formats1;
+               return ARRAY_SIZE(channel_formats1);
+       default:
+               DRM_ERROR("no this channel %d\n", ch);
+               *formats = NULL;
+               return 0;
+       }
+}
+
+/* convert from fourcc format to ade format */
+static u32 ade_get_format(u32 pixel_format)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ade_formats); i++)
+               if (ade_formats[i].pixel_format == pixel_format)
+                       return ade_formats[i].ade_format;
+
+       /* not found */
+       DRM_ERROR("Not found pixel format!!fourcc_format= %d\n",
+                 pixel_format);
+       return ADE_FORMAT_UNSUPPORT;
+}
+
+static void ade_update_reload_bit(void __iomem *base, u32 bit_num, u32 val)
+{
+       u32 bit_ofst, reg_num;
+
+       bit_ofst = bit_num % 32;
+       reg_num = bit_num / 32;
+
+       ade_update_bits(base + ADE_RELOAD_DIS(reg_num), bit_ofst,
+                       MASK(1), !!val);
+}
+
+static u32 ade_read_reload_bit(void __iomem *base, u32 bit_num)
+{
+       u32 tmp, bit_ofst, reg_num;
+
+       bit_ofst = bit_num % 32;
+       reg_num = bit_num / 32;
+
+       tmp = readl(base + ADE_RELOAD_DIS(reg_num));
+       return !!(BIT(bit_ofst) & tmp);
+}
+
+static void ade_init(struct ade_hw_ctx *ctx)
+{
+       void __iomem *base = ctx->base;
+
+       /* enable clk gate */
+       ade_update_bits(base + ADE_CTRL1, AUTO_CLK_GATE_EN_OFST,
+                       AUTO_CLK_GATE_EN, ADE_ENABLE);
+       /* clear overlay */
+       writel(0, base + ADE_OVLY1_TRANS_CFG);
+       writel(0, base + ADE_OVLY_CTL);
+       writel(0, base + ADE_OVLYX_CTL(OUT_OVLY));
+       /* clear reset and reload regs */
+       writel(MASK(32), base + ADE_SOFT_RST_SEL(0));
+       writel(MASK(32), base + ADE_SOFT_RST_SEL(1));
+       writel(MASK(32), base + ADE_RELOAD_DIS(0));
+       writel(MASK(32), base + ADE_RELOAD_DIS(1));
+       /*
+        * for video mode, all the ade registers should
+        * become effective at frame end.
+        */
+       ade_update_bits(base + ADE_CTRL, FRM_END_START_OFST,
+                       FRM_END_START_MASK, REG_EFFECTIVE_IN_ADEEN_FRMEND);
+}
+
+static void ade_set_pix_clk(struct ade_hw_ctx *ctx,
+                           struct drm_display_mode *mode,
+                           struct drm_display_mode *adj_mode)
+{
+       u32 clk_Hz = mode->clock * 1000;
+       int ret;
+
+       /*
+        * Success should be guaranteed in mode_valid call back,
+        * so failure shouldn't happen here
+        */
+       ret = clk_set_rate(ctx->ade_pix_clk, clk_Hz);
+       if (ret)
+               DRM_ERROR("failed to set pixel clk %dHz (%d)\n", clk_Hz, ret);
+       adj_mode->clock = clk_get_rate(ctx->ade_pix_clk) / 1000;
+}
+
+static void ade_ldi_set_mode(struct ade_crtc *acrtc,
+                            struct drm_display_mode *mode,
+                            struct drm_display_mode *adj_mode)
+{
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       void __iomem *base = ctx->base;
+       u32 width = mode->hdisplay;
+       u32 height = mode->vdisplay;
+       u32 hfp, hbp, hsw, vfp, vbp, vsw;
+       u32 plr_flags;
+
+       plr_flags = (mode->flags & DRM_MODE_FLAG_NVSYNC) ? FLAG_NVSYNC : 0;
+       plr_flags |= (mode->flags & DRM_MODE_FLAG_NHSYNC) ? FLAG_NHSYNC : 0;
+       hfp = mode->hsync_start - mode->hdisplay;
+       hbp = mode->htotal - mode->hsync_end;
+       hsw = mode->hsync_end - mode->hsync_start;
+       vfp = mode->vsync_start - mode->vdisplay;
+       vbp = mode->vtotal - mode->vsync_end;
+       vsw = mode->vsync_end - mode->vsync_start;
+       if (vsw > 15) {
+               DRM_DEBUG_DRIVER("vsw exceeded 15\n");
+               vsw = 15;
+       }
+
+       writel((hbp << HBP_OFST) | hfp, base + LDI_HRZ_CTRL0);
+        /* the configured value is actual value - 1 */
+       writel(hsw - 1, base + LDI_HRZ_CTRL1);
+       writel((vbp << VBP_OFST) | vfp, base + LDI_VRT_CTRL0);
+        /* the configured value is actual value - 1 */
+       writel(vsw - 1, base + LDI_VRT_CTRL1);
+        /* the configured value is actual value - 1 */
+       writel(((height - 1) << VSIZE_OFST) | (width - 1),
+              base + LDI_DSP_SIZE);
+       writel(plr_flags, base + LDI_PLR_CTRL);
+
+       /* set overlay compositor output size */
+       writel(((width - 1) << OUTPUT_XSIZE_OFST) | (height - 1),
+              base + ADE_OVLY_OUTPUT_SIZE(OUT_OVLY));
+
+       /* ctran6 setting */
+       writel(CTRAN_BYPASS_ON, base + ADE_CTRAN_DIS(ADE_CTRAN6));
+        /* the configured value is actual value - 1 */
+       writel(width * height - 1, base + ADE_CTRAN_IMAGE_SIZE(ADE_CTRAN6));
+       ade_update_reload_bit(base, CTRAN_OFST + ADE_CTRAN6, 0);
+
+       ade_set_pix_clk(ctx, mode, adj_mode);
+
+       DRM_DEBUG_DRIVER("set mode: %dx%d\n", width, height);
+}
+
+static int ade_power_up(struct ade_hw_ctx *ctx)
+{
+       int ret;
+
+       ret = clk_prepare_enable(ctx->media_noc_clk);
+       if (ret) {
+               DRM_ERROR("failed to enable media_noc_clk (%d)\n", ret);
+               return ret;
+       }
+
+       ret = reset_control_deassert(ctx->reset);
+       if (ret) {
+               DRM_ERROR("failed to deassert reset\n");
+               return ret;
+       }
+
+       ret = clk_prepare_enable(ctx->ade_core_clk);
+       if (ret) {
+               DRM_ERROR("failed to enable ade_core_clk (%d)\n", ret);
+               return ret;
+       }
+
+       ade_init(ctx);
+       ctx->power_on = true;
+       return 0;
+}
+
+static void ade_power_down(struct ade_hw_ctx *ctx)
+{
+       void __iomem *base = ctx->base;
+
+       writel(ADE_DISABLE, base + LDI_CTRL);
+       /* dsi pixel off */
+       writel(DSI_PCLK_OFF, base + LDI_HDMI_DSI_GT);
+
+       clk_disable_unprepare(ctx->ade_core_clk);
+       reset_control_assert(ctx->reset);
+       clk_disable_unprepare(ctx->media_noc_clk);
+       ctx->power_on = false;
+}
+
+static void ade_set_medianoc_qos(struct ade_crtc *acrtc)
+{
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       struct regmap *map = ctx->noc_regmap;
+
+       regmap_update_bits(map, ADE0_QOSGENERATOR_MODE,
+                          QOSGENERATOR_MODE_MASK, BYPASS_MODE);
+       regmap_update_bits(map, ADE0_QOSGENERATOR_EXTCONTROL,
+                          SOCKET_QOS_EN, SOCKET_QOS_EN);
+
+       regmap_update_bits(map, ADE1_QOSGENERATOR_MODE,
+                          QOSGENERATOR_MODE_MASK, BYPASS_MODE);
+       regmap_update_bits(map, ADE1_QOSGENERATOR_EXTCONTROL,
+                          SOCKET_QOS_EN, SOCKET_QOS_EN);
+}
+
+static int ade_enable_vblank(struct drm_device *dev, unsigned int pipe)
+{
+       struct kirin_drm_private *priv = dev->dev_private;
+       struct ade_crtc *acrtc = to_ade_crtc(priv->crtc[pipe]);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       void __iomem *base = ctx->base;
+
+       if (!ctx->power_on)
+               (void)ade_power_up(ctx);
+
+       ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST,
+                       MASK(1), 1);
+
+       return 0;
+}
+
+static void ade_disable_vblank(struct drm_device *dev, unsigned int pipe)
+{
+       struct kirin_drm_private *priv = dev->dev_private;
+       struct ade_crtc *acrtc = to_ade_crtc(priv->crtc[pipe]);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       void __iomem *base = ctx->base;
+
+       if (!ctx->power_on) {
+               DRM_ERROR("power is down! vblank disable fail\n");
+               return;
+       }
+
+       ade_update_bits(base + LDI_INT_EN, FRAME_END_INT_EN_OFST,
+                       MASK(1), 0);
+}
+
+static irqreturn_t ade_irq_handler(int irq, void *data)
+{
+       struct ade_crtc *acrtc = data;
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       struct drm_crtc *crtc = &acrtc->base;
+       void __iomem *base = ctx->base;
+       u32 status;
+
+       status = readl(base + LDI_MSK_INT);
+       DRM_DEBUG_VBL("LDI IRQ: status=0x%X\n", status);
+
+       /* vblank irq */
+       if (status & BIT(FRAME_END_INT_EN_OFST)) {
+               ade_update_bits(base + LDI_INT_CLR, FRAME_END_INT_EN_OFST,
+                               MASK(1), 1);
+               drm_crtc_handle_vblank(crtc);
+       }
+
+       return IRQ_HANDLED;
+}
+
+static void ade_display_enable(struct ade_crtc *acrtc)
+{
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       void __iomem *base = ctx->base;
+       u32 out_fmt = acrtc->out_format;
+
+       /* enable output overlay compositor */
+       writel(ADE_ENABLE, base + ADE_OVLYX_CTL(OUT_OVLY));
+       ade_update_reload_bit(base, OVLY_OFST + OUT_OVLY, 0);
+
+       /* display source setting */
+       writel(DISP_SRC_OVLY2, base + ADE_DISP_SRC_CFG);
+
+       /* enable ade */
+       writel(ADE_ENABLE, base + ADE_EN);
+       /* enable ldi */
+       writel(NORMAL_MODE, base + LDI_WORK_MODE);
+       writel((out_fmt << BPP_OFST) | DATA_GATE_EN | LDI_EN,
+              base + LDI_CTRL);
+       /* dsi pixel on */
+       writel(DSI_PCLK_ON, base + LDI_HDMI_DSI_GT);
+}
+
+#if ADE_DEBUG
+static void ade_rdma_dump_regs(void __iomem *base, u32 ch)
+{
+       u32 reg_ctrl, reg_addr, reg_size, reg_stride, reg_space, reg_en;
+       u32 val;
+
+       reg_ctrl = RD_CH_CTRL(ch);
+       reg_addr = RD_CH_ADDR(ch);
+       reg_size = RD_CH_SIZE(ch);
+       reg_stride = RD_CH_STRIDE(ch);
+       reg_space = RD_CH_SPACE(ch);
+       reg_en = RD_CH_EN(ch);
+
+       val = ade_read_reload_bit(base, RDMA_OFST + ch);
+       DRM_DEBUG_DRIVER("[rdma%d]: reload(%d)\n", ch + 1, val);
+       val = readl(base + reg_ctrl);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_ctrl(0x%08x)\n", ch + 1, val);
+       val = readl(base + reg_addr);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_addr(0x%08x)\n", ch + 1, val);
+       val = readl(base + reg_size);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_size(0x%08x)\n", ch + 1, val);
+       val = readl(base + reg_stride);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_stride(0x%08x)\n", ch + 1, val);
+       val = readl(base + reg_space);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_space(0x%08x)\n", ch + 1, val);
+       val = readl(base + reg_en);
+       DRM_DEBUG_DRIVER("[rdma%d]: reg_en(0x%08x)\n", ch + 1, val);
+}
+
+static void ade_clip_dump_regs(void __iomem *base, u32 ch)
+{
+       u32 val;
+
+       val = ade_read_reload_bit(base, CLIP_OFST + ch);
+       DRM_DEBUG_DRIVER("[clip%d]: reload(%d)\n", ch + 1, val);
+       val = readl(base + ADE_CLIP_DISABLE(ch));
+       DRM_DEBUG_DRIVER("[clip%d]: reg_clip_disable(0x%08x)\n", ch + 1, val);
+       val = readl(base + ADE_CLIP_SIZE0(ch));
+       DRM_DEBUG_DRIVER("[clip%d]: reg_clip_size0(0x%08x)\n", ch + 1, val);
+       val = readl(base + ADE_CLIP_SIZE1(ch));
+       DRM_DEBUG_DRIVER("[clip%d]: reg_clip_size1(0x%08x)\n", ch + 1, val);
+}
+
+static void ade_compositor_routing_dump_regs(void __iomem *base, u32 ch)
+{
+       u8 ovly_ch = 0; /* TODO: Only primary plane now */
+       u32 val;
+
+       val = readl(base + ADE_OVLY_CH_XY0(ovly_ch));
+       DRM_DEBUG_DRIVER("[overlay ch%d]: reg_ch_xy0(0x%08x)\n", ovly_ch, val);
+       val = readl(base + ADE_OVLY_CH_XY1(ovly_ch));
+       DRM_DEBUG_DRIVER("[overlay ch%d]: reg_ch_xy1(0x%08x)\n", ovly_ch, val);
+       val = readl(base + ADE_OVLY_CH_CTL(ovly_ch));
+       DRM_DEBUG_DRIVER("[overlay ch%d]: reg_ch_ctl(0x%08x)\n", ovly_ch, val);
+}
+
+static void ade_dump_overlay_compositor_regs(void __iomem *base, u32 comp)
+{
+       u32 val;
+
+       val = ade_read_reload_bit(base, OVLY_OFST + comp);
+       DRM_DEBUG_DRIVER("[overlay%d]: reload(%d)\n", comp + 1, val);
+       writel(ADE_ENABLE, base + ADE_OVLYX_CTL(comp));
+       DRM_DEBUG_DRIVER("[overlay%d]: reg_ctl(0x%08x)\n", comp + 1, val);
+       val = readl(base + ADE_OVLY_CTL);
+       DRM_DEBUG_DRIVER("ovly_ctl(0x%08x)\n", val);
+}
+
+static void ade_dump_regs(void __iomem *base)
+{
+       u32 i;
+
+       /* dump channel regs */
+       for (i = 0; i < ADE_CH_NUM; i++) {
+               /* dump rdma regs */
+               ade_rdma_dump_regs(base, i);
+
+               /* dump clip regs */
+               ade_clip_dump_regs(base, i);
+
+               /* dump compositor routing regs */
+               ade_compositor_routing_dump_regs(base, i);
+       }
+
+       /* dump overlay compositor regs */
+       ade_dump_overlay_compositor_regs(base, OUT_OVLY);
+}
+#else
+static void ade_dump_regs(void __iomem *base) { }
+#endif
+
+static void ade_crtc_enable(struct drm_crtc *crtc)
+{
+       struct ade_crtc *acrtc = to_ade_crtc(crtc);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       int ret;
+
+       if (acrtc->enable)
+               return;
+
+       if (!ctx->power_on) {
+               ret = ade_power_up(ctx);
+               if (ret)
+                       return;
+       }
+
+       ade_set_medianoc_qos(acrtc);
+       ade_display_enable(acrtc);
+       ade_dump_regs(ctx->base);
+       acrtc->enable = true;
+}
+
+static void ade_crtc_disable(struct drm_crtc *crtc)
+{
+       struct ade_crtc *acrtc = to_ade_crtc(crtc);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+
+       if (!acrtc->enable)
+               return;
+
+       ade_power_down(ctx);
+       acrtc->enable = false;
+}
+
+static int ade_crtc_atomic_check(struct drm_crtc *crtc,
+                                struct drm_crtc_state *state)
+{
+       /* do nothing */
+       return 0;
+}
+
+static void ade_crtc_mode_set_nofb(struct drm_crtc *crtc)
+{
+       struct ade_crtc *acrtc = to_ade_crtc(crtc);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       struct drm_display_mode *mode = &crtc->state->mode;
+       struct drm_display_mode *adj_mode = &crtc->state->adjusted_mode;
+
+       if (!ctx->power_on)
+               (void)ade_power_up(ctx);
+       ade_ldi_set_mode(acrtc, mode, adj_mode);
+}
+
+static void ade_crtc_atomic_begin(struct drm_crtc *crtc,
+                                 struct drm_crtc_state *old_state)
+{
+       struct ade_crtc *acrtc = to_ade_crtc(crtc);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+
+       if (!ctx->power_on)
+               (void)ade_power_up(ctx);
+}
+
+static void ade_crtc_atomic_flush(struct drm_crtc *crtc,
+                                 struct drm_crtc_state *old_state)
+
+{
+       struct ade_crtc *acrtc = to_ade_crtc(crtc);
+       struct ade_hw_ctx *ctx = acrtc->ctx;
+       void __iomem *base = ctx->base;
+
+       /* only crtc is enabled regs take effect */
+       if (acrtc->enable) {
+               ade_dump_regs(base);
+               /* flush ade registers */
+               writel(ADE_ENABLE, base + ADE_EN);
+       }
+}
+
+static const struct drm_crtc_helper_funcs ade_crtc_helper_funcs = {
+       .enable         = ade_crtc_enable,
+       .disable        = ade_crtc_disable,
+       .atomic_check   = ade_crtc_atomic_check,
+       .mode_set_nofb  = ade_crtc_mode_set_nofb,
+       .atomic_begin   = ade_crtc_atomic_begin,
+       .atomic_flush   = ade_crtc_atomic_flush,
+};
+
+static const struct drm_crtc_funcs ade_crtc_funcs = {
+       .destroy        = drm_crtc_cleanup,
+       .set_config     = drm_atomic_helper_set_config,
+       .page_flip      = drm_atomic_helper_page_flip,
+       .reset          = drm_atomic_helper_crtc_reset,
+       .set_property = drm_atomic_helper_crtc_set_property,
+       .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+       .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+};
+
+static int ade_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
+                        struct drm_plane *plane)
+{
+       struct kirin_drm_private *priv = dev->dev_private;
+       struct device_node *port;
+       int ret;
+
+       /* set crtc port so that
+        * drm_of_find_possible_crtcs call works
+        */
+       port = of_get_child_by_name(dev->dev->of_node, "port");
+       if (!port) {
+               DRM_ERROR("no port node found in %s\n",
+                         dev->dev->of_node->full_name);
+               return -EINVAL;
+       }
+       of_node_put(port);
+       crtc->port = port;
+
+       ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL,
+                                       &ade_crtc_funcs, NULL);
+       if (ret) {
+               DRM_ERROR("failed to init crtc.\n");
+               return ret;
+       }
+
+       drm_crtc_helper_add(crtc, &ade_crtc_helper_funcs);
+       priv->crtc[drm_crtc_index(crtc)] = crtc;
+
+       return 0;
+}
+
+static void ade_rdma_set(void __iomem *base, struct drm_framebuffer *fb,
+                        u32 ch, u32 y, u32 in_h, u32 fmt)
+{
+       struct drm_gem_cma_object *obj = drm_fb_cma_get_gem_obj(fb, 0);
+       u32 reg_ctrl, reg_addr, reg_size, reg_stride, reg_space, reg_en;
+       u32 stride = fb->pitches[0];
+       u32 addr = (u32)obj->paddr + y * stride;
+
+       DRM_DEBUG_DRIVER("rdma%d: (y=%d, height=%d), stride=%d, paddr=0x%x\n",
+                        ch + 1, y, in_h, stride, (u32)obj->paddr);
+       DRM_DEBUG_DRIVER("addr=0x%x, fb:%dx%d, pixel_format=%d(%s)\n",
+                        addr, fb->width, fb->height, fmt,
+                        drm_get_format_name(fb->pixel_format));
+
+       /* get reg offset */
+       reg_ctrl = RD_CH_CTRL(ch);
+       reg_addr = RD_CH_ADDR(ch);
+       reg_size = RD_CH_SIZE(ch);
+       reg_stride = RD_CH_STRIDE(ch);
+       reg_space = RD_CH_SPACE(ch);
+       reg_en = RD_CH_EN(ch);
+
+       /*
+        * TODO: set rotation
+        */
+       writel((fmt << 16) & 0x1f0000, base + reg_ctrl);
+       writel(addr, base + reg_addr);
+       writel((in_h << 16) | stride, base + reg_size);
+       writel(stride, base + reg_stride);
+       writel(in_h * stride, base + reg_space);
+       writel(ADE_ENABLE, base + reg_en);
+       ade_update_reload_bit(base, RDMA_OFST + ch, 0);
+}
+
+static void ade_rdma_disable(void __iomem *base, u32 ch)
+{
+       u32 reg_en;
+
+       /* get reg offset */
+       reg_en = RD_CH_EN(ch);
+       writel(0, base + reg_en);
+       ade_update_reload_bit(base, RDMA_OFST + ch, 1);
+}
+
+static void ade_clip_set(void __iomem *base, u32 ch, u32 fb_w, u32 x,
+                        u32 in_w, u32 in_h)
+{
+       u32 disable_val;
+       u32 clip_left;
+       u32 clip_right;
+
+       /*
+        * clip width, no need to clip height
+        */
+       if (fb_w == in_w) { /* bypass */
+               disable_val = 1;
+               clip_left = 0;
+               clip_right = 0;
+       } else {
+               disable_val = 0;
+               clip_left = x;
+               clip_right = fb_w - (x + in_w) - 1;
+       }
+
+       DRM_DEBUG_DRIVER("clip%d: clip_left=%d, clip_right=%d\n",
+                        ch + 1, clip_left, clip_right);
+
+       writel(disable_val, base + ADE_CLIP_DISABLE(ch));
+       writel((fb_w - 1) << 16 | (in_h - 1), base + ADE_CLIP_SIZE0(ch));
+       writel(clip_left << 16 | clip_right, base + ADE_CLIP_SIZE1(ch));
+       ade_update_reload_bit(base, CLIP_OFST + ch, 0);
+}
+
+static void ade_clip_disable(void __iomem *base, u32 ch)
+{
+       writel(1, base + ADE_CLIP_DISABLE(ch));
+       ade_update_reload_bit(base, CLIP_OFST + ch, 1);
+}
+
+static bool has_Alpha_channel(int format)
+{
+       switch (format) {
+       case ADE_ARGB_8888:
+       case ADE_ABGR_8888:
+       case ADE_RGBA_8888:
+       case ADE_BGRA_8888:
+               return true;
+       default:
+               return false;
+       }
+}
+
+static void ade_get_blending_params(u32 fmt, u8 glb_alpha, u8 *alp_mode,
+                                   u8 *alp_sel, u8 *under_alp_sel)
+{
+       bool has_alpha = has_Alpha_channel(fmt);
+
+       /*
+        * get alp_mode
+        */
+       if (has_alpha && glb_alpha < 255)
+               *alp_mode = ADE_ALP_PIXEL_AND_GLB;
+       else if (has_alpha)
+               *alp_mode = ADE_ALP_PIXEL;
+       else
+               *alp_mode = ADE_ALP_GLOBAL;
+
+       /*
+        * get alp sel
+        */
+       *alp_sel = ADE_ALP_MUL_COEFF_3; /* 1 */
+       *under_alp_sel = ADE_ALP_MUL_COEFF_2; /* 0 */
+}
+
+static void ade_compositor_routing_set(void __iomem *base, u8 ch,
+                                      u32 x0, u32 y0,
+                                      u32 in_w, u32 in_h, u32 fmt)
+{
+       u8 ovly_ch = 0; /* TODO: This is the zpos, only one plane now */
+       u8 glb_alpha = 255;
+       u32 x1 = x0 + in_w - 1;
+       u32 y1 = y0 + in_h - 1;
+       u32 val;
+       u8 alp_sel;
+       u8 under_alp_sel;
+       u8 alp_mode;
+
+       ade_get_blending_params(fmt, glb_alpha, &alp_mode, &alp_sel,
+                               &under_alp_sel);
+
+       /* overlay routing setting
+        */
+       writel(x0 << 16 | y0, base + ADE_OVLY_CH_XY0(ovly_ch));
+       writel(x1 << 16 | y1, base + ADE_OVLY_CH_XY1(ovly_ch));
+       val = (ch + 1) << CH_SEL_OFST | BIT(CH_EN_OFST) |
+               alp_sel << CH_ALP_SEL_OFST |
+               under_alp_sel << CH_UNDER_ALP_SEL_OFST |
+               glb_alpha << CH_ALP_GBL_OFST |
+               alp_mode << CH_ALP_MODE_OFST;
+       writel(val, base + ADE_OVLY_CH_CTL(ovly_ch));
+       /* connect this plane/channel to overlay2 compositor */
+       ade_update_bits(base + ADE_OVLY_CTL, CH_OVLY_SEL_OFST(ovly_ch),
+                       CH_OVLY_SEL_MASK, CH_OVLY_SEL_VAL(OUT_OVLY));
+}
+
+static void ade_compositor_routing_disable(void __iomem *base, u32 ch)
+{
+       u8 ovly_ch = 0; /* TODO: Only primary plane now */
+
+       /* disable this plane/channel */
+       ade_update_bits(base + ADE_OVLY_CH_CTL(ovly_ch), CH_EN_OFST,
+                       MASK(1), 0);
+       /* dis-connect this plane/channel of overlay2 compositor */
+       ade_update_bits(base + ADE_OVLY_CTL, CH_OVLY_SEL_OFST(ovly_ch),
+                       CH_OVLY_SEL_MASK, 0);
+}
+
+/*
+ * Typicaly, a channel looks like: DMA-->clip-->scale-->ctrans-->compositor
+ */
+static void ade_update_channel(struct ade_plane *aplane,
+                              struct drm_framebuffer *fb, int crtc_x,
+                              int crtc_y, unsigned int crtc_w,
+                              unsigned int crtc_h, u32 src_x,
+                              u32 src_y, u32 src_w, u32 src_h)
+{
+       struct ade_hw_ctx *ctx = aplane->ctx;
+       void __iomem *base = ctx->base;
+       u32 fmt = ade_get_format(fb->pixel_format);
+       u32 ch = aplane->ch;
+       u32 in_w;
+       u32 in_h;
+
+       DRM_DEBUG_DRIVER("channel%d: src:(%d, %d)-%dx%d, crtc:(%d, %d)-%dx%d",
+                        ch + 1, src_x, src_y, src_w, src_h,
+                        crtc_x, crtc_y, crtc_w, crtc_h);
+
+       /* 1) DMA setting */
+       in_w = src_w;
+       in_h = src_h;
+       ade_rdma_set(base, fb, ch, src_y, in_h, fmt);
+
+       /* 2) clip setting */
+       ade_clip_set(base, ch, fb->width, src_x, in_w, in_h);
+
+       /* 3) TODO: scale setting for overlay planes */
+
+       /* 4) TODO: ctran/csc setting for overlay planes */
+
+       /* 5) compositor routing setting */
+       ade_compositor_routing_set(base, ch, crtc_x, crtc_y, in_w, in_h, fmt);
+}
+
+static void ade_disable_channel(struct ade_plane *aplane)
+{
+       struct ade_hw_ctx *ctx = aplane->ctx;
+       void __iomem *base = ctx->base;
+       u32 ch = aplane->ch;
+
+       DRM_DEBUG_DRIVER("disable channel%d\n", ch + 1);
+
+       /* disable read DMA */
+       ade_rdma_disable(base, ch);
+
+       /* disable clip */
+       ade_clip_disable(base, ch);
+
+       /* disable compositor routing */
+       ade_compositor_routing_disable(base, ch);
+}
+
+static int ade_plane_prepare_fb(struct drm_plane *plane,
+                               const struct drm_plane_state *new_state)
+{
+       /* do nothing */
+       return 0;
+}
+
+static void ade_plane_cleanup_fb(struct drm_plane *plane,
+                                const struct drm_plane_state *old_state)
+{
+       /* do nothing */
+}
+
+static int ade_plane_atomic_check(struct drm_plane *plane,
+                                 struct drm_plane_state *state)
+{
+       struct drm_framebuffer *fb = state->fb;
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_crtc_state *crtc_state;
+       u32 src_x = state->src_x >> 16;
+       u32 src_y = state->src_y >> 16;
+       u32 src_w = state->src_w >> 16;
+       u32 src_h = state->src_h >> 16;
+       int crtc_x = state->crtc_x;
+       int crtc_y = state->crtc_y;
+       u32 crtc_w = state->crtc_w;
+       u32 crtc_h = state->crtc_h;
+       u32 fmt;
+
+       if (!crtc || !fb)
+               return 0;
+
+       fmt = ade_get_format(fb->pixel_format);
+       if (fmt == ADE_FORMAT_UNSUPPORT)
+               return -EINVAL;
+
+       crtc_state = drm_atomic_get_crtc_state(state->state, crtc);
+       if (IS_ERR(crtc_state))
+               return PTR_ERR(crtc_state);
+
+       if (src_w != crtc_w || src_h != crtc_h) {
+               DRM_ERROR("Scale not support!!!\n");
+               return -EINVAL;
+       }
+
+       if (src_x + src_w > fb->width ||
+           src_y + src_h > fb->height)
+               return -EINVAL;
+
+       if (crtc_x < 0 || crtc_y < 0)
+               return -EINVAL;
+
+       if (crtc_x + crtc_w > crtc_state->adjusted_mode.hdisplay ||
+           crtc_y + crtc_h > crtc_state->adjusted_mode.vdisplay)
+               return -EINVAL;
+
+       return 0;
+}
+
+static void ade_plane_atomic_update(struct drm_plane *plane,
+                                   struct drm_plane_state *old_state)
+{
+       struct drm_plane_state  *state  = plane->state;
+       struct ade_plane *aplane = to_ade_plane(plane);
+
+       ade_update_channel(aplane, state->fb, state->crtc_x, state->crtc_y,
+                          state->crtc_w, state->crtc_h,
+                          state->src_x >> 16, state->src_y >> 16,
+                          state->src_w >> 16, state->src_h >> 16);
+}
+
+static void ade_plane_atomic_disable(struct drm_plane *plane,
+                                    struct drm_plane_state *old_state)
+{
+       struct ade_plane *aplane = to_ade_plane(plane);
+
+       ade_disable_channel(aplane);
+}
+
+static const struct drm_plane_helper_funcs ade_plane_helper_funcs = {
+       .prepare_fb = ade_plane_prepare_fb,
+       .cleanup_fb = ade_plane_cleanup_fb,
+       .atomic_check = ade_plane_atomic_check,
+       .atomic_update = ade_plane_atomic_update,
+       .atomic_disable = ade_plane_atomic_disable,
+};
+
+static struct drm_plane_funcs ade_plane_funcs = {
+       .update_plane   = drm_atomic_helper_update_plane,
+       .disable_plane  = drm_atomic_helper_disable_plane,
+       .set_property = drm_atomic_helper_plane_set_property,
+       .destroy = drm_plane_cleanup,
+       .reset = drm_atomic_helper_plane_reset,
+       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_plane_destroy_state,
+};
+
+static int ade_plane_init(struct drm_device *dev, struct ade_plane *aplane,
+                         enum drm_plane_type type)
+{
+       const u32 *fmts;
+       u32 fmts_cnt;
+       int ret = 0;
+
+       /* get  properties */
+       fmts_cnt = ade_get_channel_formats(aplane->ch, &fmts);
+       if (ret)
+               return ret;
+
+       ret = drm_universal_plane_init(dev, &aplane->base, 1, &ade_plane_funcs,
+                                      fmts, fmts_cnt, type, NULL);
+       if (ret) {
+               DRM_ERROR("fail to init plane, ch=%d\n", aplane->ch);
+               return ret;
+       }
+
+       drm_plane_helper_add(&aplane->base, &ade_plane_helper_funcs);
+
+       return 0;
+}
+
+static int ade_dts_parse(struct platform_device *pdev, struct ade_hw_ctx *ctx)
+{
+       struct resource *res;
+       struct device *dev = &pdev->dev;
+       struct device_node *np = pdev->dev.of_node;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       ctx->base = devm_ioremap_resource(dev, res);
+       if (IS_ERR(ctx->base)) {
+               DRM_ERROR("failed to remap ade io base\n");
+               return  PTR_ERR(ctx->base);
+       }
+
+       ctx->reset = devm_reset_control_get(dev, NULL);
+       if (IS_ERR(ctx->reset))
+               return PTR_ERR(ctx->reset);
+
+       ctx->noc_regmap =
+               syscon_regmap_lookup_by_phandle(np, "hisilicon,noc-syscon");
+       if (IS_ERR(ctx->noc_regmap)) {
+               DRM_ERROR("failed to get noc regmap\n");
+               return PTR_ERR(ctx->noc_regmap);
+       }
+
+       ctx->irq = platform_get_irq(pdev, 0);
+       if (ctx->irq < 0) {
+               DRM_ERROR("failed to get irq\n");
+               return -ENODEV;
+       }
+
+       ctx->ade_core_clk = devm_clk_get(dev, "clk_ade_core");
+       if (!ctx->ade_core_clk) {
+               DRM_ERROR("failed to parse clk ADE_CORE\n");
+               return -ENODEV;
+       }
+
+       ctx->media_noc_clk = devm_clk_get(dev, "clk_codec_jpeg");
+       if (!ctx->media_noc_clk) {
+               DRM_ERROR("failed to parse clk CODEC_JPEG\n");
+           return -ENODEV;
+       }
+
+       ctx->ade_pix_clk = devm_clk_get(dev, "clk_ade_pix");
+       if (!ctx->ade_pix_clk) {
+               DRM_ERROR("failed to parse clk ADE_PIX\n");
+           return -ENODEV;
+       }
+
+       return 0;
+}
+
+static int ade_drm_init(struct drm_device *dev)
+{
+       struct platform_device *pdev = dev->platformdev;
+       struct ade_data *ade;
+       struct ade_hw_ctx *ctx;
+       struct ade_crtc *acrtc;
+       struct ade_plane *aplane;
+       enum drm_plane_type type;
+       int ret;
+       int i;
+
+       ade = devm_kzalloc(dev->dev, sizeof(*ade), GFP_KERNEL);
+       if (!ade) {
+               DRM_ERROR("failed to alloc ade_data\n");
+               return -ENOMEM;
+       }
+       platform_set_drvdata(pdev, ade);
+
+       ctx = &ade->ctx;
+       acrtc = &ade->acrtc;
+       acrtc->ctx = ctx;
+       acrtc->out_format = LDI_OUT_RGB_888;
+
+       ret = ade_dts_parse(pdev, ctx);
+       if (ret)
+               return ret;
+
+       /*
+        * plane init
+        * TODO: Now only support primary plane, overlay planes
+        * need to do.
+        */
+       for (i = 0; i < ADE_CH_NUM; i++) {
+               aplane = &ade->aplane[i];
+               aplane->ch = i;
+               aplane->ctx = ctx;
+               type = i == PRIMARY_CH ? DRM_PLANE_TYPE_PRIMARY :
+                       DRM_PLANE_TYPE_OVERLAY;
+
+               ret = ade_plane_init(dev, aplane, type);
+               if (ret)
+                       return ret;
+       }
+
+       /* crtc init */
+       ret = ade_crtc_init(dev, &acrtc->base, &ade->aplane[PRIMARY_CH].base);
+       if (ret)
+               return ret;
+
+       /* vblank irq init */
+       ret = devm_request_irq(dev->dev, ctx->irq, ade_irq_handler,
+                              IRQF_SHARED, dev->driver->name, acrtc);
+       if (ret)
+               return ret;
+       dev->driver->get_vblank_counter = drm_vblank_no_hw_counter;
+       dev->driver->enable_vblank = ade_enable_vblank;
+       dev->driver->disable_vblank = ade_disable_vblank;
+
+       return 0;
+}
+
+static void ade_drm_cleanup(struct drm_device *dev)
+{
+       struct platform_device *pdev = dev->platformdev;
+       struct ade_data *ade = platform_get_drvdata(pdev);
+       struct drm_crtc *crtc = &ade->acrtc.base;
+
+       drm_crtc_cleanup(crtc);
+}
+
+const struct kirin_dc_ops ade_dc_ops = {
+       .init = ade_drm_init,
+       .cleanup = ade_drm_cleanup
+};
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
new file mode 100644 (file)
index 0000000..3f94785
--- /dev/null
@@ -0,0 +1,343 @@
+/*
+ * Hisilicon Kirin SoCs drm master driver
+ *
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * Author:
+ *     Xinliang Liu <z.liuxinliang@hisilicon.com>
+ *     Xinliang Liu <xinliang.liu@linaro.org>
+ *     Xinwei Kong <kong.kongxinwei@hisilicon.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/of_platform.h>
+#include <linux/component.h>
+#include <linux/of_graph.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+
+#include "kirin_drm_drv.h"
+
+static struct kirin_dc_ops *dc_ops;
+
+static int kirin_drm_kms_cleanup(struct drm_device *dev)
+{
+       struct kirin_drm_private *priv = dev->dev_private;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+       if (priv->fbdev) {
+               drm_fbdev_cma_fini(priv->fbdev);
+               priv->fbdev = NULL;
+       }
+#endif
+       drm_kms_helper_poll_fini(dev);
+       drm_vblank_cleanup(dev);
+       dc_ops->cleanup(dev);
+       drm_mode_config_cleanup(dev);
+       devm_kfree(dev->dev, priv);
+       dev->dev_private = NULL;
+
+       return 0;
+}
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+static void kirin_fbdev_output_poll_changed(struct drm_device *dev)
+{
+       struct kirin_drm_private *priv = dev->dev_private;
+
+       if (priv->fbdev) {
+               drm_fbdev_cma_hotplug_event(priv->fbdev);
+       } else {
+               priv->fbdev = drm_fbdev_cma_init(dev, 32,
+                               dev->mode_config.num_crtc,
+                               dev->mode_config.num_connector);
+               if (IS_ERR(priv->fbdev))
+                       priv->fbdev = NULL;
+       }
+}
+#endif
+
+static const struct drm_mode_config_funcs kirin_drm_mode_config_funcs = {
+       .fb_create = drm_fb_cma_create,
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+       .output_poll_changed = kirin_fbdev_output_poll_changed,
+#endif
+       .atomic_check = drm_atomic_helper_check,
+       .atomic_commit = drm_atomic_helper_commit,
+};
+
+static void kirin_drm_mode_config_init(struct drm_device *dev)
+{
+       dev->mode_config.min_width = 0;
+       dev->mode_config.min_height = 0;
+
+       dev->mode_config.max_width = 2048;
+       dev->mode_config.max_height = 2048;
+
+       dev->mode_config.funcs = &kirin_drm_mode_config_funcs;
+}
+
+static int kirin_drm_kms_init(struct drm_device *dev)
+{
+       struct kirin_drm_private *priv;
+       int ret;
+
+       priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       dev->dev_private = priv;
+       dev_set_drvdata(dev->dev, dev);
+
+       /* dev->mode_config initialization */
+       drm_mode_config_init(dev);
+       kirin_drm_mode_config_init(dev);
+
+       /* display controller init */
+       ret = dc_ops->init(dev);
+       if (ret)
+               goto err_mode_config_cleanup;
+
+       /* bind and init sub drivers */
+       ret = component_bind_all(dev->dev, dev);
+       if (ret) {
+               DRM_ERROR("failed to bind all component.\n");
+               goto err_dc_cleanup;
+       }
+
+       /* vblank init */
+       ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
+       if (ret) {
+               DRM_ERROR("failed to initialize vblank.\n");
+               goto err_unbind_all;
+       }
+       /* with irq_enabled = true, we can use the vblank feature. */
+       dev->irq_enabled = true;
+
+       /* reset all the states of crtc/plane/encoder/connector */
+       drm_mode_config_reset(dev);
+
+       /* init kms poll for handling hpd */
+       drm_kms_helper_poll_init(dev);
+
+       /* force detection after connectors init */
+       (void)drm_helper_hpd_irq_event(dev);
+
+       return 0;
+
+err_unbind_all:
+       component_unbind_all(dev->dev, dev);
+err_dc_cleanup:
+       dc_ops->cleanup(dev);
+err_mode_config_cleanup:
+       drm_mode_config_cleanup(dev);
+       devm_kfree(dev->dev, priv);
+       dev->dev_private = NULL;
+
+       return ret;
+}
+
+static const struct file_operations kirin_drm_fops = {
+       .owner          = THIS_MODULE,
+       .open           = drm_open,
+       .release        = drm_release,
+       .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = drm_compat_ioctl,
+#endif
+       .poll           = drm_poll,
+       .read           = drm_read,
+       .llseek         = no_llseek,
+       .mmap           = drm_gem_cma_mmap,
+};
+
+static int kirin_gem_cma_dumb_create(struct drm_file *file,
+                                    struct drm_device *dev,
+                                    struct drm_mode_create_dumb *args)
+{
+       return drm_gem_cma_dumb_create_internal(file, dev, args);
+}
+
+static struct drm_driver kirin_drm_driver = {
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
+                                 DRIVER_ATOMIC | DRIVER_HAVE_IRQ,
+       .fops                   = &kirin_drm_fops,
+       .set_busid              = drm_platform_set_busid,
+
+       .gem_free_object        = drm_gem_cma_free_object,
+       .gem_vm_ops             = &drm_gem_cma_vm_ops,
+       .dumb_create            = kirin_gem_cma_dumb_create,
+       .dumb_map_offset        = drm_gem_cma_dumb_map_offset,
+       .dumb_destroy           = drm_gem_dumb_destroy,
+
+       .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
+       .gem_prime_export       = drm_gem_prime_export,
+       .gem_prime_import       = drm_gem_prime_import,
+       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
+       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
+       .gem_prime_vmap         = drm_gem_cma_prime_vmap,
+       .gem_prime_vunmap       = drm_gem_cma_prime_vunmap,
+       .gem_prime_mmap         = drm_gem_cma_prime_mmap,
+
+       .name                   = "kirin",
+       .desc                   = "Hisilicon Kirin SoCs' DRM Driver",
+       .date                   = "20150718",
+       .major                  = 1,
+       .minor                  = 0,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+static int kirin_drm_bind(struct device *dev)
+{
+       struct drm_driver *driver = &kirin_drm_driver;
+       struct drm_device *drm_dev;
+       int ret;
+
+       drm_dev = drm_dev_alloc(driver, dev);
+       if (!drm_dev)
+               return -ENOMEM;
+
+       drm_dev->platformdev = to_platform_device(dev);
+
+       ret = kirin_drm_kms_init(drm_dev);
+       if (ret)
+               goto err_drm_dev_unref;
+
+       ret = drm_dev_register(drm_dev, 0);
+       if (ret)
+               goto err_kms_cleanup;
+
+       /* connectors should be registered after drm device register */
+       ret = drm_connector_register_all(drm_dev);
+       if (ret)
+               goto err_drm_dev_unregister;
+
+       DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
+                driver->name, driver->major, driver->minor, driver->patchlevel,
+                driver->date, drm_dev->primary->index);
+
+       return 0;
+
+err_drm_dev_unregister:
+       drm_dev_unregister(drm_dev);
+err_kms_cleanup:
+       kirin_drm_kms_cleanup(drm_dev);
+err_drm_dev_unref:
+       drm_dev_unref(drm_dev);
+
+       return ret;
+}
+
+static void kirin_drm_unbind(struct device *dev)
+{
+       struct drm_device *drm_dev = dev_get_drvdata(dev);
+
+       drm_connector_unregister_all(drm_dev);
+       drm_dev_unregister(drm_dev);
+       kirin_drm_kms_cleanup(drm_dev);
+       drm_dev_unref(drm_dev);
+}
+
+static const struct component_master_ops kirin_drm_ops = {
+       .bind = kirin_drm_bind,
+       .unbind = kirin_drm_unbind,
+};
+
+static struct device_node *kirin_get_remote_node(struct device_node *np)
+{
+       struct device_node *endpoint, *remote;
+
+       /* get the first endpoint, in our case only one remote node
+        * is connected to display controller.
+        */
+       endpoint = of_graph_get_next_endpoint(np, NULL);
+       if (!endpoint) {
+               DRM_ERROR("no valid endpoint node\n");
+               return ERR_PTR(-ENODEV);
+       }
+       of_node_put(endpoint);
+
+       remote = of_graph_get_remote_port_parent(endpoint);
+       if (!remote) {
+               DRM_ERROR("no valid remote node\n");
+               return ERR_PTR(-ENODEV);
+       }
+       of_node_put(remote);
+
+       if (!of_device_is_available(remote)) {
+               DRM_ERROR("not available for remote node\n");
+               return ERR_PTR(-ENODEV);
+       }
+
+       return remote;
+}
+
+static int kirin_drm_platform_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *np = dev->of_node;
+       struct component_match *match = NULL;
+       struct device_node *remote;
+
+       dc_ops = (struct kirin_dc_ops *)of_device_get_match_data(dev);
+       if (!dc_ops) {
+               DRM_ERROR("failed to get dt id data\n");
+               return -EINVAL;
+       }
+
+       remote = kirin_get_remote_node(np);
+       if (IS_ERR(remote))
+               return PTR_ERR(remote);
+
+       component_match_add(dev, &match, compare_of, remote);
+
+       return component_master_add_with_match(dev, &kirin_drm_ops, match);
+
+       return 0;
+}
+
+static int kirin_drm_platform_remove(struct platform_device *pdev)
+{
+       component_master_del(&pdev->dev, &kirin_drm_ops);
+       dc_ops = NULL;
+       return 0;
+}
+
+static const struct of_device_id kirin_drm_dt_ids[] = {
+       { .compatible = "hisilicon,hi6220-ade",
+         .data = &ade_dc_ops,
+       },
+       { /* end node */ },
+};
+MODULE_DEVICE_TABLE(of, kirin_drm_dt_ids);
+
+static struct platform_driver kirin_drm_platform_driver = {
+       .probe = kirin_drm_platform_probe,
+       .remove = kirin_drm_platform_remove,
+       .driver = {
+               .name = "kirin-drm",
+               .of_match_table = kirin_drm_dt_ids,
+       },
+};
+
+module_platform_driver(kirin_drm_platform_driver);
+
+MODULE_AUTHOR("Xinliang Liu <xinliang.liu@linaro.org>");
+MODULE_AUTHOR("Xinliang Liu <z.liuxinliang@hisilicon.com>");
+MODULE_AUTHOR("Xinwei Kong <kong.kongxinwei@hisilicon.com>");
+MODULE_DESCRIPTION("hisilicon Kirin SoCs' DRM master driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.h
new file mode 100644 (file)
index 0000000..1a07caf
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2016 Linaro Limited.
+ * Copyright (c) 2014-2016 Hisilicon Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __KIRIN_DRM_DRV_H__
+#define __KIRIN_DRM_DRV_H__
+
+#define MAX_CRTC       2
+
+/* display controller init/cleanup ops */
+struct kirin_dc_ops {
+       int (*init)(struct drm_device *dev);
+       void (*cleanup)(struct drm_device *dev);
+};
+
+struct kirin_drm_private {
+       struct drm_crtc *crtc[MAX_CRTC];
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+       struct drm_fbdev_cma *fbdev;
+#endif
+};
+
+extern const struct kirin_dc_ops ade_dc_ops;
+
+#endif /* __KIRIN_DRM_DRV_H__ */
index 20a5d0455e19dd71a5ae61e0fc89357cdec03c01..29a32b11953b9eddacec285ba13087b4bc27f9f5 100644 (file)
@@ -56,3 +56,9 @@ config DRM_I915_USERPTR
          selected to enabled full userptr support.
 
          If in doubt, say "Y".
+
+menu "drm/i915 Debugging"
+depends on DRM_I915
+depends on EXPERT
+source drivers/gpu/drm/i915/Kconfig.debug
+endmenu
diff --git a/drivers/gpu/drm/i915/Kconfig.debug b/drivers/gpu/drm/i915/Kconfig.debug
new file mode 100644 (file)
index 0000000..8f40410
--- /dev/null
@@ -0,0 +1,41 @@
+config DRM_I915_WERROR
+        bool "Force GCC to throw an error instead of a warning when compiling"
+        # As this may inadvertently break the build, only allow the user
+        # to shoot oneself in the foot iff they aim really hard
+        depends on EXPERT
+        # We use the dependency on !COMPILE_TEST to not be enabled in
+        # allmodconfig or allyesconfig configurations
+        depends on !COMPILE_TEST
+        default n
+        help
+          Add -Werror to the build flags for (and only for) i915.ko.
+          Do not enable this unless you are writing code for the i915.ko module.
+
+          Recommended for driver developers only.
+
+          If in doubt, say "N".
+
+config DRM_I915_DEBUG
+        bool "Enable additional driver debugging"
+        depends on DRM_I915
+        default n
+        help
+          Choose this option to turn on extra driver debugging that may affect
+          performance but will catch some internal issues.
+
+          Recommended for driver developers only.
+
+          If in doubt, say "N".
+
+config DRM_I915_DEBUG_GEM
+        bool "Insert extra checks into the GEM internals"
+        default n
+        depends on DRM_I915_WERROR
+        help
+          Enable extra sanity checks (including BUGs) along the GEM driver
+          paths that may slow the system down and if hit hang the machine.
+
+          Recommended for driver developers only.
+
+          If in doubt, say "N".
+
index 0851de07bd13b59f13ff88e9d05fb7a72fe85604..0b88ba0f3c1f4977697603f6306c2fc0287e7b53 100644 (file)
@@ -2,6 +2,8 @@
 # Makefile for the drm device driver.  This driver provides support for the
 # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
 
+subdir-ccflags-$(CONFIG_DRM_I915_WERROR) := -Werror
+
 # Please keep these build lists sorted!
 
 # core driver code
@@ -55,7 +57,9 @@ i915-y += intel_audio.o \
          intel_atomic.o \
          intel_atomic_plane.o \
          intel_bios.o \
+         intel_color.o \
          intel_display.o \
+         intel_dpll_mgr.o \
          intel_fbc.o \
          intel_fifo_underrun.o \
          intel_frontbuffer.o \
index 814d894ed9257848d7e68fb6e3f8e0394e6bbd9a..a337f33bec5b2eb92bae7ce8860d6e6a84042458 100644 (file)
@@ -444,6 +444,7 @@ static const struct drm_i915_reg_descriptor gen7_render_regs[] = {
        REG64(CL_PRIMITIVES_COUNT),
        REG64(PS_INVOCATION_COUNT),
        REG64(PS_DEPTH_COUNT),
+       REG64_IDX(RING_TIMESTAMP, RENDER_RING_BASE),
        REG32(OACONTROL), /* Only allowed for LRI and SRM. See below. */
        REG64(MI_PREDICATE_SRC0),
        REG64(MI_PREDICATE_SRC1),
@@ -471,6 +472,25 @@ static const struct drm_i915_reg_descriptor gen7_render_regs[] = {
        REG32(GEN7_L3SQCREG1),
        REG32(GEN7_L3CNTLREG2),
        REG32(GEN7_L3CNTLREG3),
+};
+
+static const struct drm_i915_reg_descriptor hsw_render_regs[] = {
+       REG64_IDX(HSW_CS_GPR, 0),
+       REG64_IDX(HSW_CS_GPR, 1),
+       REG64_IDX(HSW_CS_GPR, 2),
+       REG64_IDX(HSW_CS_GPR, 3),
+       REG64_IDX(HSW_CS_GPR, 4),
+       REG64_IDX(HSW_CS_GPR, 5),
+       REG64_IDX(HSW_CS_GPR, 6),
+       REG64_IDX(HSW_CS_GPR, 7),
+       REG64_IDX(HSW_CS_GPR, 8),
+       REG64_IDX(HSW_CS_GPR, 9),
+       REG64_IDX(HSW_CS_GPR, 10),
+       REG64_IDX(HSW_CS_GPR, 11),
+       REG64_IDX(HSW_CS_GPR, 12),
+       REG64_IDX(HSW_CS_GPR, 13),
+       REG64_IDX(HSW_CS_GPR, 14),
+       REG64_IDX(HSW_CS_GPR, 15),
        REG32(HSW_SCRATCH1,
              .mask = ~HSW_SCRATCH1_L3_DATA_ATOMICS_DISABLE,
              .value = 0),
@@ -500,6 +520,33 @@ static const struct drm_i915_reg_descriptor hsw_master_regs[] = {
 #undef REG64
 #undef REG32
 
+struct drm_i915_reg_table {
+       const struct drm_i915_reg_descriptor *regs;
+       int num_regs;
+       bool master;
+};
+
+static const struct drm_i915_reg_table ivb_render_reg_tables[] = {
+       { gen7_render_regs, ARRAY_SIZE(gen7_render_regs), false },
+       { ivb_master_regs, ARRAY_SIZE(ivb_master_regs), true },
+};
+
+static const struct drm_i915_reg_table ivb_blt_reg_tables[] = {
+       { gen7_blt_regs, ARRAY_SIZE(gen7_blt_regs), false },
+       { ivb_master_regs, ARRAY_SIZE(ivb_master_regs), true },
+};
+
+static const struct drm_i915_reg_table hsw_render_reg_tables[] = {
+       { gen7_render_regs, ARRAY_SIZE(gen7_render_regs), false },
+       { hsw_render_regs, ARRAY_SIZE(hsw_render_regs), false },
+       { hsw_master_regs, ARRAY_SIZE(hsw_master_regs), true },
+};
+
+static const struct drm_i915_reg_table hsw_blt_reg_tables[] = {
+       { gen7_blt_regs, ARRAY_SIZE(gen7_blt_regs), false },
+       { hsw_master_regs, ARRAY_SIZE(hsw_master_regs), true },
+};
+
 static u32 gen7_render_get_cmd_length_mask(u32 cmd_header)
 {
        u32 client = (cmd_header & INSTR_CLIENT_MASK) >> INSTR_CLIENT_SHIFT;
@@ -555,7 +602,7 @@ static u32 gen7_blt_get_cmd_length_mask(u32 cmd_header)
        return 0;
 }
 
-static bool validate_cmds_sorted(struct intel_engine_cs *ring,
+static bool validate_cmds_sorted(struct intel_engine_cs *engine,
                                 const struct drm_i915_cmd_table *cmd_tables,
                                 int cmd_table_count)
 {
@@ -577,7 +624,7 @@ static bool validate_cmds_sorted(struct intel_engine_cs *ring,
 
                        if (curr < previous) {
                                DRM_ERROR("CMD: table not sorted ring=%d table=%d entry=%d cmd=0x%08X prev=0x%08X\n",
-                                         ring->id, i, j, curr, previous);
+                                         engine->id, i, j, curr, previous);
                                ret = false;
                        }
 
@@ -611,11 +658,18 @@ static bool check_sorted(int ring_id,
        return ret;
 }
 
-static bool validate_regs_sorted(struct intel_engine_cs *ring)
+static bool validate_regs_sorted(struct intel_engine_cs *engine)
 {
-       return check_sorted(ring->id, ring->reg_table, ring->reg_count) &&
-               check_sorted(ring->id, ring->master_reg_table,
-                            ring->master_reg_count);
+       int i;
+       const struct drm_i915_reg_table *table;
+
+       for (i = 0; i < engine->reg_table_count; i++) {
+               table = &engine->reg_tables[i];
+               if (!check_sorted(engine->id, table->regs, table->num_regs))
+                       return false;
+       }
+
+       return true;
 }
 
 struct cmd_node {
@@ -639,13 +693,13 @@ struct cmd_node {
  */
 #define CMD_HASH_MASK STD_MI_OPCODE_MASK
 
-static int init_hash_table(struct intel_engine_cs *ring,
+static int init_hash_table(struct intel_engine_cs *engine,
                           const struct drm_i915_cmd_table *cmd_tables,
                           int cmd_table_count)
 {
        int i, j;
 
-       hash_init(ring->cmd_hash);
+       hash_init(engine->cmd_hash);
 
        for (i = 0; i < cmd_table_count; i++) {
                const struct drm_i915_cmd_table *table = &cmd_tables[i];
@@ -660,7 +714,7 @@ static int init_hash_table(struct intel_engine_cs *ring,
                                return -ENOMEM;
 
                        desc_node->desc = desc;
-                       hash_add(ring->cmd_hash, &desc_node->node,
+                       hash_add(engine->cmd_hash, &desc_node->node,
                                 desc->cmd.value & CMD_HASH_MASK);
                }
        }
@@ -668,13 +722,13 @@ static int init_hash_table(struct intel_engine_cs *ring,
        return 0;
 }
 
-static void fini_hash_table(struct intel_engine_cs *ring)
+static void fini_hash_table(struct intel_engine_cs *engine)
 {
        struct hlist_node *tmp;
        struct cmd_node *desc_node;
        int i;
 
-       hash_for_each_safe(ring->cmd_hash, i, tmp, desc_node, node) {
+       hash_for_each_safe(engine->cmd_hash, i, tmp, desc_node, node) {
                hash_del(&desc_node->node);
                kfree(desc_node);
        }
@@ -690,18 +744,18 @@ static void fini_hash_table(struct intel_engine_cs *ring)
  *
  * Return: non-zero if initialization fails
  */
-int i915_cmd_parser_init_ring(struct intel_engine_cs *ring)
+int i915_cmd_parser_init_ring(struct intel_engine_cs *engine)
 {
        const struct drm_i915_cmd_table *cmd_tables;
        int cmd_table_count;
        int ret;
 
-       if (!IS_GEN7(ring->dev))
+       if (!IS_GEN7(engine->dev))
                return 0;
 
-       switch (ring->id) {
+       switch (engine->id) {
        case RCS:
-               if (IS_HASWELL(ring->dev)) {
+               if (IS_HASWELL(engine->dev)) {
                        cmd_tables = hsw_render_ring_cmds;
                        cmd_table_count =
                                ARRAY_SIZE(hsw_render_ring_cmds);
@@ -710,26 +764,23 @@ int i915_cmd_parser_init_ring(struct intel_engine_cs *ring)
                        cmd_table_count = ARRAY_SIZE(gen7_render_cmds);
                }
 
-               ring->reg_table = gen7_render_regs;
-               ring->reg_count = ARRAY_SIZE(gen7_render_regs);
-
-               if (IS_HASWELL(ring->dev)) {
-                       ring->master_reg_table = hsw_master_regs;
-                       ring->master_reg_count = ARRAY_SIZE(hsw_master_regs);
+               if (IS_HASWELL(engine->dev)) {
+                       engine->reg_tables = hsw_render_reg_tables;
+                       engine->reg_table_count = ARRAY_SIZE(hsw_render_reg_tables);
                } else {
-                       ring->master_reg_table = ivb_master_regs;
-                       ring->master_reg_count = ARRAY_SIZE(ivb_master_regs);
+                       engine->reg_tables = ivb_render_reg_tables;
+                       engine->reg_table_count = ARRAY_SIZE(ivb_render_reg_tables);
                }
 
-               ring->get_cmd_length_mask = gen7_render_get_cmd_length_mask;
+               engine->get_cmd_length_mask = gen7_render_get_cmd_length_mask;
                break;
        case VCS:
                cmd_tables = gen7_video_cmds;
                cmd_table_count = ARRAY_SIZE(gen7_video_cmds);
-               ring->get_cmd_length_mask = gen7_bsd_get_cmd_length_mask;
+               engine->get_cmd_length_mask = gen7_bsd_get_cmd_length_mask;
                break;
        case BCS:
-               if (IS_HASWELL(ring->dev)) {
+               if (IS_HASWELL(engine->dev)) {
                        cmd_tables = hsw_blt_ring_cmds;
                        cmd_table_count = ARRAY_SIZE(hsw_blt_ring_cmds);
                } else {
@@ -737,44 +788,41 @@ int i915_cmd_parser_init_ring(struct intel_engine_cs *ring)
                        cmd_table_count = ARRAY_SIZE(gen7_blt_cmds);
                }
 
-               ring->reg_table = gen7_blt_regs;
-               ring->reg_count = ARRAY_SIZE(gen7_blt_regs);
-
-               if (IS_HASWELL(ring->dev)) {
-                       ring->master_reg_table = hsw_master_regs;
-                       ring->master_reg_count = ARRAY_SIZE(hsw_master_regs);
+               if (IS_HASWELL(engine->dev)) {
+                       engine->reg_tables = hsw_blt_reg_tables;
+                       engine->reg_table_count = ARRAY_SIZE(hsw_blt_reg_tables);
                } else {
-                       ring->master_reg_table = ivb_master_regs;
-                       ring->master_reg_count = ARRAY_SIZE(ivb_master_regs);
+                       engine->reg_tables = ivb_blt_reg_tables;
+                       engine->reg_table_count = ARRAY_SIZE(ivb_blt_reg_tables);
                }
 
-               ring->get_cmd_length_mask = gen7_blt_get_cmd_length_mask;
+               engine->get_cmd_length_mask = gen7_blt_get_cmd_length_mask;
                break;
        case VECS:
                cmd_tables = hsw_vebox_cmds;
                cmd_table_count = ARRAY_SIZE(hsw_vebox_cmds);
                /* VECS can use the same length_mask function as VCS */
-               ring->get_cmd_length_mask = gen7_bsd_get_cmd_length_mask;
+               engine->get_cmd_length_mask = gen7_bsd_get_cmd_length_mask;
                break;
        default:
                DRM_ERROR("CMD: cmd_parser_init with unknown ring: %d\n",
-                         ring->id);
+                         engine->id);
                BUG();
        }
 
-       BUG_ON(!validate_cmds_sorted(ring, cmd_tables, cmd_table_count));
-       BUG_ON(!validate_regs_sorted(ring));
+       BUG_ON(!validate_cmds_sorted(engine, cmd_tables, cmd_table_count));
+       BUG_ON(!validate_regs_sorted(engine));
 
-       WARN_ON(!hash_empty(ring->cmd_hash));
+       WARN_ON(!hash_empty(engine->cmd_hash));
 
-       ret = init_hash_table(ring, cmd_tables, cmd_table_count);
+       ret = init_hash_table(engine, cmd_tables, cmd_table_count);
        if (ret) {
                DRM_ERROR("CMD: cmd_parser_init failed!\n");
-               fini_hash_table(ring);
+               fini_hash_table(engine);
                return ret;
        }
 
-       ring->needs_cmd_parser = true;
+       engine->needs_cmd_parser = true;
 
        return 0;
 }
@@ -786,21 +834,21 @@ int i915_cmd_parser_init_ring(struct intel_engine_cs *ring)
  * Releases any resources related to command parsing that may have been
  * initialized for the specified ring.
  */
-void i915_cmd_parser_fini_ring(struct intel_engine_cs *ring)
+void i915_cmd_parser_fini_ring(struct intel_engine_cs *engine)
 {
-       if (!ring->needs_cmd_parser)
+       if (!engine->needs_cmd_parser)
                return;
 
-       fini_hash_table(ring);
+       fini_hash_table(engine);
 }
 
 static const struct drm_i915_cmd_descriptor*
-find_cmd_in_table(struct intel_engine_cs *ring,
+find_cmd_in_table(struct intel_engine_cs *engine,
                  u32 cmd_header)
 {
        struct cmd_node *desc_node;
 
-       hash_for_each_possible(ring->cmd_hash, desc_node, node,
+       hash_for_each_possible(engine->cmd_hash, desc_node, node,
                               cmd_header & CMD_HASH_MASK) {
                const struct drm_i915_cmd_descriptor *desc = desc_node->desc;
                u32 masked_cmd = desc->cmd.mask & cmd_header;
@@ -822,18 +870,18 @@ find_cmd_in_table(struct intel_engine_cs *ring,
  * ring's default length encoding and returns default_desc.
  */
 static const struct drm_i915_cmd_descriptor*
-find_cmd(struct intel_engine_cs *ring,
+find_cmd(struct intel_engine_cs *engine,
         u32 cmd_header,
         struct drm_i915_cmd_descriptor *default_desc)
 {
        const struct drm_i915_cmd_descriptor *desc;
        u32 mask;
 
-       desc = find_cmd_in_table(ring, cmd_header);
+       desc = find_cmd_in_table(engine, cmd_header);
        if (desc)
                return desc;
 
-       mask = ring->get_cmd_length_mask(cmd_header);
+       mask = engine->get_cmd_length_mask(cmd_header);
        if (!mask)
                return NULL;
 
@@ -848,12 +896,31 @@ static const struct drm_i915_reg_descriptor *
 find_reg(const struct drm_i915_reg_descriptor *table,
         int count, u32 addr)
 {
-       if (table) {
-               int i;
+       int i;
+
+       for (i = 0; i < count; i++) {
+               if (i915_mmio_reg_offset(table[i].addr) == addr)
+                       return &table[i];
+       }
 
-               for (i = 0; i < count; i++) {
-                       if (i915_mmio_reg_offset(table[i].addr) == addr)
-                               return &table[i];
+       return NULL;
+}
+
+static const struct drm_i915_reg_descriptor *
+find_reg_in_tables(const struct drm_i915_reg_table *tables,
+                  int count, bool is_master, u32 addr)
+{
+       int i;
+       const struct drm_i915_reg_table *table;
+       const struct drm_i915_reg_descriptor *reg;
+
+       for (i = 0; i < count; i++) {
+               table = &tables[i];
+               if (!table->master || is_master) {
+                       reg = find_reg(table->regs, table->num_regs,
+                                      addr);
+                       if (reg != NULL)
+                               return reg;
                }
        }
 
@@ -963,18 +1030,18 @@ unpin_src:
  *
  * Return: true if the ring requires software command parsing
  */
-bool i915_needs_cmd_parser(struct intel_engine_cs *ring)
+bool i915_needs_cmd_parser(struct intel_engine_cs *engine)
 {
-       if (!ring->needs_cmd_parser)
+       if (!engine->needs_cmd_parser)
                return false;
 
-       if (!USES_PPGTT(ring->dev))
+       if (!USES_PPGTT(engine->dev))
                return false;
 
        return (i915.enable_cmd_parser == 1);
 }
 
-static bool check_cmd(const struct intel_engine_cs *ring,
+static bool check_cmd(const struct intel_engine_cs *engine,
                      const struct drm_i915_cmd_descriptor *desc,
                      const u32 *cmd, u32 length,
                      const bool is_master,
@@ -1004,17 +1071,14 @@ static bool check_cmd(const struct intel_engine_cs *ring,
                     offset += step) {
                        const u32 reg_addr = cmd[offset] & desc->reg.mask;
                        const struct drm_i915_reg_descriptor *reg =
-                               find_reg(ring->reg_table, ring->reg_count,
-                                        reg_addr);
-
-                       if (!reg && is_master)
-                               reg = find_reg(ring->master_reg_table,
-                                              ring->master_reg_count,
-                                              reg_addr);
+                               find_reg_in_tables(engine->reg_tables,
+                                                  engine->reg_table_count,
+                                                  is_master,
+                                                  reg_addr);
 
                        if (!reg) {
                                DRM_DEBUG_DRIVER("CMD: Rejected register 0x%08X in command: 0x%08X (ring=%d)\n",
-                                                reg_addr, *cmd, ring->id);
+                                                reg_addr, *cmd, engine->id);
                                return false;
                        }
 
@@ -1087,7 +1151,7 @@ static bool check_cmd(const struct intel_engine_cs *ring,
                                                 *cmd,
                                                 desc->bits[i].mask,
                                                 desc->bits[i].expected,
-                                                dword, ring->id);
+                                                dword, engine->id);
                                return false;
                        }
                }
@@ -1113,7 +1177,7 @@ static bool check_cmd(const struct intel_engine_cs *ring,
  * Return: non-zero if the parser finds violations or otherwise fails; -EACCES
  * if the batch appears legal but should use hardware parsing
  */
-int i915_parse_cmds(struct intel_engine_cs *ring,
+int i915_parse_cmds(struct intel_engine_cs *engine,
                    struct drm_i915_gem_object *batch_obj,
                    struct drm_i915_gem_object *shadow_batch_obj,
                    u32 batch_start_offset,
@@ -1147,7 +1211,7 @@ int i915_parse_cmds(struct intel_engine_cs *ring,
                if (*cmd == MI_BATCH_BUFFER_END)
                        break;
 
-               desc = find_cmd(ring, *cmd, &default_desc);
+               desc = find_cmd(engine, *cmd, &default_desc);
                if (!desc) {
                        DRM_DEBUG_DRIVER("CMD: Unrecognized command: 0x%08X\n",
                                         *cmd);
@@ -1179,7 +1243,7 @@ int i915_parse_cmds(struct intel_engine_cs *ring,
                        break;
                }
 
-               if (!check_cmd(ring, desc, cmd, length, is_master,
+               if (!check_cmd(engine, desc, cmd, length, is_master,
                               &oacontrol_set)) {
                        ret = -EINVAL;
                        break;
@@ -1223,6 +1287,7 @@ int i915_cmd_parser_get_version(void)
         * 3. Allow access to the GPGPU_THREADS_DISPATCHED register.
         * 4. L3 atomic chicken bits of HSW_SCRATCH1 and HSW_ROW_CHICKEN3.
         * 5. GPGPU dispatch compute indirect registers.
+        * 6. TIMESTAMP register and Haswell CS GPR registers
         */
-       return 5;
+       return 6;
 }
index e3f4c725a1c6910f3431431d9a2dbc538153f025..32690332d441dc16b7ba51bd641add5e984cc52e 100644 (file)
@@ -89,27 +89,34 @@ static int i915_capabilities(struct seq_file *m, void *data)
        return 0;
 }
 
-static const char *get_pin_flag(struct drm_i915_gem_object *obj)
+static const char get_active_flag(struct drm_i915_gem_object *obj)
 {
-       if (obj->pin_display)
-               return "p";
-       else
-               return " ";
+       return obj->active ? '*' : ' ';
 }
 
-static const char *get_tiling_flag(struct drm_i915_gem_object *obj)
+static const char get_pin_flag(struct drm_i915_gem_object *obj)
+{
+       return obj->pin_display ? 'p' : ' ';
+}
+
+static const char get_tiling_flag(struct drm_i915_gem_object *obj)
 {
        switch (obj->tiling_mode) {
        default:
-       case I915_TILING_NONE: return " ";
-       case I915_TILING_X: return "X";
-       case I915_TILING_Y: return "Y";
+       case I915_TILING_NONE: return ' ';
+       case I915_TILING_X: return 'X';
+       case I915_TILING_Y: return 'Y';
        }
 }
 
-static inline const char *get_global_flag(struct drm_i915_gem_object *obj)
+static inline const char get_global_flag(struct drm_i915_gem_object *obj)
 {
-       return i915_gem_obj_to_ggtt(obj) ? "g" : " ";
+       return i915_gem_obj_to_ggtt(obj) ? 'g' : ' ';
+}
+
+static inline const char get_pin_mapped_flag(struct drm_i915_gem_object *obj)
+{
+       return obj->mapping ? 'M' : ' ';
 }
 
 static u64 i915_gem_obj_total_ggtt_size(struct drm_i915_gem_object *obj)
@@ -129,23 +136,26 @@ static void
 describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
 {
        struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct i915_vma *vma;
        int pin_count = 0;
-       int i;
+       enum intel_engine_id id;
+
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
 
-       seq_printf(m, "%pK: %s%s%s%s %8zdKiB %02x %02x [ ",
+       seq_printf(m, "%pK: %c%c%c%c%c %8zdKiB %02x %02x [ ",
                   &obj->base,
-                  obj->active ? "*" : " ",
+                  get_active_flag(obj),
                   get_pin_flag(obj),
                   get_tiling_flag(obj),
                   get_global_flag(obj),
+                  get_pin_mapped_flag(obj),
                   obj->base.size / 1024,
                   obj->base.read_domains,
                   obj->base.write_domain);
-       for_each_ring(ring, dev_priv, i)
+       for_each_engine_id(engine, dev_priv, id)
                seq_printf(m, "%x ",
-                               i915_gem_request_get_seqno(obj->last_read_req[i]));
+                               i915_gem_request_get_seqno(obj->last_read_req[id]));
        seq_printf(m, "] %x %x%s%s%s",
                   i915_gem_request_get_seqno(obj->last_write_req),
                   i915_gem_request_get_seqno(obj->last_fenced_req),
@@ -184,7 +194,7 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
        }
        if (obj->last_write_req != NULL)
                seq_printf(m, " (%s)",
-                          i915_gem_request_get_ring(obj->last_write_req)->name);
+                          i915_gem_request_get_engine(obj->last_write_req)->name);
        if (obj->frontbuffer_bits)
                seq_printf(m, " (frontbuffer: 0x%03x)", obj->frontbuffer_bits);
 }
@@ -202,8 +212,8 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
        uintptr_t list = (uintptr_t) node->info_ent->data;
        struct list_head *head;
        struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_address_space *vm = &dev_priv->gtt.base;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_vma *vma;
        u64 total_obj_size, total_gtt_size;
        int count, ret;
@@ -216,11 +226,11 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
        switch (list) {
        case ACTIVE_LIST:
                seq_puts(m, "Active:\n");
-               head = &vm->active_list;
+               head = &ggtt->base.active_list;
                break;
        case INACTIVE_LIST:
                seq_puts(m, "Inactive:\n");
-               head = &vm->inactive_list;
+               head = &ggtt->base.inactive_list;
                break;
        default:
                mutex_unlock(&dev->struct_mutex);
@@ -397,15 +407,15 @@ static void print_batch_pool_stats(struct seq_file *m,
 {
        struct drm_i915_gem_object *obj;
        struct file_stats stats;
-       struct intel_engine_cs *ring;
-       int i, j;
+       struct intel_engine_cs *engine;
+       int j;
 
        memset(&stats, 0, sizeof(stats));
 
-       for_each_ring(ring, dev_priv, i) {
-               for (j = 0; j < ARRAY_SIZE(ring->batch_pool.cache_list); j++) {
+       for_each_engine(engine, dev_priv) {
+               for (j = 0; j < ARRAY_SIZE(engine->batch_pool.cache_list); j++) {
                        list_for_each_entry(obj,
-                                           &ring->batch_pool.cache_list[j],
+                                           &engine->batch_pool.cache_list[j],
                                            batch_pool_link)
                                per_file_stats(0, obj, &stats);
                }
@@ -429,11 +439,13 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
 {
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        u32 count, mappable_count, purgeable_count;
        u64 size, mappable_size, purgeable_size;
+       unsigned long pin_mapped_count = 0, pin_mapped_purgeable_count = 0;
+       u64 pin_mapped_size = 0, pin_mapped_purgeable_size = 0;
        struct drm_i915_gem_object *obj;
-       struct i915_address_space *vm = &dev_priv->gtt.base;
        struct drm_file *file;
        struct i915_vma *vma;
        int ret;
@@ -452,12 +464,12 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                   count, mappable_count, size, mappable_size);
 
        size = count = mappable_size = mappable_count = 0;
-       count_vmas(&vm->active_list, vm_link);
+       count_vmas(&ggtt->base.active_list, vm_link);
        seq_printf(m, "  %u [%u] active objects, %llu [%llu] bytes\n",
                   count, mappable_count, size, mappable_size);
 
        size = count = mappable_size = mappable_count = 0;
-       count_vmas(&vm->inactive_list, vm_link);
+       count_vmas(&ggtt->base.inactive_list, vm_link);
        seq_printf(m, "  %u [%u] inactive objects, %llu [%llu] bytes\n",
                   count, mappable_count, size, mappable_size);
 
@@ -466,6 +478,14 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                size += obj->base.size, ++count;
                if (obj->madv == I915_MADV_DONTNEED)
                        purgeable_size += obj->base.size, ++purgeable_count;
+               if (obj->mapping) {
+                       pin_mapped_count++;
+                       pin_mapped_size += obj->base.size;
+                       if (obj->pages_pin_count == 0) {
+                               pin_mapped_purgeable_count++;
+                               pin_mapped_purgeable_size += obj->base.size;
+                       }
+               }
        }
        seq_printf(m, "%u unbound objects, %llu bytes\n", count, size);
 
@@ -483,6 +503,14 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                        purgeable_size += obj->base.size;
                        ++purgeable_count;
                }
+               if (obj->mapping) {
+                       pin_mapped_count++;
+                       pin_mapped_size += obj->base.size;
+                       if (obj->pages_pin_count == 0) {
+                               pin_mapped_purgeable_count++;
+                               pin_mapped_purgeable_size += obj->base.size;
+                       }
+               }
        }
        seq_printf(m, "%u purgeable objects, %llu bytes\n",
                   purgeable_count, purgeable_size);
@@ -490,13 +518,20 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                   mappable_count, mappable_size);
        seq_printf(m, "%u fault mappable objects, %llu bytes\n",
                   count, size);
+       seq_printf(m,
+                  "%lu [%lu] pin mapped objects, %llu [%llu] bytes [purgeable]\n",
+                  pin_mapped_count, pin_mapped_purgeable_count,
+                  pin_mapped_size, pin_mapped_purgeable_size);
 
        seq_printf(m, "%llu [%llu] gtt total\n",
-                  dev_priv->gtt.base.total,
-                  (u64)dev_priv->gtt.mappable_end - dev_priv->gtt.base.start);
+                  ggtt->base.total, ggtt->mappable_end - ggtt->base.start);
 
        seq_putc(m, '\n');
        print_batch_pool_stats(m, dev_priv);
+
+       mutex_unlock(&dev->struct_mutex);
+
+       mutex_lock(&dev->filelist_mutex);
        list_for_each_entry_reverse(file, &dev->filelist, lhead) {
                struct file_stats stats;
                struct task_struct *task;
@@ -517,8 +552,7 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
                print_file_stats(m, task ? task->comm : "<unknown>", stats);
                rcu_read_unlock();
        }
-
-       mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->filelist_mutex);
 
        return 0;
 }
@@ -591,14 +625,13 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data)
                                           pipe, plane);
                        }
                        if (work->flip_queued_req) {
-                               struct intel_engine_cs *ring =
-                                       i915_gem_request_get_ring(work->flip_queued_req);
+                               struct intel_engine_cs *engine = i915_gem_request_get_engine(work->flip_queued_req);
 
                                seq_printf(m, "Flip queued on %s at seqno %x, next seqno %x [current breadcrumb %x], completed? %d\n",
-                                          ring->name,
+                                          engine->name,
                                           i915_gem_request_get_seqno(work->flip_queued_req),
                                           dev_priv->next_seqno,
-                                          ring->get_seqno(ring, true),
+                                          engine->get_seqno(engine),
                                           i915_gem_request_completed(work->flip_queued_req, true));
                        } else
                                seq_printf(m, "Flip not associated with any ring\n");
@@ -637,28 +670,28 @@ static int i915_gem_batch_pool_info(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_gem_object *obj;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        int total = 0;
-       int ret, i, j;
+       int ret, j;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
 
-       for_each_ring(ring, dev_priv, i) {
-               for (j = 0; j < ARRAY_SIZE(ring->batch_pool.cache_list); j++) {
+       for_each_engine(engine, dev_priv) {
+               for (j = 0; j < ARRAY_SIZE(engine->batch_pool.cache_list); j++) {
                        int count;
 
                        count = 0;
                        list_for_each_entry(obj,
-                                           &ring->batch_pool.cache_list[j],
+                                           &engine->batch_pool.cache_list[j],
                                            batch_pool_link)
                                count++;
                        seq_printf(m, "%s cache[%d]: %d objects\n",
-                                  ring->name, j, count);
+                                  engine->name, j, count);
 
                        list_for_each_entry(obj,
-                                           &ring->batch_pool.cache_list[j],
+                                           &engine->batch_pool.cache_list[j],
                                            batch_pool_link) {
                                seq_puts(m, "   ");
                                describe_obj(m, obj);
@@ -681,26 +714,26 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct drm_i915_gem_request *req;
-       int ret, any, i;
+       int ret, any;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
 
        any = 0;
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                int count;
 
                count = 0;
-               list_for_each_entry(req, &ring->request_list, list)
+               list_for_each_entry(req, &engine->request_list, list)
                        count++;
                if (count == 0)
                        continue;
 
-               seq_printf(m, "%s requests: %d\n", ring->name, count);
-               list_for_each_entry(req, &ring->request_list, list) {
+               seq_printf(m, "%s requests: %d\n", engine->name, count);
+               list_for_each_entry(req, &engine->request_list, list) {
                        struct task_struct *task;
 
                        rcu_read_lock();
@@ -726,12 +759,12 @@ static int i915_gem_request_info(struct seq_file *m, void *data)
 }
 
 static void i915_ring_seqno_info(struct seq_file *m,
-                                struct intel_engine_cs *ring)
+                                struct intel_engine_cs *engine)
 {
-       if (ring->get_seqno) {
-               seq_printf(m, "Current sequence (%s): %x\n",
-                          ring->name, ring->get_seqno(ring, false));
-       }
+       seq_printf(m, "Current sequence (%s): %x\n",
+                  engine->name, engine->get_seqno(engine));
+       seq_printf(m, "Current user interrupts (%s): %x\n",
+                  engine->name, READ_ONCE(engine->user_interrupts));
 }
 
 static int i915_gem_seqno_info(struct seq_file *m, void *data)
@@ -739,16 +772,16 @@ static int i915_gem_seqno_info(struct seq_file *m, void *data)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int ret, i;
+       struct intel_engine_cs *engine;
+       int ret;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
                return ret;
        intel_runtime_pm_get(dev_priv);
 
-       for_each_ring(ring, dev_priv, i)
-               i915_ring_seqno_info(m, ring);
+       for_each_engine(engine, dev_priv)
+               i915_ring_seqno_info(m, engine);
 
        intel_runtime_pm_put(dev_priv);
        mutex_unlock(&dev->struct_mutex);
@@ -762,7 +795,7 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        int ret, i, pipe;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
@@ -934,13 +967,13 @@ static int i915_interrupt_info(struct seq_file *m, void *data)
                seq_printf(m, "Graphics Interrupt mask:         %08x\n",
                           I915_READ(GTIMR));
        }
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                if (INTEL_INFO(dev)->gen >= 6) {
                        seq_printf(m,
                                   "Graphics Interrupt mask (%s):       %08x\n",
-                                  ring->name, I915_READ_IMR(ring));
+                                  engine->name, I915_READ_IMR(engine));
                }
-               i915_ring_seqno_info(m, ring);
+               i915_ring_seqno_info(m, engine);
        }
        intel_runtime_pm_put(dev_priv);
        mutex_unlock(&dev->struct_mutex);
@@ -981,12 +1014,12 @@ static int i915_hws_info(struct seq_file *m, void *data)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        const u32 *hws;
        int i;
 
-       ring = &dev_priv->ring[(uintptr_t)node->info_ent->data];
-       hws = ring->status_page.page_addr;
+       engine = &dev_priv->engine[(uintptr_t)node->info_ent->data];
+       hws = engine->status_page.page_addr;
        if (hws == NULL)
                return 0;
 
@@ -1216,12 +1249,12 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                rpdeclimit = I915_READ(GEN6_RP_DOWN_THRESHOLD);
 
                rpstat = I915_READ(GEN6_RPSTAT1);
-               rpupei = I915_READ(GEN6_RP_CUR_UP_EI);
-               rpcurup = I915_READ(GEN6_RP_CUR_UP);
-               rpprevup = I915_READ(GEN6_RP_PREV_UP);
-               rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
-               rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
-               rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
+               rpupei = I915_READ(GEN6_RP_CUR_UP_EI) & GEN6_CURICONT_MASK;
+               rpcurup = I915_READ(GEN6_RP_CUR_UP) & GEN6_CURBSYTAVG_MASK;
+               rpprevup = I915_READ(GEN6_RP_PREV_UP) & GEN6_CURBSYTAVG_MASK;
+               rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI) & GEN6_CURIAVG_MASK;
+               rpcurdown = I915_READ(GEN6_RP_CUR_DOWN) & GEN6_CURBSYTAVG_MASK;
+               rpprevdown = I915_READ(GEN6_RP_PREV_DOWN) & GEN6_CURBSYTAVG_MASK;
                if (IS_GEN9(dev))
                        cagf = (rpstat & GEN9_CAGF_MASK) >> GEN9_CAGF_SHIFT;
                else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
@@ -1261,21 +1294,21 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
                seq_printf(m, "RPDECLIMIT: 0x%08x\n", rpdeclimit);
                seq_printf(m, "RPNSWREQ: %dMHz\n", reqf);
                seq_printf(m, "CAGF: %dMHz\n", cagf);
-               seq_printf(m, "RP CUR UP EI: %dus\n", rpupei &
-                          GEN6_CURICONT_MASK);
-               seq_printf(m, "RP CUR UP: %dus\n", rpcurup &
-                          GEN6_CURBSYTAVG_MASK);
-               seq_printf(m, "RP PREV UP: %dus\n", rpprevup &
-                          GEN6_CURBSYTAVG_MASK);
+               seq_printf(m, "RP CUR UP EI: %d (%dus)\n",
+                          rpupei, GT_PM_INTERVAL_TO_US(dev_priv, rpupei));
+               seq_printf(m, "RP CUR UP: %d (%dus)\n",
+                          rpcurup, GT_PM_INTERVAL_TO_US(dev_priv, rpcurup));
+               seq_printf(m, "RP PREV UP: %d (%dus)\n",
+                          rpprevup, GT_PM_INTERVAL_TO_US(dev_priv, rpprevup));
                seq_printf(m, "Up threshold: %d%%\n",
                           dev_priv->rps.up_threshold);
 
-               seq_printf(m, "RP CUR DOWN EI: %dus\n", rpdownei &
-                          GEN6_CURIAVG_MASK);
-               seq_printf(m, "RP CUR DOWN: %dus\n", rpcurdown &
-                          GEN6_CURBSYTAVG_MASK);
-               seq_printf(m, "RP PREV DOWN: %dus\n", rpprevdown &
-                          GEN6_CURBSYTAVG_MASK);
+               seq_printf(m, "RP CUR DOWN EI: %d (%dus)\n",
+                          rpdownei, GT_PM_INTERVAL_TO_US(dev_priv, rpdownei));
+               seq_printf(m, "RP CUR DOWN: %d (%dus)\n",
+                          rpcurdown, GT_PM_INTERVAL_TO_US(dev_priv, rpcurdown));
+               seq_printf(m, "RP PREV DOWN: %d (%dus)\n",
+                          rpprevdown, GT_PM_INTERVAL_TO_US(dev_priv, rpprevdown));
                seq_printf(m, "Down threshold: %d%%\n",
                           dev_priv->rps.down_threshold);
 
@@ -1331,11 +1364,12 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       u64 acthd[I915_NUM_RINGS];
-       u32 seqno[I915_NUM_RINGS];
+       struct intel_engine_cs *engine;
+       u64 acthd[I915_NUM_ENGINES];
+       u32 seqno[I915_NUM_ENGINES];
        u32 instdone[I915_NUM_INSTDONE_REG];
-       int i, j;
+       enum intel_engine_id id;
+       int j;
 
        if (!i915.enable_hangcheck) {
                seq_printf(m, "Hangcheck disabled\n");
@@ -1344,9 +1378,9 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
 
        intel_runtime_pm_get(dev_priv);
 
-       for_each_ring(ring, dev_priv, i) {
-               seqno[i] = ring->get_seqno(ring, false);
-               acthd[i] = intel_ring_get_active_head(ring);
+       for_each_engine_id(engine, dev_priv, id) {
+               acthd[id] = intel_ring_get_active_head(engine);
+               seqno[id] = engine->get_seqno(engine);
        }
 
        i915_get_extra_instdone(dev, instdone);
@@ -1360,19 +1394,22 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
        } else
                seq_printf(m, "Hangcheck inactive\n");
 
-       for_each_ring(ring, dev_priv, i) {
-               seq_printf(m, "%s:\n", ring->name);
-               seq_printf(m, "\tseqno = %x [current %x]\n",
-                          ring->hangcheck.seqno, seqno[i]);
+       for_each_engine_id(engine, dev_priv, id) {
+               seq_printf(m, "%s:\n", engine->name);
+               seq_printf(m, "\tseqno = %x [current %x, last %x]\n",
+                          engine->hangcheck.seqno,
+                          seqno[id],
+                          engine->last_submitted_seqno);
+               seq_printf(m, "\tuser interrupts = %x [current %x]\n",
+                          engine->hangcheck.user_interrupts,
+                          READ_ONCE(engine->user_interrupts));
                seq_printf(m, "\tACTHD = 0x%08llx [current 0x%08llx]\n",
-                          (long long)ring->hangcheck.acthd,
-                          (long long)acthd[i]);
-               seq_printf(m, "\tmax ACTHD = 0x%08llx\n",
-                          (long long)ring->hangcheck.max_acthd);
-               seq_printf(m, "\tscore = %d\n", ring->hangcheck.score);
-               seq_printf(m, "\taction = %d\n", ring->hangcheck.action);
-
-               if (ring->id == RCS) {
+                          (long long)engine->hangcheck.acthd,
+                          (long long)acthd[id]);
+               seq_printf(m, "\tscore = %d\n", engine->hangcheck.score);
+               seq_printf(m, "\taction = %d\n", engine->hangcheck.action);
+
+               if (engine->id == RCS) {
                        seq_puts(m, "\tinstdone read =");
 
                        for (j = 0; j < I915_NUM_INSTDONE_REG; j++)
@@ -1382,7 +1419,7 @@ static int i915_hangcheck_info(struct seq_file *m, void *unused)
 
                        for (j = 0; j < I915_NUM_INSTDONE_REG; j++)
                                seq_printf(m, " 0x%08x",
-                                          ring->hangcheck.instdone[j]);
+                                          engine->hangcheck.instdone[j]);
 
                        seq_puts(m, "\n");
                }
@@ -1465,12 +1502,11 @@ static int i915_forcewake_domains(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_uncore_forcewake_domain *fw_domain;
-       int i;
 
        spin_lock_irq(&dev_priv->uncore.lock);
-       for_each_fw_domain(fw_domain, dev_priv, i) {
+       for_each_fw_domain(fw_domain, dev_priv) {
                seq_printf(m, "%s.wake_count = %u\n",
-                          intel_uncore_forcewake_domain_to_str(i),
+                          intel_uncore_forcewake_domain_to_str(fw_domain->id),
                           fw_domain->wake_count);
        }
        spin_unlock_irq(&dev_priv->uncore.lock);
@@ -1897,6 +1933,11 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
        struct drm_device *dev = node->minor->dev;
        struct intel_framebuffer *fbdev_fb = NULL;
        struct drm_framebuffer *drm_fb;
+       int ret;
+
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
        if (to_i915(dev)->fbdev) {
@@ -1908,7 +1949,7 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
                          fbdev_fb->base.depth,
                          fbdev_fb->base.bits_per_pixel,
                          fbdev_fb->base.modifier[0],
-                         atomic_read(&fbdev_fb->base.refcount.refcount));
+                         drm_framebuffer_read_refcount(&fbdev_fb->base));
                describe_obj(m, fbdev_fb->obj);
                seq_putc(m, '\n');
        }
@@ -1926,11 +1967,12 @@ static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
                           fb->base.depth,
                           fb->base.bits_per_pixel,
                           fb->base.modifier[0],
-                          atomic_read(&fb->base.refcount.refcount));
+                          drm_framebuffer_read_refcount(&fb->base));
                describe_obj(m, fb->obj);
                seq_putc(m, '\n');
        }
        mutex_unlock(&dev->mode_config.fb_lock);
+       mutex_unlock(&dev->struct_mutex);
 
        return 0;
 }
@@ -1948,9 +1990,10 @@ static int i915_context_status(struct seq_file *m, void *unused)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct intel_context *ctx;
-       int ret, i;
+       enum intel_engine_id id;
+       int ret;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
@@ -1968,13 +2011,13 @@ static int i915_context_status(struct seq_file *m, void *unused)
 
                if (i915.enable_execlists) {
                        seq_putc(m, '\n');
-                       for_each_ring(ring, dev_priv, i) {
+                       for_each_engine_id(engine, dev_priv, id) {
                                struct drm_i915_gem_object *ctx_obj =
-                                       ctx->engine[i].state;
+                                       ctx->engine[id].state;
                                struct intel_ringbuffer *ringbuf =
-                                       ctx->engine[i].ringbuf;
+                                       ctx->engine[id].ringbuf;
 
-                               seq_printf(m, "%s: ", ring->name);
+                               seq_printf(m, "%s: ", engine->name);
                                if (ctx_obj)
                                        describe_obj(m, ctx_obj);
                                if (ringbuf)
@@ -1995,22 +2038,22 @@ static int i915_context_status(struct seq_file *m, void *unused)
 
 static void i915_dump_lrc_obj(struct seq_file *m,
                              struct intel_context *ctx,
-                             struct intel_engine_cs *ring)
+                             struct intel_engine_cs *engine)
 {
        struct page *page;
        uint32_t *reg_state;
        int j;
-       struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state;
+       struct drm_i915_gem_object *ctx_obj = ctx->engine[engine->id].state;
        unsigned long ggtt_offset = 0;
 
        if (ctx_obj == NULL) {
                seq_printf(m, "Context on %s with no gem object\n",
-                          ring->name);
+                          engine->name);
                return;
        }
 
-       seq_printf(m, "CONTEXT: %s %u\n", ring->name,
-                  intel_execlists_ctx_id(ctx, ring));
+       seq_printf(m, "CONTEXT: %s %u\n", engine->name,
+                  intel_execlists_ctx_id(ctx, engine));
 
        if (!i915_gem_obj_ggtt_bound(ctx_obj))
                seq_puts(m, "\tNot bound in GGTT\n");
@@ -2043,9 +2086,9 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
        struct drm_info_node *node = (struct drm_info_node *) m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct intel_context *ctx;
-       int ret, i;
+       int ret;
 
        if (!i915.enable_execlists) {
                seq_printf(m, "Logical Ring Contexts are disabled\n");
@@ -2058,8 +2101,8 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
 
        list_for_each_entry(ctx, &dev_priv->context_list, link)
                if (ctx != dev_priv->kernel_context)
-                       for_each_ring(ring, dev_priv, i)
-                               i915_dump_lrc_obj(m, ctx, ring);
+                       for_each_engine(engine, dev_priv)
+                               i915_dump_lrc_obj(m, ctx, engine);
 
        mutex_unlock(&dev->struct_mutex);
 
@@ -2071,15 +2114,14 @@ static int i915_execlists(struct seq_file *m, void *data)
        struct drm_info_node *node = (struct drm_info_node *)m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        u32 status_pointer;
        u8 read_pointer;
        u8 write_pointer;
        u32 status;
        u32 ctx_id;
        struct list_head *cursor;
-       int ring_id, i;
-       int ret;
+       int i, ret;
 
        if (!i915.enable_execlists) {
                seq_puts(m, "Logical Ring Contexts are disabled\n");
@@ -2092,22 +2134,21 @@ static int i915_execlists(struct seq_file *m, void *data)
 
        intel_runtime_pm_get(dev_priv);
 
-       for_each_ring(ring, dev_priv, ring_id) {
+       for_each_engine(engine, dev_priv) {
                struct drm_i915_gem_request *head_req = NULL;
                int count = 0;
-               unsigned long flags;
 
-               seq_printf(m, "%s\n", ring->name);
+               seq_printf(m, "%s\n", engine->name);
 
-               status = I915_READ(RING_EXECLIST_STATUS_LO(ring));
-               ctx_id = I915_READ(RING_EXECLIST_STATUS_HI(ring));
+               status = I915_READ(RING_EXECLIST_STATUS_LO(engine));
+               ctx_id = I915_READ(RING_EXECLIST_STATUS_HI(engine));
                seq_printf(m, "\tExeclist status: 0x%08X, context: %u\n",
                           status, ctx_id);
 
-               status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(ring));
+               status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(engine));
                seq_printf(m, "\tStatus pointer: 0x%08X\n", status_pointer);
 
-               read_pointer = ring->next_context_status_buffer;
+               read_pointer = engine->next_context_status_buffer;
                write_pointer = GEN8_CSB_WRITE_PTR(status_pointer);
                if (read_pointer > write_pointer)
                        write_pointer += GEN8_CSB_ENTRIES;
@@ -2115,24 +2156,25 @@ static int i915_execlists(struct seq_file *m, void *data)
                           read_pointer, write_pointer);
 
                for (i = 0; i < GEN8_CSB_ENTRIES; i++) {
-                       status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(ring, i));
-                       ctx_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(ring, i));
+                       status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(engine, i));
+                       ctx_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(engine, i));
 
                        seq_printf(m, "\tStatus buffer %d: 0x%08X, context: %u\n",
                                   i, status, ctx_id);
                }
 
-               spin_lock_irqsave(&ring->execlist_lock, flags);
-               list_for_each(cursor, &ring->execlist_queue)
+               spin_lock_bh(&engine->execlist_lock);
+               list_for_each(cursor, &engine->execlist_queue)
                        count++;
-               head_req = list_first_entry_or_null(&ring->execlist_queue,
-                               struct drm_i915_gem_request, execlist_link);
-               spin_unlock_irqrestore(&ring->execlist_lock, flags);
+               head_req = list_first_entry_or_null(&engine->execlist_queue,
+                                                   struct drm_i915_gem_request,
+                                                   execlist_link);
+               spin_unlock_bh(&engine->execlist_lock);
 
                seq_printf(m, "\t%d requests in queue\n", count);
                if (head_req) {
                        seq_printf(m, "\tHead request id: %u\n",
-                                  intel_execlists_ctx_id(head_req->ctx, ring));
+                                  intel_execlists_ctx_id(head_req->ctx, engine));
                        seq_printf(m, "\tHead request tail: %u\n",
                                   head_req->tail);
                }
@@ -2248,19 +2290,19 @@ static int per_file_ctx(int id, void *ptr, void *data)
 static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
-       int unused, i;
+       int i;
 
        if (!ppgtt)
                return;
 
-       for_each_ring(ring, dev_priv, unused) {
-               seq_printf(m, "%s\n", ring->name);
+       for_each_engine(engine, dev_priv) {
+               seq_printf(m, "%s\n", engine->name);
                for (i = 0; i < 4; i++) {
-                       u64 pdp = I915_READ(GEN8_RING_PDP_UDW(ring, i));
+                       u64 pdp = I915_READ(GEN8_RING_PDP_UDW(engine, i));
                        pdp <<= 32;
-                       pdp |= I915_READ(GEN8_RING_PDP_LDW(ring, i));
+                       pdp |= I915_READ(GEN8_RING_PDP_LDW(engine, i));
                        seq_printf(m, "\tPDP%d 0x%016llx\n", i, pdp);
                }
        }
@@ -2269,19 +2311,22 @@ static void gen8_ppgtt_info(struct seq_file *m, struct drm_device *dev)
 static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
        if (INTEL_INFO(dev)->gen == 6)
                seq_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(GFX_MODE));
 
-       for_each_ring(ring, dev_priv, i) {
-               seq_printf(m, "%s\n", ring->name);
+       for_each_engine(engine, dev_priv) {
+               seq_printf(m, "%s\n", engine->name);
                if (INTEL_INFO(dev)->gen == 7)
-                       seq_printf(m, "GFX_MODE: 0x%08x\n", I915_READ(RING_MODE_GEN7(ring)));
-               seq_printf(m, "PP_DIR_BASE: 0x%08x\n", I915_READ(RING_PP_DIR_BASE(ring)));
-               seq_printf(m, "PP_DIR_BASE_READ: 0x%08x\n", I915_READ(RING_PP_DIR_BASE_READ(ring)));
-               seq_printf(m, "PP_DIR_DCLV: 0x%08x\n", I915_READ(RING_PP_DIR_DCLV(ring)));
+                       seq_printf(m, "GFX_MODE: 0x%08x\n",
+                                  I915_READ(RING_MODE_GEN7(engine)));
+               seq_printf(m, "PP_DIR_BASE: 0x%08x\n",
+                          I915_READ(RING_PP_DIR_BASE(engine)));
+               seq_printf(m, "PP_DIR_BASE_READ: 0x%08x\n",
+                          I915_READ(RING_PP_DIR_BASE_READ(engine)));
+               seq_printf(m, "PP_DIR_DCLV: 0x%08x\n",
+                          I915_READ(RING_PP_DIR_DCLV(engine)));
        }
        if (dev_priv->mm.aliasing_ppgtt) {
                struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
@@ -2312,6 +2357,7 @@ static int i915_ppgtt_info(struct seq_file *m, void *data)
        else if (INTEL_INFO(dev)->gen >= 6)
                gen6_ppgtt_info(m, dev);
 
+       mutex_lock(&dev->filelist_mutex);
        list_for_each_entry_reverse(file, &dev->filelist, lhead) {
                struct drm_i915_file_private *file_priv = file->driver_priv;
                struct task_struct *task;
@@ -2326,6 +2372,7 @@ static int i915_ppgtt_info(struct seq_file *m, void *data)
                idr_for_each(&file_priv->context_idr, per_file_ctx,
                             (void *)(unsigned long)m);
        }
+       mutex_unlock(&dev->filelist_mutex);
 
 out_put:
        intel_runtime_pm_put(dev_priv);
@@ -2336,12 +2383,11 @@ out_put:
 
 static int count_irq_waiters(struct drm_i915_private *i915)
 {
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        int count = 0;
-       int i;
 
-       for_each_ring(ring, i915, i)
-               count += ring->irq_refcount;
+       for_each_engine(engine, i915)
+               count += engine->irq_refcount;
 
        return count;
 }
@@ -2362,6 +2408,8 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
                   intel_gpu_freq(dev_priv, dev_priv->rps.min_freq_softlimit),
                   intel_gpu_freq(dev_priv, dev_priv->rps.max_freq_softlimit),
                   intel_gpu_freq(dev_priv, dev_priv->rps.max_freq));
+
+       mutex_lock(&dev->filelist_mutex);
        spin_lock(&dev_priv->rps.client_lock);
        list_for_each_entry_reverse(file, &dev->filelist, lhead) {
                struct drm_i915_file_private *file_priv = file->driver_priv;
@@ -2384,6 +2432,7 @@ static int i915_rps_boost_info(struct seq_file *m, void *data)
                   list_empty(&dev_priv->rps.mmioflips.link) ? "" : ", active");
        seq_printf(m, "Kernel boosts: %d\n", dev_priv->rps.boosts);
        spin_unlock(&dev_priv->rps.client_lock);
+       mutex_unlock(&dev->filelist_mutex);
 
        return 0;
 }
@@ -2393,10 +2442,11 @@ static int i915_llc(struct seq_file *m, void *data)
        struct drm_info_node *node = m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
+       const bool edram = INTEL_GEN(dev_priv) > 8;
 
-       /* Size calculation for LLC is a bit of a pain. Ignore for now. */
        seq_printf(m, "LLC: %s\n", yesno(HAS_LLC(dev)));
-       seq_printf(m, "eLLC: %zuMB\n", dev_priv->ellc_size);
+       seq_printf(m, "%s: %lluMB\n", edram ? "eDRAM" : "eLLC",
+                  intel_uncore_edram_size(dev_priv)/1024/1024);
 
        return 0;
 }
@@ -2408,7 +2458,7 @@ static int i915_guc_load_status_info(struct seq_file *m, void *data)
        struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
        u32 tmp, i;
 
-       if (!HAS_GUC_UCODE(dev_priv->dev))
+       if (!HAS_GUC_UCODE(dev_priv))
                return 0;
 
        seq_printf(m, "GuC firmware status:\n");
@@ -2449,9 +2499,8 @@ static void i915_guc_client_info(struct seq_file *m,
                                 struct drm_i915_private *dev_priv,
                                 struct i915_guc_client *client)
 {
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        uint64_t tot = 0;
-       uint32_t i;
 
        seq_printf(m, "\tPriority %d, GuC ctx index: %u, PD offset 0x%x\n",
                client->priority, client->ctx_index, client->proc_desc_offset);
@@ -2464,11 +2513,11 @@ static void i915_guc_client_info(struct seq_file *m,
        seq_printf(m, "\tFailed doorbell: %u\n", client->b_fail);
        seq_printf(m, "\tLast submission result: %d\n", client->retcode);
 
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                seq_printf(m, "\tSubmissions: %llu %s\n",
-                               client->submissions[ring->guc_id],
-                               ring->name);
-               tot += client->submissions[ring->guc_id];
+                               client->submissions[engine->guc_id],
+                               engine->name);
+               tot += client->submissions[engine->guc_id];
        }
        seq_printf(m, "\tTotal: %llu\n", tot);
 }
@@ -2480,11 +2529,10 @@ static int i915_guc_info(struct seq_file *m, void *data)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_guc guc;
        struct i915_guc_client client = {};
-       struct intel_engine_cs *ring;
-       enum intel_ring_id i;
+       struct intel_engine_cs *engine;
        u64 total = 0;
 
-       if (!HAS_GUC_SCHED(dev_priv->dev))
+       if (!HAS_GUC_SCHED(dev_priv))
                return 0;
 
        if (mutex_lock_interruptible(&dev->struct_mutex))
@@ -2504,11 +2552,11 @@ static int i915_guc_info(struct seq_file *m, void *data)
        seq_printf(m, "GuC last action error code: %d\n", guc.action_err);
 
        seq_printf(m, "\nGuC submissions:\n");
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                seq_printf(m, "\t%-24s: %10llu, last seqno 0x%08x\n",
-                       ring->name, guc.submissions[ring->guc_id],
-                       guc.last_seqno[ring->guc_id]);
-               total += guc.submissions[ring->guc_id];
+                       engine->name, guc.submissions[engine->guc_id],
+                       guc.last_seqno[engine->guc_id]);
+               total += guc.submissions[engine->guc_id];
        }
        seq_printf(m, "\t%s: %llu\n", "Total", total);
 
@@ -2688,10 +2736,8 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused)
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (!HAS_RUNTIME_PM(dev)) {
-               seq_puts(m, "not supported\n");
-               return 0;
-       }
+       if (!HAS_RUNTIME_PM(dev_priv))
+               seq_puts(m, "Runtime power management not supported\n");
 
        seq_printf(m, "GPU idle: %s\n", yesno(!dev_priv->mm.busy));
        seq_printf(m, "IRQs disabled: %s\n",
@@ -2702,6 +2748,9 @@ static int i915_runtime_pm_status(struct seq_file *m, void *unused)
 #else
        seq_printf(m, "Device Power Management (CONFIG_PM) disabled\n");
 #endif
+       seq_printf(m, "PCI device power state: %s [%d]\n",
+                  pci_power_name(dev_priv->dev->pdev->current_state),
+                  dev_priv->dev->pdev->current_state);
 
        return 0;
 }
@@ -3114,9 +3163,10 @@ static int i915_semaphore_status(struct seq_file *m, void *unused)
        struct drm_info_node *node = (struct drm_info_node *) m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        int num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
-       int i, j, ret;
+       enum intel_engine_id id;
+       int j, ret;
 
        if (!i915_semaphore_is_enabled(dev)) {
                seq_puts(m, "Semaphores are disabled\n");
@@ -3135,14 +3185,14 @@ static int i915_semaphore_status(struct seq_file *m, void *unused)
                page = i915_gem_object_get_page(dev_priv->semaphore_obj, 0);
 
                seqno = (uint64_t *)kmap_atomic(page);
-               for_each_ring(ring, dev_priv, i) {
+               for_each_engine_id(engine, dev_priv, id) {
                        uint64_t offset;
 
-                       seq_printf(m, "%s\n", ring->name);
+                       seq_printf(m, "%s\n", engine->name);
 
                        seq_puts(m, "  Last signal:");
                        for (j = 0; j < num_rings; j++) {
-                               offset = i * I915_NUM_RINGS + j;
+                               offset = id * I915_NUM_ENGINES + j;
                                seq_printf(m, "0x%08llx (0x%02llx) ",
                                           seqno[offset], offset * 8);
                        }
@@ -3150,7 +3200,7 @@ static int i915_semaphore_status(struct seq_file *m, void *unused)
 
                        seq_puts(m, "  Last wait:  ");
                        for (j = 0; j < num_rings; j++) {
-                               offset = i + (j * I915_NUM_RINGS);
+                               offset = id + (j * I915_NUM_ENGINES);
                                seq_printf(m, "0x%08llx (0x%02llx) ",
                                           seqno[offset], offset * 8);
                        }
@@ -3160,18 +3210,18 @@ static int i915_semaphore_status(struct seq_file *m, void *unused)
                kunmap_atomic(seqno);
        } else {
                seq_puts(m, "  Last signal:");
-               for_each_ring(ring, dev_priv, i)
+               for_each_engine(engine, dev_priv)
                        for (j = 0; j < num_rings; j++)
                                seq_printf(m, "0x%08x\n",
-                                          I915_READ(ring->semaphore.mbox.signal[j]));
+                                          I915_READ(engine->semaphore.mbox.signal[j]));
                seq_putc(m, '\n');
        }
 
        seq_puts(m, "\nSync seqno:\n");
-       for_each_ring(ring, dev_priv, i) {
-               for (j = 0; j < num_rings; j++) {
-                       seq_printf(m, "  0x%08x ", ring->semaphore.sync_seqno[j]);
-               }
+       for_each_engine(engine, dev_priv) {
+               for (j = 0; j < num_rings; j++)
+                       seq_printf(m, "  0x%08x ",
+                                  engine->semaphore.sync_seqno[j]);
                seq_putc(m, '\n');
        }
        seq_putc(m, '\n');
@@ -3193,8 +3243,8 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused)
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
 
                seq_printf(m, "DPLL%i: %s, id: %i\n", i, pll->name, pll->id);
-               seq_printf(m, " crtc_mask: 0x%08x, active: %d, on: %s\n",
-                          pll->config.crtc_mask, pll->active, yesno(pll->on));
+               seq_printf(m, " crtc_mask: 0x%08x, active: 0x%x, on: %s\n",
+                          pll->config.crtc_mask, pll->active_mask, yesno(pll->on));
                seq_printf(m, " tracked hardware state:\n");
                seq_printf(m, " dpll:    0x%08x\n", pll->config.hw_state.dpll);
                seq_printf(m, " dpll_md: 0x%08x\n",
@@ -3212,11 +3262,12 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
 {
        int i;
        int ret;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct drm_info_node *node = (struct drm_info_node *) m->private;
        struct drm_device *dev = node->minor->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct i915_workarounds *workarounds = &dev_priv->workarounds;
+       enum intel_engine_id id;
 
        ret = mutex_lock_interruptible(&dev->struct_mutex);
        if (ret)
@@ -3225,9 +3276,9 @@ static int i915_wa_registers(struct seq_file *m, void *unused)
        intel_runtime_pm_get(dev_priv);
 
        seq_printf(m, "Workarounds applied: %d\n", workarounds->count);
-       for_each_ring(ring, dev_priv, i)
+       for_each_engine_id(engine, dev_priv, id)
                seq_printf(m, "HW whitelist count for %s: %d\n",
-                          ring->name, workarounds->hw_whitelist_count[i]);
+                          engine->name, workarounds->hw_whitelist_count[id]);
        for (i = 0; i < workarounds->count; ++i) {
                i915_reg_t addr;
                u32 mask, value, read;
@@ -3417,7 +3468,8 @@ static int i915_dp_mst_info(struct seq_file *m, void *unused)
                intel_dig_port = enc_to_dig_port(encoder);
                if (!intel_dig_port->dp.can_mst)
                        continue;
-
+               seq_printf(m, "MST Source Port %c\n",
+                          port_name(intel_dig_port->port));
                drm_dp_mst_dump_topology(m, &intel_dig_port->dp.mst_mgr);
        }
        drm_modeset_unlock_all(dev);
@@ -4693,7 +4745,7 @@ i915_wedged_get(void *data, u64 *val)
        struct drm_device *dev = data;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       *val = atomic_read(&dev_priv->gpu_error.reset_counter);
+       *val = i915_terminally_wedged(&dev_priv->gpu_error);
 
        return 0;
 }
index 1c6d227aae7c8ace21a9d0f08fec8de5403bc83c..15615fb9bde6a8bc5b2320da5a0b4d5bf5186542 100644 (file)
 #include <linux/pm_runtime.h>
 #include <linux/oom.h>
 
+static unsigned int i915_load_fail_count;
+
+bool __i915_inject_load_failure(const char *func, int line)
+{
+       if (i915_load_fail_count >= i915.inject_load_failure)
+               return false;
+
+       if (++i915_load_fail_count == i915.inject_load_failure) {
+               DRM_INFO("Injecting failure at checkpoint %u [%s:%d]\n",
+                        i915.inject_load_failure, func, line);
+               return true;
+       }
+
+       return false;
+}
+
+#define FDO_BUG_URL "https://bugs.freedesktop.org/enter_bug.cgi?product=DRI"
+#define FDO_BUG_MSG "Please file a bug at " FDO_BUG_URL " against DRM/Intel " \
+                   "providing the dmesg log by booting with drm.debug=0xf"
+
+void
+__i915_printk(struct drm_i915_private *dev_priv, const char *level,
+             const char *fmt, ...)
+{
+       static bool shown_bug_once;
+       struct device *dev = dev_priv->dev->dev;
+       bool is_error = level[1] <= KERN_ERR[1];
+       bool is_debug = level[1] == KERN_DEBUG[1];
+       struct va_format vaf;
+       va_list args;
+
+       if (is_debug && !(drm_debug & DRM_UT_DRIVER))
+               return;
+
+       va_start(args, fmt);
+
+       vaf.fmt = fmt;
+       vaf.va = &args;
+
+       dev_printk(level, dev, "[" DRM_NAME ":%ps] %pV",
+                  __builtin_return_address(0), &vaf);
+
+       if (is_error && !shown_bug_once) {
+               dev_notice(dev, "%s", FDO_BUG_MSG);
+               shown_bug_once = true;
+       }
+
+       va_end(args);
+}
+
+static bool i915_error_injected(struct drm_i915_private *dev_priv)
+{
+       return i915.inject_load_failure &&
+              i915_load_fail_count == i915.inject_load_failure;
+}
+
+#define i915_load_error(dev_priv, fmt, ...)                                 \
+       __i915_printk(dev_priv,                                              \
+                     i915_error_injected(dev_priv) ? KERN_DEBUG : KERN_ERR, \
+                     fmt, ##__VA_ARGS__)
 
 static int i915_getparam(struct drm_device *dev, void *data,
                         struct drm_file *file_priv)
@@ -87,16 +147,16 @@ static int i915_getparam(struct drm_device *dev, void *data,
                value = 1;
                break;
        case I915_PARAM_HAS_BSD:
-               value = intel_ring_initialized(&dev_priv->ring[VCS]);
+               value = intel_engine_initialized(&dev_priv->engine[VCS]);
                break;
        case I915_PARAM_HAS_BLT:
-               value = intel_ring_initialized(&dev_priv->ring[BCS]);
+               value = intel_engine_initialized(&dev_priv->engine[BCS]);
                break;
        case I915_PARAM_HAS_VEBOX:
-               value = intel_ring_initialized(&dev_priv->ring[VECS]);
+               value = intel_engine_initialized(&dev_priv->engine[VECS]);
                break;
        case I915_PARAM_HAS_BSD2:
-               value = intel_ring_initialized(&dev_priv->ring[VCS2]);
+               value = intel_engine_initialized(&dev_priv->engine[VCS2]);
                break;
        case I915_PARAM_HAS_RELAXED_FENCING:
                value = 1;
@@ -197,13 +257,6 @@ static int i915_get_bridge_dev(struct drm_device *dev)
        return 0;
 }
 
-#define MCHBAR_I915 0x44
-#define MCHBAR_I965 0x48
-#define MCHBAR_SIZE (4*4096)
-
-#define DEVEN_REG 0x54
-#define   DEVEN_MCHBAR_EN (1 << 28)
-
 /* Allocate space for the MCH regs if needed, return nonzero on error */
 static int
 intel_alloc_mchbar_resource(struct drm_device *dev)
@@ -265,7 +318,7 @@ intel_setup_mchbar(struct drm_device *dev)
        dev_priv->mchbar_need_disable = false;
 
        if (IS_I915G(dev) || IS_I915GM(dev)) {
-               pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
+               pci_read_config_dword(dev_priv->bridge_dev, DEVEN, &temp);
                enabled = !!(temp & DEVEN_MCHBAR_EN);
        } else {
                pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
@@ -283,7 +336,7 @@ intel_setup_mchbar(struct drm_device *dev)
 
        /* Space is allocated or reserved, so enable it. */
        if (IS_I915G(dev) || IS_I915GM(dev)) {
-               pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG,
+               pci_write_config_dword(dev_priv->bridge_dev, DEVEN,
                                       temp | DEVEN_MCHBAR_EN);
        } else {
                pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
@@ -296,17 +349,24 @@ intel_teardown_mchbar(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915;
-       u32 temp;
 
        if (dev_priv->mchbar_need_disable) {
                if (IS_I915G(dev) || IS_I915GM(dev)) {
-                       pci_read_config_dword(dev_priv->bridge_dev, DEVEN_REG, &temp);
-                       temp &= ~DEVEN_MCHBAR_EN;
-                       pci_write_config_dword(dev_priv->bridge_dev, DEVEN_REG, temp);
+                       u32 deven_val;
+
+                       pci_read_config_dword(dev_priv->bridge_dev, DEVEN,
+                                             &deven_val);
+                       deven_val &= ~DEVEN_MCHBAR_EN;
+                       pci_write_config_dword(dev_priv->bridge_dev, DEVEN,
+                                              deven_val);
                } else {
-                       pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg, &temp);
-                       temp &= ~1;
-                       pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg, temp);
+                       u32 mchbar_val;
+
+                       pci_read_config_dword(dev_priv->bridge_dev, mchbar_reg,
+                                             &mchbar_val);
+                       mchbar_val &= ~1;
+                       pci_write_config_dword(dev_priv->bridge_dev, mchbar_reg,
+                                              mchbar_val);
                }
        }
 
@@ -370,6 +430,9 @@ static int i915_load_modeset_init(struct drm_device *dev)
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
+       if (i915_inject_load_failure())
+               return -ENODEV;
+
        ret = intel_bios_init(dev_priv);
        if (ret)
                DRM_INFO("failed to find VBIOS tables\n");
@@ -413,9 +476,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
 
        intel_modeset_gem_init(dev);
 
-       /* Always safe in the mode setting case. */
-       /* FIXME: do pre/post-mode set stuff in core KMS code */
-       dev->vblank_disable_allowed = true;
        if (INTEL_INFO(dev)->num_pipes == 0)
                return 0;
 
@@ -444,7 +504,7 @@ static int i915_load_modeset_init(struct drm_device *dev)
 
 cleanup_gem:
        mutex_lock(&dev->struct_mutex);
-       i915_gem_cleanup_ringbuffer(dev);
+       i915_gem_cleanup_engines(dev);
        i915_gem_context_fini(dev);
        mutex_unlock(&dev->struct_mutex);
 cleanup_irq:
@@ -453,6 +513,7 @@ cleanup_irq:
        intel_teardown_gmbus(dev);
 cleanup_csr:
        intel_csr_ucode_fini(dev_priv);
+       intel_power_domains_fini(dev_priv);
        vga_switcheroo_unregister_client(dev->pdev);
 cleanup_vga_client:
        vga_client_register(dev->pdev, NULL, NULL, NULL);
@@ -465,6 +526,7 @@ static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
 {
        struct apertures_struct *ap;
        struct pci_dev *pdev = dev_priv->dev->pdev;
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        bool primary;
        int ret;
 
@@ -472,8 +534,8 @@ static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
        if (!ap)
                return -ENOMEM;
 
-       ap->ranges[0].base = dev_priv->gtt.mappable_base;
-       ap->ranges[0].size = dev_priv->gtt.mappable_end;
+       ap->ranges[0].base = ggtt->mappable_base;
+       ap->ranges[0].size = ggtt->mappable_end;
 
        primary =
                pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
@@ -853,6 +915,10 @@ static void intel_device_info_runtime_init(struct drm_device *dev)
        else if (INTEL_INFO(dev)->gen >= 9)
                gen9_sseu_info_init(dev);
 
+       /* Snooping is broken on BXT A stepping. */
+       info->has_snoop = !info->has_llc;
+       info->has_snoop &= !IS_BXT_REVID(dev, 0, BXT_REVID_A1);
+
        DRM_DEBUG_DRIVER("slice total: %u\n", info->slice_total);
        DRM_DEBUG_DRIVER("subslice total: %u\n", info->subslice_total);
        DRM_DEBUG_DRIVER("subslice per slice: %u\n", info->subslice_per_slice);
@@ -929,6 +995,84 @@ static void i915_workqueues_cleanup(struct drm_i915_private *dev_priv)
        destroy_workqueue(dev_priv->wq);
 }
 
+/**
+ * i915_driver_init_early - setup state not requiring device access
+ * @dev_priv: device private
+ *
+ * Initialize everything that is a "SW-only" state, that is state not
+ * requiring accessing the device or exposing the driver via kernel internal
+ * or userspace interfaces. Example steps belonging here: lock initialization,
+ * system memory allocation, setting up device specific attributes and
+ * function hooks not requiring accessing the device.
+ */
+static int i915_driver_init_early(struct drm_i915_private *dev_priv,
+                                 struct drm_device *dev,
+                                 struct intel_device_info *info)
+{
+       struct intel_device_info *device_info;
+       int ret = 0;
+
+       if (i915_inject_load_failure())
+               return -ENODEV;
+
+       /* Setup the write-once "constant" device info */
+       device_info = (struct intel_device_info *)&dev_priv->info;
+       memcpy(device_info, info, sizeof(dev_priv->info));
+       device_info->device_id = dev->pdev->device;
+
+       spin_lock_init(&dev_priv->irq_lock);
+       spin_lock_init(&dev_priv->gpu_error.lock);
+       mutex_init(&dev_priv->backlight_lock);
+       spin_lock_init(&dev_priv->uncore.lock);
+       spin_lock_init(&dev_priv->mm.object_stat_lock);
+       spin_lock_init(&dev_priv->mmio_flip_lock);
+       mutex_init(&dev_priv->sb_lock);
+       mutex_init(&dev_priv->modeset_restore_lock);
+       mutex_init(&dev_priv->av_mutex);
+       mutex_init(&dev_priv->wm.wm_mutex);
+       mutex_init(&dev_priv->pps_mutex);
+
+       ret = i915_workqueues_init(dev_priv);
+       if (ret < 0)
+               return ret;
+
+       /* This must be called before any calls to HAS_PCH_* */
+       intel_detect_pch(dev);
+
+       intel_pm_setup(dev);
+       intel_init_dpio(dev_priv);
+       intel_power_domains_init(dev_priv);
+       intel_irq_init(dev_priv);
+       intel_init_display_hooks(dev_priv);
+       intel_init_clock_gating_hooks(dev_priv);
+       intel_init_audio_hooks(dev_priv);
+       i915_gem_load_init(dev);
+
+       intel_display_crc_init(dev);
+
+       i915_dump_device_info(dev_priv);
+
+       /* Not all pre-production machines fall into this category, only the
+        * very first ones. Almost everything should work, except for maybe
+        * suspend/resume. And we don't implement workarounds that affect only
+        * pre-production machines. */
+       if (IS_HSW_EARLY_SDV(dev))
+               DRM_INFO("This is an early pre-production Haswell machine. "
+                        "It may not be fully functional.\n");
+
+       return 0;
+}
+
+/**
+ * i915_driver_cleanup_early - cleanup the setup done in i915_driver_init_early()
+ * @dev_priv: device private
+ */
+static void i915_driver_cleanup_early(struct drm_i915_private *dev_priv)
+{
+       i915_gem_load_cleanup(dev_priv->dev);
+       i915_workqueues_cleanup(dev_priv);
+}
+
 static int i915_mmio_setup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
@@ -970,97 +1114,87 @@ static void i915_mmio_cleanup(struct drm_device *dev)
 }
 
 /**
- * i915_driver_load - setup chip and create an initial config
- * @dev: DRM device
- * @flags: startup flags
+ * i915_driver_init_mmio - setup device MMIO
+ * @dev_priv: device private
  *
- * The driver load routine has to do several things:
- *   - drive output discovery via intel_modeset_init()
- *   - initialize the memory manager
- *   - allocate initial config memory
- *   - setup the DRM framebuffer with the allocated memory
+ * Setup minimal device state necessary for MMIO accesses later in the
+ * initialization sequence. The setup here should avoid any other device-wide
+ * side effects or exposing the driver via kernel internal or user space
+ * interfaces.
  */
-int i915_driver_load(struct drm_device *dev, unsigned long flags)
+static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv;
-       struct intel_device_info *info, *device_info;
-       int ret = 0;
-       uint32_t aperture_size;
-
-       info = (struct intel_device_info *) flags;
-
-       dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       dev->dev_private = dev_priv;
-       dev_priv->dev = dev;
+       struct drm_device *dev = dev_priv->dev;
+       int ret;
 
-       /* Setup the write-once "constant" device info */
-       device_info = (struct intel_device_info *)&dev_priv->info;
-       memcpy(device_info, info, sizeof(dev_priv->info));
-       device_info->device_id = dev->pdev->device;
+       if (i915_inject_load_failure())
+               return -ENODEV;
 
-       spin_lock_init(&dev_priv->irq_lock);
-       spin_lock_init(&dev_priv->gpu_error.lock);
-       mutex_init(&dev_priv->backlight_lock);
-       spin_lock_init(&dev_priv->uncore.lock);
-       spin_lock_init(&dev_priv->mm.object_stat_lock);
-       spin_lock_init(&dev_priv->mmio_flip_lock);
-       mutex_init(&dev_priv->sb_lock);
-       mutex_init(&dev_priv->modeset_restore_lock);
-       mutex_init(&dev_priv->av_mutex);
+       if (i915_get_bridge_dev(dev))
+               return -EIO;
 
-       ret = i915_workqueues_init(dev_priv);
+       ret = i915_mmio_setup(dev);
        if (ret < 0)
-               goto out_free_priv;
+               goto put_bridge;
 
-       intel_pm_setup(dev);
+       intel_uncore_init(dev);
 
-       intel_runtime_pm_get(dev_priv);
+       return 0;
 
-       intel_display_crc_init(dev);
+put_bridge:
+       pci_dev_put(dev_priv->bridge_dev);
 
-       i915_dump_device_info(dev_priv);
+       return ret;
+}
 
-       /* Not all pre-production machines fall into this category, only the
-        * very first ones. Almost everything should work, except for maybe
-        * suspend/resume. And we don't implement workarounds that affect only
       * pre-production machines. */
-       if (IS_HSW_EARLY_SDV(dev))
-               DRM_INFO("This is an early pre-production Haswell machine. "
-                        "It may not be fully functional.\n");
+/**
+ * i915_driver_cleanup_mmio - cleanup the setup done in i915_driver_init_mmio()
+ * @dev_priv: device private
+ */
+static void i915_driver_cleanup_mmio(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
 
-       if (i915_get_bridge_dev(dev)) {
-               ret = -EIO;
-               goto out_runtime_pm_put;
-       }
+       intel_uncore_fini(dev);
+       i915_mmio_cleanup(dev);
+       pci_dev_put(dev_priv->bridge_dev);
+}
 
-       ret = i915_mmio_setup(dev);
-       if (ret < 0)
-               goto put_bridge;
+/**
+ * i915_driver_init_hw - setup state requiring device access
+ * @dev_priv: device private
+ *
+ * Setup state that requires accessing the device, but doesn't require
+ * exposing the driver via kernel internal or userspace interfaces.
+ */
+static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+       uint32_t aperture_size;
+       int ret;
 
-       /* This must be called before any calls to HAS_PCH_* */
-       intel_detect_pch(dev);
+       if (i915_inject_load_failure())
+               return -ENODEV;
 
-       intel_uncore_init(dev);
+       intel_device_info_runtime_init(dev);
 
-       ret = i915_gem_gtt_init(dev);
+       ret = i915_ggtt_init_hw(dev);
        if (ret)
-               goto out_uncore_fini;
+               return ret;
 
        /* WARNING: Apparently we must kick fbdev drivers before vgacon,
         * otherwise the vga fbdev driver falls over. */
        ret = i915_kick_out_firmware_fb(dev_priv);
        if (ret) {
                DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
-               goto out_gtt;
+               goto out_ggtt;
        }
 
        ret = i915_kick_out_vgacon(dev_priv);
        if (ret) {
                DRM_ERROR("failed to remove conflicting VGA console\n");
-               goto out_gtt;
+               goto out_ggtt;
        }
 
        pci_set_master(dev->pdev);
@@ -1080,26 +1214,27 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
        if (IS_BROADWATER(dev) || IS_CRESTLINE(dev))
                dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(32));
 
-       aperture_size = dev_priv->gtt.mappable_end;
+       aperture_size = ggtt->mappable_end;
 
-       dev_priv->gtt.mappable =
-               io_mapping_create_wc(dev_priv->gtt.mappable_base,
+       ggtt->mappable =
+               io_mapping_create_wc(ggtt->mappable_base,
                                     aperture_size);
-       if (dev_priv->gtt.mappable == NULL) {
+       if (!ggtt->mappable) {
                ret = -EIO;
-               goto out_gtt;
+               goto out_ggtt;
        }
 
-       dev_priv->gtt.mtrr = arch_phys_wc_add(dev_priv->gtt.mappable_base,
+       ggtt->mtrr = arch_phys_wc_add(ggtt->mappable_base,
                                              aperture_size);
 
-       intel_irq_init(dev_priv);
+       pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY,
+                          PM_QOS_DEFAULT_VALUE);
+
        intel_uncore_sanitize(dev);
 
        intel_opregion_setup(dev);
 
-       i915_gem_load_init(dev);
-       i915_gem_shrinker_init(dev_priv);
+       i915_gem_load_init_fences(dev_priv);
 
        /* On the 945G/GM, the chipset reports the MSI capability on the
         * integrated graphics even though the support isn't actually there
@@ -1117,24 +1252,44 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
                        DRM_DEBUG_DRIVER("can't enable MSI");
        }
 
-       intel_device_info_runtime_init(dev);
+       return 0;
 
-       intel_init_dpio(dev_priv);
+out_ggtt:
+       i915_ggtt_cleanup_hw(dev);
 
-       if (INTEL_INFO(dev)->num_pipes) {
-               ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes);
-               if (ret)
-                       goto out_gem_unload;
-       }
+       return ret;
+}
 
-       intel_power_domains_init(dev_priv);
+/**
+ * i915_driver_cleanup_hw - cleanup the setup done in i915_driver_init_hw()
+ * @dev_priv: device private
+ */
+static void i915_driver_cleanup_hw(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
 
-       ret = i915_load_modeset_init(dev);
-       if (ret < 0) {
-               DRM_ERROR("failed to init modeset\n");
-               goto out_power_well;
-       }
+       if (dev->pdev->msi_enabled)
+               pci_disable_msi(dev->pdev);
+
+       pm_qos_remove_request(&dev_priv->pm_qos);
+       arch_phys_wc_del(ggtt->mtrr);
+       io_mapping_free(ggtt->mappable);
+       i915_ggtt_cleanup_hw(dev);
+}
 
+/**
+ * i915_driver_register - register the driver with the rest of the system
+ * @dev_priv: device private
+ *
+ * Perform any steps necessary to make the driver available via kernel
+ * internal or userspace interfaces.
+ */
+static void i915_driver_register(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+
+       i915_gem_shrinker_init(dev_priv);
        /*
         * Notify a valid surface after modesetting,
         * when running inside a VM.
@@ -1144,48 +1299,107 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
 
        i915_setup_sysfs(dev);
 
-       if (INTEL_INFO(dev)->num_pipes) {
+       if (INTEL_INFO(dev_priv)->num_pipes) {
                /* Must be done after probing outputs */
                intel_opregion_init(dev);
                acpi_video_register();
        }
 
-       if (IS_GEN5(dev))
+       if (IS_GEN5(dev_priv))
                intel_gpu_ips_init(dev_priv);
 
-       intel_runtime_pm_enable(dev_priv);
-
        i915_audio_component_init(dev_priv);
+}
+
+/**
+ * i915_driver_unregister - cleanup the registration done in i915_driver_regiser()
+ * @dev_priv: device private
+ */
+static void i915_driver_unregister(struct drm_i915_private *dev_priv)
+{
+       i915_audio_component_cleanup(dev_priv);
+       intel_gpu_ips_teardown();
+       acpi_video_unregister();
+       intel_opregion_fini(dev_priv->dev);
+       i915_teardown_sysfs(dev_priv->dev);
+       i915_gem_shrinker_cleanup(dev_priv);
+}
+
+/**
+ * i915_driver_load - setup chip and create an initial config
+ * @dev: DRM device
+ * @flags: startup flags
+ *
+ * The driver load routine has to do several things:
+ *   - drive output discovery via intel_modeset_init()
+ *   - initialize the memory manager
+ *   - allocate initial config memory
+ *   - setup the DRM framebuffer with the allocated memory
+ */
+int i915_driver_load(struct drm_device *dev, unsigned long flags)
+{
+       struct drm_i915_private *dev_priv;
+       int ret = 0;
+
+       dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
+       if (dev_priv == NULL)
+               return -ENOMEM;
+
+       dev->dev_private = dev_priv;
+       /* Must be set before calling __i915_printk */
+       dev_priv->dev = dev;
+
+       ret = i915_driver_init_early(dev_priv, dev,
+                                    (struct intel_device_info *)flags);
+
+       if (ret < 0)
+               goto out_free_priv;
+
+       intel_runtime_pm_get(dev_priv);
+
+       ret = i915_driver_init_mmio(dev_priv);
+       if (ret < 0)
+               goto out_runtime_pm_put;
+
+       ret = i915_driver_init_hw(dev_priv);
+       if (ret < 0)
+               goto out_cleanup_mmio;
+
+       /*
+        * TODO: move the vblank init and parts of modeset init steps into one
+        * of the i915_driver_init_/i915_driver_register functions according
+        * to the role/effect of the given init step.
+        */
+       if (INTEL_INFO(dev)->num_pipes) {
+               ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes);
+               if (ret)
+                       goto out_cleanup_hw;
+       }
+
+       ret = i915_load_modeset_init(dev);
+       if (ret < 0)
+               goto out_cleanup_vblank;
+
+       i915_driver_register(dev_priv);
+
+       intel_runtime_pm_enable(dev_priv);
 
        intel_runtime_pm_put(dev_priv);
 
        return 0;
 
-out_power_well:
-       intel_power_domains_fini(dev_priv);
+out_cleanup_vblank:
        drm_vblank_cleanup(dev);
-out_gem_unload:
-       i915_gem_shrinker_cleanup(dev_priv);
-
-       if (dev->pdev->msi_enabled)
-               pci_disable_msi(dev->pdev);
-
-       intel_teardown_mchbar(dev);
-       pm_qos_remove_request(&dev_priv->pm_qos);
-       arch_phys_wc_del(dev_priv->gtt.mtrr);
-       io_mapping_free(dev_priv->gtt.mappable);
-out_gtt:
-       i915_global_gtt_cleanup(dev);
-out_uncore_fini:
-       intel_uncore_fini(dev);
-       i915_mmio_cleanup(dev);
-put_bridge:
-       pci_dev_put(dev_priv->bridge_dev);
-       i915_gem_load_cleanup(dev);
+out_cleanup_hw:
+       i915_driver_cleanup_hw(dev_priv);
+out_cleanup_mmio:
+       i915_driver_cleanup_mmio(dev_priv);
 out_runtime_pm_put:
        intel_runtime_pm_put(dev_priv);
-       i915_workqueues_cleanup(dev_priv);
+       i915_driver_cleanup_early(dev_priv);
 out_free_priv:
+       i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
+
        kfree(dev_priv);
 
        return ret;
@@ -1198,26 +1412,15 @@ int i915_driver_unload(struct drm_device *dev)
 
        intel_fbdev_fini(dev);
 
-       i915_audio_component_cleanup(dev_priv);
-
        ret = i915_gem_suspend(dev);
        if (ret) {
                DRM_ERROR("failed to idle hardware: %d\n", ret);
                return ret;
        }
 
-       intel_power_domains_fini(dev_priv);
-
-       intel_gpu_ips_teardown();
+       intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
 
-       i915_teardown_sysfs(dev);
-
-       i915_gem_shrinker_cleanup(dev_priv);
-
-       io_mapping_free(dev_priv->gtt.mappable);
-       arch_phys_wc_del(dev_priv->gtt.mtrr);
-
-       acpi_video_unregister();
+       i915_driver_unregister(dev_priv);
 
        drm_vblank_cleanup(dev);
 
@@ -1246,31 +1449,24 @@ int i915_driver_unload(struct drm_device *dev)
        cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
        i915_destroy_error_state(dev);
 
-       if (dev->pdev->msi_enabled)
-               pci_disable_msi(dev->pdev);
-
-       intel_opregion_fini(dev);
-
        /* Flush any outstanding unpin_work. */
        flush_workqueue(dev_priv->wq);
 
        intel_guc_ucode_fini(dev);
        mutex_lock(&dev->struct_mutex);
-       i915_gem_cleanup_ringbuffer(dev);
+       i915_gem_cleanup_engines(dev);
        i915_gem_context_fini(dev);
        mutex_unlock(&dev->struct_mutex);
        intel_fbc_cleanup_cfb(dev_priv);
 
-       pm_qos_remove_request(&dev_priv->pm_qos);
+       intel_power_domains_fini(dev_priv);
 
-       i915_global_gtt_cleanup(dev);
+       i915_driver_cleanup_hw(dev_priv);
+       i915_driver_cleanup_mmio(dev_priv);
 
-       intel_uncore_fini(dev);
-       i915_mmio_cleanup(dev);
+       intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
 
-       i915_gem_load_cleanup(dev);
-       pci_dev_put(dev_priv->bridge_dev);
-       i915_workqueues_cleanup(dev_priv);
+       i915_driver_cleanup_early(dev_priv);
        kfree(dev_priv);
 
        return 0;
index 6d2fb3f4ac628fddaaa5f6da8f724c3787330c5b..d37c0a671eed71e28dd8378f33a68c68c9400c95 100644 (file)
@@ -66,6 +66,11 @@ static struct drm_driver driver;
 #define IVB_CURSOR_OFFSETS \
        .cursor_offsets = { CURSOR_A_OFFSET, IVB_CURSOR_B_OFFSET, IVB_CURSOR_C_OFFSET }
 
+#define BDW_COLORS \
+       .color = { .degamma_lut_size = 512, .gamma_lut_size = 512 }
+#define CHV_COLORS \
+       .color = { .degamma_lut_size = 65, .gamma_lut_size = 257 }
+
 static const struct intel_device_info intel_i830_info = {
        .gen = 2, .is_mobile = 1, .cursor_needs_physical = 1, .num_pipes = 2,
        .has_overlay = 1, .overlay_needs_physical = 1,
@@ -288,24 +293,28 @@ static const struct intel_device_info intel_haswell_m_info = {
        .is_mobile = 1,
 };
 
+#define BDW_FEATURES \
+       HSW_FEATURES, \
+       BDW_COLORS
+
 static const struct intel_device_info intel_broadwell_d_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .gen = 8,
 };
 
 static const struct intel_device_info intel_broadwell_m_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .gen = 8, .is_mobile = 1,
 };
 
 static const struct intel_device_info intel_broadwell_gt3d_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .gen = 8,
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
 };
 
 static const struct intel_device_info intel_broadwell_gt3m_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .gen = 8, .is_mobile = 1,
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
 };
@@ -318,16 +327,17 @@ static const struct intel_device_info intel_cherryview_info = {
        .display_mmio_offset = VLV_DISPLAY_BASE,
        GEN_CHV_PIPEOFFSETS,
        CURSOR_OFFSETS,
+       CHV_COLORS,
 };
 
 static const struct intel_device_info intel_skylake_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .is_skylake = 1,
        .gen = 9,
 };
 
 static const struct intel_device_info intel_skylake_gt3_info = {
-       HSW_FEATURES,
+       BDW_FEATURES,
        .is_skylake = 1,
        .gen = 9,
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
@@ -345,18 +355,17 @@ static const struct intel_device_info intel_broxton_info = {
        .has_fbc = 1,
        GEN_DEFAULT_PIPEOFFSETS,
        IVB_CURSOR_OFFSETS,
+       BDW_COLORS,
 };
 
 static const struct intel_device_info intel_kabylake_info = {
-       HSW_FEATURES,
-       .is_preliminary = 1,
+       BDW_FEATURES,
        .is_kabylake = 1,
        .gen = 9,
 };
 
 static const struct intel_device_info intel_kabylake_gt3_info = {
-       HSW_FEATURES,
-       .is_preliminary = 1,
+       BDW_FEATURES,
        .is_kabylake = 1,
        .gen = 9,
        .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING,
@@ -504,6 +513,7 @@ void intel_detect_pch(struct drm_device *dev)
                                WARN_ON(!IS_SKYLAKE(dev) &&
                                        !IS_KABYLAKE(dev));
                        } else if ((id == INTEL_PCH_P2X_DEVICE_ID_TYPE) ||
+                                  (id == INTEL_PCH_P3X_DEVICE_ID_TYPE) ||
                                   ((id == INTEL_PCH_QEMU_DEVICE_ID_TYPE) &&
                                    pch->subsystem_vendor == 0x1af4 &&
                                    pch->subsystem_device == 0x1100)) {
@@ -557,10 +567,9 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv)
        drm_modeset_unlock_all(dev);
 }
 
-static int intel_suspend_complete(struct drm_i915_private *dev_priv);
 static int vlv_resume_prepare(struct drm_i915_private *dev_priv,
                              bool rpm_resume);
-static int bxt_resume_prepare(struct drm_i915_private *dev_priv);
+static int vlv_suspend_complete(struct drm_i915_private *dev_priv);
 
 static bool suspend_to_idle(struct drm_i915_private *dev_priv)
 {
@@ -630,8 +639,7 @@ static int i915_drm_suspend(struct drm_device *dev)
 
        intel_display_set_init_power(dev_priv, false);
 
-       if (HAS_CSR(dev_priv))
-               flush_work(&dev_priv->csr.work);
+       intel_csr_ucode_suspend(dev_priv);
 
 out:
        enable_rpm_wakeref_asserts(dev_priv);
@@ -647,7 +655,8 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)
 
        disable_rpm_wakeref_asserts(dev_priv);
 
-       fw_csr = suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
+       fw_csr = !IS_BROXTON(dev_priv) &&
+               suspend_to_idle(dev_priv) && dev_priv->csr.dmc_payload;
        /*
         * In case of firmware assisted context save/restore don't manually
         * deinit the power domains. This also means the CSR/DMC firmware will
@@ -658,7 +667,13 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)
        if (!fw_csr)
                intel_power_domains_suspend(dev_priv);
 
-       ret = intel_suspend_complete(dev_priv);
+       ret = 0;
+       if (IS_BROXTON(dev_priv))
+               bxt_enable_dc9(dev_priv);
+       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
+               hsw_enable_pc8(dev_priv);
+       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+               ret = vlv_suspend_complete(dev_priv);
 
        if (ret) {
                DRM_ERROR("Suspend complete failed: %d\n", ret);
@@ -722,6 +737,8 @@ static int i915_drm_resume(struct drm_device *dev)
 
        disable_rpm_wakeref_asserts(dev_priv);
 
+       intel_csr_ucode_resume(dev_priv);
+
        mutex_lock(&dev->struct_mutex);
        i915_gem_restore_gtt_mappings(dev);
        mutex_unlock(&dev->struct_mutex);
@@ -850,21 +867,25 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
        intel_uncore_early_sanitize(dev, true);
 
-       if (IS_BROXTON(dev))
-               ret = bxt_resume_prepare(dev_priv);
-       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
+       if (IS_BROXTON(dev)) {
+               if (!dev_priv->suspended_to_idle)
+                       gen9_sanitize_dc_state(dev_priv);
+               bxt_disable_dc9(dev_priv);
+       } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
                hsw_disable_pc8(dev_priv);
+       }
 
        intel_uncore_sanitize(dev);
 
-       if (!(dev_priv->suspended_to_idle && dev_priv->csr.dmc_payload))
+       if (IS_BROXTON(dev_priv) ||
+           !(dev_priv->suspended_to_idle && dev_priv->csr.dmc_payload))
                intel_power_domains_init_hw(dev_priv, true);
 
+       enable_rpm_wakeref_asserts(dev_priv);
+
 out:
        dev_priv->suspended_to_idle = false;
 
-       enable_rpm_wakeref_asserts(dev_priv);
-
        return ret;
 }
 
@@ -900,23 +921,32 @@ int i915_resume_switcheroo(struct drm_device *dev)
 int i915_reset(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       bool simulated;
+       struct i915_gpu_error *error = &dev_priv->gpu_error;
+       unsigned reset_counter;
        int ret;
 
        intel_reset_gt_powersave(dev);
 
        mutex_lock(&dev->struct_mutex);
 
-       i915_gem_reset(dev);
+       /* Clear any previous failed attempts at recovery. Time to try again. */
+       atomic_andnot(I915_WEDGED, &error->reset_counter);
+
+       /* Clear the reset-in-progress flag and increment the reset epoch. */
+       reset_counter = atomic_inc_return(&error->reset_counter);
+       if (WARN_ON(__i915_reset_in_progress(reset_counter))) {
+               ret = -EIO;
+               goto error;
+       }
 
-       simulated = dev_priv->gpu_error.stop_rings != 0;
+       i915_gem_reset(dev);
 
-       ret = intel_gpu_reset(dev);
+       ret = intel_gpu_reset(dev, ALL_ENGINES);
 
        /* Also reset the gpu hangman. */
-       if (simulated) {
+       if (error->stop_rings != 0) {
                DRM_INFO("Simulated gpu hang, resetting stop_rings\n");
-               dev_priv->gpu_error.stop_rings = 0;
+               error->stop_rings = 0;
                if (ret == -ENODEV) {
                        DRM_INFO("Reset not implemented, but ignoring "
                                 "error for simulated gpu hangs\n");
@@ -928,9 +958,11 @@ int i915_reset(struct drm_device *dev)
                pr_notice("drm/i915: Resetting chip after gpu hang\n");
 
        if (ret) {
-               DRM_ERROR("Failed to reset chip: %i\n", ret);
-               mutex_unlock(&dev->struct_mutex);
-               return ret;
+               if (ret != -ENODEV)
+                       DRM_ERROR("Failed to reset chip: %i\n", ret);
+               else
+                       DRM_DEBUG_DRIVER("GPU reset disabled\n");
+               goto error;
        }
 
        intel_overlay_reset(dev_priv);
@@ -949,20 +981,14 @@ int i915_reset(struct drm_device *dev)
         * was running at the time of the reset (i.e. we weren't VT
         * switched away).
         */
-
-       /* Used to prevent gem_check_wedged returning -EAGAIN during gpu reset */
-       dev_priv->gpu_error.reload_in_reset = true;
-
        ret = i915_gem_init_hw(dev);
-
-       dev_priv->gpu_error.reload_in_reset = false;
-
-       mutex_unlock(&dev->struct_mutex);
        if (ret) {
                DRM_ERROR("Failed hw init on reset %d\n", ret);
-               return ret;
+               goto error;
        }
 
+       mutex_unlock(&dev->struct_mutex);
+
        /*
         * rps/rc6 re-init is necessary to restore state lost after the
         * reset and the re-install of gt irqs. Skip for ironlake per
@@ -973,6 +999,11 @@ int i915_reset(struct drm_device *dev)
                intel_enable_gt_powersave(dev);
 
        return 0;
+
+error:
+       atomic_or(I915_WEDGED, &error->reset_counter);
+       mutex_unlock(&dev->struct_mutex);
+       return ret;
 }
 
 static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -1079,44 +1110,6 @@ static int i915_pm_resume(struct device *dev)
        return i915_drm_resume(drm_dev);
 }
 
-static int hsw_suspend_complete(struct drm_i915_private *dev_priv)
-{
-       hsw_enable_pc8(dev_priv);
-
-       return 0;
-}
-
-static int bxt_suspend_complete(struct drm_i915_private *dev_priv)
-{
-       struct drm_device *dev = dev_priv->dev;
-
-       /* TODO: when DC5 support is added disable DC5 here. */
-
-       broxton_ddi_phy_uninit(dev);
-       broxton_uninit_cdclk(dev);
-       bxt_enable_dc9(dev_priv);
-
-       return 0;
-}
-
-static int bxt_resume_prepare(struct drm_i915_private *dev_priv)
-{
-       struct drm_device *dev = dev_priv->dev;
-
-       /* TODO: when CSR FW support is added make sure the FW is loaded */
-
-       bxt_disable_dc9(dev_priv);
-
-       /*
-        * TODO: when DC5 support is added enable DC5 here if the CSR FW
-        * is available.
-        */
-       broxton_init_cdclk(dev);
-       broxton_ddi_phy_init(dev);
-
-       return 0;
-}
-
 /*
  * Save all Gunit registers that may be lost after a D3 and a subsequent
  * S0i[R123] transition. The list of registers needing a save/restore is
@@ -1420,7 +1413,7 @@ static int vlv_suspend_complete(struct drm_i915_private *dev_priv)
        if (err)
                goto err2;
 
-       if (!IS_CHERRYVIEW(dev_priv->dev))
+       if (!IS_CHERRYVIEW(dev_priv))
                vlv_save_gunit_s0ix_state(dev_priv);
 
        err = vlv_force_gfx_clock(dev_priv, false);
@@ -1452,7 +1445,7 @@ static int vlv_resume_prepare(struct drm_i915_private *dev_priv,
         */
        ret = vlv_force_gfx_clock(dev_priv, true);
 
-       if (!IS_CHERRYVIEW(dev_priv->dev))
+       if (!IS_CHERRYVIEW(dev_priv))
                vlv_restore_gunit_s0ix_state(dev_priv);
 
        err = vlv_allow_gt_wake(dev_priv, true);
@@ -1522,7 +1515,16 @@ static int intel_runtime_suspend(struct device *device)
        intel_suspend_gt_powersave(dev);
        intel_runtime_pm_disable_interrupts(dev_priv);
 
-       ret = intel_suspend_complete(dev_priv);
+       ret = 0;
+       if (IS_BROXTON(dev_priv)) {
+               bxt_display_core_uninit(dev_priv);
+               bxt_enable_dc9(dev_priv);
+       } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
+               hsw_enable_pc8(dev_priv);
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
+               ret = vlv_suspend_complete(dev_priv);
+       }
+
        if (ret) {
                DRM_ERROR("Runtime suspend failed, disabling it (%d)\n", ret);
                intel_runtime_pm_enable_interrupts(dev_priv);
@@ -1596,12 +1598,17 @@ static int intel_runtime_resume(struct device *device)
        if (IS_GEN6(dev_priv))
                intel_init_pch_refclk(dev);
 
-       if (IS_BROXTON(dev))
-               ret = bxt_resume_prepare(dev_priv);
-       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
+       if (IS_BROXTON(dev)) {
+               bxt_disable_dc9(dev_priv);
+               bxt_display_core_init(dev_priv, true);
+               if (dev_priv->csr.dmc_payload &&
+                   (dev_priv->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC5))
+                       gen9_enable_dc5(dev_priv);
+       } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
                hsw_disable_pc8(dev_priv);
-       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                ret = vlv_resume_prepare(dev_priv, true);
+       }
 
        /*
         * No point of rolling back things in case of an error, as the best
@@ -1632,26 +1639,6 @@ static int intel_runtime_resume(struct device *device)
        return ret;
 }
 
-/*
- * This function implements common functionality of runtime and system
- * suspend sequence.
- */
-static int intel_suspend_complete(struct drm_i915_private *dev_priv)
-{
-       int ret;
-
-       if (IS_BROXTON(dev_priv))
-               ret = bxt_suspend_complete(dev_priv);
-       else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
-               ret = hsw_suspend_complete(dev_priv);
-       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
-               ret = vlv_suspend_complete(dev_priv);
-       else
-               ret = 0;
-
-       return ret;
-}
-
 static const struct dev_pm_ops i915_pm_ops = {
        /*
         * S0ix (via system suspend) and S3 event handlers [PMSG_SUSPEND,
@@ -1772,10 +1759,8 @@ static int __init i915_init(void)
        if (i915.modeset == 0)
                driver.driver_features &= ~DRIVER_MODESET;
 
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && i915.modeset == -1)
                driver.driver_features &= ~DRIVER_MODESET;
-#endif
 
        if (!(driver.driver_features & DRIVER_MODESET)) {
                /* Silently fail loading to not upset userspace. */
index 5d7a7c4f51362575fe94abeccf0f4808bae5b511..b87ca4fae20a47d30ef20ff97008ef8222c4f28d 100644 (file)
 #include <uapi/drm/i915_drm.h>
 #include <uapi/drm/drm_fourcc.h>
 
-#include <drm/drmP.h>
-#include "i915_params.h"
-#include "i915_reg.h"
-#include "intel_bios.h"
-#include "intel_ringbuffer.h"
-#include "intel_lrc.h"
-#include "i915_gem_gtt.h"
-#include "i915_gem_render_state.h"
 #include <linux/io-mapping.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
-#include <drm/intel-gtt.h>
-#include <drm/drm_legacy.h> /* for struct drm_dma_handle */
-#include <drm/drm_gem.h>
 #include <linux/backlight.h>
 #include <linux/hashtable.h>
 #include <linux/intel-iommu.h>
 #include <linux/kref.h>
 #include <linux/pm_qos.h>
+#include <linux/shmem_fs.h>
+
+#include <drm/drmP.h>
+#include <drm/intel-gtt.h>
+#include <drm/drm_legacy.h> /* for struct drm_dma_handle */
+#include <drm/drm_gem.h>
+
+#include "i915_params.h"
+#include "i915_reg.h"
+
+#include "intel_bios.h"
+#include "intel_dpll_mgr.h"
 #include "intel_guc.h"
+#include "intel_lrc.h"
+#include "intel_ringbuffer.h"
+
+#include "i915_gem.h"
+#include "i915_gem_gtt.h"
+#include "i915_gem_render_state.h"
 
 /* General customization:
  */
 
 #define DRIVER_NAME            "i915"
 #define DRIVER_DESC            "Intel Graphics"
-#define DRIVER_DATE            "20160229"
+#define DRIVER_DATE            "20160425"
 
 #undef WARN_ON
 /* Many gcc seem to no see through this and fall over :( */
 #define I915_STATE_WARN_ON(x)                                          \
        I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")")
 
+bool __i915_inject_load_failure(const char *func, int line);
+#define i915_inject_load_failure() \
+       __i915_inject_load_failure(__func__, __LINE__)
+
 static inline const char *yesno(bool v)
 {
        return v ? "yes" : "no";
@@ -122,9 +133,35 @@ enum transcoder {
        TRANSCODER_B,
        TRANSCODER_C,
        TRANSCODER_EDP,
+       TRANSCODER_DSI_A,
+       TRANSCODER_DSI_C,
        I915_MAX_TRANSCODERS
 };
-#define transcoder_name(t) ((t) + 'A')
+
+static inline const char *transcoder_name(enum transcoder transcoder)
+{
+       switch (transcoder) {
+       case TRANSCODER_A:
+               return "A";
+       case TRANSCODER_B:
+               return "B";
+       case TRANSCODER_C:
+               return "C";
+       case TRANSCODER_EDP:
+               return "EDP";
+       case TRANSCODER_DSI_A:
+               return "DSI A";
+       case TRANSCODER_DSI_C:
+               return "DSI C";
+       default:
+               return "<invalid>";
+       }
+}
+
+static inline bool transcoder_is_dsi(enum transcoder transcoder)
+{
+       return transcoder == TRANSCODER_DSI_A || transcoder == TRANSCODER_DSI_C;
+}
 
 /*
  * I915_MAX_PLANES in the enum below is the maximum (across all platforms)
@@ -176,6 +213,8 @@ enum intel_display_power_domain {
        POWER_DOMAIN_TRANSCODER_B,
        POWER_DOMAIN_TRANSCODER_C,
        POWER_DOMAIN_TRANSCODER_EDP,
+       POWER_DOMAIN_TRANSCODER_DSI_A,
+       POWER_DOMAIN_TRANSCODER_DSI_C,
        POWER_DOMAIN_PORT_DDI_A_LANES,
        POWER_DOMAIN_PORT_DDI_B_LANES,
        POWER_DOMAIN_PORT_DDI_C_LANES,
@@ -273,6 +312,10 @@ struct i915_hotplug {
             (__s) < INTEL_INFO(__dev_priv)->num_sprites[(__p)];        \
             (__s)++)
 
+#define for_each_port_masked(__port, __ports_mask) \
+       for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++)  \
+               for_each_if ((__ports_mask) & (1 << (__port)))
+
 #define for_each_crtc(dev, crtc) \
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
 
@@ -340,81 +383,6 @@ struct drm_i915_file_private {
        unsigned int bsd_ring;
 };
 
-enum intel_dpll_id {
-       DPLL_ID_PRIVATE = -1, /* non-shared dpll in use */
-       /* real shared dpll ids must be >= 0 */
-       DPLL_ID_PCH_PLL_A = 0,
-       DPLL_ID_PCH_PLL_B = 1,
-       /* hsw/bdw */
-       DPLL_ID_WRPLL1 = 0,
-       DPLL_ID_WRPLL2 = 1,
-       DPLL_ID_SPLL = 2,
-
-       /* skl */
-       DPLL_ID_SKL_DPLL1 = 0,
-       DPLL_ID_SKL_DPLL2 = 1,
-       DPLL_ID_SKL_DPLL3 = 2,
-};
-#define I915_NUM_PLLS 3
-
-struct intel_dpll_hw_state {
-       /* i9xx, pch plls */
-       uint32_t dpll;
-       uint32_t dpll_md;
-       uint32_t fp0;
-       uint32_t fp1;
-
-       /* hsw, bdw */
-       uint32_t wrpll;
-       uint32_t spll;
-
-       /* skl */
-       /*
-        * DPLL_CTRL1 has 6 bits for each each this DPLL. We store those in
-        * lower part of ctrl1 and they get shifted into position when writing
-        * the register.  This allows us to easily compare the state to share
-        * the DPLL.
-        */
-       uint32_t ctrl1;
-       /* HDMI only, 0 when used for DP */
-       uint32_t cfgcr1, cfgcr2;
-
-       /* bxt */
-       uint32_t ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10,
-                pcsdw12;
-};
-
-struct intel_shared_dpll_config {
-       unsigned crtc_mask; /* mask of CRTCs sharing this PLL */
-       struct intel_dpll_hw_state hw_state;
-};
-
-struct intel_shared_dpll {
-       struct intel_shared_dpll_config config;
-
-       int active; /* count of number of active CRTCs (i.e. DPMS on) */
-       bool on; /* is the PLL actually active? Disabled during modeset */
-       const char *name;
-       /* should match the index in the dev_priv->shared_dplls array */
-       enum intel_dpll_id id;
-       /* The mode_set hook is optional and should be used together with the
-        * intel_prepare_shared_dpll function. */
-       void (*mode_set)(struct drm_i915_private *dev_priv,
-                        struct intel_shared_dpll *pll);
-       void (*enable)(struct drm_i915_private *dev_priv,
-                      struct intel_shared_dpll *pll);
-       void (*disable)(struct drm_i915_private *dev_priv,
-                       struct intel_shared_dpll *pll);
-       bool (*get_hw_state)(struct drm_i915_private *dev_priv,
-                            struct intel_shared_dpll *pll,
-                            struct intel_dpll_hw_state *hw_state);
-};
-
-#define SKL_DPLL0 0
-#define SKL_DPLL1 1
-#define SKL_DPLL2 2
-#define SKL_DPLL3 3
-
 /* Used by dp and fdi links */
 struct intel_link_m_n {
        uint32_t        tu;
@@ -533,7 +501,8 @@ struct drm_i915_error_state {
                u32 cpu_ring_head;
                u32 cpu_ring_tail;
 
-               u32 semaphore_seqno[I915_NUM_RINGS - 1];
+               u32 last_seqno;
+               u32 semaphore_seqno[I915_NUM_ENGINES - 1];
 
                /* Register state */
                u32 start;
@@ -553,7 +522,7 @@ struct drm_i915_error_state {
                u32 fault_reg;
                u64 faddr;
                u32 rc_psmi; /* sleep state */
-               u32 semaphore_mboxes[I915_NUM_RINGS - 1];
+               u32 semaphore_mboxes[I915_NUM_ENGINES - 1];
 
                struct drm_i915_error_object {
                        int page_count;
@@ -561,6 +530,8 @@ struct drm_i915_error_state {
                        u32 *pages[0];
                } *ringbuffer, *batchbuffer, *wa_batchbuffer, *ctx, *hws_page;
 
+               struct drm_i915_error_object *wa_ctx;
+
                struct drm_i915_error_request {
                        long jiffies;
                        u32 seqno;
@@ -577,12 +548,12 @@ struct drm_i915_error_state {
 
                pid_t pid;
                char comm[TASK_COMM_LEN];
-       } ring[I915_NUM_RINGS];
+       } ring[I915_NUM_ENGINES];
 
        struct drm_i915_error_buffer {
                u32 size;
                u32 name;
-               u32 rseqno[I915_NUM_RINGS], wseqno;
+               u32 rseqno[I915_NUM_ENGINES], wseqno;
                u64 gtt_offset;
                u32 read_domains;
                u32 write_domain;
@@ -611,27 +582,12 @@ struct dpll;
 struct drm_i915_display_funcs {
        int (*get_display_clock_speed)(struct drm_device *dev);
        int (*get_fifo_size)(struct drm_device *dev, int plane);
-       /**
-        * find_dpll() - Find the best values for the PLL
-        * @limit: limits for the PLL
-        * @crtc: current CRTC
-        * @target: target frequency in kHz
-        * @refclk: reference clock frequency in kHz
-        * @match_clock: if provided, @best_clock P divider must
-        *               match the P divider from @match_clock
-        *               used for LVDS downclocking
-        * @best_clock: best PLL values found
-        *
-        * Returns true on success, false on failure.
-        */
-       bool (*find_dpll)(const struct intel_limit *limit,
-                         struct intel_crtc_state *crtc_state,
-                         int target, int refclk,
-                         struct dpll *match_clock,
-                         struct dpll *best_clock);
-       int (*compute_pipe_wm)(struct intel_crtc *crtc,
-                              struct drm_atomic_state *state);
-       void (*program_watermarks)(struct intel_crtc_state *cstate);
+       int (*compute_pipe_wm)(struct intel_crtc_state *cstate);
+       int (*compute_intermediate_wm)(struct drm_device *dev,
+                                      struct intel_crtc *intel_crtc,
+                                      struct intel_crtc_state *newstate);
+       void (*initial_watermarks)(struct intel_crtc_state *cstate);
+       void (*optimize_watermarks)(struct intel_crtc_state *cstate);
        void (*update_wm)(struct drm_crtc *crtc);
        int (*modeset_calc_cdclk)(struct drm_atomic_state *state);
        void (*modeset_commit_cdclk)(struct drm_atomic_state *state);
@@ -662,6 +618,9 @@ struct drm_i915_display_funcs {
        /* render clock increase/decrease */
        /* display clock increase/decrease */
        /* pll clock increase/decrease */
+
+       void (*load_csc_matrix)(struct drm_crtc_state *crtc_state);
+       void (*load_luts)(struct drm_crtc_state *crtc_state);
 };
 
 enum forcewake_domain_id {
@@ -681,6 +640,13 @@ enum forcewake_domains {
                         FORCEWAKE_MEDIA)
 };
 
+#define FW_REG_READ  (1)
+#define FW_REG_WRITE (2)
+
+enum forcewake_domains
+intel_uncore_forcewake_for_reg(struct drm_i915_private *dev_priv,
+                              i915_reg_t reg, unsigned int op);
+
 struct intel_uncore_funcs {
        void (*force_wake_get)(struct drm_i915_private *dev_priv,
                                                        enum forcewake_domains domains);
@@ -713,8 +679,9 @@ struct intel_uncore {
        struct intel_uncore_forcewake_domain {
                struct drm_i915_private *i915;
                enum forcewake_domain_id id;
+               enum forcewake_domains mask;
                unsigned wake_count;
-               struct timer_list timer;
+               struct hrtimer timer;
                i915_reg_t reg_set;
                u32 val_set;
                u32 val_clear;
@@ -727,14 +694,14 @@ struct intel_uncore {
 };
 
 /* Iterate over initialised fw domains */
-#define for_each_fw_domain_mask(domain__, mask__, dev_priv__, i__) \
-       for ((i__) = 0, (domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
-            (i__) < FW_DOMAIN_ID_COUNT; \
-            (i__)++, (domain__) = &(dev_priv__)->uncore.fw_domain[i__]) \
-               for_each_if (((mask__) & (dev_priv__)->uncore.fw_domains) & (1 << (i__)))
+#define for_each_fw_domain_masked(domain__, mask__, dev_priv__) \
+       for ((domain__) = &(dev_priv__)->uncore.fw_domain[0]; \
+            (domain__) < &(dev_priv__)->uncore.fw_domain[FW_DOMAIN_ID_COUNT]; \
+            (domain__)++) \
+               for_each_if ((mask__) & (domain__)->mask)
 
-#define for_each_fw_domain(domain__, dev_priv__, i__) \
-       for_each_fw_domain_mask(domain__, FORCEWAKE_ALL, dev_priv__, i__)
+#define for_each_fw_domain(domain__, dev_priv__) \
+       for_each_fw_domain_masked(domain__, FORCEWAKE_ALL, dev_priv__)
 
 #define CSR_VERSION(major, minor)      ((major) << 16 | (minor))
 #define CSR_VERSION_MAJOR(version)     ((version) >> 16)
@@ -750,6 +717,7 @@ struct intel_csr {
        i915_reg_t mmioaddr[8];
        uint32_t mmiodata[8];
        uint32_t dc_state;
+       uint32_t allowed_dc_mask;
 };
 
 #define DEV_INFO_FOR_EACH_FLAG(func, sep) \
@@ -779,6 +747,7 @@ struct intel_csr {
        func(overlay_needs_physical) sep \
        func(supports_tv) sep \
        func(has_llc) sep \
+       func(has_snoop) sep \
        func(has_ddi) sep \
        func(has_fpga_dbg)
 
@@ -810,6 +779,11 @@ struct intel_device_info {
        u8 has_slice_pg:1;
        u8 has_subslice_pg:1;
        u8 has_eu_pg:1;
+
+       struct color_luts {
+               u16 degamma_lut_size;
+               u16 gamma_lut_size;
+       } color;
 };
 
 #undef DEFINE_FLAG
@@ -891,7 +865,7 @@ struct intel_context {
                struct i915_vma *lrc_vma;
                u64 lrc_desc;
                uint32_t *lrc_reg_state;
-       } engine[I915_NUM_RINGS];
+       } engine[I915_NUM_ENGINES];
 
        struct list_head link;
 };
@@ -1036,6 +1010,7 @@ struct intel_fbc_work;
 
 struct intel_gmbus {
        struct i2c_adapter adapter;
+#define GMBUS_FORCE_BIT_RETRY (1U << 31)
        u32 force_bit;
        u32 reg0;
        i915_reg_t gpio_reg;
@@ -1159,6 +1134,7 @@ struct intel_gen6_power_mgmt {
        u8 efficient_freq;      /* AKA RPe. Pre-determined balanced frequency */
        u8 rp1_freq;            /* "less than" RP0 power/freqency */
        u8 rp0_freq;            /* Non-overclocked max frequency. */
+       u16 gpll_ref_freq;      /* vlv/chv GPLL reference frequency */
 
        u8 up_threshold; /* Current %busy required to uplock */
        u8 down_threshold; /* Current %busy required to downclock */
@@ -1298,6 +1274,7 @@ struct i915_gem_mm {
        struct i915_hw_ppgtt *aliasing_ppgtt;
 
        struct notifier_block oom_notifier;
+       struct notifier_block vmap_notifier;
        struct shrinker shrinker;
        bool shrinker_no_lock_stealing;
 
@@ -1423,9 +1400,6 @@ struct i915_gpu_error {
 
        /* For missed irq/seqno simulation. */
        unsigned int test_irq_rings;
-
-       /* Used to prevent gem_check_wedged returning -EAGAIN during gpu reset   */
-       bool reload_in_reset;
 };
 
 enum modeset_restore {
@@ -1482,21 +1456,23 @@ struct intel_vbt_data {
        unsigned int lvds_use_ssc:1;
        unsigned int display_clock_mode:1;
        unsigned int fdi_rx_polarity_inverted:1;
-       unsigned int has_mipi:1;
+       unsigned int panel_type:4;
        int lvds_ssc_freq;
        unsigned int bios_lvds_val; /* initial [PCH_]LVDS reg val in VBIOS */
 
        enum drrs_support_type drrs_type;
 
-       /* eDP */
-       int edp_rate;
-       int edp_lanes;
-       int edp_preemphasis;
-       int edp_vswing;
-       bool edp_initialized;
-       bool edp_support;
-       int edp_bpp;
-       struct edp_power_seq edp_pps;
+       struct {
+               int rate;
+               int lanes;
+               int preemphasis;
+               int vswing;
+               bool low_vswing;
+               bool initialized;
+               bool support;
+               int bpp;
+               struct edp_power_seq pps;
+       } edp;
 
        struct {
                bool full_link;
@@ -1516,7 +1492,6 @@ struct intel_vbt_data {
 
        /* MIPI DSI */
        struct {
-               u16 port;
                u16 panel_id;
                struct mipi_config *config;
                struct mipi_pps_data *pps;
@@ -1532,6 +1507,7 @@ struct intel_vbt_data {
        union child_device_config *child_dev;
 
        struct ddi_vbt_port_info ddi_port_info[I915_MAX_PORTS];
+       struct sdvo_device_mapping sdvo_mappings[2];
 };
 
 enum intel_ddb_partitioning {
@@ -1706,7 +1682,7 @@ struct i915_wa_reg {
 struct i915_workarounds {
        struct i915_wa_reg reg[I915_MAX_WA_REGS];
        u32 count;
-       u32 hw_whitelist_count[I915_NUM_RINGS];
+       u32 hw_whitelist_count[I915_NUM_ENGINES];
 };
 
 struct i915_virtual_gpu {
@@ -1719,7 +1695,7 @@ struct i915_execbuffer_params {
        uint32_t                        dispatch_flags;
        uint32_t                        args_batch_start_offset;
        uint64_t                        batch_obj_vm_offset;
-       struct intel_engine_cs          *ring;
+       struct intel_engine_cs *engine;
        struct drm_i915_gem_object      *batch_obj;
        struct intel_context            *ctx;
        struct drm_i915_gem_request     *request;
@@ -1771,7 +1747,7 @@ struct drm_i915_private {
        wait_queue_head_t gmbus_wait_queue;
 
        struct pci_dev *bridge_dev;
-       struct intel_engine_cs ring[I915_NUM_RINGS];
+       struct intel_engine_cs engine[I915_NUM_ENGINES];
        struct drm_i915_gem_object *semaphore_obj;
        uint32_t last_seqno, next_seqno;
 
@@ -1829,6 +1805,7 @@ struct drm_i915_private {
        unsigned int skl_boot_cdclk;
        unsigned int cdclk_freq, max_cdclk_freq, atomic_cdclk_freq;
        unsigned int max_dotclk_freq;
+       unsigned int rawclk_freq;
        unsigned int hpll_freq;
        unsigned int czclk_freq;
 
@@ -1855,7 +1832,7 @@ struct drm_i915_private {
        struct drm_atomic_state *modeset_restore_state;
 
        struct list_head vm_list; /* Global list of all address spaces */
-       struct i915_gtt gtt; /* VM representing the global address space */
+       struct i915_ggtt ggtt; /* VM representing the global address space */
 
        struct i915_gem_mm mm;
        DECLARE_HASHTABLE(mm_structs, 7);
@@ -1863,8 +1840,6 @@ struct drm_i915_private {
 
        /* Kernel Modesetting */
 
-       struct sdvo_device_mapping sdvo_mappings[2];
-
        struct drm_crtc *plane_to_crtc_mapping[I915_MAX_PIPES];
        struct drm_crtc *pipe_to_crtc_mapping[I915_MAX_PIPES];
        wait_queue_head_t pending_flip_queue;
@@ -1876,6 +1851,14 @@ struct drm_i915_private {
        /* dpll and cdclk state is protected by connection_mutex */
        int num_shared_dpll;
        struct intel_shared_dpll shared_dplls[I915_NUM_PLLS];
+       const struct intel_dpll_mgr *dpll_mgr;
+
+       /*
+        * dpll_lock serializes intel_{prepare,enable,disable}_shared_dpll.
+        * Must be global rather than per dpll, because on some platforms
+        * plls share registers.
+        */
+       struct mutex dpll_lock;
 
        unsigned int active_crtcs;
        unsigned int min_pixclk[I915_MAX_PIPES];
@@ -1884,9 +1867,6 @@ struct drm_i915_private {
 
        struct i915_workarounds workarounds;
 
-       /* Reclocking support */
-       bool render_reclock_avail;
-
        struct i915_frontbuffer_tracking fb_tracking;
 
        u16 orig_clock;
@@ -1896,7 +1876,7 @@ struct drm_i915_private {
        struct intel_l3_parity l3_parity;
 
        /* Cannot be determined by PCIID. You must always read a register. */
-       size_t ellc_size;
+       u32 edram_cap;
 
        /* gen6+ rps state */
        struct intel_gen6_power_mgmt rps;
@@ -1936,7 +1916,15 @@ struct drm_i915_private {
 
        u32 fdi_rx_config;
 
+       /* Shadow for DISPLAY_PHY_CONTROL which can't be safely read */
        u32 chv_phy_control;
+       /*
+        * Shadows for CHV DPLL_MD regs to keep the state
+        * checker somewhat working in the presence hardware
+        * crappiness (can't read out DPLL_MD for pipes B & C).
+        */
+       u32 chv_dpll_md[I915_MAX_PIPES];
+       u32 bxt_phy_grc;
 
        u32 suspend_count;
        bool suspended_to_idle;
@@ -1980,6 +1968,13 @@ struct drm_i915_private {
                };
 
                uint8_t max_level;
+
+               /*
+                * Should be held around atomic WM register writing; also
+                * protects * intel_crtc->wm.active and
+                * cstate->wm.need_postvbl_update.
+                */
+               struct mutex wm_mutex;
        } wm;
 
        struct i915_runtime_pm pm;
@@ -1989,15 +1984,13 @@ struct drm_i915_private {
                int (*execbuf_submit)(struct i915_execbuffer_params *params,
                                      struct drm_i915_gem_execbuffer2 *args,
                                      struct list_head *vmas);
-               int (*init_rings)(struct drm_device *dev);
-               void (*cleanup_ring)(struct intel_engine_cs *ring);
-               void (*stop_ring)(struct intel_engine_cs *ring);
+               int (*init_engines)(struct drm_device *dev);
+               void (*cleanup_engine)(struct intel_engine_cs *engine);
+               void (*stop_engine)(struct intel_engine_cs *engine);
        } gt;
 
        struct intel_context *kernel_context;
 
-       bool edp_low_vswing;
-
        /* perform PHY state sanity checks? */
        bool chv_phy_assert[2];
 
@@ -2024,10 +2017,28 @@ static inline struct drm_i915_private *guc_to_i915(struct intel_guc *guc)
        return container_of(guc, struct drm_i915_private, guc);
 }
 
-/* Iterate over initialised rings */
-#define for_each_ring(ring__, dev_priv__, i__) \
-       for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
-               for_each_if ((((ring__) = &(dev_priv__)->ring[(i__)]), intel_ring_initialized((ring__))))
+/* Simple iterator over all initialised engines */
+#define for_each_engine(engine__, dev_priv__) \
+       for ((engine__) = &(dev_priv__)->engine[0]; \
+            (engine__) < &(dev_priv__)->engine[I915_NUM_ENGINES]; \
+            (engine__)++) \
+               for_each_if (intel_engine_initialized(engine__))
+
+/* Iterator with engine_id */
+#define for_each_engine_id(engine__, dev_priv__, id__) \
+       for ((engine__) = &(dev_priv__)->engine[0], (id__) = 0; \
+            (engine__) < &(dev_priv__)->engine[I915_NUM_ENGINES]; \
+            (engine__)++) \
+               for_each_if (((id__) = (engine__)->id, \
+                             intel_engine_initialized(engine__)))
+
+/* Iterator over subset of engines selected by mask */
+#define for_each_engine_masked(engine__, dev_priv__, mask__) \
+       for ((engine__) = &(dev_priv__)->engine[0]; \
+            (engine__) < &(dev_priv__)->engine[I915_NUM_ENGINES]; \
+            (engine__)++) \
+               for_each_if (((mask__) & intel_engine_flag(engine__)) && \
+                            intel_engine_initialized(engine__))
 
 enum hdmi_force_audio {
        HDMI_AUDIO_OFF_DVI = -2,        /* no aux data for HDMI-DVI converter */
@@ -2097,7 +2108,7 @@ struct drm_i915_gem_object {
        struct drm_mm_node *stolen;
        struct list_head global_list;
 
-       struct list_head ring_list[I915_NUM_RINGS];
+       struct list_head engine_list[I915_NUM_ENGINES];
        /** Used in execbuf to temporarily hold a ref */
        struct list_head obj_exec_link;
 
@@ -2108,7 +2119,7 @@ struct drm_i915_gem_object {
         * rendering and so a non-zero seqno), and is not set if it i s on
         * inactive (ready to be unbound) list.
         */
-       unsigned int active:I915_NUM_RINGS;
+       unsigned int active:I915_NUM_ENGINES;
 
        /**
         * This is set if the object has been written to since last bound
@@ -2172,10 +2183,7 @@ struct drm_i915_gem_object {
                struct scatterlist *sg;
                int last;
        } get_page;
-
-       /* prime dma-buf support */
-       void *dma_buf_vmapping;
-       int vmapping_count;
+       void *mapping;
 
        /** Breadcrumb of last rendering to the buffer.
         * There can only be one writer, but we allow for multiple readers.
@@ -2187,7 +2195,7 @@ struct drm_i915_gem_object {
         * read request. This allows for the CPU to read from an active
         * buffer by only waiting for the write to complete.
         * */
-       struct drm_i915_gem_request *last_read_req[I915_NUM_RINGS];
+       struct drm_i915_gem_request *last_read_req[I915_NUM_ENGINES];
        struct drm_i915_gem_request *last_write_req;
        /** Breadcrumb of last fenced GPU access to the buffer. */
        struct drm_i915_gem_request *last_fenced_req;
@@ -2242,7 +2250,8 @@ struct drm_i915_gem_request {
 
        /** On Which ring this request was generated */
        struct drm_i915_private *i915;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
+       unsigned reset_counter;
 
         /** GEM sequence number associated with the previous request,
          * when the HWS breadcrumb is equal to this the GPU is processing
@@ -2323,7 +2332,6 @@ struct drm_i915_gem_request {
 struct drm_i915_gem_request * __must_check
 i915_gem_request_alloc(struct intel_engine_cs *engine,
                       struct intel_context *ctx);
-void i915_gem_request_cancel(struct drm_i915_gem_request *req);
 void i915_gem_request_free(struct kref *req_ref);
 int i915_gem_request_add_to_client(struct drm_i915_gem_request *req,
                                   struct drm_file *file);
@@ -2335,9 +2343,9 @@ i915_gem_request_get_seqno(struct drm_i915_gem_request *req)
 }
 
 static inline struct intel_engine_cs *
-i915_gem_request_get_ring(struct drm_i915_gem_request *req)
+i915_gem_request_get_engine(struct drm_i915_gem_request *req)
 {
-       return req ? req->ring : NULL;
+       return req ? req->engine : NULL;
 }
 
 static inline struct drm_i915_gem_request *
@@ -2351,7 +2359,7 @@ i915_gem_request_reference(struct drm_i915_gem_request *req)
 static inline void
 i915_gem_request_unreference(struct drm_i915_gem_request *req)
 {
-       WARN_ON(!mutex_is_locked(&req->ring->dev->struct_mutex));
+       WARN_ON(!mutex_is_locked(&req->engine->dev->struct_mutex));
        kref_put(&req->ref, i915_gem_request_free);
 }
 
@@ -2363,7 +2371,7 @@ i915_gem_request_unreference__unlocked(struct drm_i915_gem_request *req)
        if (!req)
                return;
 
-       dev = req->ring->dev;
+       dev = req->engine->dev;
        if (kref_put_mutex(&req->ref, i915_gem_request_free, &dev->struct_mutex))
                mutex_unlock(&dev->struct_mutex);
 }
@@ -2493,6 +2501,7 @@ struct drm_i915_cmd_table {
        __p; \
 })
 #define INTEL_INFO(p)  (&__I915__(p)->info)
+#define INTEL_GEN(p)   (INTEL_INFO(p)->gen)
 #define INTEL_DEVID(p) (INTEL_INFO(p)->device_id)
 #define INTEL_REVID(p) (__I915__(p)->dev->pdev->revision)
 
@@ -2611,13 +2620,17 @@ struct drm_i915_cmd_table {
 #define BLT_RING               (1<<BCS)
 #define VEBOX_RING             (1<<VECS)
 #define BSD2_RING              (1<<VCS2)
+#define ALL_ENGINES            (~0)
+
 #define HAS_BSD(dev)           (INTEL_INFO(dev)->ring_mask & BSD_RING)
 #define HAS_BSD2(dev)          (INTEL_INFO(dev)->ring_mask & BSD2_RING)
 #define HAS_BLT(dev)           (INTEL_INFO(dev)->ring_mask & BLT_RING)
 #define HAS_VEBOX(dev)         (INTEL_INFO(dev)->ring_mask & VEBOX_RING)
 #define HAS_LLC(dev)           (INTEL_INFO(dev)->has_llc)
+#define HAS_SNOOP(dev)         (INTEL_INFO(dev)->has_snoop)
+#define HAS_EDRAM(dev)         (__I915__(dev)->edram_cap & EDRAM_ENABLED)
 #define HAS_WT(dev)            ((IS_HASWELL(dev) || IS_BROADWELL(dev)) && \
-                                __I915__(dev)->ellc_size)
+                                HAS_EDRAM(dev))
 #define I915_NEED_GFX_HWS(dev) (INTEL_INFO(dev)->need_gfx_hws)
 
 #define HAS_HW_CONTEXTS(dev)   (INTEL_INFO(dev)->gen >= 6)
@@ -2671,7 +2684,7 @@ struct drm_i915_cmd_table {
 #define HAS_RUNTIME_PM(dev)    (IS_GEN6(dev) || IS_HASWELL(dev) || \
                                 IS_BROADWELL(dev) || IS_VALLEYVIEW(dev) || \
                                 IS_CHERRYVIEW(dev) || IS_SKYLAKE(dev) || \
-                                IS_KABYLAKE(dev))
+                                IS_KABYLAKE(dev) || IS_BROXTON(dev))
 #define HAS_RC6(dev)           (INTEL_INFO(dev)->gen >= 6)
 #define HAS_RC6p(dev)          (INTEL_INFO(dev)->gen == 6 || IS_IVYBRIDGE(dev))
 
@@ -2696,6 +2709,7 @@ struct drm_i915_cmd_table {
 #define INTEL_PCH_SPT_DEVICE_ID_TYPE           0xA100
 #define INTEL_PCH_SPT_LP_DEVICE_ID_TYPE                0x9D00
 #define INTEL_PCH_P2X_DEVICE_ID_TYPE           0x7100
+#define INTEL_PCH_P3X_DEVICE_ID_TYPE           0x7000
 #define INTEL_PCH_QEMU_DEVICE_ID_TYPE          0x2900 /* qemu q35 has 2918 */
 
 #define INTEL_PCH_TYPE(dev) (__I915__(dev)->pch_type)
@@ -2727,6 +2741,13 @@ extern int i915_suspend_switcheroo(struct drm_device *dev, pm_message_t state);
 extern int i915_resume_switcheroo(struct drm_device *dev);
 
 /* i915_dma.c */
+void __printf(3, 4)
+__i915_printk(struct drm_i915_private *dev_priv, const char *level,
+             const char *fmt, ...);
+
+#define i915_report_error(dev_priv, fmt, ...)                             \
+       __i915_printk(dev_priv, KERN_ERR, fmt, ##__VA_ARGS__)
+
 extern int i915_driver_load(struct drm_device *, unsigned long flags);
 extern int i915_driver_unload(struct drm_device *);
 extern int i915_driver_open(struct drm_device *dev, struct drm_file *file);
@@ -2739,9 +2760,11 @@ extern void i915_driver_postclose(struct drm_device *dev,
 extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
                              unsigned long arg);
 #endif
-extern int intel_gpu_reset(struct drm_device *dev);
+extern int intel_gpu_reset(struct drm_device *dev, u32 engine_mask);
 extern bool intel_has_gpu_reset(struct drm_device *dev);
 extern int i915_reset(struct drm_device *dev);
+extern int intel_guc_reset(struct drm_i915_private *dev_priv);
+extern void intel_engine_init_hangcheck(struct intel_engine_cs *engine);
 extern unsigned long i915_chipset_val(struct drm_i915_private *dev_priv);
 extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
 extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
@@ -2758,7 +2781,7 @@ bool intel_hpd_pin_to_port(enum hpd_pin pin, enum port *port);
 /* i915_irq.c */
 void i915_queue_hangcheck(struct drm_device *dev);
 __printf(3, 4)
-void i915_handle_error(struct drm_device *dev, bool wedged,
+void i915_handle_error(struct drm_device *dev, u32 engine_mask,
                       const char *fmt, ...);
 
 extern void intel_irq_init(struct drm_i915_private *dev_priv);
@@ -2785,6 +2808,8 @@ void intel_uncore_forcewake_get__locked(struct drm_i915_private *dev_priv,
                                        enum forcewake_domains domains);
 void intel_uncore_forcewake_put__locked(struct drm_i915_private *dev_priv,
                                        enum forcewake_domains domains);
+u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv);
+
 void assert_forcewakes_inactive(struct drm_i915_private *dev_priv);
 static inline bool intel_vgpu_active(struct drm_device *dev)
 {
@@ -2863,7 +2888,6 @@ int i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
                             struct drm_file *file_priv);
 void i915_gem_execbuffer_move_to_active(struct list_head *vmas,
                                        struct drm_i915_gem_request *req);
-void i915_gem_execbuffer_retire_commands(struct i915_execbuffer_params *params);
 int i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
                                   struct drm_i915_gem_execbuffer2 *args,
                                   struct list_head *vmas);
@@ -2894,6 +2918,7 @@ int i915_gem_wait_ioctl(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
 void i915_gem_load_init(struct drm_device *dev);
 void i915_gem_load_cleanup(struct drm_device *dev);
+void i915_gem_load_init_fences(struct drm_i915_private *dev_priv);
 void *i915_gem_object_alloc(struct drm_device *dev);
 void i915_gem_object_free(struct drm_i915_gem_object *obj);
 void i915_gem_object_init(struct drm_i915_gem_object *obj,
@@ -2978,12 +3003,46 @@ static inline void i915_gem_object_pin_pages(struct drm_i915_gem_object *obj)
        BUG_ON(obj->pages == NULL);
        obj->pages_pin_count++;
 }
+
 static inline void i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
 {
        BUG_ON(obj->pages_pin_count == 0);
        obj->pages_pin_count--;
 }
 
+/**
+ * i915_gem_object_pin_map - return a contiguous mapping of the entire object
+ * @obj - the object to map into kernel address space
+ *
+ * Calls i915_gem_object_pin_pages() to prevent reaping of the object's
+ * pages and then returns a contiguous mapping of the backing storage into
+ * the kernel address space.
+ *
+ * The caller must hold the struct_mutex, and is responsible for calling
+ * i915_gem_object_unpin_map() when the mapping is no longer required.
+ *
+ * Returns the pointer through which to access the mapped object, or an
+ * ERR_PTR() on error.
+ */
+void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj);
+
+/**
+ * i915_gem_object_unpin_map - releases an earlier mapping
+ * @obj - the object to unmap
+ *
+ * After pinning the object and mapping its pages, once you are finished
+ * with your access, call i915_gem_object_unpin_map() to release the pin
+ * upon the mapping. Once the pin count reaches zero, that mapping may be
+ * removed.
+ *
+ * The caller must hold the struct_mutex.
+ */
+static inline void i915_gem_object_unpin_map(struct drm_i915_gem_object *obj)
+{
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
+       i915_gem_object_unpin_pages(obj);
+}
+
 int __must_check i915_mutex_lock_interruptible(struct drm_device *dev);
 int i915_gem_object_sync(struct drm_i915_gem_object *obj,
                         struct intel_engine_cs *to,
@@ -3007,42 +3066,68 @@ i915_seqno_passed(uint32_t seq1, uint32_t seq2)
 static inline bool i915_gem_request_started(struct drm_i915_gem_request *req,
                                           bool lazy_coherency)
 {
-       u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency);
-       return i915_seqno_passed(seqno, req->previous_seqno);
+       if (!lazy_coherency && req->engine->irq_seqno_barrier)
+               req->engine->irq_seqno_barrier(req->engine);
+       return i915_seqno_passed(req->engine->get_seqno(req->engine),
+                                req->previous_seqno);
 }
 
 static inline bool i915_gem_request_completed(struct drm_i915_gem_request *req,
                                              bool lazy_coherency)
 {
-       u32 seqno = req->ring->get_seqno(req->ring, lazy_coherency);
-       return i915_seqno_passed(seqno, req->seqno);
+       if (!lazy_coherency && req->engine->irq_seqno_barrier)
+               req->engine->irq_seqno_barrier(req->engine);
+       return i915_seqno_passed(req->engine->get_seqno(req->engine),
+                                req->seqno);
 }
 
 int __must_check i915_gem_get_seqno(struct drm_device *dev, u32 *seqno);
 int __must_check i915_gem_set_seqno(struct drm_device *dev, u32 seqno);
 
 struct drm_i915_gem_request *
-i915_gem_find_active_request(struct intel_engine_cs *ring);
+i915_gem_find_active_request(struct intel_engine_cs *engine);
 
 bool i915_gem_retire_requests(struct drm_device *dev);
-void i915_gem_retire_requests_ring(struct intel_engine_cs *ring);
-int __must_check i915_gem_check_wedge(struct i915_gpu_error *error,
-                                     bool interruptible);
+void i915_gem_retire_requests_ring(struct intel_engine_cs *engine);
+
+static inline u32 i915_reset_counter(struct i915_gpu_error *error)
+{
+       return atomic_read(&error->reset_counter);
+}
+
+static inline bool __i915_reset_in_progress(u32 reset)
+{
+       return unlikely(reset & I915_RESET_IN_PROGRESS_FLAG);
+}
+
+static inline bool __i915_reset_in_progress_or_wedged(u32 reset)
+{
+       return unlikely(reset & (I915_RESET_IN_PROGRESS_FLAG | I915_WEDGED));
+}
+
+static inline bool __i915_terminally_wedged(u32 reset)
+{
+       return unlikely(reset & I915_WEDGED);
+}
 
 static inline bool i915_reset_in_progress(struct i915_gpu_error *error)
 {
-       return unlikely(atomic_read(&error->reset_counter)
-                       & (I915_RESET_IN_PROGRESS_FLAG | I915_WEDGED));
+       return __i915_reset_in_progress(i915_reset_counter(error));
+}
+
+static inline bool i915_reset_in_progress_or_wedged(struct i915_gpu_error *error)
+{
+       return __i915_reset_in_progress_or_wedged(i915_reset_counter(error));
 }
 
 static inline bool i915_terminally_wedged(struct i915_gpu_error *error)
 {
-       return atomic_read(&error->reset_counter) & I915_WEDGED;
+       return __i915_terminally_wedged(i915_reset_counter(error));
 }
 
 static inline u32 i915_reset_count(struct i915_gpu_error *error)
 {
-       return ((atomic_read(&error->reset_counter) & ~I915_WEDGED) + 1) / 2;
+       return ((i915_reset_counter(error) & ~I915_WEDGED) + 1) / 2;
 }
 
 static inline bool i915_stop_ring_allow_ban(struct drm_i915_private *dev_priv)
@@ -3060,11 +3145,11 @@ static inline bool i915_stop_ring_allow_warn(struct drm_i915_private *dev_priv)
 void i915_gem_reset(struct drm_device *dev);
 bool i915_gem_clflush_object(struct drm_i915_gem_object *obj, bool force);
 int __must_check i915_gem_init(struct drm_device *dev);
-int i915_gem_init_rings(struct drm_device *dev);
+int i915_gem_init_engines(struct drm_device *dev);
 int __must_check i915_gem_init_hw(struct drm_device *dev);
 int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice);
 void i915_gem_init_swizzling(struct drm_device *dev);
-void i915_gem_cleanup_ringbuffer(struct drm_device *dev);
+void i915_gem_cleanup_engines(struct drm_device *dev);
 int __must_check i915_gpu_idle(struct drm_device *dev);
 int __must_check i915_gem_suspend(struct drm_device *dev);
 void __i915_add_request(struct drm_i915_gem_request *req,
@@ -3075,7 +3160,6 @@ void __i915_add_request(struct drm_i915_gem_request *req,
 #define i915_add_request_no_flush(req) \
        __i915_add_request(req, NULL, false)
 int __i915_wait_request(struct drm_i915_gem_request *req,
-                       unsigned reset_counter,
                        bool interruptible,
                        s64 *timeout,
                        struct intel_rps_client *rps);
@@ -3155,13 +3239,9 @@ i915_gem_obj_to_ggtt(struct drm_i915_gem_object *obj)
 bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj);
 
 /* Some GGTT VM helpers */
-#define i915_obj_to_ggtt(obj) \
-       (&((struct drm_i915_private *)(obj)->base.dev->dev_private)->gtt.base)
-
 static inline struct i915_hw_ppgtt *
 i915_vm_to_ppgtt(struct i915_address_space *vm)
 {
-       WARN_ON(i915_is_ggtt(vm));
        return container_of(vm, struct i915_hw_ppgtt, base);
 }
 
@@ -3174,7 +3254,10 @@ static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
 static inline unsigned long
 i915_gem_obj_ggtt_size(struct drm_i915_gem_object *obj)
 {
-       return i915_gem_obj_size(obj, i915_obj_to_ggtt(obj));
+       struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+
+       return i915_gem_obj_size(obj, &ggtt->base);
 }
 
 static inline int __must_check
@@ -3182,7 +3265,10 @@ i915_gem_obj_ggtt_pin(struct drm_i915_gem_object *obj,
                      uint32_t alignment,
                      unsigned flags)
 {
-       return i915_gem_object_pin(obj, i915_obj_to_ggtt(obj),
+       struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+
+       return i915_gem_object_pin(obj, &ggtt->base,
                                   alignment, flags | PIN_GLOBAL);
 }
 
@@ -3297,6 +3383,7 @@ unsigned long i915_gem_shrink(struct drm_i915_private *dev_priv,
 #define I915_SHRINK_UNBOUND 0x2
 #define I915_SHRINK_BOUND 0x4
 #define I915_SHRINK_ACTIVE 0x8
+#define I915_SHRINK_VMAPS 0x10
 unsigned long i915_gem_shrink_all(struct drm_i915_private *dev_priv);
 void i915_gem_shrinker_init(struct drm_i915_private *dev_priv);
 void i915_gem_shrinker_cleanup(struct drm_i915_private *dev_priv);
@@ -3343,7 +3430,7 @@ static inline void i915_error_state_buf_release(
 {
        kfree(eb->buf);
 }
-void i915_capture_error_state(struct drm_device *dev, bool wedge,
+void i915_capture_error_state(struct drm_device *dev, u32 engine_mask,
                              const char *error_msg);
 void i915_error_state_get(struct drm_device *dev,
                          struct i915_error_state_file_priv *error_priv);
@@ -3355,10 +3442,10 @@ const char *i915_cache_level_str(struct drm_i915_private *i915, int type);
 
 /* i915_cmd_parser.c */
 int i915_cmd_parser_get_version(void);
-int i915_cmd_parser_init_ring(struct intel_engine_cs *ring);
-void i915_cmd_parser_fini_ring(struct intel_engine_cs *ring);
-bool i915_needs_cmd_parser(struct intel_engine_cs *ring);
-int i915_parse_cmds(struct intel_engine_cs *ring,
+int i915_cmd_parser_init_ring(struct intel_engine_cs *engine);
+void i915_cmd_parser_fini_ring(struct intel_engine_cs *engine);
+bool i915_needs_cmd_parser(struct intel_engine_cs *engine);
+int i915_parse_cmds(struct intel_engine_cs *engine,
                    struct drm_i915_gem_object *batch_obj,
                    struct drm_i915_gem_object *shadow_batch_obj,
                    u32 batch_start_offset,
@@ -3392,6 +3479,12 @@ extern void intel_i2c_reset(struct drm_device *dev);
 /* intel_bios.c */
 int intel_bios_init(struct drm_i915_private *dev_priv);
 bool intel_bios_is_valid_vbt(const void *buf, size_t size);
+bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv);
+bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin);
+bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port);
+bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, enum port *port);
+bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
+                                    enum port port);
 
 /* intel_opregion.c */
 #ifdef CONFIG_ACPI
@@ -3403,6 +3496,7 @@ extern int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
                                         bool enable);
 extern int intel_opregion_notify_adapter(struct drm_device *dev,
                                         pci_power_t state);
+extern int intel_opregion_get_panel_type(struct drm_device *dev);
 #else
 static inline int intel_opregion_setup(struct drm_device *dev) { return 0; }
 static inline void intel_opregion_init(struct drm_device *dev) { return; }
@@ -3418,6 +3512,10 @@ intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
 {
        return 0;
 }
+static inline int intel_opregion_get_panel_type(struct drm_device *dev)
+{
+       return -ENODEV;
+}
 #endif
 
 /* intel_acpi.c */
@@ -3624,11 +3722,11 @@ wait_remaining_ms_from_jiffies(unsigned long timestamp_jiffies, int to_wait_ms)
        }
 }
 
-static inline void i915_trace_irq_get(struct intel_engine_cs *ring,
+static inline void i915_trace_irq_get(struct intel_engine_cs *engine,
                                      struct drm_i915_gem_request *req)
 {
-       if (ring->trace_irq_req == NULL && ring->irq_get(ring))
-               i915_gem_request_assign(&ring->trace_irq_req, req);
+       if (engine->trace_irq_req == NULL && engine->irq_get(engine))
+               i915_gem_request_assign(&engine->trace_irq_req, req);
 }
 
 #endif
index 233adc31ef0c9ed32b0cc63cefb78b23cc0d82c6..94bbc4314ac5a3a8190fda2f23da1143eb8f5c13 100644 (file)
 #include "i915_vgpu.h"
 #include "i915_trace.h"
 #include "intel_drv.h"
+#include "intel_mocs.h"
 #include <linux/shmem_fs.h>
 #include <linux/slab.h>
 #include <linux/swap.h>
 #include <linux/pci.h>
 #include <linux/dma-buf.h>
 
-#define RQ_BUG_ON(expr)
-
 static void i915_gem_object_flush_gtt_write_domain(struct drm_i915_gem_object *obj);
 static void i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj);
 static void
@@ -85,9 +84,7 @@ i915_gem_wait_for_error(struct i915_gpu_error *error)
 {
        int ret;
 
-#define EXIT_COND (!i915_reset_in_progress(error) || \
-                  i915_terminally_wedged(error))
-       if (EXIT_COND)
+       if (!i915_reset_in_progress(error))
                return 0;
 
        /*
@@ -96,17 +93,16 @@ i915_gem_wait_for_error(struct i915_gpu_error *error)
         * we should simply try to bail out and fail as gracefully as possible.
         */
        ret = wait_event_interruptible_timeout(error->reset_queue,
-                                              EXIT_COND,
+                                              !i915_reset_in_progress(error),
                                               10*HZ);
        if (ret == 0) {
                DRM_ERROR("Timed out waiting for the gpu reset to complete\n");
                return -EIO;
        } else if (ret < 0) {
                return ret;
+       } else {
+               return 0;
        }
-#undef EXIT_COND
-
-       return 0;
 }
 
 int i915_mutex_lock_interruptible(struct drm_device *dev)
@@ -130,9 +126,9 @@ int
 i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
                            struct drm_file *file)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_get_aperture *args = data;
-       struct i915_gtt *ggtt = &dev_priv->gtt;
        struct i915_vma *vma;
        size_t pinned;
 
@@ -146,7 +142,7 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
                        pinned += vma->node.size;
        mutex_unlock(&dev->struct_mutex);
 
-       args->aper_size = dev_priv->gtt.base.total;
+       args->aper_size = ggtt->base.total;
        args->aper_available_size = args->aper_size - pinned;
 
        return 0;
@@ -211,11 +207,10 @@ i915_gem_object_put_pages_phys(struct drm_i915_gem_object *obj)
        BUG_ON(obj->madv == __I915_MADV_PURGED);
 
        ret = i915_gem_object_set_to_cpu_domain(obj, true);
-       if (ret) {
+       if (WARN_ON(ret)) {
                /* In the event of a disaster, abandon all caches and
                 * hope for the best.
                 */
-               WARN_ON(ret != -EIO);
                obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
        }
 
@@ -700,7 +695,7 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -765,7 +760,8 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
                         struct drm_i915_gem_pwrite *args,
                         struct drm_file *file)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        ssize_t remain;
        loff_t offset, page_base;
        char __user *user_data;
@@ -807,7 +803,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
                 * source page isn't available.  Return the error and we'll
                 * retry in the slow path.
                 */
-               if (fast_user_write(dev_priv->gtt.mappable, page_base,
+               if (fast_user_write(ggtt->mappable, page_base,
                                    page_offset, user_data, page_length)) {
                        ret = -EFAULT;
                        goto out_flush;
@@ -1053,7 +1049,7 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data,
        if (ret)
                goto put_rpm;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -1109,27 +1105,19 @@ put_rpm:
        return ret;
 }
 
-int
-i915_gem_check_wedge(struct i915_gpu_error *error,
-                    bool interruptible)
+static int
+i915_gem_check_wedge(unsigned reset_counter, bool interruptible)
 {
-       if (i915_reset_in_progress(error)) {
+       if (__i915_terminally_wedged(reset_counter))
+               return -EIO;
+
+       if (__i915_reset_in_progress(reset_counter)) {
                /* Non-interruptible callers can't handle -EAGAIN, hence return
                 * -EIO unconditionally for these. */
                if (!interruptible)
                        return -EIO;
 
-               /* Recovery complete, but the reset failed ... */
-               if (i915_terminally_wedged(error))
-                       return -EIO;
-
-               /*
-                * Check if GPU Reset is in progress - we need intel_ring_begin
-                * to work properly to reinit the hw state while the gpu is
-                * still marked as reset-in-progress. Handle this with a flag.
-                */
-               if (!error->reload_in_reset)
-                       return -EAGAIN;
+               return -EAGAIN;
        }
 
        return 0;
@@ -1141,9 +1129,9 @@ static void fake_irq(unsigned long data)
 }
 
 static bool missed_irq(struct drm_i915_private *dev_priv,
-                      struct intel_engine_cs *ring)
+                      struct intel_engine_cs *engine)
 {
-       return test_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings);
+       return test_bit(engine->id, &dev_priv->gpu_error.missed_irq_rings);
 }
 
 static unsigned long local_clock_us(unsigned *cpu)
@@ -1193,7 +1181,7 @@ static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
         * takes to sleep on a request, on the order of a microsecond.
         */
 
-       if (req->ring->irq_refcount)
+       if (req->engine->irq_refcount)
                return -EBUSY;
 
        /* Only spin if we know the GPU is processing this request */
@@ -1223,7 +1211,6 @@ static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
 /**
  * __i915_wait_request - wait until execution of request has finished
  * @req: duh!
- * @reset_counter: reset sequence associated with the given request
  * @interruptible: do an interruptible wait (normally yes)
  * @timeout: in - how long to wait (NULL forever); out - how much time remaining
  *
@@ -1238,16 +1225,15 @@ static int __i915_spin_request(struct drm_i915_gem_request *req, int state)
  * errno with remaining time filled in timeout argument.
  */
 int __i915_wait_request(struct drm_i915_gem_request *req,
-                       unsigned reset_counter,
                        bool interruptible,
                        s64 *timeout,
                        struct intel_rps_client *rps)
 {
-       struct intel_engine_cs *ring = i915_gem_request_get_ring(req);
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = i915_gem_request_get_engine(req);
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        const bool irq_test_in_progress =
-               ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring);
+               ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_engine_flag(engine);
        int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE;
        DEFINE_WAIT(wait);
        unsigned long timeout_expire;
@@ -1288,7 +1274,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
        if (ret == 0)
                goto out;
 
-       if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring))) {
+       if (!irq_test_in_progress && WARN_ON(!engine->irq_get(engine))) {
                ret = -ENODEV;
                goto out;
        }
@@ -1296,16 +1282,17 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
        for (;;) {
                struct timer_list timer;
 
-               prepare_to_wait(&ring->irq_queue, &wait, state);
+               prepare_to_wait(&engine->irq_queue, &wait, state);
 
                /* We need to check whether any gpu reset happened in between
-                * the caller grabbing the seqno and now ... */
-               if (reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter)) {
-                       /* ... but upgrade the -EAGAIN to an -EIO if the gpu
-                        * is truely gone. */
-                       ret = i915_gem_check_wedge(&dev_priv->gpu_error, interruptible);
-                       if (ret == 0)
-                               ret = -EAGAIN;
+                * the request being submitted and now. If a reset has occurred,
+                * the request is effectively complete (we either are in the
+                * process of or have discarded the rendering and completely
+                * reset the GPU. The results of the request are lost and we
+                * are free to continue on with the original operation.
+                */
+               if (req->reset_counter != i915_reset_counter(&dev_priv->gpu_error)) {
+                       ret = 0;
                        break;
                }
 
@@ -1325,11 +1312,11 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
                }
 
                timer.function = NULL;
-               if (timeout || missed_irq(dev_priv, ring)) {
+               if (timeout || missed_irq(dev_priv, engine)) {
                        unsigned long expire;
 
                        setup_timer_on_stack(&timer, fake_irq, (unsigned long)current);
-                       expire = missed_irq(dev_priv, ring) ? jiffies + 1 : timeout_expire;
+                       expire = missed_irq(dev_priv, engine) ? jiffies + 1 : timeout_expire;
                        mod_timer(&timer, expire);
                }
 
@@ -1341,9 +1328,9 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
                }
        }
        if (!irq_test_in_progress)
-               ring->irq_put(ring);
+               engine->irq_put(engine);
 
-       finish_wait(&ring->irq_queue, &wait);
+       finish_wait(&engine->irq_queue, &wait);
 
 out:
        trace_i915_gem_request_wait_end(req);
@@ -1370,7 +1357,6 @@ out:
 int i915_gem_request_add_to_client(struct drm_i915_gem_request *req,
                                   struct drm_file *file)
 {
-       struct drm_i915_private *dev_private;
        struct drm_i915_file_private *file_priv;
 
        WARN_ON(!req || !file || req->file_priv);
@@ -1381,7 +1367,6 @@ int i915_gem_request_add_to_client(struct drm_i915_gem_request *req,
        if (req->file_priv)
                return -EINVAL;
 
-       dev_private = req->ring->dev->dev_private;
        file_priv = file->driver_priv;
 
        spin_lock(&file_priv->mm.lock);
@@ -1434,7 +1419,7 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request)
 static void
 __i915_gem_request_retire__upto(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *engine = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_gem_request *tmp;
 
        lockdep_assert_held(&engine->dev->struct_mutex);
@@ -1459,26 +1444,15 @@ __i915_gem_request_retire__upto(struct drm_i915_gem_request *req)
 int
 i915_wait_request(struct drm_i915_gem_request *req)
 {
-       struct drm_device *dev;
-       struct drm_i915_private *dev_priv;
+       struct drm_i915_private *dev_priv = req->i915;
        bool interruptible;
        int ret;
 
-       BUG_ON(req == NULL);
-
-       dev = req->ring->dev;
-       dev_priv = dev->dev_private;
        interruptible = dev_priv->mm.interruptible;
 
-       BUG_ON(!mutex_is_locked(&dev->struct_mutex));
-
-       ret = i915_gem_check_wedge(&dev_priv->gpu_error, interruptible);
-       if (ret)
-               return ret;
+       BUG_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
 
-       ret = __i915_wait_request(req,
-                                 atomic_read(&dev_priv->gpu_error.reset_counter),
-                                 interruptible, NULL, NULL);
+       ret = __i915_wait_request(req, interruptible, NULL, NULL);
        if (ret)
                return ret;
 
@@ -1505,14 +1479,14 @@ i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
                        if (ret)
                                return ret;
 
-                       i = obj->last_write_req->ring->id;
+                       i = obj->last_write_req->engine->id;
                        if (obj->last_read_req[i] == obj->last_write_req)
                                i915_gem_object_retire__read(obj, i);
                        else
                                i915_gem_object_retire__write(obj);
                }
        } else {
-               for (i = 0; i < I915_NUM_RINGS; i++) {
+               for (i = 0; i < I915_NUM_ENGINES; i++) {
                        if (obj->last_read_req[i] == NULL)
                                continue;
 
@@ -1522,7 +1496,7 @@ i915_gem_object_wait_rendering(struct drm_i915_gem_object *obj,
 
                        i915_gem_object_retire__read(obj, i);
                }
-               RQ_BUG_ON(obj->active);
+               GEM_BUG_ON(obj->active);
        }
 
        return 0;
@@ -1532,7 +1506,7 @@ static void
 i915_gem_object_retire_request(struct drm_i915_gem_object *obj,
                               struct drm_i915_gem_request *req)
 {
-       int ring = req->ring->id;
+       int ring = req->engine->id;
 
        if (obj->last_read_req[ring] == req)
                i915_gem_object_retire__read(obj, ring);
@@ -1552,8 +1526,7 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
 {
        struct drm_device *dev = obj->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_i915_gem_request *requests[I915_NUM_RINGS];
-       unsigned reset_counter;
+       struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
        int ret, i, n = 0;
 
        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
@@ -1562,12 +1535,6 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
        if (!obj->active)
                return 0;
 
-       ret = i915_gem_check_wedge(&dev_priv->gpu_error, true);
-       if (ret)
-               return ret;
-
-       reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
-
        if (readonly) {
                struct drm_i915_gem_request *req;
 
@@ -1577,7 +1544,7 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
 
                requests[n++] = i915_gem_request_reference(req);
        } else {
-               for (i = 0; i < I915_NUM_RINGS; i++) {
+               for (i = 0; i < I915_NUM_ENGINES; i++) {
                        struct drm_i915_gem_request *req;
 
                        req = obj->last_read_req[i];
@@ -1589,9 +1556,9 @@ i915_gem_object_wait_rendering__nonblocking(struct drm_i915_gem_object *obj,
        }
 
        mutex_unlock(&dev->struct_mutex);
+       ret = 0;
        for (i = 0; ret == 0 && i < n; i++)
-               ret = __i915_wait_request(requests[i], reset_counter, true,
-                                         NULL, rps);
+               ret = __i915_wait_request(requests[i], true, NULL, rps);
        mutex_lock(&dev->struct_mutex);
 
        for (i = 0; i < n; i++) {
@@ -1640,7 +1607,7 @@ i915_gem_set_domain_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -1688,7 +1655,7 @@ i915_gem_sw_finish_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -1735,7 +1702,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
        if (args->flags & I915_MMAP_WC && !boot_cpu_has(X86_FEATURE_PAT))
                return -ENODEV;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (obj == NULL)
                return -ENOENT;
 
@@ -1792,7 +1759,8 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct drm_i915_gem_object *obj = to_intel_bo(vma->vm_private_data);
        struct drm_device *dev = obj->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_ggtt_view view = i915_ggtt_view_normal;
        pgoff_t page_offset;
        unsigned long pfn;
@@ -1827,7 +1795,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        }
 
        /* Use a partial view if the object is bigger than the aperture. */
-       if (obj->base.size >= dev_priv->gtt.mappable_end &&
+       if (obj->base.size >= ggtt->mappable_end &&
            obj->tiling_mode == I915_TILING_NONE) {
                static const unsigned int chunk_size = 256; // 1 MiB
 
@@ -1855,7 +1823,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
                goto unpin;
 
        /* Finally, remap it using the new GTT offset */
-       pfn = dev_priv->gtt.mappable_base +
+       pfn = ggtt->mappable_base +
                i915_gem_obj_ggtt_offset_view(obj, &view);
        pfn >>= PAGE_SHIFT;
 
@@ -1964,11 +1932,27 @@ out:
 void
 i915_gem_release_mmap(struct drm_i915_gem_object *obj)
 {
+       /* Serialisation between user GTT access and our code depends upon
+        * revoking the CPU's PTE whilst the mutex is held. The next user
+        * pagefault then has to wait until we release the mutex.
+        */
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
+
        if (!obj->fault_mappable)
                return;
 
        drm_vma_node_unmap(&obj->base.vma_node,
                           obj->base.dev->anon_inode->i_mapping);
+
+       /* Ensure that the CPU's PTE are revoked and there are not outstanding
+        * memory transactions from userspace before we return. The TLB
+        * flushing implied above by changing the PTE above *should* be
+        * sufficient, an extra barrier here just provides us with a bit
+        * of paranoid documentation about our requirement to serialise
+        * memory writes before touching registers / GSM.
+        */
+       wmb();
+
        obj->fault_mappable = false;
 }
 
@@ -2033,9 +2017,6 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
        struct drm_i915_private *dev_priv = obj->base.dev->dev_private;
        int ret;
 
-       if (drm_vma_node_has_offset(&obj->base.vma_node))
-               return 0;
-
        dev_priv->mm.shrinker_no_lock_stealing = true;
 
        ret = drm_gem_create_mmap_offset(&obj->base);
@@ -2084,7 +2065,7 @@ i915_gem_mmap_gtt(struct drm_file *file,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -2180,11 +2161,10 @@ i915_gem_object_put_pages_gtt(struct drm_i915_gem_object *obj)
        BUG_ON(obj->madv == __I915_MADV_PURGED);
 
        ret = i915_gem_object_set_to_cpu_domain(obj, true);
-       if (ret) {
+       if (WARN_ON(ret)) {
                /* In the event of a disaster, abandon all caches and
                 * hope for the best.
                 */
-               WARN_ON(ret != -EIO);
                i915_gem_clflush_object(obj, true);
                obj->base.read_domains = obj->base.write_domain = I915_GEM_DOMAIN_CPU;
        }
@@ -2232,6 +2212,14 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj)
         * lists early. */
        list_del(&obj->global_list);
 
+       if (obj->mapping) {
+               if (is_vmalloc_addr(obj->mapping))
+                       vunmap(obj->mapping);
+               else
+                       kunmap(kmap_to_page(obj->mapping));
+               obj->mapping = NULL;
+       }
+
        ops->put_pages(obj);
        obj->pages = NULL;
 
@@ -2400,21 +2388,64 @@ i915_gem_object_get_pages(struct drm_i915_gem_object *obj)
        return 0;
 }
 
+void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj)
+{
+       int ret;
+
+       lockdep_assert_held(&obj->base.dev->struct_mutex);
+
+       ret = i915_gem_object_get_pages(obj);
+       if (ret)
+               return ERR_PTR(ret);
+
+       i915_gem_object_pin_pages(obj);
+
+       if (obj->mapping == NULL) {
+               struct page **pages;
+
+               pages = NULL;
+               if (obj->base.size == PAGE_SIZE)
+                       obj->mapping = kmap(sg_page(obj->pages->sgl));
+               else
+                       pages = drm_malloc_gfp(obj->base.size >> PAGE_SHIFT,
+                                              sizeof(*pages),
+                                              GFP_TEMPORARY);
+               if (pages != NULL) {
+                       struct sg_page_iter sg_iter;
+                       int n;
+
+                       n = 0;
+                       for_each_sg_page(obj->pages->sgl, &sg_iter,
+                                        obj->pages->nents, 0)
+                               pages[n++] = sg_page_iter_page(&sg_iter);
+
+                       obj->mapping = vmap(pages, n, 0, PAGE_KERNEL);
+                       drm_free_large(pages);
+               }
+               if (obj->mapping == NULL) {
+                       i915_gem_object_unpin_pages(obj);
+                       return ERR_PTR(-ENOMEM);
+               }
+       }
+
+       return obj->mapping;
+}
+
 void i915_vma_move_to_active(struct i915_vma *vma,
                             struct drm_i915_gem_request *req)
 {
        struct drm_i915_gem_object *obj = vma->obj;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
 
-       ring = i915_gem_request_get_ring(req);
+       engine = i915_gem_request_get_engine(req);
 
        /* Add a reference if we're newly entering the active list. */
        if (obj->active == 0)
                drm_gem_object_reference(&obj->base);
-       obj->active |= intel_ring_flag(ring);
+       obj->active |= intel_engine_flag(engine);
 
-       list_move_tail(&obj->ring_list[ring->id], &ring->active_list);
-       i915_gem_request_assign(&obj->last_read_req[ring->id], req);
+       list_move_tail(&obj->engine_list[engine->id], &engine->active_list);
+       i915_gem_request_assign(&obj->last_read_req[engine->id], req);
 
        list_move_tail(&vma->vm_link, &vma->vm->active_list);
 }
@@ -2422,8 +2453,8 @@ void i915_vma_move_to_active(struct i915_vma *vma,
 static void
 i915_gem_object_retire__write(struct drm_i915_gem_object *obj)
 {
-       RQ_BUG_ON(obj->last_write_req == NULL);
-       RQ_BUG_ON(!(obj->active & intel_ring_flag(obj->last_write_req->ring)));
+       GEM_BUG_ON(obj->last_write_req == NULL);
+       GEM_BUG_ON(!(obj->active & intel_engine_flag(obj->last_write_req->engine)));
 
        i915_gem_request_assign(&obj->last_write_req, NULL);
        intel_fb_obj_flush(obj, true, ORIGIN_CS);
@@ -2434,13 +2465,13 @@ i915_gem_object_retire__read(struct drm_i915_gem_object *obj, int ring)
 {
        struct i915_vma *vma;
 
-       RQ_BUG_ON(obj->last_read_req[ring] == NULL);
-       RQ_BUG_ON(!(obj->active & (1 << ring)));
+       GEM_BUG_ON(obj->last_read_req[ring] == NULL);
+       GEM_BUG_ON(!(obj->active & (1 << ring)));
 
-       list_del_init(&obj->ring_list[ring]);
+       list_del_init(&obj->engine_list[ring]);
        i915_gem_request_assign(&obj->last_read_req[ring], NULL);
 
-       if (obj->last_write_req && obj->last_write_req->ring->id == ring)
+       if (obj->last_write_req && obj->last_write_req->engine->id == ring)
                i915_gem_object_retire__write(obj);
 
        obj->active &= ~(1 << ring);
@@ -2467,24 +2498,20 @@ static int
 i915_gem_init_seqno(struct drm_device *dev, u32 seqno)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int ret, i, j;
+       struct intel_engine_cs *engine;
+       int ret;
 
        /* Carefully retire all requests without writing to the rings */
-       for_each_ring(ring, dev_priv, i) {
-               ret = intel_ring_idle(ring);
+       for_each_engine(engine, dev_priv) {
+               ret = intel_engine_idle(engine);
                if (ret)
                        return ret;
        }
        i915_gem_retire_requests(dev);
 
        /* Finally reset hw state */
-       for_each_ring(ring, dev_priv, i) {
-               intel_ring_init_seqno(ring, seqno);
-
-               for (j = 0; j < ARRAY_SIZE(ring->semaphore.sync_seqno); j++)
-                       ring->semaphore.sync_seqno[j] = 0;
-       }
+       for_each_engine(engine, dev_priv)
+               intel_ring_init_seqno(engine, seqno);
 
        return 0;
 }
@@ -2542,7 +2569,7 @@ void __i915_add_request(struct drm_i915_gem_request *request,
                        struct drm_i915_gem_object *obj,
                        bool flush_caches)
 {
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct drm_i915_private *dev_priv;
        struct intel_ringbuffer *ringbuf;
        u32 request_start;
@@ -2551,8 +2578,8 @@ void __i915_add_request(struct drm_i915_gem_request *request,
        if (WARN_ON(request == NULL))
                return;
 
-       ring = request->ring;
-       dev_priv = ring->dev->dev_private;
+       engine = request->engine;
+       dev_priv = request->i915;
        ringbuf = request->ringbuf;
 
        /*
@@ -2579,6 +2606,28 @@ void __i915_add_request(struct drm_i915_gem_request *request,
                WARN(ret, "*_ring_flush_all_caches failed: %d!\n", ret);
        }
 
+       trace_i915_gem_request_add(request);
+
+       request->head = request_start;
+
+       /* Whilst this request exists, batch_obj will be on the
+        * active_list, and so will hold the active reference. Only when this
+        * request is retired will the the batch_obj be moved onto the
+        * inactive_list and lose its active reference. Hence we do not need
+        * to explicitly hold another reference here.
+        */
+       request->batch_obj = obj;
+
+       /* Seal the request and mark it as pending execution. Note that
+        * we may inspect this state, without holding any locks, during
+        * hangcheck. Hence we apply the barrier to ensure that we do not
+        * see a more recent value in the hws than we are tracking.
+        */
+       request->emitted_jiffies = jiffies;
+       request->previous_seqno = engine->last_submitted_seqno;
+       smp_store_mb(engine->last_submitted_seqno, request->seqno);
+       list_add_tail(&request->list, &engine->request_list);
+
        /* Record the position of the start of the request so that
         * should we detect the updated seqno part-way through the
         * GPU processing the request, we never over-estimate the
@@ -2587,33 +2636,16 @@ void __i915_add_request(struct drm_i915_gem_request *request,
        request->postfix = intel_ring_get_tail(ringbuf);
 
        if (i915.enable_execlists)
-               ret = ring->emit_request(request);
+               ret = engine->emit_request(request);
        else {
-               ret = ring->add_request(request);
+               ret = engine->add_request(request);
 
                request->tail = intel_ring_get_tail(ringbuf);
        }
        /* Not allowed to fail! */
        WARN(ret, "emit|add_request failed: %d!\n", ret);
 
-       request->head = request_start;
-
-       /* Whilst this request exists, batch_obj will be on the
-        * active_list, and so will hold the active reference. Only when this
-        * request is retired will the the batch_obj be moved onto the
-        * inactive_list and lose its active reference. Hence we do not need
-        * to explicitly hold another reference here.
-        */
-       request->batch_obj = obj;
-
-       request->emitted_jiffies = jiffies;
-       request->previous_seqno = ring->last_submitted_seqno;
-       ring->last_submitted_seqno = request->seqno;
-       list_add_tail(&request->list, &ring->request_list);
-
-       trace_i915_gem_request_add(request);
-
-       i915_queue_hangcheck(ring->dev);
+       i915_queue_hangcheck(engine->dev);
 
        queue_delayed_work(dev_priv->wq,
                           &dev_priv->mm.retire_work,
@@ -2680,7 +2712,7 @@ void i915_gem_request_free(struct kref *req_ref)
 
        if (ctx) {
                if (i915.enable_execlists && ctx != req->i915->kernel_context)
-                       intel_lr_context_unpin(ctx, req->ring);
+                       intel_lr_context_unpin(ctx, req->engine);
 
                i915_gem_context_unreference(ctx);
        }
@@ -2689,11 +2721,12 @@ void i915_gem_request_free(struct kref *req_ref)
 }
 
 static inline int
-__i915_gem_request_alloc(struct intel_engine_cs *ring,
+__i915_gem_request_alloc(struct intel_engine_cs *engine,
                         struct intel_context *ctx,
                         struct drm_i915_gem_request **req_out)
 {
-       struct drm_i915_private *dev_priv = to_i915(ring->dev);
+       struct drm_i915_private *dev_priv = to_i915(engine->dev);
+       unsigned reset_counter = i915_reset_counter(&dev_priv->gpu_error);
        struct drm_i915_gem_request *req;
        int ret;
 
@@ -2702,17 +2735,26 @@ __i915_gem_request_alloc(struct intel_engine_cs *ring,
 
        *req_out = NULL;
 
+       /* ABI: Before userspace accesses the GPU (e.g. execbuffer), report
+        * EIO if the GPU is already wedged, or EAGAIN to drop the struct_mutex
+        * and restart.
+        */
+       ret = i915_gem_check_wedge(reset_counter, dev_priv->mm.interruptible);
+       if (ret)
+               return ret;
+
        req = kmem_cache_zalloc(dev_priv->requests, GFP_KERNEL);
        if (req == NULL)
                return -ENOMEM;
 
-       ret = i915_gem_get_seqno(ring->dev, &req->seqno);
+       ret = i915_gem_get_seqno(engine->dev, &req->seqno);
        if (ret)
                goto err;
 
        kref_init(&req->ref);
        req->i915 = dev_priv;
-       req->ring = ring;
+       req->engine = engine;
+       req->reset_counter = reset_counter;
        req->ctx  = ctx;
        i915_gem_context_reference(req->ctx);
 
@@ -2742,7 +2784,8 @@ __i915_gem_request_alloc(struct intel_engine_cs *ring,
                 * fully prepared. Thus it can be cleaned up using the proper
                 * free code.
                 */
-               i915_gem_request_cancel(req);
+               intel_ring_reserved_space_cancel(req->ringbuf);
+               i915_gem_request_unreference(req);
                return ret;
        }
 
@@ -2779,19 +2822,12 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
        return err ? ERR_PTR(err) : req;
 }
 
-void i915_gem_request_cancel(struct drm_i915_gem_request *req)
-{
-       intel_ring_reserved_space_cancel(req->ringbuf);
-
-       i915_gem_request_unreference(req);
-}
-
 struct drm_i915_gem_request *
-i915_gem_find_active_request(struct intel_engine_cs *ring)
+i915_gem_find_active_request(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *request;
 
-       list_for_each_entry(request, &ring->request_list, list) {
+       list_for_each_entry(request, &engine->request_list, list) {
                if (i915_gem_request_completed(request, false))
                        continue;
 
@@ -2801,38 +2837,38 @@ i915_gem_find_active_request(struct intel_engine_cs *ring)
        return NULL;
 }
 
-static void i915_gem_reset_ring_status(struct drm_i915_private *dev_priv,
-                                      struct intel_engine_cs *ring)
+static void i915_gem_reset_engine_status(struct drm_i915_private *dev_priv,
+                                      struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *request;
        bool ring_hung;
 
-       request = i915_gem_find_active_request(ring);
+       request = i915_gem_find_active_request(engine);
 
        if (request == NULL)
                return;
 
-       ring_hung = ring->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG;
+       ring_hung = engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG;
 
        i915_set_reset_status(dev_priv, request->ctx, ring_hung);
 
-       list_for_each_entry_continue(request, &ring->request_list, list)
+       list_for_each_entry_continue(request, &engine->request_list, list)
                i915_set_reset_status(dev_priv, request->ctx, false);
 }
 
-static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
-                                       struct intel_engine_cs *ring)
+static void i915_gem_reset_engine_cleanup(struct drm_i915_private *dev_priv,
+                                       struct intel_engine_cs *engine)
 {
        struct intel_ringbuffer *buffer;
 
-       while (!list_empty(&ring->active_list)) {
+       while (!list_empty(&engine->active_list)) {
                struct drm_i915_gem_object *obj;
 
-               obj = list_first_entry(&ring->active_list,
+               obj = list_first_entry(&engine->active_list,
                                       struct drm_i915_gem_object,
-                                      ring_list[ring->id]);
+                                      engine_list[engine->id]);
 
-               i915_gem_object_retire__read(obj, ring->id);
+               i915_gem_object_retire__read(obj, engine->id);
        }
 
        /*
@@ -2842,14 +2878,16 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
         */
 
        if (i915.enable_execlists) {
-               spin_lock_irq(&ring->execlist_lock);
+               /* Ensure irq handler finishes or is cancelled. */
+               tasklet_kill(&engine->irq_tasklet);
 
+               spin_lock_bh(&engine->execlist_lock);
                /* list_splice_tail_init checks for empty lists */
-               list_splice_tail_init(&ring->execlist_queue,
-                                     &ring->execlist_retired_req_list);
+               list_splice_tail_init(&engine->execlist_queue,
+                                     &engine->execlist_retired_req_list);
+               spin_unlock_bh(&engine->execlist_lock);
 
-               spin_unlock_irq(&ring->execlist_lock);
-               intel_execlists_retire_requests(ring);
+               intel_execlists_retire_requests(engine);
        }
 
        /*
@@ -2859,10 +2897,10 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
         * implicit references on things like e.g. ppgtt address spaces through
         * the request.
         */
-       while (!list_empty(&ring->request_list)) {
+       while (!list_empty(&engine->request_list)) {
                struct drm_i915_gem_request *request;
 
-               request = list_first_entry(&ring->request_list,
+               request = list_first_entry(&engine->request_list,
                                           struct drm_i915_gem_request,
                                           list);
 
@@ -2876,28 +2914,29 @@ static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv,
         * upon reset is less than when we start. Do one more pass over
         * all the ringbuffers to reset last_retired_head.
         */
-       list_for_each_entry(buffer, &ring->buffers, link) {
+       list_for_each_entry(buffer, &engine->buffers, link) {
                buffer->last_retired_head = buffer->tail;
                intel_ring_update_space(buffer);
        }
+
+       intel_ring_init_seqno(engine, engine->last_submitted_seqno);
 }
 
 void i915_gem_reset(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
        /*
         * Before we free the objects from the requests, we need to inspect
         * them for finding the guilty party. As the requests only borrow
         * their reference to the objects, the inspection must be done first.
         */
-       for_each_ring(ring, dev_priv, i)
-               i915_gem_reset_ring_status(dev_priv, ring);
+       for_each_engine(engine, dev_priv)
+               i915_gem_reset_engine_status(dev_priv, engine);
 
-       for_each_ring(ring, dev_priv, i)
-               i915_gem_reset_ring_cleanup(dev_priv, ring);
+       for_each_engine(engine, dev_priv)
+               i915_gem_reset_engine_cleanup(dev_priv, engine);
 
        i915_gem_context_reset(dev);
 
@@ -2910,19 +2949,19 @@ void i915_gem_reset(struct drm_device *dev)
  * This function clears the request list as sequence numbers are passed.
  */
 void
-i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
+i915_gem_retire_requests_ring(struct intel_engine_cs *engine)
 {
-       WARN_ON(i915_verify_lists(ring->dev));
+       WARN_ON(i915_verify_lists(engine->dev));
 
        /* Retire requests first as we use it above for the early return.
         * If we retire requests last, we may use a later seqno and so clear
         * the requests lists without clearing the active list, leading to
         * confusion.
         */
-       while (!list_empty(&ring->request_list)) {
+       while (!list_empty(&engine->request_list)) {
                struct drm_i915_gem_request *request;
 
-               request = list_first_entry(&ring->request_list,
+               request = list_first_entry(&engine->request_list,
                                           struct drm_i915_gem_request,
                                           list);
 
@@ -2936,45 +2975,44 @@ i915_gem_retire_requests_ring(struct intel_engine_cs *ring)
         * by the ringbuffer to the flushing/inactive lists as appropriate,
         * before we free the context associated with the requests.
         */
-       while (!list_empty(&ring->active_list)) {
+       while (!list_empty(&engine->active_list)) {
                struct drm_i915_gem_object *obj;
 
-               obj = list_first_entry(&ring->active_list,
-                                     struct drm_i915_gem_object,
-                                     ring_list[ring->id]);
+               obj = list_first_entry(&engine->active_list,
+                                      struct drm_i915_gem_object,
+                                      engine_list[engine->id]);
 
-               if (!list_empty(&obj->last_read_req[ring->id]->list))
+               if (!list_empty(&obj->last_read_req[engine->id]->list))
                        break;
 
-               i915_gem_object_retire__read(obj, ring->id);
+               i915_gem_object_retire__read(obj, engine->id);
        }
 
-       if (unlikely(ring->trace_irq_req &&
-                    i915_gem_request_completed(ring->trace_irq_req, true))) {
-               ring->irq_put(ring);
-               i915_gem_request_assign(&ring->trace_irq_req, NULL);
+       if (unlikely(engine->trace_irq_req &&
+                    i915_gem_request_completed(engine->trace_irq_req, true))) {
+               engine->irq_put(engine);
+               i915_gem_request_assign(&engine->trace_irq_req, NULL);
        }
 
-       WARN_ON(i915_verify_lists(ring->dev));
+       WARN_ON(i915_verify_lists(engine->dev));
 }
 
 bool
 i915_gem_retire_requests(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        bool idle = true;
-       int i;
 
-       for_each_ring(ring, dev_priv, i) {
-               i915_gem_retire_requests_ring(ring);
-               idle &= list_empty(&ring->request_list);
+       for_each_engine(engine, dev_priv) {
+               i915_gem_retire_requests_ring(engine);
+               idle &= list_empty(&engine->request_list);
                if (i915.enable_execlists) {
-                       spin_lock_irq(&ring->execlist_lock);
-                       idle &= list_empty(&ring->execlist_queue);
-                       spin_unlock_irq(&ring->execlist_lock);
+                       spin_lock_bh(&engine->execlist_lock);
+                       idle &= list_empty(&engine->execlist_queue);
+                       spin_unlock_bh(&engine->execlist_lock);
 
-                       intel_execlists_retire_requests(ring);
+                       intel_execlists_retire_requests(engine);
                }
        }
 
@@ -3011,25 +3049,21 @@ i915_gem_idle_work_handler(struct work_struct *work)
        struct drm_i915_private *dev_priv =
                container_of(work, typeof(*dev_priv), mm.idle_work.work);
        struct drm_device *dev = dev_priv->dev;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i)
-               if (!list_empty(&ring->request_list))
+       for_each_engine(engine, dev_priv)
+               if (!list_empty(&engine->request_list))
                        return;
 
        /* we probably should sync with hangcheck here, using cancel_work_sync.
-        * Also locking seems to be fubar here, ring->request_list is protected
+        * Also locking seems to be fubar here, engine->request_list is protected
         * by dev->struct_mutex. */
 
        intel_mark_idle(dev);
 
        if (mutex_trylock(&dev->struct_mutex)) {
-               struct intel_engine_cs *ring;
-               int i;
-
-               for_each_ring(ring, dev_priv, i)
-                       i915_gem_batch_pool_fini(&ring->batch_pool);
+               for_each_engine(engine, dev_priv)
+                       i915_gem_batch_pool_fini(&engine->batch_pool);
 
                mutex_unlock(&dev->struct_mutex);
        }
@@ -3048,7 +3082,7 @@ i915_gem_object_flush_active(struct drm_i915_gem_object *obj)
        if (!obj->active)
                return 0;
 
-       for (i = 0; i < I915_NUM_RINGS; i++) {
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
                struct drm_i915_gem_request *req;
 
                req = obj->last_read_req[i];
@@ -3093,11 +3127,9 @@ retire:
 int
 i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_gem_wait *args = data;
        struct drm_i915_gem_object *obj;
-       struct drm_i915_gem_request *req[I915_NUM_RINGS];
-       unsigned reset_counter;
+       struct drm_i915_gem_request *req[I915_NUM_ENGINES];
        int i, n = 0;
        int ret;
 
@@ -3108,7 +3140,7 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->bo_handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->bo_handle));
        if (&obj->base == NULL) {
                mutex_unlock(&dev->struct_mutex);
                return -ENOENT;
@@ -3131,9 +3163,8 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
        }
 
        drm_gem_object_unreference(&obj->base);
-       reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
 
-       for (i = 0; i < I915_NUM_RINGS; i++) {
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
                if (obj->last_read_req[i] == NULL)
                        continue;
 
@@ -3144,7 +3175,7 @@ i915_gem_wait_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
 
        for (i = 0; i < n; i++) {
                if (ret == 0)
-                       ret = __i915_wait_request(req[i], reset_counter, true,
+                       ret = __i915_wait_request(req[i], true,
                                                  args->timeout_ns > 0 ? &args->timeout_ns : NULL,
                                                  to_rps_client(file));
                i915_gem_request_unreference__unlocked(req[i]);
@@ -3166,7 +3197,7 @@ __i915_gem_object_sync(struct drm_i915_gem_object *obj,
        struct intel_engine_cs *from;
        int ret;
 
-       from = i915_gem_request_get_ring(from_req);
+       from = i915_gem_request_get_engine(from_req);
        if (to == from)
                return 0;
 
@@ -3176,7 +3207,6 @@ __i915_gem_object_sync(struct drm_i915_gem_object *obj,
        if (!i915_semaphore_is_enabled(obj->base.dev)) {
                struct drm_i915_private *i915 = to_i915(obj->base.dev);
                ret = __i915_wait_request(from_req,
-                                         atomic_read(&i915->gpu_error.reset_counter),
                                          i915->mm.interruptible,
                                          NULL,
                                          &i915->rps.semaphores);
@@ -3260,7 +3290,7 @@ i915_gem_object_sync(struct drm_i915_gem_object *obj,
                     struct drm_i915_gem_request **to_req)
 {
        const bool readonly = obj->base.pending_write_domain == 0;
-       struct drm_i915_gem_request *req[I915_NUM_RINGS];
+       struct drm_i915_gem_request *req[I915_NUM_ENGINES];
        int ret, i, n;
 
        if (!obj->active)
@@ -3274,7 +3304,7 @@ i915_gem_object_sync(struct drm_i915_gem_object *obj,
                if (obj->last_write_req)
                        req[n++] = obj->last_write_req;
        } else {
-               for (i = 0; i < I915_NUM_RINGS; i++)
+               for (i = 0; i < I915_NUM_ENGINES; i++)
                        if (obj->last_read_req[i])
                                req[n++] = obj->last_read_req[i];
        }
@@ -3297,9 +3327,6 @@ static void i915_gem_object_finish_gtt(struct drm_i915_gem_object *obj)
        if ((obj->base.read_domains & I915_GEM_DOMAIN_GTT) == 0)
                return;
 
-       /* Wait for any direct GTT access to complete */
-       mb();
-
        old_read_domains = obj->base.read_domains;
        old_write_domain = obj->base.write_domain;
 
@@ -3391,28 +3418,25 @@ int __i915_vma_unbind_no_wait(struct i915_vma *vma)
 int i915_gpu_idle(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int ret, i;
+       struct intel_engine_cs *engine;
+       int ret;
 
        /* Flush everything onto the inactive list. */
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                if (!i915.enable_execlists) {
                        struct drm_i915_gem_request *req;
 
-                       req = i915_gem_request_alloc(ring, NULL);
+                       req = i915_gem_request_alloc(engine, NULL);
                        if (IS_ERR(req))
                                return PTR_ERR(req);
 
                        ret = i915_switch_context(req);
-                       if (ret) {
-                               i915_gem_request_cancel(req);
-                               return ret;
-                       }
-
                        i915_add_request_no_flush(req);
+                       if (ret)
+                               return ret;
                }
 
-               ret = intel_ring_idle(ring);
+               ret = intel_engine_idle(engine);
                if (ret)
                        return ret;
        }
@@ -3466,7 +3490,8 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj,
                           uint64_t flags)
 {
        struct drm_device *dev = obj->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        u32 fence_alignment, unfenced_alignment;
        u32 search_flag, alloc_flag;
        u64 start, end;
@@ -3513,7 +3538,7 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj,
        start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0;
        end = vm->total;
        if (flags & PIN_MAPPABLE)
-               end = min_t(u64, end, dev_priv->gtt.mappable_end);
+               end = min_t(u64, end, ggtt->mappable_end);
        if (flags & PIN_ZONE_4G)
                end = min_t(u64, end, (1ULL << 32) - PAGE_SIZE);
 
@@ -3720,6 +3745,9 @@ i915_gem_object_flush_cpu_write_domain(struct drm_i915_gem_object *obj)
 int
 i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
 {
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        uint32_t old_write_domain, old_read_domains;
        struct i915_vma *vma;
        int ret;
@@ -3774,7 +3802,7 @@ i915_gem_object_set_to_gtt_domain(struct drm_i915_gem_object *obj, bool write)
        vma = i915_gem_obj_to_ggtt(obj);
        if (vma && drm_mm_node_allocated(&vma->node) && !obj->active)
                list_move_tail(&vma->vm_link,
-                              &to_i915(obj->base.dev)->gtt.base.inactive_list);
+                              &ggtt->base.inactive_list);
 
        return 0;
 }
@@ -3906,7 +3934,7 @@ int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data,
        struct drm_i915_gem_caching *args = data;
        struct drm_i915_gem_object *obj;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
 
@@ -3949,7 +3977,7 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
                 * cacheline, whereas normally such cachelines would get
                 * invalidated.
                 */
-               if (IS_BXT_REVID(dev, 0, BXT_REVID_A1))
+               if (!HAS_LLC(dev) && !HAS_SNOOP(dev))
                        return -ENODEV;
 
                level = I915_CACHE_LLC;
@@ -3967,7 +3995,7 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
        if (ret)
                goto rpm_put;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -4128,16 +4156,15 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
        struct drm_i915_file_private *file_priv = file->driver_priv;
        unsigned long recent_enough = jiffies - DRM_I915_THROTTLE_JIFFIES;
        struct drm_i915_gem_request *request, *target = NULL;
-       unsigned reset_counter;
        int ret;
 
        ret = i915_gem_wait_for_error(&dev_priv->gpu_error);
        if (ret)
                return ret;
 
-       ret = i915_gem_check_wedge(&dev_priv->gpu_error, false);
-       if (ret)
-               return ret;
+       /* ABI: return -EIO if already wedged */
+       if (i915_terminally_wedged(&dev_priv->gpu_error))
+               return -EIO;
 
        spin_lock(&file_priv->mm.lock);
        list_for_each_entry(request, &file_priv->mm.request_list, client_list) {
@@ -4153,7 +4180,6 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
 
                target = request;
        }
-       reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
        if (target)
                i915_gem_request_reference(target);
        spin_unlock(&file_priv->mm.lock);
@@ -4161,7 +4187,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
        if (target == NULL)
                return 0;
 
-       ret = __i915_wait_request(target, reset_counter, true, NULL, NULL);
+       ret = __i915_wait_request(target, true, NULL, NULL);
        if (ret == 0)
                queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, 0);
 
@@ -4211,7 +4237,7 @@ void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
                     (vma->node.start & (fence_alignment - 1)) == 0);
 
        mappable = (vma->node.start + fence_size <=
-                   to_i915(obj->base.dev)->gtt.mappable_end);
+                   to_i915(obj->base.dev)->ggtt.mappable_end);
 
        obj->map_and_fenceable = mappable && fenceable;
 }
@@ -4243,9 +4269,6 @@ i915_gem_object_do_pin(struct drm_i915_gem_object *obj,
        vma = ggtt_view ? i915_gem_obj_to_ggtt_view(obj, ggtt_view) :
                          i915_gem_obj_to_vma(obj, vm);
 
-       if (IS_ERR(vma))
-               return PTR_ERR(vma);
-
        if (vma) {
                if (WARN_ON(vma->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT))
                        return -EBUSY;
@@ -4308,10 +4331,13 @@ i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj,
                         uint32_t alignment,
                         uint64_t flags)
 {
-       if (WARN_ONCE(!view, "no view specified"))
-               return -EINVAL;
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+
+       BUG_ON(!view);
 
-       return i915_gem_object_do_pin(obj, i915_obj_to_ggtt(obj), view,
+       return i915_gem_object_do_pin(obj, &ggtt->base, view,
                                      alignment, flags | PIN_GLOBAL);
 }
 
@@ -4321,7 +4347,6 @@ i915_gem_object_ggtt_unpin_view(struct drm_i915_gem_object *obj,
 {
        struct i915_vma *vma = i915_gem_obj_to_ggtt_view(obj, view);
 
-       BUG_ON(!vma);
        WARN_ON(vma->pin_count == 0);
        WARN_ON(!i915_gem_obj_ggtt_bound_view(obj, view));
 
@@ -4340,7 +4365,7 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -4359,15 +4384,15 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
        if (obj->active) {
                int i;
 
-               for (i = 0; i < I915_NUM_RINGS; i++) {
+               for (i = 0; i < I915_NUM_ENGINES; i++) {
                        struct drm_i915_gem_request *req;
 
                        req = obj->last_read_req[i];
                        if (req)
-                               args->busy |= 1 << (16 + req->ring->exec_id);
+                               args->busy |= 1 << (16 + req->engine->exec_id);
                }
                if (obj->last_write_req)
-                       args->busy |= obj->last_write_req->ring->exec_id;
+                       args->busy |= obj->last_write_req->engine->exec_id;
        }
 
 unref:
@@ -4405,7 +4430,7 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
        if (ret)
                return ret;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file_priv, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file_priv, args->handle));
        if (&obj->base == NULL) {
                ret = -ENOENT;
                goto unlock;
@@ -4447,8 +4472,8 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj,
        int i;
 
        INIT_LIST_HEAD(&obj->global_list);
-       for (i = 0; i < I915_NUM_RINGS; i++)
-               INIT_LIST_HEAD(&obj->ring_list[i]);
+       for (i = 0; i < I915_NUM_ENGINES; i++)
+               INIT_LIST_HEAD(&obj->engine_list[i]);
        INIT_LIST_HEAD(&obj->obj_exec_link);
        INIT_LIST_HEAD(&obj->vma_list);
        INIT_LIST_HEAD(&obj->batch_pool_link);
@@ -4623,14 +4648,15 @@ struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
 struct i915_vma *i915_gem_obj_to_ggtt_view(struct drm_i915_gem_object *obj,
                                           const struct i915_ggtt_view *view)
 {
-       struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_vma *vma;
 
-       if (WARN_ONCE(!view, "no view specified"))
-               return ERR_PTR(-EINVAL);
+       BUG_ON(!view);
 
        list_for_each_entry(vma, &obj->vma_list, obj_link)
-               if (vma->vm == ggtt &&
+               if (vma->vm == &ggtt->base &&
                    i915_ggtt_view_equal(&vma->ggtt_view, view))
                        return vma;
        return NULL;
@@ -4653,14 +4679,13 @@ void i915_gem_vma_destroy(struct i915_vma *vma)
 }
 
 static void
-i915_gem_stop_ringbuffers(struct drm_device *dev)
+i915_gem_stop_engines(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i)
-               dev_priv->gt.stop_ring(ring);
+       for_each_engine(engine, dev_priv)
+               dev_priv->gt.stop_engine(engine);
 }
 
 int
@@ -4676,7 +4701,7 @@ i915_gem_suspend(struct drm_device *dev)
 
        i915_gem_retire_requests(dev);
 
-       i915_gem_stop_ringbuffers(dev);
+       i915_gem_stop_engines(dev);
        mutex_unlock(&dev->struct_mutex);
 
        cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work);
@@ -4697,8 +4722,8 @@ err:
 
 int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
 {
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = req->engine;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 *remap_info = dev_priv->l3_parity.remap_info[slice];
        int i, ret;
@@ -4716,12 +4741,12 @@ int i915_gem_l3_remap(struct drm_i915_gem_request *req, int slice)
         * at initialization time.
         */
        for (i = 0; i < GEN7_L3LOG_SIZE / 4; i++) {
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, GEN7_L3LOG(slice, i));
-               intel_ring_emit(ring, remap_info[i]);
+               intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+               intel_ring_emit_reg(engine, GEN7_L3LOG(slice, i));
+               intel_ring_emit(engine, remap_info[i]);
        }
 
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return ret;
 }
@@ -4778,7 +4803,7 @@ static void init_unused_rings(struct drm_device *dev)
        }
 }
 
-int i915_gem_init_rings(struct drm_device *dev)
+int i915_gem_init_engines(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
@@ -4814,13 +4839,13 @@ int i915_gem_init_rings(struct drm_device *dev)
        return 0;
 
 cleanup_vebox_ring:
-       intel_cleanup_ring_buffer(&dev_priv->ring[VECS]);
+       intel_cleanup_engine(&dev_priv->engine[VECS]);
 cleanup_blt_ring:
-       intel_cleanup_ring_buffer(&dev_priv->ring[BCS]);
+       intel_cleanup_engine(&dev_priv->engine[BCS]);
 cleanup_bsd_ring:
-       intel_cleanup_ring_buffer(&dev_priv->ring[VCS]);
+       intel_cleanup_engine(&dev_priv->engine[VCS]);
 cleanup_render_ring:
-       intel_cleanup_ring_buffer(&dev_priv->ring[RCS]);
+       intel_cleanup_engine(&dev_priv->engine[RCS]);
 
        return ret;
 }
@@ -4829,8 +4854,8 @@ int
 i915_gem_init_hw(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int ret, i, j;
+       struct intel_engine_cs *engine;
+       int ret, j;
 
        if (INTEL_INFO(dev)->gen < 6 && !intel_enable_gtt())
                return -EIO;
@@ -4838,7 +4863,7 @@ i915_gem_init_hw(struct drm_device *dev)
        /* Double layer security blanket, see i915_gem_init() */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 
-       if (dev_priv->ellc_size)
+       if (HAS_EDRAM(dev) && INTEL_GEN(dev_priv) < 9)
                I915_WRITE(HSW_IDICR, I915_READ(HSW_IDICR) | IDIHASHMSK(0xf));
 
        if (IS_HASWELL(dev))
@@ -4876,12 +4901,14 @@ i915_gem_init_hw(struct drm_device *dev)
        }
 
        /* Need to do basic initialisation of all rings first: */
-       for_each_ring(ring, dev_priv, i) {
-               ret = ring->init_hw(ring);
+       for_each_engine(engine, dev_priv) {
+               ret = engine->init_hw(engine);
                if (ret)
                        goto out;
        }
 
+       intel_mocs_init_l3cc_table(dev);
+
        /* We can't enable contexts until all firmware is loaded */
        if (HAS_GUC_UCODE(dev)) {
                ret = intel_guc_ucode_load(dev);
@@ -4901,38 +4928,39 @@ i915_gem_init_hw(struct drm_device *dev)
                goto out;
 
        /* Now it is safe to go back round and do everything else: */
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                struct drm_i915_gem_request *req;
 
-               req = i915_gem_request_alloc(ring, NULL);
+               req = i915_gem_request_alloc(engine, NULL);
                if (IS_ERR(req)) {
                        ret = PTR_ERR(req);
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
+                       break;
                }
 
-               if (ring->id == RCS) {
-                       for (j = 0; j < NUM_L3_SLICES(dev); j++)
-                               i915_gem_l3_remap(req, j);
+               if (engine->id == RCS) {
+                       for (j = 0; j < NUM_L3_SLICES(dev); j++) {
+                               ret = i915_gem_l3_remap(req, j);
+                               if (ret)
+                                       goto err_request;
+                       }
                }
 
                ret = i915_ppgtt_init_ring(req);
-               if (ret && ret != -EIO) {
-                       DRM_ERROR("PPGTT enable ring #%d failed %d\n", i, ret);
-                       i915_gem_request_cancel(req);
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
-               }
+               if (ret)
+                       goto err_request;
 
                ret = i915_gem_context_enable(req);
-               if (ret && ret != -EIO) {
-                       DRM_ERROR("Context enable ring #%d failed %d\n", i, ret);
-                       i915_gem_request_cancel(req);
-                       i915_gem_cleanup_ringbuffer(dev);
-                       goto out;
-               }
+               if (ret)
+                       goto err_request;
 
+err_request:
                i915_add_request_no_flush(req);
+               if (ret) {
+                       DRM_ERROR("Failed to enable %s, error=%d\n",
+                                 engine->name, ret);
+                       i915_gem_cleanup_engines(dev);
+                       break;
+               }
        }
 
 out:
@@ -4952,14 +4980,14 @@ int i915_gem_init(struct drm_device *dev)
 
        if (!i915.enable_execlists) {
                dev_priv->gt.execbuf_submit = i915_gem_ringbuffer_submission;
-               dev_priv->gt.init_rings = i915_gem_init_rings;
-               dev_priv->gt.cleanup_ring = intel_cleanup_ring_buffer;
-               dev_priv->gt.stop_ring = intel_stop_ring_buffer;
+               dev_priv->gt.init_engines = i915_gem_init_engines;
+               dev_priv->gt.cleanup_engine = intel_cleanup_engine;
+               dev_priv->gt.stop_engine = intel_stop_engine;
        } else {
                dev_priv->gt.execbuf_submit = intel_execlists_submission;
-               dev_priv->gt.init_rings = intel_logical_rings_init;
-               dev_priv->gt.cleanup_ring = intel_logical_ring_cleanup;
-               dev_priv->gt.stop_ring = intel_logical_ring_stop;
+               dev_priv->gt.init_engines = intel_logical_rings_init;
+               dev_priv->gt.cleanup_engine = intel_logical_ring_cleanup;
+               dev_priv->gt.stop_engine = intel_logical_ring_stop;
        }
 
        /* This is just a security blanket to placate dragons.
@@ -4974,13 +5002,13 @@ int i915_gem_init(struct drm_device *dev)
        if (ret)
                goto out_unlock;
 
-       i915_gem_init_global_gtt(dev);
+       i915_gem_init_ggtt(dev);
 
        ret = i915_gem_context_init(dev);
        if (ret)
                goto out_unlock;
 
-       ret = dev_priv->gt.init_rings(dev);
+       ret = dev_priv->gt.init_engines(dev);
        if (ret)
                goto out_unlock;
 
@@ -5003,29 +5031,52 @@ out_unlock:
 }
 
 void
-i915_gem_cleanup_ringbuffer(struct drm_device *dev)
+i915_gem_cleanup_engines(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i)
-               dev_priv->gt.cleanup_ring(ring);
+       for_each_engine(engine, dev_priv)
+               dev_priv->gt.cleanup_engine(engine);
 
-    if (i915.enable_execlists)
-            /*
-             * Neither the BIOS, ourselves or any other kernel
-             * expects the system to be in execlists mode on startup,
-             * so we need to reset the GPU back to legacy mode.
-             */
-            intel_gpu_reset(dev);
+       if (i915.enable_execlists)
+               /*
+                * Neither the BIOS, ourselves or any other kernel
+                * expects the system to be in execlists mode on startup,
+                * so we need to reset the GPU back to legacy mode.
+                */
+               intel_gpu_reset(dev, ALL_ENGINES);
 }
 
 static void
-init_ring_lists(struct intel_engine_cs *ring)
+init_engine_lists(struct intel_engine_cs *engine)
 {
-       INIT_LIST_HEAD(&ring->active_list);
-       INIT_LIST_HEAD(&ring->request_list);
+       INIT_LIST_HEAD(&engine->active_list);
+       INIT_LIST_HEAD(&engine->request_list);
+}
+
+void
+i915_gem_load_init_fences(struct drm_i915_private *dev_priv)
+{
+       struct drm_device *dev = dev_priv->dev;
+
+       if (INTEL_INFO(dev_priv)->gen >= 7 && !IS_VALLEYVIEW(dev_priv) &&
+           !IS_CHERRYVIEW(dev_priv))
+               dev_priv->num_fence_regs = 32;
+       else if (INTEL_INFO(dev_priv)->gen >= 4 || IS_I945G(dev_priv) ||
+                IS_I945GM(dev_priv) || IS_G33(dev_priv))
+               dev_priv->num_fence_regs = 16;
+       else
+               dev_priv->num_fence_regs = 8;
+
+       if (intel_vgpu_active(dev))
+               dev_priv->num_fence_regs =
+                               I915_READ(vgtif_reg(avail_rs.fence_num));
+
+       /* Initialize fence registers to zero */
+       i915_gem_restore_fences(dev);
+
+       i915_gem_detect_bit_6_swizzle(dev);
 }
 
 void
@@ -5055,8 +5106,8 @@ i915_gem_load_init(struct drm_device *dev)
        INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
        INIT_LIST_HEAD(&dev_priv->mm.bound_list);
        INIT_LIST_HEAD(&dev_priv->mm.fence_list);
-       for (i = 0; i < I915_NUM_RINGS; i++)
-               init_ring_lists(&dev_priv->ring[i]);
+       for (i = 0; i < I915_NUM_ENGINES; i++)
+               init_engine_lists(&dev_priv->engine[i]);
        for (i = 0; i < I915_MAX_NUM_FENCES; i++)
                INIT_LIST_HEAD(&dev_priv->fence_regs[i].lru_list);
        INIT_DELAYED_WORK(&dev_priv->mm.retire_work,
@@ -5067,17 +5118,6 @@ i915_gem_load_init(struct drm_device *dev)
 
        dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL;
 
-       if (INTEL_INFO(dev)->gen >= 7 && !IS_VALLEYVIEW(dev) && !IS_CHERRYVIEW(dev))
-               dev_priv->num_fence_regs = 32;
-       else if (INTEL_INFO(dev)->gen >= 4 || IS_I945G(dev) || IS_I945GM(dev) || IS_G33(dev))
-               dev_priv->num_fence_regs = 16;
-       else
-               dev_priv->num_fence_regs = 8;
-
-       if (intel_vgpu_active(dev))
-               dev_priv->num_fence_regs =
-                               I915_READ(vgtif_reg(avail_rs.fence_num));
-
        /*
         * Set initial sequence number for requests.
         * Using this number allows the wraparound to happen early,
@@ -5086,11 +5126,8 @@ i915_gem_load_init(struct drm_device *dev)
        dev_priv->next_seqno = ((u32)~0 - 0x1100);
        dev_priv->last_seqno = ((u32)~0 - 0x1101);
 
-       /* Initialize fence registers to zero */
        INIT_LIST_HEAD(&dev_priv->mm.fence_list);
-       i915_gem_restore_fences(dev);
 
-       i915_gem_detect_bit_6_swizzle(dev);
        init_waitqueue_head(&dev_priv->pending_flip_queue);
 
        dev_priv->mm.interruptible = true;
@@ -5213,11 +5250,12 @@ u64 i915_gem_obj_offset(struct drm_i915_gem_object *o,
 u64 i915_gem_obj_ggtt_offset_view(struct drm_i915_gem_object *o,
                                  const struct i915_ggtt_view *view)
 {
-       struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
+       struct drm_i915_private *dev_priv = to_i915(o->base.dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_vma *vma;
 
        list_for_each_entry(vma, &o->vma_list, obj_link)
-               if (vma->vm == ggtt &&
+               if (vma->vm == &ggtt->base &&
                    i915_ggtt_view_equal(&vma->ggtt_view, view))
                        return vma->node.start;
 
@@ -5244,11 +5282,12 @@ bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
 bool i915_gem_obj_ggtt_bound_view(struct drm_i915_gem_object *o,
                                  const struct i915_ggtt_view *view)
 {
-       struct i915_address_space *ggtt = i915_obj_to_ggtt(o);
+       struct drm_i915_private *dev_priv = to_i915(o->base.dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_vma *vma;
 
        list_for_each_entry(vma, &o->vma_list, obj_link)
-               if (vma->vm == ggtt &&
+               if (vma->vm == &ggtt->base &&
                    i915_ggtt_view_equal(&vma->ggtt_view, view) &&
                    drm_mm_node_allocated(&vma->node))
                        return true;
diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
new file mode 100644 (file)
index 0000000..8292e79
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright © 2016 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 __I915_GEM_H__
+#define __I915_GEM_H__
+
+#ifdef CONFIG_DRM_I915_DEBUG_GEM
+#define GEM_BUG_ON(expr) BUG_ON(expr)
+#else
+#define GEM_BUG_ON(expr)
+#endif
+
+#endif /* __I915_GEM_H__ */
index 5dd84e148bbac2f5e7066990b23033785ff2bced..e5acc3916f75fa4dda6024a4f9c97c504d452349 100644 (file)
@@ -342,15 +342,15 @@ void i915_gem_context_reset(struct drm_device *dev)
                struct intel_context *ctx;
 
                list_for_each_entry(ctx, &dev_priv->context_list, link)
-                       intel_lr_context_reset(dev, ctx);
+                       intel_lr_context_reset(dev_priv, ctx);
        }
 
-       for (i = 0; i < I915_NUM_RINGS; i++) {
-               struct intel_engine_cs *ring = &dev_priv->ring[i];
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
+               struct intel_engine_cs *engine = &dev_priv->engine[i];
 
-               if (ring->last_context) {
-                       i915_gem_context_unpin(ring->last_context, ring);
-                       ring->last_context = NULL;
+               if (engine->last_context) {
+                       i915_gem_context_unpin(engine->last_context, engine);
+                       engine->last_context = NULL;
                }
        }
 
@@ -413,7 +413,7 @@ void i915_gem_context_fini(struct drm_device *dev)
                /* The only known way to stop the gpu from accessing the hw context is
                 * to reset it. Do this as the very last operation to avoid confusing
                 * other code, leading to spurious errors. */
-               intel_gpu_reset(dev);
+               intel_gpu_reset(dev, ALL_ENGINES);
 
                /* When default context is created and switched to, base object refcount
                 * will be 2 (+1 from object creation and +1 from do_switch()).
@@ -421,17 +421,17 @@ void i915_gem_context_fini(struct drm_device *dev)
                 * to default context. So we need to unreference the base object once
                 * to offset the do_switch part, so that i915_gem_context_unreference()
                 * can then free the base object correctly. */
-               WARN_ON(!dev_priv->ring[RCS].last_context);
+               WARN_ON(!dev_priv->engine[RCS].last_context);
 
                i915_gem_object_ggtt_unpin(dctx->legacy_hw_ctx.rcs_state);
        }
 
-       for (i = I915_NUM_RINGS; --i >= 0;) {
-               struct intel_engine_cs *ring = &dev_priv->ring[i];
+       for (i = I915_NUM_ENGINES; --i >= 0;) {
+               struct intel_engine_cs *engine = &dev_priv->engine[i];
 
-               if (ring->last_context) {
-                       i915_gem_context_unpin(ring->last_context, ring);
-                       ring->last_context = NULL;
+               if (engine->last_context) {
+                       i915_gem_context_unpin(engine->last_context, engine);
+                       engine->last_context = NULL;
                }
        }
 
@@ -441,14 +441,14 @@ void i915_gem_context_fini(struct drm_device *dev)
 
 int i915_gem_context_enable(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        if (i915.enable_execlists) {
-               if (ring->init_context == NULL)
+               if (engine->init_context == NULL)
                        return 0;
 
-               ret = ring->init_context(req);
+               ret = engine->init_context(req);
        } else
                ret = i915_switch_context(req);
 
@@ -510,133 +510,147 @@ i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id)
 static inline int
 mi_set_context(struct drm_i915_gem_request *req, u32 hw_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        u32 flags = hw_flags | MI_MM_SPACE_GTT;
        const int num_rings =
                /* Use an extended w/a on ivb+ if signalling from other rings */
-               i915_semaphore_is_enabled(ring->dev) ?
-               hweight32(INTEL_INFO(ring->dev)->ring_mask) - 1 :
+               i915_semaphore_is_enabled(engine->dev) ?
+               hweight32(INTEL_INFO(engine->dev)->ring_mask) - 1 :
                0;
-       int len, i, ret;
+       int len, ret;
 
        /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB
         * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value
         * explicitly, so we rely on the value at ring init, stored in
         * itlb_before_ctx_switch.
         */
-       if (IS_GEN6(ring->dev)) {
-               ret = ring->flush(req, I915_GEM_GPU_DOMAINS, 0);
+       if (IS_GEN6(engine->dev)) {
+               ret = engine->flush(req, I915_GEM_GPU_DOMAINS, 0);
                if (ret)
                        return ret;
        }
 
        /* These flags are for resource streamer on HSW+ */
-       if (IS_HASWELL(ring->dev) || INTEL_INFO(ring->dev)->gen >= 8)
+       if (IS_HASWELL(engine->dev) || INTEL_INFO(engine->dev)->gen >= 8)
                flags |= (HSW_MI_RS_SAVE_STATE_EN | HSW_MI_RS_RESTORE_STATE_EN);
-       else if (INTEL_INFO(ring->dev)->gen < 8)
+       else if (INTEL_INFO(engine->dev)->gen < 8)
                flags |= (MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN);
 
 
        len = 4;
-       if (INTEL_INFO(ring->dev)->gen >= 7)
-               len += 2 + (num_rings ? 4*num_rings + 2 : 0);
+       if (INTEL_INFO(engine->dev)->gen >= 7)
+               len += 2 + (num_rings ? 4*num_rings + 6 : 0);
 
        ret = intel_ring_begin(req, len);
        if (ret)
                return ret;
 
        /* WaProgramMiArbOnOffAroundMiSetContext:ivb,vlv,hsw,bdw,chv */
-       if (INTEL_INFO(ring->dev)->gen >= 7) {
-               intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_DISABLE);
+       if (INTEL_INFO(engine->dev)->gen >= 7) {
+               intel_ring_emit(engine, MI_ARB_ON_OFF | MI_ARB_DISABLE);
                if (num_rings) {
                        struct intel_engine_cs *signaller;
 
-                       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings));
-                       for_each_ring(signaller, to_i915(ring->dev), i) {
-                               if (signaller == ring)
+                       intel_ring_emit(engine,
+                                       MI_LOAD_REGISTER_IMM(num_rings));
+                       for_each_engine(signaller, to_i915(engine->dev)) {
+                               if (signaller == engine)
                                        continue;
 
-                               intel_ring_emit_reg(ring, RING_PSMI_CTL(signaller->mmio_base));
-                               intel_ring_emit(ring, _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
+                               intel_ring_emit_reg(engine,
+                                                   RING_PSMI_CTL(signaller->mmio_base));
+                               intel_ring_emit(engine,
+                                               _MASKED_BIT_ENABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
                        }
                }
        }
 
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_emit(ring, MI_SET_CONTEXT);
-       intel_ring_emit(ring, i915_gem_obj_ggtt_offset(req->ctx->legacy_hw_ctx.rcs_state) |
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_emit(engine, MI_SET_CONTEXT);
+       intel_ring_emit(engine,
+                       i915_gem_obj_ggtt_offset(req->ctx->legacy_hw_ctx.rcs_state) |
                        flags);
        /*
         * w/a: MI_SET_CONTEXT must always be followed by MI_NOOP
         * WaMiSetContext_Hang:snb,ivb,vlv
         */
-       intel_ring_emit(ring, MI_NOOP);
+       intel_ring_emit(engine, MI_NOOP);
 
-       if (INTEL_INFO(ring->dev)->gen >= 7) {
+       if (INTEL_INFO(engine->dev)->gen >= 7) {
                if (num_rings) {
                        struct intel_engine_cs *signaller;
+                       i915_reg_t last_reg = {}; /* keep gcc quiet */
 
-                       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(num_rings));
-                       for_each_ring(signaller, to_i915(ring->dev), i) {
-                               if (signaller == ring)
+                       intel_ring_emit(engine,
+                                       MI_LOAD_REGISTER_IMM(num_rings));
+                       for_each_engine(signaller, to_i915(engine->dev)) {
+                               if (signaller == engine)
                                        continue;
 
-                               intel_ring_emit_reg(ring, RING_PSMI_CTL(signaller->mmio_base));
-                               intel_ring_emit(ring, _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
+                               last_reg = RING_PSMI_CTL(signaller->mmio_base);
+                               intel_ring_emit_reg(engine, last_reg);
+                               intel_ring_emit(engine,
+                                               _MASKED_BIT_DISABLE(GEN6_PSMI_SLEEP_MSG_DISABLE));
                        }
+
+                       /* Insert a delay before the next switch! */
+                       intel_ring_emit(engine,
+                                       MI_STORE_REGISTER_MEM |
+                                       MI_SRM_LRM_GLOBAL_GTT);
+                       intel_ring_emit_reg(engine, last_reg);
+                       intel_ring_emit(engine, engine->scratch.gtt_offset);
+                       intel_ring_emit(engine, MI_NOOP);
                }
-               intel_ring_emit(ring, MI_ARB_ON_OFF | MI_ARB_ENABLE);
+               intel_ring_emit(engine, MI_ARB_ON_OFF | MI_ARB_ENABLE);
        }
 
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return ret;
 }
 
-static inline bool should_skip_switch(struct intel_engine_cs *ring,
-                                     struct intel_context *from,
-                                     struct intel_context *to)
+static inline bool skip_rcs_switch(struct intel_engine_cs *engine,
+                                  struct intel_context *to)
 {
        if (to->remap_slice)
                return false;
 
-       if (to->ppgtt && from == to &&
-           !(intel_ring_flag(ring) & to->ppgtt->pd_dirty_rings))
-               return true;
+       if (!to->legacy_hw_ctx.initialized)
+               return false;
 
-       return false;
+       if (to->ppgtt &&
+           !(intel_engine_flag(engine) & to->ppgtt->pd_dirty_rings))
+               return false;
+
+       return to == engine->last_context;
 }
 
 static bool
-needs_pd_load_pre(struct intel_engine_cs *ring, struct intel_context *to)
+needs_pd_load_pre(struct intel_engine_cs *engine, struct intel_context *to)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-
        if (!to->ppgtt)
                return false;
 
-       if (INTEL_INFO(ring->dev)->gen < 8)
+       if (engine->last_context == to &&
+           !(intel_engine_flag(engine) & to->ppgtt->pd_dirty_rings))
+               return false;
+
+       if (engine->id != RCS)
                return true;
 
-       if (ring != &dev_priv->ring[RCS])
+       if (INTEL_INFO(engine->dev)->gen < 8)
                return true;
 
        return false;
 }
 
 static bool
-needs_pd_load_post(struct intel_engine_cs *ring, struct intel_context *to,
-               u32 hw_flags)
+needs_pd_load_post(struct intel_context *to, u32 hw_flags)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-
        if (!to->ppgtt)
                return false;
 
-       if (!IS_GEN8(ring->dev))
-               return false;
-
-       if (ring != &dev_priv->ring[RCS])
+       if (!IS_GEN8(to->i915))
                return false;
 
        if (hw_flags & MI_RESTORE_INHIBIT)
@@ -645,58 +659,32 @@ needs_pd_load_post(struct intel_engine_cs *ring, struct intel_context *to,
        return false;
 }
 
-static int do_switch(struct drm_i915_gem_request *req)
+static int do_rcs_switch(struct drm_i915_gem_request *req)
 {
        struct intel_context *to = req->ctx;
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-       struct intel_context *from = ring->last_context;
-       u32 hw_flags = 0;
-       bool uninitialized = false;
+       struct intel_engine_cs *engine = req->engine;
+       struct intel_context *from;
+       u32 hw_flags;
        int ret, i;
 
-       if (from != NULL && ring == &dev_priv->ring[RCS]) {
-               BUG_ON(from->legacy_hw_ctx.rcs_state == NULL);
-               BUG_ON(!i915_gem_obj_is_pinned(from->legacy_hw_ctx.rcs_state));
-       }
-
-       if (should_skip_switch(ring, from, to))
+       if (skip_rcs_switch(engine, to))
                return 0;
 
        /* Trying to pin first makes error handling easier. */
-       if (ring == &dev_priv->ring[RCS]) {
-               ret = i915_gem_obj_ggtt_pin(to->legacy_hw_ctx.rcs_state,
-                                           get_context_alignment(ring->dev), 0);
-               if (ret)
-                       return ret;
-       }
+       ret = i915_gem_obj_ggtt_pin(to->legacy_hw_ctx.rcs_state,
+                                   get_context_alignment(engine->dev),
+                                   0);
+       if (ret)
+               return ret;
 
        /*
         * Pin can switch back to the default context if we end up calling into
         * evict_everything - as a last ditch gtt defrag effort that also
         * switches to the default context. Hence we need to reload from here.
+        *
+        * XXX: Doing so is painfully broken!
         */
-       from = ring->last_context;
-
-       if (needs_pd_load_pre(ring, to)) {
-               /* Older GENs and non render rings still want the load first,
-                * "PP_DCLV followed by PP_DIR_BASE register through Load
-                * Register Immediate commands in Ring Buffer before submitting
-                * a context."*/
-               trace_switch_mm(ring, to);
-               ret = to->ppgtt->switch_mm(to->ppgtt, req);
-               if (ret)
-                       goto unpin_out;
-
-               /* Doing a PD load always reloads the page dirs */
-               to->ppgtt->pd_dirty_rings &= ~intel_ring_flag(ring);
-       }
-
-       if (ring != &dev_priv->ring[RCS]) {
-               if (from)
-                       i915_gem_context_unreference(from);
-               goto done;
-       }
+       from = engine->last_context;
 
        /*
         * Clear this page out of any CPU caches for coherent swap-in/out. Note
@@ -710,53 +698,37 @@ static int do_switch(struct drm_i915_gem_request *req)
        if (ret)
                goto unpin_out;
 
-       if (!to->legacy_hw_ctx.initialized || i915_gem_context_is_default(to)) {
-               hw_flags |= MI_RESTORE_INHIBIT;
+       if (needs_pd_load_pre(engine, to)) {
+               /* Older GENs and non render rings still want the load first,
+                * "PP_DCLV followed by PP_DIR_BASE register through Load
+                * Register Immediate commands in Ring Buffer before submitting
+                * a context."*/
+               trace_switch_mm(engine, to);
+               ret = to->ppgtt->switch_mm(to->ppgtt, req);
+               if (ret)
+                       goto unpin_out;
+       }
+
+       if (!to->legacy_hw_ctx.initialized || i915_gem_context_is_default(to))
                /* NB: If we inhibit the restore, the context is not allowed to
                 * die because future work may end up depending on valid address
                 * space. This means we must enforce that a page table load
                 * occur when this occurs. */
-       } else if (to->ppgtt &&
-                  (intel_ring_flag(ring) & to->ppgtt->pd_dirty_rings)) {
-               hw_flags |= MI_FORCE_RESTORE;
-               to->ppgtt->pd_dirty_rings &= ~intel_ring_flag(ring);
-       }
+               hw_flags = MI_RESTORE_INHIBIT;
+       else if (to->ppgtt &&
+                intel_engine_flag(engine) & to->ppgtt->pd_dirty_rings)
+               hw_flags = MI_FORCE_RESTORE;
+       else
+               hw_flags = 0;
 
        /* We should never emit switch_mm more than once */
-       WARN_ON(needs_pd_load_pre(ring, to) &&
-               needs_pd_load_post(ring, to, hw_flags));
-
-       ret = mi_set_context(req, hw_flags);
-       if (ret)
-               goto unpin_out;
+       WARN_ON(needs_pd_load_pre(engine, to) &&
+               needs_pd_load_post(to, hw_flags));
 
-       /* GEN8 does *not* require an explicit reload if the PDPs have been
-        * setup, and we do not wish to move them.
-        */
-       if (needs_pd_load_post(ring, to, hw_flags)) {
-               trace_switch_mm(ring, to);
-               ret = to->ppgtt->switch_mm(to->ppgtt, req);
-               /* The hardware context switch is emitted, but we haven't
-                * actually changed the state - so it's probably safe to bail
-                * here. Still, let the user know something dangerous has
-                * happened.
-                */
-               if (ret) {
-                       DRM_ERROR("Failed to change address space on context switch\n");
-                       goto unpin_out;
-               }
-       }
-
-       for (i = 0; i < MAX_L3_SLICES; i++) {
-               if (!(to->remap_slice & (1<<i)))
-                       continue;
-
-               ret = i915_gem_l3_remap(req, i);
-               /* If it failed, try again next round */
+       if (to != from || (hw_flags & MI_FORCE_RESTORE)) {
+               ret = mi_set_context(req, hw_flags);
                if (ret)
-                       DRM_DEBUG_DRIVER("L3 remapping failed\n");
-               else
-                       to->remap_slice &= ~(1<<i);
+                       goto unpin_out;
        }
 
        /* The backing object for the context is done after switching to the
@@ -781,27 +753,51 @@ static int do_switch(struct drm_i915_gem_request *req)
                i915_gem_object_ggtt_unpin(from->legacy_hw_ctx.rcs_state);
                i915_gem_context_unreference(from);
        }
+       i915_gem_context_reference(to);
+       engine->last_context = to;
+
+       /* GEN8 does *not* require an explicit reload if the PDPs have been
+        * setup, and we do not wish to move them.
+        */
+       if (needs_pd_load_post(to, hw_flags)) {
+               trace_switch_mm(engine, to);
+               ret = to->ppgtt->switch_mm(to->ppgtt, req);
+               /* The hardware context switch is emitted, but we haven't
+                * actually changed the state - so it's probably safe to bail
+                * here. Still, let the user know something dangerous has
+                * happened.
+                */
+               if (ret)
+                       return ret;
+       }
 
-       uninitialized = !to->legacy_hw_ctx.initialized;
-       to->legacy_hw_ctx.initialized = true;
+       if (to->ppgtt)
+               to->ppgtt->pd_dirty_rings &= ~intel_engine_flag(engine);
 
-done:
-       i915_gem_context_reference(to);
-       ring->last_context = to;
+       for (i = 0; i < MAX_L3_SLICES; i++) {
+               if (!(to->remap_slice & (1<<i)))
+                       continue;
+
+               ret = i915_gem_l3_remap(req, i);
+               if (ret)
+                       return ret;
 
-       if (uninitialized) {
-               if (ring->init_context) {
-                       ret = ring->init_context(req);
+               to->remap_slice &= ~(1<<i);
+       }
+
+       if (!to->legacy_hw_ctx.initialized) {
+               if (engine->init_context) {
+                       ret = engine->init_context(req);
                        if (ret)
-                               DRM_ERROR("ring init context: %d\n", ret);
+                               return ret;
                }
+               to->legacy_hw_ctx.initialized = true;
        }
 
        return 0;
 
 unpin_out:
-       if (ring->id == RCS)
-               i915_gem_object_ggtt_unpin(to->legacy_hw_ctx.rcs_state);
+       i915_gem_object_ggtt_unpin(to->legacy_hw_ctx.rcs_state);
        return ret;
 }
 
@@ -820,23 +816,39 @@ unpin_out:
  */
 int i915_switch_context(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct intel_engine_cs *engine = req->engine;
+       struct drm_i915_private *dev_priv = req->i915;
 
        WARN_ON(i915.enable_execlists);
        WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex));
 
-       if (req->ctx->legacy_hw_ctx.rcs_state == NULL) { /* We have the fake context */
-               if (req->ctx != ring->last_context) {
-                       i915_gem_context_reference(req->ctx);
-                       if (ring->last_context)
-                               i915_gem_context_unreference(ring->last_context);
-                       ring->last_context = req->ctx;
+       if (engine->id != RCS ||
+           req->ctx->legacy_hw_ctx.rcs_state == NULL) {
+               struct intel_context *to = req->ctx;
+
+               if (needs_pd_load_pre(engine, to)) {
+                       int ret;
+
+                       trace_switch_mm(engine, to);
+                       ret = to->ppgtt->switch_mm(to->ppgtt, req);
+                       if (ret)
+                               return ret;
+
+                       /* Doing a PD load always reloads the page dirs */
+                       to->ppgtt->pd_dirty_rings &= ~intel_engine_flag(engine);
                }
+
+               if (to != engine->last_context) {
+                       i915_gem_context_reference(to);
+                       if (engine->last_context)
+                               i915_gem_context_unreference(engine->last_context);
+                       engine->last_context = to;
+               }
+
                return 0;
        }
 
-       return do_switch(req);
+       return do_rcs_switch(req);
 }
 
 static bool contexts_enabled(struct drm_device *dev)
@@ -937,7 +949,7 @@ int i915_gem_context_getparam_ioctl(struct drm_device *dev, void *data,
                else if (to_i915(dev)->mm.aliasing_ppgtt)
                        args->value = to_i915(dev)->mm.aliasing_ppgtt->base.total;
                else
-                       args->value = to_i915(dev)->gtt.base.total;
+                       args->value = to_i915(dev)->ggtt.base.total;
                break;
        default:
                ret = -EINVAL;
index 17299d04189fcc91b30b703787174914681bcdbf..a5651648239457a66d83d01fc1064b74d5a0aac0 100644 (file)
@@ -36,29 +36,29 @@ i915_verify_lists(struct drm_device *dev)
        static int warned;
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct drm_i915_gem_object *obj;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        int err = 0;
-       int i;
 
        if (warned)
                return 0;
 
-       for_each_ring(ring, dev_priv, i) {
-               list_for_each_entry(obj, &ring->active_list, ring_list[ring->id]) {
+       for_each_engine(engine, dev_priv) {
+               list_for_each_entry(obj, &engine->active_list,
+                                   engine_list[engine->id]) {
                        if (obj->base.dev != dev ||
                            !atomic_read(&obj->base.refcount.refcount)) {
                                DRM_ERROR("%s: freed active obj %p\n",
-                                         ring->name, obj);
+                                         engine->name, obj);
                                err++;
                                break;
                        } else if (!obj->active ||
-                                  obj->last_read_req[ring->id] == NULL) {
+                                  obj->last_read_req[engine->id] == NULL) {
                                DRM_ERROR("%s: invalid active obj %p\n",
-                                         ring->name, obj);
+                                         engine->name, obj);
                                err++;
                        } else if (obj->base.write_domain) {
                                DRM_ERROR("%s: invalid write obj %p (w %x)\n",
-                                         ring->name,
+                                         engine->name,
                                          obj, obj->base.write_domain);
                                err++;
                        }
index 0506016e18e0d7a7abf6ca4fe421fa18fa88960d..80bbe43a2e92a5b363d46d784fda9accd6f8d3f9 100644 (file)
@@ -95,14 +95,12 @@ static void i915_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(attachment->dmabuf);
 
-       mutex_lock(&obj->base.dev->struct_mutex);
-
        dma_unmap_sg(attachment->dev, sg->sgl, sg->nents, dir);
        sg_free_table(sg);
        kfree(sg);
 
+       mutex_lock(&obj->base.dev->struct_mutex);
        i915_gem_object_unpin_pages(obj);
-
        mutex_unlock(&obj->base.dev->struct_mutex);
 }
 
@@ -110,51 +108,17 @@ static void *i915_gem_dmabuf_vmap(struct dma_buf *dma_buf)
 {
        struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
        struct drm_device *dev = obj->base.dev;
-       struct sg_page_iter sg_iter;
-       struct page **pages;
-       int ret, i;
+       void *addr;
+       int ret;
 
        ret = i915_mutex_lock_interruptible(dev);
        if (ret)
                return ERR_PTR(ret);
 
-       if (obj->dma_buf_vmapping) {
-               obj->vmapping_count++;
-               goto out_unlock;
-       }
-
-       ret = i915_gem_object_get_pages(obj);
-       if (ret)
-               goto err;
-
-       i915_gem_object_pin_pages(obj);
-
-       ret = -ENOMEM;
-
-       pages = drm_malloc_ab(obj->base.size >> PAGE_SHIFT, sizeof(*pages));
-       if (pages == NULL)
-               goto err_unpin;
-
-       i = 0;
-       for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0)
-               pages[i++] = sg_page_iter_page(&sg_iter);
-
-       obj->dma_buf_vmapping = vmap(pages, i, 0, PAGE_KERNEL);
-       drm_free_large(pages);
-
-       if (!obj->dma_buf_vmapping)
-               goto err_unpin;
-
-       obj->vmapping_count = 1;
-out_unlock:
+       addr = i915_gem_object_pin_map(obj);
        mutex_unlock(&dev->struct_mutex);
-       return obj->dma_buf_vmapping;
 
-err_unpin:
-       i915_gem_object_unpin_pages(obj);
-err:
-       mutex_unlock(&dev->struct_mutex);
-       return ERR_PTR(ret);
+       return addr;
 }
 
 static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
@@ -163,12 +127,7 @@ static void i915_gem_dmabuf_vunmap(struct dma_buf *dma_buf, void *vaddr)
        struct drm_device *dev = obj->base.dev;
 
        mutex_lock(&dev->struct_mutex);
-       if (--obj->vmapping_count == 0) {
-               vunmap(obj->dma_buf_vmapping);
-               obj->dma_buf_vmapping = NULL;
-
-               i915_gem_object_unpin_pages(obj);
-       }
+       i915_gem_object_unpin_map(obj);
        mutex_unlock(&dev->struct_mutex);
 }
 
index d4d7c88ab595436cce00b48bbd7b5d5c6cf83d31..33df74d98269c83bf6fa6d45f852839a959ff724 100644 (file)
@@ -313,7 +313,8 @@ relocate_entry_gtt(struct drm_i915_gem_object *obj,
                   uint64_t target_offset)
 {
        struct drm_device *dev = obj->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        uint64_t delta = relocation_target(reloc, target_offset);
        uint64_t offset;
        void __iomem *reloc_page;
@@ -330,7 +331,7 @@ relocate_entry_gtt(struct drm_i915_gem_object *obj,
        /* Map the page containing the relocation we're going to perform.  */
        offset = i915_gem_obj_ggtt_offset(obj);
        offset += reloc->offset;
-       reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
+       reloc_page = io_mapping_map_atomic_wc(ggtt->mappable,
                                              offset & PAGE_MASK);
        iowrite32(lower_32_bits(delta), reloc_page + offset_in_page(offset));
 
@@ -340,7 +341,7 @@ relocate_entry_gtt(struct drm_i915_gem_object *obj,
                if (offset_in_page(offset) == 0) {
                        io_mapping_unmap_atomic(reloc_page);
                        reloc_page =
-                               io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
+                               io_mapping_map_atomic_wc(ggtt->mappable,
                                                         offset);
                }
 
@@ -597,7 +598,7 @@ static bool only_mappable_for_reloc(unsigned int flags)
 
 static int
 i915_gem_execbuffer_reserve_vma(struct i915_vma *vma,
-                               struct intel_engine_cs *ring,
+                               struct intel_engine_cs *engine,
                                bool *need_reloc)
 {
        struct drm_i915_gem_object *obj = vma->obj;
@@ -711,7 +712,7 @@ eb_vma_misplaced(struct i915_vma *vma)
 }
 
 static int
-i915_gem_execbuffer_reserve(struct intel_engine_cs *ring,
+i915_gem_execbuffer_reserve(struct intel_engine_cs *engine,
                            struct list_head *vmas,
                            struct intel_context *ctx,
                            bool *need_relocs)
@@ -721,10 +722,10 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *ring,
        struct i915_address_space *vm;
        struct list_head ordered_vmas;
        struct list_head pinned_vmas;
-       bool has_fenced_gpu_access = INTEL_INFO(ring->dev)->gen < 4;
+       bool has_fenced_gpu_access = INTEL_INFO(engine->dev)->gen < 4;
        int retry;
 
-       i915_gem_retire_requests_ring(ring);
+       i915_gem_retire_requests_ring(engine);
 
        vm = list_first_entry(vmas, struct i915_vma, exec_list)->vm;
 
@@ -786,7 +787,9 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *ring,
                        if (eb_vma_misplaced(vma))
                                ret = i915_vma_unbind(vma);
                        else
-                               ret = i915_gem_execbuffer_reserve_vma(vma, ring, need_relocs);
+                               ret = i915_gem_execbuffer_reserve_vma(vma,
+                                                                     engine,
+                                                                     need_relocs);
                        if (ret)
                                goto err;
                }
@@ -796,7 +799,8 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *ring,
                        if (drm_mm_node_allocated(&vma->node))
                                continue;
 
-                       ret = i915_gem_execbuffer_reserve_vma(vma, ring, need_relocs);
+                       ret = i915_gem_execbuffer_reserve_vma(vma, engine,
+                                                             need_relocs);
                        if (ret)
                                goto err;
                }
@@ -819,7 +823,7 @@ static int
 i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
                                  struct drm_i915_gem_execbuffer2 *args,
                                  struct drm_file *file,
-                                 struct intel_engine_cs *ring,
+                                 struct intel_engine_cs *engine,
                                  struct eb_vmas *eb,
                                  struct drm_i915_gem_exec_object2 *exec,
                                  struct intel_context *ctx)
@@ -908,7 +912,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,
                goto err;
 
        need_relocs = (args->flags & I915_EXEC_NO_RELOC) == 0;
-       ret = i915_gem_execbuffer_reserve(ring, &eb->vmas, ctx, &need_relocs);
+       ret = i915_gem_execbuffer_reserve(engine, &eb->vmas, ctx,
+                                         &need_relocs);
        if (ret)
                goto err;
 
@@ -936,7 +941,7 @@ static int
 i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req,
                                struct list_head *vmas)
 {
-       const unsigned other_rings = ~intel_ring_flag(req->ring);
+       const unsigned other_rings = ~intel_engine_flag(req->engine);
        struct i915_vma *vma;
        uint32_t flush_domains = 0;
        bool flush_chipset = false;
@@ -946,7 +951,7 @@ i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req,
                struct drm_i915_gem_object *obj = vma->obj;
 
                if (obj->active & other_rings) {
-                       ret = i915_gem_object_sync(obj, req->ring, &req);
+                       ret = i915_gem_object_sync(obj, req->engine, &req);
                        if (ret)
                                return ret;
                }
@@ -958,7 +963,7 @@ i915_gem_execbuffer_move_to_gpu(struct drm_i915_gem_request *req,
        }
 
        if (flush_chipset)
-               i915_gem_chipset_flush(req->ring->dev);
+               i915_gem_chipset_flush(req->engine->dev);
 
        if (flush_domains & I915_GEM_DOMAIN_GTT)
                wmb();
@@ -1060,12 +1065,12 @@ validate_exec_list(struct drm_device *dev,
 
 static struct intel_context *
 i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
-                         struct intel_engine_cs *ring, const u32 ctx_id)
+                         struct intel_engine_cs *engine, const u32 ctx_id)
 {
        struct intel_context *ctx = NULL;
        struct i915_ctx_hang_stats *hs;
 
-       if (ring->id != RCS && ctx_id != DEFAULT_CONTEXT_HANDLE)
+       if (engine->id != RCS && ctx_id != DEFAULT_CONTEXT_HANDLE)
                return ERR_PTR(-EINVAL);
 
        ctx = i915_gem_context_get(file->driver_priv, ctx_id);
@@ -1078,8 +1083,8 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
                return ERR_PTR(-EIO);
        }
 
-       if (i915.enable_execlists && !ctx->engine[ring->id].state) {
-               int ret = intel_lr_context_deferred_alloc(ctx, ring);
+       if (i915.enable_execlists && !ctx->engine[engine->id].state) {
+               int ret = intel_lr_context_deferred_alloc(ctx, engine);
                if (ret) {
                        DRM_DEBUG("Could not create LRC %u: %d\n", ctx_id, ret);
                        return ERR_PTR(ret);
@@ -1093,7 +1098,7 @@ void
 i915_gem_execbuffer_move_to_active(struct list_head *vmas,
                                   struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = i915_gem_request_get_ring(req);
+       struct intel_engine_cs *engine = i915_gem_request_get_engine(req);
        struct i915_vma *vma;
 
        list_for_each_entry(vma, vmas, exec_list) {
@@ -1120,7 +1125,7 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
                if (entry->flags & EXEC_OBJECT_NEEDS_FENCE) {
                        i915_gem_request_assign(&obj->last_fenced_req, req);
                        if (entry->flags & __EXEC_OBJECT_HAS_FENCE) {
-                               struct drm_i915_private *dev_priv = to_i915(ring->dev);
+                               struct drm_i915_private *dev_priv = to_i915(engine->dev);
                                list_move_tail(&dev_priv->fence_regs[obj->fence_reg].lru_list,
                                               &dev_priv->mm.fence_list);
                        }
@@ -1130,11 +1135,11 @@ i915_gem_execbuffer_move_to_active(struct list_head *vmas,
        }
 }
 
-void
+static void
 i915_gem_execbuffer_retire_commands(struct i915_execbuffer_params *params)
 {
        /* Unconditionally force add_request to emit a full flush. */
-       params->ring->gpu_caches_dirty = true;
+       params->engine->gpu_caches_dirty = true;
 
        /* Add a breadcrumb for the completion of the batch buffer */
        __i915_add_request(params->request, params->batch_obj, true);
@@ -1144,11 +1149,11 @@ static int
 i915_reset_gen7_sol_offsets(struct drm_device *dev,
                            struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret, i;
 
-       if (!IS_GEN7(dev) || ring != &dev_priv->ring[RCS]) {
+       if (!IS_GEN7(dev) || engine != &dev_priv->engine[RCS]) {
                DRM_DEBUG("sol reset is gen7/rcs only\n");
                return -EINVAL;
        }
@@ -1158,18 +1163,18 @@ i915_reset_gen7_sol_offsets(struct drm_device *dev,
                return ret;
 
        for (i = 0; i < 4; i++) {
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, GEN7_SO_WRITE_OFFSET(i));
-               intel_ring_emit(ring, 0);
+               intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+               intel_ring_emit_reg(engine, GEN7_SO_WRITE_OFFSET(i));
+               intel_ring_emit(engine, 0);
        }
 
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return 0;
 }
 
 static struct drm_i915_gem_object*
-i915_gem_execbuffer_parse(struct intel_engine_cs *ring,
+i915_gem_execbuffer_parse(struct intel_engine_cs *engine,
                          struct drm_i915_gem_exec_object2 *shadow_exec_entry,
                          struct eb_vmas *eb,
                          struct drm_i915_gem_object *batch_obj,
@@ -1181,12 +1186,12 @@ i915_gem_execbuffer_parse(struct intel_engine_cs *ring,
        struct i915_vma *vma;
        int ret;
 
-       shadow_batch_obj = i915_gem_batch_pool_get(&ring->batch_pool,
+       shadow_batch_obj = i915_gem_batch_pool_get(&engine->batch_pool,
                                                   PAGE_ALIGN(batch_len));
        if (IS_ERR(shadow_batch_obj))
                return shadow_batch_obj;
 
-       ret = i915_parse_cmds(ring,
+       ret = i915_parse_cmds(engine,
                              batch_obj,
                              shadow_batch_obj,
                              batch_start_offset,
@@ -1227,7 +1232,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
                               struct list_head *vmas)
 {
        struct drm_device *dev = params->dev;
-       struct intel_engine_cs *ring = params->ring;
+       struct intel_engine_cs *engine = params->engine;
        struct drm_i915_private *dev_priv = dev->dev_private;
        u64 exec_start, exec_len;
        int instp_mode;
@@ -1242,8 +1247,8 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
        if (ret)
                return ret;
 
-       WARN(params->ctx->ppgtt && params->ctx->ppgtt->pd_dirty_rings & (1<<ring->id),
-            "%s didn't clear reload\n", ring->name);
+       WARN(params->ctx->ppgtt && params->ctx->ppgtt->pd_dirty_rings & (1<<engine->id),
+            "%s didn't clear reload\n", engine->name);
 
        instp_mode = args->flags & I915_EXEC_CONSTANTS_MASK;
        instp_mask = I915_EXEC_CONSTANTS_MASK;
@@ -1251,7 +1256,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
        case I915_EXEC_CONSTANTS_REL_GENERAL:
        case I915_EXEC_CONSTANTS_ABSOLUTE:
        case I915_EXEC_CONSTANTS_REL_SURFACE:
-               if (instp_mode != 0 && ring != &dev_priv->ring[RCS]) {
+               if (instp_mode != 0 && engine != &dev_priv->engine[RCS]) {
                        DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
                        return -EINVAL;
                }
@@ -1278,17 +1283,17 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
                return -EINVAL;
        }
 
-       if (ring == &dev_priv->ring[RCS] &&
+       if (engine == &dev_priv->engine[RCS] &&
            instp_mode != dev_priv->relative_constants_mode) {
                ret = intel_ring_begin(params->request, 4);
                if (ret)
                        return ret;
 
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, INSTPM);
-               intel_ring_emit(ring, instp_mask << 16 | instp_mode);
-               intel_ring_advance(ring);
+               intel_ring_emit(engine, MI_NOOP);
+               intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+               intel_ring_emit_reg(engine, INSTPM);
+               intel_ring_emit(engine, instp_mask << 16 | instp_mode);
+               intel_ring_advance(engine);
 
                dev_priv->relative_constants_mode = instp_mode;
        }
@@ -1306,7 +1311,7 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
        if (exec_len == 0)
                exec_len = params->batch_obj->base.size;
 
-       ret = ring->dispatch_execbuffer(params->request,
+       ret = engine->dispatch_execbuffer(params->request,
                                        exec_start, exec_len,
                                        params->dispatch_flags);
        if (ret)
@@ -1315,7 +1320,6 @@ i915_gem_ringbuffer_submission(struct i915_execbuffer_params *params,
        trace_i915_gem_ring_dispatch(params->request, params->dispatch_flags);
 
        i915_gem_execbuffer_move_to_active(vmas, params->request);
-       i915_gem_execbuffer_retire_commands(params);
 
        return 0;
 }
@@ -1363,7 +1367,7 @@ eb_get_batch(struct eb_vmas *eb)
 
 #define I915_USER_RINGS (4)
 
-static const enum intel_ring_id user_ring_map[I915_USER_RINGS + 1] = {
+static const enum intel_engine_id user_ring_map[I915_USER_RINGS + 1] = {
        [I915_EXEC_DEFAULT]     = RCS,
        [I915_EXEC_RENDER]      = RCS,
        [I915_EXEC_BLT]         = BCS,
@@ -1406,12 +1410,12 @@ eb_select_ring(struct drm_i915_private *dev_priv,
                        return -EINVAL;
                }
 
-               *ring = &dev_priv->ring[_VCS(bsd_idx)];
+               *ring = &dev_priv->engine[_VCS(bsd_idx)];
        } else {
-               *ring = &dev_priv->ring[user_ring_map[user_ring_id]];
+               *ring = &dev_priv->engine[user_ring_map[user_ring_id]];
        }
 
-       if (!intel_ring_initialized(*ring)) {
+       if (!intel_engine_initialized(*ring)) {
                DRM_DEBUG("execbuf with invalid ring: %u\n", user_ring_id);
                return -EINVAL;
        }
@@ -1425,12 +1429,13 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                       struct drm_i915_gem_execbuffer2 *args,
                       struct drm_i915_gem_exec_object2 *exec)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_request *req = NULL;
        struct eb_vmas *eb;
        struct drm_i915_gem_object *batch_obj;
        struct drm_i915_gem_exec_object2 shadow_exec_entry;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct intel_context *ctx;
        struct i915_address_space *vm;
        struct i915_execbuffer_params params_master; /* XXX: will be removed later */
@@ -1457,7 +1462,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        if (args->flags & I915_EXEC_IS_PINNED)
                dispatch_flags |= I915_DISPATCH_PINNED;
 
-       ret = eb_select_ring(dev_priv, file, args, &ring);
+       ret = eb_select_ring(dev_priv, file, args, &engine);
        if (ret)
                return ret;
 
@@ -1471,9 +1476,9 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                        DRM_DEBUG("RS is only allowed for Haswell, Gen8 and above\n");
                        return -EINVAL;
                }
-               if (ring->id != RCS) {
+               if (engine->id != RCS) {
                        DRM_DEBUG("RS is not available on %s\n",
-                                ring->name);
+                                engine->name);
                        return -EINVAL;
                }
 
@@ -1486,7 +1491,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        if (ret)
                goto pre_mutex_err;
 
-       ctx = i915_gem_validate_context(dev, file, ring, ctx_id);
+       ctx = i915_gem_validate_context(dev, file, engine, ctx_id);
        if (IS_ERR(ctx)) {
                mutex_unlock(&dev->struct_mutex);
                ret = PTR_ERR(ctx);
@@ -1498,7 +1503,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        if (ctx->ppgtt)
                vm = &ctx->ppgtt->base;
        else
-               vm = &dev_priv->gtt.base;
+               vm = &ggtt->base;
 
        memset(&params_master, 0x00, sizeof(params_master));
 
@@ -1520,7 +1525,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
        /* Move the objects en-masse into the GTT, evicting if necessary. */
        need_relocs = (args->flags & I915_EXEC_NO_RELOC) == 0;
-       ret = i915_gem_execbuffer_reserve(ring, &eb->vmas, ctx, &need_relocs);
+       ret = i915_gem_execbuffer_reserve(engine, &eb->vmas, ctx,
+                                         &need_relocs);
        if (ret)
                goto err;
 
@@ -1529,7 +1535,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                ret = i915_gem_execbuffer_relocate(eb);
        if (ret) {
                if (ret == -EFAULT) {
-                       ret = i915_gem_execbuffer_relocate_slow(dev, args, file, ring,
+                       ret = i915_gem_execbuffer_relocate_slow(dev, args, file,
+                                                               engine,
                                                                eb, exec, ctx);
                        BUG_ON(!mutex_is_locked(&dev->struct_mutex));
                }
@@ -1545,16 +1552,16 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
        }
 
        params->args_batch_start_offset = args->batch_start_offset;
-       if (i915_needs_cmd_parser(ring) && args->batch_len) {
+       if (i915_needs_cmd_parser(engine) && args->batch_len) {
                struct drm_i915_gem_object *parsed_batch_obj;
 
-               parsed_batch_obj = i915_gem_execbuffer_parse(ring,
-                                                     &shadow_exec_entry,
-                                                     eb,
-                                                     batch_obj,
-                                                     args->batch_start_offset,
-                                                     args->batch_len,
-                                                     file->is_master);
+               parsed_batch_obj = i915_gem_execbuffer_parse(engine,
+                                                            &shadow_exec_entry,
+                                                            eb,
+                                                            batch_obj,
+                                                            args->batch_start_offset,
+                                                            args->batch_len,
+                                                            file->is_master);
                if (IS_ERR(parsed_batch_obj)) {
                        ret = PTR_ERR(parsed_batch_obj);
                        goto err;
@@ -1606,7 +1613,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
                params->batch_obj_vm_offset = i915_gem_obj_offset(batch_obj, vm);
 
        /* Allocate a request for this batch buffer nice and early. */
-       req = i915_gem_request_alloc(ring, ctx);
+       req = i915_gem_request_alloc(engine, ctx);
        if (IS_ERR(req)) {
                ret = PTR_ERR(req);
                goto err_batch_unpin;
@@ -1614,7 +1621,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
 
        ret = i915_gem_request_add_to_client(req, file);
        if (ret)
-               goto err_batch_unpin;
+               goto err_request;
 
        /*
         * Save assorted stuff away to pass through to *_submission().
@@ -1624,13 +1631,15 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
         */
        params->dev                     = dev;
        params->file                    = file;
-       params->ring                    = ring;
+       params->engine                    = engine;
        params->dispatch_flags          = dispatch_flags;
        params->batch_obj               = batch_obj;
        params->ctx                     = ctx;
        params->request                 = req;
 
        ret = dev_priv->gt.execbuf_submit(params, args, &eb->vmas);
+err_request:
+       i915_gem_execbuffer_retire_commands(params);
 
 err_batch_unpin:
        /*
@@ -1647,14 +1656,6 @@ err:
        i915_gem_context_unreference(ctx);
        eb_destroy(eb);
 
-       /*
-        * If the request was created but not successfully submitted then it
-        * must be freed again. If it was submitted then it is being tracked
-        * on the active request list and no clean up is required here.
-        */
-       if (ret && !IS_ERR_OR_NULL(req))
-               i915_gem_request_cancel(req);
-
        mutex_unlock(&dev->struct_mutex);
 
 pre_mutex_err:
@@ -1773,11 +1774,9 @@ i915_gem_execbuffer2(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       exec2_list = kmalloc(sizeof(*exec2_list)*args->buffer_count,
-                            GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
-       if (exec2_list == NULL)
-               exec2_list = drm_malloc_ab(sizeof(*exec2_list),
-                                          args->buffer_count);
+       exec2_list = drm_malloc_gfp(args->buffer_count,
+                                   sizeof(*exec2_list),
+                                   GFP_TEMPORARY);
        if (exec2_list == NULL) {
                DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
                          args->buffer_count);
index 49e4f26b79d83fc0ee84527c8b80ed31557a4370..0d666b3f7e9bad0668a5b0d9b6d461ed462a84a0 100644 (file)
@@ -658,7 +658,7 @@ static int gen8_write_pdp(struct drm_i915_gem_request *req,
                          unsigned entry,
                          dma_addr_t addr)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        BUG_ON(entry >= 4);
@@ -667,13 +667,13 @@ static int gen8_write_pdp(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-       intel_ring_emit_reg(ring, GEN8_RING_PDP_UDW(ring, entry));
-       intel_ring_emit(ring, upper_32_bits(addr));
-       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-       intel_ring_emit_reg(ring, GEN8_RING_PDP_LDW(ring, entry));
-       intel_ring_emit(ring, lower_32_bits(addr));
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+       intel_ring_emit_reg(engine, GEN8_RING_PDP_UDW(engine, entry));
+       intel_ring_emit(engine, upper_32_bits(addr));
+       intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+       intel_ring_emit_reg(engine, GEN8_RING_PDP_LDW(engine, entry));
+       intel_ring_emit(engine, lower_32_bits(addr));
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -706,8 +706,7 @@ static void gen8_ppgtt_clear_pte_range(struct i915_address_space *vm,
                                       uint64_t length,
                                       gen8_pte_t scratch_pte)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        gen8_pte_t *pt_vaddr;
        unsigned pdpe = gen8_pdpe_index(start);
        unsigned pde = gen8_pde_index(start);
@@ -746,7 +745,7 @@ static void gen8_ppgtt_clear_pte_range(struct i915_address_space *vm,
                        num_entries--;
                }
 
-               kunmap_px(ppgtt, pt);
+               kunmap_px(ppgtt, pt_vaddr);
 
                pte = 0;
                if (++pde == I915_PDES) {
@@ -762,8 +761,7 @@ static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
                                   uint64_t length,
                                   bool use_scratch)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        gen8_pte_t scratch_pte = gen8_pte_encode(px_dma(vm->scratch_page),
                                                 I915_CACHE_LLC, use_scratch);
 
@@ -788,8 +786,7 @@ gen8_ppgtt_insert_pte_entries(struct i915_address_space *vm,
                              uint64_t start,
                              enum i915_cache_level cache_level)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        gen8_pte_t *pt_vaddr;
        unsigned pdpe = gen8_pdpe_index(start);
        unsigned pde = gen8_pde_index(start);
@@ -829,8 +826,7 @@ static void gen8_ppgtt_insert_entries(struct i915_address_space *vm,
                                      enum i915_cache_level cache_level,
                                      u32 unused)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct sg_page_iter sg_iter;
 
        __sg_page_iter_start(&sg_iter, pages->sgl, sg_nents(pages->sgl), 0);
@@ -909,11 +905,10 @@ static int gen8_init_scratch(struct i915_address_space *vm)
 static int gen8_ppgtt_notify_vgt(struct i915_hw_ppgtt *ppgtt, bool create)
 {
        enum vgt_g2v_type msg;
-       struct drm_device *dev = ppgtt->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
        int i;
 
-       if (USES_FULL_48BIT_PPGTT(dev)) {
+       if (USES_FULL_48BIT_PPGTT(dev_priv)) {
                u64 daddr = px_dma(&ppgtt->pml4);
 
                I915_WRITE(vgtif_reg(pdp[0].lo), lower_32_bits(daddr));
@@ -981,8 +976,7 @@ static void gen8_ppgtt_cleanup_4lvl(struct i915_hw_ppgtt *ppgtt)
 
 static void gen8_ppgtt_cleanup(struct i915_address_space *vm)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
 
        if (intel_vgpu_active(vm->dev))
                gen8_ppgtt_notify_vgt(ppgtt, false);
@@ -1216,8 +1210,7 @@ static int gen8_alloc_va_range_3lvl(struct i915_address_space *vm,
                                    uint64_t start,
                                    uint64_t length)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        unsigned long *new_page_dirs, *new_page_tables;
        struct drm_device *dev = vm->dev;
        struct i915_page_directory *pd;
@@ -1329,8 +1322,7 @@ static int gen8_alloc_va_range_4lvl(struct i915_address_space *vm,
                                    uint64_t length)
 {
        DECLARE_BITMAP(new_pdps, GEN8_PML4ES_PER_PML4);
-       struct i915_hw_ppgtt *ppgtt =
-                       container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct i915_page_directory_pointer *pdp;
        uint64_t pml4e;
        int ret = 0;
@@ -1376,8 +1368,7 @@ err_out:
 static int gen8_alloc_va_range(struct i915_address_space *vm,
                               uint64_t start, uint64_t length)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
 
        if (USES_FULL_48BIT_PPGTT(vm->dev))
                return gen8_alloc_va_range_4lvl(vm, &ppgtt->pml4, start, length);
@@ -1629,6 +1620,7 @@ static void gen6_write_page_range(struct drm_i915_private *dev_priv,
                                  struct i915_page_directory *pd,
                                  uint32_t start, uint32_t length)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_page_table *pt;
        uint32_t pde, temp;
 
@@ -1637,7 +1629,7 @@ static void gen6_write_page_range(struct drm_i915_private *dev_priv,
 
        /* Make sure write is complete before other code can use this page
         * table. Also require for WC mapped PTEs */
-       readl(dev_priv->gtt.gsm);
+       readl(ggtt->gsm);
 }
 
 static uint32_t get_pd_offset(struct i915_hw_ppgtt *ppgtt)
@@ -1650,11 +1642,11 @@ static uint32_t get_pd_offset(struct i915_hw_ppgtt *ppgtt)
 static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
                         struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        /* NB: TLBs must be flushed and invalidated before a switch */
-       ret = ring->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
+       ret = engine->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
        if (ret)
                return ret;
 
@@ -1662,13 +1654,13 @@ static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
-       intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(ring));
-       intel_ring_emit(ring, PP_DIR_DCLV_2G);
-       intel_ring_emit_reg(ring, RING_PP_DIR_BASE(ring));
-       intel_ring_emit(ring, get_pd_offset(ppgtt));
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(2));
+       intel_ring_emit_reg(engine, RING_PP_DIR_DCLV(engine));
+       intel_ring_emit(engine, PP_DIR_DCLV_2G);
+       intel_ring_emit_reg(engine, RING_PP_DIR_BASE(engine));
+       intel_ring_emit(engine, get_pd_offset(ppgtt));
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -1676,22 +1668,22 @@ static int hsw_mm_switch(struct i915_hw_ppgtt *ppgtt,
 static int vgpu_mm_switch(struct i915_hw_ppgtt *ppgtt,
                          struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_private *dev_priv = to_i915(ppgtt->base.dev);
 
-       I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
-       I915_WRITE(RING_PP_DIR_BASE(ring), get_pd_offset(ppgtt));
+       I915_WRITE(RING_PP_DIR_DCLV(engine), PP_DIR_DCLV_2G);
+       I915_WRITE(RING_PP_DIR_BASE(engine), get_pd_offset(ppgtt));
        return 0;
 }
 
 static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
                          struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        /* NB: TLBs must be flushed and invalidated before a switch */
-       ret = ring->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
+       ret = engine->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
        if (ret)
                return ret;
 
@@ -1699,17 +1691,17 @@ static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(2));
-       intel_ring_emit_reg(ring, RING_PP_DIR_DCLV(ring));
-       intel_ring_emit(ring, PP_DIR_DCLV_2G);
-       intel_ring_emit_reg(ring, RING_PP_DIR_BASE(ring));
-       intel_ring_emit(ring, get_pd_offset(ppgtt));
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(2));
+       intel_ring_emit_reg(engine, RING_PP_DIR_DCLV(engine));
+       intel_ring_emit(engine, PP_DIR_DCLV_2G);
+       intel_ring_emit_reg(engine, RING_PP_DIR_BASE(engine));
+       intel_ring_emit(engine, get_pd_offset(ppgtt));
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        /* XXX: RCS is the only one to auto invalidate the TLBs? */
-       if (ring->id != RCS) {
-               ret = ring->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
+       if (engine->id != RCS) {
+               ret = engine->flush(req, I915_GEM_GPU_DOMAINS, I915_GEM_GPU_DOMAINS);
                if (ret)
                        return ret;
        }
@@ -1720,15 +1712,15 @@ static int gen7_mm_switch(struct i915_hw_ppgtt *ppgtt,
 static int gen6_mm_switch(struct i915_hw_ppgtt *ppgtt,
                          struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_device *dev = ppgtt->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
 
-       I915_WRITE(RING_PP_DIR_DCLV(ring), PP_DIR_DCLV_2G);
-       I915_WRITE(RING_PP_DIR_BASE(ring), get_pd_offset(ppgtt));
+       I915_WRITE(RING_PP_DIR_DCLV(engine), PP_DIR_DCLV_2G);
+       I915_WRITE(RING_PP_DIR_BASE(engine), get_pd_offset(ppgtt));
 
-       POSTING_READ(RING_PP_DIR_DCLV(ring));
+       POSTING_READ(RING_PP_DIR_DCLV(engine));
 
        return 0;
 }
@@ -1736,12 +1728,11 @@ static int gen6_mm_switch(struct i915_hw_ppgtt *ppgtt,
 static void gen8_ppgtt_enable(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int j;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, j) {
+       for_each_engine(engine, dev_priv) {
                u32 four_level = USES_FULL_48BIT_PPGTT(dev) ? GEN8_GFX_PPGTT_48B : 0;
-               I915_WRITE(RING_MODE_GEN7(ring),
+               I915_WRITE(RING_MODE_GEN7(engine),
                           _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE | four_level));
        }
 }
@@ -1749,9 +1740,8 @@ static void gen8_ppgtt_enable(struct drm_device *dev)
 static void gen7_ppgtt_enable(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        uint32_t ecochk, ecobits;
-       int i;
 
        ecobits = I915_READ(GAC_ECO_BITS);
        I915_WRITE(GAC_ECO_BITS, ecobits | ECOBITS_PPGTT_CACHE64B);
@@ -1765,9 +1755,9 @@ static void gen7_ppgtt_enable(struct drm_device *dev)
        }
        I915_WRITE(GAM_ECOCHK, ecochk);
 
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                /* GFX_MODE is per-ring on gen7+ */
-               I915_WRITE(RING_MODE_GEN7(ring),
+               I915_WRITE(RING_MODE_GEN7(engine),
                           _MASKED_BIT_ENABLE(GFX_PPGTT_ENABLE));
        }
 }
@@ -1796,8 +1786,7 @@ static void gen6_ppgtt_clear_range(struct i915_address_space *vm,
                                   uint64_t length,
                                   bool use_scratch)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        gen6_pte_t *pt_vaddr, scratch_pte;
        unsigned first_entry = start >> PAGE_SHIFT;
        unsigned num_entries = length >> PAGE_SHIFT;
@@ -1831,8 +1820,7 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
                                      uint64_t start,
                                      enum i915_cache_level cache_level, u32 flags)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        gen6_pte_t *pt_vaddr;
        unsigned first_entry = start >> PAGE_SHIFT;
        unsigned act_pt = first_entry / GEN6_PTES;
@@ -1864,9 +1852,9 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 {
        DECLARE_BITMAP(new_page_tables, I915_PDES);
        struct drm_device *dev = vm->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_hw_ppgtt *ppgtt =
-                               container_of(vm, struct i915_hw_ppgtt, base);
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct i915_page_table *pt;
        uint32_t start, length, start_save, length_save;
        uint32_t pde, temp;
@@ -1932,7 +1920,7 @@ static int gen6_alloc_va_range(struct i915_address_space *vm,
 
        /* Make sure write is complete before other code can use this page
         * table. Also require for WC mapped PTEs */
-       readl(dev_priv->gtt.gsm);
+       readl(ggtt->gsm);
 
        mark_tlbs_dirty(ppgtt);
        return 0;
@@ -1978,8 +1966,7 @@ static void gen6_free_scratch(struct i915_address_space *vm)
 
 static void gen6_ppgtt_cleanup(struct i915_address_space *vm)
 {
-       struct i915_hw_ppgtt *ppgtt =
-               container_of(vm, struct i915_hw_ppgtt, base);
+       struct i915_hw_ppgtt *ppgtt = i915_vm_to_ppgtt(vm);
        struct i915_page_table *pt;
        uint32_t pde;
 
@@ -1997,7 +1984,8 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
 {
        struct i915_address_space *vm = &ppgtt->base;
        struct drm_device *dev = ppgtt->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        bool retried = false;
        int ret;
 
@@ -2005,23 +1993,23 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
         * allocator works in address space sizes, so it's multiplied by page
         * size. We allocate at the top of the GTT to avoid fragmentation.
         */
-       BUG_ON(!drm_mm_initialized(&dev_priv->gtt.base.mm));
+       BUG_ON(!drm_mm_initialized(&ggtt->base.mm));
 
        ret = gen6_init_scratch(vm);
        if (ret)
                return ret;
 
 alloc:
-       ret = drm_mm_insert_node_in_range_generic(&dev_priv->gtt.base.mm,
+       ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm,
                                                  &ppgtt->node, GEN6_PD_SIZE,
                                                  GEN6_PD_ALIGN, 0,
-                                                 0, dev_priv->gtt.base.total,
+                                                 0, ggtt->base.total,
                                                  DRM_MM_TOPDOWN);
        if (ret == -ENOSPC && !retried) {
-               ret = i915_gem_evict_something(dev, &dev_priv->gtt.base,
+               ret = i915_gem_evict_something(dev, &ggtt->base,
                                               GEN6_PD_SIZE, GEN6_PD_ALIGN,
                                               I915_CACHE_NONE,
-                                              0, dev_priv->gtt.base.total,
+                                              0, ggtt->base.total,
                                               0);
                if (ret)
                        goto err_out;
@@ -2034,7 +2022,7 @@ alloc:
                goto err_out;
 
 
-       if (ppgtt->node.start < dev_priv->gtt.mappable_end)
+       if (ppgtt->node.start < ggtt->mappable_end)
                DRM_DEBUG("Forced to use aperture for PDEs\n");
 
        return 0;
@@ -2062,10 +2050,11 @@ static void gen6_scratch_va_range(struct i915_hw_ppgtt *ppgtt,
 static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
 {
        struct drm_device *dev = ppgtt->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
 
-       ppgtt->base.pte_encode = dev_priv->gtt.base.pte_encode;
+       ppgtt->base.pte_encode = ggtt->base.pte_encode;
        if (IS_GEN6(dev)) {
                ppgtt->switch_mm = gen6_mm_switch;
        } else if (IS_HASWELL(dev)) {
@@ -2095,7 +2084,7 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt)
        ppgtt->pd.base.ggtt_offset =
                ppgtt->node.start / PAGE_SIZE * sizeof(gen6_pte_t);
 
-       ppgtt->pd_addr = (gen6_pte_t __iomem *)dev_priv->gtt.gsm +
+       ppgtt->pd_addr = (gen6_pte_t __iomem *)ggtt->gsm +
                ppgtt->pd.base.ggtt_offset / sizeof(gen6_pte_t);
 
        gen6_scratch_va_range(ppgtt, 0, ppgtt->base.total);
@@ -2192,7 +2181,7 @@ int i915_ppgtt_init_hw(struct drm_device *dev)
 
 int i915_ppgtt_init_ring(struct drm_i915_gem_request *req)
 {
-       struct drm_i915_private *dev_priv = req->ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = req->i915;
        struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
 
        if (i915.enable_execlists)
@@ -2263,9 +2252,10 @@ static bool needs_idle_maps(struct drm_device *dev)
 
 static bool do_idling(struct drm_i915_private *dev_priv)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        bool ret = dev_priv->mm.interruptible;
 
-       if (unlikely(dev_priv->gtt.do_idle_maps)) {
+       if (unlikely(ggtt->do_idle_maps)) {
                dev_priv->mm.interruptible = false;
                if (i915_gpu_idle(dev_priv->dev)) {
                        DRM_ERROR("Couldn't idle GPU\n");
@@ -2279,22 +2269,23 @@ static bool do_idling(struct drm_i915_private *dev_priv)
 
 static void undo_idling(struct drm_i915_private *dev_priv, bool interruptible)
 {
-       if (unlikely(dev_priv->gtt.do_idle_maps))
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+
+       if (unlikely(ggtt->do_idle_maps))
                dev_priv->mm.interruptible = interruptible;
 }
 
 void i915_check_and_clear_faults(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
        if (INTEL_INFO(dev)->gen < 6)
                return;
 
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                u32 fault_reg;
-               fault_reg = I915_READ(RING_FAULT_REG(ring));
+               fault_reg = I915_READ(RING_FAULT_REG(engine));
                if (fault_reg & RING_FAULT_VALID) {
                        DRM_DEBUG_DRIVER("Unexpected fault\n"
                                         "\tAddr: 0x%08lx\n"
@@ -2305,16 +2296,16 @@ void i915_check_and_clear_faults(struct drm_device *dev)
                                         fault_reg & RING_FAULT_GTTSEL_MASK ? "GGTT" : "PPGTT",
                                         RING_FAULT_SRCID(fault_reg),
                                         RING_FAULT_FAULT_TYPE(fault_reg));
-                       I915_WRITE(RING_FAULT_REG(ring),
+                       I915_WRITE(RING_FAULT_REG(engine),
                                   fault_reg & ~RING_FAULT_VALID);
                }
        }
-       POSTING_READ(RING_FAULT_REG(&dev_priv->ring[RCS]));
+       POSTING_READ(RING_FAULT_REG(&dev_priv->engine[RCS]));
 }
 
 static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
 {
-       if (INTEL_INFO(dev_priv->dev)->gen < 6) {
+       if (INTEL_INFO(dev_priv)->gen < 6) {
                intel_gtt_chipset_flush();
        } else {
                I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
@@ -2324,7 +2315,8 @@ static void i915_ggtt_flush(struct drm_i915_private *dev_priv)
 
 void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
 
        /* Don't bother messing with faults pre GEN6 as we have little
         * documentation supporting that it's a good idea.
@@ -2334,10 +2326,8 @@ void i915_gem_suspend_gtt_mappings(struct drm_device *dev)
 
        i915_check_and_clear_faults(dev);
 
-       dev_priv->gtt.base.clear_range(&dev_priv->gtt.base,
-                                      dev_priv->gtt.base.start,
-                                      dev_priv->gtt.base.total,
-                                      true);
+       ggtt->base.clear_range(&ggtt->base, ggtt->base.start, ggtt->base.total,
+                            true);
 
        i915_ggtt_flush(dev_priv);
 }
@@ -2367,10 +2357,11 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
                                     uint64_t start,
                                     enum i915_cache_level level, u32 unused)
 {
-       struct drm_i915_private *dev_priv = vm->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(vm->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned first_entry = start >> PAGE_SHIFT;
        gen8_pte_t __iomem *gtt_entries =
-               (gen8_pte_t __iomem *)dev_priv->gtt.gsm + first_entry;
+               (gen8_pte_t __iomem *)ggtt->gsm + first_entry;
        int i = 0;
        struct sg_page_iter sg_iter;
        dma_addr_t addr = 0; /* shut up gcc */
@@ -2444,10 +2435,11 @@ static void gen6_ggtt_insert_entries(struct i915_address_space *vm,
                                     uint64_t start,
                                     enum i915_cache_level level, u32 flags)
 {
-       struct drm_i915_private *dev_priv = vm->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(vm->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned first_entry = start >> PAGE_SHIFT;
        gen6_pte_t __iomem *gtt_entries =
-               (gen6_pte_t __iomem *)dev_priv->gtt.gsm + first_entry;
+               (gen6_pte_t __iomem *)ggtt->gsm + first_entry;
        int i = 0;
        struct sg_page_iter sg_iter;
        dma_addr_t addr = 0;
@@ -2487,12 +2479,13 @@ static void gen8_ggtt_clear_range(struct i915_address_space *vm,
                                  uint64_t length,
                                  bool use_scratch)
 {
-       struct drm_i915_private *dev_priv = vm->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(vm->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned first_entry = start >> PAGE_SHIFT;
        unsigned num_entries = length >> PAGE_SHIFT;
        gen8_pte_t scratch_pte, __iomem *gtt_base =
-               (gen8_pte_t __iomem *) dev_priv->gtt.gsm + first_entry;
-       const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry;
+               (gen8_pte_t __iomem *)ggtt->gsm + first_entry;
+       const int max_entries = ggtt_total_entries(ggtt) - first_entry;
        int i;
        int rpm_atomic_seq;
 
@@ -2518,12 +2511,13 @@ static void gen6_ggtt_clear_range(struct i915_address_space *vm,
                                  uint64_t length,
                                  bool use_scratch)
 {
-       struct drm_i915_private *dev_priv = vm->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(vm->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned first_entry = start >> PAGE_SHIFT;
        unsigned num_entries = length >> PAGE_SHIFT;
        gen6_pte_t scratch_pte, __iomem *gtt_base =
-               (gen6_pte_t __iomem *) dev_priv->gtt.gsm + first_entry;
-       const int max_entries = gtt_total_entries(dev_priv->gtt) - first_entry;
+               (gen6_pte_t __iomem *)ggtt->gsm + first_entry;
+       const int max_entries = ggtt_total_entries(ggtt) - first_entry;
        int i;
        int rpm_atomic_seq;
 
@@ -2613,32 +2607,31 @@ static int aliasing_gtt_bind_vma(struct i915_vma *vma,
                                 enum i915_cache_level cache_level,
                                 u32 flags)
 {
-       struct drm_device *dev = vma->vm->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_i915_gem_object *obj = vma->obj;
-       struct sg_table *pages = obj->pages;
-       u32 pte_flags = 0;
+       u32 pte_flags;
        int ret;
 
        ret = i915_get_ggtt_vma_pages(vma);
        if (ret)
                return ret;
-       pages = vma->ggtt_view.pages;
 
        /* Currently applicable only to VLV */
-       if (obj->gt_ro)
+       pte_flags = 0;
+       if (vma->obj->gt_ro)
                pte_flags |= PTE_READ_ONLY;
 
 
        if (flags & GLOBAL_BIND) {
-               vma->vm->insert_entries(vma->vm, pages,
+               vma->vm->insert_entries(vma->vm,
+                                       vma->ggtt_view.pages,
                                        vma->node.start,
                                        cache_level, pte_flags);
        }
 
        if (flags & LOCAL_BIND) {
-               struct i915_hw_ppgtt *appgtt = dev_priv->mm.aliasing_ppgtt;
-               appgtt->base.insert_entries(&appgtt->base, pages,
+               struct i915_hw_ppgtt *appgtt =
+                       to_i915(vma->vm->dev)->mm.aliasing_ppgtt;
+               appgtt->base.insert_entries(&appgtt->base,
+                                           vma->ggtt_view.pages,
                                            vma->node.start,
                                            cache_level, pte_flags);
        }
@@ -2717,8 +2710,8 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
         * aperture.  One page should be enough to keep any prefetching inside
         * of the aperture.
         */
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_address_space *ggtt_vm = &dev_priv->gtt.base;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_mm_node *entry;
        struct drm_i915_gem_object *obj;
        unsigned long hole_start, hole_end;
@@ -2726,13 +2719,13 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
 
        BUG_ON(mappable_end > end);
 
-       ggtt_vm->start = start;
+       ggtt->base.start = start;
 
        /* Subtract the guard page before address space initialization to
         * shrink the range used by drm_mm */
-       ggtt_vm->total = end - start - PAGE_SIZE;
-       i915_address_space_init(ggtt_vm, dev_priv);
-       ggtt_vm->total += PAGE_SIZE;
+       ggtt->base.total = end - start - PAGE_SIZE;
+       i915_address_space_init(&ggtt->base, dev_priv);
+       ggtt->base.total += PAGE_SIZE;
 
        if (intel_vgpu_active(dev)) {
                ret = intel_vgt_balloon(dev);
@@ -2741,36 +2734,36 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
        }
 
        if (!HAS_LLC(dev))
-               ggtt_vm->mm.color_adjust = i915_gtt_color_adjust;
+               ggtt->base.mm.color_adjust = i915_gtt_color_adjust;
 
        /* Mark any preallocated objects as occupied */
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
-               struct i915_vma *vma = i915_gem_obj_to_vma(obj, ggtt_vm);
+               struct i915_vma *vma = i915_gem_obj_to_vma(obj, &ggtt->base);
 
                DRM_DEBUG_KMS("reserving preallocated space: %llx + %zx\n",
                              i915_gem_obj_ggtt_offset(obj), obj->base.size);
 
                WARN_ON(i915_gem_obj_ggtt_bound(obj));
-               ret = drm_mm_reserve_node(&ggtt_vm->mm, &vma->node);
+               ret = drm_mm_reserve_node(&ggtt->base.mm, &vma->node);
                if (ret) {
                        DRM_DEBUG_KMS("Reservation failed: %i\n", ret);
                        return ret;
                }
                vma->bound |= GLOBAL_BIND;
                __i915_vma_set_map_and_fenceable(vma);
-               list_add_tail(&vma->vm_link, &ggtt_vm->inactive_list);
+               list_add_tail(&vma->vm_link, &ggtt->base.inactive_list);
        }
 
        /* Clear any non-preallocated blocks */
-       drm_mm_for_each_hole(entry, &ggtt_vm->mm, hole_start, hole_end) {
+       drm_mm_for_each_hole(entry, &ggtt->base.mm, hole_start, hole_end) {
                DRM_DEBUG_KMS("clearing unused GTT space: [%lx, %lx]\n",
                              hole_start, hole_end);
-               ggtt_vm->clear_range(ggtt_vm, hole_start,
+               ggtt->base.clear_range(&ggtt->base, hole_start,
                                     hole_end - hole_start, true);
        }
 
        /* And finally clear the reserved guard page */
-       ggtt_vm->clear_range(ggtt_vm, end - PAGE_SIZE, PAGE_SIZE, true);
+       ggtt->base.clear_range(&ggtt->base, end - PAGE_SIZE, PAGE_SIZE, true);
 
        if (USES_PPGTT(dev) && !USES_FULL_PPGTT(dev)) {
                struct i915_hw_ppgtt *ppgtt;
@@ -2801,28 +2794,33 @@ static int i915_gem_setup_global_gtt(struct drm_device *dev,
                                        true);
 
                dev_priv->mm.aliasing_ppgtt = ppgtt;
-               WARN_ON(dev_priv->gtt.base.bind_vma != ggtt_bind_vma);
-               dev_priv->gtt.base.bind_vma = aliasing_gtt_bind_vma;
+               WARN_ON(ggtt->base.bind_vma != ggtt_bind_vma);
+               ggtt->base.bind_vma = aliasing_gtt_bind_vma;
        }
 
        return 0;
 }
 
-void i915_gem_init_global_gtt(struct drm_device *dev)
+/**
+ * i915_gem_init_ggtt - Initialize GEM for Global GTT
+ * @dev: DRM device
+ */
+void i915_gem_init_ggtt(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       u64 gtt_size, mappable_size;
-
-       gtt_size = dev_priv->gtt.base.total;
-       mappable_size = dev_priv->gtt.mappable_end;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
 
-       i915_gem_setup_global_gtt(dev, 0, mappable_size, gtt_size);
+       i915_gem_setup_global_gtt(dev, 0, ggtt->mappable_end, ggtt->base.total);
 }
 
-void i915_global_gtt_cleanup(struct drm_device *dev)
+/**
+ * i915_ggtt_cleanup_hw - Clean up GGTT hardware initialization
+ * @dev: DRM device
+ */
+void i915_ggtt_cleanup_hw(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_address_space *vm = &dev_priv->gtt.base;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
 
        if (dev_priv->mm.aliasing_ppgtt) {
                struct i915_hw_ppgtt *ppgtt = dev_priv->mm.aliasing_ppgtt;
@@ -2832,15 +2830,15 @@ void i915_global_gtt_cleanup(struct drm_device *dev)
 
        i915_gem_cleanup_stolen(dev);
 
-       if (drm_mm_initialized(&vm->mm)) {
+       if (drm_mm_initialized(&ggtt->base.mm)) {
                if (intel_vgpu_active(dev))
                        intel_vgt_deballoon();
 
-               drm_mm_takedown(&vm->mm);
-               list_del(&vm->global_link);
+               drm_mm_takedown(&ggtt->base.mm);
+               list_del(&ggtt->base.global_link);
        }
 
-       vm->cleanup(vm);
+       ggtt->base.cleanup(&ggtt->base);
 }
 
 static unsigned int gen6_get_total_gtt_size(u16 snb_gmch_ctl)
@@ -2924,13 +2922,14 @@ static size_t gen9_get_stolen_size(u16 gen9_gmch_ctl)
 static int ggtt_probe_common(struct drm_device *dev,
                             size_t gtt_size)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct i915_page_scratch *scratch_page;
-       phys_addr_t gtt_phys_addr;
+       phys_addr_t ggtt_phys_addr;
 
        /* For Modern GENs the PTEs and register space are split in the BAR */
-       gtt_phys_addr = pci_resource_start(dev->pdev, 0) +
-               (pci_resource_len(dev->pdev, 0) / 2);
+       ggtt_phys_addr = pci_resource_start(dev->pdev, 0) +
+                        (pci_resource_len(dev->pdev, 0) / 2);
 
        /*
         * On BXT writes larger than 64 bit to the GTT pagetable range will be
@@ -2940,10 +2939,10 @@ static int ggtt_probe_common(struct drm_device *dev,
         * readback check when writing GTT PTE entries.
         */
        if (IS_BROXTON(dev))
-               dev_priv->gtt.gsm = ioremap_nocache(gtt_phys_addr, gtt_size);
+               ggtt->gsm = ioremap_nocache(ggtt_phys_addr, gtt_size);
        else
-               dev_priv->gtt.gsm = ioremap_wc(gtt_phys_addr, gtt_size);
-       if (!dev_priv->gtt.gsm) {
+               ggtt->gsm = ioremap_wc(ggtt_phys_addr, gtt_size);
+       if (!ggtt->gsm) {
                DRM_ERROR("Failed to map the gtt page table\n");
                return -ENOMEM;
        }
@@ -2952,11 +2951,11 @@ static int ggtt_probe_common(struct drm_device *dev,
        if (IS_ERR(scratch_page)) {
                DRM_ERROR("Scratch setup failed\n");
                /* iounmap will also get called at remove, but meh */
-               iounmap(dev_priv->gtt.gsm);
+               iounmap(ggtt->gsm);
                return PTR_ERR(scratch_page);
        }
 
-       dev_priv->gtt.base.scratch_page = scratch_page;
+       ggtt->base.scratch_page = scratch_page;
 
        return 0;
 }
@@ -2977,7 +2976,7 @@ static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv)
              GEN8_PPAT(6, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(2)) |
              GEN8_PPAT(7, GEN8_PPAT_WB | GEN8_PPAT_LLCELLC | GEN8_PPAT_AGE(3));
 
-       if (!USES_PPGTT(dev_priv->dev))
+       if (!USES_PPGTT(dev_priv))
                /* Spec: "For GGTT, there is NO pat_sel[2:0] from the entry,
                 * so RTL will always use the value corresponding to
                 * pat_sel = 000".
@@ -3034,20 +3033,16 @@ static void chv_setup_private_ppat(struct drm_i915_private *dev_priv)
        I915_WRITE(GEN8_PRIVATE_PAT_HI, pat >> 32);
 }
 
-static int gen8_gmch_probe(struct drm_device *dev,
-                          u64 *gtt_total,
-                          size_t *stolen,
-                          phys_addr_t *mappable_base,
-                          u64 *mappable_end)
+static int gen8_gmch_probe(struct i915_ggtt *ggtt)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       u64 gtt_size;
+       struct drm_device *dev = ggtt->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
        u16 snb_gmch_ctl;
        int ret;
 
        /* TODO: We're not aware of mappable constraints on gen8 yet */
-       *mappable_base = pci_resource_start(dev->pdev, 2);
-       *mappable_end = pci_resource_len(dev->pdev, 2);
+       ggtt->mappable_base = pci_resource_start(dev->pdev, 2);
+       ggtt->mappable_end = pci_resource_len(dev->pdev, 2);
 
        if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(39)))
                pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(39));
@@ -3055,56 +3050,50 @@ static int gen8_gmch_probe(struct drm_device *dev,
        pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
 
        if (INTEL_INFO(dev)->gen >= 9) {
-               *stolen = gen9_get_stolen_size(snb_gmch_ctl);
-               gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
+               ggtt->stolen_size = gen9_get_stolen_size(snb_gmch_ctl);
+               ggtt->size = gen8_get_total_gtt_size(snb_gmch_ctl);
        } else if (IS_CHERRYVIEW(dev)) {
-               *stolen = chv_get_stolen_size(snb_gmch_ctl);
-               gtt_size = chv_get_total_gtt_size(snb_gmch_ctl);
+               ggtt->stolen_size = chv_get_stolen_size(snb_gmch_ctl);
+               ggtt->size = chv_get_total_gtt_size(snb_gmch_ctl);
        } else {
-               *stolen = gen8_get_stolen_size(snb_gmch_ctl);
-               gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
+               ggtt->stolen_size = gen8_get_stolen_size(snb_gmch_ctl);
+               ggtt->size = gen8_get_total_gtt_size(snb_gmch_ctl);
        }
 
-       *gtt_total = (gtt_size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
+       ggtt->base.total = (ggtt->size / sizeof(gen8_pte_t)) << PAGE_SHIFT;
 
        if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev))
                chv_setup_private_ppat(dev_priv);
        else
                bdw_setup_private_ppat(dev_priv);
 
-       ret = ggtt_probe_common(dev, gtt_size);
-
-       dev_priv->gtt.base.clear_range = gen8_ggtt_clear_range;
-       dev_priv->gtt.base.insert_entries = gen8_ggtt_insert_entries;
-       dev_priv->gtt.base.bind_vma = ggtt_bind_vma;
-       dev_priv->gtt.base.unbind_vma = ggtt_unbind_vma;
+       ret = ggtt_probe_common(dev, ggtt->size);
 
+       ggtt->base.clear_range = gen8_ggtt_clear_range;
        if (IS_CHERRYVIEW(dev_priv))
-               dev_priv->gtt.base.insert_entries = gen8_ggtt_insert_entries__BKL;
+               ggtt->base.insert_entries = gen8_ggtt_insert_entries__BKL;
+       else
+               ggtt->base.insert_entries = gen8_ggtt_insert_entries;
+       ggtt->base.bind_vma = ggtt_bind_vma;
+       ggtt->base.unbind_vma = ggtt_unbind_vma;
 
        return ret;
 }
 
-static int gen6_gmch_probe(struct drm_device *dev,
-                          u64 *gtt_total,
-                          size_t *stolen,
-                          phys_addr_t *mappable_base,
-                          u64 *mappable_end)
+static int gen6_gmch_probe(struct i915_ggtt *ggtt)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       unsigned int gtt_size;
+       struct drm_device *dev = ggtt->base.dev;
        u16 snb_gmch_ctl;
        int ret;
 
-       *mappable_base = pci_resource_start(dev->pdev, 2);
-       *mappable_end = pci_resource_len(dev->pdev, 2);
+       ggtt->mappable_base = pci_resource_start(dev->pdev, 2);
+       ggtt->mappable_end = pci_resource_len(dev->pdev, 2);
 
        /* 64/512MB is the current min/max we actually know of, but this is just
         * a coarse sanity check.
         */
-       if ((*mappable_end < (64<<20) || (*mappable_end > (512<<20)))) {
-               DRM_ERROR("Unknown GMADR size (%llx)\n",
-                         dev_priv->gtt.mappable_end);
+       if ((ggtt->mappable_end < (64<<20) || (ggtt->mappable_end > (512<<20)))) {
+               DRM_ERROR("Unknown GMADR size (%llx)\n", ggtt->mappable_end);
                return -ENXIO;
        }
 
@@ -3112,37 +3101,32 @@ static int gen6_gmch_probe(struct drm_device *dev,
                pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(40));
        pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl);
 
-       *stolen = gen6_get_stolen_size(snb_gmch_ctl);
-
-       gtt_size = gen6_get_total_gtt_size(snb_gmch_ctl);
-       *gtt_total = (gtt_size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
+       ggtt->stolen_size = gen6_get_stolen_size(snb_gmch_ctl);
+       ggtt->size = gen6_get_total_gtt_size(snb_gmch_ctl);
+       ggtt->base.total = (ggtt->size / sizeof(gen6_pte_t)) << PAGE_SHIFT;
 
-       ret = ggtt_probe_common(dev, gtt_size);
+       ret = ggtt_probe_common(dev, ggtt->size);
 
-       dev_priv->gtt.base.clear_range = gen6_ggtt_clear_range;
-       dev_priv->gtt.base.insert_entries = gen6_ggtt_insert_entries;
-       dev_priv->gtt.base.bind_vma = ggtt_bind_vma;
-       dev_priv->gtt.base.unbind_vma = ggtt_unbind_vma;
+       ggtt->base.clear_range = gen6_ggtt_clear_range;
+       ggtt->base.insert_entries = gen6_ggtt_insert_entries;
+       ggtt->base.bind_vma = ggtt_bind_vma;
+       ggtt->base.unbind_vma = ggtt_unbind_vma;
 
        return ret;
 }
 
 static void gen6_gmch_remove(struct i915_address_space *vm)
 {
+       struct i915_ggtt *ggtt = container_of(vm, struct i915_ggtt, base);
 
-       struct i915_gtt *gtt = container_of(vm, struct i915_gtt, base);
-
-       iounmap(gtt->gsm);
+       iounmap(ggtt->gsm);
        free_scratch_page(vm->dev, vm->scratch_page);
 }
 
-static int i915_gmch_probe(struct drm_device *dev,
-                          u64 *gtt_total,
-                          size_t *stolen,
-                          phys_addr_t *mappable_base,
-                          u64 *mappable_end)
+static int i915_gmch_probe(struct i915_ggtt *ggtt)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_device *dev = ggtt->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
        int ret;
 
        ret = intel_gmch_probe(dev_priv->bridge_dev, dev_priv->dev->pdev, NULL);
@@ -3151,15 +3135,16 @@ static int i915_gmch_probe(struct drm_device *dev,
                return -EIO;
        }
 
-       intel_gtt_get(gtt_total, stolen, mappable_base, mappable_end);
+       intel_gtt_get(&ggtt->base.total, &ggtt->stolen_size,
+                     &ggtt->mappable_base, &ggtt->mappable_end);
 
-       dev_priv->gtt.do_idle_maps = needs_idle_maps(dev_priv->dev);
-       dev_priv->gtt.base.insert_entries = i915_ggtt_insert_entries;
-       dev_priv->gtt.base.clear_range = i915_ggtt_clear_range;
-       dev_priv->gtt.base.bind_vma = ggtt_bind_vma;
-       dev_priv->gtt.base.unbind_vma = ggtt_unbind_vma;
+       ggtt->do_idle_maps = needs_idle_maps(dev_priv->dev);
+       ggtt->base.insert_entries = i915_ggtt_insert_entries;
+       ggtt->base.clear_range = i915_ggtt_clear_range;
+       ggtt->base.bind_vma = ggtt_bind_vma;
+       ggtt->base.unbind_vma = ggtt_unbind_vma;
 
-       if (unlikely(dev_priv->gtt.do_idle_maps))
+       if (unlikely(ggtt->do_idle_maps))
                DRM_INFO("applying Ironlake quirks for intel_iommu\n");
 
        return 0;
@@ -3170,41 +3155,53 @@ static void i915_gmch_remove(struct i915_address_space *vm)
        intel_gmch_remove();
 }
 
-int i915_gem_gtt_init(struct drm_device *dev)
+/**
+ * i915_ggtt_init_hw - Initialize GGTT hardware
+ * @dev: DRM device
+ */
+int i915_ggtt_init_hw(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_gtt *gtt = &dev_priv->gtt;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int ret;
 
        if (INTEL_INFO(dev)->gen <= 5) {
-               gtt->gtt_probe = i915_gmch_probe;
-               gtt->base.cleanup = i915_gmch_remove;
+               ggtt->probe = i915_gmch_probe;
+               ggtt->base.cleanup = i915_gmch_remove;
        } else if (INTEL_INFO(dev)->gen < 8) {
-               gtt->gtt_probe = gen6_gmch_probe;
-               gtt->base.cleanup = gen6_gmch_remove;
-               if (IS_HASWELL(dev) && dev_priv->ellc_size)
-                       gtt->base.pte_encode = iris_pte_encode;
+               ggtt->probe = gen6_gmch_probe;
+               ggtt->base.cleanup = gen6_gmch_remove;
+
+               if (HAS_EDRAM(dev))
+                       ggtt->base.pte_encode = iris_pte_encode;
                else if (IS_HASWELL(dev))
-                       gtt->base.pte_encode = hsw_pte_encode;
+                       ggtt->base.pte_encode = hsw_pte_encode;
                else if (IS_VALLEYVIEW(dev))
-                       gtt->base.pte_encode = byt_pte_encode;
+                       ggtt->base.pte_encode = byt_pte_encode;
                else if (INTEL_INFO(dev)->gen >= 7)
-                       gtt->base.pte_encode = ivb_pte_encode;
+                       ggtt->base.pte_encode = ivb_pte_encode;
                else
-                       gtt->base.pte_encode = snb_pte_encode;
+                       ggtt->base.pte_encode = snb_pte_encode;
        } else {
-               dev_priv->gtt.gtt_probe = gen8_gmch_probe;
-               dev_priv->gtt.base.cleanup = gen6_gmch_remove;
+               ggtt->probe = gen8_gmch_probe;
+               ggtt->base.cleanup = gen6_gmch_remove;
        }
 
-       gtt->base.dev = dev;
-       gtt->base.is_ggtt = true;
+       ggtt->base.dev = dev;
+       ggtt->base.is_ggtt = true;
 
-       ret = gtt->gtt_probe(dev, &gtt->base.total, &gtt->stolen_size,
-                            &gtt->mappable_base, &gtt->mappable_end);
+       ret = ggtt->probe(ggtt);
        if (ret)
                return ret;
 
+       if ((ggtt->base.total - 1) >> 32) {
+               DRM_ERROR("We never expected a Global GTT with more than 32bits"
+                         "of address space! Found %lldM!\n",
+                         ggtt->base.total >> 20);
+               ggtt->base.total = 1ULL << 32;
+               ggtt->mappable_end = min(ggtt->mappable_end, ggtt->base.total);
+       }
+
        /*
         * Initialise stolen early so that we may reserve preallocated
         * objects for the BIOS to KMS transition.
@@ -3215,9 +3212,9 @@ int i915_gem_gtt_init(struct drm_device *dev)
 
        /* GMADR is the PCI mmio aperture into the global GTT. */
        DRM_INFO("Memory usable by graphics device = %lluM\n",
-                gtt->base.total >> 20);
-       DRM_DEBUG_DRIVER("GMADR size = %lldM\n", gtt->mappable_end >> 20);
-       DRM_DEBUG_DRIVER("GTT stolen size = %zdM\n", gtt->stolen_size >> 20);
+                ggtt->base.total >> 20);
+       DRM_DEBUG_DRIVER("GMADR size = %lldM\n", ggtt->mappable_end >> 20);
+       DRM_DEBUG_DRIVER("GTT stolen size = %zdM\n", ggtt->stolen_size >> 20);
 #ifdef CONFIG_INTEL_IOMMU
        if (intel_iommu_gfx_mapped)
                DRM_INFO("VT-d active for gfx access\n");
@@ -3234,33 +3231,30 @@ int i915_gem_gtt_init(struct drm_device *dev)
        return 0;
 
 out_gtt_cleanup:
-       gtt->base.cleanup(&dev_priv->gtt.base);
+       ggtt->base.cleanup(&ggtt->base);
 
        return ret;
 }
 
 void i915_gem_restore_gtt_mappings(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_object *obj;
-       struct i915_address_space *vm;
        struct i915_vma *vma;
        bool flush;
 
        i915_check_and_clear_faults(dev);
 
        /* First fill our portion of the GTT with scratch pages */
-       dev_priv->gtt.base.clear_range(&dev_priv->gtt.base,
-                                      dev_priv->gtt.base.start,
-                                      dev_priv->gtt.base.total,
-                                      true);
+       ggtt->base.clear_range(&ggtt->base, ggtt->base.start, ggtt->base.total,
+                              true);
 
        /* Cache flush objects bound into GGTT and rebind them. */
-       vm = &dev_priv->gtt.base;
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
                flush = false;
                list_for_each_entry(vma, &obj->vma_list, obj_link) {
-                       if (vma->vm != vm)
+                       if (vma->vm != &ggtt->base)
                                continue;
 
                        WARN_ON(i915_vma_bind(vma, obj->cache_level,
@@ -3283,15 +3277,17 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
        }
 
        if (USES_PPGTT(dev)) {
+               struct i915_address_space *vm;
+
                list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
                        /* TODO: Perhaps it shouldn't be gen6 specific */
 
-                       struct i915_hw_ppgtt *ppgtt =
-                                       container_of(vm, struct i915_hw_ppgtt,
-                                                    base);
+                       struct i915_hw_ppgtt *ppgtt;
 
-                       if (i915_is_ggtt(vm))
+                       if (vm->is_ggtt)
                                ppgtt = dev_priv->mm.aliasing_ppgtt;
+                       else
+                               ppgtt = i915_vm_to_ppgtt(vm);
 
                        gen6_write_page_range(dev_priv, &ppgtt->pd,
                                              0, ppgtt->base.total);
@@ -3350,19 +3346,13 @@ struct i915_vma *
 i915_gem_obj_lookup_or_create_ggtt_vma(struct drm_i915_gem_object *obj,
                                       const struct i915_ggtt_view *view)
 {
-       struct i915_address_space *ggtt = i915_obj_to_ggtt(obj);
-       struct i915_vma *vma;
-
-       if (WARN_ON(!view))
-               return ERR_PTR(-EINVAL);
-
-       vma = i915_gem_obj_to_ggtt_view(obj, view);
-
-       if (IS_ERR(vma))
-               return vma;
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+       struct i915_vma *vma = i915_gem_obj_to_ggtt_view(obj, view);
 
        if (!vma)
-               vma = __i915_gem_vma_create(obj, ggtt, view);
+               vma = __i915_gem_vma_create(obj, &ggtt->base, view);
 
        return vma;
 
@@ -3377,11 +3367,6 @@ rotate_pages(const dma_addr_t *in, unsigned int offset,
        unsigned int column, row;
        unsigned int src_idx;
 
-       if (!sg) {
-               st->nents = 0;
-               sg = st->sgl;
-       }
-
        for (column = 0; column < width; column++) {
                src_idx = stride * (height - 1) + column;
                for (row = 0; row < height; row++) {
@@ -3405,7 +3390,7 @@ static struct sg_table *
 intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
                          struct drm_i915_gem_object *obj)
 {
-       unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
+       unsigned int size_pages = rot_info->plane[0].width * rot_info->plane[0].height;
        unsigned int size_pages_uv;
        struct sg_page_iter sg_iter;
        unsigned long i;
@@ -3416,14 +3401,15 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
        int ret = -ENOMEM;
 
        /* Allocate a temporary list of source pages for random access. */
-       page_addr_list = drm_malloc_ab(obj->base.size / PAGE_SIZE,
-                                      sizeof(dma_addr_t));
+       page_addr_list = drm_malloc_gfp(obj->base.size / PAGE_SIZE,
+                                       sizeof(dma_addr_t),
+                                       GFP_TEMPORARY);
        if (!page_addr_list)
                return ERR_PTR(ret);
 
        /* Account for UV plane with NV12. */
        if (rot_info->pixel_format == DRM_FORMAT_NV12)
-               size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
+               size_pages_uv = rot_info->plane[1].width * rot_info->plane[1].height;
        else
                size_pages_uv = 0;
 
@@ -3443,11 +3429,14 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
                i++;
        }
 
+       st->nents = 0;
+       sg = st->sgl;
+
        /* Rotate the pages. */
        sg = rotate_pages(page_addr_list, 0,
-                    rot_info->width_pages, rot_info->height_pages,
-                    rot_info->width_pages,
-                    st, NULL);
+                         rot_info->plane[0].width, rot_info->plane[0].height,
+                         rot_info->plane[0].width,
+                         st, sg);
 
        /* Append the UV plane if NV12. */
        if (rot_info->pixel_format == DRM_FORMAT_NV12) {
@@ -3459,18 +3448,15 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
 
                rot_info->uv_start_page = uv_start_page;
 
-               rotate_pages(page_addr_list, uv_start_page,
-                            rot_info->width_pages_uv,
-                            rot_info->height_pages_uv,
-                            rot_info->width_pages_uv,
-                            st, sg);
+               sg = rotate_pages(page_addr_list, rot_info->uv_start_page,
+                                 rot_info->plane[1].width, rot_info->plane[1].height,
+                                 rot_info->plane[1].width,
+                                 st, sg);
        }
 
-       DRM_DEBUG_KMS(
-                     "Created rotated page mapping for object size %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0)).\n",
-                     obj->base.size, rot_info->pitch, rot_info->height,
-                     rot_info->pixel_format, rot_info->width_pages,
-                     rot_info->height_pages, size_pages + size_pages_uv,
+       DRM_DEBUG_KMS("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages (%u plane 0)).\n",
+                     obj->base.size, rot_info->plane[0].width,
+                     rot_info->plane[0].height, size_pages + size_pages_uv,
                      size_pages);
 
        drm_free_large(page_addr_list);
@@ -3482,11 +3468,9 @@ err_sg_alloc:
 err_st_alloc:
        drm_free_large(page_addr_list);
 
-       DRM_DEBUG_KMS(
-                     "Failed to create rotated mapping for object size %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0))\n",
-                     obj->base.size, ret, rot_info->pitch, rot_info->height,
-                     rot_info->pixel_format, rot_info->width_pages,
-                     rot_info->height_pages, size_pages + size_pages_uv,
+       DRM_DEBUG_KMS("Failed to create rotated mapping for object size %zu! (%d) (%ux%u tiles, %u pages (%u plane 0))\n",
+                     obj->base.size, ret, rot_info->plane[0].width,
+                     rot_info->plane[0].height, size_pages + size_pages_uv,
                      size_pages);
        return ERR_PTR(ret);
 }
@@ -3634,7 +3618,7 @@ i915_ggtt_view_size(struct drm_i915_gem_object *obj,
        if (view->type == I915_GGTT_VIEW_NORMAL) {
                return obj->base.size;
        } else if (view->type == I915_GGTT_VIEW_ROTATED) {
-               return view->params.rotated.size;
+               return intel_rotation_info_size(&view->params.rotated) << PAGE_SHIFT;
        } else if (view->type == I915_GGTT_VIEW_PARTIAL) {
                return view->params.partial.size << PAGE_SHIFT;
        } else {
index 8774f1ba46e79387a05e224664c074cc7808fef8..d7dd3d8a87582c31f2dd95f7abf6852ae76e8369 100644 (file)
@@ -42,7 +42,7 @@ typedef uint64_t gen8_pde_t;
 typedef uint64_t gen8_ppgtt_pdpe_t;
 typedef uint64_t gen8_ppgtt_pml4e_t;
 
-#define gtt_total_entries(gtt) ((gtt).base.total >> PAGE_SHIFT)
+#define ggtt_total_entries(ggtt) ((ggtt)->base.total >> PAGE_SHIFT)
 
 /* gen6-hsw has bit 11-4 for physical addr bit 39-32 */
 #define GEN6_GTT_ADDR_ENCODE(addr)     ((addr) | (((addr) >> 28) & 0xff0))
@@ -135,16 +135,13 @@ enum i915_ggtt_view_type {
 };
 
 struct intel_rotation_info {
-       unsigned int height;
-       unsigned int pitch;
        unsigned int uv_offset;
        uint32_t pixel_format;
-       uint64_t fb_modifier;
-       unsigned int width_pages, height_pages;
-       uint64_t size;
-       unsigned int width_pages_uv, height_pages_uv;
-       uint64_t size_uv;
        unsigned int uv_start_page;
+       struct {
+               /* tiles */
+               unsigned int width, height;
+       } plane[2];
 };
 
 struct i915_ggtt_view {
@@ -342,13 +339,14 @@ struct i915_address_space {
  * and correct (in cases like swizzling). That region is referred to as GMADR in
  * the spec.
  */
-struct i915_gtt {
+struct i915_ggtt {
        struct i915_address_space base;
 
        size_t stolen_size;             /* Total size of stolen memory */
        size_t stolen_usable_size;      /* Total size minus BIOS reserved */
        size_t stolen_reserved_base;
        size_t stolen_reserved_size;
+       size_t size;                    /* Total size of Global GTT */
        u64 mappable_end;               /* End offset that we can CPU map */
        struct io_mapping *mappable;    /* Mapping to our CPU mappable region */
        phys_addr_t mappable_base;      /* PA of our GMADR */
@@ -360,10 +358,7 @@ struct i915_gtt {
 
        int mtrr;
 
-       /* global gtt ops */
-       int (*gtt_probe)(struct drm_device *dev, u64 *gtt_total,
-                         size_t *stolen, phys_addr_t *mappable_base,
-                         u64 *mappable_end);
+       int (*probe)(struct i915_ggtt *ggtt);
 };
 
 struct i915_hw_ppgtt {
@@ -518,10 +513,9 @@ i915_page_dir_dma_addr(const struct i915_hw_ppgtt *ppgtt, const unsigned n)
                px_dma(ppgtt->base.scratch_pd);
 }
 
-int i915_gem_gtt_init(struct drm_device *dev);
-void i915_gem_init_global_gtt(struct drm_device *dev);
-void i915_global_gtt_cleanup(struct drm_device *dev);
-
+int i915_ggtt_init_hw(struct drm_device *dev);
+void i915_gem_init_ggtt(struct drm_device *dev);
+void i915_ggtt_cleanup_hw(struct drm_device *dev);
 
 int i915_ppgtt_init(struct drm_device *dev, struct i915_hw_ppgtt *ppgtt);
 int i915_ppgtt_init_hw(struct drm_device *dev);
index fc7e6d5c625102492a6b4c2343f4c9f73192f496..71611bf21fcae34ed6f7869a2b464b25ece62f76 100644 (file)
@@ -169,15 +169,15 @@ void i915_gem_render_state_fini(struct render_state *so)
        drm_gem_object_unreference(&so->obj->base);
 }
 
-int i915_gem_render_state_prepare(struct intel_engine_cs *ring,
+int i915_gem_render_state_prepare(struct intel_engine_cs *engine,
                                  struct render_state *so)
 {
        int ret;
 
-       if (WARN_ON(ring->id != RCS))
+       if (WARN_ON(engine->id != RCS))
                return -ENOENT;
 
-       ret = render_state_init(so, ring->dev);
+       ret = render_state_init(so, engine->dev);
        if (ret)
                return ret;
 
@@ -198,21 +198,21 @@ int i915_gem_render_state_init(struct drm_i915_gem_request *req)
        struct render_state so;
        int ret;
 
-       ret = i915_gem_render_state_prepare(req->ring, &so);
+       ret = i915_gem_render_state_prepare(req->engine, &so);
        if (ret)
                return ret;
 
        if (so.rodata == NULL)
                return 0;
 
-       ret = req->ring->dispatch_execbuffer(req, so.ggtt_offset,
+       ret = req->engine->dispatch_execbuffer(req, so.ggtt_offset,
                                             so.rodata->batch_items * 4,
                                             I915_DISPATCH_SECURE);
        if (ret)
                goto out;
 
        if (so.aux_batch_size > 8) {
-               ret = req->ring->dispatch_execbuffer(req,
+               ret = req->engine->dispatch_execbuffer(req,
                                                     (so.ggtt_offset +
                                                      so.aux_batch_offset),
                                                     so.aux_batch_size,
index e641bb093a903bba18e02cd0cd156e6070a40a62..6aaa3a10a6309e2f79539fe4df2a79714ea97f26 100644 (file)
@@ -43,7 +43,7 @@ struct render_state {
 
 int i915_gem_render_state_init(struct drm_i915_gem_request *req);
 void i915_gem_render_state_fini(struct render_state *so);
-int i915_gem_render_state_prepare(struct intel_engine_cs *ring,
+int i915_gem_render_state_prepare(struct intel_engine_cs *engine,
                                  struct render_state *so);
 
 #endif /* _I915_GEM_RENDER_STATE_H_ */
index d3c473ffb90aaa90325d184777cd9626b6d57165..425e721aac58e5cd0d7dd3d80f984f118fcfc960 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/swap.h>
 #include <linux/pci.h>
 #include <linux/dma-buf.h>
+#include <linux/vmalloc.h>
 #include <drm/drmP.h>
 #include <drm/i915_drm.h>
 
@@ -69,6 +70,10 @@ static bool swap_available(void)
 
 static bool can_release_pages(struct drm_i915_gem_object *obj)
 {
+       /* Only shmemfs objects are backed by swap */
+       if (!obj->base.filp)
+               return false;
+
        /* Only report true if by unbinding the object and putting its pages
         * we can actually make forward progress towards freeing physical
         * pages.
@@ -166,6 +171,10 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
                            obj->madv != I915_MADV_DONTNEED)
                                continue;
 
+                       if (flags & I915_SHRINK_VMAPS &&
+                           !is_vmalloc_addr(obj->mapping))
+                               continue;
+
                        if ((flags & I915_SHRINK_ACTIVE) == 0 && obj->active)
                                continue;
 
@@ -246,7 +255,7 @@ i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
 
        count = 0;
        list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list)
-               if (obj->pages_pin_count == 0)
+               if (can_release_pages(obj))
                        count += obj->base.size >> PAGE_SHIFT;
 
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
@@ -288,67 +297,82 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
        return freed;
 }
 
-static int
-i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
-{
-       struct drm_i915_private *dev_priv =
-               container_of(nb, struct drm_i915_private, mm.oom_notifier);
-       struct drm_device *dev = dev_priv->dev;
-       struct drm_i915_gem_object *obj;
-       unsigned long timeout = msecs_to_jiffies(5000) + 1;
-       unsigned long pinned, bound, unbound, freed_pages;
+struct shrinker_lock_uninterruptible {
        bool was_interruptible;
        bool unlock;
+};
+
+static bool
+i915_gem_shrinker_lock_uninterruptible(struct drm_i915_private *dev_priv,
+                                      struct shrinker_lock_uninterruptible *slu,
+                                      int timeout_ms)
+{
+       unsigned long timeout = msecs_to_jiffies(timeout_ms) + 1;
 
-       while (!i915_gem_shrinker_lock(dev, &unlock) && --timeout) {
+       while (!i915_gem_shrinker_lock(dev_priv->dev, &slu->unlock)) {
                schedule_timeout_killable(1);
                if (fatal_signal_pending(current))
-                       return NOTIFY_DONE;
-       }
-       if (timeout == 0) {
-               pr_err("Unable to purge GPU memory due lock contention.\n");
-               return NOTIFY_DONE;
+                       return false;
+               if (--timeout == 0) {
+                       pr_err("Unable to lock GPU to purge memory.\n");
+                       return false;
+               }
        }
 
-       was_interruptible = dev_priv->mm.interruptible;
+       slu->was_interruptible = dev_priv->mm.interruptible;
        dev_priv->mm.interruptible = false;
+       return true;
+}
 
-       freed_pages = i915_gem_shrink_all(dev_priv);
+static void
+i915_gem_shrinker_unlock_uninterruptible(struct drm_i915_private *dev_priv,
+                                        struct shrinker_lock_uninterruptible *slu)
+{
+       dev_priv->mm.interruptible = slu->was_interruptible;
+       if (slu->unlock)
+               mutex_unlock(&dev_priv->dev->struct_mutex);
+}
+
+static int
+i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
+{
+       struct drm_i915_private *dev_priv =
+               container_of(nb, struct drm_i915_private, mm.oom_notifier);
+       struct shrinker_lock_uninterruptible slu;
+       struct drm_i915_gem_object *obj;
+       unsigned long unevictable, bound, unbound, freed_pages;
 
-       dev_priv->mm.interruptible = was_interruptible;
+       if (!i915_gem_shrinker_lock_uninterruptible(dev_priv, &slu, 5000))
+               return NOTIFY_DONE;
+
+       freed_pages = i915_gem_shrink_all(dev_priv);
 
        /* Because we may be allocating inside our own driver, we cannot
         * assert that there are no objects with pinned pages that are not
         * being pointed to by hardware.
         */
-       unbound = bound = pinned = 0;
+       unbound = bound = unevictable = 0;
        list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
-               if (!obj->base.filp) /* not backed by a freeable object */
-                       continue;
-
-               if (obj->pages_pin_count)
-                       pinned += obj->base.size;
+               if (!can_release_pages(obj))
+                       unevictable += obj->base.size >> PAGE_SHIFT;
                else
-                       unbound += obj->base.size;
+                       unbound += obj->base.size >> PAGE_SHIFT;
        }
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
-               if (!obj->base.filp)
-                       continue;
-
-               if (obj->pages_pin_count)
-                       pinned += obj->base.size;
+               if (!can_release_pages(obj))
+                       unevictable += obj->base.size >> PAGE_SHIFT;
                else
-                       bound += obj->base.size;
+                       bound += obj->base.size >> PAGE_SHIFT;
        }
 
-       if (unlock)
-               mutex_unlock(&dev->struct_mutex);
+       i915_gem_shrinker_unlock_uninterruptible(dev_priv, &slu);
 
        if (freed_pages || unbound || bound)
-               pr_info("Purging GPU memory, %lu bytes freed, %lu bytes still pinned.\n",
-                       freed_pages << PAGE_SHIFT, pinned);
+               pr_info("Purging GPU memory, %lu pages freed, "
+                       "%lu pages still pinned.\n",
+                       freed_pages, unevictable);
        if (unbound || bound)
-               pr_err("%lu and %lu bytes still available in the "
+               pr_err("%lu and %lu pages still available in the "
                       "bound and unbound GPU page lists.\n",
                       bound, unbound);
 
@@ -356,6 +380,29 @@ i915_gem_shrinker_oom(struct notifier_block *nb, unsigned long event, void *ptr)
        return NOTIFY_DONE;
 }
 
+static int
+i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr)
+{
+       struct drm_i915_private *dev_priv =
+               container_of(nb, struct drm_i915_private, mm.vmap_notifier);
+       struct shrinker_lock_uninterruptible slu;
+       unsigned long freed_pages;
+
+       if (!i915_gem_shrinker_lock_uninterruptible(dev_priv, &slu, 5000))
+               return NOTIFY_DONE;
+
+       freed_pages = i915_gem_shrink(dev_priv, -1UL,
+                                     I915_SHRINK_BOUND |
+                                     I915_SHRINK_UNBOUND |
+                                     I915_SHRINK_ACTIVE |
+                                     I915_SHRINK_VMAPS);
+
+       i915_gem_shrinker_unlock_uninterruptible(dev_priv, &slu);
+
+       *(unsigned long *)ptr += freed_pages;
+       return NOTIFY_DONE;
+}
+
 /**
  * i915_gem_shrinker_init - Initialize i915 shrinker
  * @dev_priv: i915 device
@@ -371,6 +418,9 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv)
 
        dev_priv->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom;
        WARN_ON(register_oom_notifier(&dev_priv->mm.oom_notifier));
+
+       dev_priv->mm.vmap_notifier.notifier_call = i915_gem_shrinker_vmap;
+       WARN_ON(register_vmap_purge_notifier(&dev_priv->mm.vmap_notifier));
 }
 
 /**
@@ -381,6 +431,7 @@ void i915_gem_shrinker_init(struct drm_i915_private *dev_priv)
  */
 void i915_gem_shrinker_cleanup(struct drm_i915_private *dev_priv)
 {
+       WARN_ON(unregister_vmap_purge_notifier(&dev_priv->mm.vmap_notifier));
        WARN_ON(unregister_oom_notifier(&dev_priv->mm.oom_notifier));
        unregister_shrinker(&dev_priv->mm.shrinker);
 }
index 2e6e9fb6f80d38f10431224fd2f888fa4a11defc..b7ce963fb8f8d23345cab6cf0b6e4e446e6e1b3c 100644 (file)
@@ -72,9 +72,11 @@ int i915_gem_stolen_insert_node(struct drm_i915_private *dev_priv,
                                struct drm_mm_node *node, u64 size,
                                unsigned alignment)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+
        return i915_gem_stolen_insert_node_in_range(dev_priv, node, size,
-                                       alignment, 0,
-                                       dev_priv->gtt.stolen_usable_size);
+                                                   alignment, 0,
+                                                   ggtt->stolen_usable_size);
 }
 
 void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
@@ -87,14 +89,15 @@ void i915_gem_stolen_remove_node(struct drm_i915_private *dev_priv,
 
 static unsigned long i915_stolen_to_physical(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct resource *r;
        u32 base;
 
        /* Almost universally we can find the Graphics Base of Stolen Memory
-        * at offset 0x5c in the igfx configuration space. On a few (desktop)
-        * machines this is also mirrored in the bridge device at different
-        * locations, or in the MCHBAR.
+        * at register BSM (0x5c) in the igfx configuration space. On a few
+        * (desktop) machines this is also mirrored in the bridge device at
+        * different locations, or in the MCHBAR.
         *
         * On 865 we just check the TOUD register.
         *
@@ -104,9 +107,11 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
         */
        base = 0;
        if (INTEL_INFO(dev)->gen >= 3) {
-               /* Read Graphics Base of Stolen Memory directly */
-               pci_read_config_dword(dev->pdev, 0x5c, &base);
-               base &= ~((1<<20) - 1);
+               u32 bsm;
+
+               pci_read_config_dword(dev->pdev, BSM, &bsm);
+
+               base = bsm & BSM_MASK;
        } else if (IS_I865G(dev)) {
                u16 toud = 0;
 
@@ -134,7 +139,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                                         I85X_DRB3, &tmp);
                tom = tmp * MB(32);
 
-               base = tom - tseg_size - dev_priv->gtt.stolen_size;
+               base = tom - tseg_size - ggtt->stolen_size;
        } else if (IS_845G(dev)) {
                u32 tseg_size = 0;
                u32 tom;
@@ -158,7 +163,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                                         I830_DRB3, &tmp);
                tom = tmp * MB(32);
 
-               base = tom - tseg_size - dev_priv->gtt.stolen_size;
+               base = tom - tseg_size - ggtt->stolen_size;
        } else if (IS_I830(dev)) {
                u32 tseg_size = 0;
                u32 tom;
@@ -178,7 +183,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                                         I830_DRB3, &tmp);
                tom = tmp * MB(32);
 
-               base = tom - tseg_size - dev_priv->gtt.stolen_size;
+               base = tom - tseg_size - ggtt->stolen_size;
        }
 
        if (base == 0)
@@ -189,41 +194,41 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                struct {
                        u32 start, end;
                } stolen[2] = {
-                       { .start = base, .end = base + dev_priv->gtt.stolen_size, },
-                       { .start = base, .end = base + dev_priv->gtt.stolen_size, },
+                       { .start = base, .end = base + ggtt->stolen_size, },
+                       { .start = base, .end = base + ggtt->stolen_size, },
                };
-               u64 gtt_start, gtt_end;
+               u64 ggtt_start, ggtt_end;
 
-               gtt_start = I915_READ(PGTBL_CTL);
+               ggtt_start = I915_READ(PGTBL_CTL);
                if (IS_GEN4(dev))
-                       gtt_start = (gtt_start & PGTBL_ADDRESS_LO_MASK) |
-                               (gtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
+                       ggtt_start = (ggtt_start & PGTBL_ADDRESS_LO_MASK) |
+                                    (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
                else
-                       gtt_start &= PGTBL_ADDRESS_LO_MASK;
-               gtt_end = gtt_start + gtt_total_entries(dev_priv->gtt) * 4;
+                       ggtt_start &= PGTBL_ADDRESS_LO_MASK;
+               ggtt_end = ggtt_start + ggtt_total_entries(ggtt) * 4;
 
-               if (gtt_start >= stolen[0].start && gtt_start < stolen[0].end)
-                       stolen[0].end = gtt_start;
-               if (gtt_end > stolen[1].start && gtt_end <= stolen[1].end)
-                       stolen[1].start = gtt_end;
+               if (ggtt_start >= stolen[0].start && ggtt_start < stolen[0].end)
+                       stolen[0].end = ggtt_start;
+               if (ggtt_end > stolen[1].start && ggtt_end <= stolen[1].end)
+                       stolen[1].start = ggtt_end;
 
                /* pick the larger of the two chunks */
                if (stolen[0].end - stolen[0].start >
                    stolen[1].end - stolen[1].start) {
                        base = stolen[0].start;
-                       dev_priv->gtt.stolen_size = stolen[0].end - stolen[0].start;
+                       ggtt->stolen_size = stolen[0].end - stolen[0].start;
                } else {
                        base = stolen[1].start;
-                       dev_priv->gtt.stolen_size = stolen[1].end - stolen[1].start;
+                       ggtt->stolen_size = stolen[1].end - stolen[1].start;
                }
 
                if (stolen[0].start != stolen[1].start ||
                    stolen[0].end != stolen[1].end) {
                        DRM_DEBUG_KMS("GTT within stolen memory at 0x%llx-0x%llx\n",
-                                     (unsigned long long) gtt_start,
-                                     (unsigned long long) gtt_end - 1);
+                                     (unsigned long long)ggtt_start,
+                                     (unsigned long long)ggtt_end - 1);
                        DRM_DEBUG_KMS("Stolen memory adjusted to 0x%x-0x%x\n",
-                                     base, base + (u32) dev_priv->gtt.stolen_size - 1);
+                                     base, base + (u32)ggtt->stolen_size - 1);
                }
        }
 
@@ -233,7 +238,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
         * kernel. So if the region is already marked as busy, something
         * is seriously wrong.
         */
-       r = devm_request_mem_region(dev->dev, base, dev_priv->gtt.stolen_size,
+       r = devm_request_mem_region(dev->dev, base, ggtt->stolen_size,
                                    "Graphics Stolen Memory");
        if (r == NULL) {
                /*
@@ -245,7 +250,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                 * reservation starting from 1 instead of 0.
                 */
                r = devm_request_mem_region(dev->dev, base + 1,
-                                           dev_priv->gtt.stolen_size - 1,
+                                           ggtt->stolen_size - 1,
                                            "Graphics Stolen Memory");
                /*
                 * GEN3 firmware likes to smash pci bridges into the stolen
@@ -253,7 +258,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                 */
                if (r == NULL && !IS_GEN3(dev)) {
                        DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n",
-                                 base, base + (uint32_t)dev_priv->gtt.stolen_size);
+                                 base, base + (uint32_t)ggtt->stolen_size);
                        base = 0;
                }
        }
@@ -274,11 +279,12 @@ void i915_gem_cleanup_stolen(struct drm_device *dev)
 static void g4x_get_stolen_reserved(struct drm_i915_private *dev_priv,
                                    unsigned long *base, unsigned long *size)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        uint32_t reg_val = I915_READ(IS_GM45(dev_priv) ?
                                     CTG_STOLEN_RESERVED :
                                     ELK_STOLEN_RESERVED);
        unsigned long stolen_top = dev_priv->mm.stolen_base +
-               dev_priv->gtt.stolen_size;
+                                  ggtt->stolen_size;
 
        *base = (reg_val & G4X_STOLEN_RESERVED_ADDR2_MASK) << 16;
 
@@ -369,10 +375,11 @@ static void gen8_get_stolen_reserved(struct drm_i915_private *dev_priv,
 static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
                                    unsigned long *base, unsigned long *size)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        uint32_t reg_val = I915_READ(GEN6_STOLEN_RESERVED);
        unsigned long stolen_top;
 
-       stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size;
+       stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
 
        *base = reg_val & GEN6_STOLEN_RESERVED_ADDR_MASK;
 
@@ -388,7 +395,8 @@ static void bdw_get_stolen_reserved(struct drm_i915_private *dev_priv,
 
 int i915_gem_init_stolen(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned long reserved_total, reserved_base = 0, reserved_size;
        unsigned long stolen_top;
 
@@ -401,14 +409,14 @@ int i915_gem_init_stolen(struct drm_device *dev)
        }
 #endif
 
-       if (dev_priv->gtt.stolen_size == 0)
+       if (ggtt->stolen_size == 0)
                return 0;
 
        dev_priv->mm.stolen_base = i915_stolen_to_physical(dev);
        if (dev_priv->mm.stolen_base == 0)
                return 0;
 
-       stolen_top = dev_priv->mm.stolen_base + dev_priv->gtt.stolen_size;
+       stolen_top = dev_priv->mm.stolen_base + ggtt->stolen_size;
 
        switch (INTEL_INFO(dev_priv)->gen) {
        case 2:
@@ -458,19 +466,18 @@ int i915_gem_init_stolen(struct drm_device *dev)
                return 0;
        }
 
-       dev_priv->gtt.stolen_reserved_base = reserved_base;
-       dev_priv->gtt.stolen_reserved_size = reserved_size;
+       ggtt->stolen_reserved_base = reserved_base;
+       ggtt->stolen_reserved_size = reserved_size;
 
        /* It is possible for the reserved area to end before the end of stolen
         * memory, so just consider the start. */
        reserved_total = stolen_top - reserved_base;
 
        DRM_DEBUG_KMS("Memory reserved for graphics device: %zuK, usable: %luK\n",
-                     dev_priv->gtt.stolen_size >> 10,
-                     (dev_priv->gtt.stolen_size - reserved_total) >> 10);
+                     ggtt->stolen_size >> 10,
+                     (ggtt->stolen_size - reserved_total) >> 10);
 
-       dev_priv->gtt.stolen_usable_size = dev_priv->gtt.stolen_size -
-                                          reserved_total;
+       ggtt->stolen_usable_size = ggtt->stolen_size - reserved_total;
 
        /*
         * Basic memrange allocator for stolen space.
@@ -483,7 +490,7 @@ int i915_gem_init_stolen(struct drm_device *dev)
         * i915_gem_stolen_insert_node_in_range(). We may want to fix the fbcon
         * problem later.
         */
-       drm_mm_init(&dev_priv->mm.stolen, 0, dev_priv->gtt.stolen_usable_size);
+       drm_mm_init(&dev_priv->mm.stolen, 0, ggtt->stolen_usable_size);
 
        return 0;
 }
@@ -492,12 +499,13 @@ static struct sg_table *
 i915_pages_create_for_stolen(struct drm_device *dev,
                             u32 offset, u32 size)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct sg_table *st;
        struct scatterlist *sg;
 
        DRM_DEBUG_DRIVER("offset=0x%x, size=%d\n", offset, size);
-       BUG_ON(offset > dev_priv->gtt.stolen_size - size);
+       BUG_ON(offset > ggtt->stolen_size - size);
 
        /* We hide that we have no struct page backing our stolen object
         * by wrapping the contiguous physical allocation with a fake
@@ -628,8 +636,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
                                               u32 gtt_offset,
                                               u32 size)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct i915_address_space *ggtt = &dev_priv->gtt.base;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_object *obj;
        struct drm_mm_node *stolen;
        struct i915_vma *vma;
@@ -675,7 +683,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
        if (gtt_offset == I915_GTT_OFFSET_NONE)
                return obj;
 
-       vma = i915_gem_obj_lookup_or_create_vma(obj, ggtt);
+       vma = i915_gem_obj_lookup_or_create_vma(obj, &ggtt->base);
        if (IS_ERR(vma)) {
                ret = PTR_ERR(vma);
                goto err;
@@ -688,8 +696,8 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
         */
        vma->node.start = gtt_offset;
        vma->node.size = size;
-       if (drm_mm_initialized(&ggtt->mm)) {
-               ret = drm_mm_reserve_node(&ggtt->mm, &vma->node);
+       if (drm_mm_initialized(&ggtt->base.mm)) {
+               ret = drm_mm_reserve_node(&ggtt->base.mm, &vma->node);
                if (ret) {
                        DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
                        goto err;
@@ -697,7 +705,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
 
                vma->bound |= GLOBAL_BIND;
                __i915_vma_set_map_and_fenceable(vma);
-               list_add_tail(&vma->vm_link, &ggtt->inactive_list);
+               list_add_tail(&vma->vm_link, &ggtt->base.inactive_list);
        }
 
        list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);
index 7410f6c962e7b2889d8fa239a9f5bcb9c8f4d332..b9bdb34032cdcd861528446aec4ab625e3894050 100644 (file)
@@ -166,7 +166,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
        struct drm_i915_gem_object *obj;
        int ret = 0;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
 
@@ -297,7 +297,7 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_i915_gem_object *obj;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, file, args->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(file, args->handle));
        if (&obj->base == NULL)
                return -ENOENT;
 
index 4d30b60defda44adcbc24eea0be77d1e9278e804..32d9726e38b11878915ceef5c9f556fac1910459 100644 (file)
@@ -34,7 +34,7 @@
 
 struct i915_mm_struct {
        struct mm_struct *mm;
-       struct drm_device *dev;
+       struct drm_i915_private *i915;
        struct i915_mmu_notifier *mn;
        struct hlist_node node;
        struct kref kref;
@@ -49,6 +49,7 @@ struct i915_mmu_notifier {
        struct hlist_node node;
        struct mmu_notifier mn;
        struct rb_root objects;
+       struct workqueue_struct *wq;
 };
 
 struct i915_mmu_object {
@@ -60,6 +61,37 @@ struct i915_mmu_object {
        bool attached;
 };
 
+static void wait_rendering(struct drm_i915_gem_object *obj)
+{
+       struct drm_device *dev = obj->base.dev;
+       struct drm_i915_gem_request *requests[I915_NUM_ENGINES];
+       int i, n;
+
+       if (!obj->active)
+               return;
+
+       n = 0;
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
+               struct drm_i915_gem_request *req;
+
+               req = obj->last_read_req[i];
+               if (req == NULL)
+                       continue;
+
+               requests[n++] = i915_gem_request_reference(req);
+       }
+
+       mutex_unlock(&dev->struct_mutex);
+
+       for (i = 0; i < n; i++)
+               __i915_wait_request(requests[i], false, NULL, NULL);
+
+       mutex_lock(&dev->struct_mutex);
+
+       for (i = 0; i < n; i++)
+               i915_gem_request_unreference(requests[i]);
+}
+
 static void cancel_userptr(struct work_struct *work)
 {
        struct i915_mmu_object *mo = container_of(work, typeof(*mo), work);
@@ -75,13 +107,13 @@ static void cancel_userptr(struct work_struct *work)
                struct i915_vma *vma, *tmp;
                bool was_interruptible;
 
+               wait_rendering(obj);
+
                was_interruptible = dev_priv->mm.interruptible;
                dev_priv->mm.interruptible = false;
 
-               list_for_each_entry_safe(vma, tmp, &obj->vma_list, obj_link) {
-                       int ret = i915_vma_unbind(vma);
-                       WARN_ON(ret && ret != -EIO);
-               }
+               list_for_each_entry_safe(vma, tmp, &obj->vma_list, obj_link)
+                       WARN_ON(i915_vma_unbind(vma));
                WARN_ON(i915_gem_object_put_pages(obj));
 
                dev_priv->mm.interruptible = was_interruptible;
@@ -140,7 +172,7 @@ static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
                 */
                mo = container_of(it, struct i915_mmu_object, it);
                if (kref_get_unless_zero(&mo->obj->base.refcount))
-                       schedule_work(&mo->work);
+                       queue_work(mn->wq, &mo->work);
 
                list_add(&mo->link, &cancelled);
                it = interval_tree_iter_next(it, start, end);
@@ -148,6 +180,8 @@ static void i915_gem_userptr_mn_invalidate_range_start(struct mmu_notifier *_mn,
        list_for_each_entry(mo, &cancelled, link)
                del_object(mo);
        spin_unlock(&mn->lock);
+
+       flush_workqueue(mn->wq);
 }
 
 static const struct mmu_notifier_ops i915_gem_userptr_notifier = {
@@ -167,10 +201,16 @@ i915_mmu_notifier_create(struct mm_struct *mm)
        spin_lock_init(&mn->lock);
        mn->mn.ops = &i915_gem_userptr_notifier;
        mn->objects = RB_ROOT;
+       mn->wq = alloc_workqueue("i915-userptr-release", WQ_UNBOUND, 0);
+       if (mn->wq == NULL) {
+               kfree(mn);
+               return ERR_PTR(-ENOMEM);
+       }
 
         /* Protected by mmap_sem (write-lock) */
        ret = __mmu_notifier_register(&mn->mn, mm);
        if (ret) {
+               destroy_workqueue(mn->wq);
                kfree(mn);
                return ERR_PTR(ret);
        }
@@ -205,13 +245,13 @@ i915_mmu_notifier_find(struct i915_mm_struct *mm)
                return mn;
 
        down_write(&mm->mm->mmap_sem);
-       mutex_lock(&to_i915(mm->dev)->mm_lock);
+       mutex_lock(&mm->i915->mm_lock);
        if ((mn = mm->mn) == NULL) {
                mn = i915_mmu_notifier_create(mm->mm);
                if (!IS_ERR(mn))
                        mm->mn = mn;
        }
-       mutex_unlock(&to_i915(mm->dev)->mm_lock);
+       mutex_unlock(&mm->i915->mm_lock);
        up_write(&mm->mm->mmap_sem);
 
        return mn;
@@ -256,6 +296,7 @@ i915_mmu_notifier_free(struct i915_mmu_notifier *mn,
                return;
 
        mmu_notifier_unregister(&mn->mn, mm);
+       destroy_workqueue(mn->wq);
        kfree(mn);
 }
 
@@ -327,7 +368,7 @@ i915_gem_userptr_init__mm_struct(struct drm_i915_gem_object *obj)
                }
 
                kref_init(&mm->kref);
-               mm->dev = obj->base.dev;
+               mm->i915 = to_i915(obj->base.dev);
 
                mm->mm = current->mm;
                atomic_inc(&current->mm->mm_count);
@@ -362,7 +403,7 @@ __i915_mm_struct_free(struct kref *kref)
 
        /* Protected by dev_priv->mm_lock */
        hash_del(&mm->node);
-       mutex_unlock(&to_i915(mm->dev)->mm_lock);
+       mutex_unlock(&mm->i915->mm_lock);
 
        INIT_WORK(&mm->work, __i915_mm_struct_free__worker);
        schedule_work(&mm->work);
@@ -494,10 +535,7 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work)
        ret = -ENOMEM;
        pinned = 0;
 
-       pvec = kmalloc(npages*sizeof(struct page *),
-                      GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
-       if (pvec == NULL)
-               pvec = drm_malloc_ab(npages, sizeof(struct page *));
+       pvec = drm_malloc_gfp(npages, sizeof(struct page *), GFP_TEMPORARY);
        if (pvec != NULL) {
                struct mm_struct *mm = obj->userptr.mm->mm;
 
@@ -639,14 +677,11 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj)
        pvec = NULL;
        pinned = 0;
        if (obj->userptr.mm->mm == current->mm) {
-               pvec = kmalloc(num_pages*sizeof(struct page *),
-                              GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
+               pvec = drm_malloc_gfp(num_pages, sizeof(struct page *),
+                                     GFP_TEMPORARY);
                if (pvec == NULL) {
-                       pvec = drm_malloc_ab(num_pages, sizeof(struct page *));
-                       if (pvec == NULL) {
-                               __i915_gem_userptr_set_active(obj, false);
-                               return -ENOMEM;
-                       }
+                       __i915_gem_userptr_set_active(obj, false);
+                       return -ENOMEM;
                }
 
                pinned = __get_user_pages_fast(obj->userptr.ptr, num_pages,
@@ -763,6 +798,13 @@ i915_gem_userptr_ioctl(struct drm_device *dev, void *data, struct drm_file *file
        int ret;
        u32 handle;
 
+       if (!HAS_LLC(dev) && !HAS_SNOOP(dev)) {
+               /* We cannot support coherent userptr objects on hw without
+                * LLC and broken snooping.
+                */
+               return -ENODEV;
+       }
+
        if (args->flags & ~(I915_USERPTR_READ_ONLY |
                            I915_USERPTR_UNSYNCHRONIZED))
                return -EINVAL;
index 831895b8cb75d61ec00857e9f66b0d529386a071..89725c9efc2580c2adc061365456b3624bfbffdb 100644 (file)
@@ -198,7 +198,7 @@ static void print_error_buffers(struct drm_i915_error_state_buf *m,
                           err->size,
                           err->read_domains,
                           err->write_domain);
-               for (i = 0; i < I915_NUM_RINGS; i++)
+               for (i = 0; i < I915_NUM_ENGINES; i++)
                        err_printf(m, "%02x ", err->rseqno[i]);
 
                err_printf(m, "] %02x", err->wseqno);
@@ -230,8 +230,6 @@ static const char *hangcheck_action_to_str(enum intel_ring_hangcheck_action a)
                return "wait";
        case HANGCHECK_ACTIVE:
                return "active";
-       case HANGCHECK_ACTIVE_LOOP:
-               return "active (loop)";
        case HANGCHECK_KICK:
                return "kick";
        case HANGCHECK_HUNG:
@@ -298,6 +296,7 @@ static void i915_ring_error_state(struct drm_i915_error_state_buf *m,
                }
        }
        err_printf(m, "  seqno: 0x%08x\n", ring->seqno);
+       err_printf(m, "  last_seqno: 0x%08x\n", ring->last_seqno);
        err_printf(m, "  waiting: %s\n", yesno(ring->waiting));
        err_printf(m, "  ring->head: 0x%08x\n", ring->cpu_ring_head);
        err_printf(m, "  ring->tail: 0x%08x\n", ring->cpu_ring_tail);
@@ -433,7 +432,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
        for (i = 0; i < ARRAY_SIZE(error->ring); i++) {
                obj = error->ring[i].batchbuffer;
                if (obj) {
-                       err_puts(m, dev_priv->ring[i].name);
+                       err_puts(m, dev_priv->engine[i].name);
                        if (error->ring[i].pid != -1)
                                err_printf(m, " (submitted by %s [%d])",
                                           error->ring[i].comm,
@@ -447,14 +446,14 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
                obj = error->ring[i].wa_batchbuffer;
                if (obj) {
                        err_printf(m, "%s (w/a) --- gtt_offset = 0x%08x\n",
-                                  dev_priv->ring[i].name,
+                                  dev_priv->engine[i].name,
                                   lower_32_bits(obj->gtt_offset));
                        print_error_obj(m, obj);
                }
 
                if (error->ring[i].num_requests) {
                        err_printf(m, "%s --- %d requests\n",
-                                  dev_priv->ring[i].name,
+                                  dev_priv->engine[i].name,
                                   error->ring[i].num_requests);
                        for (j = 0; j < error->ring[i].num_requests; j++) {
                                err_printf(m, "  seqno 0x%08x, emitted %ld, tail 0x%08x\n",
@@ -466,7 +465,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
 
                if ((obj = error->ring[i].ringbuffer)) {
                        err_printf(m, "%s --- ringbuffer = 0x%08x\n",
-                                  dev_priv->ring[i].name,
+                                  dev_priv->engine[i].name,
                                   lower_32_bits(obj->gtt_offset));
                        print_error_obj(m, obj);
                }
@@ -480,7 +479,7 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
                                hws_page = &obj->pages[LRC_PPHWSP_PN][0];
                        }
                        err_printf(m, "%s --- HW Status = 0x%08llx\n",
-                                  dev_priv->ring[i].name, hws_offset);
+                                  dev_priv->engine[i].name, hws_offset);
                        offset = 0;
                        for (elt = 0; elt < PAGE_SIZE/16; elt += 4) {
                                err_printf(m, "[%04x] %08x %08x %08x %08x\n",
@@ -493,9 +492,31 @@ int i915_error_state_to_str(struct drm_i915_error_state_buf *m,
                        }
                }
 
+               obj = error->ring[i].wa_ctx;
+               if (obj) {
+                       u64 wa_ctx_offset = obj->gtt_offset;
+                       u32 *wa_ctx_page = &obj->pages[0][0];
+                       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
+                       u32 wa_ctx_size = (engine->wa_ctx.indirect_ctx.size +
+                                          engine->wa_ctx.per_ctx.size);
+
+                       err_printf(m, "%s --- WA ctx batch buffer = 0x%08llx\n",
+                                  dev_priv->engine[i].name, wa_ctx_offset);
+                       offset = 0;
+                       for (elt = 0; elt < wa_ctx_size; elt += 4) {
+                               err_printf(m, "[%04x] %08x %08x %08x %08x\n",
+                                          offset,
+                                          wa_ctx_page[elt + 0],
+                                          wa_ctx_page[elt + 1],
+                                          wa_ctx_page[elt + 2],
+                                          wa_ctx_page[elt + 3]);
+                               offset += 16;
+                       }
+               }
+
                if ((obj = error->ring[i].ctx)) {
                        err_printf(m, "%s --- HW Context = 0x%08x\n",
-                                  dev_priv->ring[i].name,
+                                  dev_priv->engine[i].name,
                                   lower_32_bits(obj->gtt_offset));
                        print_error_obj(m, obj);
                }
@@ -585,6 +606,7 @@ static void i915_error_state_free(struct kref *error_ref)
                i915_error_object_free(error->ring[i].hws_page);
                i915_error_object_free(error->ring[i].ctx);
                kfree(error->ring[i].requests);
+               i915_error_object_free(error->ring[i].wa_ctx);
        }
 
        i915_error_object_free(error->semaphore_obj);
@@ -606,6 +628,7 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
                         struct drm_i915_gem_object *src,
                         struct i915_address_space *vm)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_error_object *dst;
        struct i915_vma *vma = NULL;
        int num_pages;
@@ -632,7 +655,7 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
                vma = i915_gem_obj_to_ggtt(src);
        use_ggtt = (src->cache_level == I915_CACHE_NONE &&
                   vma && (vma->bound & GLOBAL_BIND) &&
-                  reloc_offset + num_pages * PAGE_SIZE <= dev_priv->gtt.mappable_end);
+                  reloc_offset + num_pages * PAGE_SIZE <= ggtt->mappable_end);
 
        /* Cannot access stolen address directly, try to use the aperture */
        if (src->stolen) {
@@ -642,12 +665,13 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
                        goto unwind;
 
                reloc_offset = i915_gem_obj_ggtt_offset(src);
-               if (reloc_offset + num_pages * PAGE_SIZE > dev_priv->gtt.mappable_end)
+               if (reloc_offset + num_pages * PAGE_SIZE > ggtt->mappable_end)
                        goto unwind;
        }
 
        /* Cannot access snooped pages through the aperture */
-       if (use_ggtt && src->cache_level != I915_CACHE_NONE && !HAS_LLC(dev_priv->dev))
+       if (use_ggtt && src->cache_level != I915_CACHE_NONE &&
+           !HAS_LLC(dev_priv))
                goto unwind;
 
        dst->page_count = num_pages;
@@ -668,7 +692,7 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
                         * captures what the GPU read.
                         */
 
-                       s = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
+                       s = io_mapping_map_atomic_wc(ggtt->mappable,
                                                     reloc_offset);
                        memcpy_fromio(d, s, PAGE_SIZE);
                        io_mapping_unmap_atomic(s);
@@ -701,7 +725,7 @@ unwind:
        return NULL;
 }
 #define i915_error_ggtt_object_create(dev_priv, src) \
-       i915_error_object_create((dev_priv), (src), &(dev_priv)->gtt.base)
+       i915_error_object_create((dev_priv), (src), &(dev_priv)->ggtt.base)
 
 static void capture_bo(struct drm_i915_error_buffer *err,
                       struct i915_vma *vma)
@@ -711,7 +735,7 @@ static void capture_bo(struct drm_i915_error_buffer *err,
 
        err->size = obj->base.size;
        err->name = obj->base.name;
-       for (i = 0; i < I915_NUM_RINGS; i++)
+       for (i = 0; i < I915_NUM_ENGINES; i++)
                err->rseqno[i] = i915_gem_request_get_seqno(obj->last_read_req[i]);
        err->wseqno = i915_gem_request_get_seqno(obj->last_write_req);
        err->gtt_offset = vma->node.start;
@@ -726,7 +750,7 @@ static void capture_bo(struct drm_i915_error_buffer *err,
        err->purgeable = obj->madv != I915_MADV_WILLNEED;
        err->userptr = obj->userptr.mm != NULL;
        err->ring = obj->last_write_req ?
-                       i915_gem_request_get_ring(obj->last_write_req)->id : -1;
+                       i915_gem_request_get_engine(obj->last_write_req)->id : -1;
        err->cache_level = obj->cache_level;
 }
 
@@ -788,7 +812,7 @@ static uint32_t i915_error_generate_code(struct drm_i915_private *dev_priv,
         * synchronization commands which almost always appear in the case
         * strictly a client bug. Use instdone to differentiate those some.
         */
-       for (i = 0; i < I915_NUM_RINGS; i++) {
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
                if (error->ring[i].hangcheck_action == HANGCHECK_HUNG) {
                        if (ring_id)
                                *ring_id = i;
@@ -821,11 +845,11 @@ static void i915_gem_record_fences(struct drm_device *dev,
 
 static void gen8_record_semaphore_state(struct drm_i915_private *dev_priv,
                                        struct drm_i915_error_state *error,
-                                       struct intel_engine_cs *ring,
+                                       struct intel_engine_cs *engine,
                                        struct drm_i915_error_ring *ering)
 {
        struct intel_engine_cs *to;
-       int i;
+       enum intel_engine_id id;
 
        if (!i915_semaphore_is_enabled(dev_priv->dev))
                return;
@@ -835,68 +859,69 @@ static void gen8_record_semaphore_state(struct drm_i915_private *dev_priv,
                        i915_error_ggtt_object_create(dev_priv,
                                                      dev_priv->semaphore_obj);
 
-       for_each_ring(to, dev_priv, i) {
+       for_each_engine_id(to, dev_priv, id) {
                int idx;
                u16 signal_offset;
                u32 *tmp;
 
-               if (ring == to)
+               if (engine == to)
                        continue;
 
-               signal_offset = (GEN8_SIGNAL_OFFSET(ring, i) & (PAGE_SIZE - 1))
+               signal_offset = (GEN8_SIGNAL_OFFSET(engine, id) & (PAGE_SIZE - 1))
                                / 4;
                tmp = error->semaphore_obj->pages[0];
-               idx = intel_ring_sync_index(ring, to);
+               idx = intel_ring_sync_index(engine, to);
 
                ering->semaphore_mboxes[idx] = tmp[signal_offset];
-               ering->semaphore_seqno[idx] = ring->semaphore.sync_seqno[idx];
+               ering->semaphore_seqno[idx] = engine->semaphore.sync_seqno[idx];
        }
 }
 
 static void gen6_record_semaphore_state(struct drm_i915_private *dev_priv,
-                                       struct intel_engine_cs *ring,
+                                       struct intel_engine_cs *engine,
                                        struct drm_i915_error_ring *ering)
 {
-       ering->semaphore_mboxes[0] = I915_READ(RING_SYNC_0(ring->mmio_base));
-       ering->semaphore_mboxes[1] = I915_READ(RING_SYNC_1(ring->mmio_base));
-       ering->semaphore_seqno[0] = ring->semaphore.sync_seqno[0];
-       ering->semaphore_seqno[1] = ring->semaphore.sync_seqno[1];
+       ering->semaphore_mboxes[0] = I915_READ(RING_SYNC_0(engine->mmio_base));
+       ering->semaphore_mboxes[1] = I915_READ(RING_SYNC_1(engine->mmio_base));
+       ering->semaphore_seqno[0] = engine->semaphore.sync_seqno[0];
+       ering->semaphore_seqno[1] = engine->semaphore.sync_seqno[1];
 
-       if (HAS_VEBOX(dev_priv->dev)) {
+       if (HAS_VEBOX(dev_priv)) {
                ering->semaphore_mboxes[2] =
-                       I915_READ(RING_SYNC_2(ring->mmio_base));
-               ering->semaphore_seqno[2] = ring->semaphore.sync_seqno[2];
+                       I915_READ(RING_SYNC_2(engine->mmio_base));
+               ering->semaphore_seqno[2] = engine->semaphore.sync_seqno[2];
        }
 }
 
 static void i915_record_ring_state(struct drm_device *dev,
                                   struct drm_i915_error_state *error,
-                                  struct intel_engine_cs *ring,
+                                  struct intel_engine_cs *engine,
                                   struct drm_i915_error_ring *ering)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        if (INTEL_INFO(dev)->gen >= 6) {
-               ering->rc_psmi = I915_READ(RING_PSMI_CTL(ring->mmio_base));
-               ering->fault_reg = I915_READ(RING_FAULT_REG(ring));
+               ering->rc_psmi = I915_READ(RING_PSMI_CTL(engine->mmio_base));
+               ering->fault_reg = I915_READ(RING_FAULT_REG(engine));
                if (INTEL_INFO(dev)->gen >= 8)
-                       gen8_record_semaphore_state(dev_priv, error, ring, ering);
+                       gen8_record_semaphore_state(dev_priv, error, engine,
+                                                   ering);
                else
-                       gen6_record_semaphore_state(dev_priv, ring, ering);
+                       gen6_record_semaphore_state(dev_priv, engine, ering);
        }
 
        if (INTEL_INFO(dev)->gen >= 4) {
-               ering->faddr = I915_READ(RING_DMA_FADD(ring->mmio_base));
-               ering->ipeir = I915_READ(RING_IPEIR(ring->mmio_base));
-               ering->ipehr = I915_READ(RING_IPEHR(ring->mmio_base));
-               ering->instdone = I915_READ(RING_INSTDONE(ring->mmio_base));
-               ering->instps = I915_READ(RING_INSTPS(ring->mmio_base));
-               ering->bbaddr = I915_READ(RING_BBADDR(ring->mmio_base));
+               ering->faddr = I915_READ(RING_DMA_FADD(engine->mmio_base));
+               ering->ipeir = I915_READ(RING_IPEIR(engine->mmio_base));
+               ering->ipehr = I915_READ(RING_IPEHR(engine->mmio_base));
+               ering->instdone = I915_READ(RING_INSTDONE(engine->mmio_base));
+               ering->instps = I915_READ(RING_INSTPS(engine->mmio_base));
+               ering->bbaddr = I915_READ(RING_BBADDR(engine->mmio_base));
                if (INTEL_INFO(dev)->gen >= 8) {
-                       ering->faddr |= (u64) I915_READ(RING_DMA_FADD_UDW(ring->mmio_base)) << 32;
-                       ering->bbaddr |= (u64) I915_READ(RING_BBADDR_UDW(ring->mmio_base)) << 32;
+                       ering->faddr |= (u64) I915_READ(RING_DMA_FADD_UDW(engine->mmio_base)) << 32;
+                       ering->bbaddr |= (u64) I915_READ(RING_BBADDR_UDW(engine->mmio_base)) << 32;
                }
-               ering->bbstate = I915_READ(RING_BBSTATE(ring->mmio_base));
+               ering->bbstate = I915_READ(RING_BBSTATE(engine->mmio_base));
        } else {
                ering->faddr = I915_READ(DMA_FADD_I8XX);
                ering->ipeir = I915_READ(IPEIR);
@@ -904,20 +929,21 @@ static void i915_record_ring_state(struct drm_device *dev,
                ering->instdone = I915_READ(GEN2_INSTDONE);
        }
 
-       ering->waiting = waitqueue_active(&ring->irq_queue);
-       ering->instpm = I915_READ(RING_INSTPM(ring->mmio_base));
-       ering->seqno = ring->get_seqno(ring, false);
-       ering->acthd = intel_ring_get_active_head(ring);
-       ering->start = I915_READ_START(ring);
-       ering->head = I915_READ_HEAD(ring);
-       ering->tail = I915_READ_TAIL(ring);
-       ering->ctl = I915_READ_CTL(ring);
+       ering->waiting = waitqueue_active(&engine->irq_queue);
+       ering->instpm = I915_READ(RING_INSTPM(engine->mmio_base));
+       ering->acthd = intel_ring_get_active_head(engine);
+       ering->seqno = engine->get_seqno(engine);
+       ering->last_seqno = engine->last_submitted_seqno;
+       ering->start = I915_READ_START(engine);
+       ering->head = I915_READ_HEAD(engine);
+       ering->tail = I915_READ_TAIL(engine);
+       ering->ctl = I915_READ_CTL(engine);
 
        if (I915_NEED_GFX_HWS(dev)) {
                i915_reg_t mmio;
 
                if (IS_GEN7(dev)) {
-                       switch (ring->id) {
+                       switch (engine->id) {
                        default:
                        case RCS:
                                mmio = RENDER_HWS_PGA_GEN7;
@@ -932,51 +958,51 @@ static void i915_record_ring_state(struct drm_device *dev,
                                mmio = VEBOX_HWS_PGA_GEN7;
                                break;
                        }
-               } else if (IS_GEN6(ring->dev)) {
-                       mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
+               } else if (IS_GEN6(engine->dev)) {
+                       mmio = RING_HWS_PGA_GEN6(engine->mmio_base);
                } else {
                        /* XXX: gen8 returns to sanity */
-                       mmio = RING_HWS_PGA(ring->mmio_base);
+                       mmio = RING_HWS_PGA(engine->mmio_base);
                }
 
                ering->hws = I915_READ(mmio);
        }
 
-       ering->hangcheck_score = ring->hangcheck.score;
-       ering->hangcheck_action = ring->hangcheck.action;
+       ering->hangcheck_score = engine->hangcheck.score;
+       ering->hangcheck_action = engine->hangcheck.action;
 
        if (USES_PPGTT(dev)) {
                int i;
 
-               ering->vm_info.gfx_mode = I915_READ(RING_MODE_GEN7(ring));
+               ering->vm_info.gfx_mode = I915_READ(RING_MODE_GEN7(engine));
 
                if (IS_GEN6(dev))
                        ering->vm_info.pp_dir_base =
-                               I915_READ(RING_PP_DIR_BASE_READ(ring));
+                               I915_READ(RING_PP_DIR_BASE_READ(engine));
                else if (IS_GEN7(dev))
                        ering->vm_info.pp_dir_base =
-                               I915_READ(RING_PP_DIR_BASE(ring));
+                               I915_READ(RING_PP_DIR_BASE(engine));
                else if (INTEL_INFO(dev)->gen >= 8)
                        for (i = 0; i < 4; i++) {
                                ering->vm_info.pdp[i] =
-                                       I915_READ(GEN8_RING_PDP_UDW(ring, i));
+                                       I915_READ(GEN8_RING_PDP_UDW(engine, i));
                                ering->vm_info.pdp[i] <<= 32;
                                ering->vm_info.pdp[i] |=
-                                       I915_READ(GEN8_RING_PDP_LDW(ring, i));
+                                       I915_READ(GEN8_RING_PDP_LDW(engine, i));
                        }
        }
 }
 
 
-static void i915_gem_record_active_context(struct intel_engine_cs *ring,
+static void i915_gem_record_active_context(struct intel_engine_cs *engine,
                                           struct drm_i915_error_state *error,
                                           struct drm_i915_error_ring *ering)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        struct drm_i915_gem_object *obj;
 
        /* Currently render ring is the only HW context user */
-       if (ring->id != RCS || !error->ccid)
+       if (engine->id != RCS || !error->ccid)
                return;
 
        list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
@@ -993,30 +1019,31 @@ static void i915_gem_record_active_context(struct intel_engine_cs *ring,
 static void i915_gem_record_rings(struct drm_device *dev,
                                  struct drm_i915_error_state *error)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_request *request;
        int i, count;
 
-       for (i = 0; i < I915_NUM_RINGS; i++) {
-               struct intel_engine_cs *ring = &dev_priv->ring[i];
+       for (i = 0; i < I915_NUM_ENGINES; i++) {
+               struct intel_engine_cs *engine = &dev_priv->engine[i];
                struct intel_ringbuffer *rbuf;
 
                error->ring[i].pid = -1;
 
-               if (ring->dev == NULL)
+               if (engine->dev == NULL)
                        continue;
 
                error->ring[i].valid = true;
 
-               i915_record_ring_state(dev, error, ring, &error->ring[i]);
+               i915_record_ring_state(dev, error, engine, &error->ring[i]);
 
-               request = i915_gem_find_active_request(ring);
+               request = i915_gem_find_active_request(engine);
                if (request) {
                        struct i915_address_space *vm;
 
                        vm = request->ctx && request->ctx->ppgtt ?
                                &request->ctx->ppgtt->base :
-                               &dev_priv->gtt.base;
+                               &ggtt->base;
 
                        /* We need to copy these to an anonymous buffer
                         * as the simplest method to avoid being overwritten
@@ -1027,10 +1054,10 @@ static void i915_gem_record_rings(struct drm_device *dev,
                                                         request->batch_obj,
                                                         vm);
 
-                       if (HAS_BROKEN_CS_TLB(dev_priv->dev))
+                       if (HAS_BROKEN_CS_TLB(dev_priv))
                                error->ring[i].wa_batchbuffer =
                                        i915_error_ggtt_object_create(dev_priv,
-                                                            ring->scratch.obj);
+                                                            engine->scratch.obj);
 
                        if (request->pid) {
                                struct task_struct *task;
@@ -1052,11 +1079,11 @@ static void i915_gem_record_rings(struct drm_device *dev,
                         * executed).
                         */
                        if (request)
-                               rbuf = request->ctx->engine[ring->id].ringbuf;
+                               rbuf = request->ctx->engine[engine->id].ringbuf;
                        else
-                               rbuf = dev_priv->kernel_context->engine[ring->id].ringbuf;
+                               rbuf = dev_priv->kernel_context->engine[engine->id].ringbuf;
                } else
-                       rbuf = ring->buffer;
+                       rbuf = engine->buffer;
 
                error->ring[i].cpu_ring_head = rbuf->head;
                error->ring[i].cpu_ring_tail = rbuf->tail;
@@ -1065,12 +1092,19 @@ static void i915_gem_record_rings(struct drm_device *dev,
                        i915_error_ggtt_object_create(dev_priv, rbuf->obj);
 
                error->ring[i].hws_page =
-                       i915_error_ggtt_object_create(dev_priv, ring->status_page.obj);
+                       i915_error_ggtt_object_create(dev_priv,
+                                                     engine->status_page.obj);
+
+               if (engine->wa_ctx.obj) {
+                       error->ring[i].wa_ctx =
+                               i915_error_ggtt_object_create(dev_priv,
+                                                             engine->wa_ctx.obj);
+               }
 
-               i915_gem_record_active_context(ring, error, &error->ring[i]);
+               i915_gem_record_active_context(engine, error, &error->ring[i]);
 
                count = 0;
-               list_for_each_entry(request, &ring->request_list, list)
+               list_for_each_entry(request, &engine->request_list, list)
                        count++;
 
                error->ring[i].num_requests = count;
@@ -1083,7 +1117,7 @@ static void i915_gem_record_rings(struct drm_device *dev,
                }
 
                count = 0;
-               list_for_each_entry(request, &ring->request_list, list) {
+               list_for_each_entry(request, &engine->request_list, list) {
                        struct drm_i915_error_request *erq;
 
                        if (count >= error->ring[i].num_requests) {
@@ -1272,7 +1306,7 @@ static void i915_capture_reg_state(struct drm_i915_private *dev_priv,
 
 static void i915_error_capture_msg(struct drm_device *dev,
                                   struct drm_i915_error_state *error,
-                                  bool wedged,
+                                  u32 engine_mask,
                                   const char *error_msg)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1295,7 +1329,7 @@ static void i915_error_capture_msg(struct drm_device *dev,
        scnprintf(error->error_msg + len, sizeof(error->error_msg) - len,
                  ", reason: %s, action: %s",
                  error_msg,
-                 wedged ? "reset" : "continue");
+                 engine_mask ? "reset" : "continue");
 }
 
 static void i915_capture_gen_state(struct drm_i915_private *dev_priv,
@@ -1318,7 +1352,7 @@ static void i915_capture_gen_state(struct drm_i915_private *dev_priv,
  * out a structure which becomes available in debugfs for user level tools
  * to pick up.
  */
-void i915_capture_error_state(struct drm_device *dev, bool wedged,
+void i915_capture_error_state(struct drm_device *dev, u32 engine_mask,
                              const char *error_msg)
 {
        static bool warned;
@@ -1346,7 +1380,7 @@ void i915_capture_error_state(struct drm_device *dev, bool wedged,
        error->overlay = intel_overlay_capture_error_state(dev);
        error->display = intel_display_capture_error_state(dev);
 
-       i915_error_capture_msg(dev, error, wedged, error_msg);
+       i915_error_capture_msg(dev, error, engine_mask, error_msg);
        DRM_INFO("%s\n", error->error_msg);
 
        spin_lock_irqsave(&dev_priv->gpu_error.lock, flags);
index e4ba5822289bb6dcbc0a225c02e87d62fe48175a..80786d9f9ad365c83de4d12b2713608894051cfb 100644 (file)
 /* Definitions of GuC H/W registers, bits, etc */
 
 #define GUC_STATUS                     _MMIO(0xc000)
+#define   GS_RESET_SHIFT               0
+#define   GS_MIA_IN_RESET                (0x01 << GS_RESET_SHIFT)
 #define   GS_BOOTROM_SHIFT             1
 #define   GS_BOOTROM_MASK                (0x7F << GS_BOOTROM_SHIFT)
 #define   GS_BOOTROM_RSA_FAILED                  (0x50 << GS_BOOTROM_SHIFT)
+#define   GS_BOOTROM_JUMP_PASSED         (0x76 << GS_BOOTROM_SHIFT)
 #define   GS_UKERNEL_SHIFT             8
 #define   GS_UKERNEL_MASK                (0xFF << GS_UKERNEL_SHIFT)
 #define   GS_UKERNEL_LAPIC_DONE                  (0x30 << GS_UKERNEL_SHIFT)
 #define   GS_UKERNEL_READY               (0xF0 << GS_UKERNEL_SHIFT)
 #define   GS_MIA_SHIFT                 16
 #define   GS_MIA_MASK                    (0x07 << GS_MIA_SHIFT)
-#define   GS_MIA_CORE_STATE              (1 << GS_MIA_SHIFT)
+#define   GS_MIA_CORE_STATE              (0x01 << GS_MIA_SHIFT)
+#define   GS_MIA_HALT_REQUESTED                  (0x02 << GS_MIA_SHIFT)
+#define   GS_MIA_ISR_ENTRY               (0x04 << GS_MIA_SHIFT)
+#define   GS_AUTH_STATUS_SHIFT         30
+#define   GS_AUTH_STATUS_MASK            (0x03 << GS_AUTH_STATUS_SHIFT)
+#define   GS_AUTH_STATUS_BAD             (0x01 << GS_AUTH_STATUS_SHIFT)
+#define   GS_AUTH_STATUS_GOOD            (0x02 << GS_AUTH_STATUS_SHIFT)
 
 #define SOFT_SCRATCH(n)                        _MMIO(0xc180 + (n) * 4)
 #define SOFT_SCRATCH_COUNT             16
index d7543efc8a5e7a4a6f065f38504366826853d724..d40c13fb6643773c41774b7f8519a804bf33b39b 100644 (file)
@@ -179,15 +179,11 @@ static void guc_init_doorbell(struct intel_guc *guc,
                              struct i915_guc_client *client)
 {
        struct guc_doorbell_info *doorbell;
-       void *base;
 
-       base = kmap_atomic(i915_gem_object_get_page(client->client_obj, 0));
-       doorbell = base + client->doorbell_offset;
+       doorbell = client->client_base + client->doorbell_offset;
 
-       doorbell->db_status = 1;
+       doorbell->db_status = GUC_DOORBELL_ENABLED;
        doorbell->cookie = 0;
-
-       kunmap_atomic(base);
 }
 
 static int guc_ring_doorbell(struct i915_guc_client *gc)
@@ -195,11 +191,9 @@ static int guc_ring_doorbell(struct i915_guc_client *gc)
        struct guc_process_desc *desc;
        union guc_doorbell_qw db_cmp, db_exc, db_ret;
        union guc_doorbell_qw *db;
-       void *base;
        int attempt = 2, ret = -EAGAIN;
 
-       base = kmap_atomic(i915_gem_object_get_page(gc->client_obj, 0));
-       desc = base + gc->proc_desc_offset;
+       desc = gc->client_base + gc->proc_desc_offset;
 
        /* Update the tail so it is visible to GuC */
        desc->tail = gc->wq_tail;
@@ -215,7 +209,7 @@ static int guc_ring_doorbell(struct i915_guc_client *gc)
                db_exc.cookie = 1;
 
        /* pointer of current doorbell cacheline */
-       db = base + gc->doorbell_offset;
+       db = gc->client_base + gc->doorbell_offset;
 
        while (attempt--) {
                /* lets ring the doorbell */
@@ -244,10 +238,6 @@ static int guc_ring_doorbell(struct i915_guc_client *gc)
                        db_exc.cookie = 1;
        }
 
-       /* Finally, update the cached copy of the GuC's WQ head */
-       gc->wq_head = desc->head;
-
-       kunmap_atomic(base);
        return ret;
 }
 
@@ -256,16 +246,12 @@ static void guc_disable_doorbell(struct intel_guc *guc,
 {
        struct drm_i915_private *dev_priv = guc_to_i915(guc);
        struct guc_doorbell_info *doorbell;
-       void *base;
        i915_reg_t drbreg = GEN8_DRBREGL(client->doorbell_id);
        int value;
 
-       base = kmap_atomic(i915_gem_object_get_page(client->client_obj, 0));
-       doorbell = base + client->doorbell_offset;
+       doorbell = client->client_base + client->doorbell_offset;
 
-       doorbell->db_status = 0;
-
-       kunmap_atomic(base);
+       doorbell->db_status = GUC_DOORBELL_DISABLED;
 
        I915_WRITE(drbreg, I915_READ(drbreg) & ~GEN8_DRB_VALID);
 
@@ -341,10 +327,8 @@ static void guc_init_proc_desc(struct intel_guc *guc,
                               struct i915_guc_client *client)
 {
        struct guc_process_desc *desc;
-       void *base;
 
-       base = kmap_atomic(i915_gem_object_get_page(client->client_obj, 0));
-       desc = base + client->proc_desc_offset;
+       desc = client->client_base + client->proc_desc_offset;
 
        memset(desc, 0, sizeof(*desc));
 
@@ -361,8 +345,6 @@ static void guc_init_proc_desc(struct intel_guc *guc,
        desc->wq_size_bytes = client->wq_size;
        desc->wq_status = WQ_STATUS_ACTIVE;
        desc->priority = client->priority;
-
-       kunmap_atomic(base);
 }
 
 /*
@@ -376,12 +358,14 @@ static void guc_init_proc_desc(struct intel_guc *guc,
 static void guc_init_ctx_desc(struct intel_guc *guc,
                              struct i915_guc_client *client)
 {
+       struct drm_i915_gem_object *client_obj = client->client_obj;
        struct drm_i915_private *dev_priv = guc_to_i915(guc);
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct intel_context *ctx = client->owner;
        struct guc_context_desc desc;
        struct sg_table *sg;
-       int i;
+       enum intel_engine_id id;
+       u32 gfx_addr;
 
        memset(&desc, 0, sizeof(desc));
 
@@ -390,8 +374,8 @@ static void guc_init_ctx_desc(struct intel_guc *guc,
        desc.priority = client->priority;
        desc.db_id = client->doorbell_id;
 
-       for_each_ring(ring, dev_priv, i) {
-               struct guc_execlist_context *lrc = &desc.lrc[ring->guc_id];
+       for_each_engine_id(engine, dev_priv, id) {
+               struct guc_execlist_context *lrc = &desc.lrc[engine->guc_id];
                struct drm_i915_gem_object *obj;
                uint64_t ctx_desc;
 
@@ -402,48 +386,44 @@ static void guc_init_ctx_desc(struct intel_guc *guc,
                 * for now who owns a GuC client. But for future owner of GuC
                 * client, need to make sure lrc is pinned prior to enter here.
                 */
-               obj = ctx->engine[i].state;
+               obj = ctx->engine[id].state;
                if (!obj)
                        break;  /* XXX: continue? */
 
-               ctx_desc = intel_lr_context_descriptor(ctx, ring);
+               ctx_desc = intel_lr_context_descriptor(ctx, engine);
                lrc->context_desc = (u32)ctx_desc;
 
                /* The state page is after PPHWSP */
-               lrc->ring_lcra = i915_gem_obj_ggtt_offset(obj) +
-                               LRC_STATE_PN * PAGE_SIZE;
+               gfx_addr = i915_gem_obj_ggtt_offset(obj);
+               lrc->ring_lcra = gfx_addr + LRC_STATE_PN * PAGE_SIZE;
                lrc->context_id = (client->ctx_index << GUC_ELC_CTXID_OFFSET) |
-                               (ring->guc_id << GUC_ELC_ENGINE_OFFSET);
+                               (engine->guc_id << GUC_ELC_ENGINE_OFFSET);
 
-               obj = ctx->engine[i].ringbuf->obj;
+               obj = ctx->engine[id].ringbuf->obj;
+               gfx_addr = i915_gem_obj_ggtt_offset(obj);
 
-               lrc->ring_begin = i915_gem_obj_ggtt_offset(obj);
-               lrc->ring_end = lrc->ring_begin + obj->base.size - 1;
-               lrc->ring_next_free_location = lrc->ring_begin;
+               lrc->ring_begin = gfx_addr;
+               lrc->ring_end = gfx_addr + obj->base.size - 1;
+               lrc->ring_next_free_location = gfx_addr;
                lrc->ring_current_tail_pointer_value = 0;
 
-               desc.engines_used |= (1 << ring->guc_id);
+               desc.engines_used |= (1 << engine->guc_id);
        }
 
        WARN_ON(desc.engines_used == 0);
 
        /*
-        * The CPU address is only needed at certain points, so kmap_atomic on
-        * demand instead of storing it in the ctx descriptor.
-        * XXX: May make debug easier to have it mapped
+        * The doorbell, process descriptor, and workqueue are all parts
+        * of the client object, which the GuC will reference via the GGTT
         */
-       desc.db_trigger_cpu = 0;
-       desc.db_trigger_uk = client->doorbell_offset +
-               i915_gem_obj_ggtt_offset(client->client_obj);
-       desc.db_trigger_phy = client->doorbell_offset +
-               sg_dma_address(client->client_obj->pages->sgl);
-
-       desc.process_desc = client->proc_desc_offset +
-               i915_gem_obj_ggtt_offset(client->client_obj);
-
-       desc.wq_addr = client->wq_offset +
-               i915_gem_obj_ggtt_offset(client->client_obj);
-
+       gfx_addr = i915_gem_obj_ggtt_offset(client_obj);
+       desc.db_trigger_phy = sg_dma_address(client_obj->pages->sgl) +
+                               client->doorbell_offset;
+       desc.db_trigger_cpu = (uintptr_t)client->client_base +
+                               client->doorbell_offset;
+       desc.db_trigger_uk = gfx_addr + client->doorbell_offset;
+       desc.process_desc = gfx_addr + client->proc_desc_offset;
+       desc.wq_addr = gfx_addr + client->wq_offset;
        desc.wq_size = client->wq_size;
 
        /*
@@ -474,25 +454,16 @@ static void guc_fini_ctx_desc(struct intel_guc *guc,
 int i915_guc_wq_check_space(struct i915_guc_client *gc)
 {
        struct guc_process_desc *desc;
-       void *base;
        u32 size = sizeof(struct guc_wq_item);
        int ret = -ETIMEDOUT, timeout_counter = 200;
 
        if (!gc)
                return 0;
 
-       /* Quickly return if wq space is available since last time we cache the
-        * head position. */
-       if (CIRC_SPACE(gc->wq_tail, gc->wq_head, gc->wq_size) >= size)
-               return 0;
-
-       base = kmap_atomic(i915_gem_object_get_page(gc->client_obj, 0));
-       desc = base + gc->proc_desc_offset;
+       desc = gc->client_base + gc->proc_desc_offset;
 
        while (timeout_counter-- > 0) {
-               gc->wq_head = desc->head;
-
-               if (CIRC_SPACE(gc->wq_tail, gc->wq_head, gc->wq_size) >= size) {
+               if (CIRC_SPACE(gc->wq_tail, desc->head, gc->wq_size) >= size) {
                        ret = 0;
                        break;
                }
@@ -501,19 +472,19 @@ int i915_guc_wq_check_space(struct i915_guc_client *gc)
                        usleep_range(1000, 2000);
        };
 
-       kunmap_atomic(base);
-
        return ret;
 }
 
 static int guc_add_workqueue_item(struct i915_guc_client *gc,
                                  struct drm_i915_gem_request *rq)
 {
+       struct guc_process_desc *desc;
        struct guc_wq_item *wqi;
        void *base;
        u32 tail, wq_len, wq_off, space;
 
-       space = CIRC_SPACE(gc->wq_tail, gc->wq_head, gc->wq_size);
+       desc = gc->client_base + gc->proc_desc_offset;
+       space = CIRC_SPACE(gc->wq_tail, desc->head, gc->wq_size);
        if (WARN_ON(space < sizeof(struct guc_wq_item)))
                return -ENOSPC; /* shouldn't happen */
 
@@ -542,11 +513,12 @@ static int guc_add_workqueue_item(struct i915_guc_client *gc,
        wq_len = sizeof(struct guc_wq_item) / sizeof(u32) - 1;
        wqi->header = WQ_TYPE_INORDER |
                        (wq_len << WQ_LEN_SHIFT) |
-                       (rq->ring->guc_id << WQ_TARGET_SHIFT) |
+                       (rq->engine->guc_id << WQ_TARGET_SHIFT) |
                        WQ_NO_WCFLUSH_WAIT;
 
        /* The GuC wants only the low-order word of the context descriptor */
-       wqi->context_desc = (u32)intel_lr_context_descriptor(rq->ctx, rq->ring);
+       wqi->context_desc = (u32)intel_lr_context_descriptor(rq->ctx,
+                                                            rq->engine);
 
        /* The GuC firmware wants the tail index in QWords, not bytes */
        tail = rq->ringbuf->tail >> 3;
@@ -569,7 +541,7 @@ int i915_guc_submit(struct i915_guc_client *client,
                    struct drm_i915_gem_request *rq)
 {
        struct intel_guc *guc = client->guc;
-       unsigned int engine_id = rq->ring->guc_id;
+       unsigned int engine_id = rq->engine->guc_id;
        int q_ret, b_ret;
 
        q_ret = guc_add_workqueue_item(client, rq);
@@ -660,21 +632,28 @@ static void guc_client_free(struct drm_device *dev,
        if (!client)
                return;
 
-       if (client->doorbell_id != GUC_INVALID_DOORBELL_ID) {
-               /*
-                * First disable the doorbell, then tell the GuC we've
-                * finished with it, finally deallocate it in our bitmap
-                */
-               guc_disable_doorbell(guc, client);
-               host2guc_release_doorbell(guc, client);
-               release_doorbell(guc, client->doorbell_id);
-       }
-
        /*
         * XXX: wait for any outstanding submissions before freeing memory.
         * Be sure to drop any locks
         */
 
+       if (client->client_base) {
+               /*
+                * If we got as far as setting up a doorbell, make sure
+                * we shut it down before unmapping & deallocating the
+                * memory. So first disable the doorbell, then tell the
+                * GuC that we've finished with it, finally deallocate
+                * it in our bitmap
+                */
+               if (client->doorbell_id != GUC_INVALID_DOORBELL_ID) {
+                       guc_disable_doorbell(guc, client);
+                       host2guc_release_doorbell(guc, client);
+                       release_doorbell(guc, client->doorbell_id);
+               }
+
+               kunmap(kmap_to_page(client->client_base));
+       }
+
        gem_release_guc_obj(client->client_obj);
 
        if (client->ctx_index != GUC_INVALID_CTX_ID) {
@@ -695,7 +674,7 @@ static void guc_client_free(struct drm_device *dev,
  * @ctx:       the context that owns the client (we use the default render
  *             context)
  *
- * Return:     An i915_guc_client object if success.
+ * Return:     An i915_guc_client object if success, else NULL.
  */
 static struct i915_guc_client *guc_client_alloc(struct drm_device *dev,
                                                uint32_t priority,
@@ -727,7 +706,9 @@ static struct i915_guc_client *guc_client_alloc(struct drm_device *dev,
        if (!obj)
                goto err;
 
+       /* We'll keep just the first (doorbell/proc) page permanently kmap'd. */
        client->client_obj = obj;
+       client->client_base = kmap(i915_gem_object_get_page(obj, 0));
        client->wq_offset = GUC_DB_SIZE;
        client->wq_size = GUC_WQ_SIZE;
 
@@ -839,9 +820,9 @@ static void guc_create_ads(struct intel_guc *guc)
        struct guc_ads *ads;
        struct guc_policies *policies;
        struct guc_mmio_reg_state *reg_state;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct page *page;
-       u32 size, i;
+       u32 size;
 
        /* The ads obj includes the struct itself and buffers passed to GuC */
        size = sizeof(struct guc_ads) + sizeof(struct guc_policies) +
@@ -867,11 +848,11 @@ static void guc_create_ads(struct intel_guc *guc)
         * so its address won't change after we've told the GuC where
         * to find it.
         */
-       ring = &dev_priv->ring[RCS];
-       ads->golden_context_lrca = ring->status_page.gfx_addr;
+       engine = &dev_priv->engine[RCS];
+       ads->golden_context_lrca = engine->status_page.gfx_addr;
 
-       for_each_ring(ring, dev_priv, i)
-               ads->eng_state_size[ring->guc_id] = intel_lr_context_size(ring);
+       for_each_engine(engine, dev_priv)
+               ads->eng_state_size[engine->guc_id] = intel_lr_context_size(engine);
 
        /* GuC scheduling policies */
        policies = (void *)ads + sizeof(struct guc_ads);
@@ -883,12 +864,12 @@ static void guc_create_ads(struct intel_guc *guc)
        /* MMIO reg state */
        reg_state = (void *)policies + sizeof(struct guc_policies);
 
-       for_each_ring(ring, dev_priv, i) {
-               reg_state->mmio_white_list[ring->guc_id].mmio_start =
-                       ring->mmio_base + GUC_MMIO_WHITE_LIST_START;
+       for_each_engine(engine, dev_priv) {
+               reg_state->mmio_white_list[engine->guc_id].mmio_start =
+                       engine->mmio_base + GUC_MMIO_WHITE_LIST_START;
 
                /* Nothing to be saved or restored for now. */
-               reg_state->mmio_white_list[ring->guc_id].count = 0;
+               reg_state->mmio_white_list[engine->guc_id].count = 0;
        }
 
        ads->reg_state_addr = ads->scheduler_policies +
index 1c212205d0e7fd856e3298a10f6c039210bb570f..2f6fd33c07ba2aaabbce9764cf4a66178637199c 100644 (file)
@@ -994,14 +994,15 @@ static void ironlake_rps_change_irq_handler(struct drm_device *dev)
        return;
 }
 
-static void notify_ring(struct intel_engine_cs *ring)
+static void notify_ring(struct intel_engine_cs *engine)
 {
-       if (!intel_ring_initialized(ring))
+       if (!intel_engine_initialized(engine))
                return;
 
-       trace_i915_gem_request_notify(ring);
+       trace_i915_gem_request_notify(engine);
+       engine->user_interrupts++;
 
-       wake_up_all(&ring->irq_queue);
+       wake_up_all(&engine->irq_queue);
 }
 
 static void vlv_c0_read(struct drm_i915_private *dev_priv,
@@ -1079,11 +1080,10 @@ static u32 vlv_wa_c0_ei(struct drm_i915_private *dev_priv, u32 pm_iir)
 
 static bool any_waiters(struct drm_i915_private *dev_priv)
 {
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i)
-               if (ring->irq_refcount)
+       for_each_engine(engine, dev_priv)
+               if (engine->irq_refcount)
                        return true;
 
        return false;
@@ -1219,7 +1219,7 @@ static void ivybridge_parity_work(struct work_struct *work)
                i915_reg_t reg;
 
                slice--;
-               if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv->dev)))
+               if (WARN_ON_ONCE(slice >= NUM_L3_SLICES(dev_priv)))
                        break;
 
                dev_priv->l3_parity.which_slice &= ~(1<<slice);
@@ -1258,24 +1258,23 @@ static void ivybridge_parity_work(struct work_struct *work)
 out:
        WARN_ON(dev_priv->l3_parity.which_slice);
        spin_lock_irq(&dev_priv->irq_lock);
-       gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv->dev));
+       gen5_enable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv));
        spin_unlock_irq(&dev_priv->irq_lock);
 
        mutex_unlock(&dev_priv->dev->struct_mutex);
 }
 
-static void ivybridge_parity_error_irq_handler(struct drm_device *dev, u32 iir)
+static void ivybridge_parity_error_irq_handler(struct drm_i915_private *dev_priv,
+                                              u32 iir)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       if (!HAS_L3_DPF(dev))
+       if (!HAS_L3_DPF(dev_priv))
                return;
 
        spin_lock(&dev_priv->irq_lock);
-       gen5_disable_gt_irq(dev_priv, GT_PARITY_ERROR(dev));
+       gen5_disable_gt_irq(dev_priv, GT_PARITY_ERROR(dev_priv));
        spin_unlock(&dev_priv->irq_lock);
 
-       iir &= GT_PARITY_ERROR(dev);
+       iir &= GT_PARITY_ERROR(dev_priv);
        if (iir & GT_RENDER_L3_PARITY_ERROR_INTERRUPT_S1)
                dev_priv->l3_parity.which_slice |= 1 << 1;
 
@@ -1285,102 +1284,85 @@ static void ivybridge_parity_error_irq_handler(struct drm_device *dev, u32 iir)
        queue_work(dev_priv->wq, &dev_priv->l3_parity.error_work);
 }
 
-static void ilk_gt_irq_handler(struct drm_device *dev,
-                              struct drm_i915_private *dev_priv,
+static void ilk_gt_irq_handler(struct drm_i915_private *dev_priv,
                               u32 gt_iir)
 {
        if (gt_iir &
            (GT_RENDER_USER_INTERRUPT | GT_RENDER_PIPECTL_NOTIFY_INTERRUPT))
-               notify_ring(&dev_priv->ring[RCS]);
+               notify_ring(&dev_priv->engine[RCS]);
        if (gt_iir & ILK_BSD_USER_INTERRUPT)
-               notify_ring(&dev_priv->ring[VCS]);
+               notify_ring(&dev_priv->engine[VCS]);
 }
 
-static void snb_gt_irq_handler(struct drm_device *dev,
-                              struct drm_i915_private *dev_priv,
+static void snb_gt_irq_handler(struct drm_i915_private *dev_priv,
                               u32 gt_iir)
 {
 
        if (gt_iir &
            (GT_RENDER_USER_INTERRUPT | GT_RENDER_PIPECTL_NOTIFY_INTERRUPT))
-               notify_ring(&dev_priv->ring[RCS]);
+               notify_ring(&dev_priv->engine[RCS]);
        if (gt_iir & GT_BSD_USER_INTERRUPT)
-               notify_ring(&dev_priv->ring[VCS]);
+               notify_ring(&dev_priv->engine[VCS]);
        if (gt_iir & GT_BLT_USER_INTERRUPT)
-               notify_ring(&dev_priv->ring[BCS]);
+               notify_ring(&dev_priv->engine[BCS]);
 
        if (gt_iir & (GT_BLT_CS_ERROR_INTERRUPT |
                      GT_BSD_CS_ERROR_INTERRUPT |
                      GT_RENDER_CS_MASTER_ERROR_INTERRUPT))
                DRM_DEBUG("Command parser error, gt_iir 0x%08x\n", gt_iir);
 
-       if (gt_iir & GT_PARITY_ERROR(dev))
-               ivybridge_parity_error_irq_handler(dev, gt_iir);
+       if (gt_iir & GT_PARITY_ERROR(dev_priv))
+               ivybridge_parity_error_irq_handler(dev_priv, gt_iir);
 }
 
 static __always_inline void
-gen8_cs_irq_handler(struct intel_engine_cs *ring, u32 iir, int test_shift)
+gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift)
 {
        if (iir & (GT_RENDER_USER_INTERRUPT << test_shift))
-               notify_ring(ring);
+               notify_ring(engine);
        if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift))
-               intel_lrc_irq_handler(ring);
+               tasklet_schedule(&engine->irq_tasklet);
 }
 
-static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv,
-                                      u32 master_ctl)
+static irqreturn_t gen8_gt_irq_ack(struct drm_i915_private *dev_priv,
+                                  u32 master_ctl,
+                                  u32 gt_iir[4])
 {
        irqreturn_t ret = IRQ_NONE;
 
        if (master_ctl & (GEN8_GT_RCS_IRQ | GEN8_GT_BCS_IRQ)) {
-               u32 iir = I915_READ_FW(GEN8_GT_IIR(0));
-               if (iir) {
-                       I915_WRITE_FW(GEN8_GT_IIR(0), iir);
+               gt_iir[0] = I915_READ_FW(GEN8_GT_IIR(0));
+               if (gt_iir[0]) {
+                       I915_WRITE_FW(GEN8_GT_IIR(0), gt_iir[0]);
                        ret = IRQ_HANDLED;
-
-                       gen8_cs_irq_handler(&dev_priv->ring[RCS],
-                                       iir, GEN8_RCS_IRQ_SHIFT);
-
-                       gen8_cs_irq_handler(&dev_priv->ring[BCS],
-                                       iir, GEN8_BCS_IRQ_SHIFT);
                } else
                        DRM_ERROR("The master control interrupt lied (GT0)!\n");
        }
 
        if (master_ctl & (GEN8_GT_VCS1_IRQ | GEN8_GT_VCS2_IRQ)) {
-               u32 iir = I915_READ_FW(GEN8_GT_IIR(1));
-               if (iir) {
-                       I915_WRITE_FW(GEN8_GT_IIR(1), iir);
+               gt_iir[1] = I915_READ_FW(GEN8_GT_IIR(1));
+               if (gt_iir[1]) {
+                       I915_WRITE_FW(GEN8_GT_IIR(1), gt_iir[1]);
                        ret = IRQ_HANDLED;
-
-                       gen8_cs_irq_handler(&dev_priv->ring[VCS],
-                                       iir, GEN8_VCS1_IRQ_SHIFT);
-
-                       gen8_cs_irq_handler(&dev_priv->ring[VCS2],
-                                       iir, GEN8_VCS2_IRQ_SHIFT);
                } else
                        DRM_ERROR("The master control interrupt lied (GT1)!\n");
        }
 
        if (master_ctl & GEN8_GT_VECS_IRQ) {
-               u32 iir = I915_READ_FW(GEN8_GT_IIR(3));
-               if (iir) {
-                       I915_WRITE_FW(GEN8_GT_IIR(3), iir);
+               gt_iir[3] = I915_READ_FW(GEN8_GT_IIR(3));
+               if (gt_iir[3]) {
+                       I915_WRITE_FW(GEN8_GT_IIR(3), gt_iir[3]);
                        ret = IRQ_HANDLED;
-
-                       gen8_cs_irq_handler(&dev_priv->ring[VECS],
-                                       iir, GEN8_VECS_IRQ_SHIFT);
                } else
                        DRM_ERROR("The master control interrupt lied (GT3)!\n");
        }
 
        if (master_ctl & GEN8_GT_PM_IRQ) {
-               u32 iir = I915_READ_FW(GEN8_GT_IIR(2));
-               if (iir & dev_priv->pm_rps_events) {
+               gt_iir[2] = I915_READ_FW(GEN8_GT_IIR(2));
+               if (gt_iir[2] & dev_priv->pm_rps_events) {
                        I915_WRITE_FW(GEN8_GT_IIR(2),
-                                     iir & dev_priv->pm_rps_events);
+                                     gt_iir[2] & dev_priv->pm_rps_events);
                        ret = IRQ_HANDLED;
-                       gen6_rps_irq_handler(dev_priv, iir);
                } else
                        DRM_ERROR("The master control interrupt lied (PM)!\n");
        }
@@ -1388,6 +1370,31 @@ static irqreturn_t gen8_gt_irq_handler(struct drm_i915_private *dev_priv,
        return ret;
 }
 
+static void gen8_gt_irq_handler(struct drm_i915_private *dev_priv,
+                               u32 gt_iir[4])
+{
+       if (gt_iir[0]) {
+               gen8_cs_irq_handler(&dev_priv->engine[RCS],
+                                   gt_iir[0], GEN8_RCS_IRQ_SHIFT);
+               gen8_cs_irq_handler(&dev_priv->engine[BCS],
+                                   gt_iir[0], GEN8_BCS_IRQ_SHIFT);
+       }
+
+       if (gt_iir[1]) {
+               gen8_cs_irq_handler(&dev_priv->engine[VCS],
+                                   gt_iir[1], GEN8_VCS1_IRQ_SHIFT);
+               gen8_cs_irq_handler(&dev_priv->engine[VCS2],
+                                   gt_iir[1], GEN8_VCS2_IRQ_SHIFT);
+       }
+
+       if (gt_iir[3])
+               gen8_cs_irq_handler(&dev_priv->engine[VECS],
+                                   gt_iir[3], GEN8_VECS_IRQ_SHIFT);
+
+       if (gt_iir[2] & dev_priv->pm_rps_events)
+               gen6_rps_irq_handler(dev_priv, gt_iir[2]);
+}
+
 static bool bxt_port_hotplug_long_detect(enum port port, u32 val)
 {
        switch (port) {
@@ -1627,9 +1634,9 @@ static void gen6_rps_irq_handler(struct drm_i915_private *dev_priv, u32 pm_iir)
        if (INTEL_INFO(dev_priv)->gen >= 8)
                return;
 
-       if (HAS_VEBOX(dev_priv->dev)) {
+       if (HAS_VEBOX(dev_priv)) {
                if (pm_iir & PM_VEBOX_USER_INTERRUPT)
-                       notify_ring(&dev_priv->ring[VECS]);
+                       notify_ring(&dev_priv->engine[VECS]);
 
                if (pm_iir & PM_VEBOX_CS_ERROR_INTERRUPT)
                        DRM_DEBUG("Command parser error, pm_iir 0x%08x\n", pm_iir);
@@ -1644,10 +1651,10 @@ static bool intel_pipe_handle_vblank(struct drm_device *dev, enum pipe pipe)
        return true;
 }
 
-static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
+static void valleyview_pipestat_irq_ack(struct drm_device *dev, u32 iir,
+                                       u32 pipe_stats[I915_MAX_PIPES])
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 pipe_stats[I915_MAX_PIPES] = { };
        int pipe;
 
        spin_lock(&dev_priv->irq_lock);
@@ -1701,6 +1708,13 @@ static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
                        I915_WRITE(reg, pipe_stats[pipe]);
        }
        spin_unlock(&dev_priv->irq_lock);
+}
+
+static void valleyview_pipestat_irq_handler(struct drm_device *dev,
+                                           u32 pipe_stats[I915_MAX_PIPES])
+{
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       enum pipe pipe;
 
        for_each_pipe(dev_priv, pipe) {
                if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS &&
@@ -1723,21 +1737,20 @@ static void valleyview_pipestat_irq_handler(struct drm_device *dev, u32 iir)
                gmbus_irq_handler(dev);
 }
 
-static void i9xx_hpd_irq_handler(struct drm_device *dev)
+static u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
        u32 hotplug_status = I915_READ(PORT_HOTPLUG_STAT);
-       u32 pin_mask = 0, long_mask = 0;
 
-       if (!hotplug_status)
-               return;
+       if (hotplug_status)
+               I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
 
-       I915_WRITE(PORT_HOTPLUG_STAT, hotplug_status);
-       /*
-        * Make sure hotplug status is cleared before we clear IIR, or else we
-        * may miss hotplug events.
-        */
-       POSTING_READ(PORT_HOTPLUG_STAT);
+       return hotplug_status;
+}
+
+static void i9xx_hpd_irq_handler(struct drm_device *dev,
+                                u32 hotplug_status)
+{
+       u32 pin_mask = 0, long_mask = 0;
 
        if (IS_G4X(dev) || IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
                u32 hotplug_trigger = hotplug_status & HOTPLUG_INT_STATUS_G4X;
@@ -1768,7 +1781,6 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = arg;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 iir, gt_iir, pm_iir;
        irqreturn_t ret = IRQ_NONE;
 
        if (!intel_irqs_enabled(dev_priv))
@@ -1777,40 +1789,72 @@ static irqreturn_t valleyview_irq_handler(int irq, void *arg)
        /* IRQs are synced during runtime_suspend, we don't require a wakeref */
        disable_rpm_wakeref_asserts(dev_priv);
 
-       while (true) {
-               /* Find, clear, then process each source of interrupt */
+       do {
+               u32 iir, gt_iir, pm_iir;
+               u32 pipe_stats[I915_MAX_PIPES] = {};
+               u32 hotplug_status = 0;
+               u32 ier = 0;
 
                gt_iir = I915_READ(GTIIR);
-               if (gt_iir)
-                       I915_WRITE(GTIIR, gt_iir);
-
                pm_iir = I915_READ(GEN6_PMIIR);
-               if (pm_iir)
-                       I915_WRITE(GEN6_PMIIR, pm_iir);
-
                iir = I915_READ(VLV_IIR);
-               if (iir) {
-                       /* Consume port before clearing IIR or we'll miss events */
-                       if (iir & I915_DISPLAY_PORT_INTERRUPT)
-                               i9xx_hpd_irq_handler(dev);
-                       I915_WRITE(VLV_IIR, iir);
-               }
 
                if (gt_iir == 0 && pm_iir == 0 && iir == 0)
-                       goto out;
+                       break;
 
                ret = IRQ_HANDLED;
 
+               /*
+                * Theory on interrupt generation, based on empirical evidence:
+                *
+                * x = ((VLV_IIR & VLV_IER) ||
+                *      (((GT_IIR & GT_IER) || (GEN6_PMIIR & GEN6_PMIER)) &&
+                *       (VLV_MASTER_IER & MASTER_INTERRUPT_ENABLE)));
+                *
+                * A CPU interrupt will only be raised when 'x' has a 0->1 edge.
+                * Hence we clear MASTER_INTERRUPT_ENABLE and VLV_IER to
+                * guarantee the CPU interrupt will be raised again even if we
+                * don't end up clearing all the VLV_IIR, GT_IIR, GEN6_PMIIR
+                * bits this time around.
+                */
+               I915_WRITE(VLV_MASTER_IER, 0);
+               ier = I915_READ(VLV_IER);
+               I915_WRITE(VLV_IER, 0);
+
                if (gt_iir)
-                       snb_gt_irq_handler(dev, dev_priv, gt_iir);
+                       I915_WRITE(GTIIR, gt_iir);
                if (pm_iir)
-                       gen6_rps_irq_handler(dev_priv, pm_iir);
+                       I915_WRITE(GEN6_PMIIR, pm_iir);
+
+               if (iir & I915_DISPLAY_PORT_INTERRUPT)
+                       hotplug_status = i9xx_hpd_irq_ack(dev_priv);
+
                /* Call regardless, as some status bits might not be
                 * signalled in iir */
-               valleyview_pipestat_irq_handler(dev, iir);
-       }
+               valleyview_pipestat_irq_ack(dev, iir, pipe_stats);
+
+               /*
+                * VLV_IIR is single buffered, and reflects the level
+                * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
+                */
+               if (iir)
+                       I915_WRITE(VLV_IIR, iir);
+
+               I915_WRITE(VLV_IER, ier);
+               I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
+               POSTING_READ(VLV_MASTER_IER);
+
+               if (gt_iir)
+                       snb_gt_irq_handler(dev_priv, gt_iir);
+               if (pm_iir)
+                       gen6_rps_irq_handler(dev_priv, pm_iir);
+
+               if (hotplug_status)
+                       i9xx_hpd_irq_handler(dev, hotplug_status);
+
+               valleyview_pipestat_irq_handler(dev, pipe_stats);
+       } while (0);
 
-out:
        enable_rpm_wakeref_asserts(dev_priv);
 
        return ret;
@@ -1820,7 +1864,6 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 {
        struct drm_device *dev = arg;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u32 master_ctl, iir;
        irqreturn_t ret = IRQ_NONE;
 
        if (!intel_irqs_enabled(dev_priv))
@@ -1830,6 +1873,12 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
        disable_rpm_wakeref_asserts(dev_priv);
 
        do {
+               u32 master_ctl, iir;
+               u32 gt_iir[4] = {};
+               u32 pipe_stats[I915_MAX_PIPES] = {};
+               u32 hotplug_status = 0;
+               u32 ier = 0;
+
                master_ctl = I915_READ(GEN8_MASTER_IRQ) & ~GEN8_MASTER_IRQ_CONTROL;
                iir = I915_READ(VLV_IIR);
 
@@ -1838,25 +1887,49 @@ static irqreturn_t cherryview_irq_handler(int irq, void *arg)
 
                ret = IRQ_HANDLED;
 
+               /*
+                * Theory on interrupt generation, based on empirical evidence:
+                *
+                * x = ((VLV_IIR & VLV_IER) ||
+                *      ((GEN8_MASTER_IRQ & ~GEN8_MASTER_IRQ_CONTROL) &&
+                *       (GEN8_MASTER_IRQ & GEN8_MASTER_IRQ_CONTROL)));
+                *
+                * A CPU interrupt will only be raised when 'x' has a 0->1 edge.
+                * Hence we clear GEN8_MASTER_IRQ_CONTROL and VLV_IER to
+                * guarantee the CPU interrupt will be raised again even if we
+                * don't end up clearing all the VLV_IIR and GEN8_MASTER_IRQ_CONTROL
+                * bits this time around.
+                */
                I915_WRITE(GEN8_MASTER_IRQ, 0);
+               ier = I915_READ(VLV_IER);
+               I915_WRITE(VLV_IER, 0);
 
-               /* Find, clear, then process each source of interrupt */
-
-               if (iir) {
-                       /* Consume port before clearing IIR or we'll miss events */
-                       if (iir & I915_DISPLAY_PORT_INTERRUPT)
-                               i9xx_hpd_irq_handler(dev);
-                       I915_WRITE(VLV_IIR, iir);
-               }
+               gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
 
-               gen8_gt_irq_handler(dev_priv, master_ctl);
+               if (iir & I915_DISPLAY_PORT_INTERRUPT)
+                       hotplug_status = i9xx_hpd_irq_ack(dev_priv);
 
                /* Call regardless, as some status bits might not be
                 * signalled in iir */
-               valleyview_pipestat_irq_handler(dev, iir);
+               valleyview_pipestat_irq_ack(dev, iir, pipe_stats);
+
+               /*
+                * VLV_IIR is single buffered, and reflects the level
+                * from PIPESTAT/PORT_HOTPLUG_STAT, hence clear it last.
+                */
+               if (iir)
+                       I915_WRITE(VLV_IIR, iir);
 
-               I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
+               I915_WRITE(VLV_IER, ier);
+               I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
                POSTING_READ(GEN8_MASTER_IRQ);
+
+               gen8_gt_irq_handler(dev_priv, gt_iir);
+
+               if (hotplug_status)
+                       i9xx_hpd_irq_handler(dev, hotplug_status);
+
+               valleyview_pipestat_irq_handler(dev, pipe_stats);
        } while (0);
 
        enable_rpm_wakeref_asserts(dev_priv);
@@ -2217,9 +2290,9 @@ static irqreturn_t ironlake_irq_handler(int irq, void *arg)
                I915_WRITE(GTIIR, gt_iir);
                ret = IRQ_HANDLED;
                if (INTEL_INFO(dev)->gen >= 6)
-                       snb_gt_irq_handler(dev, dev_priv, gt_iir);
+                       snb_gt_irq_handler(dev_priv, gt_iir);
                else
-                       ilk_gt_irq_handler(dev, dev_priv, gt_iir);
+                       ilk_gt_irq_handler(dev_priv, gt_iir);
        }
 
        de_iir = I915_READ(DEIIR);
@@ -2419,6 +2492,7 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
        struct drm_device *dev = arg;
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 master_ctl;
+       u32 gt_iir[4] = {};
        irqreturn_t ret;
 
        if (!intel_irqs_enabled(dev_priv))
@@ -2435,7 +2509,8 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
        disable_rpm_wakeref_asserts(dev_priv);
 
        /* Find, clear, then process each source of interrupt */
-       ret = gen8_gt_irq_handler(dev_priv, master_ctl);
+       ret = gen8_gt_irq_ack(dev_priv, master_ctl, gt_iir);
+       gen8_gt_irq_handler(dev_priv, gt_iir);
        ret |= gen8_de_irq_handler(dev_priv, master_ctl);
 
        I915_WRITE_FW(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
@@ -2449,8 +2524,7 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg)
 static void i915_error_wake_up(struct drm_i915_private *dev_priv,
                               bool reset_completed)
 {
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
        /*
         * Notify all waiters for GPU completion events that reset state has
@@ -2460,8 +2534,8 @@ static void i915_error_wake_up(struct drm_i915_private *dev_priv,
         */
 
        /* Wake up __wait_seqno, potentially holding dev->struct_mutex. */
-       for_each_ring(ring, dev_priv, i)
-               wake_up_all(&ring->irq_queue);
+       for_each_engine(engine, dev_priv)
+               wake_up_all(&engine->irq_queue);
 
        /* Wake up intel_crtc_wait_for_pending_flips, holding crtc->mutex. */
        wake_up_all(&dev_priv->pending_flip_queue);
@@ -2484,7 +2558,6 @@ static void i915_error_wake_up(struct drm_i915_private *dev_priv,
 static void i915_reset_and_wakeup(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct i915_gpu_error *error = &dev_priv->gpu_error;
        char *error_event[] = { I915_ERROR_UEVENT "=1", NULL };
        char *reset_event[] = { I915_RESET_UEVENT "=1", NULL };
        char *reset_done_event[] = { I915_ERROR_UEVENT "=0", NULL };
@@ -2502,7 +2575,7 @@ static void i915_reset_and_wakeup(struct drm_device *dev)
         * the reset in-progress bit is only ever set by code outside of this
         * work we don't need to worry about any other races.
         */
-       if (i915_reset_in_progress(error) && !i915_terminally_wedged(error)) {
+       if (i915_reset_in_progress(&dev_priv->gpu_error)) {
                DRM_DEBUG_DRIVER("resetting chip\n");
                kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE,
                                   reset_event);
@@ -2530,25 +2603,9 @@ static void i915_reset_and_wakeup(struct drm_device *dev)
 
                intel_runtime_pm_put(dev_priv);
 
-               if (ret == 0) {
-                       /*
-                        * After all the gem state is reset, increment the reset
-                        * counter and wake up everyone waiting for the reset to
-                        * complete.
-                        *
-                        * Since unlock operations are a one-sided barrier only,
-                        * we need to insert a barrier here to order any seqno
-                        * updates before
-                        * the counter increment.
-                        */
-                       smp_mb__before_atomic();
-                       atomic_inc(&dev_priv->gpu_error.reset_counter);
-
+               if (ret == 0)
                        kobject_uevent_env(&dev->primary->kdev->kobj,
                                           KOBJ_CHANGE, reset_done_event);
-               } else {
-                       atomic_or(I915_WEDGED, &error->reset_counter);
-               }
 
                /*
                 * Note: The wake_up also serves as a memory barrier so that
@@ -2653,14 +2710,14 @@ static void i915_report_and_clear_eir(struct drm_device *dev)
 /**
  * i915_handle_error - handle a gpu error
  * @dev: drm device
- *
+ * @engine_mask: mask representing engines that are hung
  * Do some basic checking of register state at error time and
  * dump it to the syslog.  Also call i915_capture_error_state() to make
  * sure we get a record and make it available in debugfs.  Fire a uevent
  * so userspace knows something bad happened (should trigger collection
  * of a ring dump etc.).
  */
-void i915_handle_error(struct drm_device *dev, bool wedged,
+void i915_handle_error(struct drm_device *dev, u32 engine_mask,
                       const char *fmt, ...)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -2671,10 +2728,10 @@ void i915_handle_error(struct drm_device *dev, bool wedged,
        vscnprintf(error_msg, sizeof(error_msg), fmt, args);
        va_end(args);
 
-       i915_capture_error_state(dev, wedged, error_msg);
+       i915_capture_error_state(dev, engine_mask, error_msg);
        i915_report_and_clear_eir(dev);
 
-       if (wedged) {
+       if (engine_mask) {
                atomic_or(I915_RESET_IN_PROGRESS_FLAG,
                                &dev_priv->gpu_error.reset_counter);
 
@@ -2805,10 +2862,10 @@ static void gen8_disable_vblank(struct drm_device *dev, unsigned int pipe)
 }
 
 static bool
-ring_idle(struct intel_engine_cs *ring, u32 seqno)
+ring_idle(struct intel_engine_cs *engine, u32 seqno)
 {
-       return (list_empty(&ring->request_list) ||
-               i915_seqno_passed(seqno, ring->last_submitted_seqno));
+       return i915_seqno_passed(seqno,
+                                READ_ONCE(engine->last_submitted_seqno));
 }
 
 static bool
@@ -2824,42 +2881,42 @@ ipehr_is_semaphore_wait(struct drm_device *dev, u32 ipehr)
 }
 
 static struct intel_engine_cs *
-semaphore_wait_to_signaller_ring(struct intel_engine_cs *ring, u32 ipehr, u64 offset)
+semaphore_wait_to_signaller_ring(struct intel_engine_cs *engine, u32 ipehr,
+                                u64 offset)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        struct intel_engine_cs *signaller;
-       int i;
 
-       if (INTEL_INFO(dev_priv->dev)->gen >= 8) {
-               for_each_ring(signaller, dev_priv, i) {
-                       if (ring == signaller)
+       if (INTEL_INFO(dev_priv)->gen >= 8) {
+               for_each_engine(signaller, dev_priv) {
+                       if (engine == signaller)
                                continue;
 
-                       if (offset == signaller->semaphore.signal_ggtt[ring->id])
+                       if (offset == signaller->semaphore.signal_ggtt[engine->id])
                                return signaller;
                }
        } else {
                u32 sync_bits = ipehr & MI_SEMAPHORE_SYNC_MASK;
 
-               for_each_ring(signaller, dev_priv, i) {
-                       if(ring == signaller)
+               for_each_engine(signaller, dev_priv) {
+                       if(engine == signaller)
                                continue;
 
-                       if (sync_bits == signaller->semaphore.mbox.wait[ring->id])
+                       if (sync_bits == signaller->semaphore.mbox.wait[engine->id])
                                return signaller;
                }
        }
 
        DRM_ERROR("No signaller ring found for ring %i, ipehr 0x%08x, offset 0x%016llx\n",
-                 ring->id, ipehr, offset);
+                 engine->id, ipehr, offset);
 
        return NULL;
 }
 
 static struct intel_engine_cs *
-semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
+semaphore_waits_for(struct intel_engine_cs *engine, u32 *seqno)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        u32 cmd, ipehr, head;
        u64 offset = 0;
        int i, backwards;
@@ -2881,11 +2938,11 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
         * Therefore, this function does not support execlist mode in its
         * current form. Just return NULL and move on.
         */
-       if (ring->buffer == NULL)
+       if (engine->buffer == NULL)
                return NULL;
 
-       ipehr = I915_READ(RING_IPEHR(ring->mmio_base));
-       if (!ipehr_is_semaphore_wait(ring->dev, ipehr))
+       ipehr = I915_READ(RING_IPEHR(engine->mmio_base));
+       if (!ipehr_is_semaphore_wait(engine->dev, ipehr))
                return NULL;
 
        /*
@@ -2896,8 +2953,8 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
         * point at at batch, and semaphores are always emitted into the
         * ringbuffer itself.
         */
-       head = I915_READ_HEAD(ring) & HEAD_ADDR;
-       backwards = (INTEL_INFO(ring->dev)->gen >= 8) ? 5 : 4;
+       head = I915_READ_HEAD(engine) & HEAD_ADDR;
+       backwards = (INTEL_INFO(engine->dev)->gen >= 8) ? 5 : 4;
 
        for (i = backwards; i; --i) {
                /*
@@ -2905,10 +2962,10 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
                 * our ring is smaller than what the hardware (and hence
                 * HEAD_ADDR) allows. Also handles wrap-around.
                 */
-               head &= ring->buffer->size - 1;
+               head &= engine->buffer->size - 1;
 
                /* This here seems to blow up */
-               cmd = ioread32(ring->buffer->virtual_start + head);
+               cmd = ioread32(engine->buffer->virtual_start + head);
                if (cmd == ipehr)
                        break;
 
@@ -2918,32 +2975,32 @@ semaphore_waits_for(struct intel_engine_cs *ring, u32 *seqno)
        if (!i)
                return NULL;
 
-       *seqno = ioread32(ring->buffer->virtual_start + head + 4) + 1;
-       if (INTEL_INFO(ring->dev)->gen >= 8) {
-               offset = ioread32(ring->buffer->virtual_start + head + 12);
+       *seqno = ioread32(engine->buffer->virtual_start + head + 4) + 1;
+       if (INTEL_INFO(engine->dev)->gen >= 8) {
+               offset = ioread32(engine->buffer->virtual_start + head + 12);
                offset <<= 32;
-               offset = ioread32(ring->buffer->virtual_start + head + 8);
+               offset = ioread32(engine->buffer->virtual_start + head + 8);
        }
-       return semaphore_wait_to_signaller_ring(ring, ipehr, offset);
+       return semaphore_wait_to_signaller_ring(engine, ipehr, offset);
 }
 
-static int semaphore_passed(struct intel_engine_cs *ring)
+static int semaphore_passed(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        struct intel_engine_cs *signaller;
        u32 seqno;
 
-       ring->hangcheck.deadlock++;
+       engine->hangcheck.deadlock++;
 
-       signaller = semaphore_waits_for(ring, &seqno);
+       signaller = semaphore_waits_for(engine, &seqno);
        if (signaller == NULL)
                return -1;
 
        /* Prevent pathological recursion due to driver bugs */
-       if (signaller->hangcheck.deadlock >= I915_NUM_RINGS)
+       if (signaller->hangcheck.deadlock >= I915_NUM_ENGINES)
                return -1;
 
-       if (i915_seqno_passed(signaller->get_seqno(signaller, false), seqno))
+       if (i915_seqno_passed(signaller->get_seqno(signaller), seqno))
                return 1;
 
        /* cursory check for an unkickable deadlock */
@@ -2956,23 +3013,22 @@ static int semaphore_passed(struct intel_engine_cs *ring)
 
 static void semaphore_clear_deadlocks(struct drm_i915_private *dev_priv)
 {
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i)
-               ring->hangcheck.deadlock = 0;
+       for_each_engine(engine, dev_priv)
+               engine->hangcheck.deadlock = 0;
 }
 
-static bool subunits_stuck(struct intel_engine_cs *ring)
+static bool subunits_stuck(struct intel_engine_cs *engine)
 {
        u32 instdone[I915_NUM_INSTDONE_REG];
        bool stuck;
        int i;
 
-       if (ring->id != RCS)
+       if (engine->id != RCS)
                return true;
 
-       i915_get_extra_instdone(ring->dev, instdone);
+       i915_get_extra_instdone(engine->dev, instdone);
 
        /* There might be unstable subunit states even when
         * actual head is not moving. Filter out the unstable ones by
@@ -2981,49 +3037,44 @@ static bool subunits_stuck(struct intel_engine_cs *ring)
         */
        stuck = true;
        for (i = 0; i < I915_NUM_INSTDONE_REG; i++) {
-               const u32 tmp = instdone[i] | ring->hangcheck.instdone[i];
+               const u32 tmp = instdone[i] | engine->hangcheck.instdone[i];
 
-               if (tmp != ring->hangcheck.instdone[i])
+               if (tmp != engine->hangcheck.instdone[i])
                        stuck = false;
 
-               ring->hangcheck.instdone[i] |= tmp;
+               engine->hangcheck.instdone[i] |= tmp;
        }
 
        return stuck;
 }
 
 static enum intel_ring_hangcheck_action
-head_stuck(struct intel_engine_cs *ring, u64 acthd)
+head_stuck(struct intel_engine_cs *engine, u64 acthd)
 {
-       if (acthd != ring->hangcheck.acthd) {
+       if (acthd != engine->hangcheck.acthd) {
 
                /* Clear subunit states on head movement */
-               memset(ring->hangcheck.instdone, 0,
-                      sizeof(ring->hangcheck.instdone));
+               memset(engine->hangcheck.instdone, 0,
+                      sizeof(engine->hangcheck.instdone));
 
-               if (acthd > ring->hangcheck.max_acthd) {
-                       ring->hangcheck.max_acthd = acthd;
-                       return HANGCHECK_ACTIVE;
-               }
-
-               return HANGCHECK_ACTIVE_LOOP;
+               return HANGCHECK_ACTIVE;
        }
 
-       if (!subunits_stuck(ring))
+       if (!subunits_stuck(engine))
                return HANGCHECK_ACTIVE;
 
        return HANGCHECK_HUNG;
 }
 
 static enum intel_ring_hangcheck_action
-ring_stuck(struct intel_engine_cs *ring, u64 acthd)
+ring_stuck(struct intel_engine_cs *engine, u64 acthd)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum intel_ring_hangcheck_action ha;
        u32 tmp;
 
-       ha = head_stuck(ring, acthd);
+       ha = head_stuck(engine, acthd);
        if (ha != HANGCHECK_HUNG)
                return ha;
 
@@ -3035,24 +3086,24 @@ ring_stuck(struct intel_engine_cs *ring, u64 acthd)
         * and break the hang. This should work on
         * all but the second generation chipsets.
         */
-       tmp = I915_READ_CTL(ring);
+       tmp = I915_READ_CTL(engine);
        if (tmp & RING_WAIT) {
-               i915_handle_error(dev, false,
+               i915_handle_error(dev, 0,
                                  "Kicking stuck wait on %s",
-                                 ring->name);
-               I915_WRITE_CTL(ring, tmp);
+                                 engine->name);
+               I915_WRITE_CTL(engine, tmp);
                return HANGCHECK_KICK;
        }
 
        if (INTEL_INFO(dev)->gen >= 6 && tmp & RING_WAIT_SEMAPHORE) {
-               switch (semaphore_passed(ring)) {
+               switch (semaphore_passed(engine)) {
                default:
                        return HANGCHECK_HUNG;
                case 1:
-                       i915_handle_error(dev, false,
+                       i915_handle_error(dev, 0,
                                          "Kicking stuck semaphore on %s",
-                                         ring->name);
-                       I915_WRITE_CTL(ring, tmp);
+                                         engine->name);
+                       I915_WRITE_CTL(engine, tmp);
                        return HANGCHECK_KICK;
                case 0:
                        return HANGCHECK_WAIT;
@@ -3062,6 +3113,24 @@ ring_stuck(struct intel_engine_cs *ring, u64 acthd)
        return HANGCHECK_HUNG;
 }
 
+static unsigned kick_waiters(struct intel_engine_cs *engine)
+{
+       struct drm_i915_private *i915 = to_i915(engine->dev);
+       unsigned user_interrupts = READ_ONCE(engine->user_interrupts);
+
+       if (engine->hangcheck.user_interrupts == user_interrupts &&
+           !test_and_set_bit(engine->id, &i915->gpu_error.missed_irq_rings)) {
+               if (!(i915->gpu_error.test_irq_rings & intel_engine_flag(engine)))
+                       DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
+                                 engine->name);
+               else
+                       DRM_INFO("Fake missed irq on %s\n",
+                                engine->name);
+               wake_up_all(&engine->irq_queue);
+       }
+
+       return user_interrupts;
+}
 /*
  * This is called when the chip hasn't reported back with completed
  * batchbuffers in a long time. We keep track per ring seqno progress and
@@ -3076,13 +3145,14 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
                container_of(work, typeof(*dev_priv),
                             gpu_error.hangcheck_work.work);
        struct drm_device *dev = dev_priv->dev;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
+       enum intel_engine_id id;
        int busy_count = 0, rings_hung = 0;
-       bool stuck[I915_NUM_RINGS] = { 0 };
+       bool stuck[I915_NUM_ENGINES] = { 0 };
 #define BUSY 1
 #define KICK 5
 #define HUNG 20
+#define ACTIVE_DECAY 15
 
        if (!i915.enable_hangcheck)
                return;
@@ -3100,33 +3170,37 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
         */
        intel_uncore_arm_unclaimed_mmio_detection(dev_priv);
 
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine_id(engine, dev_priv, id) {
                u64 acthd;
                u32 seqno;
+               unsigned user_interrupts;
                bool busy = true;
 
                semaphore_clear_deadlocks(dev_priv);
 
-               seqno = ring->get_seqno(ring, false);
-               acthd = intel_ring_get_active_head(ring);
-
-               if (ring->hangcheck.seqno == seqno) {
-                       if (ring_idle(ring, seqno)) {
-                               ring->hangcheck.action = HANGCHECK_IDLE;
-
-                               if (waitqueue_active(&ring->irq_queue)) {
-                                       /* Issue a wake-up to catch stuck h/w. */
-                                       if (!test_and_set_bit(ring->id, &dev_priv->gpu_error.missed_irq_rings)) {
-                                               if (!(dev_priv->gpu_error.test_irq_rings & intel_ring_flag(ring)))
-                                                       DRM_ERROR("Hangcheck timer elapsed... %s idle\n",
-                                                                 ring->name);
-                                               else
-                                                       DRM_INFO("Fake missed irq on %s\n",
-                                                                ring->name);
-                                               wake_up_all(&ring->irq_queue);
-                                       }
+               /* We don't strictly need an irq-barrier here, as we are not
+                * serving an interrupt request, be paranoid in case the
+                * barrier has side-effects (such as preventing a broken
+                * cacheline snoop) and so be sure that we can see the seqno
+                * advance. If the seqno should stick, due to a stale
+                * cacheline, we would erroneously declare the GPU hung.
+                */
+               if (engine->irq_seqno_barrier)
+                       engine->irq_seqno_barrier(engine);
+
+               acthd = intel_ring_get_active_head(engine);
+               seqno = engine->get_seqno(engine);
+
+               /* Reset stuck interrupts between batch advances */
+               user_interrupts = 0;
+
+               if (engine->hangcheck.seqno == seqno) {
+                       if (ring_idle(engine, seqno)) {
+                               engine->hangcheck.action = HANGCHECK_IDLE;
+                               if (waitqueue_active(&engine->irq_queue)) {
                                        /* Safeguard against driver failure */
-                                       ring->hangcheck.score += BUSY;
+                                       user_interrupts = kick_waiters(engine);
+                                       engine->hangcheck.score += BUSY;
                                } else
                                        busy = false;
                        } else {
@@ -3145,58 +3219,60 @@ static void i915_hangcheck_elapsed(struct work_struct *work)
                                 * being repeatedly kicked and so responsible
                                 * for stalling the machine.
                                 */
-                               ring->hangcheck.action = ring_stuck(ring,
-                                                                   acthd);
+                               engine->hangcheck.action = ring_stuck(engine,
+                                                                     acthd);
 
-                               switch (ring->hangcheck.action) {
+                               switch (engine->hangcheck.action) {
                                case HANGCHECK_IDLE:
                                case HANGCHECK_WAIT:
-                               case HANGCHECK_ACTIVE:
                                        break;
-                               case HANGCHECK_ACTIVE_LOOP:
-                                       ring->hangcheck.score += BUSY;
+                               case HANGCHECK_ACTIVE:
+                                       engine->hangcheck.score += BUSY;
                                        break;
                                case HANGCHECK_KICK:
-                                       ring->hangcheck.score += KICK;
+                                       engine->hangcheck.score += KICK;
                                        break;
                                case HANGCHECK_HUNG:
-                                       ring->hangcheck.score += HUNG;
-                                       stuck[i] = true;
+                                       engine->hangcheck.score += HUNG;
+                                       stuck[id] = true;
                                        break;
                                }
                        }
                } else {
-                       ring->hangcheck.action = HANGCHECK_ACTIVE;
+                       engine->hangcheck.action = HANGCHECK_ACTIVE;
 
                        /* Gradually reduce the count so that we catch DoS
                         * attempts across multiple batches.
                         */
-                       if (ring->hangcheck.score > 0)
-                               ring->hangcheck.score--;
+                       if (engine->hangcheck.score > 0)
+                               engine->hangcheck.score -= ACTIVE_DECAY;
+                       if (engine->hangcheck.score < 0)
+                               engine->hangcheck.score = 0;
 
                        /* Clear head and subunit states on seqno movement */
-                       ring->hangcheck.acthd = ring->hangcheck.max_acthd = 0;
+                       acthd = 0;
 
-                       memset(ring->hangcheck.instdone, 0,
-                              sizeof(ring->hangcheck.instdone));
+                       memset(engine->hangcheck.instdone, 0,
+                              sizeof(engine->hangcheck.instdone));
                }
 
-               ring->hangcheck.seqno = seqno;
-               ring->hangcheck.acthd = acthd;
+               engine->hangcheck.seqno = seqno;
+               engine->hangcheck.acthd = acthd;
+               engine->hangcheck.user_interrupts = user_interrupts;
                busy_count += busy;
        }
 
-       for_each_ring(ring, dev_priv, i) {
-               if (ring->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) {
+       for_each_engine_id(engine, dev_priv, id) {
+               if (engine->hangcheck.score >= HANGCHECK_SCORE_RING_HUNG) {
                        DRM_INFO("%s on %s\n",
-                                stuck[i] ? "stuck" : "no progress",
-                                ring->name);
-                       rings_hung++;
+                                stuck[id] ? "stuck" : "no progress",
+                                engine->name);
+                       rings_hung |= intel_engine_flag(engine);
                }
        }
 
        if (rings_hung) {
-               i915_handle_error(dev, true, "Ring hung");
+               i915_handle_error(dev, rings_hung, "Engine(s) hung");
                goto out;
        }
 
@@ -3267,6 +3343,55 @@ static void gen5_gt_irq_reset(struct drm_device *dev)
                GEN5_IRQ_RESET(GEN6_PM);
 }
 
+static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
+{
+       enum pipe pipe;
+
+       if (IS_CHERRYVIEW(dev_priv))
+               I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
+       else
+               I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK);
+
+       i915_hotplug_interrupt_update_locked(dev_priv, 0xffffffff, 0);
+       I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
+
+       for_each_pipe(dev_priv, pipe) {
+               I915_WRITE(PIPESTAT(pipe),
+                          PIPE_FIFO_UNDERRUN_STATUS |
+                          PIPESTAT_INT_STATUS_MASK);
+               dev_priv->pipestat_irq_mask[pipe] = 0;
+       }
+
+       GEN5_IRQ_RESET(VLV_);
+       dev_priv->irq_mask = ~0;
+}
+
+static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
+{
+       u32 pipestat_mask;
+       u32 enable_mask;
+       enum pipe pipe;
+
+       pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
+                       PIPE_CRC_DONE_INTERRUPT_STATUS;
+
+       i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
+       for_each_pipe(dev_priv, pipe)
+               i915_enable_pipestat(dev_priv, pipe, pipestat_mask);
+
+       enable_mask = I915_DISPLAY_PORT_INTERRUPT |
+               I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
+               I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
+       if (IS_CHERRYVIEW(dev_priv))
+               enable_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
+
+       WARN_ON(dev_priv->irq_mask != ~0);
+
+       dev_priv->irq_mask = ~enable_mask;
+
+       GEN5_IRQ_INIT(VLV_, dev_priv->irq_mask, enable_mask);
+}
+
 /* drm_dma.h hooks
 */
 static void ironlake_irq_reset(struct drm_device *dev)
@@ -3284,34 +3409,19 @@ static void ironlake_irq_reset(struct drm_device *dev)
        ibx_irq_reset(dev);
 }
 
-static void vlv_display_irq_reset(struct drm_i915_private *dev_priv)
-{
-       enum pipe pipe;
-
-       i915_hotplug_interrupt_update(dev_priv, 0xFFFFFFFF, 0);
-       I915_WRITE(PORT_HOTPLUG_STAT, I915_READ(PORT_HOTPLUG_STAT));
-
-       for_each_pipe(dev_priv, pipe)
-               I915_WRITE(PIPESTAT(pipe), 0xffff);
-
-       GEN5_IRQ_RESET(VLV_);
-}
-
 static void valleyview_irq_preinstall(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       /* VLV magic */
-       I915_WRITE(VLV_IMR, 0);
-       I915_WRITE(RING_IMR(RENDER_RING_BASE), 0);
-       I915_WRITE(RING_IMR(GEN6_BSD_RING_BASE), 0);
-       I915_WRITE(RING_IMR(BLT_RING_BASE), 0);
+       I915_WRITE(VLV_MASTER_IER, 0);
+       POSTING_READ(VLV_MASTER_IER);
 
        gen5_gt_irq_reset(dev);
 
-       I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK);
-
-       vlv_display_irq_reset(dev_priv);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_reset(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
 }
 
 static void gen8_gt_irq_reset(struct drm_i915_private *dev_priv)
@@ -3384,9 +3494,10 @@ static void cherryview_irq_preinstall(struct drm_device *dev)
 
        GEN5_IRQ_RESET(GEN8_PCU_);
 
-       I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK_CHV);
-
-       vlv_display_irq_reset(dev_priv);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_reset(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
 }
 
 static u32 intel_hpd_enabled_irqs(struct drm_device *dev,
@@ -3506,6 +3617,26 @@ static void bxt_hpd_irq_setup(struct drm_device *dev)
        hotplug = I915_READ(PCH_PORT_HOTPLUG);
        hotplug |= PORTC_HOTPLUG_ENABLE | PORTB_HOTPLUG_ENABLE |
                PORTA_HOTPLUG_ENABLE;
+
+       DRM_DEBUG_KMS("Invert bit setting: hp_ctl:%x hp_port:%x\n",
+                     hotplug, enabled_irqs);
+       hotplug &= ~BXT_DDI_HPD_INVERT_MASK;
+
+       /*
+        * For BXT invert bit has to be set based on AOB design
+        * for HPD detection logic, update it based on VBT fields.
+        */
+
+       if ((enabled_irqs & BXT_DE_PORT_HP_DDIA) &&
+           intel_bios_is_port_hpd_inverted(dev_priv, PORT_A))
+               hotplug |= BXT_DDIA_HPD_INVERT;
+       if ((enabled_irqs & BXT_DE_PORT_HP_DDIB) &&
+           intel_bios_is_port_hpd_inverted(dev_priv, PORT_B))
+               hotplug |= BXT_DDIB_HPD_INVERT;
+       if ((enabled_irqs & BXT_DE_PORT_HP_DDIC) &&
+           intel_bios_is_port_hpd_inverted(dev_priv, PORT_C))
+               hotplug |= BXT_DDIC_HPD_INVERT;
+
        I915_WRITE(PCH_PORT_HOTPLUG, hotplug);
 }
 
@@ -3613,74 +3744,6 @@ static int ironlake_irq_postinstall(struct drm_device *dev)
        return 0;
 }
 
-static void valleyview_display_irqs_install(struct drm_i915_private *dev_priv)
-{
-       u32 pipestat_mask;
-       u32 iir_mask;
-       enum pipe pipe;
-
-       pipestat_mask = PIPESTAT_INT_STATUS_MASK |
-                       PIPE_FIFO_UNDERRUN_STATUS;
-
-       for_each_pipe(dev_priv, pipe)
-               I915_WRITE(PIPESTAT(pipe), pipestat_mask);
-       POSTING_READ(PIPESTAT(PIPE_A));
-
-       pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
-                       PIPE_CRC_DONE_INTERRUPT_STATUS;
-
-       i915_enable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
-       for_each_pipe(dev_priv, pipe)
-                     i915_enable_pipestat(dev_priv, pipe, pipestat_mask);
-
-       iir_mask = I915_DISPLAY_PORT_INTERRUPT |
-                  I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
-                  I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
-       if (IS_CHERRYVIEW(dev_priv))
-               iir_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
-       dev_priv->irq_mask &= ~iir_mask;
-
-       I915_WRITE(VLV_IIR, iir_mask);
-       I915_WRITE(VLV_IIR, iir_mask);
-       I915_WRITE(VLV_IER, ~dev_priv->irq_mask);
-       I915_WRITE(VLV_IMR, dev_priv->irq_mask);
-       POSTING_READ(VLV_IMR);
-}
-
-static void valleyview_display_irqs_uninstall(struct drm_i915_private *dev_priv)
-{
-       u32 pipestat_mask;
-       u32 iir_mask;
-       enum pipe pipe;
-
-       iir_mask = I915_DISPLAY_PORT_INTERRUPT |
-                  I915_DISPLAY_PIPE_A_EVENT_INTERRUPT |
-                  I915_DISPLAY_PIPE_B_EVENT_INTERRUPT;
-       if (IS_CHERRYVIEW(dev_priv))
-               iir_mask |= I915_DISPLAY_PIPE_C_EVENT_INTERRUPT;
-
-       dev_priv->irq_mask |= iir_mask;
-       I915_WRITE(VLV_IMR, dev_priv->irq_mask);
-       I915_WRITE(VLV_IER, ~dev_priv->irq_mask);
-       I915_WRITE(VLV_IIR, iir_mask);
-       I915_WRITE(VLV_IIR, iir_mask);
-       POSTING_READ(VLV_IIR);
-
-       pipestat_mask = PLANE_FLIP_DONE_INT_STATUS_VLV |
-                       PIPE_CRC_DONE_INTERRUPT_STATUS;
-
-       i915_disable_pipestat(dev_priv, PIPE_A, PIPE_GMBUS_INTERRUPT_STATUS);
-       for_each_pipe(dev_priv, pipe)
-               i915_disable_pipestat(dev_priv, pipe, pipestat_mask);
-
-       pipestat_mask = PIPESTAT_INT_STATUS_MASK |
-                       PIPE_FIFO_UNDERRUN_STATUS;
-
-       for_each_pipe(dev_priv, pipe)
-               I915_WRITE(PIPESTAT(pipe), pipestat_mask);
-       POSTING_READ(PIPESTAT(PIPE_A));
-}
-
 void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv)
 {
        assert_spin_locked(&dev_priv->irq_lock);
@@ -3690,8 +3753,10 @@ void valleyview_enable_display_irqs(struct drm_i915_private *dev_priv)
 
        dev_priv->display_irqs_enabled = true;
 
-       if (intel_irqs_enabled(dev_priv))
-               valleyview_display_irqs_install(dev_priv);
+       if (intel_irqs_enabled(dev_priv)) {
+               vlv_display_irq_reset(dev_priv);
+               vlv_display_irq_postinstall(dev_priv);
+       }
 }
 
 void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv)
@@ -3704,45 +3769,23 @@ void valleyview_disable_display_irqs(struct drm_i915_private *dev_priv)
        dev_priv->display_irqs_enabled = false;
 
        if (intel_irqs_enabled(dev_priv))
-               valleyview_display_irqs_uninstall(dev_priv);
+               vlv_display_irq_reset(dev_priv);
 }
 
-static void vlv_display_irq_postinstall(struct drm_i915_private *dev_priv)
-{
-       dev_priv->irq_mask = ~0;
-
-       i915_hotplug_interrupt_update(dev_priv, 0xffffffff, 0);
-       POSTING_READ(PORT_HOTPLUG_EN);
-
-       I915_WRITE(VLV_IIR, 0xffffffff);
-       I915_WRITE(VLV_IIR, 0xffffffff);
-       I915_WRITE(VLV_IER, ~dev_priv->irq_mask);
-       I915_WRITE(VLV_IMR, dev_priv->irq_mask);
-       POSTING_READ(VLV_IMR);
-
-       /* Interrupt setup is already guaranteed to be single-threaded, this is
-        * just to make the assert_spin_locked check happy. */
-       spin_lock_irq(&dev_priv->irq_lock);
-       if (dev_priv->display_irqs_enabled)
-               valleyview_display_irqs_install(dev_priv);
-       spin_unlock_irq(&dev_priv->irq_lock);
-}
 
 static int valleyview_irq_postinstall(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       vlv_display_irq_postinstall(dev_priv);
-
        gen5_gt_irq_postinstall(dev);
 
-       /* ack & enable invalid PTE error interrupts */
-#if 0 /* FIXME: add support to irq handler for checking these bits */
-       I915_WRITE(DPINVGTT, DPINVGTT_STATUS_MASK);
-       I915_WRITE(DPINVGTT, DPINVGTT_EN_MASK);
-#endif
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_postinstall(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
 
        I915_WRITE(VLV_MASTER_IER, MASTER_INTERRUPT_ENABLE);
+       POSTING_READ(VLV_MASTER_IER);
 
        return 0;
 }
@@ -3753,7 +3796,6 @@ static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv)
        uint32_t gt_interrupts[] = {
                GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
                        GT_CONTEXT_SWITCH_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
-                       GT_RENDER_L3_PARITY_ERROR_INTERRUPT |
                        GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT |
                        GT_CONTEXT_SWITCH_INTERRUPT << GEN8_BCS_IRQ_SHIFT,
                GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT |
@@ -3765,6 +3807,9 @@ static void gen8_gt_irq_postinstall(struct drm_i915_private *dev_priv)
                        GT_CONTEXT_SWITCH_INTERRUPT << GEN8_VECS_IRQ_SHIFT
                };
 
+       if (HAS_L3_DPF(dev_priv))
+               gt_interrupts[0] |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
+
        dev_priv->pm_irq_mask = 0xffffffff;
        GEN8_IRQ_INIT_NDX(GT, 0, ~gt_interrupts[0], gt_interrupts[0]);
        GEN8_IRQ_INIT_NDX(GT, 1, ~gt_interrupts[1], gt_interrupts[1]);
@@ -3832,7 +3877,7 @@ static int gen8_irq_postinstall(struct drm_device *dev)
        if (HAS_PCH_SPLIT(dev))
                ibx_irq_postinstall(dev);
 
-       I915_WRITE(GEN8_MASTER_IRQ, DE_MASTER_IRQ_CONTROL);
+       I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
        POSTING_READ(GEN8_MASTER_IRQ);
 
        return 0;
@@ -3842,11 +3887,14 @@ static int cherryview_irq_postinstall(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       vlv_display_irq_postinstall(dev_priv);
-
        gen8_gt_irq_postinstall(dev_priv);
 
-       I915_WRITE(GEN8_MASTER_IRQ, MASTER_INTERRUPT_ENABLE);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_postinstall(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
+
+       I915_WRITE(GEN8_MASTER_IRQ, GEN8_MASTER_IRQ_CONTROL);
        POSTING_READ(GEN8_MASTER_IRQ);
 
        return 0;
@@ -3862,20 +3910,6 @@ static void gen8_irq_uninstall(struct drm_device *dev)
        gen8_irq_reset(dev);
 }
 
-static void vlv_display_irq_uninstall(struct drm_i915_private *dev_priv)
-{
-       /* Interrupt setup is already guaranteed to be single-threaded, this is
-        * just to make the assert_spin_locked check happy. */
-       spin_lock_irq(&dev_priv->irq_lock);
-       if (dev_priv->display_irqs_enabled)
-               valleyview_display_irqs_uninstall(dev_priv);
-       spin_unlock_irq(&dev_priv->irq_lock);
-
-       vlv_display_irq_reset(dev_priv);
-
-       dev_priv->irq_mask = ~0;
-}
-
 static void valleyview_irq_uninstall(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -3884,12 +3918,16 @@ static void valleyview_irq_uninstall(struct drm_device *dev)
                return;
 
        I915_WRITE(VLV_MASTER_IER, 0);
+       POSTING_READ(VLV_MASTER_IER);
 
        gen5_gt_irq_reset(dev);
 
        I915_WRITE(HWSTAM, 0xffffffff);
 
-       vlv_display_irq_uninstall(dev_priv);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_reset(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
 }
 
 static void cherryview_irq_uninstall(struct drm_device *dev)
@@ -3906,7 +3944,10 @@ static void cherryview_irq_uninstall(struct drm_device *dev)
 
        GEN5_IRQ_RESET(GEN8_PCU_);
 
-       vlv_display_irq_uninstall(dev_priv);
+       spin_lock_irq(&dev_priv->irq_lock);
+       if (dev_priv->display_irqs_enabled)
+               vlv_display_irq_reset(dev_priv);
+       spin_unlock_irq(&dev_priv->irq_lock);
 }
 
 static void ironlake_irq_uninstall(struct drm_device *dev)
@@ -4044,7 +4085,7 @@ static irqreturn_t i8xx_irq_handler(int irq, void *arg)
                new_iir = I915_READ16(IIR); /* Flush posted writes */
 
                if (iir & I915_USER_INTERRUPT)
-                       notify_ring(&dev_priv->ring[RCS]);
+                       notify_ring(&dev_priv->engine[RCS]);
 
                for_each_pipe(dev_priv, pipe) {
                        int plane = pipe;
@@ -4233,14 +4274,17 @@ static irqreturn_t i915_irq_handler(int irq, void *arg)
 
                /* Consume port.  Then clear IIR or we'll miss events */
                if (I915_HAS_HOTPLUG(dev) &&
-                   iir & I915_DISPLAY_PORT_INTERRUPT)
-                       i9xx_hpd_irq_handler(dev);
+                   iir & I915_DISPLAY_PORT_INTERRUPT) {
+                       u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
+                       if (hotplug_status)
+                               i9xx_hpd_irq_handler(dev, hotplug_status);
+               }
 
                I915_WRITE(IIR, iir & ~flip_mask);
                new_iir = I915_READ(IIR); /* Flush posted writes */
 
                if (iir & I915_USER_INTERRUPT)
-                       notify_ring(&dev_priv->ring[RCS]);
+                       notify_ring(&dev_priv->engine[RCS]);
 
                for_each_pipe(dev_priv, pipe) {
                        int plane = pipe;
@@ -4463,16 +4507,19 @@ static irqreturn_t i965_irq_handler(int irq, void *arg)
                ret = IRQ_HANDLED;
 
                /* Consume port.  Then clear IIR or we'll miss events */
-               if (iir & I915_DISPLAY_PORT_INTERRUPT)
-                       i9xx_hpd_irq_handler(dev);
+               if (iir & I915_DISPLAY_PORT_INTERRUPT) {
+                       u32 hotplug_status = i9xx_hpd_irq_ack(dev_priv);
+                       if (hotplug_status)
+                               i9xx_hpd_irq_handler(dev, hotplug_status);
+               }
 
                I915_WRITE(IIR, iir & ~flip_mask);
                new_iir = I915_READ(IIR); /* Flush posted writes */
 
                if (iir & I915_USER_INTERRUPT)
-                       notify_ring(&dev_priv->ring[RCS]);
+                       notify_ring(&dev_priv->engine[RCS]);
                if (iir & I915_BSD_USER_INTERRUPT)
-                       notify_ring(&dev_priv->ring[VCS]);
+                       notify_ring(&dev_priv->engine[VCS]);
 
                for_each_pipe(dev_priv, pipe) {
                        if (pipe_stats[pipe] & PIPE_START_VBLANK_INTERRUPT_STATUS &&
@@ -4567,8 +4614,6 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
        INIT_DELAYED_WORK(&dev_priv->gpu_error.hangcheck_work,
                          i915_hangcheck_elapsed);
 
-       pm_qos_add_request(&dev_priv->pm_qos, PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
-
        if (IS_GEN2(dev_priv)) {
                dev->max_vblank_count = 0;
                dev->driver->get_vblank_counter = i8xx_get_vblank_counter;
index 278c9c40c2e0d8ceec71ae7b153bdb834bd9d231..1779f02e6df8fd3c406034b4bad1e3f9577e47b2 100644 (file)
@@ -56,6 +56,8 @@ struct i915_params i915 __read_mostly = {
        .edp_vswing = 0,
        .enable_guc_submission = false,
        .guc_log_level = -1,
+       .enable_dp_mst = true,
+       .inject_load_failure = 0,
 };
 
 module_param_named(modeset, i915.modeset, int, 0400);
@@ -201,3 +203,10 @@ MODULE_PARM_DESC(enable_guc_submission, "Enable GuC submission (default:false)")
 module_param_named(guc_log_level, i915.guc_log_level, int, 0400);
 MODULE_PARM_DESC(guc_log_level,
        "GuC firmware logging level (-1:disabled (default), 0-3:enabled)");
+
+module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600);
+MODULE_PARM_DESC(enable_dp_mst,
+       "Enable multi-stream transport (MST) for new DisplayPort sinks. (default: true)");
+module_param_named_unsafe(inject_load_failure, i915.inject_load_failure, uint, 0400);
+MODULE_PARM_DESC(inject_load_failure,
+       "Force an error after a number of failure check points (0:disabled (default), N:force failure at the Nth failure check point)");
index bd5026b15d3e0aa1f91c0fbd1079f6138667cdf8..02bc27804291296a9303088af9c6cc082f2299fd 100644 (file)
@@ -49,6 +49,7 @@ struct i915_params {
        int use_mmio_flip;
        int mmio_debug;
        int edp_vswing;
+       unsigned int inject_load_failure;
        /* leave bools at the end to not create holes */
        bool enable_hangcheck;
        bool fastboot;
@@ -59,6 +60,7 @@ struct i915_params {
        bool enable_guc_submission;
        bool verbose_state_checks;
        bool nuclear_pageflip;
+       bool enable_dp_mst;
 };
 
 extern struct i915_params i915 __read_mostly;
index 363bd79dea2ef476bdf0f14886248175310720f6..b407411e31ba8e649ccbec2255888a976fffde2c 100644 (file)
@@ -79,6 +79,16 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 
 /* PCI config space */
 
+#define MCHBAR_I915 0x44
+#define MCHBAR_I965 0x48
+#define MCHBAR_SIZE (4 * 4096)
+
+#define DEVEN 0x54
+#define   DEVEN_MCHBAR_EN (1 << 28)
+
+#define BSM 0x5c
+#define   BSM_MASK (0xFFFF << 20)
+
 #define HPLLCC 0xc0 /* 85x only */
 #define   GC_CLOCK_CONTROL_MASK                (0x7 << 0)
 #define   GC_CLOCK_133_200             (0 << 0)
@@ -90,6 +100,16 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define   GC_CLOCK_166_266             (6 << 0)
 #define   GC_CLOCK_166_250             (7 << 0)
 
+#define I915_GDRST 0xc0 /* PCI config register */
+#define   GRDOM_FULL           (0 << 2)
+#define   GRDOM_RENDER         (1 << 2)
+#define   GRDOM_MEDIA          (3 << 2)
+#define   GRDOM_MASK           (3 << 2)
+#define   GRDOM_RESET_STATUS   (1 << 1)
+#define   GRDOM_RESET_ENABLE   (1 << 0)
+
+#define GCDGMBUS 0xcc
+
 #define GCFGC2 0xda
 #define GCFGC  0xf0 /* 915+ only */
 #define   GC_LOW_FREQUENCY_ENABLE      (1 << 7)
@@ -121,18 +141,16 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define   I915_GC_RENDER_CLOCK_166_MHZ (0 << 0)
 #define   I915_GC_RENDER_CLOCK_200_MHZ (1 << 0)
 #define   I915_GC_RENDER_CLOCK_333_MHZ (4 << 0)
-#define GCDGMBUS 0xcc
-#define PCI_LBPC 0xf4 /* legacy/combination backlight modes, also called LBB */
 
+#define ASLE   0xe4
+#define ASLS   0xfc
+
+#define SWSCI  0xe8
+#define   SWSCI_SCISEL (1 << 15)
+#define   SWSCI_GSSCIE (1 << 0)
+
+#define LBPC 0xf4 /* legacy/combination backlight modes, also called LBB */
 
-/* Graphics reset regs */
-#define I915_GDRST 0xc0 /* PCI config register */
-#define  GRDOM_FULL    (0<<2)
-#define  GRDOM_RENDER  (1<<2)
-#define  GRDOM_MEDIA   (3<<2)
-#define  GRDOM_MASK    (3<<2)
-#define  GRDOM_RESET_STATUS (1<<1)
-#define  GRDOM_RESET_ENABLE (1<<0)
 
 #define ILK_GDSR _MMIO(MCHBAR_MIRROR_BASE + 0x2ca4)
 #define  ILK_GRDOM_FULL                (0<<1)
@@ -164,6 +182,9 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define  GEN6_GRDOM_RENDER             (1 << 1)
 #define  GEN6_GRDOM_MEDIA              (1 << 2)
 #define  GEN6_GRDOM_BLT                        (1 << 3)
+#define  GEN6_GRDOM_VECS               (1 << 4)
+#define  GEN9_GRDOM_GUC                        (1 << 5)
+#define  GEN8_GRDOM_MEDIA2             (1 << 7)
 
 #define RING_PP_DIR_BASE(ring)         _MMIO((ring)->mmio_base+0x228)
 #define RING_PP_DIR_BASE_READ(ring)    _MMIO((ring)->mmio_base+0x518)
@@ -586,6 +607,10 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define GEN7_GPGPU_DISPATCHDIMY         _MMIO(0x2504)
 #define GEN7_GPGPU_DISPATCHDIMZ         _MMIO(0x2508)
 
+/* There are the 16 64-bit CS General Purpose Registers */
+#define HSW_CS_GPR(n)                   _MMIO(0x2600 + (n) * 8)
+#define HSW_CS_GPR_UDW(n)               _MMIO(0x2600 + (n) * 8 + 4)
+
 #define OACONTROL _MMIO(0x2360)
 
 #define _GEN7_PIPEA_DE_LOAD_SL 0x70068
@@ -621,6 +646,10 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define   IOSF_PORT_GPIO_SC                    0x48
 #define   IOSF_PORT_GPIO_SUS                   0xa8
 #define   IOSF_PORT_CCU                                0xa9
+#define   CHV_IOSF_PORT_GPIO_N                 0x13
+#define   CHV_IOSF_PORT_GPIO_SE                        0x48
+#define   CHV_IOSF_PORT_GPIO_E                 0xa8
+#define   CHV_IOSF_PORT_GPIO_SW                        0xb2
 #define VLV_IOSF_DATA                          _MMIO(VLV_DISPLAY_BASE + 0x2104)
 #define VLV_IOSF_ADDR                          _MMIO(VLV_DISPLAY_BASE + 0x2108)
 
@@ -785,7 +814,9 @@ enum skl_disp_power_wells {
 #define  DSI_PLL_M1_DIV_SHIFT                  0
 #define  DSI_PLL_M1_DIV_MASK                   (0x1ff << 0)
 #define CCK_CZ_CLOCK_CONTROL                   0x62
+#define CCK_GPLL_CLOCK_CONTROL                 0x67
 #define CCK_DISPLAY_CLOCK_CONTROL              0x6b
+#define CCK_DISPLAY_REF_CLOCK_CONTROL          0x6c
 #define  CCK_TRUNK_FORCE_ON                    (1 << 17)
 #define  CCK_TRUNK_FORCE_OFF                   (1 << 16)
 #define  CCK_FREQUENCY_STATUS                  (0x1f << 8)
@@ -1317,6 +1348,7 @@ enum skl_disp_power_wells {
 #define _PORT_CL1CM_DW0_A              0x162000
 #define _PORT_CL1CM_DW0_BC             0x6C000
 #define   PHY_POWER_GOOD               (1 << 16)
+#define   PHY_RESERVED                 (1 << 7)
 #define BXT_PORT_CL1CM_DW0(phy)                _BXT_PHY((phy), _PORT_CL1CM_DW0_BC, \
                                                        _PORT_CL1CM_DW0_A)
 
@@ -1361,14 +1393,10 @@ enum skl_disp_power_wells {
 
 #define _PORT_REF_DW6_A                        0x162198
 #define _PORT_REF_DW6_BC               0x6C198
-/*
- * FIXME: BSpec/CHV ConfigDB disagrees on the following two fields, fix them
- * after testing.
- */
-#define   GRC_CODE_SHIFT               23
-#define   GRC_CODE_MASK                        (0x1FF << GRC_CODE_SHIFT)
+#define   GRC_CODE_SHIFT               24
+#define   GRC_CODE_MASK                        (0xFF << GRC_CODE_SHIFT)
 #define   GRC_CODE_FAST_SHIFT          16
-#define   GRC_CODE_FAST_MASK           (0x7F << GRC_CODE_FAST_SHIFT)
+#define   GRC_CODE_FAST_MASK           (0xFF << GRC_CODE_FAST_SHIFT)
 #define   GRC_CODE_SLOW_SHIFT          8
 #define   GRC_CODE_SLOW_MASK           (0xFF << GRC_CODE_SLOW_SHIFT)
 #define   GRC_CODE_NOM_MASK            0xFF
@@ -1776,6 +1804,18 @@ enum skl_disp_power_wells {
 #define   GEN9_IZ_HASHING_MASK(slice)                  (0x3 << ((slice) * 2))
 #define   GEN9_IZ_HASHING(slice, val)                  ((val) << ((slice) * 2))
 
+/* WaClearTdlStateAckDirtyBits */
+#define GEN8_STATE_ACK         _MMIO(0x20F0)
+#define GEN9_STATE_ACK_SLICE1  _MMIO(0x20F8)
+#define GEN9_STATE_ACK_SLICE2  _MMIO(0x2100)
+#define   GEN9_STATE_ACK_TDL0 (1 << 12)
+#define   GEN9_STATE_ACK_TDL1 (1 << 13)
+#define   GEN9_STATE_ACK_TDL2 (1 << 14)
+#define   GEN9_STATE_ACK_TDL3 (1 << 15)
+#define   GEN9_SUBSLICE_TDL_ACK_BITS \
+       (GEN9_STATE_ACK_TDL3 | GEN9_STATE_ACK_TDL2 | \
+        GEN9_STATE_ACK_TDL1 | GEN9_STATE_ACK_TDL0)
+
 #define GFX_MODE       _MMIO(0x2520)
 #define GFX_MODE_GEN7  _MMIO(0x229c)
 #define RING_MODE_GEN7(ring)   _MMIO((ring)->mmio_base+0x29c)
@@ -1795,6 +1835,7 @@ enum skl_disp_power_wells {
 
 #define VLV_DISPLAY_BASE 0x180000
 #define VLV_MIPI_BASE VLV_DISPLAY_BASE
+#define BXT_MIPI_BASE 0x60000
 
 #define VLV_GU_CTL0    _MMIO(VLV_DISPLAY_BASE + 0x2030)
 #define VLV_GU_CTL1    _MMIO(VLV_DISPLAY_BASE + 0x2034)
@@ -2923,6 +2964,15 @@ enum skl_disp_power_wells {
                                INTERVAL_1_33_US(us)) : \
                                INTERVAL_1_28_US(us))
 
+#define INTERVAL_1_28_TO_US(interval)  (((interval) << 7) / 100)
+#define INTERVAL_1_33_TO_US(interval)  (((interval) << 2) / 3)
+#define INTERVAL_0_833_TO_US(interval) (((interval) * 5)  / 6)
+#define GT_PM_INTERVAL_TO_US(dev_priv, interval) (IS_GEN9(dev_priv) ? \
+                           (IS_BROXTON(dev_priv) ? \
+                           INTERVAL_0_833_TO_US(interval) : \
+                           INTERVAL_1_33_TO_US(interval)) : \
+                           INTERVAL_1_28_TO_US(interval))
+
 /*
  * Logical Context regs
  */
@@ -4784,6 +4834,10 @@ enum skl_disp_power_wells {
 #define  CBR_PND_DEADLINE_DISABLE      (1<<31)
 #define  CBR_PWM_CLOCK_MUX_SELECT      (1<<30)
 
+#define CBR4_VLV                       _MMIO(VLV_DISPLAY_BASE + 0x70450)
+#define  CBR_DPLLBMD_PIPE_C            (1<<29)
+#define  CBR_DPLLBMD_PIPE_B            (1<<18)
+
 /* FIFO watermark sizes etc */
 #define G4X_FIFO_LINE_SIZE     64
 #define I915_FIFO_LINE_SIZE    64
@@ -6184,6 +6238,7 @@ enum skl_disp_power_wells {
 /* digital port hotplug */
 #define PCH_PORT_HOTPLUG               _MMIO(0xc4030)  /* SHOTPLUG_CTL */
 #define  PORTA_HOTPLUG_ENABLE          (1 << 28) /* LPT:LP+ & BXT */
+#define  BXT_DDIA_HPD_INVERT            (1 << 27)
 #define  PORTA_HOTPLUG_STATUS_MASK     (3 << 24) /* SPT+ & BXT */
 #define  PORTA_HOTPLUG_NO_DETECT       (0 << 24) /* SPT+ & BXT */
 #define  PORTA_HOTPLUG_SHORT_DETECT    (1 << 24) /* SPT+ & BXT */
@@ -6199,6 +6254,7 @@ enum skl_disp_power_wells {
 #define  PORTD_HOTPLUG_SHORT_DETECT    (1 << 16)
 #define  PORTD_HOTPLUG_LONG_DETECT     (2 << 16)
 #define  PORTC_HOTPLUG_ENABLE          (1 << 12)
+#define  BXT_DDIC_HPD_INVERT            (1 << 11)
 #define  PORTC_PULSE_DURATION_2ms      (0 << 10) /* pre-LPT */
 #define  PORTC_PULSE_DURATION_4_5ms    (1 << 10) /* pre-LPT */
 #define  PORTC_PULSE_DURATION_6ms      (2 << 10) /* pre-LPT */
@@ -6209,6 +6265,7 @@ enum skl_disp_power_wells {
 #define  PORTC_HOTPLUG_SHORT_DETECT    (1 << 8)
 #define  PORTC_HOTPLUG_LONG_DETECT     (2 << 8)
 #define  PORTB_HOTPLUG_ENABLE          (1 << 4)
+#define  BXT_DDIB_HPD_INVERT            (1 << 3)
 #define  PORTB_PULSE_DURATION_2ms      (0 << 2) /* pre-LPT */
 #define  PORTB_PULSE_DURATION_4_5ms    (1 << 2) /* pre-LPT */
 #define  PORTB_PULSE_DURATION_6ms      (2 << 2) /* pre-LPT */
@@ -6218,6 +6275,9 @@ enum skl_disp_power_wells {
 #define  PORTB_HOTPLUG_NO_DETECT       (0 << 0)
 #define  PORTB_HOTPLUG_SHORT_DETECT    (1 << 0)
 #define  PORTB_HOTPLUG_LONG_DETECT     (2 << 0)
+#define  BXT_DDI_HPD_INVERT_MASK       (BXT_DDIA_HPD_INVERT | \
+                                       BXT_DDIB_HPD_INVERT | \
+                                       BXT_DDIC_HPD_INVERT)
 
 #define PCH_PORT_HOTPLUG2              _MMIO(0xc403C)  /* SHOTPLUG_CTL2 SPT+ */
 #define  PORTE_HOTPLUG_ENABLE          (1 << 4)
@@ -6836,6 +6896,8 @@ enum skl_disp_power_wells {
 #define  VLV_SPAREG2H                          _MMIO(0xA194)
 
 #define  GTFIFODBG                             _MMIO(0x120000)
+#define    GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV   (0x1f << 20)
+#define    GT_FIFO_FREE_ENTRIES_CHV            (0x7f << 13)
 #define    GT_FIFO_SBDROPERR                   (1<<6)
 #define    GT_FIFO_BLOBDROPERR                 (1<<5)
 #define    GT_FIFO_SB_READ_ABORTERR            (1<<4)
@@ -6852,8 +6914,11 @@ enum skl_disp_power_wells {
 
 #define  HSW_IDICR                             _MMIO(0x9008)
 #define    IDIHASHMSK(x)                       (((x) & 0x3f) << 16)
-#define  HSW_EDRAM_PRESENT                     _MMIO(0x120010)
+#define  HSW_EDRAM_CAP                         _MMIO(0x120010)
 #define    EDRAM_ENABLED                       0x1
+#define    EDRAM_NUM_BANKS(cap)                        (((cap) >> 1) & 0xf)
+#define    EDRAM_WAYS_IDX(cap)                 (((cap) >> 5) & 0x7)
+#define    EDRAM_SETS_IDX(cap)                 (((cap) >> 8) & 0x3)
 
 #define GEN6_UCGCTL1                           _MMIO(0x9400)
 # define GEN6_EU_TCUNIT_CLOCK_GATE_DISABLE             (1 << 16)
@@ -7109,6 +7174,7 @@ enum skl_disp_power_wells {
 #define   GEN9_CCS_TLB_PREFETCH_ENABLE (1<<3)
 
 #define GEN8_ROW_CHICKEN               _MMIO(0xe4f0)
+#define   FLOW_CONTROL_ENABLE          (1<<15)
 #define   PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE        (1<<8)
 #define   STALL_DOP_GATING_DISABLE             (1<<5)
 
@@ -7130,6 +7196,7 @@ enum skl_disp_power_wells {
 
 #define GEN9_HALF_SLICE_CHICKEN7       _MMIO(0xe194)
 #define   GEN9_ENABLE_YV12_BUGFIX      (1<<4)
+#define   GEN9_ENABLE_GPGPU_PREEMPTION (1<<2)
 
 /* Audio */
 #define G4X_AUD_VID_DID                        _MMIO(dev_priv->info.display_mmio_offset + 0x62020)
@@ -7369,9 +7436,11 @@ enum skl_disp_power_wells {
 /* SBI offsets */
 #define  SBI_SSCDIVINTPHASE                    0x0200
 #define  SBI_SSCDIVINTPHASE6                   0x0600
-#define   SBI_SSCDIVINTPHASE_DIVSEL_MASK       ((0x7f)<<1)
+#define   SBI_SSCDIVINTPHASE_DIVSEL_SHIFT      1
+#define   SBI_SSCDIVINTPHASE_DIVSEL_MASK       (0x7f<<1)
 #define   SBI_SSCDIVINTPHASE_DIVSEL(x)         ((x)<<1)
-#define   SBI_SSCDIVINTPHASE_INCVAL_MASK       ((0x7f)<<8)
+#define   SBI_SSCDIVINTPHASE_INCVAL_SHIFT      8
+#define   SBI_SSCDIVINTPHASE_INCVAL_MASK       (0x7f<<8)
 #define   SBI_SSCDIVINTPHASE_INCVAL(x)         ((x)<<8)
 #define   SBI_SSCDIVINTPHASE_DIR(x)            ((x)<<15)
 #define   SBI_SSCDIVINTPHASE_PROPAGATE         (1<<0)
@@ -7381,6 +7450,8 @@ enum skl_disp_power_wells {
 #define   SBI_SSCCTL_PATHALT                   (1<<3)
 #define   SBI_SSCCTL_DISABLE                   (1<<0)
 #define  SBI_SSCAUXDIV6                                0x0610
+#define   SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT     4
+#define   SBI_SSCAUXDIV_FINALDIV2SEL_MASK      (1<<4)
 #define   SBI_SSCAUXDIV_FINALDIV2SEL(x)                ((x)<<4)
 #define  SBI_DBUFF0                            0x2a00
 #define  SBI_GEN0                              0x1f00
@@ -7660,6 +7731,59 @@ enum skl_disp_power_wells {
 #define PIPE_CSC_POSTOFF_ME(pipe)      _MMIO_PIPE(pipe, _PIPE_A_CSC_POSTOFF_ME, _PIPE_B_CSC_POSTOFF_ME)
 #define PIPE_CSC_POSTOFF_LO(pipe)      _MMIO_PIPE(pipe, _PIPE_A_CSC_POSTOFF_LO, _PIPE_B_CSC_POSTOFF_LO)
 
+/* pipe degamma/gamma LUTs on IVB+ */
+#define _PAL_PREC_INDEX_A      0x4A400
+#define _PAL_PREC_INDEX_B      0x4AC00
+#define _PAL_PREC_INDEX_C      0x4B400
+#define   PAL_PREC_10_12_BIT           (0 << 31)
+#define   PAL_PREC_SPLIT_MODE          (1 << 31)
+#define   PAL_PREC_AUTO_INCREMENT      (1 << 15)
+#define _PAL_PREC_DATA_A       0x4A404
+#define _PAL_PREC_DATA_B       0x4AC04
+#define _PAL_PREC_DATA_C       0x4B404
+#define _PAL_PREC_GC_MAX_A     0x4A410
+#define _PAL_PREC_GC_MAX_B     0x4AC10
+#define _PAL_PREC_GC_MAX_C     0x4B410
+#define _PAL_PREC_EXT_GC_MAX_A 0x4A420
+#define _PAL_PREC_EXT_GC_MAX_B 0x4AC20
+#define _PAL_PREC_EXT_GC_MAX_C 0x4B420
+
+#define PREC_PAL_INDEX(pipe)           _MMIO_PIPE(pipe, _PAL_PREC_INDEX_A, _PAL_PREC_INDEX_B)
+#define PREC_PAL_DATA(pipe)            _MMIO_PIPE(pipe, _PAL_PREC_DATA_A, _PAL_PREC_DATA_B)
+#define PREC_PAL_GC_MAX(pipe, i)       _MMIO(_PIPE(pipe, _PAL_PREC_GC_MAX_A, _PAL_PREC_GC_MAX_B) + (i) * 4)
+#define PREC_PAL_EXT_GC_MAX(pipe, i)   _MMIO(_PIPE(pipe, _PAL_PREC_EXT_GC_MAX_A, _PAL_PREC_EXT_GC_MAX_B) + (i) * 4)
+
+/* pipe CSC & degamma/gamma LUTs on CHV */
+#define _CGM_PIPE_A_CSC_COEFF01        (VLV_DISPLAY_BASE + 0x67900)
+#define _CGM_PIPE_A_CSC_COEFF23        (VLV_DISPLAY_BASE + 0x67904)
+#define _CGM_PIPE_A_CSC_COEFF45        (VLV_DISPLAY_BASE + 0x67908)
+#define _CGM_PIPE_A_CSC_COEFF67        (VLV_DISPLAY_BASE + 0x6790C)
+#define _CGM_PIPE_A_CSC_COEFF8 (VLV_DISPLAY_BASE + 0x67910)
+#define _CGM_PIPE_A_DEGAMMA    (VLV_DISPLAY_BASE + 0x66000)
+#define _CGM_PIPE_A_GAMMA      (VLV_DISPLAY_BASE + 0x67000)
+#define _CGM_PIPE_A_MODE       (VLV_DISPLAY_BASE + 0x67A00)
+#define   CGM_PIPE_MODE_GAMMA  (1 << 2)
+#define   CGM_PIPE_MODE_CSC    (1 << 1)
+#define   CGM_PIPE_MODE_DEGAMMA        (1 << 0)
+
+#define _CGM_PIPE_B_CSC_COEFF01        (VLV_DISPLAY_BASE + 0x69900)
+#define _CGM_PIPE_B_CSC_COEFF23        (VLV_DISPLAY_BASE + 0x69904)
+#define _CGM_PIPE_B_CSC_COEFF45        (VLV_DISPLAY_BASE + 0x69908)
+#define _CGM_PIPE_B_CSC_COEFF67        (VLV_DISPLAY_BASE + 0x6990C)
+#define _CGM_PIPE_B_CSC_COEFF8 (VLV_DISPLAY_BASE + 0x69910)
+#define _CGM_PIPE_B_DEGAMMA    (VLV_DISPLAY_BASE + 0x68000)
+#define _CGM_PIPE_B_GAMMA      (VLV_DISPLAY_BASE + 0x69000)
+#define _CGM_PIPE_B_MODE       (VLV_DISPLAY_BASE + 0x69A00)
+
+#define CGM_PIPE_CSC_COEFF01(pipe)     _MMIO_PIPE(pipe, _CGM_PIPE_A_CSC_COEFF01, _CGM_PIPE_B_CSC_COEFF01)
+#define CGM_PIPE_CSC_COEFF23(pipe)     _MMIO_PIPE(pipe, _CGM_PIPE_A_CSC_COEFF23, _CGM_PIPE_B_CSC_COEFF23)
+#define CGM_PIPE_CSC_COEFF45(pipe)     _MMIO_PIPE(pipe, _CGM_PIPE_A_CSC_COEFF45, _CGM_PIPE_B_CSC_COEFF45)
+#define CGM_PIPE_CSC_COEFF67(pipe)     _MMIO_PIPE(pipe, _CGM_PIPE_A_CSC_COEFF67, _CGM_PIPE_B_CSC_COEFF67)
+#define CGM_PIPE_CSC_COEFF8(pipe)      _MMIO_PIPE(pipe, _CGM_PIPE_A_CSC_COEFF8, _CGM_PIPE_B_CSC_COEFF8)
+#define CGM_PIPE_DEGAMMA(pipe, i, w)   _MMIO(_PIPE(pipe, _CGM_PIPE_A_DEGAMMA, _CGM_PIPE_B_DEGAMMA) + (i) * 8 + (w) * 4)
+#define CGM_PIPE_GAMMA(pipe, i, w)     _MMIO(_PIPE(pipe, _CGM_PIPE_A_GAMMA, _CGM_PIPE_B_GAMMA) + (i) * 8 + (w) * 4)
+#define CGM_PIPE_MODE(pipe)            _MMIO_PIPE(pipe, _CGM_PIPE_A_MODE, _CGM_PIPE_B_MODE)
+
 /* MIPI DSI registers */
 
 #define _MIPI_PORT(port, a, c) _PORT3(port, a, 0, c)   /* ports A and C only */
@@ -7674,58 +7798,62 @@ enum skl_disp_power_wells {
 #define  BXT_MIPI_DIV_SHIFT(port)              \
                        _MIPI_PORT(port, BXT_MIPI1_DIV_SHIFT, \
                                        BXT_MIPI2_DIV_SHIFT)
-/* Var clock divider to generate TX source. Result must be < 39.5 M */
-#define  BXT_MIPI1_ESCLK_VAR_DIV_MASK          (0x3F << 26)
-#define  BXT_MIPI2_ESCLK_VAR_DIV_MASK          (0x3F << 10)
-#define  BXT_MIPI_ESCLK_VAR_DIV_MASK(port)     \
-                       _MIPI_PORT(port, BXT_MIPI1_ESCLK_VAR_DIV_MASK, \
-                                               BXT_MIPI2_ESCLK_VAR_DIV_MASK)
-
-#define  BXT_MIPI_ESCLK_VAR_DIV(port, val)     \
-                       (val << BXT_MIPI_DIV_SHIFT(port))
+
 /* TX control divider to select actual TX clock output from (8x/var) */
-#define  BXT_MIPI1_TX_ESCLK_SHIFT              21
-#define  BXT_MIPI2_TX_ESCLK_SHIFT              5
+#define  BXT_MIPI1_TX_ESCLK_SHIFT              26
+#define  BXT_MIPI2_TX_ESCLK_SHIFT              10
 #define  BXT_MIPI_TX_ESCLK_SHIFT(port)         \
                        _MIPI_PORT(port, BXT_MIPI1_TX_ESCLK_SHIFT, \
                                        BXT_MIPI2_TX_ESCLK_SHIFT)
-#define  BXT_MIPI1_TX_ESCLK_FIXDIV_MASK                (3 << 21)
-#define  BXT_MIPI2_TX_ESCLK_FIXDIV_MASK                (3 << 5)
+#define  BXT_MIPI1_TX_ESCLK_FIXDIV_MASK                (0x3F << 26)
+#define  BXT_MIPI2_TX_ESCLK_FIXDIV_MASK                (0x3F << 10)
 #define  BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port)   \
                        _MIPI_PORT(port, BXT_MIPI1_TX_ESCLK_FIXDIV_MASK, \
-                                               BXT_MIPI2_TX_ESCLK_FIXDIV_MASK)
-#define  BXT_MIPI_TX_ESCLK_8XDIV_BY2(port)     \
-               (0x0 << BXT_MIPI_TX_ESCLK_SHIFT(port))
-#define  BXT_MIPI_TX_ESCLK_8XDIV_BY4(port)     \
-               (0x1 << BXT_MIPI_TX_ESCLK_SHIFT(port))
-#define  BXT_MIPI_TX_ESCLK_8XDIV_BY8(port)     \
-               (0x2 << BXT_MIPI_TX_ESCLK_SHIFT(port))
-/* RX control divider to select actual RX clock output from 8x*/
-#define  BXT_MIPI1_RX_ESCLK_SHIFT              19
-#define  BXT_MIPI2_RX_ESCLK_SHIFT              3
-#define  BXT_MIPI_RX_ESCLK_SHIFT(port)         \
-                       _MIPI_PORT(port, BXT_MIPI1_RX_ESCLK_SHIFT, \
-                                       BXT_MIPI2_RX_ESCLK_SHIFT)
-#define  BXT_MIPI1_RX_ESCLK_FIXDIV_MASK                (3 << 19)
-#define  BXT_MIPI2_RX_ESCLK_FIXDIV_MASK                (3 << 3)
-#define  BXT_MIPI_RX_ESCLK_FIXDIV_MASK(port)   \
-               (3 << BXT_MIPI_RX_ESCLK_SHIFT(port))
-#define  BXT_MIPI_RX_ESCLK_8X_BY2(port)        \
-               (1 << BXT_MIPI_RX_ESCLK_SHIFT(port))
-#define  BXT_MIPI_RX_ESCLK_8X_BY3(port)        \
-               (2 << BXT_MIPI_RX_ESCLK_SHIFT(port))
-#define  BXT_MIPI_RX_ESCLK_8X_BY4(port)        \
-               (3 << BXT_MIPI_RX_ESCLK_SHIFT(port))
-/* BXT-A WA: Always prog DPHY dividers to 00 */
-#define  BXT_MIPI1_DPHY_DIV_SHIFT              16
-#define  BXT_MIPI2_DPHY_DIV_SHIFT              0
-#define  BXT_MIPI_DPHY_DIV_SHIFT(port)         \
-                       _MIPI_PORT(port, BXT_MIPI1_DPHY_DIV_SHIFT, \
-                                       BXT_MIPI2_DPHY_DIV_SHIFT)
-#define  BXT_MIPI_1_DPHY_DIVIDER_MASK          (3 << 16)
-#define  BXT_MIPI_2_DPHY_DIVIDER_MASK          (3 << 0)
-#define  BXT_MIPI_DPHY_DIVIDER_MASK(port)      \
-               (3 << BXT_MIPI_DPHY_DIV_SHIFT(port))
+                                       BXT_MIPI2_TX_ESCLK_FIXDIV_MASK)
+#define  BXT_MIPI_TX_ESCLK_DIVIDER(port, val)  \
+               ((val & 0x3F) << BXT_MIPI_TX_ESCLK_SHIFT(port))
+/* RX upper control divider to select actual RX clock output from 8x */
+#define  BXT_MIPI1_RX_ESCLK_UPPER_SHIFT                21
+#define  BXT_MIPI2_RX_ESCLK_UPPER_SHIFT                5
+#define  BXT_MIPI_RX_ESCLK_UPPER_SHIFT(port)           \
+                       _MIPI_PORT(port, BXT_MIPI1_RX_ESCLK_UPPER_SHIFT, \
+                                       BXT_MIPI2_RX_ESCLK_UPPER_SHIFT)
+#define  BXT_MIPI1_RX_ESCLK_UPPER_FIXDIV_MASK          (3 << 21)
+#define  BXT_MIPI2_RX_ESCLK_UPPER_FIXDIV_MASK          (3 << 5)
+#define  BXT_MIPI_RX_ESCLK_UPPER_FIXDIV_MASK(port)     \
+                       _MIPI_PORT(port, BXT_MIPI1_RX_ESCLK_UPPER_FIXDIV_MASK, \
+                                       BXT_MIPI2_RX_ESCLK_UPPER_FIXDIV_MASK)
+#define  BXT_MIPI_RX_ESCLK_UPPER_DIVIDER(port, val)    \
+               ((val & 3) << BXT_MIPI_RX_ESCLK_UPPER_SHIFT(port))
+/* 8/3X divider to select the actual 8/3X clock output from 8x */
+#define  BXT_MIPI1_8X_BY3_SHIFT                19
+#define  BXT_MIPI2_8X_BY3_SHIFT                3
+#define  BXT_MIPI_8X_BY3_SHIFT(port)          \
+                       _MIPI_PORT(port, BXT_MIPI1_8X_BY3_SHIFT, \
+                                       BXT_MIPI2_8X_BY3_SHIFT)
+#define  BXT_MIPI1_8X_BY3_DIVIDER_MASK         (3 << 19)
+#define  BXT_MIPI2_8X_BY3_DIVIDER_MASK         (3 << 3)
+#define  BXT_MIPI_8X_BY3_DIVIDER_MASK(port)    \
+                       _MIPI_PORT(port, BXT_MIPI1_8X_BY3_DIVIDER_MASK, \
+                                               BXT_MIPI2_8X_BY3_DIVIDER_MASK)
+#define  BXT_MIPI_8X_BY3_DIVIDER(port, val)    \
+                       ((val & 3) << BXT_MIPI_8X_BY3_SHIFT(port))
+/* RX lower control divider to select actual RX clock output from 8x */
+#define  BXT_MIPI1_RX_ESCLK_LOWER_SHIFT                16
+#define  BXT_MIPI2_RX_ESCLK_LOWER_SHIFT                0
+#define  BXT_MIPI_RX_ESCLK_LOWER_SHIFT(port)           \
+                       _MIPI_PORT(port, BXT_MIPI1_RX_ESCLK_LOWER_SHIFT, \
+                                       BXT_MIPI2_RX_ESCLK_LOWER_SHIFT)
+#define  BXT_MIPI1_RX_ESCLK_LOWER_FIXDIV_MASK          (3 << 16)
+#define  BXT_MIPI2_RX_ESCLK_LOWER_FIXDIV_MASK          (3 << 0)
+#define  BXT_MIPI_RX_ESCLK_LOWER_FIXDIV_MASK(port)     \
+                       _MIPI_PORT(port, BXT_MIPI1_RX_ESCLK_LOWER_FIXDIV_MASK, \
+                                       BXT_MIPI2_RX_ESCLK_LOWER_FIXDIV_MASK)
+#define  BXT_MIPI_RX_ESCLK_LOWER_DIVIDER(port, val)    \
+               ((val & 3) << BXT_MIPI_RX_ESCLK_LOWER_SHIFT(port))
+
+#define RX_DIVIDER_BIT_1_2                     0x3
+#define RX_DIVIDER_BIT_3_4                     0xC
 
 /* BXT MIPI mode configure */
 #define  _BXT_MIPIA_TRANS_HACTIVE                      0x6B0F8
@@ -7750,9 +7878,11 @@ enum skl_disp_power_wells {
 #define  BXT_DSIC_16X_BY2              (1 << 10)
 #define  BXT_DSIC_16X_BY3              (2 << 10)
 #define  BXT_DSIC_16X_BY4              (3 << 10)
+#define  BXT_DSIC_16X_MASK             (3 << 10)
 #define  BXT_DSIA_16X_BY2              (1 << 8)
 #define  BXT_DSIA_16X_BY3              (2 << 8)
 #define  BXT_DSIA_16X_BY4              (3 << 8)
+#define  BXT_DSIA_16X_MASK             (3 << 8)
 #define  BXT_DSI_FREQ_SEL_SHIFT                8
 #define  BXT_DSI_FREQ_SEL_MASK         (0xF << BXT_DSI_FREQ_SEL_SHIFT)
 
@@ -7887,8 +8017,8 @@ enum skl_disp_power_wells {
 #define  VID_MODE_FORMAT_MASK                          (0xf << 7)
 #define  VID_MODE_NOT_SUPPORTED                                (0 << 7)
 #define  VID_MODE_FORMAT_RGB565                                (1 << 7)
-#define  VID_MODE_FORMAT_RGB666                                (2 << 7)
-#define  VID_MODE_FORMAT_RGB666_LOOSE                  (3 << 7)
+#define  VID_MODE_FORMAT_RGB666_PACKED                 (2 << 7)
+#define  VID_MODE_FORMAT_RGB666                                (3 << 7)
 #define  VID_MODE_FORMAT_RGB888                                (4 << 7)
 #define  CMD_MODE_CHANNEL_NUMBER_SHIFT                 5
 #define  CMD_MODE_CHANNEL_NUMBER_MASK                  (3 << 5)
@@ -8144,6 +8274,7 @@ enum skl_disp_power_wells {
 #define  READ_REQUEST_PRIORITY_HIGH                    (3 << 3)
 #define  RGB_FLIP_TO_BGR                               (1 << 2)
 
+#define  BXT_PIPE_SELECT_SHIFT                         7
 #define  BXT_PIPE_SELECT_MASK                          (7 << 7)
 #define  BXT_PIPE_SELECT(pipe)                         ((pipe) << 7)
 
index c6188dddb3414dd20188776ad63a70505ab293cb..2d576b7ff2999ae65ab5008ed624bd2b70dd18b6 100644 (file)
@@ -370,6 +370,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
 
+       intel_runtime_pm_get(dev_priv);
+
        mutex_lock(&dev_priv->rps.hw_lock);
 
        val = intel_freq_opcode(dev_priv, val);
@@ -378,6 +380,7 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
            val > dev_priv->rps.max_freq ||
            val < dev_priv->rps.min_freq_softlimit) {
                mutex_unlock(&dev_priv->rps.hw_lock);
+               intel_runtime_pm_put(dev_priv);
                return -EINVAL;
        }
 
@@ -398,6 +401,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
 
        mutex_unlock(&dev_priv->rps.hw_lock);
 
+       intel_runtime_pm_put(dev_priv);
+
        return count;
 }
 
@@ -433,6 +438,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
 
        flush_delayed_work(&dev_priv->rps.delayed_resume_work);
 
+       intel_runtime_pm_get(dev_priv);
+
        mutex_lock(&dev_priv->rps.hw_lock);
 
        val = intel_freq_opcode(dev_priv, val);
@@ -441,6 +448,7 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
            val > dev_priv->rps.max_freq ||
            val > dev_priv->rps.max_freq_softlimit) {
                mutex_unlock(&dev_priv->rps.hw_lock);
+               intel_runtime_pm_put(dev_priv);
                return -EINVAL;
        }
 
@@ -457,6 +465,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
 
        mutex_unlock(&dev_priv->rps.hw_lock);
 
+       intel_runtime_pm_put(dev_priv);
+
        return count;
 
 }
index fa09e558113761cac4fafd75e53c5a509bf342a5..dc0def210097eeae4311b2777b0776473d69cfc3 100644 (file)
@@ -464,7 +464,7 @@ TRACE_EVENT(i915_gem_ring_sync_to,
            TP_fast_assign(
                           __entry->dev = from->dev->primary->index;
                           __entry->sync_from = from->id;
-                          __entry->sync_to = to_req->ring->id;
+                          __entry->sync_to = to_req->engine->id;
                           __entry->seqno = i915_gem_request_get_seqno(req);
                           ),
 
@@ -486,13 +486,13 @@ TRACE_EVENT(i915_gem_ring_dispatch,
                             ),
 
            TP_fast_assign(
-                          struct intel_engine_cs *ring =
-                                               i915_gem_request_get_ring(req);
-                          __entry->dev = ring->dev->primary->index;
-                          __entry->ring = ring->id;
+                          struct intel_engine_cs *engine =
+                                               i915_gem_request_get_engine(req);
+                          __entry->dev = engine->dev->primary->index;
+                          __entry->ring = engine->id;
                           __entry->seqno = i915_gem_request_get_seqno(req);
                           __entry->flags = flags;
-                          i915_trace_irq_get(ring, req);
+                          i915_trace_irq_get(engine, req);
                           ),
 
            TP_printk("dev=%u, ring=%u, seqno=%u, flags=%x",
@@ -511,8 +511,8 @@ TRACE_EVENT(i915_gem_ring_flush,
                             ),
 
            TP_fast_assign(
-                          __entry->dev = req->ring->dev->primary->index;
-                          __entry->ring = req->ring->id;
+                          __entry->dev = req->engine->dev->primary->index;
+                          __entry->ring = req->engine->id;
                           __entry->invalidate = invalidate;
                           __entry->flush = flush;
                           ),
@@ -533,10 +533,10 @@ DECLARE_EVENT_CLASS(i915_gem_request,
                             ),
 
            TP_fast_assign(
-                          struct intel_engine_cs *ring =
-                                               i915_gem_request_get_ring(req);
-                          __entry->dev = ring->dev->primary->index;
-                          __entry->ring = ring->id;
+                          struct intel_engine_cs *engine =
+                                               i915_gem_request_get_engine(req);
+                          __entry->dev = engine->dev->primary->index;
+                          __entry->ring = engine->id;
                           __entry->seqno = i915_gem_request_get_seqno(req);
                           ),
 
@@ -550,8 +550,8 @@ DEFINE_EVENT(i915_gem_request, i915_gem_request_add,
 );
 
 TRACE_EVENT(i915_gem_request_notify,
-           TP_PROTO(struct intel_engine_cs *ring),
-           TP_ARGS(ring),
+           TP_PROTO(struct intel_engine_cs *engine),
+           TP_ARGS(engine),
 
            TP_STRUCT__entry(
                             __field(u32, dev)
@@ -560,9 +560,9 @@ TRACE_EVENT(i915_gem_request_notify,
                             ),
 
            TP_fast_assign(
-                          __entry->dev = ring->dev->primary->index;
-                          __entry->ring = ring->id;
-                          __entry->seqno = ring->get_seqno(ring, false);
+                          __entry->dev = engine->dev->primary->index;
+                          __entry->ring = engine->id;
+                          __entry->seqno = engine->get_seqno(engine);
                           ),
 
            TP_printk("dev=%u, ring=%u, seqno=%u",
@@ -597,13 +597,13 @@ TRACE_EVENT(i915_gem_request_wait_begin,
             * less desirable.
             */
            TP_fast_assign(
-                          struct intel_engine_cs *ring =
-                                               i915_gem_request_get_ring(req);
-                          __entry->dev = ring->dev->primary->index;
-                          __entry->ring = ring->id;
+                          struct intel_engine_cs *engine =
+                                               i915_gem_request_get_engine(req);
+                          __entry->dev = engine->dev->primary->index;
+                          __entry->ring = engine->id;
                           __entry->seqno = i915_gem_request_get_seqno(req);
                           __entry->blocking =
-                                    mutex_is_locked(&ring->dev->struct_mutex);
+                                    mutex_is_locked(&engine->dev->struct_mutex);
                           ),
 
            TP_printk("dev=%u, ring=%u, seqno=%u, blocking=%s",
@@ -777,9 +777,9 @@ DEFINE_EVENT(i915_context, i915_context_free,
  * called only if full ppgtt is enabled.
  */
 TRACE_EVENT(switch_mm,
-       TP_PROTO(struct intel_engine_cs *ring, struct intel_context *to),
+       TP_PROTO(struct intel_engine_cs *engine, struct intel_context *to),
 
-       TP_ARGS(ring, to),
+       TP_ARGS(engine, to),
 
        TP_STRUCT__entry(
                        __field(u32, ring)
@@ -789,10 +789,10 @@ TRACE_EVENT(switch_mm,
        ),
 
        TP_fast_assign(
-                       __entry->ring = ring->id;
+                       __entry->ring = engine->id;
                        __entry->to = to;
                        __entry->vm = to->ppgtt? &to->ppgtt->base : NULL;
-                       __entry->dev = ring->dev->primary->index;
+                       __entry->dev = engine->dev->primary->index;
        ),
 
        TP_printk("dev=%u, ring=%u, ctx=%p, ctx_vm=%p",
index dea7429be4d024239f49bc9fb905d5c9a8247de5..d02efb8cad4dccd7779e3d9897646cc0e7c5f049 100644 (file)
@@ -181,8 +181,8 @@ static int vgt_balloon_space(struct drm_mm *mm,
 int intel_vgt_balloon(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
-       struct i915_address_space *ggtt_vm = &dev_priv->gtt.base;
-       unsigned long ggtt_vm_end = ggtt_vm->start + ggtt_vm->total;
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
+       unsigned long ggtt_end = ggtt->base.start + ggtt->base.total;
 
        unsigned long mappable_base, mappable_size, mappable_end;
        unsigned long unmappable_base, unmappable_size, unmappable_end;
@@ -202,19 +202,19 @@ int intel_vgt_balloon(struct drm_device *dev)
        DRM_INFO("Unmappable graphic memory: base 0x%lx size %ldKiB\n",
                 unmappable_base, unmappable_size / 1024);
 
-       if (mappable_base < ggtt_vm->start ||
-           mappable_end > dev_priv->gtt.mappable_end ||
-           unmappable_base < dev_priv->gtt.mappable_end ||
-           unmappable_end > ggtt_vm_end) {
+       if (mappable_base < ggtt->base.start ||
+           mappable_end > ggtt->mappable_end ||
+           unmappable_base < ggtt->mappable_end ||
+           unmappable_end > ggtt_end) {
                DRM_ERROR("Invalid ballooning configuration!\n");
                return -EINVAL;
        }
 
        /* Unmappable graphic memory ballooning */
-       if (unmappable_base > dev_priv->gtt.mappable_end) {
-               ret = vgt_balloon_space(&ggtt_vm->mm,
+       if (unmappable_base > ggtt->mappable_end) {
+               ret = vgt_balloon_space(&ggtt->base.mm,
                                        &bl_info.space[2],
-                                       dev_priv->gtt.mappable_end,
+                                       ggtt->mappable_end,
                                        unmappable_base);
 
                if (ret)
@@ -225,30 +225,30 @@ int intel_vgt_balloon(struct drm_device *dev)
         * No need to partition out the last physical page,
         * because it is reserved to the guard page.
         */
-       if (unmappable_end < ggtt_vm_end - PAGE_SIZE) {
-               ret = vgt_balloon_space(&ggtt_vm->mm,
+       if (unmappable_end < ggtt_end - PAGE_SIZE) {
+               ret = vgt_balloon_space(&ggtt->base.mm,
                                        &bl_info.space[3],
                                        unmappable_end,
-                                       ggtt_vm_end - PAGE_SIZE);
+                                       ggtt_end - PAGE_SIZE);
                if (ret)
                        goto err;
        }
 
        /* Mappable graphic memory ballooning */
-       if (mappable_base > ggtt_vm->start) {
-               ret = vgt_balloon_space(&ggtt_vm->mm,
+       if (mappable_base > ggtt->base.start) {
+               ret = vgt_balloon_space(&ggtt->base.mm,
                                        &bl_info.space[0],
-                                       ggtt_vm->start, mappable_base);
+                                       ggtt->base.start, mappable_base);
 
                if (ret)
                        goto err;
        }
 
-       if (mappable_end < dev_priv->gtt.mappable_end) {
-               ret = vgt_balloon_space(&ggtt_vm->mm,
+       if (mappable_end < ggtt->mappable_end) {
+               ret = vgt_balloon_space(&ggtt->base.mm,
                                        &bl_info.space[1],
                                        mappable_end,
-                                       dev_priv->gtt.mappable_end);
+                                       ggtt->mappable_end);
 
                if (ret)
                        goto err;
index 8e579a8505ac37f14ee07b276c1e02d0bd80525f..50ff90aea72187cd9da6fb5437a6af08b11f63d6 100644 (file)
@@ -96,8 +96,11 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
        crtc_state->update_pipe = false;
        crtc_state->disable_lp_wm = false;
        crtc_state->disable_cxsr = false;
-       crtc_state->wm_changed = false;
+       crtc_state->update_wm_pre = false;
+       crtc_state->update_wm_post = false;
        crtc_state->fb_changed = false;
+       crtc_state->wm.need_postvbl_update = false;
+       crtc_state->fb_bits = 0;
 
        return &crtc_state->base;
 }
index e0b851a0004abd3dc2dde47e9b7af90e5a177510..7de7721f65bcee9f2d9df2736396809b078b965b 100644 (file)
@@ -195,12 +195,10 @@ static void intel_plane_atomic_update(struct drm_plane *plane,
        struct intel_plane_state *intel_state =
                to_intel_plane_state(plane->state);
        struct drm_crtc *crtc = plane->state->crtc ?: old_state->crtc;
-       struct drm_crtc_state *crtc_state =
-               drm_atomic_get_existing_crtc_state(old_state->state, crtc);
 
        if (intel_state->visible)
                intel_plane->update_plane(plane,
-                                         to_intel_crtc_state(crtc_state),
+                                         to_intel_crtc_state(crtc->state),
                                          intel_state);
        else
                intel_plane->disable_plane(plane, crtc);
index 7d281b40064a47f7e46071ef897c4720da38f9d8..02a7527ce7bb4e20d37699d7365b42e6d02b2d31 100644 (file)
@@ -372,7 +372,7 @@ static void ilk_audio_codec_disable(struct intel_encoder *encoder)
        if (WARN_ON(port == PORT_A))
                return;
 
-       if (HAS_PCH_IBX(dev_priv->dev)) {
+       if (HAS_PCH_IBX(dev_priv)) {
                aud_config = IBX_AUD_CFG(pipe);
                aud_cntrl_st2 = IBX_AUD_CNTL_ST2;
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
@@ -561,23 +561,21 @@ void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
 }
 
 /**
- * intel_init_audio - Set up chip specific audio functions
- * @dev: drm device
+ * intel_init_audio_hooks - Set up chip specific audio hooks
+ * @dev_priv: device private
  */
-void intel_init_audio(struct drm_device *dev)
+void intel_init_audio_hooks(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       if (IS_G4X(dev)) {
+       if (IS_G4X(dev_priv)) {
                dev_priv->display.audio_codec_enable = g4x_audio_codec_enable;
                dev_priv->display.audio_codec_disable = g4x_audio_codec_disable;
-       } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
                dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
-       } else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) {
+       } else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8) {
                dev_priv->display.audio_codec_enable = hsw_audio_codec_enable;
                dev_priv->display.audio_codec_disable = hsw_audio_codec_disable;
-       } else if (HAS_PCH_SPLIT(dev)) {
+       } else if (HAS_PCH_SPLIT(dev_priv)) {
                dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
                dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
        }
index bf62a19c8f690cd6682234765475436db961ffc4..e72dd9a8d6bf41e9f089eb76643fb5e7ff7a8922 100644 (file)
@@ -29,7 +29,9 @@
 #include <drm/drmP.h>
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
-#include "intel_bios.h"
+
+#define _INTEL_BIOS_PRIVATE
+#include "intel_vbt_defs.h"
 
 /**
  * DOC: Video BIOS Table (VBT)
@@ -56,8 +58,6 @@
 #define        SLAVE_ADDR1     0x70
 #define        SLAVE_ADDR2     0x72
 
-static int panel_type;
-
 /* Get BDB block size given a pointer to Block ID. */
 static u32 _get_blocksize(const u8 *block_base)
 {
@@ -203,17 +203,32 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
        const struct lvds_dvo_timing *panel_dvo_timing;
        const struct lvds_fp_timing *fp_timing;
        struct drm_display_mode *panel_fixed_mode;
+       int panel_type;
        int drrs_mode;
+       int ret;
 
        lvds_options = find_section(bdb, BDB_LVDS_OPTIONS);
        if (!lvds_options)
                return;
 
        dev_priv->vbt.lvds_dither = lvds_options->pixel_dither;
-       if (lvds_options->panel_type == 0xff)
-               return;
 
-       panel_type = lvds_options->panel_type;
+       ret = intel_opregion_get_panel_type(dev_priv->dev);
+       if (ret >= 0) {
+               WARN_ON(ret > 0xf);
+               panel_type = ret;
+               DRM_DEBUG_KMS("Panel type: %d (OpRegion)\n", panel_type);
+       } else {
+               if (lvds_options->panel_type > 0xf) {
+                       DRM_DEBUG_KMS("Invalid VBT panel type 0x%x\n",
+                                     lvds_options->panel_type);
+                       return;
+               }
+               panel_type = lvds_options->panel_type;
+               DRM_DEBUG_KMS("Panel type: %d (VBT)\n", panel_type);
+       }
+
+       dev_priv->vbt.panel_type = panel_type;
 
        drrs_mode = (lvds_options->dps_panel_type_bits
                                >> (panel_type * 2)) & MODE_MASK;
@@ -249,7 +264,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
 
        panel_dvo_timing = get_lvds_dvo_timing(lvds_lfp_data,
                                               lvds_lfp_data_ptrs,
-                                              lvds_options->panel_type);
+                                              panel_type);
 
        panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
        if (!panel_fixed_mode)
@@ -264,7 +279,7 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
 
        fp_timing = get_lvds_fp_timing(bdb, lvds_lfp_data,
                                       lvds_lfp_data_ptrs,
-                                      lvds_options->panel_type);
+                                      panel_type);
        if (fp_timing) {
                /* check the resolution, just to be sure */
                if (fp_timing->x_res == panel_fixed_mode->hdisplay &&
@@ -282,6 +297,7 @@ parse_lfp_backlight(struct drm_i915_private *dev_priv,
 {
        const struct bdb_lfp_backlight_data *backlight_data;
        const struct bdb_lfp_backlight_data_entry *entry;
+       int panel_type = dev_priv->vbt.panel_type;
 
        backlight_data = find_section(bdb, BDB_LVDS_BACKLIGHT);
        if (!backlight_data)
@@ -480,7 +496,7 @@ parse_sdvo_device_mapping(struct drm_i915_private *dev_priv,
                              child->slave_addr,
                              (child->dvo_port == DEVICE_PORT_DVOB) ?
                              "SDVOB" : "SDVOC");
-               p_mapping = &(dev_priv->sdvo_mappings[child->dvo_port - 1]);
+               p_mapping = &dev_priv->vbt.sdvo_mappings[child->dvo_port - 1];
                if (!p_mapping->initialized) {
                        p_mapping->dvo_port = child->dvo_port;
                        p_mapping->slave_addr = child->slave_addr;
@@ -525,10 +541,7 @@ parse_driver_features(struct drm_i915_private *dev_priv,
                return;
 
        if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP)
-               dev_priv->vbt.edp_support = 1;
-
-       if (driver->dual_frequency)
-               dev_priv->render_reclock_avail = true;
+               dev_priv->vbt.edp.support = 1;
 
        DRM_DEBUG_KMS("DRRS State Enabled:%d\n", driver->drrs_enabled);
        /*
@@ -547,23 +560,24 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
        const struct bdb_edp *edp;
        const struct edp_power_seq *edp_pps;
        const struct edp_link_params *edp_link_params;
+       int panel_type = dev_priv->vbt.panel_type;
 
        edp = find_section(bdb, BDB_EDP);
        if (!edp) {
-               if (dev_priv->vbt.edp_support)
+               if (dev_priv->vbt.edp.support)
                        DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n");
                return;
        }
 
        switch ((edp->color_depth >> (panel_type * 2)) & 3) {
        case EDP_18BPP:
-               dev_priv->vbt.edp_bpp = 18;
+               dev_priv->vbt.edp.bpp = 18;
                break;
        case EDP_24BPP:
-               dev_priv->vbt.edp_bpp = 24;
+               dev_priv->vbt.edp.bpp = 24;
                break;
        case EDP_30BPP:
-               dev_priv->vbt.edp_bpp = 30;
+               dev_priv->vbt.edp.bpp = 30;
                break;
        }
 
@@ -571,14 +585,14 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
        edp_pps = &edp->power_seqs[panel_type];
        edp_link_params = &edp->link_params[panel_type];
 
-       dev_priv->vbt.edp_pps = *edp_pps;
+       dev_priv->vbt.edp.pps = *edp_pps;
 
        switch (edp_link_params->rate) {
        case EDP_RATE_1_62:
-               dev_priv->vbt.edp_rate = DP_LINK_BW_1_62;
+               dev_priv->vbt.edp.rate = DP_LINK_BW_1_62;
                break;
        case EDP_RATE_2_7:
-               dev_priv->vbt.edp_rate = DP_LINK_BW_2_7;
+               dev_priv->vbt.edp.rate = DP_LINK_BW_2_7;
                break;
        default:
                DRM_DEBUG_KMS("VBT has unknown eDP link rate value %u\n",
@@ -588,13 +602,13 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
 
        switch (edp_link_params->lanes) {
        case EDP_LANE_1:
-               dev_priv->vbt.edp_lanes = 1;
+               dev_priv->vbt.edp.lanes = 1;
                break;
        case EDP_LANE_2:
-               dev_priv->vbt.edp_lanes = 2;
+               dev_priv->vbt.edp.lanes = 2;
                break;
        case EDP_LANE_4:
-               dev_priv->vbt.edp_lanes = 4;
+               dev_priv->vbt.edp.lanes = 4;
                break;
        default:
                DRM_DEBUG_KMS("VBT has unknown eDP lane count value %u\n",
@@ -604,16 +618,16 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
 
        switch (edp_link_params->preemphasis) {
        case EDP_PREEMPHASIS_NONE:
-               dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0;
+               dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_0;
                break;
        case EDP_PREEMPHASIS_3_5dB:
-               dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1;
+               dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_1;
                break;
        case EDP_PREEMPHASIS_6dB:
-               dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2;
+               dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_2;
                break;
        case EDP_PREEMPHASIS_9_5dB:
-               dev_priv->vbt.edp_preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3;
+               dev_priv->vbt.edp.preemphasis = DP_TRAIN_PRE_EMPH_LEVEL_3;
                break;
        default:
                DRM_DEBUG_KMS("VBT has unknown eDP pre-emphasis value %u\n",
@@ -623,16 +637,16 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
 
        switch (edp_link_params->vswing) {
        case EDP_VSWING_0_4V:
-               dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
+               dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_0;
                break;
        case EDP_VSWING_0_6V:
-               dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1;
+               dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_1;
                break;
        case EDP_VSWING_0_8V:
-               dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
+               dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
                break;
        case EDP_VSWING_1_2V:
-               dev_priv->vbt.edp_vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
+               dev_priv->vbt.edp.vswing = DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
                break;
        default:
                DRM_DEBUG_KMS("VBT has unknown eDP voltage swing value %u\n",
@@ -645,10 +659,10 @@ parse_edp(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
 
                /* Don't read from VBT if module parameter has valid value*/
                if (i915.edp_vswing) {
-                       dev_priv->edp_low_vswing = i915.edp_vswing == 1;
+                       dev_priv->vbt.edp.low_vswing = i915.edp_vswing == 1;
                } else {
                        vswing = (edp->edp_vswing_preemph >> (panel_type * 4)) & 0xF;
-                       dev_priv->edp_low_vswing = vswing == 0;
+                       dev_priv->vbt.edp.low_vswing = vswing == 0;
                }
        }
 }
@@ -658,6 +672,7 @@ parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb)
 {
        const struct bdb_psr *psr;
        const struct psr_table *psr_table;
+       int panel_type = dev_priv->vbt.panel_type;
 
        psr = find_section(bdb, BDB_PSR);
        if (!psr) {
@@ -704,9 +719,10 @@ parse_mipi_config(struct drm_i915_private *dev_priv,
        const struct bdb_mipi_config *start;
        const struct mipi_config *config;
        const struct mipi_pps_data *pps;
+       int panel_type = dev_priv->vbt.panel_type;
 
        /* parse MIPI blocks only if LFP type is MIPI */
-       if (!dev_priv->vbt.has_mipi)
+       if (!intel_bios_is_dsi_present(dev_priv, NULL))
                return;
 
        /* Initialize this to undefined indicating no generic MIPI support */
@@ -911,6 +927,7 @@ static void
 parse_mipi_sequence(struct drm_i915_private *dev_priv,
                    const struct bdb_header *bdb)
 {
+       int panel_type = dev_priv->vbt.panel_type;
        const struct bdb_mipi_sequence *sequence;
        const u8 *seq_data;
        u32 seq_size;
@@ -1124,7 +1141,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
        }
 
        /* Parse the I_boost config for SKL and above */
-       if (bdb->version >= 196 && (child->common.flags_1 & IBOOST_ENABLE)) {
+       if (bdb->version >= 196 && child->common.iboost) {
                info->dp_boost_level = translate_iboost(child->common.iboost_level & 0xF);
                DRM_DEBUG_KMS("VBT (e)DP boost level for port %c: %d\n",
                              port_name(port), info->dp_boost_level);
@@ -1232,14 +1249,6 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
                        continue;
                }
 
-               if (p_child->common.dvo_port >= DVO_PORT_MIPIA
-                   && p_child->common.dvo_port <= DVO_PORT_MIPID
-                   &&p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT) {
-                       DRM_DEBUG_KMS("Found MIPI as LFP\n");
-                       dev_priv->vbt.has_mipi = 1;
-                       dev_priv->vbt.dsi.port = p_child->common.dvo_port;
-               }
-
                child_dev_ptr = dev_priv->vbt.child_dev + count;
                count++;
 
@@ -1250,6 +1259,19 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
                 */
                memcpy(child_dev_ptr, p_child,
                       min_t(size_t, p_defs->child_dev_size, sizeof(*p_child)));
+
+               /*
+                * copied full block, now init values when they are not
+                * available in current version
+                */
+               if (bdb->version < 196) {
+                       /* Set default values for bits added from v196 */
+                       child_dev_ptr->common.iboost = 0;
+                       child_dev_ptr->common.hpd_invert = 0;
+               }
+
+               if (bdb->version < 192)
+                       child_dev_ptr->common.lspcon = 0;
        }
        return;
 }
@@ -1431,3 +1453,210 @@ intel_bios_init(struct drm_i915_private *dev_priv)
 
        return 0;
 }
+
+/**
+ * intel_bios_is_tv_present - is integrated TV present in VBT
+ * @dev_priv:  i915 device instance
+ *
+ * Return true if TV is present. If no child devices were parsed from VBT,
+ * assume TV is present.
+ */
+bool intel_bios_is_tv_present(struct drm_i915_private *dev_priv)
+{
+       union child_device_config *p_child;
+       int i;
+
+       if (!dev_priv->vbt.int_tv_support)
+               return false;
+
+       if (!dev_priv->vbt.child_dev_num)
+               return true;
+
+       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+               p_child = dev_priv->vbt.child_dev + i;
+               /*
+                * If the device type is not TV, continue.
+                */
+               switch (p_child->old.device_type) {
+               case DEVICE_TYPE_INT_TV:
+               case DEVICE_TYPE_TV:
+               case DEVICE_TYPE_TV_SVIDEO_COMPOSITE:
+                       break;
+               default:
+                       continue;
+               }
+               /* Only when the addin_offset is non-zero, it is regarded
+                * as present.
+                */
+               if (p_child->old.addin_offset)
+                       return true;
+       }
+
+       return false;
+}
+
+/**
+ * intel_bios_is_lvds_present - is LVDS present in VBT
+ * @dev_priv:  i915 device instance
+ * @i2c_pin:   i2c pin for LVDS if present
+ *
+ * Return true if LVDS is present. If no child devices were parsed from VBT,
+ * assume LVDS is present.
+ */
+bool intel_bios_is_lvds_present(struct drm_i915_private *dev_priv, u8 *i2c_pin)
+{
+       int i;
+
+       if (!dev_priv->vbt.child_dev_num)
+               return true;
+
+       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+               union child_device_config *uchild = dev_priv->vbt.child_dev + i;
+               struct old_child_dev_config *child = &uchild->old;
+
+               /* If the device type is not LFP, continue.
+                * We have to check both the new identifiers as well as the
+                * old for compatibility with some BIOSes.
+                */
+               if (child->device_type != DEVICE_TYPE_INT_LFP &&
+                   child->device_type != DEVICE_TYPE_LFP)
+                       continue;
+
+               if (intel_gmbus_is_valid_pin(dev_priv, child->i2c_pin))
+                       *i2c_pin = child->i2c_pin;
+
+               /* However, we cannot trust the BIOS writers to populate
+                * the VBT correctly.  Since LVDS requires additional
+                * information from AIM blocks, a non-zero addin offset is
+                * a good indicator that the LVDS is actually present.
+                */
+               if (child->addin_offset)
+                       return true;
+
+               /* But even then some BIOS writers perform some black magic
+                * and instantiate the device without reference to any
+                * additional data.  Trust that if the VBT was written into
+                * the OpRegion then they have validated the LVDS's existence.
+                */
+               if (dev_priv->opregion.vbt)
+                       return true;
+       }
+
+       return false;
+}
+
+/**
+ * intel_bios_is_port_edp - is the device in given port eDP
+ * @dev_priv:  i915 device instance
+ * @port:      port to check
+ *
+ * Return true if the device in %port is eDP.
+ */
+bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
+{
+       union child_device_config *p_child;
+       static const short port_mapping[] = {
+               [PORT_B] = DVO_PORT_DPB,
+               [PORT_C] = DVO_PORT_DPC,
+               [PORT_D] = DVO_PORT_DPD,
+               [PORT_E] = DVO_PORT_DPE,
+       };
+       int i;
+
+       if (!dev_priv->vbt.child_dev_num)
+               return false;
+
+       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+               p_child = dev_priv->vbt.child_dev + i;
+
+               if (p_child->common.dvo_port == port_mapping[port] &&
+                   (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
+                   (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
+                       return true;
+       }
+
+       return false;
+}
+
+/**
+ * intel_bios_is_dsi_present - is DSI present in VBT
+ * @dev_priv:  i915 device instance
+ * @port:      port for DSI if present
+ *
+ * Return true if DSI is present, and return the port in %port.
+ */
+bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv,
+                              enum port *port)
+{
+       union child_device_config *p_child;
+       u8 dvo_port;
+       int i;
+
+       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+               p_child = dev_priv->vbt.child_dev + i;
+
+               if (!(p_child->common.device_type & DEVICE_TYPE_MIPI_OUTPUT))
+                       continue;
+
+               dvo_port = p_child->common.dvo_port;
+
+               switch (dvo_port) {
+               case DVO_PORT_MIPIA:
+               case DVO_PORT_MIPIC:
+                       if (port)
+                               *port = dvo_port - DVO_PORT_MIPIA;
+                       return true;
+               case DVO_PORT_MIPIB:
+               case DVO_PORT_MIPID:
+                       DRM_DEBUG_KMS("VBT has unsupported DSI port %c\n",
+                                     port_name(dvo_port - DVO_PORT_MIPIA));
+                       break;
+               }
+       }
+
+       return false;
+}
+
+/**
+ * intel_bios_is_port_hpd_inverted - is HPD inverted for %port
+ * @dev_priv:  i915 device instance
+ * @port:      port to check
+ *
+ * Return true if HPD should be inverted for %port.
+ */
+bool
+intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
+                               enum port port)
+{
+       int i;
+
+       if (WARN_ON_ONCE(!IS_BROXTON(dev_priv)))
+               return false;
+
+       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+               if (!dev_priv->vbt.child_dev[i].common.hpd_invert)
+                       continue;
+
+               switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
+               case DVO_PORT_DPA:
+               case DVO_PORT_HDMIA:
+                       if (port == PORT_A)
+                               return true;
+                       break;
+               case DVO_PORT_DPB:
+               case DVO_PORT_HDMIB:
+                       if (port == PORT_B)
+                               return true;
+                       break;
+               case DVO_PORT_DPC:
+               case DVO_PORT_HDMIC:
+                       if (port == PORT_C)
+                               return true;
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       return false;
+}
index 350d4e0f75a4ea639ab2720734f0b03296188779..ab0ea315eddb1665a96b78fbde53d72e004c1773 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2006 Intel Corporation
+ * Copyright © 2016 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * 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:
- *    Eric Anholt <eric@anholt.net>
- *
- */
-
-#ifndef _INTEL_BIOS_H_
-#define _INTEL_BIOS_H_
-
-/**
- * struct vbt_header - VBT Header structure
- * @signature:         VBT signature, always starts with "$VBT"
- * @version:           Version of this structure
- * @header_size:       Size of this structure
- * @vbt_size:          Size of VBT (VBT Header, BDB Header and data blocks)
- * @vbt_checksum:      Checksum
- * @reserved0:         Reserved
- * @bdb_offset:                Offset of &struct bdb_header from beginning of VBT
- * @aim_offset:                Offsets of add-in data blocks from beginning of VBT
- */
-struct vbt_header {
-       u8 signature[20];
-       u16 version;
-       u16 header_size;
-       u16 vbt_size;
-       u8 vbt_checksum;
-       u8 reserved0;
-       u32 bdb_offset;
-       u32 aim_offset[4];
-} __packed;
-
-/**
- * struct bdb_header - BDB Header structure
- * @signature:         BDB signature "BIOS_DATA_BLOCK"
- * @version:           Version of the data block definitions
- * @header_size:       Size of this structure
- * @bdb_size:          Size of BDB (BDB Header and data blocks)
- */
-struct bdb_header {
-       u8 signature[16];
-       u16 version;
-       u16 header_size;
-       u16 bdb_size;
-} __packed;
-
-/* strictly speaking, this is a "skip" block, but it has interesting info */
-struct vbios_data {
-       u8 type; /* 0 == desktop, 1 == mobile */
-       u8 relstage;
-       u8 chipset;
-       u8 lvds_present:1;
-       u8 tv_present:1;
-       u8 rsvd2:6; /* finish byte */
-       u8 rsvd3[4];
-       u8 signon[155];
-       u8 copyright[61];
-       u16 code_segment;
-       u8 dos_boot_mode;
-       u8 bandwidth_percent;
-       u8 rsvd4; /* popup memory size */
-       u8 resize_pci_bios;
-       u8 rsvd5; /* is crt already on ddc2 */
-} __packed;
-
-/*
- * There are several types of BIOS data blocks (BDBs), each block has
- * an ID and size in the first 3 bytes (ID in first, size in next 2).
- * Known types are listed below.
  */
-#define BDB_GENERAL_FEATURES     1
-#define BDB_GENERAL_DEFINITIONS          2
-#define BDB_OLD_TOGGLE_LIST      3
-#define BDB_MODE_SUPPORT_LIST    4
-#define BDB_GENERIC_MODE_TABLE   5
-#define BDB_EXT_MMIO_REGS        6
-#define BDB_SWF_IO               7
-#define BDB_SWF_MMIO             8
-#define BDB_PSR                          9
-#define BDB_MODE_REMOVAL_TABLE  10
-#define BDB_CHILD_DEVICE_TABLE  11
-#define BDB_DRIVER_FEATURES     12
-#define BDB_DRIVER_PERSISTENCE  13
-#define BDB_EXT_TABLE_PTRS      14
-#define BDB_DOT_CLOCK_OVERRIDE  15
-#define BDB_DISPLAY_SELECT      16
-/* 17 rsvd */
-#define BDB_DRIVER_ROTATION     18
-#define BDB_DISPLAY_REMOVE      19
-#define BDB_OEM_CUSTOM          20
-#define BDB_EFP_LIST            21 /* workarounds for VGA hsync/vsync */
-#define BDB_SDVO_LVDS_OPTIONS   22
-#define BDB_SDVO_PANEL_DTDS     23
-#define BDB_SDVO_LVDS_PNP_IDS   24
-#define BDB_SDVO_LVDS_POWER_SEQ         25
-#define BDB_TV_OPTIONS          26
-#define BDB_EDP                         27
-#define BDB_LVDS_OPTIONS        40
-#define BDB_LVDS_LFP_DATA_PTRS  41
-#define BDB_LVDS_LFP_DATA       42
-#define BDB_LVDS_BACKLIGHT      43
-#define BDB_LVDS_POWER          44
-#define BDB_MIPI_CONFIG                 52
-#define BDB_MIPI_SEQUENCE       53
-#define BDB_SKIP               254 /* VBIOS private block, ignore */
-
-struct bdb_general_features {
-        /* bits 1 */
-       u8 panel_fitting:2;
-       u8 flexaim:1;
-       u8 msg_enable:1;
-       u8 clear_screen:3;
-       u8 color_flip:1;
-
-        /* bits 2 */
-       u8 download_ext_vbt:1;
-       u8 enable_ssc:1;
-       u8 ssc_freq:1;
-       u8 enable_lfp_on_override:1;
-       u8 disable_ssc_ddt:1;
-       u8 rsvd7:1;
-       u8 display_clock_mode:1;
-       u8 rsvd8:1; /* finish byte */
-
-        /* bits 3 */
-       u8 disable_smooth_vision:1;
-       u8 single_dvi:1;
-       u8 rsvd9:1;
-       u8 fdi_rx_polarity_inverted:1;
-       u8 rsvd10:4; /* finish byte */
-
-        /* bits 4 */
-       u8 legacy_monitor_detect;
-
-        /* bits 5 */
-       u8 int_crt_support:1;
-       u8 int_tv_support:1;
-       u8 int_efp_support:1;
-       u8 dp_ssc_enb:1;        /* PCH attached eDP supports SSC */
-       u8 dp_ssc_freq:1;       /* SSC freq for PCH attached eDP */
-       u8 rsvd11:3; /* finish byte */
-} __packed;
-
-/* pre-915 */
-#define GPIO_PIN_DVI_LVDS      0x03 /* "DVI/LVDS DDC GPIO pins" */
-#define GPIO_PIN_ADD_I2C       0x05 /* "ADDCARD I2C GPIO pins" */
-#define GPIO_PIN_ADD_DDC       0x04 /* "ADDCARD DDC GPIO pins" */
-#define GPIO_PIN_ADD_DDC_I2C   0x06 /* "ADDCARD DDC/I2C GPIO pins" */
-
-/* Pre 915 */
-#define DEVICE_TYPE_NONE       0x00
-#define DEVICE_TYPE_CRT                0x01
-#define DEVICE_TYPE_TV         0x09
-#define DEVICE_TYPE_EFP                0x12
-#define DEVICE_TYPE_LFP                0x22
-/* On 915+ */
-#define DEVICE_TYPE_CRT_DPMS           0x6001
-#define DEVICE_TYPE_CRT_DPMS_HOTPLUG   0x4001
-#define DEVICE_TYPE_TV_COMPOSITE       0x0209
-#define DEVICE_TYPE_TV_MACROVISION     0x0289
-#define DEVICE_TYPE_TV_RF_COMPOSITE    0x020c
-#define DEVICE_TYPE_TV_SVIDEO_COMPOSITE        0x0609
-#define DEVICE_TYPE_TV_SCART           0x0209
-#define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009
-#define DEVICE_TYPE_EFP_HOTPLUG_PWR    0x6012
-#define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR        0x6052
-#define DEVICE_TYPE_EFP_DVI_I          0x6053
-#define DEVICE_TYPE_EFP_DVI_D_DUAL     0x6152
-#define DEVICE_TYPE_EFP_DVI_D_HDCP     0x60d2
-#define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR        0x6062
-#define DEVICE_TYPE_OPENLDI_DUALPIX    0x6162
-#define DEVICE_TYPE_LFP_PANELLINK      0x5012
-#define DEVICE_TYPE_LFP_CMOS_PWR       0x5042
-#define DEVICE_TYPE_LFP_LVDS_PWR       0x5062
-#define DEVICE_TYPE_LFP_LVDS_DUAL      0x5162
-#define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2
-
-#define DEVICE_CFG_NONE                0x00
-#define DEVICE_CFG_12BIT_DVOB  0x01
-#define DEVICE_CFG_12BIT_DVOC  0x02
-#define DEVICE_CFG_24BIT_DVOBC 0x09
-#define DEVICE_CFG_24BIT_DVOCB 0x0a
-#define DEVICE_CFG_DUAL_DVOB   0x11
-#define DEVICE_CFG_DUAL_DVOC   0x12
-#define DEVICE_CFG_DUAL_DVOBC  0x13
-#define DEVICE_CFG_DUAL_LINK_DVOBC     0x19
-#define DEVICE_CFG_DUAL_LINK_DVOCB     0x1a
-
-#define DEVICE_WIRE_NONE       0x00
-#define DEVICE_WIRE_DVOB       0x01
-#define DEVICE_WIRE_DVOC       0x02
-#define DEVICE_WIRE_DVOBC      0x03
-#define DEVICE_WIRE_DVOBB      0x05
-#define DEVICE_WIRE_DVOCC      0x06
-#define DEVICE_WIRE_DVOB_MASTER 0x0d
-#define DEVICE_WIRE_DVOC_MASTER 0x0e
-
-#define DEVICE_PORT_DVOA       0x00 /* none on 845+ */
-#define DEVICE_PORT_DVOB       0x01
-#define DEVICE_PORT_DVOC       0x02
 
 /*
- * We used to keep this struct but without any version control. We should avoid
- * using it in the future, but it should be safe to keep using it in the old
- * code. Do not change; we rely on its size.
+ * Please use intel_vbt_defs.h for VBT private data, to hide and abstract away
+ * the VBT from the rest of the driver. Add the parsed, clean data to struct
+ * intel_vbt_data within struct drm_i915_private.
  */
-struct old_child_dev_config {
-       u16 handle;
-       u16 device_type;
-       u8  device_id[10]; /* ascii string */
-       u16 addin_offset;
-       u8  dvo_port; /* See Device_PORT_* above */
-       u8  i2c_pin;
-       u8  slave_addr;
-       u8  ddc_pin;
-       u16 edid_ptr;
-       u8  dvo_cfg; /* See DEVICE_CFG_* above */
-       u8  dvo2_port;
-       u8  i2c2_pin;
-       u8  slave2_addr;
-       u8  ddc2_pin;
-       u8  capabilities;
-       u8  dvo_wiring;/* See DEVICE_WIRE_* above */
-       u8  dvo2_wiring;
-       u16 extended_type;
-       u8  dvo_function;
-} __packed;
-
-/* This one contains field offsets that are known to be common for all BDB
- * versions. Notice that the meaning of the contents contents may still change,
- * but at least the offsets are consistent. */
-
-/* Definitions for flags_1 */
-#define IBOOST_ENABLE (1<<3)
-
-struct common_child_dev_config {
-       u16 handle;
-       u16 device_type;
-       u8 not_common1[12];
-       u8 dvo_port;
-       u8 not_common2[2];
-       u8 ddc_pin;
-       u16 edid_ptr;
-       u8 obsolete;
-       u8 flags_1;
-       u8 not_common3[13];
-       u8 iboost_level;
-} __packed;
-
-
-/* This field changes depending on the BDB version, so the most reliable way to
- * read it is by checking the BDB version and reading the raw pointer. */
-union child_device_config {
-       /* This one is safe to be used anywhere, but the code should still check
-        * the BDB version. */
-       u8 raw[33];
-       /* This one should only be kept for legacy code. */
-       struct old_child_dev_config old;
-       /* This one should also be safe to use anywhere, even without version
-        * checks. */
-       struct common_child_dev_config common;
-} __packed;
-
-struct bdb_general_definitions {
-       /* DDC GPIO */
-       u8 crt_ddc_gmbus_pin;
-
-       /* DPMS bits */
-       u8 dpms_acpi:1;
-       u8 skip_boot_crt_detect:1;
-       u8 dpms_aim:1;
-       u8 rsvd1:5; /* finish byte */
-
-       /* boot device bits */
-       u8 boot_display[2];
-       u8 child_dev_size;
-
-       /*
-        * Device info:
-        * If TV is present, it'll be at devices[0].
-        * LVDS will be next, either devices[0] or [1], if present.
-        * On some platforms the number of device is 6. But could be as few as
-        * 4 if both TV and LVDS are missing.
-        * And the device num is related with the size of general definition
-        * block. It is obtained by using the following formula:
-        * number = (block_size - sizeof(bdb_general_definitions))/
-        *           defs->child_dev_size;
-        */
-       uint8_t devices[0];
-} __packed;
-
-/* Mask for DRRS / Panel Channel / SSC / BLT control bits extraction */
-#define MODE_MASK              0x3
-
-struct bdb_lvds_options {
-       u8 panel_type;
-       u8 rsvd1;
-       /* LVDS capabilities, stored in a dword */
-       u8 pfit_mode:2;
-       u8 pfit_text_mode_enhanced:1;
-       u8 pfit_gfx_mode_enhanced:1;
-       u8 pfit_ratio_auto:1;
-       u8 pixel_dither:1;
-       u8 lvds_edid:1;
-       u8 rsvd2:1;
-       u8 rsvd4;
-       /* LVDS Panel channel bits stored here */
-       u32 lvds_panel_channel_bits;
-       /* LVDS SSC (Spread Spectrum Clock) bits stored here. */
-       u16 ssc_bits;
-       u16 ssc_freq;
-       u16 ssc_ddt;
-       /* Panel color depth defined here */
-       u16 panel_color_depth;
-       /* LVDS panel type bits stored here */
-       u32 dps_panel_type_bits;
-       /* LVDS backlight control type bits stored here */
-       u32 blt_control_type_bits;
-} __packed;
-
-/* LFP pointer table contains entries to the struct below */
-struct bdb_lvds_lfp_data_ptr {
-       u16 fp_timing_offset; /* offsets are from start of bdb */
-       u8 fp_table_size;
-       u16 dvo_timing_offset;
-       u8 dvo_table_size;
-       u16 panel_pnp_id_offset;
-       u8 pnp_table_size;
-} __packed;
-
-struct bdb_lvds_lfp_data_ptrs {
-       u8 lvds_entries; /* followed by one or more lvds_data_ptr structs */
-       struct bdb_lvds_lfp_data_ptr ptr[16];
-} __packed;
-
-/* LFP data has 3 blocks per entry */
-struct lvds_fp_timing {
-       u16 x_res;
-       u16 y_res;
-       u32 lvds_reg;
-       u32 lvds_reg_val;
-       u32 pp_on_reg;
-       u32 pp_on_reg_val;
-       u32 pp_off_reg;
-       u32 pp_off_reg_val;
-       u32 pp_cycle_reg;
-       u32 pp_cycle_reg_val;
-       u32 pfit_reg;
-       u32 pfit_reg_val;
-       u16 terminator;
-} __packed;
-
-struct lvds_dvo_timing {
-       u16 clock;              /**< In 10khz */
-       u8 hactive_lo;
-       u8 hblank_lo;
-       u8 hblank_hi:4;
-       u8 hactive_hi:4;
-       u8 vactive_lo;
-       u8 vblank_lo;
-       u8 vblank_hi:4;
-       u8 vactive_hi:4;
-       u8 hsync_off_lo;
-       u8 hsync_pulse_width;
-       u8 vsync_pulse_width:4;
-       u8 vsync_off:4;
-       u8 rsvd0:6;
-       u8 hsync_off_hi:2;
-       u8 h_image;
-       u8 v_image;
-       u8 max_hv;
-       u8 h_border;
-       u8 v_border;
-       u8 rsvd1:3;
-       u8 digital:2;
-       u8 vsync_positive:1;
-       u8 hsync_positive:1;
-       u8 rsvd2:1;
-} __packed;
-
-struct lvds_pnp_id {
-       u16 mfg_name;
-       u16 product_code;
-       u32 serial;
-       u8 mfg_week;
-       u8 mfg_year;
-} __packed;
-
-struct bdb_lvds_lfp_data_entry {
-       struct lvds_fp_timing fp_timing;
-       struct lvds_dvo_timing dvo_timing;
-       struct lvds_pnp_id pnp_id;
-} __packed;
-
-struct bdb_lvds_lfp_data {
-       struct bdb_lvds_lfp_data_entry data[16];
-} __packed;
-
-#define BDB_BACKLIGHT_TYPE_NONE        0
-#define BDB_BACKLIGHT_TYPE_PWM 2
-
-struct bdb_lfp_backlight_data_entry {
-       u8 type:2;
-       u8 active_low_pwm:1;
-       u8 obsolete1:5;
-       u16 pwm_freq_hz;
-       u8 min_brightness;
-       u8 obsolete2;
-       u8 obsolete3;
-} __packed;
-
-struct bdb_lfp_backlight_data {
-       u8 entry_size;
-       struct bdb_lfp_backlight_data_entry data[16];
-       u8 level[16];
-} __packed;
-
-struct aimdb_header {
-       char signature[16];
-       char oem_device[20];
-       u16 aimdb_version;
-       u16 aimdb_header_size;
-       u16 aimdb_size;
-} __packed;
-
-struct aimdb_block {
-       u8 aimdb_id;
-       u16 aimdb_size;
-} __packed;
 
-struct vch_panel_data {
-       u16 fp_timing_offset;
-       u8 fp_timing_size;
-       u16 dvo_timing_offset;
-       u8 dvo_timing_size;
-       u16 text_fitting_offset;
-       u8 text_fitting_size;
-       u16 graphics_fitting_offset;
-       u8 graphics_fitting_size;
-} __packed;
-
-struct vch_bdb_22 {
-       struct aimdb_block aimdb_block;
-       struct vch_panel_data panels[16];
-} __packed;
-
-struct bdb_sdvo_lvds_options {
-       u8 panel_backlight;
-       u8 h40_set_panel_type;
-       u8 panel_type;
-       u8 ssc_clk_freq;
-       u16 als_low_trip;
-       u16 als_high_trip;
-       u8 sclalarcoeff_tab_row_num;
-       u8 sclalarcoeff_tab_row_size;
-       u8 coefficient[8];
-       u8 panel_misc_bits_1;
-       u8 panel_misc_bits_2;
-       u8 panel_misc_bits_3;
-       u8 panel_misc_bits_4;
-} __packed;
-
-
-#define BDB_DRIVER_FEATURE_NO_LVDS             0
-#define BDB_DRIVER_FEATURE_INT_LVDS            1
-#define BDB_DRIVER_FEATURE_SDVO_LVDS           2
-#define BDB_DRIVER_FEATURE_EDP                 3
-
-struct bdb_driver_features {
-       u8 boot_dev_algorithm:1;
-       u8 block_display_switch:1;
-       u8 allow_display_switch:1;
-       u8 hotplug_dvo:1;
-       u8 dual_view_zoom:1;
-       u8 int15h_hook:1;
-       u8 sprite_in_clone:1;
-       u8 primary_lfp_id:1;
-
-       u16 boot_mode_x;
-       u16 boot_mode_y;
-       u8 boot_mode_bpp;
-       u8 boot_mode_refresh;
-
-       u16 enable_lfp_primary:1;
-       u16 selective_mode_pruning:1;
-       u16 dual_frequency:1;
-       u16 render_clock_freq:1; /* 0: high freq; 1: low freq */
-       u16 nt_clone_support:1;
-       u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
-       u16 sprite_display_assign:1; /* 0: secondary; 1: primary */
-       u16 cui_aspect_scaling:1;
-       u16 preserve_aspect_ratio:1;
-       u16 sdvo_device_power_down:1;
-       u16 crt_hotplug:1;
-       u16 lvds_config:2;
-       u16 tv_hotplug:1;
-       u16 hdmi_config:2;
-
-       u8 static_display:1;
-       u8 reserved2:7;
-       u16 legacy_crt_max_x;
-       u16 legacy_crt_max_y;
-       u8 legacy_crt_max_refresh;
-
-       u8 hdmi_termination;
-       u8 custom_vbt_version;
-       /* Driver features data block */
-       u16 rmpm_enabled:1;
-       u16 s2ddt_enabled:1;
-       u16 dpst_enabled:1;
-       u16 bltclt_enabled:1;
-       u16 adb_enabled:1;
-       u16 drrs_enabled:1;
-       u16 grs_enabled:1;
-       u16 gpmt_enabled:1;
-       u16 tbt_enabled:1;
-       u16 psr_enabled:1;
-       u16 ips_enabled:1;
-       u16 reserved3:4;
-       u16 pc_feature_valid:1;
-} __packed;
-
-#define EDP_18BPP      0
-#define EDP_24BPP      1
-#define EDP_30BPP      2
-#define EDP_RATE_1_62  0
-#define EDP_RATE_2_7   1
-#define EDP_LANE_1     0
-#define EDP_LANE_2     1
-#define EDP_LANE_4     3
-#define EDP_PREEMPHASIS_NONE   0
-#define EDP_PREEMPHASIS_3_5dB  1
-#define EDP_PREEMPHASIS_6dB    2
-#define EDP_PREEMPHASIS_9_5dB  3
-#define EDP_VSWING_0_4V                0
-#define EDP_VSWING_0_6V                1
-#define EDP_VSWING_0_8V                2
-#define EDP_VSWING_1_2V                3
+#ifndef _INTEL_BIOS_H_
+#define _INTEL_BIOS_H_
 
 struct edp_power_seq {
        u16 t1_t3;
@@ -565,245 +38,37 @@ struct edp_power_seq {
        u16 t11_t12;
 } __packed;
 
-struct edp_link_params {
-       u8 rate:4;
-       u8 lanes:4;
-       u8 preemphasis:4;
-       u8 vswing:4;
-} __packed;
-
-struct bdb_edp {
-       struct edp_power_seq power_seqs[16];
-       u32 color_depth;
-       struct edp_link_params link_params[16];
-       u32 sdrrs_msa_timing_delay;
-
-       /* ith bit indicates enabled/disabled for (i+1)th panel */
-       u16 edp_s3d_feature;
-       u16 edp_t3_optimization;
-       u64 edp_vswing_preemph;         /* v173 */
-} __packed;
-
-struct psr_table {
-       /* Feature bits */
-       u8 full_link:1;
-       u8 require_aux_to_wakeup:1;
-       u8 feature_bits_rsvd:6;
-
-       /* Wait times */
-       u8 idle_frames:4;
-       u8 lines_to_wait:3;
-       u8 wait_times_rsvd:1;
-
-       /* TP wake up time in multiple of 100 */
-       u16 tp1_wakeup_time;
-       u16 tp2_tp3_wakeup_time;
-} __packed;
-
-struct bdb_psr {
-       struct psr_table psr_table[16];
-} __packed;
-
-/*
- * Driver<->VBIOS interaction occurs through scratch bits in
- * GR18 & SWF*.
- */
-
-/* GR18 bits are set on display switch and hotkey events */
-#define GR18_DRIVER_SWITCH_EN  (1<<7) /* 0: VBIOS control, 1: driver control */
-#define GR18_HOTKEY_MASK       0x78 /* See also SWF4 15:0 */
-#define   GR18_HK_NONE         (0x0<<3)
-#define   GR18_HK_LFP_STRETCH  (0x1<<3)
-#define   GR18_HK_TOGGLE_DISP  (0x2<<3)
-#define   GR18_HK_DISP_SWITCH  (0x4<<3) /* see SWF14 15:0 for what to enable */
-#define   GR18_HK_POPUP_DISABLED (0x6<<3)
-#define   GR18_HK_POPUP_ENABLED        (0x7<<3)
-#define   GR18_HK_PFIT         (0x8<<3)
-#define   GR18_HK_APM_CHANGE   (0xa<<3)
-#define   GR18_HK_MULTIPLE     (0xc<<3)
-#define GR18_USER_INT_EN       (1<<2)
-#define GR18_A0000_FLUSH_EN    (1<<1)
-#define GR18_SMM_EN            (1<<0)
-
-/* Set by driver, cleared by VBIOS */
-#define SWF00_YRES_SHIFT       16
-#define SWF00_XRES_SHIFT       0
-#define SWF00_RES_MASK         0xffff
-
-/* Set by VBIOS at boot time and driver at runtime */
-#define SWF01_TV2_FORMAT_SHIFT 8
-#define SWF01_TV1_FORMAT_SHIFT 0
-#define SWF01_TV_FORMAT_MASK   0xffff
-
-#define SWF10_VBIOS_BLC_I2C_EN (1<<29)
-#define SWF10_GTT_OVERRIDE_EN  (1<<28)
-#define SWF10_LFP_DPMS_OVR     (1<<27) /* override DPMS on display switch */
-#define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24)
-#define   SWF10_OLD_TOGGLE     0x0
-#define   SWF10_TOGGLE_LIST_1  0x1
-#define   SWF10_TOGGLE_LIST_2  0x2
-#define   SWF10_TOGGLE_LIST_3  0x3
-#define   SWF10_TOGGLE_LIST_4  0x4
-#define SWF10_PANNING_EN       (1<<23)
-#define SWF10_DRIVER_LOADED    (1<<22)
-#define SWF10_EXTENDED_DESKTOP (1<<21)
-#define SWF10_EXCLUSIVE_MODE   (1<<20)
-#define SWF10_OVERLAY_EN       (1<<19)
-#define SWF10_PLANEB_HOLDOFF   (1<<18)
-#define SWF10_PLANEA_HOLDOFF   (1<<17)
-#define SWF10_VGA_HOLDOFF      (1<<16)
-#define SWF10_ACTIVE_DISP_MASK 0xffff
-#define   SWF10_PIPEB_LFP2     (1<<15)
-#define   SWF10_PIPEB_EFP2     (1<<14)
-#define   SWF10_PIPEB_TV2      (1<<13)
-#define   SWF10_PIPEB_CRT2     (1<<12)
-#define   SWF10_PIPEB_LFP      (1<<11)
-#define   SWF10_PIPEB_EFP      (1<<10)
-#define   SWF10_PIPEB_TV       (1<<9)
-#define   SWF10_PIPEB_CRT      (1<<8)
-#define   SWF10_PIPEA_LFP2     (1<<7)
-#define   SWF10_PIPEA_EFP2     (1<<6)
-#define   SWF10_PIPEA_TV2      (1<<5)
-#define   SWF10_PIPEA_CRT2     (1<<4)
-#define   SWF10_PIPEA_LFP      (1<<3)
-#define   SWF10_PIPEA_EFP      (1<<2)
-#define   SWF10_PIPEA_TV       (1<<1)
-#define   SWF10_PIPEA_CRT      (1<<0)
-
-#define SWF11_MEMORY_SIZE_SHIFT        16
-#define SWF11_SV_TEST_EN       (1<<15)
-#define SWF11_IS_AGP           (1<<14)
-#define SWF11_DISPLAY_HOLDOFF  (1<<13)
-#define SWF11_DPMS_REDUCED     (1<<12)
-#define SWF11_IS_VBE_MODE      (1<<11)
-#define SWF11_PIPEB_ACCESS     (1<<10) /* 0 here means pipe a */
-#define SWF11_DPMS_MASK                0x07
-#define   SWF11_DPMS_OFF       (1<<2)
-#define   SWF11_DPMS_SUSPEND   (1<<1)
-#define   SWF11_DPMS_STANDBY   (1<<0)
-#define   SWF11_DPMS_ON                0
-
-#define SWF14_GFX_PFIT_EN      (1<<31)
-#define SWF14_TEXT_PFIT_EN     (1<<30)
-#define SWF14_LID_STATUS_CLOSED        (1<<29) /* 0 here means open */
-#define SWF14_POPUP_EN         (1<<28)
-#define SWF14_DISPLAY_HOLDOFF  (1<<27)
-#define SWF14_DISP_DETECT_EN   (1<<26)
-#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */
-#define SWF14_DRIVER_STATUS    (1<<24)
-#define SWF14_OS_TYPE_WIN9X    (1<<23)
-#define SWF14_OS_TYPE_WINNT    (1<<22)
-/* 21:19 rsvd */
-#define SWF14_PM_TYPE_MASK     0x00070000
-#define   SWF14_PM_ACPI_VIDEO  (0x4 << 16)
-#define   SWF14_PM_ACPI                (0x3 << 16)
-#define   SWF14_PM_APM_12      (0x2 << 16)
-#define   SWF14_PM_APM_11      (0x1 << 16)
-#define SWF14_HK_REQUEST_MASK  0x0000ffff /* see GR18 6:3 for event type */
-          /* if GR18 indicates a display switch */
-#define   SWF14_DS_PIPEB_LFP2_EN (1<<15)
-#define   SWF14_DS_PIPEB_EFP2_EN (1<<14)
-#define   SWF14_DS_PIPEB_TV2_EN  (1<<13)
-#define   SWF14_DS_PIPEB_CRT2_EN (1<<12)
-#define   SWF14_DS_PIPEB_LFP_EN  (1<<11)
-#define   SWF14_DS_PIPEB_EFP_EN  (1<<10)
-#define   SWF14_DS_PIPEB_TV_EN   (1<<9)
-#define   SWF14_DS_PIPEB_CRT_EN  (1<<8)
-#define   SWF14_DS_PIPEA_LFP2_EN (1<<7)
-#define   SWF14_DS_PIPEA_EFP2_EN (1<<6)
-#define   SWF14_DS_PIPEA_TV2_EN  (1<<5)
-#define   SWF14_DS_PIPEA_CRT2_EN (1<<4)
-#define   SWF14_DS_PIPEA_LFP_EN  (1<<3)
-#define   SWF14_DS_PIPEA_EFP_EN  (1<<2)
-#define   SWF14_DS_PIPEA_TV_EN   (1<<1)
-#define   SWF14_DS_PIPEA_CRT_EN  (1<<0)
-          /* if GR18 indicates a panel fitting request */
-#define   SWF14_PFIT_EN                (1<<0) /* 0 means disable */
-          /* if GR18 indicates an APM change request */
-#define   SWF14_APM_HIBERNATE  0x4
-#define   SWF14_APM_SUSPEND    0x3
-#define   SWF14_APM_STANDBY    0x1
-#define   SWF14_APM_RESTORE    0x0
-
-/* Add the device class for LFP, TV, HDMI */
-#define         DEVICE_TYPE_INT_LFP    0x1022
-#define         DEVICE_TYPE_INT_TV     0x1009
-#define         DEVICE_TYPE_HDMI       0x60D2
-#define         DEVICE_TYPE_DP         0x68C6
-#define         DEVICE_TYPE_eDP        0x78C6
-
-#define  DEVICE_TYPE_CLASS_EXTENSION   (1 << 15)
-#define  DEVICE_TYPE_POWER_MANAGEMENT  (1 << 14)
-#define  DEVICE_TYPE_HOTPLUG_SIGNALING (1 << 13)
-#define  DEVICE_TYPE_INTERNAL_CONNECTOR        (1 << 12)
-#define  DEVICE_TYPE_NOT_HDMI_OUTPUT   (1 << 11)
-#define  DEVICE_TYPE_MIPI_OUTPUT       (1 << 10)
-#define  DEVICE_TYPE_COMPOSITE_OUTPUT  (1 << 9)
-#define  DEVICE_TYPE_DUAL_CHANNEL      (1 << 8)
-#define  DEVICE_TYPE_HIGH_SPEED_LINK   (1 << 6)
-#define  DEVICE_TYPE_LVDS_SINGALING    (1 << 5)
-#define  DEVICE_TYPE_TMDS_DVI_SIGNALING        (1 << 4)
-#define  DEVICE_TYPE_VIDEO_SIGNALING   (1 << 3)
-#define  DEVICE_TYPE_DISPLAYPORT_OUTPUT        (1 << 2)
-#define  DEVICE_TYPE_DIGITAL_OUTPUT    (1 << 1)
-#define  DEVICE_TYPE_ANALOG_OUTPUT     (1 << 0)
-
-/*
- * Bits we care about when checking for DEVICE_TYPE_eDP
- * Depending on the system, the other bits may or may not
- * be set for eDP outputs.
- */
-#define DEVICE_TYPE_eDP_BITS \
-       (DEVICE_TYPE_INTERNAL_CONNECTOR | \
-        DEVICE_TYPE_MIPI_OUTPUT | \
-        DEVICE_TYPE_COMPOSITE_OUTPUT | \
-        DEVICE_TYPE_DUAL_CHANNEL | \
-        DEVICE_TYPE_LVDS_SINGALING | \
-        DEVICE_TYPE_TMDS_DVI_SIGNALING | \
-        DEVICE_TYPE_VIDEO_SIGNALING | \
-        DEVICE_TYPE_DISPLAYPORT_OUTPUT | \
-        DEVICE_TYPE_ANALOG_OUTPUT)
-
-/* define the DVO port for HDMI output type */
-#define                DVO_B           1
-#define                DVO_C           2
-#define                DVO_D           3
-
-/* Possible values for the "DVO Port" field for versions >= 155: */
-#define DVO_PORT_HDMIA 0
-#define DVO_PORT_HDMIB 1
-#define DVO_PORT_HDMIC 2
-#define DVO_PORT_HDMID 3
-#define DVO_PORT_LVDS  4
-#define DVO_PORT_TV    5
-#define DVO_PORT_CRT   6
-#define DVO_PORT_DPB   7
-#define DVO_PORT_DPC   8
-#define DVO_PORT_DPD   9
-#define DVO_PORT_DPA   10
-#define DVO_PORT_DPE   11
-#define DVO_PORT_HDMIE 12
-#define DVO_PORT_MIPIA 21
-#define DVO_PORT_MIPIB 22
-#define DVO_PORT_MIPIC 23
-#define DVO_PORT_MIPID 24
+/* MIPI Sequence Block definitions */
+enum mipi_seq {
+       MIPI_SEQ_END = 0,
+       MIPI_SEQ_ASSERT_RESET,
+       MIPI_SEQ_INIT_OTP,
+       MIPI_SEQ_DISPLAY_ON,
+       MIPI_SEQ_DISPLAY_OFF,
+       MIPI_SEQ_DEASSERT_RESET,
+       MIPI_SEQ_BACKLIGHT_ON,          /* sequence block v2+ */
+       MIPI_SEQ_BACKLIGHT_OFF,         /* sequence block v2+ */
+       MIPI_SEQ_TEAR_ON,               /* sequence block v2+ */
+       MIPI_SEQ_TEAR_OFF,              /* sequence block v3+ */
+       MIPI_SEQ_POWER_ON,              /* sequence block v3+ */
+       MIPI_SEQ_POWER_OFF,             /* sequence block v3+ */
+       MIPI_SEQ_MAX
+};
 
-/* Block 52 contains MIPI Panel info
- * 6 such enteries will there. Index into correct
- * entery is based on the panel_index in #40 LFP
- */
-#define MAX_MIPI_CONFIGURATIONS        6
+enum mipi_seq_element {
+       MIPI_SEQ_ELEM_END = 0,
+       MIPI_SEQ_ELEM_SEND_PKT,
+       MIPI_SEQ_ELEM_DELAY,
+       MIPI_SEQ_ELEM_GPIO,
+       MIPI_SEQ_ELEM_I2C,              /* sequence block v2+ */
+       MIPI_SEQ_ELEM_SPI,              /* sequence block v3+ */
+       MIPI_SEQ_ELEM_PMIC,             /* sequence block v3+ */
+       MIPI_SEQ_ELEM_MAX
+};
 
 #define MIPI_DSI_UNDEFINED_PANEL_ID    0
 #define MIPI_DSI_GENERIC_PANEL_ID      1
 
-/*
- * PMIC vs SoC Backlight support specified in pwm_blc
- * field in mipi_config block below.
-*/
-#define PPS_BLC_PMIC   0
-#define PPS_BLC_SOC    1
-
 struct mipi_config {
        u16 panel_id;
 
@@ -821,6 +86,8 @@ struct mipi_config {
        u32 video_transfer_mode:2;
 
        u32 cabc_supported:1;
+#define PPS_BLC_PMIC   0
+#define PPS_BLC_SOC    1
        u32 pwm_blc:1;
 
        /* Bit 13:10 */
@@ -924,12 +191,7 @@ struct mipi_config {
 
 } __packed;
 
-/* Block 52 contains MIPI configuration block
- * 6 * bdb_mipi_config, followed by 6 pps data
- * block below
- *
- * all delays has a unit of 100us
- */
+/* all delays have a unit of 100us */
 struct mipi_pps_data {
        u16 panel_on_delay;
        u16 bl_enable_delay;
@@ -938,57 +200,4 @@ struct mipi_pps_data {
        u16 panel_power_cycle_delay;
 } __packed;
 
-struct bdb_mipi_config {
-       struct mipi_config config[MAX_MIPI_CONFIGURATIONS];
-       struct mipi_pps_data pps[MAX_MIPI_CONFIGURATIONS];
-} __packed;
-
-/* Block 53 contains MIPI sequences as needed by the panel
- * for enabling it. This block can be variable in size and
- * can be maximum of 6 blocks
- */
-struct bdb_mipi_sequence {
-       u8 version;
-       u8 data[0];
-} __packed;
-
-/* MIPI Sequnece Block definitions */
-enum mipi_seq {
-       MIPI_SEQ_END = 0,
-       MIPI_SEQ_ASSERT_RESET,
-       MIPI_SEQ_INIT_OTP,
-       MIPI_SEQ_DISPLAY_ON,
-       MIPI_SEQ_DISPLAY_OFF,
-       MIPI_SEQ_DEASSERT_RESET,
-       MIPI_SEQ_BACKLIGHT_ON,          /* sequence block v2+ */
-       MIPI_SEQ_BACKLIGHT_OFF,         /* sequence block v2+ */
-       MIPI_SEQ_TEAR_ON,               /* sequence block v2+ */
-       MIPI_SEQ_TEAR_OFF,              /* sequence block v3+ */
-       MIPI_SEQ_POWER_ON,              /* sequence block v3+ */
-       MIPI_SEQ_POWER_OFF,             /* sequence block v3+ */
-       MIPI_SEQ_MAX
-};
-
-enum mipi_seq_element {
-       MIPI_SEQ_ELEM_END = 0,
-       MIPI_SEQ_ELEM_SEND_PKT,
-       MIPI_SEQ_ELEM_DELAY,
-       MIPI_SEQ_ELEM_GPIO,
-       MIPI_SEQ_ELEM_I2C,              /* sequence block v2+ */
-       MIPI_SEQ_ELEM_SPI,              /* sequence block v3+ */
-       MIPI_SEQ_ELEM_PMIC,             /* sequence block v3+ */
-       MIPI_SEQ_ELEM_MAX
-};
-
-enum mipi_gpio_pin_index {
-       MIPI_GPIO_UNDEFINED = 0,
-       MIPI_GPIO_PANEL_ENABLE,
-       MIPI_GPIO_BL_ENABLE,
-       MIPI_GPIO_PWM_ENABLE,
-       MIPI_GPIO_RESET_N,
-       MIPI_GPIO_PWR_DOWN_R,
-       MIPI_GPIO_STDBY_RST_N,
-       MIPI_GPIO_MAX
-};
-
 #endif /* _INTEL_BIOS_H_ */
diff --git a/drivers/gpu/drm/i915/intel_color.c b/drivers/gpu/drm/i915/intel_color.c
new file mode 100644 (file)
index 0000000..1b3f974
--- /dev/null
@@ -0,0 +1,553 @@
+/*
+ * Copyright © 2016 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 "intel_drv.h"
+
+#define CTM_COEFF_SIGN (1ULL << 63)
+
+#define CTM_COEFF_1_0  (1ULL << 32)
+#define CTM_COEFF_2_0  (CTM_COEFF_1_0 << 1)
+#define CTM_COEFF_4_0  (CTM_COEFF_2_0 << 1)
+#define CTM_COEFF_8_0  (CTM_COEFF_4_0 << 1)
+#define CTM_COEFF_0_5  (CTM_COEFF_1_0 >> 1)
+#define CTM_COEFF_0_25 (CTM_COEFF_0_5 >> 1)
+#define CTM_COEFF_0_125        (CTM_COEFF_0_25 >> 1)
+
+#define CTM_COEFF_LIMITED_RANGE ((235ULL - 16ULL) * CTM_COEFF_1_0 / 255)
+
+#define CTM_COEFF_NEGATIVE(coeff)      (((coeff) & CTM_COEFF_SIGN) != 0)
+#define CTM_COEFF_ABS(coeff)           ((coeff) & (CTM_COEFF_SIGN - 1))
+
+#define LEGACY_LUT_LENGTH              (sizeof(struct drm_color_lut) * 256)
+
+/*
+ * Extract the CSC coefficient from a CTM coefficient (in U32.32 fixed point
+ * format). This macro takes the coefficient we want transformed and the
+ * number of fractional bits.
+ *
+ * We only have a 9 bits precision window which slides depending on the value
+ * of the CTM coefficient and we write the value from bit 3. We also round the
+ * value.
+ */
+#define I9XX_CSC_COEFF_FP(coeff, fbits)        \
+       (clamp_val(((coeff) >> (32 - (fbits) - 3)) + 4, 0, 0xfff) & 0xff8)
+
+#define I9XX_CSC_COEFF_LIMITED_RANGE   \
+       I9XX_CSC_COEFF_FP(CTM_COEFF_LIMITED_RANGE, 9)
+#define I9XX_CSC_COEFF_1_0             \
+       ((7 << 12) | I9XX_CSC_COEFF_FP(CTM_COEFF_1_0, 8))
+
+static bool crtc_state_is_legacy(struct drm_crtc_state *state)
+{
+       return !state->degamma_lut &&
+               !state->ctm &&
+               state->gamma_lut &&
+               state->gamma_lut->length == LEGACY_LUT_LENGTH;
+}
+
+/*
+ * When using limited range, multiply the matrix given by userspace by
+ * the matrix that we would use for the limited range. We do the
+ * multiplication in U2.30 format.
+ */
+static void ctm_mult_by_limited(uint64_t *result, int64_t *input)
+{
+       int i;
+
+       for (i = 0; i < 9; i++)
+               result[i] = 0;
+
+       for (i = 0; i < 3; i++) {
+               int64_t user_coeff = input[i * 3 + i];
+               uint64_t limited_coeff = CTM_COEFF_LIMITED_RANGE >> 2;
+               uint64_t abs_coeff = clamp_val(CTM_COEFF_ABS(user_coeff),
+                                              0,
+                                              CTM_COEFF_4_0 - 1) >> 2;
+
+               result[i * 3 + i] = (limited_coeff * abs_coeff) >> 27;
+               if (CTM_COEFF_NEGATIVE(user_coeff))
+                       result[i * 3 + i] |= CTM_COEFF_SIGN;
+       }
+}
+
+/* Set up the pipe CSC unit. */
+static void i9xx_load_csc_matrix(struct drm_crtc_state *crtc_state)
+{
+       struct drm_crtc *crtc = crtc_state->crtc;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       int i, pipe = intel_crtc->pipe;
+       uint16_t coeffs[9] = { 0, };
+
+       if (crtc_state->ctm) {
+               struct drm_color_ctm *ctm =
+                       (struct drm_color_ctm *)crtc_state->ctm->data;
+               uint64_t input[9] = { 0, };
+
+               if (intel_crtc->config->limited_color_range) {
+                       ctm_mult_by_limited(input, ctm->matrix);
+               } else {
+                       for (i = 0; i < ARRAY_SIZE(input); i++)
+                               input[i] = ctm->matrix[i];
+               }
+
+               /*
+                * Convert fixed point S31.32 input to format supported by the
+                * hardware.
+                */
+               for (i = 0; i < ARRAY_SIZE(coeffs); i++) {
+                       uint64_t abs_coeff = ((1ULL << 63) - 1) & input[i];
+
+                       /*
+                        * Clamp input value to min/max supported by
+                        * hardware.
+                        */
+                       abs_coeff = clamp_val(abs_coeff, 0, CTM_COEFF_4_0 - 1);
+
+                       /* sign bit */
+                       if (CTM_COEFF_NEGATIVE(input[i]))
+                               coeffs[i] |= 1 << 15;
+
+                       if (abs_coeff < CTM_COEFF_0_125)
+                               coeffs[i] |= (3 << 12) |
+                                       I9XX_CSC_COEFF_FP(abs_coeff, 12);
+                       else if (abs_coeff < CTM_COEFF_0_25)
+                               coeffs[i] |= (2 << 12) |
+                                       I9XX_CSC_COEFF_FP(abs_coeff, 11);
+                       else if (abs_coeff < CTM_COEFF_0_5)
+                               coeffs[i] |= (1 << 12) |
+                                       I9XX_CSC_COEFF_FP(abs_coeff, 10);
+                       else if (abs_coeff < CTM_COEFF_1_0)
+                               coeffs[i] |= I9XX_CSC_COEFF_FP(abs_coeff, 9);
+                       else if (abs_coeff < CTM_COEFF_2_0)
+                               coeffs[i] |= (7 << 12) |
+                                       I9XX_CSC_COEFF_FP(abs_coeff, 8);
+                       else
+                               coeffs[i] |= (6 << 12) |
+                                       I9XX_CSC_COEFF_FP(abs_coeff, 7);
+               }
+       } else {
+               /*
+                * Load an identity matrix if no coefficients are provided.
+                *
+                * TODO: Check what kind of values actually come out of the
+                * pipe with these coeff/postoff values and adjust to get the
+                * best accuracy. Perhaps we even need to take the bpc value
+                * into consideration.
+                */
+               for (i = 0; i < 3; i++) {
+                       if (intel_crtc->config->limited_color_range)
+                               coeffs[i * 3 + i] =
+                                       I9XX_CSC_COEFF_LIMITED_RANGE;
+                       else
+                               coeffs[i * 3 + i] = I9XX_CSC_COEFF_1_0;
+               }
+       }
+
+       I915_WRITE(PIPE_CSC_COEFF_RY_GY(pipe), coeffs[0] << 16 | coeffs[1]);
+       I915_WRITE(PIPE_CSC_COEFF_BY(pipe), coeffs[2] << 16);
+
+       I915_WRITE(PIPE_CSC_COEFF_RU_GU(pipe), coeffs[3] << 16 | coeffs[4]);
+       I915_WRITE(PIPE_CSC_COEFF_BU(pipe), coeffs[5] << 16);
+
+       I915_WRITE(PIPE_CSC_COEFF_RV_GV(pipe), coeffs[6] << 16 | coeffs[7]);
+       I915_WRITE(PIPE_CSC_COEFF_BV(pipe), coeffs[8] << 16);
+
+       I915_WRITE(PIPE_CSC_PREOFF_HI(pipe), 0);
+       I915_WRITE(PIPE_CSC_PREOFF_ME(pipe), 0);
+       I915_WRITE(PIPE_CSC_PREOFF_LO(pipe), 0);
+
+       if (INTEL_INFO(dev)->gen > 6) {
+               uint16_t postoff = 0;
+
+               if (intel_crtc->config->limited_color_range)
+                       postoff = (16 * (1 << 12) / 255) & 0x1fff;
+
+               I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff);
+               I915_WRITE(PIPE_CSC_POSTOFF_ME(pipe), postoff);
+               I915_WRITE(PIPE_CSC_POSTOFF_LO(pipe), postoff);
+
+               I915_WRITE(PIPE_CSC_MODE(pipe), 0);
+       } else {
+               uint32_t mode = CSC_MODE_YUV_TO_RGB;
+
+               if (intel_crtc->config->limited_color_range)
+                       mode |= CSC_BLACK_SCREEN_OFFSET;
+
+               I915_WRITE(PIPE_CSC_MODE(pipe), mode);
+       }
+}
+
+/*
+ * Set up the pipe CSC unit on CherryView.
+ */
+static void cherryview_load_csc_matrix(struct drm_crtc_state *state)
+{
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int pipe = to_intel_crtc(crtc)->pipe;
+       uint32_t mode;
+
+       if (state->ctm) {
+               struct drm_color_ctm *ctm =
+                       (struct drm_color_ctm *) state->ctm->data;
+               uint16_t coeffs[9] = { 0, };
+               int i;
+
+               for (i = 0; i < ARRAY_SIZE(coeffs); i++) {
+                       uint64_t abs_coeff =
+                               ((1ULL << 63) - 1) & ctm->matrix[i];
+
+                       /* Round coefficient. */
+                       abs_coeff += 1 << (32 - 13);
+                       /* Clamp to hardware limits. */
+                       abs_coeff = clamp_val(abs_coeff, 0, CTM_COEFF_8_0 - 1);
+
+                       /* Write coefficients in S3.12 format. */
+                       if (ctm->matrix[i] & (1ULL << 63))
+                               coeffs[i] = 1 << 15;
+                       coeffs[i] |= ((abs_coeff >> 32) & 7) << 12;
+                       coeffs[i] |= (abs_coeff >> 20) & 0xfff;
+               }
+
+               I915_WRITE(CGM_PIPE_CSC_COEFF01(pipe),
+                          coeffs[1] << 16 | coeffs[0]);
+               I915_WRITE(CGM_PIPE_CSC_COEFF23(pipe),
+                          coeffs[3] << 16 | coeffs[2]);
+               I915_WRITE(CGM_PIPE_CSC_COEFF45(pipe),
+                          coeffs[5] << 16 | coeffs[4]);
+               I915_WRITE(CGM_PIPE_CSC_COEFF67(pipe),
+                          coeffs[7] << 16 | coeffs[6]);
+               I915_WRITE(CGM_PIPE_CSC_COEFF8(pipe), coeffs[8]);
+       }
+
+       mode = (state->ctm ? CGM_PIPE_MODE_CSC : 0);
+       if (!crtc_state_is_legacy(state)) {
+               mode |= (state->degamma_lut ? CGM_PIPE_MODE_DEGAMMA : 0) |
+                       (state->gamma_lut ? CGM_PIPE_MODE_GAMMA : 0);
+       }
+       I915_WRITE(CGM_PIPE_MODE(pipe), mode);
+}
+
+void intel_color_set_csc(struct drm_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc_state->crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       if (dev_priv->display.load_csc_matrix)
+               dev_priv->display.load_csc_matrix(crtc_state);
+}
+
+/* Loads the legacy palette/gamma unit for the CRTC. */
+static void i9xx_load_luts_internal(struct drm_crtc *crtc,
+                                   struct drm_property_blob *blob)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       enum pipe pipe = intel_crtc->pipe;
+       int i;
+
+       if (HAS_GMCH_DISPLAY(dev)) {
+               if (intel_crtc->config->has_dsi_encoder)
+                       assert_dsi_pll_enabled(dev_priv);
+               else
+                       assert_pll_enabled(dev_priv, pipe);
+       }
+
+       if (blob) {
+               struct drm_color_lut *lut = (struct drm_color_lut *) blob->data;
+               for (i = 0; i < 256; i++) {
+                       uint32_t word =
+                               (drm_color_lut_extract(lut[i].red, 8) << 16) |
+                               (drm_color_lut_extract(lut[i].green, 8) << 8) |
+                               drm_color_lut_extract(lut[i].blue, 8);
+
+                       if (HAS_GMCH_DISPLAY(dev))
+                               I915_WRITE(PALETTE(pipe, i), word);
+                       else
+                               I915_WRITE(LGC_PALETTE(pipe, i), word);
+               }
+       } else {
+               for (i = 0; i < 256; i++) {
+                       uint32_t word = (i << 16) | (i << 8) | i;
+
+                       if (HAS_GMCH_DISPLAY(dev))
+                               I915_WRITE(PALETTE(pipe, i), word);
+                       else
+                               I915_WRITE(LGC_PALETTE(pipe, i), word);
+               }
+       }
+}
+
+static void i9xx_load_luts(struct drm_crtc_state *crtc_state)
+{
+       i9xx_load_luts_internal(crtc_state->crtc, crtc_state->gamma_lut);
+}
+
+/* Loads the legacy palette/gamma unit for the CRTC on Haswell. */
+static void haswell_load_luts(struct drm_crtc_state *crtc_state)
+{
+       struct drm_crtc *crtc = crtc_state->crtc;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_crtc_state *intel_crtc_state =
+               to_intel_crtc_state(crtc_state);
+       bool reenable_ips = false;
+
+       /*
+        * Workaround : Do not read or write the pipe palette/gamma data while
+        * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
+        */
+       if (IS_HASWELL(dev) && intel_crtc->config->ips_enabled &&
+           (intel_crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT)) {
+               hsw_disable_ips(intel_crtc);
+               reenable_ips = true;
+       }
+
+       intel_crtc_state->gamma_mode = GAMMA_MODE_MODE_8BIT;
+       I915_WRITE(GAMMA_MODE(intel_crtc->pipe), GAMMA_MODE_MODE_8BIT);
+
+       i9xx_load_luts(crtc_state);
+
+       if (reenable_ips)
+               hsw_enable_ips(intel_crtc);
+}
+
+/* Loads the palette/gamma unit for the CRTC on Broadwell+. */
+static void broadwell_load_luts(struct drm_crtc_state *state)
+{
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc_state *intel_state = to_intel_crtc_state(state);
+       enum pipe pipe = to_intel_crtc(crtc)->pipe;
+       uint32_t i, lut_size = INTEL_INFO(dev)->color.degamma_lut_size;
+
+       if (crtc_state_is_legacy(state)) {
+               haswell_load_luts(state);
+               return;
+       }
+
+       I915_WRITE(PREC_PAL_INDEX(pipe),
+                  PAL_PREC_SPLIT_MODE | PAL_PREC_AUTO_INCREMENT);
+
+       if (state->degamma_lut) {
+               struct drm_color_lut *lut =
+                       (struct drm_color_lut *) state->degamma_lut->data;
+
+               for (i = 0; i < lut_size; i++) {
+                       uint32_t word =
+                       drm_color_lut_extract(lut[i].red, 10) << 20 |
+                       drm_color_lut_extract(lut[i].green, 10) << 10 |
+                       drm_color_lut_extract(lut[i].blue, 10);
+
+                       I915_WRITE(PREC_PAL_DATA(pipe), word);
+               }
+       } else {
+               for (i = 0; i < lut_size; i++) {
+                       uint32_t v = (i * ((1 << 10) - 1)) / (lut_size - 1);
+
+                       I915_WRITE(PREC_PAL_DATA(pipe),
+                                  (v << 20) | (v << 10) | v);
+               }
+       }
+
+       if (state->gamma_lut) {
+               struct drm_color_lut *lut =
+                       (struct drm_color_lut *) state->gamma_lut->data;
+
+               for (i = 0; i < lut_size; i++) {
+                       uint32_t word =
+                       (drm_color_lut_extract(lut[i].red, 10) << 20) |
+                       (drm_color_lut_extract(lut[i].green, 10) << 10) |
+                       drm_color_lut_extract(lut[i].blue, 10);
+
+                       I915_WRITE(PREC_PAL_DATA(pipe), word);
+               }
+
+               /* Program the max register to clamp values > 1.0. */
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 0),
+                          drm_color_lut_extract(lut[i].red, 16));
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 1),
+                          drm_color_lut_extract(lut[i].green, 16));
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 2),
+                          drm_color_lut_extract(lut[i].blue, 16));
+       } else {
+               for (i = 0; i < lut_size; i++) {
+                       uint32_t v = (i * ((1 << 10) - 1)) / (lut_size - 1);
+
+                       I915_WRITE(PREC_PAL_DATA(pipe),
+                                  (v << 20) | (v << 10) | v);
+               }
+
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 0), (1 << 16) - 1);
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 1), (1 << 16) - 1);
+               I915_WRITE(PREC_PAL_GC_MAX(pipe, 2), (1 << 16) - 1);
+       }
+
+       intel_state->gamma_mode = GAMMA_MODE_MODE_SPLIT;
+       I915_WRITE(GAMMA_MODE(pipe), GAMMA_MODE_MODE_SPLIT);
+       POSTING_READ(GAMMA_MODE(pipe));
+
+       /*
+        * Reset the index, otherwise it prevents the legacy palette to be
+        * written properly.
+        */
+       I915_WRITE(PREC_PAL_INDEX(pipe), 0);
+}
+
+/* Loads the palette/gamma unit for the CRTC on CherryView. */
+static void cherryview_load_luts(struct drm_crtc_state *state)
+{
+       struct drm_crtc *crtc = state->crtc;
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum pipe pipe = to_intel_crtc(crtc)->pipe;
+       struct drm_color_lut *lut;
+       uint32_t i, lut_size;
+       uint32_t word0, word1;
+
+       if (crtc_state_is_legacy(state)) {
+               /* Turn off degamma/gamma on CGM block. */
+               I915_WRITE(CGM_PIPE_MODE(pipe),
+                          (state->ctm ? CGM_PIPE_MODE_CSC : 0));
+               i9xx_load_luts_internal(crtc, state->gamma_lut);
+               return;
+       }
+
+       if (state->degamma_lut) {
+               lut = (struct drm_color_lut *) state->degamma_lut->data;
+               lut_size = INTEL_INFO(dev)->color.degamma_lut_size;
+               for (i = 0; i < lut_size; i++) {
+                       /* Write LUT in U0.14 format. */
+                       word0 =
+                       (drm_color_lut_extract(lut[i].green, 14) << 16) |
+                       drm_color_lut_extract(lut[i].blue, 14);
+                       word1 = drm_color_lut_extract(lut[i].red, 14);
+
+                       I915_WRITE(CGM_PIPE_DEGAMMA(pipe, i, 0), word0);
+                       I915_WRITE(CGM_PIPE_DEGAMMA(pipe, i, 1), word1);
+               }
+       }
+
+       if (state->gamma_lut) {
+               lut = (struct drm_color_lut *) state->gamma_lut->data;
+               lut_size = INTEL_INFO(dev)->color.gamma_lut_size;
+               for (i = 0; i < lut_size; i++) {
+                       /* Write LUT in U0.10 format. */
+                       word0 =
+                       (drm_color_lut_extract(lut[i].green, 10) << 16) |
+                       drm_color_lut_extract(lut[i].blue, 10);
+                       word1 = drm_color_lut_extract(lut[i].red, 10);
+
+                       I915_WRITE(CGM_PIPE_GAMMA(pipe, i, 0), word0);
+                       I915_WRITE(CGM_PIPE_GAMMA(pipe, i, 1), word1);
+               }
+       }
+
+       I915_WRITE(CGM_PIPE_MODE(pipe),
+                  (state->ctm ? CGM_PIPE_MODE_CSC : 0) |
+                  (state->degamma_lut ? CGM_PIPE_MODE_DEGAMMA : 0) |
+                  (state->gamma_lut ? CGM_PIPE_MODE_GAMMA : 0));
+
+       /*
+        * Also program a linear LUT in the legacy block (behind the
+        * CGM block).
+        */
+       i9xx_load_luts_internal(crtc, NULL);
+}
+
+void intel_color_load_luts(struct drm_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc_state->crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       dev_priv->display.load_luts(crtc_state);
+}
+
+int intel_color_check(struct drm_crtc *crtc,
+                     struct drm_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc->dev;
+       size_t gamma_length, degamma_length;
+
+       degamma_length = INTEL_INFO(dev)->color.degamma_lut_size *
+               sizeof(struct drm_color_lut);
+       gamma_length = INTEL_INFO(dev)->color.gamma_lut_size *
+               sizeof(struct drm_color_lut);
+
+       /*
+        * We allow both degamma & gamma luts at the right size or
+        * NULL.
+        */
+       if ((!crtc_state->degamma_lut ||
+            crtc_state->degamma_lut->length == degamma_length) &&
+           (!crtc_state->gamma_lut ||
+            crtc_state->gamma_lut->length == gamma_length))
+               return 0;
+
+       /*
+        * We also allow no degamma lut and a gamma lut at the legacy
+        * size (256 entries).
+        */
+       if (!crtc_state->degamma_lut &&
+           crtc_state->gamma_lut &&
+           crtc_state->gamma_lut->length == LEGACY_LUT_LENGTH)
+               return 0;
+
+       return -EINVAL;
+}
+
+void intel_color_init(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       drm_mode_crtc_set_gamma_size(crtc, 256);
+
+       if (IS_CHERRYVIEW(dev)) {
+               dev_priv->display.load_csc_matrix = cherryview_load_csc_matrix;
+               dev_priv->display.load_luts = cherryview_load_luts;
+       } else if (IS_HASWELL(dev)) {
+               dev_priv->display.load_csc_matrix = i9xx_load_csc_matrix;
+               dev_priv->display.load_luts = haswell_load_luts;
+       } else if (IS_BROADWELL(dev) || IS_SKYLAKE(dev) ||
+                  IS_BROXTON(dev) || IS_KABYLAKE(dev)) {
+               dev_priv->display.load_csc_matrix = i9xx_load_csc_matrix;
+               dev_priv->display.load_luts = broadwell_load_luts;
+       } else {
+               dev_priv->display.load_luts = i9xx_load_luts;
+       }
+
+       /* Enable color management support when we have degamma & gamma LUTs. */
+       if (INTEL_INFO(dev)->color.degamma_lut_size != 0 &&
+           INTEL_INFO(dev)->color.gamma_lut_size != 0)
+               drm_helper_crtc_enable_color_mgmt(crtc,
+                                       INTEL_INFO(dev)->color.degamma_lut_size,
+                                       INTEL_INFO(dev)->color.gamma_lut_size);
+}
index 0364292367b1425a297cd35e6ae81da2cf18dbc3..3fbb6fc664516cdced5ab80ad1d0a8fe4cc70219 100644 (file)
@@ -120,22 +120,16 @@ static unsigned int intel_crt_get_flags(struct intel_encoder *encoder)
 static void intel_crt_get_config(struct intel_encoder *encoder,
                                 struct intel_crtc_state *pipe_config)
 {
-       struct drm_device *dev = encoder->base.dev;
-       int dotclock;
-
        pipe_config->base.adjusted_mode.flags |= intel_crt_get_flags(encoder);
 
-       dotclock = pipe_config->port_clock;
-
-       if (HAS_PCH_SPLIT(dev))
-               ironlake_check_encoder_dotclock(pipe_config, dotclock);
-
-       pipe_config->base.adjusted_mode.crtc_clock = dotclock;
+       pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
 }
 
 static void hsw_crt_get_config(struct intel_encoder *encoder,
                               struct intel_crtc_state *pipe_config)
 {
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+
        intel_ddi_get_config(encoder, pipe_config);
 
        pipe_config->base.adjusted_mode.flags &= ~(DRM_MODE_FLAG_PHSYNC |
@@ -143,6 +137,8 @@ static void hsw_crt_get_config(struct intel_encoder *encoder,
                                              DRM_MODE_FLAG_PVSYNC |
                                              DRM_MODE_FLAG_NVSYNC);
        pipe_config->base.adjusted_mode.flags |= intel_crt_get_flags(encoder);
+
+       pipe_config->base.adjusted_mode.crtc_clock = lpt_get_iclkip(dev_priv);
 }
 
 /* Note: The caller is required to filter out dpms modes not supported by the
@@ -222,18 +218,26 @@ intel_crt_mode_valid(struct drm_connector *connector,
 {
        struct drm_device *dev = connector->dev;
        int max_dotclk = to_i915(dev)->max_dotclk_freq;
+       int max_clock;
 
-       int max_clock = 0;
        if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
                return MODE_NO_DBLESCAN;
 
        if (mode->clock < 25000)
                return MODE_CLOCK_LOW;
 
-       if (IS_GEN2(dev))
-               max_clock = 350000;
-       else
+       if (HAS_PCH_LPT(dev))
+               max_clock = 180000;
+       else if (IS_VALLEYVIEW(dev))
+               /*
+                * 270 MHz due to current DPLL limits,
+                * DAC limit supposedly 355 MHz.
+                */
+               max_clock = 270000;
+       else if (IS_GEN3(dev) || IS_GEN4(dev))
                max_clock = 400000;
+       else
+               max_clock = 350000;
        if (mode->clock > max_clock)
                return MODE_CLOCK_HIGH;
 
@@ -267,15 +271,9 @@ static bool intel_crt_compute_config(struct intel_encoder *encoder,
        }
 
        /* FDI must always be 2.7 GHz */
-       if (HAS_DDI(dev)) {
-               pipe_config->ddi_pll_sel = PORT_CLK_SEL_SPLL;
+       if (HAS_DDI(dev))
                pipe_config->port_clock = 135000 * 2;
 
-               pipe_config->dpll_hw_state.wrpll = 0;
-               pipe_config->dpll_hw_state.spll =
-                       SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
-       }
-
        return true;
 }
 
@@ -658,6 +656,8 @@ intel_crt_detect(struct drm_connector *connector, bool force)
                else if (INTEL_INFO(dev)->gen < 4)
                        status = intel_crt_load_detect(crt,
                                to_intel_crtc(connector->state->crtc)->pipe);
+               else if (i915.load_detect_test)
+                       status = connector_status_disconnected;
                else
                        status = connector_status_unknown;
                intel_release_load_detect_pipe(connector, &tmp, &ctx);
index 902054efb902b75d2dd2392d5c89cfe54389a161..a34c23eceba0448bb93b5afdb338a82db90e179f 100644 (file)
@@ -50,6 +50,7 @@ MODULE_FIRMWARE(I915_CSR_SKL);
 MODULE_FIRMWARE(I915_CSR_BXT);
 
 #define SKL_CSR_VERSION_REQUIRED       CSR_VERSION(1, 23)
+#define BXT_CSR_VERSION_REQUIRED       CSR_VERSION(1, 7)
 
 #define CSR_MAX_FW_SIZE                        0x2FFF
 #define CSR_DEFAULT_FW_OFFSET          0xFFFFFFFF
@@ -188,28 +189,49 @@ static const struct stepping_info bxt_stepping_info[] = {
        {'B', '0'}, {'B', '1'}, {'B', '2'}
 };
 
-static const struct stepping_info *intel_get_stepping_info(struct drm_device *dev)
+static const struct stepping_info no_stepping_info = { '*', '*' };
+
+static const struct stepping_info *
+intel_get_stepping_info(struct drm_i915_private *dev_priv)
 {
        const struct stepping_info *si;
        unsigned int size;
 
-       if (IS_KABYLAKE(dev)) {
+       if (IS_KABYLAKE(dev_priv)) {
                size = ARRAY_SIZE(kbl_stepping_info);
                si = kbl_stepping_info;
-       } else if (IS_SKYLAKE(dev)) {
+       } else if (IS_SKYLAKE(dev_priv)) {
                size = ARRAY_SIZE(skl_stepping_info);
                si = skl_stepping_info;
-       } else if (IS_BROXTON(dev)) {
+       } else if (IS_BROXTON(dev_priv)) {
                size = ARRAY_SIZE(bxt_stepping_info);
                si = bxt_stepping_info;
        } else {
-               return NULL;
+               size = 0;
        }
 
-       if (INTEL_REVID(dev) < size)
-               return si + INTEL_REVID(dev);
+       if (INTEL_REVID(dev_priv) < size)
+               return si + INTEL_REVID(dev_priv);
 
-       return NULL;
+       return &no_stepping_info;
+}
+
+static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
+{
+       uint32_t val, mask;
+
+       mask = DC_STATE_DEBUG_MASK_MEMORY_UP;
+
+       if (IS_BROXTON(dev_priv))
+               mask |= DC_STATE_DEBUG_MASK_CORES;
+
+       /* The below bit doesn't need to be cleared ever afterwards */
+       val = I915_READ(DC_STATE_DEBUG);
+       if ((val & mask) != mask) {
+               val |= mask;
+               I915_WRITE(DC_STATE_DEBUG, val);
+               POSTING_READ(DC_STATE_DEBUG);
+       }
 }
 
 /**
@@ -220,19 +242,19 @@ static const struct stepping_info *intel_get_stepping_info(struct drm_device *de
  * Everytime display comes back from low power state this function is called to
  * copy the firmware from internal memory to registers.
  */
-bool intel_csr_load_program(struct drm_i915_private *dev_priv)
+void intel_csr_load_program(struct drm_i915_private *dev_priv)
 {
        u32 *payload = dev_priv->csr.dmc_payload;
        uint32_t i, fw_size;
 
        if (!IS_GEN9(dev_priv)) {
                DRM_ERROR("No CSR support available for this platform\n");
-               return false;
+               return;
        }
 
        if (!dev_priv->csr.dmc_payload) {
                DRM_ERROR("Tried to program CSR with empty payload\n");
-               return false;
+               return;
        }
 
        fw_size = dev_priv->csr.dmc_fw_size;
@@ -246,34 +268,25 @@ bool intel_csr_load_program(struct drm_i915_private *dev_priv)
 
        dev_priv->csr.dc_state = 0;
 
-       return true;
+       gen9_set_dc_state_debugmask(dev_priv);
 }
 
 static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
                              const struct firmware *fw)
 {
-       struct drm_device *dev = dev_priv->dev;
        struct intel_css_header *css_header;
        struct intel_package_header *package_header;
        struct intel_dmc_header *dmc_header;
        struct intel_csr *csr = &dev_priv->csr;
-       const struct stepping_info *stepping_info = intel_get_stepping_info(dev);
-       char stepping, substepping;
+       const struct stepping_info *si = intel_get_stepping_info(dev_priv);
        uint32_t dmc_offset = CSR_DEFAULT_FW_OFFSET, readcount = 0, nbytes;
        uint32_t i;
        uint32_t *dmc_payload;
+       uint32_t required_min_version;
 
        if (!fw)
                return NULL;
 
-       if (!stepping_info) {
-               DRM_ERROR("Unknown stepping info, firmware loading failed\n");
-               return NULL;
-       }
-
-       stepping = stepping_info->stepping;
-       substepping = stepping_info->substepping;
-
        /* Extract CSS Header information*/
        css_header = (struct intel_css_header *)fw->data;
        if (sizeof(struct intel_css_header) !=
@@ -285,15 +298,23 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
 
        csr->version = css_header->version;
 
-       if ((IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) &&
-           csr->version < SKL_CSR_VERSION_REQUIRED) {
-               DRM_INFO("Refusing to load old Skylake DMC firmware v%u.%u,"
+       if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
+               required_min_version = SKL_CSR_VERSION_REQUIRED;
+       } else if (IS_BROXTON(dev_priv)) {
+               required_min_version = BXT_CSR_VERSION_REQUIRED;
+       } else {
+               MISSING_CASE(INTEL_REVID(dev_priv));
+               required_min_version = 0;
+       }
+
+       if (csr->version < required_min_version) {
+               DRM_INFO("Refusing to load old DMC firmware v%u.%u,"
                         " please upgrade to v%u.%u or later"
                           " [" FIRMWARE_URL "].\n",
                         CSR_VERSION_MAJOR(csr->version),
                         CSR_VERSION_MINOR(csr->version),
-                        CSR_VERSION_MAJOR(SKL_CSR_VERSION_REQUIRED),
-                        CSR_VERSION_MINOR(SKL_CSR_VERSION_REQUIRED));
+                        CSR_VERSION_MAJOR(required_min_version),
+                        CSR_VERSION_MINOR(required_min_version));
                return NULL;
        }
 
@@ -313,11 +334,11 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
        /* Search for dmc_offset to find firware binary. */
        for (i = 0; i < package_header->num_entries; i++) {
                if (package_header->fw_info[i].substepping == '*' &&
-                   stepping == package_header->fw_info[i].stepping) {
+                   si->stepping == package_header->fw_info[i].stepping) {
                        dmc_offset = package_header->fw_info[i].offset;
                        break;
-               } else if (stepping == package_header->fw_info[i].stepping &&
-                       substepping == package_header->fw_info[i].substepping) {
+               } else if (si->stepping == package_header->fw_info[i].stepping &&
+                          si->substepping == package_header->fw_info[i].substepping) {
                        dmc_offset = package_header->fw_info[i].offset;
                        break;
                } else if (package_header->fw_info[i].stepping == '*' &&
@@ -325,7 +346,8 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
                        dmc_offset = package_header->fw_info[i].offset;
        }
        if (dmc_offset == CSR_DEFAULT_FW_OFFSET) {
-               DRM_ERROR("Firmware not supported for %c stepping\n", stepping);
+               DRM_ERROR("Firmware not supported for %c stepping\n",
+                         si->stepping);
                return NULL;
        }
        readcount += dmc_offset;
@@ -371,9 +393,7 @@ static uint32_t *parse_csr_fw(struct drm_i915_private *dev_priv,
                return NULL;
        }
 
-       memcpy(dmc_payload, &fw->data[readcount], nbytes);
-
-       return dmc_payload;
+       return memcpy(dmc_payload, &fw->data[readcount], nbytes);
 }
 
 static void csr_load_work_fn(struct work_struct *work)
@@ -388,18 +408,12 @@ static void csr_load_work_fn(struct work_struct *work)
 
        ret = request_firmware(&fw, dev_priv->csr.fw_path,
                               &dev_priv->dev->pdev->dev);
-       if (!fw)
-               goto out;
-
-       dev_priv->csr.dmc_payload = parse_csr_fw(dev_priv, fw);
-       if (!dev_priv->csr.dmc_payload)
-               goto out;
+       if (fw)
+               dev_priv->csr.dmc_payload = parse_csr_fw(dev_priv, fw);
 
-       /* load csr program during system boot, as needed for DC states */
-       intel_csr_load_program(dev_priv);
-
-out:
        if (dev_priv->csr.dmc_payload) {
+               intel_csr_load_program(dev_priv);
+
                intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
 
                DRM_INFO("Finished loading %s (v%u.%u)\n",
@@ -452,11 +466,51 @@ void intel_csr_ucode_init(struct drm_i915_private *dev_priv)
        schedule_work(&dev_priv->csr.work);
 }
 
+/**
+ * intel_csr_ucode_suspend() - prepare CSR firmware before system suspend
+ * @dev_priv: i915 drm device
+ *
+ * Prepare the DMC firmware before entering system suspend. This includes
+ * flushing pending work items and releasing any resources acquired during
+ * init.
+ */
+void intel_csr_ucode_suspend(struct drm_i915_private *dev_priv)
+{
+       if (!HAS_CSR(dev_priv))
+               return;
+
+       flush_work(&dev_priv->csr.work);
+
+       /* Drop the reference held in case DMC isn't loaded. */
+       if (!dev_priv->csr.dmc_payload)
+               intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
+}
+
+/**
+ * intel_csr_ucode_resume() - init CSR firmware during system resume
+ * @dev_priv: i915 drm device
+ *
+ * Reinitialize the DMC firmware during system resume, reacquiring any
+ * resources released in intel_csr_ucode_suspend().
+ */
+void intel_csr_ucode_resume(struct drm_i915_private *dev_priv)
+{
+       if (!HAS_CSR(dev_priv))
+               return;
+
+       /*
+        * Reacquire the reference to keep RPM disabled in case DMC isn't
+        * loaded.
+        */
+       if (!dev_priv->csr.dmc_payload)
+               intel_display_power_get(dev_priv, POWER_DOMAIN_INIT);
+}
+
 /**
  * intel_csr_ucode_fini() - unload the CSR firmware.
  * @dev_priv: i915 drm device.
  *
- * Firmmware unloading includes freeing the internal momory and reset the
+ * Firmmware unloading includes freeing the internal memory and reset the
  * firmware loading status.
  */
 void intel_csr_ucode_fini(struct drm_i915_private *dev_priv)
@@ -464,7 +518,7 @@ void intel_csr_ucode_fini(struct drm_i915_private *dev_priv)
        if (!HAS_CSR(dev_priv))
                return;
 
-       flush_work(&dev_priv->csr.work);
+       intel_csr_ucode_suspend(dev_priv);
 
        kfree(dev_priv->csr.dmc_payload);
 }
index 96ffcc541e17697b69bad69fb24fe5bec3866aab..3fac04602a257b40906ef252543ec29af885e098 100644 (file)
@@ -315,6 +315,9 @@ static void ddi_get_encoder_port(struct intel_encoder *intel_encoder,
                *dig_port = enc_to_mst(encoder)->primary;
                *port = (*dig_port)->port;
                break;
+       default:
+               WARN(1, "Invalid DDI encoder type %d\n", intel_encoder->type);
+               /* fallthrough and treat as unknown */
        case INTEL_OUTPUT_DISPLAYPORT:
        case INTEL_OUTPUT_EDP:
        case INTEL_OUTPUT_HDMI:
@@ -326,9 +329,6 @@ static void ddi_get_encoder_port(struct intel_encoder *intel_encoder,
                *dig_port = NULL;
                *port = PORT_E;
                break;
-       default:
-               WARN(1, "Invalid DDI encoder type %d\n", intel_encoder->type);
-               break;
        }
 }
 
@@ -360,7 +360,7 @@ skl_get_buf_trans_dp(struct drm_i915_private *dev_priv, int *n_entries)
 static const struct ddi_buf_trans *
 skl_get_buf_trans_edp(struct drm_i915_private *dev_priv, int *n_entries)
 {
-       if (dev_priv->edp_low_vswing) {
+       if (dev_priv->vbt.edp.low_vswing) {
                if (IS_SKL_ULX(dev_priv) || IS_KBL_ULX(dev_priv)) {
                        *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
                        return skl_y_ddi_translations_edp;
@@ -444,7 +444,7 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder)
                ddi_translations_fdi = bdw_ddi_translations_fdi;
                ddi_translations_dp = bdw_ddi_translations_dp;
 
-               if (dev_priv->edp_low_vswing) {
+               if (dev_priv->vbt.edp.low_vswing) {
                        ddi_translations_edp = bdw_ddi_translations_edp;
                        n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
                } else {
@@ -637,6 +637,10 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
                        break;
                }
 
+               rx_ctl_val &= ~FDI_RX_ENABLE;
+               I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
+               POSTING_READ(FDI_RX_CTL(PIPE_A));
+
                temp = I915_READ(DDI_BUF_CTL(PORT_E));
                temp &= ~DDI_BUF_CTL_ENABLE;
                I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
@@ -651,10 +655,6 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
 
                intel_wait_ddi_buf_idle(dev_priv, PORT_E);
 
-               rx_ctl_val &= ~FDI_RX_ENABLE;
-               I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
-               POSTING_READ(FDI_RX_CTL(PIPE_A));
-
                /* Reset FDI_RX_MISC pwrdn lanes */
                temp = I915_READ(FDI_RX_MISC(PIPE_A));
                temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
@@ -732,160 +732,6 @@ intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
 }
 
 #define LC_FREQ 2700
-#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
-
-#define P_MIN 2
-#define P_MAX 64
-#define P_INC 2
-
-/* Constraints for PLL good behavior */
-#define REF_MIN 48
-#define REF_MAX 400
-#define VCO_MIN 2400
-#define VCO_MAX 4800
-
-#define abs_diff(a, b) ({                      \
-       typeof(a) __a = (a);                    \
-       typeof(b) __b = (b);                    \
-       (void) (&__a == &__b);                  \
-       __a > __b ? (__a - __b) : (__b - __a); })
-
-struct hsw_wrpll_rnp {
-       unsigned p, n2, r2;
-};
-
-static unsigned hsw_wrpll_get_budget_for_freq(int clock)
-{
-       unsigned budget;
-
-       switch (clock) {
-       case 25175000:
-       case 25200000:
-       case 27000000:
-       case 27027000:
-       case 37762500:
-       case 37800000:
-       case 40500000:
-       case 40541000:
-       case 54000000:
-       case 54054000:
-       case 59341000:
-       case 59400000:
-       case 72000000:
-       case 74176000:
-       case 74250000:
-       case 81000000:
-       case 81081000:
-       case 89012000:
-       case 89100000:
-       case 108000000:
-       case 108108000:
-       case 111264000:
-       case 111375000:
-       case 148352000:
-       case 148500000:
-       case 162000000:
-       case 162162000:
-       case 222525000:
-       case 222750000:
-       case 296703000:
-       case 297000000:
-               budget = 0;
-               break;
-       case 233500000:
-       case 245250000:
-       case 247750000:
-       case 253250000:
-       case 298000000:
-               budget = 1500;
-               break;
-       case 169128000:
-       case 169500000:
-       case 179500000:
-       case 202000000:
-               budget = 2000;
-               break;
-       case 256250000:
-       case 262500000:
-       case 270000000:
-       case 272500000:
-       case 273750000:
-       case 280750000:
-       case 281250000:
-       case 286000000:
-       case 291750000:
-               budget = 4000;
-               break;
-       case 267250000:
-       case 268500000:
-               budget = 5000;
-               break;
-       default:
-               budget = 1000;
-               break;
-       }
-
-       return budget;
-}
-
-static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
-                                unsigned r2, unsigned n2, unsigned p,
-                                struct hsw_wrpll_rnp *best)
-{
-       uint64_t a, b, c, d, diff, diff_best;
-
-       /* No best (r,n,p) yet */
-       if (best->p == 0) {
-               best->p = p;
-               best->n2 = n2;
-               best->r2 = r2;
-               return;
-       }
-
-       /*
-        * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
-        * freq2k.
-        *
-        * delta = 1e6 *
-        *         abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
-        *         freq2k;
-        *
-        * and we would like delta <= budget.
-        *
-        * If the discrepancy is above the PPM-based budget, always prefer to
-        * improve upon the previous solution.  However, if you're within the
-        * budget, try to maximize Ref * VCO, that is N / (P * R^2).
-        */
-       a = freq2k * budget * p * r2;
-       b = freq2k * budget * best->p * best->r2;
-       diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
-       diff_best = abs_diff(freq2k * best->p * best->r2,
-                            LC_FREQ_2K * best->n2);
-       c = 1000000 * diff;
-       d = 1000000 * diff_best;
-
-       if (a < c && b < d) {
-               /* If both are above the budget, pick the closer */
-               if (best->p * best->r2 * diff < p * r2 * diff_best) {
-                       best->p = p;
-                       best->n2 = n2;
-                       best->r2 = r2;
-               }
-       } else if (a >= c && b < d) {
-               /* If A is below the threshold but B is above it?  Update. */
-               best->p = p;
-               best->n2 = n2;
-               best->r2 = r2;
-       } else if (a >= c && b >= d) {
-               /* Both are below the limit, so pick the higher n2/(r2*r2) */
-               if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
-                       best->p = p;
-                       best->n2 = n2;
-                       best->r2 = r2;
-               }
-       }
-       /* Otherwise a < c && b >= d, do nothing */
-}
 
 static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
                                   i915_reg_t reg)
@@ -1147,363 +993,20 @@ void intel_ddi_clock_get(struct intel_encoder *encoder,
                bxt_ddi_clock_get(encoder, pipe_config);
 }
 
-static void
-hsw_ddi_calculate_wrpll(int clock /* in Hz */,
-                       unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
-{
-       uint64_t freq2k;
-       unsigned p, n2, r2;
-       struct hsw_wrpll_rnp best = { 0, 0, 0 };
-       unsigned budget;
-
-       freq2k = clock / 100;
-
-       budget = hsw_wrpll_get_budget_for_freq(clock);
-
-       /* Special case handling for 540 pixel clock: bypass WR PLL entirely
-        * and directly pass the LC PLL to it. */
-       if (freq2k == 5400000) {
-               *n2_out = 2;
-               *p_out = 1;
-               *r2_out = 2;
-               return;
-       }
-
-       /*
-        * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
-        * the WR PLL.
-        *
-        * We want R so that REF_MIN <= Ref <= REF_MAX.
-        * Injecting R2 = 2 * R gives:
-        *   REF_MAX * r2 > LC_FREQ * 2 and
-        *   REF_MIN * r2 < LC_FREQ * 2
-        *
-        * Which means the desired boundaries for r2 are:
-        *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
-        *
-        */
-       for (r2 = LC_FREQ * 2 / REF_MAX + 1;
-            r2 <= LC_FREQ * 2 / REF_MIN;
-            r2++) {
-
-               /*
-                * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
-                *
-                * Once again we want VCO_MIN <= VCO <= VCO_MAX.
-                * Injecting R2 = 2 * R and N2 = 2 * N, we get:
-                *   VCO_MAX * r2 > n2 * LC_FREQ and
-                *   VCO_MIN * r2 < n2 * LC_FREQ)
-                *
-                * Which means the desired boundaries for n2 are:
-                * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
-                */
-               for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
-                    n2 <= VCO_MAX * r2 / LC_FREQ;
-                    n2++) {
-
-                       for (p = P_MIN; p <= P_MAX; p += P_INC)
-                               hsw_wrpll_update_rnp(freq2k, budget,
-                                                    r2, n2, p, &best);
-               }
-       }
-
-       *n2_out = best.n2;
-       *p_out = best.p;
-       *r2_out = best.r2;
-}
-
 static bool
 hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
                   struct intel_crtc_state *crtc_state,
                   struct intel_encoder *intel_encoder)
 {
-       int clock = crtc_state->port_clock;
-
-       if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
-               struct intel_shared_dpll *pll;
-               uint32_t val;
-               unsigned p, n2, r2;
-
-               hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
-
-               val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
-                     WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
-                     WRPLL_DIVIDER_POST(p);
-
-               memset(&crtc_state->dpll_hw_state, 0,
-                      sizeof(crtc_state->dpll_hw_state));
-
-               crtc_state->dpll_hw_state.wrpll = val;
-
-               pll = intel_get_shared_dpll(intel_crtc, crtc_state);
-               if (pll == NULL) {
-                       DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
-                                        pipe_name(intel_crtc->pipe));
-                       return false;
-               }
-
-               crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
-       } else if (crtc_state->ddi_pll_sel == PORT_CLK_SEL_SPLL) {
-               struct drm_atomic_state *state = crtc_state->base.state;
-               struct intel_shared_dpll_config *spll =
-                       &intel_atomic_get_shared_dpll_state(state)[DPLL_ID_SPLL];
-
-               if (spll->crtc_mask &&
-                   WARN_ON(spll->hw_state.spll != crtc_state->dpll_hw_state.spll))
-                       return false;
-
-               crtc_state->shared_dpll = DPLL_ID_SPLL;
-               spll->hw_state.spll = crtc_state->dpll_hw_state.spll;
-               spll->crtc_mask |= 1 << intel_crtc->pipe;
-       }
-
-       return true;
-}
-
-struct skl_wrpll_context {
-       uint64_t min_deviation;         /* current minimal deviation */
-       uint64_t central_freq;          /* chosen central freq */
-       uint64_t dco_freq;              /* chosen dco freq */
-       unsigned int p;                 /* chosen divider */
-};
-
-static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
-{
-       memset(ctx, 0, sizeof(*ctx));
-
-       ctx->min_deviation = U64_MAX;
-}
-
-/* DCO freq must be within +1%/-6%  of the DCO central freq */
-#define SKL_DCO_MAX_PDEVIATION 100
-#define SKL_DCO_MAX_NDEVIATION 600
-
-static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
-                                 uint64_t central_freq,
-                                 uint64_t dco_freq,
-                                 unsigned int divider)
-{
-       uint64_t deviation;
-
-       deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
-                             central_freq);
-
-       /* positive deviation */
-       if (dco_freq >= central_freq) {
-               if (deviation < SKL_DCO_MAX_PDEVIATION &&
-                   deviation < ctx->min_deviation) {
-                       ctx->min_deviation = deviation;
-                       ctx->central_freq = central_freq;
-                       ctx->dco_freq = dco_freq;
-                       ctx->p = divider;
-               }
-       /* negative deviation */
-       } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
-                  deviation < ctx->min_deviation) {
-               ctx->min_deviation = deviation;
-               ctx->central_freq = central_freq;
-               ctx->dco_freq = dco_freq;
-               ctx->p = divider;
-       }
-}
-
-static void skl_wrpll_get_multipliers(unsigned int p,
-                                     unsigned int *p0 /* out */,
-                                     unsigned int *p1 /* out */,
-                                     unsigned int *p2 /* out */)
-{
-       /* even dividers */
-       if (p % 2 == 0) {
-               unsigned int half = p / 2;
-
-               if (half == 1 || half == 2 || half == 3 || half == 5) {
-                       *p0 = 2;
-                       *p1 = 1;
-                       *p2 = half;
-               } else if (half % 2 == 0) {
-                       *p0 = 2;
-                       *p1 = half / 2;
-                       *p2 = 2;
-               } else if (half % 3 == 0) {
-                       *p0 = 3;
-                       *p1 = half / 3;
-                       *p2 = 2;
-               } else if (half % 7 == 0) {
-                       *p0 = 7;
-                       *p1 = half / 7;
-                       *p2 = 2;
-               }
-       } else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
-               *p0 = 3;
-               *p1 = 1;
-               *p2 = p / 3;
-       } else if (p == 5 || p == 7) {
-               *p0 = p;
-               *p1 = 1;
-               *p2 = 1;
-       } else if (p == 15) {
-               *p0 = 3;
-               *p1 = 1;
-               *p2 = 5;
-       } else if (p == 21) {
-               *p0 = 7;
-               *p1 = 1;
-               *p2 = 3;
-       } else if (p == 35) {
-               *p0 = 7;
-               *p1 = 1;
-               *p2 = 5;
-       }
-}
-
-struct skl_wrpll_params {
-       uint32_t        dco_fraction;
-       uint32_t        dco_integer;
-       uint32_t        qdiv_ratio;
-       uint32_t        qdiv_mode;
-       uint32_t        kdiv;
-       uint32_t        pdiv;
-       uint32_t        central_freq;
-};
-
-static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
-                                     uint64_t afe_clock,
-                                     uint64_t central_freq,
-                                     uint32_t p0, uint32_t p1, uint32_t p2)
-{
-       uint64_t dco_freq;
-
-       switch (central_freq) {
-       case 9600000000ULL:
-               params->central_freq = 0;
-               break;
-       case 9000000000ULL:
-               params->central_freq = 1;
-               break;
-       case 8400000000ULL:
-               params->central_freq = 3;
-       }
-
-       switch (p0) {
-       case 1:
-               params->pdiv = 0;
-               break;
-       case 2:
-               params->pdiv = 1;
-               break;
-       case 3:
-               params->pdiv = 2;
-               break;
-       case 7:
-               params->pdiv = 4;
-               break;
-       default:
-               WARN(1, "Incorrect PDiv\n");
-       }
-
-       switch (p2) {
-       case 5:
-               params->kdiv = 0;
-               break;
-       case 2:
-               params->kdiv = 1;
-               break;
-       case 3:
-               params->kdiv = 2;
-               break;
-       case 1:
-               params->kdiv = 3;
-               break;
-       default:
-               WARN(1, "Incorrect KDiv\n");
-       }
-
-       params->qdiv_ratio = p1;
-       params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
-
-       dco_freq = p0 * p1 * p2 * afe_clock;
-
-       /*
-        * Intermediate values are in Hz.
-        * Divide by MHz to match bsepc
-        */
-       params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
-       params->dco_fraction =
-               div_u64((div_u64(dco_freq, 24) -
-                        params->dco_integer * MHz(1)) * 0x8000, MHz(1));
-}
-
-static bool
-skl_ddi_calculate_wrpll(int clock /* in Hz */,
-                       struct skl_wrpll_params *wrpll_params)
-{
-       uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
-       uint64_t dco_central_freq[3] = {8400000000ULL,
-                                       9000000000ULL,
-                                       9600000000ULL};
-       static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
-                                            24, 28, 30, 32, 36, 40, 42, 44,
-                                            48, 52, 54, 56, 60, 64, 66, 68,
-                                            70, 72, 76, 78, 80, 84, 88, 90,
-                                            92, 96, 98 };
-       static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
-       static const struct {
-               const int *list;
-               int n_dividers;
-       } dividers[] = {
-               { even_dividers, ARRAY_SIZE(even_dividers) },
-               { odd_dividers, ARRAY_SIZE(odd_dividers) },
-       };
-       struct skl_wrpll_context ctx;
-       unsigned int dco, d, i;
-       unsigned int p0, p1, p2;
-
-       skl_wrpll_context_init(&ctx);
-
-       for (d = 0; d < ARRAY_SIZE(dividers); d++) {
-               for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
-                       for (i = 0; i < dividers[d].n_dividers; i++) {
-                               unsigned int p = dividers[d].list[i];
-                               uint64_t dco_freq = p * afe_clock;
-
-                               skl_wrpll_try_divider(&ctx,
-                                                     dco_central_freq[dco],
-                                                     dco_freq,
-                                                     p);
-                               /*
-                                * Skip the remaining dividers if we're sure to
-                                * have found the definitive divider, we can't
-                                * improve a 0 deviation.
-                                */
-                               if (ctx.min_deviation == 0)
-                                       goto skip_remaining_dividers;
-                       }
-               }
-
-skip_remaining_dividers:
-               /*
-                * If a solution is found with an even divider, prefer
-                * this one.
-                */
-               if (d == 0 && ctx.p)
-                       break;
-       }
-
-       if (!ctx.p) {
-               DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
-               return false;
-       }
+       struct intel_shared_dpll *pll;
 
-       /*
-        * gcc incorrectly analyses that these can be used without being
-        * initialized. To be fair, it's hard to guess.
-        */
-       p0 = p1 = p2 = 0;
-       skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
-       skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
-                                 p0, p1, p2);
+       pll = intel_get_shared_dpll(intel_crtc, crtc_state,
+                                   intel_encoder);
+       if (!pll)
+               DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
+                                pipe_name(intel_crtc->pipe));
 
-       return true;
+       return pll;
 }
 
 static bool
@@ -1512,218 +1015,23 @@ skl_ddi_pll_select(struct intel_crtc *intel_crtc,
                   struct intel_encoder *intel_encoder)
 {
        struct intel_shared_dpll *pll;
-       uint32_t ctrl1, cfgcr1, cfgcr2;
-       int clock = crtc_state->port_clock;
-
-       /*
-        * See comment in intel_dpll_hw_state to understand why we always use 0
-        * as the DPLL id in this function.
-        */
-
-       ctrl1 = DPLL_CTRL1_OVERRIDE(0);
-
-       if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
-               struct skl_wrpll_params wrpll_params = { 0, };
-
-               ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
-
-               if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
-                       return false;
-
-               cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
-                        DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
-                        wrpll_params.dco_integer;
-
-               cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
-                        DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
-                        DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
-                        DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
-                        wrpll_params.central_freq;
-       } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
-                  intel_encoder->type == INTEL_OUTPUT_DP_MST) {
-               switch (crtc_state->port_clock / 2) {
-               case 81000:
-                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
-                       break;
-               case 135000:
-                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
-                       break;
-               case 270000:
-                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
-                       break;
-               }
-
-               cfgcr1 = cfgcr2 = 0;
-       } else if (intel_encoder->type == INTEL_OUTPUT_EDP) {
-               return true;
-       } else
-               return false;
 
-       memset(&crtc_state->dpll_hw_state, 0,
-              sizeof(crtc_state->dpll_hw_state));
-
-       crtc_state->dpll_hw_state.ctrl1 = ctrl1;
-       crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
-       crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
-
-       pll = intel_get_shared_dpll(intel_crtc, crtc_state);
+       pll = intel_get_shared_dpll(intel_crtc, crtc_state, intel_encoder);
        if (pll == NULL) {
                DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
                                 pipe_name(intel_crtc->pipe));
                return false;
        }
 
-       /* shared DPLL id 0 is DPLL 1 */
-       crtc_state->ddi_pll_sel = pll->id + 1;
-
        return true;
 }
 
-/* bxt clock parameters */
-struct bxt_clk_div {
-       int clock;
-       uint32_t p1;
-       uint32_t p2;
-       uint32_t m2_int;
-       uint32_t m2_frac;
-       bool m2_frac_en;
-       uint32_t n;
-};
-
-/* pre-calculated values for DP linkrates */
-static const struct bxt_clk_div bxt_dp_clk_val[] = {
-       {162000, 4, 2, 32, 1677722, 1, 1},
-       {270000, 4, 1, 27,       0, 0, 1},
-       {540000, 2, 1, 27,       0, 0, 1},
-       {216000, 3, 2, 32, 1677722, 1, 1},
-       {243000, 4, 1, 24, 1258291, 1, 1},
-       {324000, 4, 1, 32, 1677722, 1, 1},
-       {432000, 3, 1, 32, 1677722, 1, 1}
-};
-
 static bool
 bxt_ddi_pll_select(struct intel_crtc *intel_crtc,
                   struct intel_crtc_state *crtc_state,
                   struct intel_encoder *intel_encoder)
 {
-       struct intel_shared_dpll *pll;
-       struct bxt_clk_div clk_div = {0};
-       int vco = 0;
-       uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
-       uint32_t lanestagger;
-       int clock = crtc_state->port_clock;
-
-       if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
-               intel_clock_t best_clock;
-
-               /* Calculate HDMI div */
-               /*
-                * FIXME: tie the following calculation into
-                * i9xx_crtc_compute_clock
-                */
-               if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
-                       DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
-                                        clock, pipe_name(intel_crtc->pipe));
-                       return false;
-               }
-
-               clk_div.p1 = best_clock.p1;
-               clk_div.p2 = best_clock.p2;
-               WARN_ON(best_clock.m1 != 2);
-               clk_div.n = best_clock.n;
-               clk_div.m2_int = best_clock.m2 >> 22;
-               clk_div.m2_frac = best_clock.m2 & ((1 << 22) - 1);
-               clk_div.m2_frac_en = clk_div.m2_frac != 0;
-
-               vco = best_clock.vco;
-       } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
-                       intel_encoder->type == INTEL_OUTPUT_EDP) {
-               int i;
-
-               clk_div = bxt_dp_clk_val[0];
-               for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
-                       if (bxt_dp_clk_val[i].clock == clock) {
-                               clk_div = bxt_dp_clk_val[i];
-                               break;
-                       }
-               }
-               vco = clock * 10 / 2 * clk_div.p1 * clk_div.p2;
-       }
-
-       if (vco >= 6200000 && vco <= 6700000) {
-               prop_coef = 4;
-               int_coef = 9;
-               gain_ctl = 3;
-               targ_cnt = 8;
-       } else if ((vco > 5400000 && vco < 6200000) ||
-                       (vco >= 4800000 && vco < 5400000)) {
-               prop_coef = 5;
-               int_coef = 11;
-               gain_ctl = 3;
-               targ_cnt = 9;
-       } else if (vco == 5400000) {
-               prop_coef = 3;
-               int_coef = 8;
-               gain_ctl = 1;
-               targ_cnt = 9;
-       } else {
-               DRM_ERROR("Invalid VCO\n");
-               return false;
-       }
-
-       memset(&crtc_state->dpll_hw_state, 0,
-              sizeof(crtc_state->dpll_hw_state));
-
-       if (clock > 270000)
-               lanestagger = 0x18;
-       else if (clock > 135000)
-               lanestagger = 0x0d;
-       else if (clock > 67000)
-               lanestagger = 0x07;
-       else if (clock > 33000)
-               lanestagger = 0x04;
-       else
-               lanestagger = 0x02;
-
-       crtc_state->dpll_hw_state.ebb0 =
-               PORT_PLL_P1(clk_div.p1) | PORT_PLL_P2(clk_div.p2);
-       crtc_state->dpll_hw_state.pll0 = clk_div.m2_int;
-       crtc_state->dpll_hw_state.pll1 = PORT_PLL_N(clk_div.n);
-       crtc_state->dpll_hw_state.pll2 = clk_div.m2_frac;
-
-       if (clk_div.m2_frac_en)
-               crtc_state->dpll_hw_state.pll3 =
-                       PORT_PLL_M2_FRAC_ENABLE;
-
-       crtc_state->dpll_hw_state.pll6 =
-               prop_coef | PORT_PLL_INT_COEFF(int_coef);
-       crtc_state->dpll_hw_state.pll6 |=
-               PORT_PLL_GAIN_CTL(gain_ctl);
-
-       crtc_state->dpll_hw_state.pll8 = targ_cnt;
-
-       crtc_state->dpll_hw_state.pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
-
-       crtc_state->dpll_hw_state.pll10 =
-               PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
-               | PORT_PLL_DCO_AMP_OVR_EN_H;
-
-       crtc_state->dpll_hw_state.ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
-
-       crtc_state->dpll_hw_state.pcsdw12 =
-               LANESTAGGER_STRAP_OVRD | lanestagger;
-
-       pll = intel_get_shared_dpll(intel_crtc, crtc_state);
-       if (pll == NULL) {
-               DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
-                       pipe_name(intel_crtc->pipe));
-               return false;
-       }
-
-       /* shared DPLL id 0 is DPLL A */
-       crtc_state->ddi_pll_sel = pll->id;
-
-       return true;
+       return !!intel_get_shared_dpll(intel_crtc, crtc_state, intel_encoder);
 }
 
 /*
@@ -1761,6 +1069,8 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
        uint32_t temp;
 
        if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
+               WARN_ON(transcoder_is_dsi(cpu_transcoder));
+
                temp = TRANS_MSA_SYNC_CLK;
                switch (intel_crtc->config->pipe_bpp) {
                case 18:
@@ -2129,7 +1439,7 @@ static void bxt_ddi_vswing_sequence(struct drm_i915_private *dev_priv,
        u32 n_entries, i;
        uint32_t val;
 
-       if (type == INTEL_OUTPUT_EDP && dev_priv->edp_low_vswing) {
+       if (type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.low_vswing) {
                n_entries = ARRAY_SIZE(bxt_ddi_translations_edp);
                ddi_translations = bxt_ddi_translations_edp;
        } else if (type == INTEL_OUTPUT_DISPLAYPORT
@@ -2267,24 +1577,6 @@ void intel_ddi_clk_select(struct intel_encoder *encoder,
                uint32_t dpll = pipe_config->ddi_pll_sel;
                uint32_t val;
 
-               /*
-                * DPLL0 is used for eDP and is the only "private" DPLL (as
-                * opposed to shared) on SKL
-                */
-               if (encoder->type == INTEL_OUTPUT_EDP) {
-                       WARN_ON(dpll != SKL_DPLL0);
-
-                       val = I915_READ(DPLL_CTRL1);
-
-                       val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
-                                DPLL_CTRL1_SSC(dpll) |
-                                DPLL_CTRL1_LINK_RATE_MASK(dpll));
-                       val |= pipe_config->dpll_hw_state.ctrl1 << (dpll * 6);
-
-                       I915_WRITE(DPLL_CTRL1, val);
-                       POSTING_READ(DPLL_CTRL1);
-               }
-
                /* DDI -> PLL mapping  */
                val = I915_READ(DPLL_CTRL2);
 
@@ -2438,251 +1730,101 @@ static void intel_disable_ddi(struct intel_encoder *intel_encoder)
        }
 }
 
-static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
-                              struct intel_shared_dpll *pll)
-{
-       I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
-       POSTING_READ(WRPLL_CTL(pll->id));
-       udelay(20);
-}
-
-static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
-                               struct intel_shared_dpll *pll)
-{
-       I915_WRITE(SPLL_CTL, pll->config.hw_state.spll);
-       POSTING_READ(SPLL_CTL);
-       udelay(20);
-}
-
-static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
-                                 struct intel_shared_dpll *pll)
+static bool broxton_phy_is_enabled(struct drm_i915_private *dev_priv,
+                                  enum dpio_phy phy)
 {
-       uint32_t val;
-
-       val = I915_READ(WRPLL_CTL(pll->id));
-       I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
-       POSTING_READ(WRPLL_CTL(pll->id));
-}
-
-static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
-                                struct intel_shared_dpll *pll)
-{
-       uint32_t val;
-
-       val = I915_READ(SPLL_CTL);
-       I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
-       POSTING_READ(SPLL_CTL);
-}
-
-static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
-                                      struct intel_shared_dpll *pll,
-                                      struct intel_dpll_hw_state *hw_state)
-{
-       uint32_t val;
-
-       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+       if (!(I915_READ(BXT_P_CR_GT_DISP_PWRON) & GT_DISPLAY_POWER_ON(phy)))
                return false;
 
-       val = I915_READ(WRPLL_CTL(pll->id));
-       hw_state->wrpll = val;
-
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
-
-       return val & WRPLL_PLL_ENABLE;
-}
-
-static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
-                                     struct intel_shared_dpll *pll,
-                                     struct intel_dpll_hw_state *hw_state)
-{
-       uint32_t val;
+       if ((I915_READ(BXT_PORT_CL1CM_DW0(phy)) &
+            (PHY_POWER_GOOD | PHY_RESERVED)) != PHY_POWER_GOOD) {
+               DRM_DEBUG_DRIVER("DDI PHY %d powered, but power hasn't settled\n",
+                                phy);
 
-       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
                return false;
+       }
 
-       val = I915_READ(SPLL_CTL);
-       hw_state->spll = val;
-
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
-
-       return val & SPLL_PLL_ENABLE;
-}
-
-
-static const char * const hsw_ddi_pll_names[] = {
-       "WRPLL 1",
-       "WRPLL 2",
-       "SPLL"
-};
+       if (phy == DPIO_PHY1 &&
+           !(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE)) {
+               DRM_DEBUG_DRIVER("DDI PHY 1 powered, but GRC isn't done\n");
 
-static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
-{
-       int i;
+               return false;
+       }
 
-       dev_priv->num_shared_dpll = 3;
+       if (!(I915_READ(BXT_PHY_CTL_FAMILY(phy)) & COMMON_RESET_DIS)) {
+               DRM_DEBUG_DRIVER("DDI PHY %d powered, but still in reset\n",
+                                phy);
 
-       for (i = 0; i < 2; i++) {
-               dev_priv->shared_dplls[i].id = i;
-               dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
-               dev_priv->shared_dplls[i].disable = hsw_ddi_wrpll_disable;
-               dev_priv->shared_dplls[i].enable = hsw_ddi_wrpll_enable;
-               dev_priv->shared_dplls[i].get_hw_state =
-                       hsw_ddi_wrpll_get_hw_state;
+               return false;
        }
 
-       /* SPLL is special, but needs to be initialized anyway.. */
-       dev_priv->shared_dplls[i].id = i;
-       dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
-       dev_priv->shared_dplls[i].disable = hsw_ddi_spll_disable;
-       dev_priv->shared_dplls[i].enable = hsw_ddi_spll_enable;
-       dev_priv->shared_dplls[i].get_hw_state = hsw_ddi_spll_get_hw_state;
-
+       return true;
 }
 
-static const char * const skl_ddi_pll_names[] = {
-       "DPLL 1",
-       "DPLL 2",
-       "DPLL 3",
-};
-
-struct skl_dpll_regs {
-       i915_reg_t ctl, cfgcr1, cfgcr2;
-};
-
-/* this array is indexed by the *shared* pll id */
-static const struct skl_dpll_regs skl_dpll_regs[3] = {
-       {
-               /* DPLL 1 */
-               .ctl = LCPLL2_CTL,
-               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
-               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
-       },
-       {
-               /* DPLL 2 */
-               .ctl = WRPLL_CTL(0),
-               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
-               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
-       },
-       {
-               /* DPLL 3 */
-               .ctl = WRPLL_CTL(1),
-               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
-               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
-       },
-};
-
-static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
-                              struct intel_shared_dpll *pll)
+static u32 broxton_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy)
 {
-       uint32_t val;
-       unsigned int dpll;
-       const struct skl_dpll_regs *regs = skl_dpll_regs;
-
-       /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
-       dpll = pll->id + 1;
-
-       val = I915_READ(DPLL_CTRL1);
-
-       val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
-                DPLL_CTRL1_LINK_RATE_MASK(dpll));
-       val |= pll->config.hw_state.ctrl1 << (dpll * 6);
-
-       I915_WRITE(DPLL_CTRL1, val);
-       POSTING_READ(DPLL_CTRL1);
-
-       I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
-       I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
-       POSTING_READ(regs[pll->id].cfgcr1);
-       POSTING_READ(regs[pll->id].cfgcr2);
+       u32 val = I915_READ(BXT_PORT_REF_DW6(phy));
 
-       /* the enable bit is always bit 31 */
-       I915_WRITE(regs[pll->id].ctl,
-                  I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
-
-       if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
-               DRM_ERROR("DPLL %d not locked\n", dpll);
+       return (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
 }
 
-static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
-                               struct intel_shared_dpll *pll)
+static void broxton_phy_wait_grc_done(struct drm_i915_private *dev_priv,
+                                     enum dpio_phy phy)
 {
-       const struct skl_dpll_regs *regs = skl_dpll_regs;
-
-       /* the enable bit is always bit 31 */
-       I915_WRITE(regs[pll->id].ctl,
-                  I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
-       POSTING_READ(regs[pll->id].ctl);
+       if (wait_for(I915_READ(BXT_PORT_REF_DW3(phy)) & GRC_DONE, 10))
+               DRM_ERROR("timeout waiting for PHY%d GRC\n", phy);
 }
 
-static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
-                                    struct intel_shared_dpll *pll,
-                                    struct intel_dpll_hw_state *hw_state)
-{
-       uint32_t val;
-       unsigned int dpll;
-       const struct skl_dpll_regs *regs = skl_dpll_regs;
-       bool ret;
+static bool broxton_phy_verify_state(struct drm_i915_private *dev_priv,
+                                    enum dpio_phy phy);
 
-       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
-               return false;
-
-       ret = false;
-
-       /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
-       dpll = pll->id + 1;
-
-       val = I915_READ(regs[pll->id].ctl);
-       if (!(val & LCPLL_PLL_ENABLE))
-               goto out;
-
-       val = I915_READ(DPLL_CTRL1);
-       hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
-
-       /* avoid reading back stale values if HDMI mode is not enabled */
-       if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
-               hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
-               hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
-       }
-       ret = true;
-
-out:
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+static void broxton_phy_init(struct drm_i915_private *dev_priv,
+                            enum dpio_phy phy)
+{
+       enum port port;
+       u32 ports, val;
 
-       return ret;
-}
+       if (broxton_phy_is_enabled(dev_priv, phy)) {
+               /* Still read out the GRC value for state verification */
+               if (phy == DPIO_PHY0)
+                       dev_priv->bxt_phy_grc = broxton_get_grc(dev_priv, phy);
 
-static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
-{
-       int i;
+               if (broxton_phy_verify_state(dev_priv, phy)) {
+                       DRM_DEBUG_DRIVER("DDI PHY %d already enabled, "
+                                        "won't reprogram it\n", phy);
 
-       dev_priv->num_shared_dpll = 3;
+                       return;
+               }
 
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               dev_priv->shared_dplls[i].id = i;
-               dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
-               dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
-               dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
-               dev_priv->shared_dplls[i].get_hw_state =
-                       skl_ddi_pll_get_hw_state;
+               DRM_DEBUG_DRIVER("DDI PHY %d enabled with invalid state, "
+                                "force reprogramming it\n", phy);
+       } else {
+               DRM_DEBUG_DRIVER("DDI PHY %d not enabled, enabling it\n", phy);
        }
-}
-
-static void broxton_phy_init(struct drm_i915_private *dev_priv,
-                            enum dpio_phy phy)
-{
-       enum port port;
-       uint32_t val;
 
        val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
        val |= GT_DISPLAY_POWER_ON(phy);
        I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
 
-       /* Considering 10ms timeout until BSpec is updated */
-       if (wait_for(I915_READ(BXT_PORT_CL1CM_DW0(phy)) & PHY_POWER_GOOD, 10))
+       /*
+        * The PHY registers start out inaccessible and respond to reads with
+        * all 1s.  Eventually they become accessible as they power up, then
+        * the reserved bit will give the default 0.  Poll on the reserved bit
+        * becoming 0 to find when the PHY is accessible.
+        * HW team confirmed that the time to reach phypowergood status is
+        * anywhere between 50 us and 100us.
+        */
+       if (wait_for_us(((I915_READ(BXT_PORT_CL1CM_DW0(phy)) &
+               (PHY_RESERVED | PHY_POWER_GOOD)) == PHY_POWER_GOOD), 100)) {
                DRM_ERROR("timeout during PHY%d power on\n", phy);
+       }
 
-       for (port =  (phy == DPIO_PHY0 ? PORT_B : PORT_A);
-            port <= (phy == DPIO_PHY0 ? PORT_C : PORT_A); port++) {
+       if (phy == DPIO_PHY0)
+               ports = BIT(PORT_B) | BIT(PORT_C);
+       else
+               ports = BIT(PORT_A);
+
+       for_each_port_masked(port, ports) {
                int lane;
 
                for (lane = 0; lane < 4; lane++) {
@@ -2730,6 +1872,9 @@ static void broxton_phy_init(struct drm_i915_private *dev_priv,
         * enabled.
         * TODO: port C is only connected on BXT-P, so on BXT0/1 we should
         * power down the second channel on PHY0 as well.
+        *
+        * FIXME: Clarify programming of the following, the register is
+        * read-only with bit 6 fixed at 0 at least in stepping A.
         */
        if (phy == DPIO_PHY1)
                val |= OCL2_LDOFUSE_PWR_DIS;
@@ -2742,12 +1887,10 @@ static void broxton_phy_init(struct drm_i915_private *dev_priv,
                 * the corresponding calibrated value from PHY1, and disable
                 * the automatic calibration on PHY0.
                 */
-               if (wait_for(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE,
-                            10))
-                       DRM_ERROR("timeout waiting for PHY1 GRC\n");
+               broxton_phy_wait_grc_done(dev_priv, DPIO_PHY1);
 
-               val = I915_READ(BXT_PORT_REF_DW6(DPIO_PHY1));
-               val = (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
+               val = dev_priv->bxt_phy_grc = broxton_get_grc(dev_priv,
+                                                             DPIO_PHY1);
                grc_code = val << GRC_CODE_FAST_SHIFT |
                           val << GRC_CODE_SLOW_SHIFT |
                           val;
@@ -2757,17 +1900,27 @@ static void broxton_phy_init(struct drm_i915_private *dev_priv,
                val |= GRC_DIS | GRC_RDY_OVRD;
                I915_WRITE(BXT_PORT_REF_DW8(DPIO_PHY0), val);
        }
+       /*
+        * During PHY1 init delay waiting for GRC calibration to finish, since
+        * it can happen in parallel with the subsequent PHY0 init.
+        */
 
        val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
        val |= COMMON_RESET_DIS;
        I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
 }
 
-void broxton_ddi_phy_init(struct drm_device *dev)
+void broxton_ddi_phy_init(struct drm_i915_private *dev_priv)
 {
        /* Enable PHY1 first since it provides Rcomp for PHY0 */
-       broxton_phy_init(dev->dev_private, DPIO_PHY1);
-       broxton_phy_init(dev->dev_private, DPIO_PHY0);
+       broxton_phy_init(dev_priv, DPIO_PHY1);
+       broxton_phy_init(dev_priv, DPIO_PHY0);
+
+       /*
+        * If BIOS enabled only PHY0 and not PHY1, we skipped waiting for the
+        * PHY1 GRC calibration to finish, so wait for it here.
+        */
+       broxton_phy_wait_grc_done(dev_priv, DPIO_PHY1);
 }
 
 static void broxton_phy_uninit(struct drm_i915_private *dev_priv,
@@ -2778,260 +1931,126 @@ static void broxton_phy_uninit(struct drm_i915_private *dev_priv,
        val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
        val &= ~COMMON_RESET_DIS;
        I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
+
+       val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
+       val &= ~GT_DISPLAY_POWER_ON(phy);
+       I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
 }
 
-void broxton_ddi_phy_uninit(struct drm_device *dev)
+void broxton_ddi_phy_uninit(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
        broxton_phy_uninit(dev_priv, DPIO_PHY1);
        broxton_phy_uninit(dev_priv, DPIO_PHY0);
-
-       /* FIXME: do this in broxton_phy_uninit per phy */
-       I915_WRITE(BXT_P_CR_GT_DISP_PWRON, 0);
 }
 
-static const char * const bxt_ddi_pll_names[] = {
-       "PORT PLL A",
-       "PORT PLL B",
-       "PORT PLL C",
-};
-
-static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
-                               struct intel_shared_dpll *pll)
+static bool __printf(6, 7)
+__phy_reg_verify_state(struct drm_i915_private *dev_priv, enum dpio_phy phy,
+                      i915_reg_t reg, u32 mask, u32 expected,
+                      const char *reg_fmt, ...)
 {
-       uint32_t temp;
-       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
-
-       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
-       temp &= ~PORT_PLL_REF_SEL;
-       /* Non-SSC reference */
-       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
-
-       /* Disable 10 bit clock */
-       temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
-       temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
-       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
-
-       /* Write P1 & P2 */
-       temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
-       temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
-       temp |= pll->config.hw_state.ebb0;
-       I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
-
-       /* Write M2 integer */
-       temp = I915_READ(BXT_PORT_PLL(port, 0));
-       temp &= ~PORT_PLL_M2_MASK;
-       temp |= pll->config.hw_state.pll0;
-       I915_WRITE(BXT_PORT_PLL(port, 0), temp);
-
-       /* Write N */
-       temp = I915_READ(BXT_PORT_PLL(port, 1));
-       temp &= ~PORT_PLL_N_MASK;
-       temp |= pll->config.hw_state.pll1;
-       I915_WRITE(BXT_PORT_PLL(port, 1), temp);
-
-       /* Write M2 fraction */
-       temp = I915_READ(BXT_PORT_PLL(port, 2));
-       temp &= ~PORT_PLL_M2_FRAC_MASK;
-       temp |= pll->config.hw_state.pll2;
-       I915_WRITE(BXT_PORT_PLL(port, 2), temp);
-
-       /* Write M2 fraction enable */
-       temp = I915_READ(BXT_PORT_PLL(port, 3));
-       temp &= ~PORT_PLL_M2_FRAC_ENABLE;
-       temp |= pll->config.hw_state.pll3;
-       I915_WRITE(BXT_PORT_PLL(port, 3), temp);
-
-       /* Write coeff */
-       temp = I915_READ(BXT_PORT_PLL(port, 6));
-       temp &= ~PORT_PLL_PROP_COEFF_MASK;
-       temp &= ~PORT_PLL_INT_COEFF_MASK;
-       temp &= ~PORT_PLL_GAIN_CTL_MASK;
-       temp |= pll->config.hw_state.pll6;
-       I915_WRITE(BXT_PORT_PLL(port, 6), temp);
-
-       /* Write calibration val */
-       temp = I915_READ(BXT_PORT_PLL(port, 8));
-       temp &= ~PORT_PLL_TARGET_CNT_MASK;
-       temp |= pll->config.hw_state.pll8;
-       I915_WRITE(BXT_PORT_PLL(port, 8), temp);
-
-       temp = I915_READ(BXT_PORT_PLL(port, 9));
-       temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
-       temp |= pll->config.hw_state.pll9;
-       I915_WRITE(BXT_PORT_PLL(port, 9), temp);
-
-       temp = I915_READ(BXT_PORT_PLL(port, 10));
-       temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
-       temp &= ~PORT_PLL_DCO_AMP_MASK;
-       temp |= pll->config.hw_state.pll10;
-       I915_WRITE(BXT_PORT_PLL(port, 10), temp);
-
-       /* Recalibrate with new settings */
-       temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
-       temp |= PORT_PLL_RECALIBRATE;
-       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
-       temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
-       temp |= pll->config.hw_state.ebb4;
-       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
-
-       /* Enable PLL */
-       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
-       temp |= PORT_PLL_ENABLE;
-       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
-       POSTING_READ(BXT_PORT_PLL_ENABLE(port));
-
-       if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
-                       PORT_PLL_LOCK), 200))
-               DRM_ERROR("PLL %d not locked\n", port);
-
-       /*
-        * While we write to the group register to program all lanes at once we
-        * can read only lane registers and we pick lanes 0/1 for that.
-        */
-       temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
-       temp &= ~LANE_STAGGER_MASK;
-       temp &= ~LANESTAGGER_STRAP_OVRD;
-       temp |= pll->config.hw_state.pcsdw12;
-       I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
-}
-
-static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
-                                       struct intel_shared_dpll *pll)
-{
-       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
-       uint32_t temp;
+       struct va_format vaf;
+       va_list args;
+       u32 val;
 
-       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
-       temp &= ~PORT_PLL_ENABLE;
-       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
-       POSTING_READ(BXT_PORT_PLL_ENABLE(port));
-}
+       val = I915_READ(reg);
+       if ((val & mask) == expected)
+               return true;
 
-static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
-                                       struct intel_shared_dpll *pll,
-                                       struct intel_dpll_hw_state *hw_state)
-{
-       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
-       uint32_t val;
-       bool ret;
+       va_start(args, reg_fmt);
+       vaf.fmt = reg_fmt;
+       vaf.va = &args;
 
-       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
-               return false;
+       DRM_DEBUG_DRIVER("DDI PHY %d reg %pV [%08x] state mismatch: "
+                        "current %08x, expected %08x (mask %08x)\n",
+                        phy, &vaf, reg.reg, val, (val & ~mask) | expected,
+                        mask);
 
-       ret = false;
+       va_end(args);
 
-       val = I915_READ(BXT_PORT_PLL_ENABLE(port));
-       if (!(val & PORT_PLL_ENABLE))
-               goto out;
+       return false;
+}
 
-       hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
-       hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
+static bool broxton_phy_verify_state(struct drm_i915_private *dev_priv,
+                                    enum dpio_phy phy)
+{
+       enum port port;
+       u32 ports;
+       uint32_t mask;
+       bool ok;
 
-       hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port));
-       hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
+#define _CHK(reg, mask, exp, fmt, ...)                                 \
+       __phy_reg_verify_state(dev_priv, phy, reg, mask, exp, fmt,      \
+                              ## __VA_ARGS__)
 
-       hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
-       hw_state->pll0 &= PORT_PLL_M2_MASK;
+       /* We expect the PHY to be always enabled */
+       if (!broxton_phy_is_enabled(dev_priv, phy))
+               return false;
 
-       hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
-       hw_state->pll1 &= PORT_PLL_N_MASK;
+       ok = true;
 
-       hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
-       hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
+       if (phy == DPIO_PHY0)
+               ports = BIT(PORT_B) | BIT(PORT_C);
+       else
+               ports = BIT(PORT_A);
 
-       hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
-       hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
+       for_each_port_masked(port, ports) {
+               int lane;
 
-       hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
-       hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
-                         PORT_PLL_INT_COEFF_MASK |
-                         PORT_PLL_GAIN_CTL_MASK;
+               for (lane = 0; lane < 4; lane++)
+                       ok &= _CHK(BXT_PORT_TX_DW14_LN(port, lane),
+                                   LATENCY_OPTIM,
+                                   lane != 1 ? LATENCY_OPTIM : 0,
+                                   "BXT_PORT_TX_DW14_LN(%d, %d)", port, lane);
+       }
 
-       hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
-       hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
+       /* PLL Rcomp code offset */
+       ok &= _CHK(BXT_PORT_CL1CM_DW9(phy),
+                   IREF0RC_OFFSET_MASK, 0xe4 << IREF0RC_OFFSET_SHIFT,
+                   "BXT_PORT_CL1CM_DW9(%d)", phy);
+       ok &= _CHK(BXT_PORT_CL1CM_DW10(phy),
+                   IREF1RC_OFFSET_MASK, 0xe4 << IREF1RC_OFFSET_SHIFT,
+                   "BXT_PORT_CL1CM_DW10(%d)", phy);
 
-       hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9));
-       hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
+       /* Power gating */
+       mask = OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN | SUS_CLK_CONFIG;
+       ok &= _CHK(BXT_PORT_CL1CM_DW28(phy), mask, mask,
+                   "BXT_PORT_CL1CM_DW28(%d)", phy);
 
-       hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10));
-       hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
-                          PORT_PLL_DCO_AMP_MASK;
+       if (phy == DPIO_PHY0)
+               ok &= _CHK(BXT_PORT_CL2CM_DW6_BC,
+                          DW6_OLDO_DYN_PWR_DOWN_EN, DW6_OLDO_DYN_PWR_DOWN_EN,
+                          "BXT_PORT_CL2CM_DW6_BC");
 
        /*
-        * While we write to the group register to program all lanes at once we
-        * can read only lane registers. We configure all lanes the same way, so
-        * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
+        * TODO: Verify BXT_PORT_CL1CM_DW30 bit OCL2_LDOFUSE_PWR_DIS,
+        * at least on stepping A this bit is read-only and fixed at 0.
         */
-       hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
-       if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12)
-               DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
-                                hw_state->pcsdw12,
-                                I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
-       hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
-
-       ret = true;
 
-out:
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
-
-       return ret;
-}
-
-static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
-{
-       int i;
+       if (phy == DPIO_PHY0) {
+               u32 grc_code = dev_priv->bxt_phy_grc;
 
-       dev_priv->num_shared_dpll = 3;
+               grc_code = grc_code << GRC_CODE_FAST_SHIFT |
+                          grc_code << GRC_CODE_SLOW_SHIFT |
+                          grc_code;
+               mask = GRC_CODE_FAST_MASK | GRC_CODE_SLOW_MASK |
+                      GRC_CODE_NOM_MASK;
+               ok &= _CHK(BXT_PORT_REF_DW6(DPIO_PHY0), mask, grc_code,
+                           "BXT_PORT_REF_DW6(%d)", DPIO_PHY0);
 
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               dev_priv->shared_dplls[i].id = i;
-               dev_priv->shared_dplls[i].name = bxt_ddi_pll_names[i];
-               dev_priv->shared_dplls[i].disable = bxt_ddi_pll_disable;
-               dev_priv->shared_dplls[i].enable = bxt_ddi_pll_enable;
-               dev_priv->shared_dplls[i].get_hw_state =
-                       bxt_ddi_pll_get_hw_state;
+               mask = GRC_DIS | GRC_RDY_OVRD;
+               ok &= _CHK(BXT_PORT_REF_DW8(DPIO_PHY0), mask, mask,
+                           "BXT_PORT_REF_DW8(%d)", DPIO_PHY0);
        }
+
+       return ok;
+#undef _CHK
 }
 
-void intel_ddi_pll_init(struct drm_device *dev)
+void broxton_ddi_phy_verify_state(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       uint32_t val = I915_READ(LCPLL_CTL);
-
-       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
-               skl_shared_dplls_init(dev_priv);
-       else if (IS_BROXTON(dev))
-               bxt_shared_dplls_init(dev_priv);
-       else
-               hsw_shared_dplls_init(dev_priv);
-
-       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
-               int cdclk_freq;
-
-               cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
-               dev_priv->skl_boot_cdclk = cdclk_freq;
-               if (skl_sanitize_cdclk(dev_priv))
-                       DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
-               if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
-                       DRM_ERROR("LCPLL1 is disabled\n");
-       } else if (IS_BROXTON(dev)) {
-               broxton_init_cdclk(dev);
-               broxton_ddi_phy_init(dev);
-       } else {
-               /*
-                * The LCPLL register should be turned on by the BIOS. For now
-                * let's just check its state and print errors in case
-                * something is wrong.  Don't even try to turn it on.
-                */
-
-               if (val & LCPLL_CD_SOURCE_FCLK)
-                       DRM_ERROR("CDCLK source is not LCPLL\n");
-
-               if (val & LCPLL_PLL_DISABLE)
-                       DRM_ERROR("LCPLL is disabled\n");
-       }
+       if (!broxton_phy_verify_state(dev_priv, DPIO_PHY0) ||
+           !broxton_phy_verify_state(dev_priv, DPIO_PHY1))
+               i915_report_error(dev_priv, "DDI PHY state mismatch\n");
 }
 
 void intel_ddi_prepare_link_retrain(struct intel_dp *intel_dp)
@@ -3086,12 +2105,18 @@ void intel_ddi_fdi_disable(struct drm_crtc *crtc)
        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
        uint32_t val;
 
-       intel_ddi_post_disable(intel_encoder);
-
+       /*
+        * Bspec lists this as both step 13 (before DDI_BUF_CTL disable)
+        * and step 18 (after clearing PORT_CLK_SEL). Based on a BUN,
+        * step 13 is the correct place for it. Step 18 is where it was
+        * originally before the BUN.
+        */
        val = I915_READ(FDI_RX_CTL(PIPE_A));
        val &= ~FDI_RX_ENABLE;
        I915_WRITE(FDI_RX_CTL(PIPE_A), val);
 
+       intel_ddi_post_disable(intel_encoder);
+
        val = I915_READ(FDI_RX_MISC(PIPE_A));
        val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
        val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
@@ -3115,6 +2140,10 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
        struct intel_hdmi *intel_hdmi;
        u32 temp, flags = 0;
 
+       /* XXX: DSI transcoder paranoia */
+       if (WARN_ON(transcoder_is_dsi(cpu_transcoder)))
+               return;
+
        temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
        if (temp & TRANS_DDI_PHSYNC)
                flags |= DRM_MODE_FLAG_PHSYNC;
@@ -3172,8 +2201,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
                        pipe_config->has_audio = true;
        }
 
-       if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
-           pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
+       if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp.bpp &&
+           pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
                /*
                 * This is a big fat ugly hack.
                 *
@@ -3188,8 +2217,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
                 * load.
                 */
                DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
-                             pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
-               dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
+                             pipe_config->pipe_bpp, dev_priv->vbt.edp.bpp);
+               dev_priv->vbt.edp.bpp = pipe_config->pipe_bpp;
        }
 
        intel_ddi_clock_get(encoder, pipe_config);
index 0104a06d01fd6617f54bedf68353935668eee45b..46f9be3ad5a20df846658558a430cdf80d6f56de 100644 (file)
@@ -36,6 +36,7 @@
 #include "intel_drv.h"
 #include <drm/i915_drm.h>
 #include "i915_drv.h"
+#include "intel_dsi.h"
 #include "i915_trace.h"
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
@@ -96,12 +97,13 @@ static int intel_framebuffer_init(struct drm_device *dev,
                                  struct drm_i915_gem_object *obj);
 static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc);
 static void intel_set_pipe_timings(struct intel_crtc *intel_crtc);
+static void intel_set_pipe_src_size(struct intel_crtc *intel_crtc);
 static void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
                                         struct intel_link_m_n *m_n,
                                         struct intel_link_m_n *m2_n2);
 static void ironlake_set_pipeconf(struct drm_crtc *crtc);
 static void haswell_set_pipeconf(struct drm_crtc *crtc);
-static void intel_set_pipe_csc(struct drm_crtc *crtc);
+static void haswell_set_pipemisc(struct drm_crtc *crtc);
 static void vlv_prepare_pll(struct intel_crtc *crtc,
                            const struct intel_crtc_state *pipe_config);
 static void chv_prepare_pll(struct intel_crtc *crtc,
@@ -110,13 +112,11 @@ static void intel_begin_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
 static void intel_finish_crtc_commit(struct drm_crtc *, struct drm_crtc_state *);
 static void skl_init_scalers(struct drm_device *dev, struct intel_crtc *intel_crtc,
        struct intel_crtc_state *crtc_state);
-static int i9xx_get_refclk(const struct intel_crtc_state *crtc_state,
-                          int num_connectors);
 static void skylake_pfit_enable(struct intel_crtc *crtc);
 static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force);
 static void ironlake_pfit_enable(struct intel_crtc *crtc);
 static void intel_modeset_setup_hw_state(struct drm_device *dev);
-static void intel_pre_disable_primary(struct drm_crtc *crtc);
+static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc);
 
 typedef struct {
        int     min, max;
@@ -147,15 +147,12 @@ static int valleyview_get_vco(struct drm_i915_private *dev_priv)
        return vco_freq[hpll_freq] * 1000;
 }
 
-static int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
-                                 const char *name, u32 reg)
+int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
+                     const char *name, u32 reg, int ref_freq)
 {
        u32 val;
        int divider;
 
-       if (dev_priv->hpll_freq == 0)
-               dev_priv->hpll_freq = valleyview_get_vco(dev_priv);
-
        mutex_lock(&dev_priv->sb_lock);
        val = vlv_cck_read(dev_priv, reg);
        mutex_unlock(&dev_priv->sb_lock);
@@ -166,52 +163,75 @@ static int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
             (divider << CCK_FREQUENCY_STATUS_SHIFT),
             "%s change in progress\n", name);
 
-       return DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, divider + 1);
+       return DIV_ROUND_CLOSEST(ref_freq << 1, divider + 1);
 }
 
-int
-intel_pch_rawclk(struct drm_device *dev)
+static int vlv_get_cck_clock_hpll(struct drm_i915_private *dev_priv,
+                                 const char *name, u32 reg)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       if (dev_priv->hpll_freq == 0)
+               dev_priv->hpll_freq = valleyview_get_vco(dev_priv);
 
-       WARN_ON(!HAS_PCH_SPLIT(dev));
+       return vlv_get_cck_clock(dev_priv, name, reg,
+                                dev_priv->hpll_freq);
+}
 
-       return I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK;
+static int
+intel_pch_rawclk(struct drm_i915_private *dev_priv)
+{
+       return (I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK) * 1000;
 }
 
-/* hrawclock is 1/4 the FSB frequency */
-int intel_hrawclk(struct drm_device *dev)
+static int
+intel_vlv_hrawclk(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       uint32_t clkcfg;
+       return vlv_get_cck_clock_hpll(dev_priv, "hrawclk",
+                                     CCK_DISPLAY_REF_CLOCK_CONTROL);
+}
 
-       /* There is no CLKCFG reg in Valleyview. VLV hrawclk is 200 MHz */
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
-               return 200;
+static int
+intel_g4x_hrawclk(struct drm_i915_private *dev_priv)
+{
+       uint32_t clkcfg;
 
+       /* hrawclock is 1/4 the FSB frequency */
        clkcfg = I915_READ(CLKCFG);
        switch (clkcfg & CLKCFG_FSB_MASK) {
        case CLKCFG_FSB_400:
-               return 100;
+               return 100000;
        case CLKCFG_FSB_533:
-               return 133;
+               return 133333;
        case CLKCFG_FSB_667:
-               return 166;
+               return 166667;
        case CLKCFG_FSB_800:
-               return 200;
+               return 200000;
        case CLKCFG_FSB_1067:
-               return 266;
+               return 266667;
        case CLKCFG_FSB_1333:
-               return 333;
+               return 333333;
        /* these two are just a guess; one of them might be right */
        case CLKCFG_FSB_1600:
        case CLKCFG_FSB_1600_ALT:
-               return 400;
+               return 400000;
        default:
-               return 133;
+               return 133333;
        }
 }
 
+static void intel_update_rawclk(struct drm_i915_private *dev_priv)
+{
+       if (HAS_PCH_SPLIT(dev_priv))
+               dev_priv->rawclk_freq = intel_pch_rawclk(dev_priv);
+       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
+               dev_priv->rawclk_freq = intel_vlv_hrawclk(dev_priv);
+       else if (IS_G4X(dev_priv) || IS_PINEVIEW(dev_priv))
+               dev_priv->rawclk_freq = intel_g4x_hrawclk(dev_priv);
+       else
+               return; /* no rawclk on other platforms, or no need to know it */
+
+       DRM_DEBUG_DRIVER("rawclk rate: %d kHz\n", dev_priv->rawclk_freq);
+}
+
 static void intel_update_czclk(struct drm_i915_private *dev_priv)
 {
        if (!(IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
@@ -224,13 +244,15 @@ static void intel_update_czclk(struct drm_i915_private *dev_priv)
 }
 
 static inline u32 /* units of 100MHz */
-intel_fdi_link_freq(struct drm_device *dev)
+intel_fdi_link_freq(struct drm_i915_private *dev_priv,
+                   const struct intel_crtc_state *pipe_config)
 {
-       if (IS_GEN5(dev)) {
-               struct drm_i915_private *dev_priv = dev->dev_private;
-               return (I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2;
-       } else
-               return 27;
+       if (HAS_DDI(dev_priv))
+               return pipe_config->port_clock; /* SPLL */
+       else if (IS_GEN5(dev_priv))
+               return ((I915_READ(FDI_PLL_BIOS_0) & FDI_PLL_FB_CLOCK_MASK) + 2) * 10000;
+       else
+               return 270000;
 }
 
 static const intel_limit_t intel_limits_i8xx_dac = {
@@ -550,89 +572,6 @@ static bool intel_pipe_will_have_type(const struct intel_crtc_state *crtc_state,
        return false;
 }
 
-static const intel_limit_t *
-intel_ironlake_limit(struct intel_crtc_state *crtc_state, int refclk)
-{
-       struct drm_device *dev = crtc_state->base.crtc->dev;
-       const intel_limit_t *limit;
-
-       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
-               if (intel_is_dual_link_lvds(dev)) {
-                       if (refclk == 100000)
-                               limit = &intel_limits_ironlake_dual_lvds_100m;
-                       else
-                               limit = &intel_limits_ironlake_dual_lvds;
-               } else {
-                       if (refclk == 100000)
-                               limit = &intel_limits_ironlake_single_lvds_100m;
-                       else
-                               limit = &intel_limits_ironlake_single_lvds;
-               }
-       } else
-               limit = &intel_limits_ironlake_dac;
-
-       return limit;
-}
-
-static const intel_limit_t *
-intel_g4x_limit(struct intel_crtc_state *crtc_state)
-{
-       struct drm_device *dev = crtc_state->base.crtc->dev;
-       const intel_limit_t *limit;
-
-       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
-               if (intel_is_dual_link_lvds(dev))
-                       limit = &intel_limits_g4x_dual_channel_lvds;
-               else
-                       limit = &intel_limits_g4x_single_channel_lvds;
-       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_HDMI) ||
-                  intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
-               limit = &intel_limits_g4x_hdmi;
-       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_SDVO)) {
-               limit = &intel_limits_g4x_sdvo;
-       } else /* The option is for other outputs */
-               limit = &intel_limits_i9xx_sdvo;
-
-       return limit;
-}
-
-static const intel_limit_t *
-intel_limit(struct intel_crtc_state *crtc_state, int refclk)
-{
-       struct drm_device *dev = crtc_state->base.crtc->dev;
-       const intel_limit_t *limit;
-
-       if (IS_BROXTON(dev))
-               limit = &intel_limits_bxt;
-       else if (HAS_PCH_SPLIT(dev))
-               limit = intel_ironlake_limit(crtc_state, refclk);
-       else if (IS_G4X(dev)) {
-               limit = intel_g4x_limit(crtc_state);
-       } else if (IS_PINEVIEW(dev)) {
-               if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS))
-                       limit = &intel_limits_pineview_lvds;
-               else
-                       limit = &intel_limits_pineview_sdvo;
-       } else if (IS_CHERRYVIEW(dev)) {
-               limit = &intel_limits_chv;
-       } else if (IS_VALLEYVIEW(dev)) {
-               limit = &intel_limits_vlv;
-       } else if (!IS_GEN2(dev)) {
-               if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS))
-                       limit = &intel_limits_i9xx_lvds;
-               else
-                       limit = &intel_limits_i9xx_sdvo;
-       } else {
-               if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS))
-                       limit = &intel_limits_i8xx_lvds;
-               else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_DVO))
-                       limit = &intel_limits_i8xx_dvo;
-               else
-                       limit = &intel_limits_i8xx_dac;
-       }
-       return limit;
-}
-
 /*
  * Platform specific helpers to calculate the port PLL loopback- (clock.m),
  * and post-divider (clock.p) values, pre- (clock.vco) and post-divided fast
@@ -763,6 +702,16 @@ i9xx_select_p2_div(const intel_limit_t *limit,
        }
 }
 
+/*
+ * Returns a set of divisors for the desired target clock with the given
+ * refclk, or FALSE.  The returned values represent the clock equation:
+ * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
+ *
+ * Target and reference clocks are specified in kHz.
+ *
+ * If match_clock is provided, then best_clock P divider must match the P
+ * divider from @match_clock used for LVDS downclocking.
+ */
 static bool
 i9xx_find_best_dpll(const intel_limit_t *limit,
                    struct intel_crtc_state *crtc_state,
@@ -810,6 +759,16 @@ i9xx_find_best_dpll(const intel_limit_t *limit,
        return (err != target);
 }
 
+/*
+ * Returns a set of divisors for the desired target clock with the given
+ * refclk, or FALSE.  The returned values represent the clock equation:
+ * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
+ *
+ * Target and reference clocks are specified in kHz.
+ *
+ * If match_clock is provided, then best_clock P divider must match the P
+ * divider from @match_clock used for LVDS downclocking.
+ */
 static bool
 pnv_find_best_dpll(const intel_limit_t *limit,
                   struct intel_crtc_state *crtc_state,
@@ -855,6 +814,16 @@ pnv_find_best_dpll(const intel_limit_t *limit,
        return (err != target);
 }
 
+/*
+ * Returns a set of divisors for the desired target clock with the given
+ * refclk, or FALSE.  The returned values represent the clock equation:
+ * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
+ *
+ * Target and reference clocks are specified in kHz.
+ *
+ * If match_clock is provided, then best_clock P divider must match the P
+ * divider from @match_clock used for LVDS downclocking.
+ */
 static bool
 g4x_find_best_dpll(const intel_limit_t *limit,
                   struct intel_crtc_state *crtc_state,
@@ -943,6 +912,11 @@ static bool vlv_PLL_is_optimal(struct drm_device *dev, int target_freq,
        return *error_ppm + 10 < best_error_ppm;
 }
 
+/*
+ * Returns a set of divisors for the desired target clock with the given
+ * refclk, or FALSE.  The returned values represent the clock equation:
+ * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
+ */
 static bool
 vlv_find_best_dpll(const intel_limit_t *limit,
                   struct intel_crtc_state *crtc_state,
@@ -997,6 +971,11 @@ vlv_find_best_dpll(const intel_limit_t *limit,
        return found;
 }
 
+/*
+ * Returns a set of divisors for the desired target clock with the given
+ * refclk, or FALSE.  The returned values represent the clock equation:
+ * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
+ */
 static bool
 chv_find_best_dpll(const intel_limit_t *limit,
                   struct intel_crtc_state *crtc_state,
@@ -1058,9 +1037,10 @@ chv_find_best_dpll(const intel_limit_t *limit,
 bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int target_clock,
                        intel_clock_t *best_clock)
 {
-       int refclk = i9xx_get_refclk(crtc_state, 0);
+       int refclk = 100000;
+       const intel_limit_t *limit = &intel_limits_bxt;
 
-       return chv_find_best_dpll(intel_limit(crtc_state, refclk), crtc_state,
+       return chv_find_best_dpll(limit, crtc_state,
                                  target_clock, refclk, NULL, best_clock);
 }
 
@@ -1165,7 +1145,7 @@ void assert_pll(struct drm_i915_private *dev_priv,
 }
 
 /* XXX: the dsi pll is shared between MIPI DSI ports */
-static void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
+void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
 {
        u32 val;
        bool cur_state;
@@ -1179,36 +1159,6 @@ static void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
             "DSI PLL state assertion failure (expected %s, current %s)\n",
                        onoff(state), onoff(cur_state));
 }
-#define assert_dsi_pll_enabled(d) assert_dsi_pll(d, true)
-#define assert_dsi_pll_disabled(d) assert_dsi_pll(d, false)
-
-struct intel_shared_dpll *
-intel_crtc_to_shared_dpll(struct intel_crtc *crtc)
-{
-       struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
-
-       if (crtc->config->shared_dpll < 0)
-               return NULL;
-
-       return &dev_priv->shared_dplls[crtc->config->shared_dpll];
-}
-
-/* For ILK+ */
-void assert_shared_dpll(struct drm_i915_private *dev_priv,
-                       struct intel_shared_dpll *pll,
-                       bool state)
-{
-       bool cur_state;
-       struct intel_dpll_hw_state hw_state;
-
-       if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
-               return;
-
-       cur_state = pll->get_hw_state(dev_priv, pll, &hw_state);
-       I915_STATE_WARN(cur_state != state,
-            "%s assertion failure (expected %s, current %s)\n",
-                       pll->name, onoff(state), onoff(cur_state));
-}
 
 static void assert_fdi_tx(struct drm_i915_private *dev_priv,
                          enum pipe pipe, bool state)
@@ -1217,7 +1167,7 @@ static void assert_fdi_tx(struct drm_i915_private *dev_priv,
        enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
                                                                      pipe);
 
-       if (HAS_DDI(dev_priv->dev)) {
+       if (HAS_DDI(dev_priv)) {
                /* DDI does not have a specific FDI_TX register */
                u32 val = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
                cur_state = !!(val & TRANS_DDI_FUNC_ENABLE);
@@ -1253,11 +1203,11 @@ static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
        u32 val;
 
        /* ILK FDI PLL is always enabled */
-       if (INTEL_INFO(dev_priv->dev)->gen == 5)
+       if (INTEL_INFO(dev_priv)->gen == 5)
                return;
 
        /* On Haswell, DDI ports are responsible for the FDI PLL setup */
-       if (HAS_DDI(dev_priv->dev))
+       if (HAS_DDI(dev_priv))
                return;
 
        val = I915_READ(FDI_TX_CTL(pipe));
@@ -1446,21 +1396,8 @@ static void assert_vblank_disabled(struct drm_crtc *crtc)
                drm_crtc_vblank_put(crtc);
 }
 
-static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
-{
-       u32 val;
-       bool enabled;
-
-       I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv->dev) || HAS_PCH_CPT(dev_priv->dev)));
-
-       val = I915_READ(PCH_DREF_CONTROL);
-       enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
-                           DREF_SUPERSPREAD_SOURCE_MASK));
-       I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
-}
-
-static void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
-                                          enum pipe pipe)
+void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
+                                   enum pipe pipe)
 {
        u32 val;
        bool enabled;
@@ -1478,11 +1415,11 @@ static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
        if ((val & DP_PORT_EN) == 0)
                return false;
 
-       if (HAS_PCH_CPT(dev_priv->dev)) {
+       if (HAS_PCH_CPT(dev_priv)) {
                u32 trans_dp_ctl = I915_READ(TRANS_DP_CTL(pipe));
                if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
                        return false;
-       } else if (IS_CHERRYVIEW(dev_priv->dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                if ((val & DP_PIPE_MASK_CHV) != DP_PIPE_SELECT_CHV(pipe))
                        return false;
        } else {
@@ -1498,10 +1435,10 @@ static bool hdmi_pipe_enabled(struct drm_i915_private *dev_priv,
        if ((val & SDVO_ENABLE) == 0)
                return false;
 
-       if (HAS_PCH_CPT(dev_priv->dev)) {
+       if (HAS_PCH_CPT(dev_priv)) {
                if ((val & SDVO_PIPE_SEL_MASK_CPT) != SDVO_PIPE_SEL_CPT(pipe))
                        return false;
-       } else if (IS_CHERRYVIEW(dev_priv->dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                if ((val & SDVO_PIPE_SEL_MASK_CHV) != SDVO_PIPE_SEL_CHV(pipe))
                        return false;
        } else {
@@ -1517,7 +1454,7 @@ static bool lvds_pipe_enabled(struct drm_i915_private *dev_priv,
        if ((val & LVDS_PORT_EN) == 0)
                return false;
 
-       if (HAS_PCH_CPT(dev_priv->dev)) {
+       if (HAS_PCH_CPT(dev_priv)) {
                if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
                        return false;
        } else {
@@ -1532,7 +1469,7 @@ static bool adpa_pipe_enabled(struct drm_i915_private *dev_priv,
 {
        if ((val & ADPA_DAC_ENABLE) == 0)
                return false;
-       if (HAS_PCH_CPT(dev_priv->dev)) {
+       if (HAS_PCH_CPT(dev_priv)) {
                if ((val & PORT_TRANS_SEL_MASK) != PORT_TRANS_SEL_CPT(pipe))
                        return false;
        } else {
@@ -1551,7 +1488,7 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
             "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
             i915_mmio_reg_offset(reg), pipe_name(pipe));
 
-       I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0
+       I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && (val & DP_PORT_EN) == 0
             && (val & DP_PIPEB_SELECT),
             "IBX PCH dp port still using transcoder B\n");
 }
@@ -1564,7 +1501,7 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
             "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
             i915_mmio_reg_offset(reg), pipe_name(pipe));
 
-       I915_STATE_WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_ENABLE) == 0
+       I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && (val & SDVO_ENABLE) == 0
             && (val & SDVO_PIPE_B_SELECT),
             "IBX PCH hdmi port still using transcoder B\n");
 }
@@ -1593,53 +1530,47 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
        assert_pch_hdmi_disabled(dev_priv, pipe, PCH_HDMID);
 }
 
+static void _vlv_enable_pll(struct intel_crtc *crtc,
+                           const struct intel_crtc_state *pipe_config)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum pipe pipe = crtc->pipe;
+
+       I915_WRITE(DPLL(pipe), pipe_config->dpll_hw_state.dpll);
+       POSTING_READ(DPLL(pipe));
+       udelay(150);
+
+       if (wait_for(((I915_READ(DPLL(pipe)) & DPLL_LOCK_VLV) == DPLL_LOCK_VLV), 1))
+               DRM_ERROR("DPLL %d failed to lock\n", pipe);
+}
+
 static void vlv_enable_pll(struct intel_crtc *crtc,
                           const struct intel_crtc_state *pipe_config)
 {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       i915_reg_t reg = DPLL(crtc->pipe);
-       u32 dpll = pipe_config->dpll_hw_state.dpll;
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum pipe pipe = crtc->pipe;
 
-       assert_pipe_disabled(dev_priv, crtc->pipe);
+       assert_pipe_disabled(dev_priv, pipe);
 
        /* PLL is protected by panel, make sure we can write it */
-       if (IS_MOBILE(dev_priv->dev))
-               assert_panel_unlocked(dev_priv, crtc->pipe);
-
-       I915_WRITE(reg, dpll);
-       POSTING_READ(reg);
-       udelay(150);
-
-       if (wait_for(((I915_READ(reg) & DPLL_LOCK_VLV) == DPLL_LOCK_VLV), 1))
-               DRM_ERROR("DPLL %d failed to lock\n", crtc->pipe);
+       assert_panel_unlocked(dev_priv, pipe);
 
-       I915_WRITE(DPLL_MD(crtc->pipe), pipe_config->dpll_hw_state.dpll_md);
-       POSTING_READ(DPLL_MD(crtc->pipe));
+       if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
+               _vlv_enable_pll(crtc, pipe_config);
 
-       /* We do this three times for luck */
-       I915_WRITE(reg, dpll);
-       POSTING_READ(reg);
-       udelay(150); /* wait for warmup */
-       I915_WRITE(reg, dpll);
-       POSTING_READ(reg);
-       udelay(150); /* wait for warmup */
-       I915_WRITE(reg, dpll);
-       POSTING_READ(reg);
-       udelay(150); /* wait for warmup */
+       I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
+       POSTING_READ(DPLL_MD(pipe));
 }
 
-static void chv_enable_pll(struct intel_crtc *crtc,
-                          const struct intel_crtc_state *pipe_config)
+
+static void _chv_enable_pll(struct intel_crtc *crtc,
+                           const struct intel_crtc_state *pipe_config)
 {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int pipe = crtc->pipe;
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum pipe pipe = crtc->pipe;
        enum dpio_channel port = vlv_pipe_to_channel(pipe);
        u32 tmp;
 
-       assert_pipe_disabled(dev_priv, crtc->pipe);
-
        mutex_lock(&dev_priv->sb_lock);
 
        /* Enable back the 10bit clock to display controller */
@@ -1660,10 +1591,43 @@ static void chv_enable_pll(struct intel_crtc *crtc,
        /* Check PLL is locked */
        if (wait_for(((I915_READ(DPLL(pipe)) & DPLL_LOCK_VLV) == DPLL_LOCK_VLV), 1))
                DRM_ERROR("PLL %d failed to lock\n", pipe);
+}
 
-       /* not sure when this should be written */
-       I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
-       POSTING_READ(DPLL_MD(pipe));
+static void chv_enable_pll(struct intel_crtc *crtc,
+                          const struct intel_crtc_state *pipe_config)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum pipe pipe = crtc->pipe;
+
+       assert_pipe_disabled(dev_priv, pipe);
+
+       /* PLL is protected by panel, make sure we can write it */
+       assert_panel_unlocked(dev_priv, pipe);
+
+       if (pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE)
+               _chv_enable_pll(crtc, pipe_config);
+
+       if (pipe != PIPE_A) {
+               /*
+                * WaPixelRepeatModeFixForC0:chv
+                *
+                * DPLLCMD is AWOL. Use chicken bits to propagate
+                * the value from DPLLBMD to either pipe B or C.
+                */
+               I915_WRITE(CBR4_VLV, pipe == PIPE_B ? CBR_DPLLBMD_PIPE_B : CBR_DPLLBMD_PIPE_C);
+               I915_WRITE(DPLL_MD(PIPE_B), pipe_config->dpll_hw_state.dpll_md);
+               I915_WRITE(CBR4_VLV, 0);
+               dev_priv->chv_dpll_md[pipe] = pipe_config->dpll_hw_state.dpll_md;
+
+               /*
+                * DPLLB VGA mode also seems to cause problems.
+                * We should always have it disabled.
+                */
+               WARN_ON((I915_READ(DPLL(PIPE_B)) & DPLL_VGA_MODE_DIS) == 0);
+       } else {
+               I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
+               POSTING_READ(DPLL_MD(pipe));
+       }
 }
 
 static int intel_num_dvo_pipes(struct drm_device *dev)
@@ -1687,9 +1651,6 @@ static void i9xx_enable_pll(struct intel_crtc *crtc)
 
        assert_pipe_disabled(dev_priv, crtc->pipe);
 
-       /* No really, not for ILK+ */
-       BUG_ON(INTEL_INFO(dev)->gen >= 5);
-
        /* PLL is protected by panel, make sure we can write it */
        if (IS_MOBILE(dev) && !IS_I830(dev))
                assert_panel_unlocked(dev_priv, crtc->pipe);
@@ -1788,16 +1749,13 @@ static void vlv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
        /* Make sure the pipe isn't still relying on us */
        assert_pipe_disabled(dev_priv, pipe);
 
-       /*
-        * Leave integrated clock source and reference clock enabled for pipe B.
-        * The latter is needed for VGA hotplug / manual detection.
-        */
-       val = DPLL_VGA_MODE_DIS;
-       if (pipe == PIPE_B)
-               val = DPLL_INTEGRATED_CRI_CLK_VLV | DPLL_REF_CLK_ENABLE_VLV;
+       val = DPLL_INTEGRATED_REF_CLK_VLV |
+               DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
+       if (pipe != PIPE_A)
+               val |= DPLL_INTEGRATED_CRI_CLK_VLV;
+
        I915_WRITE(DPLL(pipe), val);
        POSTING_READ(DPLL(pipe));
-
 }
 
 static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
@@ -1808,11 +1766,11 @@ static void chv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe)
        /* Make sure the pipe isn't still relying on us */
        assert_pipe_disabled(dev_priv, pipe);
 
-       /* Set PLL en = 0 */
        val = DPLL_SSC_REF_CLK_CHV |
                DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
        if (pipe != PIPE_A)
                val |= DPLL_INTEGRATED_CRI_CLK_VLV;
+
        I915_WRITE(DPLL(pipe), val);
        POSTING_READ(DPLL(pipe));
 
@@ -1856,149 +1814,51 @@ void vlv_wait_port_ready(struct drm_i915_private *dev_priv,
                     port_name(dport->port), I915_READ(dpll_reg) & port_mask, expected_mask);
 }
 
-static void intel_prepare_shared_dpll(struct intel_crtc *crtc)
+static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
+                                          enum pipe pipe)
 {
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
+       struct drm_device *dev = dev_priv->dev;
+       struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       i915_reg_t reg;
+       uint32_t val, pipeconf_val;
 
-       if (WARN_ON(pll == NULL))
-               return;
+       /* Make sure PCH DPLL is enabled */
+       assert_shared_dpll_enabled(dev_priv, intel_crtc->config->shared_dpll);
 
-       WARN_ON(!pll->config.crtc_mask);
-       if (pll->active == 0) {
-               DRM_DEBUG_DRIVER("setting up %s\n", pll->name);
-               WARN_ON(pll->on);
-               assert_shared_dpll_disabled(dev_priv, pll);
+       /* FDI must be feeding us bits for PCH ports */
+       assert_fdi_tx_enabled(dev_priv, pipe);
+       assert_fdi_rx_enabled(dev_priv, pipe);
 
-               pll->mode_set(dev_priv, pll);
+       if (HAS_PCH_CPT(dev)) {
+               /* Workaround: Set the timing override bit before enabling the
+                * pch transcoder. */
+               reg = TRANS_CHICKEN2(pipe);
+               val = I915_READ(reg);
+               val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
+               I915_WRITE(reg, val);
        }
-}
 
-/**
- * intel_enable_shared_dpll - enable PCH PLL
- * @dev_priv: i915 private structure
- * @pipe: pipe PLL to enable
- *
- * The PCH PLL needs to be enabled before the PCH transcoder, since it
- * drives the transcoder clock.
- */
-static void intel_enable_shared_dpll(struct intel_crtc *crtc)
-{
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
+       reg = PCH_TRANSCONF(pipe);
+       val = I915_READ(reg);
+       pipeconf_val = I915_READ(PIPECONF(pipe));
 
-       if (WARN_ON(pll == NULL))
-               return;
-
-       if (WARN_ON(pll->config.crtc_mask == 0))
-               return;
-
-       DRM_DEBUG_KMS("enable %s (active %d, on? %d) for crtc %d\n",
-                     pll->name, pll->active, pll->on,
-                     crtc->base.base.id);
-
-       if (pll->active++) {
-               WARN_ON(!pll->on);
-               assert_shared_dpll_enabled(dev_priv, pll);
-               return;
-       }
-       WARN_ON(pll->on);
-
-       intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
-
-       DRM_DEBUG_KMS("enabling %s\n", pll->name);
-       pll->enable(dev_priv, pll);
-       pll->on = true;
-}
-
-static void intel_disable_shared_dpll(struct intel_crtc *crtc)
-{
-       struct drm_device *dev = crtc->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_shared_dpll *pll = intel_crtc_to_shared_dpll(crtc);
-
-       /* PCH only available on ILK+ */
-       if (INTEL_INFO(dev)->gen < 5)
-               return;
-
-       if (pll == NULL)
-               return;
-
-       if (WARN_ON(!(pll->config.crtc_mask & (1 << drm_crtc_index(&crtc->base)))))
-               return;
-
-       DRM_DEBUG_KMS("disable %s (active %d, on? %d) for crtc %d\n",
-                     pll->name, pll->active, pll->on,
-                     crtc->base.base.id);
-
-       if (WARN_ON(pll->active == 0)) {
-               assert_shared_dpll_disabled(dev_priv, pll);
-               return;
-       }
-
-       assert_shared_dpll_enabled(dev_priv, pll);
-       WARN_ON(!pll->on);
-       if (--pll->active)
-               return;
-
-       DRM_DEBUG_KMS("disabling %s\n", pll->name);
-       pll->disable(dev_priv, pll);
-       pll->on = false;
-
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
-}
-
-static void ironlake_enable_pch_transcoder(struct drm_i915_private *dev_priv,
-                                          enum pipe pipe)
-{
-       struct drm_device *dev = dev_priv->dev;
-       struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       i915_reg_t reg;
-       uint32_t val, pipeconf_val;
-
-       /* PCH only available on ILK+ */
-       BUG_ON(!HAS_PCH_SPLIT(dev));
-
-       /* Make sure PCH DPLL is enabled */
-       assert_shared_dpll_enabled(dev_priv,
-                                  intel_crtc_to_shared_dpll(intel_crtc));
-
-       /* FDI must be feeding us bits for PCH ports */
-       assert_fdi_tx_enabled(dev_priv, pipe);
-       assert_fdi_rx_enabled(dev_priv, pipe);
-
-       if (HAS_PCH_CPT(dev)) {
-               /* Workaround: Set the timing override bit before enabling the
-                * pch transcoder. */
-               reg = TRANS_CHICKEN2(pipe);
-               val = I915_READ(reg);
-               val |= TRANS_CHICKEN2_TIMING_OVERRIDE;
-               I915_WRITE(reg, val);
-       }
-
-       reg = PCH_TRANSCONF(pipe);
-       val = I915_READ(reg);
-       pipeconf_val = I915_READ(PIPECONF(pipe));
-
-       if (HAS_PCH_IBX(dev_priv->dev)) {
-               /*
-                * Make the BPC in transcoder be consistent with
-                * that in pipeconf reg. For HDMI we must use 8bpc
-                * here for both 8bpc and 12bpc.
-                */
-               val &= ~PIPECONF_BPC_MASK;
-               if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_HDMI))
-                       val |= PIPECONF_8BPC;
-               else
-                       val |= pipeconf_val & PIPECONF_BPC_MASK;
-       }
+       if (HAS_PCH_IBX(dev_priv)) {
+               /*
+                * Make the BPC in transcoder be consistent with
+                * that in pipeconf reg. For HDMI we must use 8bpc
+                * here for both 8bpc and 12bpc.
+                */
+               val &= ~PIPECONF_BPC_MASK;
+               if (intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_HDMI))
+                       val |= PIPECONF_8BPC;
+               else
+                       val |= pipeconf_val & PIPECONF_BPC_MASK;
+       }
 
        val &= ~TRANS_INTERLACE_MASK;
        if ((pipeconf_val & PIPECONF_INTERLACE_MASK) == PIPECONF_INTERLACED_ILK)
-               if (HAS_PCH_IBX(dev_priv->dev) &&
+               if (HAS_PCH_IBX(dev_priv) &&
                    intel_pipe_has_type(intel_crtc, INTEL_OUTPUT_SDVO))
                        val |= TRANS_LEGACY_INTERLACED_ILK;
                else
@@ -2016,9 +1876,6 @@ static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
 {
        u32 val, pipeconf_val;
 
-       /* PCH only available on ILK+ */
-       BUG_ON(!HAS_PCH_SPLIT(dev_priv->dev));
-
        /* FDI must be feeding us bits for PCH ports */
        assert_fdi_tx_enabled(dev_priv, (enum pipe) cpu_transcoder);
        assert_fdi_rx_enabled(dev_priv, TRANSCODER_A);
@@ -2113,7 +1970,7 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
        assert_cursor_disabled(dev_priv, pipe);
        assert_sprites_disabled(dev_priv, pipe);
 
-       if (HAS_PCH_LPT(dev_priv->dev))
+       if (HAS_PCH_LPT(dev_priv))
                pch_transcoder = TRANSCODER_A;
        else
                pch_transcoder = pipe;
@@ -2123,7 +1980,7 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
         * a plane.  On ILK+ the pipe PLLs are integrated, so we don't
         * need the check.
         */
-       if (HAS_GMCH_DISPLAY(dev_priv->dev))
+       if (HAS_GMCH_DISPLAY(dev_priv))
                if (crtc->config->has_dsi_encoder)
                        assert_dsi_pll_enabled(dev_priv);
                else
@@ -2225,8 +2082,8 @@ static unsigned int intel_tile_size(const struct drm_i915_private *dev_priv)
        return IS_GEN2(dev_priv) ? 2048 : 4096;
 }
 
-static unsigned int intel_tile_width(const struct drm_i915_private *dev_priv,
-                                    uint64_t fb_modifier, unsigned int cpp)
+static unsigned int intel_tile_width_bytes(const struct drm_i915_private *dev_priv,
+                                          uint64_t fb_modifier, unsigned int cpp)
 {
        switch (fb_modifier) {
        case DRM_FORMAT_MOD_NONE:
@@ -2269,7 +2126,21 @@ unsigned int intel_tile_height(const struct drm_i915_private *dev_priv,
                return 1;
        else
                return intel_tile_size(dev_priv) /
-                       intel_tile_width(dev_priv, fb_modifier, cpp);
+                       intel_tile_width_bytes(dev_priv, fb_modifier, cpp);
+}
+
+/* Return the tile dimensions in pixel units */
+static void intel_tile_dims(const struct drm_i915_private *dev_priv,
+                           unsigned int *tile_width,
+                           unsigned int *tile_height,
+                           uint64_t fb_modifier,
+                           unsigned int cpp)
+{
+       unsigned int tile_width_bytes =
+               intel_tile_width_bytes(dev_priv, fb_modifier, cpp);
+
+       *tile_width = tile_width_bytes / cpp;
+       *tile_height = intel_tile_size(dev_priv) / tile_width_bytes;
 }
 
 unsigned int
@@ -2282,48 +2153,54 @@ intel_fb_align_height(struct drm_device *dev, unsigned int height,
        return ALIGN(height, tile_height);
 }
 
-static void
-intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
-                       const struct drm_plane_state *plane_state)
+unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info)
 {
-       struct drm_i915_private *dev_priv = to_i915(fb->dev);
-       struct intel_rotation_info *info = &view->params.rotated;
-       unsigned int tile_size, tile_width, tile_height, cpp;
-
-       *view = i915_ggtt_view_normal;
+       unsigned int size = 0;
+       int i;
 
-       if (!plane_state)
-               return;
+       for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++)
+               size += rot_info->plane[i].width * rot_info->plane[i].height;
 
-       if (!intel_rotation_90_or_270(plane_state->rotation))
-               return;
+       return size;
+}
 
-       *view = i915_ggtt_view_rotated;
+static void
+intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
+                       const struct drm_framebuffer *fb,
+                       unsigned int rotation)
+{
+       if (intel_rotation_90_or_270(rotation)) {
+               *view = i915_ggtt_view_rotated;
+               view->params.rotated = to_intel_framebuffer(fb)->rot_info;
+       } else {
+               *view = i915_ggtt_view_normal;
+       }
+}
 
-       info->height = fb->height;
-       info->pixel_format = fb->pixel_format;
-       info->pitch = fb->pitches[0];
-       info->uv_offset = fb->offsets[1];
-       info->fb_modifier = fb->modifier[0];
+static void
+intel_fill_fb_info(struct drm_i915_private *dev_priv,
+                  struct drm_framebuffer *fb)
+{
+       struct intel_rotation_info *info = &to_intel_framebuffer(fb)->rot_info;
+       unsigned int tile_size, tile_width, tile_height, cpp;
 
        tile_size = intel_tile_size(dev_priv);
 
        cpp = drm_format_plane_cpp(fb->pixel_format, 0);
-       tile_width = intel_tile_width(dev_priv, fb->modifier[0], cpp);
-       tile_height = tile_size / tile_width;
+       intel_tile_dims(dev_priv, &tile_width, &tile_height,
+                       fb->modifier[0], cpp);
 
-       info->width_pages = DIV_ROUND_UP(fb->pitches[0], tile_width);
-       info->height_pages = DIV_ROUND_UP(fb->height, tile_height);
-       info->size = info->width_pages * info->height_pages * tile_size;
+       info->plane[0].width = DIV_ROUND_UP(fb->pitches[0], tile_width * cpp);
+       info->plane[0].height = DIV_ROUND_UP(fb->height, tile_height);
 
        if (info->pixel_format == DRM_FORMAT_NV12) {
                cpp = drm_format_plane_cpp(fb->pixel_format, 1);
-               tile_width = intel_tile_width(dev_priv, fb->modifier[1], cpp);
-               tile_height = tile_size / tile_width;
+               intel_tile_dims(dev_priv, &tile_width, &tile_height,
+                               fb->modifier[1], cpp);
 
-               info->width_pages_uv = DIV_ROUND_UP(fb->pitches[1], tile_width);
-               info->height_pages_uv = DIV_ROUND_UP(fb->height / 2, tile_height);
-               info->size_uv = info->width_pages_uv * info->height_pages_uv * tile_size;
+               info->uv_offset = fb->offsets[1];
+               info->plane[1].width = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp);
+               info->plane[1].height = DIV_ROUND_UP(fb->height / 2, tile_height);
        }
 }
 
@@ -2360,9 +2237,8 @@ static unsigned int intel_surf_alignment(const struct drm_i915_private *dev_priv
 }
 
 int
-intel_pin_and_fence_fb_obj(struct drm_plane *plane,
-                          struct drm_framebuffer *fb,
-                          const struct drm_plane_state *plane_state)
+intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
+                          unsigned int rotation)
 {
        struct drm_device *dev = fb->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -2375,7 +2251,7 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
 
        alignment = intel_surf_alignment(dev_priv, fb->modifier[0]);
 
-       intel_fill_fb_ggtt_view(&view, fb, plane_state);
+       intel_fill_fb_ggtt_view(&view, fb, rotation);
 
        /* Note that the w/a also requires 64 PTE of padding following the
         * bo. We currently fill all unused PTE with the shadow page and so
@@ -2433,15 +2309,14 @@ err_pm:
        return ret;
 }
 
-static void intel_unpin_fb_obj(struct drm_framebuffer *fb,
-                              const struct drm_plane_state *plane_state)
+static void intel_unpin_fb_obj(struct drm_framebuffer *fb, unsigned int rotation)
 {
        struct drm_i915_gem_object *obj = intel_fb_obj(fb);
        struct i915_ggtt_view view;
 
        WARN_ON(!mutex_is_locked(&obj->base.dev->struct_mutex));
 
-       intel_fill_fb_ggtt_view(&view, fb, plane_state);
+       intel_fill_fb_ggtt_view(&view, fb, rotation);
 
        if (view.type == I915_GGTT_VIEW_NORMAL)
                i915_gem_object_unpin_fence(obj);
@@ -2449,38 +2324,93 @@ static void intel_unpin_fb_obj(struct drm_framebuffer *fb,
        i915_gem_object_unpin_from_display_plane(obj, &view);
 }
 
-/* Computes the linear offset to the base tile and adjusts x, y. bytes per pixel
- * is assumed to be a power-of-two. */
-u32 intel_compute_tile_offset(struct drm_i915_private *dev_priv,
-                             int *x, int *y,
-                             uint64_t fb_modifier,
-                             unsigned int cpp,
-                             unsigned int pitch)
+/*
+ * Adjust the tile offset by moving the difference into
+ * the x/y offsets.
+ *
+ * Input tile dimensions and pitch must already be
+ * rotated to match x and y, and in pixel units.
+ */
+static u32 intel_adjust_tile_offset(int *x, int *y,
+                                   unsigned int tile_width,
+                                   unsigned int tile_height,
+                                   unsigned int tile_size,
+                                   unsigned int pitch_tiles,
+                                   u32 old_offset,
+                                   u32 new_offset)
+{
+       unsigned int tiles;
+
+       WARN_ON(old_offset & (tile_size - 1));
+       WARN_ON(new_offset & (tile_size - 1));
+       WARN_ON(new_offset > old_offset);
+
+       tiles = (old_offset - new_offset) / tile_size;
+
+       *y += tiles / pitch_tiles * tile_height;
+       *x += tiles % pitch_tiles * tile_width;
+
+       return new_offset;
+}
+
+/*
+ * Computes the linear offset to the base tile and adjusts
+ * x, y. bytes per pixel is assumed to be a power-of-two.
+ *
+ * In the 90/270 rotated case, x and y are assumed
+ * to be already rotated to match the rotated GTT view, and
+ * pitch is the tile_height aligned framebuffer height.
+ */
+u32 intel_compute_tile_offset(int *x, int *y,
+                             const struct drm_framebuffer *fb, int plane,
+                             unsigned int pitch,
+                             unsigned int rotation)
 {
+       const struct drm_i915_private *dev_priv = to_i915(fb->dev);
+       uint64_t fb_modifier = fb->modifier[plane];
+       unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
+       u32 offset, offset_aligned, alignment;
+
+       alignment = intel_surf_alignment(dev_priv, fb_modifier);
+       if (alignment)
+               alignment--;
+
        if (fb_modifier != DRM_FORMAT_MOD_NONE) {
                unsigned int tile_size, tile_width, tile_height;
-               unsigned int tile_rows, tiles;
+               unsigned int tile_rows, tiles, pitch_tiles;
 
                tile_size = intel_tile_size(dev_priv);
-               tile_width = intel_tile_width(dev_priv, fb_modifier, cpp);
-               tile_height = tile_size / tile_width;
+               intel_tile_dims(dev_priv, &tile_width, &tile_height,
+                               fb_modifier, cpp);
+
+               if (intel_rotation_90_or_270(rotation)) {
+                       pitch_tiles = pitch / tile_height;
+                       swap(tile_width, tile_height);
+               } else {
+                       pitch_tiles = pitch / (tile_width * cpp);
+               }
 
                tile_rows = *y / tile_height;
                *y %= tile_height;
 
-               tiles = *x / (tile_width/cpp);
-               *x %= tile_width/cpp;
+               tiles = *x / tile_width;
+               *x %= tile_width;
 
-               return tile_rows * pitch * tile_height + tiles * tile_size;
-       } else {
-               unsigned int alignment = intel_linear_alignment(dev_priv) - 1;
-               unsigned int offset;
+               offset = (tile_rows * pitch_tiles + tiles) * tile_size;
+               offset_aligned = offset & ~alignment;
 
+               intel_adjust_tile_offset(x, y, tile_width, tile_height,
+                                        tile_size, pitch_tiles,
+                                        offset, offset_aligned);
+       } else {
                offset = *y * pitch + *x * cpp;
+               offset_aligned = offset & ~alignment;
+
                *y = (offset & alignment) / pitch;
                *x = ((offset & alignment) - *y * pitch) / cpp;
-               return offset & ~alignment;
        }
+
+       return offset_aligned;
 }
 
 static int i9xx_format_to_fourcc(int format)
@@ -2536,6 +2466,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_object *obj = NULL;
        struct drm_mode_fb_cmd2 mode_cmd = { 0 };
        struct drm_framebuffer *fb = &plane_config->fb->base;
@@ -2551,7 +2482,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
        /* If the FB is too big, just don't use it since fbdev is not very
         * important and we should probably use that space with FBC or other
         * features. */
-       if (size_aligned * 2 > dev_priv->gtt.stolen_usable_size)
+       if (size_aligned * 2 > ggtt->stolen_usable_size)
                return false;
 
        mutex_lock(&dev->struct_mutex);
@@ -2667,7 +2598,7 @@ intel_find_initial_plane_obj(struct intel_crtc *intel_crtc,
         */
        to_intel_plane_state(plane_state)->visible = false;
        crtc_state->plane_mask &= ~(1 << drm_plane_index(primary));
-       intel_pre_disable_primary(&intel_crtc->base);
+       intel_pre_disable_primary_noatomic(&intel_crtc->base);
        intel_plane->disable_plane(primary, &intel_crtc->base);
 
        return;
@@ -2716,6 +2647,7 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
        u32 linear_offset;
        u32 dspcntr;
        i915_reg_t reg = DSPCNTR(plane);
+       unsigned int rotation = plane_state->base.rotation;
        int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
        int x = plane_state->src.x1 >> 16;
        int y = plane_state->src.y1 >> 16;
@@ -2780,15 +2712,14 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
 
        if (INTEL_INFO(dev)->gen >= 4) {
                intel_crtc->dspaddr_offset =
-                       intel_compute_tile_offset(dev_priv, &x, &y,
-                                                 fb->modifier[0], cpp,
-                                                 fb->pitches[0]);
+                       intel_compute_tile_offset(&x, &y, fb, 0,
+                                                 fb->pitches[0], rotation);
                linear_offset -= intel_crtc->dspaddr_offset;
        } else {
                intel_crtc->dspaddr_offset = linear_offset;
        }
 
-       if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
+       if (rotation == BIT(DRM_ROTATE_180)) {
                dspcntr |= DISPPLANE_ROTATE_180;
 
                x += (crtc_state->pipe_src_w - 1);
@@ -2846,6 +2777,7 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
        u32 linear_offset;
        u32 dspcntr;
        i915_reg_t reg = DSPCNTR(plane);
+       unsigned int rotation = plane_state->base.rotation;
        int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
        int x = plane_state->src.x1 >> 16;
        int y = plane_state->src.y1 >> 16;
@@ -2887,11 +2819,10 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
 
        linear_offset = y * fb->pitches[0] + x * cpp;
        intel_crtc->dspaddr_offset =
-               intel_compute_tile_offset(dev_priv, &x, &y,
-                                         fb->modifier[0], cpp,
-                                         fb->pitches[0]);
+               intel_compute_tile_offset(&x, &y, fb, 0,
+                                         fb->pitches[0], rotation);
        linear_offset -= intel_crtc->dspaddr_offset;
-       if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
+       if (rotation == BIT(DRM_ROTATE_180)) {
                dspcntr |= DISPPLANE_ROTATE_180;
 
                if (!IS_HASWELL(dev) && !IS_BROADWELL(dev)) {
@@ -2931,7 +2862,7 @@ u32 intel_fb_stride_alignment(const struct drm_i915_private *dev_priv,
        } else {
                int cpp = drm_format_plane_cpp(pixel_format, 0);
 
-               return intel_tile_width(dev_priv, fb_modifier, cpp);
+               return intel_tile_width_bytes(dev_priv, fb_modifier, cpp);
        }
 }
 
@@ -2944,7 +2875,7 @@ u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
        u64 offset;
 
        intel_fill_fb_ggtt_view(&view, intel_plane->base.state->fb,
-                               intel_plane->base.state);
+                               intel_plane->base.state->rotation);
 
        vma = i915_gem_obj_to_ggtt_view(obj, &view);
        if (WARN(!vma, "ggtt vma for display object not found! (view=%u)\n",
@@ -3284,12 +3215,12 @@ void intel_finish_reset(struct drm_device *dev)
 static bool intel_crtc_has_pending_flip(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       unsigned reset_counter;
        bool pending;
 
-       if (i915_reset_in_progress(&dev_priv->gpu_error) ||
-           intel_crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
+       reset_counter = i915_reset_counter(&to_i915(dev)->gpu_error);
+       if (intel_crtc->reset_counter != reset_counter)
                return false;
 
        spin_lock_irq(&dev->event_lock);
@@ -3314,9 +3245,6 @@ static void intel_update_pipe_config(struct intel_crtc *crtc,
                      old_crtc_state->pipe_src_w, old_crtc_state->pipe_src_h,
                      pipe_config->pipe_src_w, pipe_config->pipe_src_h);
 
-       if (HAS_DDI(dev))
-               intel_set_pipe_csc(&crtc->base);
-
        /*
         * Update pipe size and adjust fitter if needed: the reason for this is
         * that in compute_mode_changes we check the native mode (not the pfit
@@ -3894,9 +3822,7 @@ static void page_flip_completed(struct intel_crtc *intel_crtc)
        intel_crtc->unpin_work = NULL;
 
        if (work->event)
-               drm_send_vblank_event(intel_crtc->base.dev,
-                                     intel_crtc->pipe,
-                                     work->event);
+               drm_crtc_send_vblank_event(&intel_crtc->base, work->event);
 
        drm_crtc_vblank_put(&intel_crtc->base);
 
@@ -3955,37 +3881,35 @@ static void lpt_disable_iclkip(struct drm_i915_private *dev_priv)
 /* Program iCLKIP clock to the desired frequency */
 static void lpt_program_iclkip(struct drm_crtc *crtc)
 {
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        int clock = to_intel_crtc(crtc)->config->base.adjusted_mode.crtc_clock;
        u32 divsel, phaseinc, auxdiv, phasedir = 0;
        u32 temp;
 
        lpt_disable_iclkip(dev_priv);
 
-       /* 20MHz is a corner case which is out of range for the 7-bit divisor */
-       if (clock == 20000) {
-               auxdiv = 1;
-               divsel = 0x41;
-               phaseinc = 0x20;
-       } else {
-               /* The iCLK virtual clock root frequency is in MHz,
-                * but the adjusted_mode->crtc_clock in in KHz. To get the
-                * divisors, it is necessary to divide one by another, so we
-                * convert the virtual clock precision to KHz here for higher
-                * precision.
-                */
+       /* The iCLK virtual clock root frequency is in MHz,
+        * but the adjusted_mode->crtc_clock in in KHz. To get the
+        * divisors, it is necessary to divide one by another, so we
+        * convert the virtual clock precision to KHz here for higher
+        * precision.
+        */
+       for (auxdiv = 0; auxdiv < 2; auxdiv++) {
                u32 iclk_virtual_root_freq = 172800 * 1000;
                u32 iclk_pi_range = 64;
-               u32 desired_divisor, msb_divisor_value, pi_value;
+               u32 desired_divisor;
 
-               desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq, clock);
-               msb_divisor_value = desired_divisor / iclk_pi_range;
-               pi_value = desired_divisor % iclk_pi_range;
+               desired_divisor = DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
+                                                   clock << auxdiv);
+               divsel = (desired_divisor / iclk_pi_range) - 2;
+               phaseinc = desired_divisor % iclk_pi_range;
 
-               auxdiv = 0;
-               divsel = msb_divisor_value - 2;
-               phaseinc = pi_value;
+               /*
+                * Near 20MHz is a corner case which is
+                * out of range for the 7-bit divisor
+                */
+               if (divsel <= 0x7f)
+                       break;
        }
 
        /* This should not happen with any sane values */
@@ -4032,6 +3956,43 @@ static void lpt_program_iclkip(struct drm_crtc *crtc)
        I915_WRITE(PIXCLK_GATE, PIXCLK_GATE_UNGATE);
 }
 
+int lpt_get_iclkip(struct drm_i915_private *dev_priv)
+{
+       u32 divsel, phaseinc, auxdiv;
+       u32 iclk_virtual_root_freq = 172800 * 1000;
+       u32 iclk_pi_range = 64;
+       u32 desired_divisor;
+       u32 temp;
+
+       if ((I915_READ(PIXCLK_GATE) & PIXCLK_GATE_UNGATE) == 0)
+               return 0;
+
+       mutex_lock(&dev_priv->sb_lock);
+
+       temp = intel_sbi_read(dev_priv, SBI_SSCCTL6, SBI_ICLK);
+       if (temp & SBI_SSCCTL_DISABLE) {
+               mutex_unlock(&dev_priv->sb_lock);
+               return 0;
+       }
+
+       temp = intel_sbi_read(dev_priv, SBI_SSCDIVINTPHASE6, SBI_ICLK);
+       divsel = (temp & SBI_SSCDIVINTPHASE_DIVSEL_MASK) >>
+               SBI_SSCDIVINTPHASE_DIVSEL_SHIFT;
+       phaseinc = (temp & SBI_SSCDIVINTPHASE_INCVAL_MASK) >>
+               SBI_SSCDIVINTPHASE_INCVAL_SHIFT;
+
+       temp = intel_sbi_read(dev_priv, SBI_SSCAUXDIV6, SBI_ICLK);
+       auxdiv = (temp & SBI_SSCAUXDIV_FINALDIV2SEL_MASK) >>
+               SBI_SSCAUXDIV_FINALDIV2SEL_SHIFT;
+
+       mutex_unlock(&dev_priv->sb_lock);
+
+       desired_divisor = (divsel + 2) * iclk_pi_range + phaseinc;
+
+       return DIV_ROUND_CLOSEST(iclk_virtual_root_freq,
+                                desired_divisor << auxdiv);
+}
+
 static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc,
                                                enum pipe pch_transcoder)
 {
@@ -4142,12 +4103,6 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
        I915_WRITE(FDI_RX_TUSIZE1(pipe),
                   I915_READ(PIPE_DATA_M1(pipe)) & TU_SIZE_MASK);
 
-       /*
-        * Sometimes spurious CPU pipe underruns happen during FDI
-        * training, at least with VGA+HDMI cloning. Suppress them.
-        */
-       intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
-
        /* For PCH output, training FDI link */
        dev_priv->display.fdi_link_train(crtc);
 
@@ -4159,7 +4114,8 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
                temp = I915_READ(PCH_DPLL_SEL);
                temp |= TRANS_DPLL_ENABLE(pipe);
                sel = TRANS_DPLLB_SEL(pipe);
-               if (intel_crtc->config->shared_dpll == DPLL_ID_PCH_PLL_B)
+               if (intel_crtc->config->shared_dpll ==
+                   intel_get_shared_dpll_by_id(dev_priv, DPLL_ID_PCH_PLL_B))
                        temp |= sel;
                else
                        temp &= ~sel;
@@ -4181,8 +4137,6 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
 
        intel_fdi_normal_train(crtc);
 
-       intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
-
        /* For PCH DP, enable TRANS_DP_CTL */
        if (HAS_PCH_CPT(dev) && intel_crtc->config->has_dp_encoder) {
                const struct drm_display_mode *adjusted_mode =
@@ -4238,113 +4192,6 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
        lpt_enable_pch_transcoder(dev_priv, cpu_transcoder);
 }
 
-struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
-                                               struct intel_crtc_state *crtc_state)
-{
-       struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
-       struct intel_shared_dpll *pll;
-       struct intel_shared_dpll_config *shared_dpll;
-       enum intel_dpll_id i;
-       int max = dev_priv->num_shared_dpll;
-
-       shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
-
-       if (HAS_PCH_IBX(dev_priv->dev)) {
-               /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
-               i = (enum intel_dpll_id) crtc->pipe;
-               pll = &dev_priv->shared_dplls[i];
-
-               DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
-                             crtc->base.base.id, pll->name);
-
-               WARN_ON(shared_dpll[i].crtc_mask);
-
-               goto found;
-       }
-
-       if (IS_BROXTON(dev_priv->dev)) {
-               /* PLL is attached to port in bxt */
-               struct intel_encoder *encoder;
-               struct intel_digital_port *intel_dig_port;
-
-               encoder = intel_ddi_get_crtc_new_encoder(crtc_state);
-               if (WARN_ON(!encoder))
-                       return NULL;
-
-               intel_dig_port = enc_to_dig_port(&encoder->base);
-               /* 1:1 mapping between ports and PLLs */
-               i = (enum intel_dpll_id)intel_dig_port->port;
-               pll = &dev_priv->shared_dplls[i];
-               DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
-                       crtc->base.base.id, pll->name);
-               WARN_ON(shared_dpll[i].crtc_mask);
-
-               goto found;
-       } else if (INTEL_INFO(dev_priv)->gen < 9 && HAS_DDI(dev_priv))
-               /* Do not consider SPLL */
-               max = 2;
-
-       for (i = 0; i < max; i++) {
-               pll = &dev_priv->shared_dplls[i];
-
-               /* Only want to check enabled timings first */
-               if (shared_dpll[i].crtc_mask == 0)
-                       continue;
-
-               if (memcmp(&crtc_state->dpll_hw_state,
-                          &shared_dpll[i].hw_state,
-                          sizeof(crtc_state->dpll_hw_state)) == 0) {
-                       DRM_DEBUG_KMS("CRTC:%d sharing existing %s (crtc mask 0x%08x, ative %d)\n",
-                                     crtc->base.base.id, pll->name,
-                                     shared_dpll[i].crtc_mask,
-                                     pll->active);
-                       goto found;
-               }
-       }
-
-       /* Ok no matching timings, maybe there's a free one? */
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               pll = &dev_priv->shared_dplls[i];
-               if (shared_dpll[i].crtc_mask == 0) {
-                       DRM_DEBUG_KMS("CRTC:%d allocated %s\n",
-                                     crtc->base.base.id, pll->name);
-                       goto found;
-               }
-       }
-
-       return NULL;
-
-found:
-       if (shared_dpll[i].crtc_mask == 0)
-               shared_dpll[i].hw_state =
-                       crtc_state->dpll_hw_state;
-
-       crtc_state->shared_dpll = i;
-       DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->name,
-                        pipe_name(crtc->pipe));
-
-       shared_dpll[i].crtc_mask |= 1 << crtc->pipe;
-
-       return pll;
-}
-
-static void intel_shared_dpll_commit(struct drm_atomic_state *state)
-{
-       struct drm_i915_private *dev_priv = to_i915(state->dev);
-       struct intel_shared_dpll_config *shared_dpll;
-       struct intel_shared_dpll *pll;
-       enum intel_dpll_id i;
-
-       if (!to_intel_atomic_state(state)->dpll_set)
-               return;
-
-       shared_dpll = to_intel_atomic_state(state)->shared_dpll;
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               pll = &dev_priv->shared_dplls[i];
-               pll->config = shared_dpll[i];
-       }
-}
-
 static void cpt_verify_modeset(struct drm_device *dev, int pipe)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -4576,8 +4423,11 @@ void hsw_enable_ips(struct intel_crtc *crtc)
        if (!crtc->config->ips_enabled)
                return;
 
-       /* We can only enable IPS after we enable a plane and wait for a vblank */
-       intel_wait_for_vblank(dev, crtc->pipe);
+       /*
+        * We can only enable IPS after we enable a plane and wait for a vblank
+        * This function is called from post_plane_update, which is run after
+        * a vblank wait.
+        */
 
        assert_plane_enabled(dev_priv, crtc->plane);
        if (IS_BROADWELL(dev)) {
@@ -4626,55 +4476,6 @@ void hsw_disable_ips(struct intel_crtc *crtc)
        intel_wait_for_vblank(dev, crtc->pipe);
 }
 
-/** Loads the palette/gamma unit for the CRTC with the prepared values */
-static void intel_crtc_load_lut(struct drm_crtc *crtc)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       enum pipe pipe = intel_crtc->pipe;
-       int i;
-       bool reenable_ips = false;
-
-       /* The clocks have to be on to load the palette. */
-       if (!crtc->state->active)
-               return;
-
-       if (HAS_GMCH_DISPLAY(dev_priv->dev)) {
-               if (intel_crtc->config->has_dsi_encoder)
-                       assert_dsi_pll_enabled(dev_priv);
-               else
-                       assert_pll_enabled(dev_priv, pipe);
-       }
-
-       /* Workaround : Do not read or write the pipe palette/gamma data while
-        * GAMMA_MODE is configured for split gamma and IPS_CTL has IPS enabled.
-        */
-       if (IS_HASWELL(dev) && intel_crtc->config->ips_enabled &&
-           ((I915_READ(GAMMA_MODE(pipe)) & GAMMA_MODE_MODE_MASK) ==
-            GAMMA_MODE_MODE_SPLIT)) {
-               hsw_disable_ips(intel_crtc);
-               reenable_ips = true;
-       }
-
-       for (i = 0; i < 256; i++) {
-               i915_reg_t palreg;
-
-               if (HAS_GMCH_DISPLAY(dev))
-                       palreg = PALETTE(pipe, i);
-               else
-                       palreg = LGC_PALETTE(pipe, i);
-
-               I915_WRITE(palreg,
-                          (intel_crtc->lut_r[i] << 16) |
-                          (intel_crtc->lut_g[i] << 8) |
-                          intel_crtc->lut_b[i]);
-       }
-
-       if (reenable_ips)
-               hsw_enable_ips(intel_crtc);
-}
-
 static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc)
 {
        if (intel_crtc->overlay) {
@@ -4734,16 +4535,7 @@ intel_post_enable_primary(struct drm_crtc *crtc)
        intel_check_pch_fifo_underruns(dev_priv);
 }
 
-/**
- * intel_pre_disable_primary - Perform operations before disabling primary plane
- * @crtc: the CRTC whose primary plane is to be disabled
- *
- * Performs potentially sleeping operations that must be done before the
- * primary plane is disabled, such as updating FBC and IPS.  Note that this may
- * be called due to an explicit primary plane update, or due to an implicit
- * disable that is caused when a sprite plane completely hides the primary
- * plane.
- */
+/* FIXME move all this to pre_plane_update() with proper state tracking */
 static void
 intel_pre_disable_primary(struct drm_crtc *crtc)
 {
@@ -4761,6 +4553,26 @@ intel_pre_disable_primary(struct drm_crtc *crtc)
        if (IS_GEN2(dev))
                intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
 
+       /*
+        * FIXME IPS should be fine as long as one plane is
+        * enabled, but in practice it seems to have problems
+        * when going from primary only to sprite only and vice
+        * versa.
+        */
+       hsw_disable_ips(intel_crtc);
+}
+
+/* FIXME get rid of this and use pre_plane_update */
+static void
+intel_pre_disable_primary_noatomic(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       int pipe = intel_crtc->pipe;
+
+       intel_pre_disable_primary(crtc);
+
        /*
         * Vblank time updates from the shadow to live plane control register
         * are blocked if the memory self-refresh mode is active at that
@@ -4775,37 +4587,39 @@ intel_pre_disable_primary(struct drm_crtc *crtc)
                dev_priv->wm.vlv.cxsr = false;
                intel_wait_for_vblank(dev, pipe);
        }
-
-       /*
-        * FIXME IPS should be fine as long as one plane is
-        * enabled, but in practice it seems to have problems
-        * when going from primary only to sprite only and vice
-        * versa.
-        */
-       hsw_disable_ips(intel_crtc);
 }
 
-static void intel_post_plane_update(struct intel_crtc *crtc)
+static void intel_post_plane_update(struct intel_crtc_state *old_crtc_state)
 {
-       struct intel_crtc_atomic_commit *atomic = &crtc->atomic;
+       struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
+       struct drm_atomic_state *old_state = old_crtc_state->base.state;
        struct intel_crtc_state *pipe_config =
                to_intel_crtc_state(crtc->base.state);
        struct drm_device *dev = crtc->base.dev;
-
-       intel_frontbuffer_flip(dev, atomic->fb_bits);
+       struct drm_plane *primary = crtc->base.primary;
+       struct drm_plane_state *old_pri_state =
+               drm_atomic_get_existing_plane_state(old_state, primary);
+
+       intel_frontbuffer_flip(dev, pipe_config->fb_bits);
 
        crtc->wm.cxsr_allowed = true;
 
-       if (pipe_config->wm_changed && pipe_config->base.active)
+       if (pipe_config->update_wm_post && pipe_config->base.active)
                intel_update_watermarks(&crtc->base);
 
-       if (atomic->update_fbc)
-               intel_fbc_post_update(crtc);
+       if (old_pri_state) {
+               struct intel_plane_state *primary_state =
+                       to_intel_plane_state(primary->state);
+               struct intel_plane_state *old_primary_state =
+                       to_intel_plane_state(old_pri_state);
 
-       if (atomic->post_enable_primary)
-               intel_post_enable_primary(&crtc->base);
+               intel_fbc_post_update(crtc);
 
-       memset(atomic, 0, sizeof(*atomic));
+               if (primary_state->visible &&
+                   (needs_modeset(&pipe_config->base) ||
+                    !old_primary_state->visible))
+                       intel_post_enable_primary(&crtc->base);
+       }
 }
 
 static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state)
@@ -4813,7 +4627,6 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state)
        struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc_atomic_commit *atomic = &crtc->atomic;
        struct intel_crtc_state *pipe_config =
                to_intel_crtc_state(crtc->base.state);
        struct drm_atomic_state *old_state = old_crtc_state->base.state;
@@ -4822,15 +4635,14 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state)
                drm_atomic_get_existing_plane_state(old_state, primary);
        bool modeset = needs_modeset(&pipe_config->base);
 
-       if (atomic->update_fbc)
-               intel_fbc_pre_update(crtc);
-
        if (old_pri_state) {
                struct intel_plane_state *primary_state =
                        to_intel_plane_state(primary->state);
                struct intel_plane_state *old_primary_state =
                        to_intel_plane_state(old_pri_state);
 
+               intel_fbc_pre_update(crtc);
+
                if (old_primary_state->visible &&
                    (modeset || !primary_state->visible))
                        intel_pre_disable_primary(&crtc->base);
@@ -4839,11 +4651,58 @@ static void intel_pre_plane_update(struct intel_crtc_state *old_crtc_state)
        if (pipe_config->disable_cxsr) {
                crtc->wm.cxsr_allowed = false;
 
-               if (old_crtc_state->base.active)
+               /*
+                * Vblank time updates from the shadow to live plane control register
+                * are blocked if the memory self-refresh mode is active at that
+                * moment. So to make sure the plane gets truly disabled, disable
+                * first the self-refresh mode. The self-refresh enable bit in turn
+                * will be checked/applied by the HW only at the next frame start
+                * event which is after the vblank start event, so we need to have a
+                * wait-for-vblank between disabling the plane and the pipe.
+                */
+               if (old_crtc_state->base.active) {
                        intel_set_memory_cxsr(dev_priv, false);
+                       dev_priv->wm.vlv.cxsr = false;
+                       intel_wait_for_vblank(dev, crtc->pipe);
+               }
        }
 
-       if (!needs_modeset(&pipe_config->base) && pipe_config->wm_changed)
+       /*
+        * IVB workaround: must disable low power watermarks for at least
+        * one frame before enabling scaling.  LP watermarks can be re-enabled
+        * when scaling is disabled.
+        *
+        * WaCxSRDisabledForSpriteScaling:ivb
+        */
+       if (pipe_config->disable_lp_wm) {
+               ilk_disable_lp_wm(dev);
+               intel_wait_for_vblank(dev, crtc->pipe);
+       }
+
+       /*
+        * If we're doing a modeset, we're done.  No need to do any pre-vblank
+        * watermark programming here.
+        */
+       if (needs_modeset(&pipe_config->base))
+               return;
+
+       /*
+        * For platforms that support atomic watermarks, program the
+        * 'intermediate' watermarks immediately.  On pre-gen9 platforms, these
+        * will be the intermediate values that are safe for both pre- and
+        * post- vblank; when vblank happens, the 'active' values will be set
+        * to the final 'target' values and we'll do this again to get the
+        * optimal watermarks.  For gen9+ platforms, the values we program here
+        * will be the final target values which will get automatically latched
+        * at vblank time; no further programming will be necessary.
+        *
+        * If a platform hasn't been transitioned to atomic watermarks yet,
+        * we'll continue to update watermarks the old way, if flags tell
+        * us to.
+        */
+       if (dev_priv->display.initial_watermarks != NULL)
+               dev_priv->display.initial_watermarks(pipe_config);
+       else if (pipe_config->update_wm_pre)
                intel_update_watermarks(&crtc->base);
 }
 
@@ -4874,10 +4733,24 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
        int pipe = intel_crtc->pipe;
+       struct intel_crtc_state *pipe_config =
+               to_intel_crtc_state(crtc->state);
 
        if (WARN_ON(intel_crtc->active))
                return;
 
+       /*
+        * Sometimes spurious CPU pipe underruns happen during FDI
+        * training, at least with VGA+HDMI cloning. Suppress them.
+        *
+        * On ILK we get an occasional spurious CPU pipe underruns
+        * between eDP port A enable and vdd enable. Also PCH port
+        * enable seems to result in the occasional CPU pipe underrun.
+        *
+        * Spurious PCH underruns also occur during PCH enabling.
+        */
+       if (intel_crtc->config->has_pch_encoder || IS_GEN5(dev_priv))
+               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
        if (intel_crtc->config->has_pch_encoder)
                intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
 
@@ -4888,6 +4761,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
                intel_dp_set_m_n(intel_crtc, M1_N1);
 
        intel_set_pipe_timings(intel_crtc);
+       intel_set_pipe_src_size(intel_crtc);
 
        if (intel_crtc->config->has_pch_encoder) {
                intel_cpu_transcoder_set_m_n(intel_crtc,
@@ -4898,8 +4772,6 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
 
        intel_crtc->active = true;
 
-       intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
-
        for_each_encoder_on_crtc(dev, crtc, encoder)
                if (encoder->pre_enable)
                        encoder->pre_enable(encoder);
@@ -4920,9 +4792,10 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
         * On ILK+ LUT must be loaded before the pipe is running but with
         * clocks enabled
         */
-       intel_crtc_load_lut(crtc);
+       intel_color_load_luts(&pipe_config->base);
 
-       intel_update_watermarks(crtc);
+       if (dev_priv->display.initial_watermarks != NULL)
+               dev_priv->display.initial_watermarks(intel_crtc->config);
        intel_enable_pipe(intel_crtc);
 
        if (intel_crtc->config->has_pch_encoder)
@@ -4940,6 +4813,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
        /* Must wait for vblank to avoid spurious PCH FIFO underruns */
        if (intel_crtc->config->has_pch_encoder)
                intel_wait_for_vblank(dev, pipe);
+       intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
        intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
 }
 
@@ -4956,6 +4830,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
        int pipe = intel_crtc->pipe, hsw_workaround_pipe;
+       enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
        struct intel_crtc_state *pipe_config =
                to_intel_crtc_state(crtc->state);
 
@@ -4966,16 +4841,20 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
                intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
                                                      false);
 
-       if (intel_crtc_to_shared_dpll(intel_crtc))
+       if (intel_crtc->config->shared_dpll)
                intel_enable_shared_dpll(intel_crtc);
 
        if (intel_crtc->config->has_dp_encoder)
                intel_dp_set_m_n(intel_crtc, M1_N1);
 
-       intel_set_pipe_timings(intel_crtc);
+       if (!intel_crtc->config->has_dsi_encoder)
+               intel_set_pipe_timings(intel_crtc);
 
-       if (intel_crtc->config->cpu_transcoder != TRANSCODER_EDP) {
-               I915_WRITE(PIPE_MULT(intel_crtc->config->cpu_transcoder),
+       intel_set_pipe_src_size(intel_crtc);
+
+       if (cpu_transcoder != TRANSCODER_EDP &&
+           !transcoder_is_dsi(cpu_transcoder)) {
+               I915_WRITE(PIPE_MULT(cpu_transcoder),
                           intel_crtc->config->pixel_multiplier - 1);
        }
 
@@ -4984,9 +4863,12 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
                                     &intel_crtc->config->fdi_m_n, NULL);
        }
 
-       haswell_set_pipeconf(crtc);
+       if (!intel_crtc->config->has_dsi_encoder)
+               haswell_set_pipeconf(crtc);
+
+       haswell_set_pipemisc(crtc);
 
-       intel_set_pipe_csc(crtc);
+       intel_color_set_csc(&pipe_config->base);
 
        intel_crtc->active = true;
 
@@ -5015,14 +4897,20 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
         * On ILK+ LUT must be loaded before the pipe is running but with
         * clocks enabled
         */
-       intel_crtc_load_lut(crtc);
+       intel_color_load_luts(&pipe_config->base);
 
        intel_ddi_set_pipe_settings(crtc);
        if (!intel_crtc->config->has_dsi_encoder)
                intel_ddi_enable_transcoder_func(crtc);
 
-       intel_update_watermarks(crtc);
-       intel_enable_pipe(intel_crtc);
+       if (dev_priv->display.initial_watermarks != NULL)
+               dev_priv->display.initial_watermarks(pipe_config);
+       else
+               intel_update_watermarks(crtc);
+
+       /* XXX: Do the pipe assertions at the right place for BXT DSI. */
+       if (!intel_crtc->config->has_dsi_encoder)
+               intel_enable_pipe(intel_crtc);
 
        if (intel_crtc->config->has_pch_encoder)
                lpt_pch_enable(crtc);
@@ -5078,8 +4966,15 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
        struct intel_encoder *encoder;
        int pipe = intel_crtc->pipe;
 
-       if (intel_crtc->config->has_pch_encoder)
+       /*
+        * Sometimes spurious CPU pipe underruns happen when the
+        * pipe is already disabled, but FDI RX/TX is still enabled.
+        * Happens at least with VGA+HDMI cloning. Suppress them.
+        */
+       if (intel_crtc->config->has_pch_encoder) {
+               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
                intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, false);
+       }
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
                encoder->disable(encoder);
@@ -5087,22 +4982,12 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
        drm_crtc_vblank_off(crtc);
        assert_vblank_disabled(crtc);
 
-       /*
-        * Sometimes spurious CPU pipe underruns happen when the
-        * pipe is already disabled, but FDI RX/TX is still enabled.
-        * Happens at least with VGA+HDMI cloning. Suppress them.
-        */
-       if (intel_crtc->config->has_pch_encoder)
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
-
        intel_disable_pipe(intel_crtc);
 
        ironlake_pfit_disable(intel_crtc, false);
 
-       if (intel_crtc->config->has_pch_encoder) {
+       if (intel_crtc->config->has_pch_encoder)
                ironlake_fdi_disable(crtc);
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
-       }
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
                if (encoder->post_disable)
@@ -5132,6 +5017,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
                ironlake_fdi_pll_disable(intel_crtc);
        }
 
+       intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
        intel_set_pch_fifo_underrun_reporting(dev_priv, pipe, true);
 }
 
@@ -5155,7 +5041,9 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
        drm_crtc_vblank_off(crtc);
        assert_vblank_disabled(crtc);
 
-       intel_disable_pipe(intel_crtc);
+       /* XXX: Do the pipe assertions at the right place for BXT DSI. */
+       if (!intel_crtc->config->has_dsi_encoder)
+               intel_disable_pipe(intel_crtc);
 
        if (intel_crtc->config->dp_encoder_is_mst)
                intel_ddi_set_vc_payload_alloc(crtc, false);
@@ -5330,6 +5218,9 @@ static unsigned long get_crtc_power_domains(struct drm_crtc *crtc,
                mask |= BIT(intel_display_port_power_domain(intel_encoder));
        }
 
+       if (crtc_state->shared_dpll)
+               mask |= BIT(POWER_DOMAIN_PLLS);
+
        return mask;
 }
 
@@ -5393,6 +5284,8 @@ static void intel_update_max_cdclk(struct drm_device *dev)
                        dev_priv->max_cdclk_freq = 450000;
                else
                        dev_priv->max_cdclk_freq = 337500;
+       } else if (IS_BROXTON(dev)) {
+               dev_priv->max_cdclk_freq = 624000;
        } else if (IS_BROADWELL(dev))  {
                /*
                 * FIXME with extra cooling we can allow
@@ -5452,9 +5345,8 @@ static void intel_update_cdclk(struct drm_device *dev)
                intel_update_max_cdclk(dev);
 }
 
-static void broxton_set_cdclk(struct drm_device *dev, int frequency)
+static void broxton_set_cdclk(struct drm_i915_private *dev_priv, int frequency)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t divider;
        uint32_t ratio;
        uint32_t current_freq;
@@ -5568,33 +5460,46 @@ static void broxton_set_cdclk(struct drm_device *dev, int frequency)
                return;
        }
 
-       intel_update_cdclk(dev);
+       intel_update_cdclk(dev_priv->dev);
 }
 
-void broxton_init_cdclk(struct drm_device *dev)
+static bool broxton_cdclk_is_enabled(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       uint32_t val;
+       if (!(I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_PLL_ENABLE))
+               return false;
 
-       /*
-        * NDE_RSTWRN_OPT RST PCH Handshake En must always be 0b on BXT
-        * or else the reset will hang because there is no PCH to respond.
-        * Move the handshake programming to initialization sequence.
-        * Previously was left up to BIOS.
-        */
-       val = I915_READ(HSW_NDE_RSTWRN_OPT);
-       val &= ~RESET_PCH_HANDSHAKE_ENABLE;
-       I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
+       /* TODO: Check for a valid CDCLK rate */
 
-       /* Enable PG1 for cdclk */
-       intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
+       if (!(I915_READ(DBUF_CTL) & DBUF_POWER_REQUEST)) {
+               DRM_DEBUG_DRIVER("CDCLK enabled, but DBUF power not requested\n");
+
+               return false;
+       }
+
+       if (!(I915_READ(DBUF_CTL) & DBUF_POWER_STATE)) {
+               DRM_DEBUG_DRIVER("CDCLK enabled, but DBUF power hasn't settled\n");
+
+               return false;
+       }
+
+       return true;
+}
+
+bool broxton_cdclk_verify_state(struct drm_i915_private *dev_priv)
+{
+       return broxton_cdclk_is_enabled(dev_priv);
+}
 
+void broxton_init_cdclk(struct drm_i915_private *dev_priv)
+{
        /* check if cd clock is enabled */
-       if (I915_READ(BXT_DE_PLL_ENABLE) & BXT_DE_PLL_PLL_ENABLE) {
-               DRM_DEBUG_KMS("Display already initialized\n");
+       if (broxton_cdclk_is_enabled(dev_priv)) {
+               DRM_DEBUG_KMS("CDCLK already enabled, won't reprogram it\n");
                return;
        }
 
+       DRM_DEBUG_KMS("CDCLK not enabled, enabling it\n");
+
        /*
         * FIXME:
         * - The initial CDCLK needs to be read from VBT.
@@ -5602,7 +5507,7 @@ void broxton_init_cdclk(struct drm_device *dev)
         * - check if setting the max (or any) cdclk freq is really necessary
         *   here, it belongs to modeset time
         */
-       broxton_set_cdclk(dev, 624000);
+       broxton_set_cdclk(dev_priv, 624000);
 
        I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) | DBUF_POWER_REQUEST);
        POSTING_READ(DBUF_CTL);
@@ -5613,10 +5518,8 @@ void broxton_init_cdclk(struct drm_device *dev)
                DRM_ERROR("DBuf power enable timeout!\n");
 }
 
-void broxton_uninit_cdclk(struct drm_device *dev)
+void broxton_uninit_cdclk(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
        I915_WRITE(DBUF_CTL, I915_READ(DBUF_CTL) & ~DBUF_POWER_REQUEST);
        POSTING_READ(DBUF_CTL);
 
@@ -5626,9 +5529,7 @@ void broxton_uninit_cdclk(struct drm_device *dev)
                DRM_ERROR("DBuf power disable timeout!\n");
 
        /* Set minimum (bypass) frequency, in effect turning off the DE PLL */
-       broxton_set_cdclk(dev, 19200);
-
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+       broxton_set_cdclk(dev_priv, 19200);
 }
 
 static const struct skl_cdclk_entry {
@@ -6165,6 +6066,8 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
+       struct intel_crtc_state *pipe_config =
+               to_intel_crtc_state(crtc->state);
        int pipe = intel_crtc->pipe;
 
        if (WARN_ON(intel_crtc->active))
@@ -6174,6 +6077,7 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
                intel_dp_set_m_n(intel_crtc, M1_N1);
 
        intel_set_pipe_timings(intel_crtc);
+       intel_set_pipe_src_size(intel_crtc);
 
        if (IS_CHERRYVIEW(dev) && pipe == PIPE_B) {
                struct drm_i915_private *dev_priv = dev->dev_private;
@@ -6192,14 +6096,12 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
                if (encoder->pre_pll_enable)
                        encoder->pre_pll_enable(encoder);
 
-       if (!intel_crtc->config->has_dsi_encoder) {
-               if (IS_CHERRYVIEW(dev)) {
-                       chv_prepare_pll(intel_crtc, intel_crtc->config);
-                       chv_enable_pll(intel_crtc, intel_crtc->config);
-               } else {
-                       vlv_prepare_pll(intel_crtc, intel_crtc->config);
-                       vlv_enable_pll(intel_crtc, intel_crtc->config);
-               }
+       if (IS_CHERRYVIEW(dev)) {
+               chv_prepare_pll(intel_crtc, intel_crtc->config);
+               chv_enable_pll(intel_crtc, intel_crtc->config);
+       } else {
+               vlv_prepare_pll(intel_crtc, intel_crtc->config);
+               vlv_enable_pll(intel_crtc, intel_crtc->config);
        }
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
@@ -6208,8 +6110,9 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
 
        i9xx_pfit_enable(intel_crtc);
 
-       intel_crtc_load_lut(crtc);
+       intel_color_load_luts(&pipe_config->base);
 
+       intel_update_watermarks(crtc);
        intel_enable_pipe(intel_crtc);
 
        assert_vblank_disabled(crtc);
@@ -6234,7 +6137,9 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
        struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_encoder *encoder;
-       int pipe = intel_crtc->pipe;
+       struct intel_crtc_state *pipe_config =
+               to_intel_crtc_state(crtc->state);
+       enum pipe pipe = intel_crtc->pipe;
 
        if (WARN_ON(intel_crtc->active))
                return;
@@ -6245,6 +6150,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
                intel_dp_set_m_n(intel_crtc, M1_N1);
 
        intel_set_pipe_timings(intel_crtc);
+       intel_set_pipe_src_size(intel_crtc);
 
        i9xx_set_pipeconf(intel_crtc);
 
@@ -6261,7 +6167,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
 
        i9xx_pfit_enable(intel_crtc);
 
-       intel_crtc_load_lut(crtc);
+       intel_color_load_luts(&pipe_config->base);
 
        intel_update_watermarks(crtc);
        intel_enable_pipe(intel_crtc);
@@ -6299,10 +6205,9 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
        /*
         * On gen2 planes are double buffered but the pipe isn't, so we must
         * wait for planes to fully turn off before disabling the pipe.
-        * We also need to wait on all gmch platforms because of the
-        * self-refresh mode constraint explained above.
         */
-       intel_wait_for_vblank(dev, pipe);
+       if (IS_GEN2(dev))
+               intel_wait_for_vblank(dev, pipe);
 
        for_each_encoder_on_crtc(dev, crtc, encoder)
                encoder->disable(encoder);
@@ -6337,6 +6242,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
 
 static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)
 {
+       struct intel_encoder *encoder;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->dev);
        enum intel_display_power_domain domain;
@@ -6348,14 +6254,27 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)
        if (to_intel_plane_state(crtc->primary->state)->visible) {
                WARN_ON(intel_crtc->unpin_work);
 
-               intel_pre_disable_primary(crtc);
+               intel_pre_disable_primary_noatomic(crtc);
 
                intel_crtc_disable_planes(crtc, 1 << drm_plane_index(crtc->primary));
                to_intel_plane_state(crtc->primary->state)->visible = false;
        }
 
        dev_priv->display.crtc_disable(crtc);
+
+       DRM_DEBUG_KMS("[CRTC:%d] hw state adjusted, was enabled, now disabled\n",
+                     crtc->base.id);
+
+       WARN_ON(drm_atomic_set_mode_for_crtc(crtc->state, NULL) < 0);
+       crtc->state->active = false;
        intel_crtc->active = false;
+       crtc->enabled = false;
+       crtc->state->connector_mask = 0;
+       crtc->state->encoder_mask = 0;
+
+       for_each_encoder_on_crtc(crtc->dev, crtc, encoder)
+               encoder->base.crtc = NULL;
+
        intel_fbc_disable(intel_crtc);
        intel_update_watermarks(crtc);
        intel_disable_shared_dpll(intel_crtc);
@@ -6398,7 +6317,7 @@ void intel_encoder_destroy(struct drm_encoder *encoder)
 
 /* Cross check the actual hw state with our own modeset state tracking (and it's
  * internal consistency). */
-static void intel_connector_check_state(struct intel_connector *connector)
+static void intel_connector_verify_state(struct intel_connector *connector)
 {
        struct drm_crtc *crtc = connector->base.state->crtc;
 
@@ -6568,7 +6487,7 @@ retry:
         * Hence the bw of each lane in terms of the mode signal
         * is:
         */
-       link_bw = intel_fdi_link_freq(dev) * MHz(100)/KHz(1)/10;
+       link_bw = intel_fdi_link_freq(to_i915(dev), pipe_config);
 
        fdi_dotclock = adjusted_mode->crtc_clock;
 
@@ -6580,8 +6499,7 @@ retry:
        intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock,
                               link_bw, &pipe_config->fdi_m_n);
 
-       ret = ironlake_check_fdi_lanes(intel_crtc->base.dev,
-                                      intel_crtc->pipe, pipe_config);
+       ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config);
        if (ret == -EINVAL && pipe_config->pipe_bpp > 6*3) {
                pipe_config->pipe_bpp -= 2*3;
                DRM_DEBUG_KMS("fdi link bw constraint, reducing pipe bpp to %i\n",
@@ -6605,7 +6523,7 @@ static bool pipe_config_supports_ips(struct drm_i915_private *dev_priv,
                return false;
 
        /* HSW can handle pixel rate up to cdclk? */
-       if (IS_HASWELL(dev_priv->dev))
+       if (IS_HASWELL(dev_priv))
                return true;
 
        /*
@@ -7133,30 +7051,6 @@ static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
                && !(dev_priv->quirks & QUIRK_LVDS_SSC_DISABLE);
 }
 
-static int i9xx_get_refclk(const struct intel_crtc_state *crtc_state,
-                          int num_connectors)
-{
-       struct drm_device *dev = crtc_state->base.crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int refclk;
-
-       WARN_ON(!crtc_state->base.state);
-
-       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev) || IS_BROXTON(dev)) {
-               refclk = 100000;
-       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS) &&
-           intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
-               refclk = dev_priv->vbt.lvds_ssc_freq;
-               DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
-       } else if (!IS_GEN2(dev)) {
-               refclk = 96000;
-       } else {
-               refclk = 48000;
-       }
-
-       return refclk;
-}
-
 static uint32_t pnv_dpll_compute_fp(struct dpll *dpll)
 {
        return (1 << dpll->n) << 16 | dpll->m2;
@@ -7300,24 +7194,34 @@ void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n)
 static void vlv_compute_dpll(struct intel_crtc *crtc,
                             struct intel_crtc_state *pipe_config)
 {
-       u32 dpll, dpll_md;
+       pipe_config->dpll_hw_state.dpll = DPLL_INTEGRATED_REF_CLK_VLV |
+               DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
+       if (crtc->pipe != PIPE_A)
+               pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
 
-       /*
-        * Enable DPIO clock input. We should never disable the reference
-        * clock for pipe B, since VGA hotplug / manual detection depends
-        * on it.
-        */
-       dpll = DPLL_EXT_BUFFER_ENABLE_VLV | DPLL_REF_CLK_ENABLE_VLV |
-               DPLL_VGA_MODE_DIS | DPLL_INTEGRATED_REF_CLK_VLV;
-       /* We should never disable this, set it here for state tracking */
-       if (crtc->pipe == PIPE_B)
-               dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
-       dpll |= DPLL_VCO_ENABLE;
-       pipe_config->dpll_hw_state.dpll = dpll;
+       /* DPLL not used with DSI, but still need the rest set up */
+       if (!pipe_config->has_dsi_encoder)
+               pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE |
+                       DPLL_EXT_BUFFER_ENABLE_VLV;
+
+       pipe_config->dpll_hw_state.dpll_md =
+               (pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
+}
+
+static void chv_compute_dpll(struct intel_crtc *crtc,
+                            struct intel_crtc_state *pipe_config)
+{
+       pipe_config->dpll_hw_state.dpll = DPLL_SSC_REF_CLK_CHV |
+               DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
+       if (crtc->pipe != PIPE_A)
+               pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
+
+       /* DPLL not used with DSI, but still need the rest set up */
+       if (!pipe_config->has_dsi_encoder)
+               pipe_config->dpll_hw_state.dpll |= DPLL_VCO_ENABLE;
 
-       dpll_md = (pipe_config->pixel_multiplier - 1)
-               << DPLL_MD_UDI_MULTIPLIER_SHIFT;
-       pipe_config->dpll_hw_state.dpll_md = dpll_md;
+       pipe_config->dpll_hw_state.dpll_md =
+               (pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
 }
 
 static void vlv_prepare_pll(struct intel_crtc *crtc,
@@ -7325,11 +7229,20 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int pipe = crtc->pipe;
+       enum pipe pipe = crtc->pipe;
        u32 mdiv;
        u32 bestn, bestm1, bestm2, bestp1, bestp2;
        u32 coreclk, reg_val;
 
+       /* Enable Refclk */
+       I915_WRITE(DPLL(pipe),
+                  pipe_config->dpll_hw_state.dpll &
+                  ~(DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV));
+
+       /* No need to actually set up the DPLL with DSI */
+       if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
+               return;
+
        mutex_lock(&dev_priv->sb_lock);
 
        bestn = pipe_config->dpll.n;
@@ -7411,32 +7324,26 @@ static void vlv_prepare_pll(struct intel_crtc *crtc,
        mutex_unlock(&dev_priv->sb_lock);
 }
 
-static void chv_compute_dpll(struct intel_crtc *crtc,
-                            struct intel_crtc_state *pipe_config)
-{
-       pipe_config->dpll_hw_state.dpll = DPLL_SSC_REF_CLK_CHV |
-               DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS |
-               DPLL_VCO_ENABLE;
-       if (crtc->pipe != PIPE_A)
-               pipe_config->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
-
-       pipe_config->dpll_hw_state.dpll_md =
-               (pipe_config->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
-}
-
 static void chv_prepare_pll(struct intel_crtc *crtc,
                            const struct intel_crtc_state *pipe_config)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int pipe = crtc->pipe;
-       i915_reg_t dpll_reg = DPLL(crtc->pipe);
+       enum pipe pipe = crtc->pipe;
        enum dpio_channel port = vlv_pipe_to_channel(pipe);
        u32 loopfilter, tribuf_calcntr;
        u32 bestn, bestm1, bestm2, bestp1, bestp2, bestm2_frac;
        u32 dpio_val;
        int vco;
 
+       /* Enable Refclk and SSC */
+       I915_WRITE(DPLL(pipe),
+                  pipe_config->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE);
+
+       /* No need to actually set up the DPLL with DSI */
+       if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
+               return;
+
        bestn = pipe_config->dpll.n;
        bestm2_frac = pipe_config->dpll.m2 & 0x3fffff;
        bestm1 = pipe_config->dpll.m1;
@@ -7447,12 +7354,6 @@ static void chv_prepare_pll(struct intel_crtc *crtc,
        dpio_val = 0;
        loopfilter = 0;
 
-       /*
-        * Enable Refclk and SSC
-        */
-       I915_WRITE(dpll_reg,
-                  pipe_config->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE);
-
        mutex_lock(&dev_priv->sb_lock);
 
        /* p1 and p2 divider */
@@ -7586,8 +7487,7 @@ void vlv_force_pll_off(struct drm_device *dev, enum pipe pipe)
 
 static void i9xx_compute_dpll(struct intel_crtc *crtc,
                              struct intel_crtc_state *crtc_state,
-                             intel_clock_t *reduced_clock,
-                             int num_connectors)
+                             intel_clock_t *reduced_clock)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -7646,7 +7546,7 @@ static void i9xx_compute_dpll(struct intel_crtc *crtc,
        if (crtc_state->sdvo_tv_clock)
                dpll |= PLL_REF_INPUT_TVCLKINBC;
        else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS) &&
-                intel_panel_use_ssc(dev_priv) && num_connectors < 2)
+                intel_panel_use_ssc(dev_priv))
                dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
        else
                dpll |= PLL_REF_INPUT_DREFCLK;
@@ -7663,8 +7563,7 @@ static void i9xx_compute_dpll(struct intel_crtc *crtc,
 
 static void i8xx_compute_dpll(struct intel_crtc *crtc,
                              struct intel_crtc_state *crtc_state,
-                             intel_clock_t *reduced_clock,
-                             int num_connectors)
+                             intel_clock_t *reduced_clock)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -7690,7 +7589,7 @@ static void i8xx_compute_dpll(struct intel_crtc *crtc,
                dpll |= DPLL_DVO_2X_MODE;
 
        if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS) &&
-                intel_panel_use_ssc(dev_priv) && num_connectors < 2)
+           intel_panel_use_ssc(dev_priv))
                dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
        else
                dpll |= PLL_REF_INPUT_DREFCLK;
@@ -7759,6 +7658,14 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc)
            (pipe == PIPE_B || pipe == PIPE_C))
                I915_WRITE(VTOTAL(pipe), I915_READ(VTOTAL(cpu_transcoder)));
 
+}
+
+static void intel_set_pipe_src_size(struct intel_crtc *intel_crtc)
+{
+       struct drm_device *dev = intel_crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum pipe pipe = intel_crtc->pipe;
+
        /* pipesrc controls the size that is scaled from, which should
         * always be the user's requested size.
         */
@@ -7800,6 +7707,14 @@ static void intel_get_pipe_timings(struct intel_crtc *crtc,
                pipe_config->base.adjusted_mode.crtc_vtotal += 1;
                pipe_config->base.adjusted_mode.crtc_vblank_end += 1;
        }
+}
+
+static void intel_get_pipe_src_size(struct intel_crtc *crtc,
+                                   struct intel_crtc_state *pipe_config)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 tmp;
 
        tmp = I915_READ(PIPESRC(crtc->pipe));
        pipe_config->pipe_src_h = (tmp & 0xffff) + 1;
@@ -7897,69 +7812,192 @@ static void i9xx_set_pipeconf(struct intel_crtc *intel_crtc)
        POSTING_READ(PIPECONF(intel_crtc->pipe));
 }
 
-static int i9xx_crtc_compute_clock(struct intel_crtc *crtc,
+static int i8xx_crtc_compute_clock(struct intel_crtc *crtc,
                                   struct intel_crtc_state *crtc_state)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int refclk, num_connectors = 0;
-       intel_clock_t clock;
-       bool ok;
        const intel_limit_t *limit;
-       struct drm_atomic_state *state = crtc_state->base.state;
-       struct drm_connector *connector;
-       struct drm_connector_state *connector_state;
-       int i;
+       int refclk = 48000;
 
        memset(&crtc_state->dpll_hw_state, 0,
               sizeof(crtc_state->dpll_hw_state));
 
-       if (crtc_state->has_dsi_encoder)
-               return 0;
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
+               if (intel_panel_use_ssc(dev_priv)) {
+                       refclk = dev_priv->vbt.lvds_ssc_freq;
+                       DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
+               }
 
-       for_each_connector_in_state(state, connector, connector_state, i) {
-               if (connector_state->crtc == &crtc->base)
-                       num_connectors++;
+               limit = &intel_limits_i8xx_lvds;
+       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_DVO)) {
+               limit = &intel_limits_i8xx_dvo;
+       } else {
+               limit = &intel_limits_i8xx_dac;
        }
 
-       if (!crtc_state->clock_set) {
-               refclk = i9xx_get_refclk(crtc_state, num_connectors);
+       if (!crtc_state->clock_set &&
+           !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                                refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
+       }
 
-               /*
-                * Returns a set of divisors for the desired target clock with
-                * the given refclk, or FALSE.  The returned values represent
-                * the clock equation: reflck * (5 * (m1 + 2) + (m2 + 2)) / (n +
-                * 2) / p1 / p2.
-                */
-               limit = intel_limit(crtc_state, refclk);
-               ok = dev_priv->display.find_dpll(limit, crtc_state,
-                                                crtc_state->port_clock,
-                                                refclk, NULL, &clock);
-               if (!ok) {
-                       DRM_ERROR("Couldn't find PLL settings for mode!\n");
-                       return -EINVAL;
+       i8xx_compute_dpll(crtc, crtc_state, NULL);
+
+       return 0;
+}
+
+static int g4x_crtc_compute_clock(struct intel_crtc *crtc,
+                                 struct intel_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       const intel_limit_t *limit;
+       int refclk = 96000;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
+               if (intel_panel_use_ssc(dev_priv)) {
+                       refclk = dev_priv->vbt.lvds_ssc_freq;
+                       DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
                }
 
-               /* Compat-code for transition, will disappear. */
-               crtc_state->dpll.n = clock.n;
-               crtc_state->dpll.m1 = clock.m1;
-               crtc_state->dpll.m2 = clock.m2;
-               crtc_state->dpll.p1 = clock.p1;
-               crtc_state->dpll.p2 = clock.p2;
+               if (intel_is_dual_link_lvds(dev))
+                       limit = &intel_limits_g4x_dual_channel_lvds;
+               else
+                       limit = &intel_limits_g4x_single_channel_lvds;
+       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_HDMI) ||
+                  intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_ANALOG)) {
+               limit = &intel_limits_g4x_hdmi;
+       } else if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_SDVO)) {
+               limit = &intel_limits_g4x_sdvo;
+       } else {
+               /* The option is for other outputs */
+               limit = &intel_limits_i9xx_sdvo;
        }
 
-       if (IS_GEN2(dev)) {
-               i8xx_compute_dpll(crtc, crtc_state, NULL,
-                                 num_connectors);
-       } else if (IS_CHERRYVIEW(dev)) {
-               chv_compute_dpll(crtc, crtc_state);
-       } else if (IS_VALLEYVIEW(dev)) {
-               vlv_compute_dpll(crtc, crtc_state);
+       if (!crtc_state->clock_set &&
+           !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                               refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
+       }
+
+       i9xx_compute_dpll(crtc, crtc_state, NULL);
+
+       return 0;
+}
+
+static int pnv_crtc_compute_clock(struct intel_crtc *crtc,
+                                 struct intel_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       const intel_limit_t *limit;
+       int refclk = 96000;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
+               if (intel_panel_use_ssc(dev_priv)) {
+                       refclk = dev_priv->vbt.lvds_ssc_freq;
+                       DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
+               }
+
+               limit = &intel_limits_pineview_lvds;
        } else {
-               i9xx_compute_dpll(crtc, crtc_state, NULL,
-                                 num_connectors);
+               limit = &intel_limits_pineview_sdvo;
+       }
+
+       if (!crtc_state->clock_set &&
+           !pnv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                               refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
+       }
+
+       i9xx_compute_dpll(crtc, crtc_state, NULL);
+
+       return 0;
+}
+
+static int i9xx_crtc_compute_clock(struct intel_crtc *crtc,
+                                  struct intel_crtc_state *crtc_state)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       const intel_limit_t *limit;
+       int refclk = 96000;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
+               if (intel_panel_use_ssc(dev_priv)) {
+                       refclk = dev_priv->vbt.lvds_ssc_freq;
+                       DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n", refclk);
+               }
+
+               limit = &intel_limits_i9xx_lvds;
+       } else {
+               limit = &intel_limits_i9xx_sdvo;
+       }
+
+       if (!crtc_state->clock_set &&
+           !i9xx_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                                refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
+       }
+
+       i9xx_compute_dpll(crtc, crtc_state, NULL);
+
+       return 0;
+}
+
+static int chv_crtc_compute_clock(struct intel_crtc *crtc,
+                                 struct intel_crtc_state *crtc_state)
+{
+       int refclk = 100000;
+       const intel_limit_t *limit = &intel_limits_chv;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (!crtc_state->clock_set &&
+           !chv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                               refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
+       }
+
+       chv_compute_dpll(crtc, crtc_state);
+
+       return 0;
+}
+
+static int vlv_crtc_compute_clock(struct intel_crtc *crtc,
+                                 struct intel_crtc_state *crtc_state)
+{
+       int refclk = 100000;
+       const intel_limit_t *limit = &intel_limits_vlv;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (!crtc_state->clock_set &&
+           !vlv_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                               refclk, NULL, &crtc_state->dpll)) {
+               DRM_ERROR("Couldn't find PLL settings for mode!\n");
+               return -EINVAL;
        }
 
+       vlv_compute_dpll(crtc, crtc_state);
+
        return 0;
 }
 
@@ -8000,8 +8038,8 @@ static void vlv_crtc_clock_get(struct intel_crtc *crtc,
        u32 mdiv;
        int refclk = 100000;
 
-       /* In case of MIPI DPLL will not even be used */
-       if (!(pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE))
+       /* In case of DSI, DPLL will not be used */
+       if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
                return;
 
        mutex_lock(&dev_priv->sb_lock);
@@ -8097,6 +8135,10 @@ static void chv_crtc_clock_get(struct intel_crtc *crtc,
        u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2, pll_dw3;
        int refclk = 100000;
 
+       /* In case of DSI, DPLL will not be used */
+       if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
+               return;
+
        mutex_lock(&dev_priv->sb_lock);
        cmn_dw13 = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW13(port));
        pll_dw0 = vlv_dpio_read(dev_priv, pipe, CHV_PLL_DW0(port));
@@ -8130,7 +8172,7 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
                return false;
 
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
-       pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+       pipe_config->shared_dpll = NULL;
 
        ret = false;
 
@@ -8162,11 +8204,16 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
                pipe_config->double_wide = tmp & PIPECONF_DOUBLE_WIDE;
 
        intel_get_pipe_timings(crtc, pipe_config);
+       intel_get_pipe_src_size(crtc, pipe_config);
 
        i9xx_get_pfit_config(crtc, pipe_config);
 
        if (INTEL_INFO(dev)->gen >= 4) {
-               tmp = I915_READ(DPLL_MD(crtc->pipe));
+               /* No way to read it out on pipes B and C */
+               if (IS_CHERRYVIEW(dev) && crtc->pipe != PIPE_A)
+                       tmp = dev_priv->chv_dpll_md[crtc->pipe];
+               else
+                       tmp = I915_READ(DPLL_MD(crtc->pipe));
                pipe_config->pixel_multiplier =
                        ((tmp & DPLL_MD_UDI_MULTIPLIER_MASK)
                         >> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
@@ -8635,42 +8682,6 @@ void intel_init_pch_refclk(struct drm_device *dev)
                lpt_init_pch_refclk(dev);
 }
 
-static int ironlake_get_refclk(struct intel_crtc_state *crtc_state)
-{
-       struct drm_device *dev = crtc_state->base.crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_atomic_state *state = crtc_state->base.state;
-       struct drm_connector *connector;
-       struct drm_connector_state *connector_state;
-       struct intel_encoder *encoder;
-       int num_connectors = 0, i;
-       bool is_lvds = false;
-
-       for_each_connector_in_state(state, connector, connector_state, i) {
-               if (connector_state->crtc != crtc_state->base.crtc)
-                       continue;
-
-               encoder = to_intel_encoder(connector_state->best_encoder);
-
-               switch (encoder->type) {
-               case INTEL_OUTPUT_LVDS:
-                       is_lvds = true;
-                       break;
-               default:
-                       break;
-               }
-               num_connectors++;
-       }
-
-       if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2) {
-               DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n",
-                             dev_priv->vbt.lvds_ssc_freq);
-               return dev_priv->vbt.lvds_ssc_freq;
-       }
-
-       return 120000;
-}
-
 static void ironlake_set_pipeconf(struct drm_crtc *crtc)
 {
        struct drm_i915_private *dev_priv = crtc->dev->dev_private;
@@ -8713,82 +8724,14 @@ static void ironlake_set_pipeconf(struct drm_crtc *crtc)
        POSTING_READ(PIPECONF(pipe));
 }
 
-/*
- * Set up the pipe CSC unit.
- *
- * Currently only full range RGB to limited range RGB conversion
- * is supported, but eventually this should handle various
- * RGB<->YCbCr scenarios as well.
- */
-static void intel_set_pipe_csc(struct drm_crtc *crtc)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       int pipe = intel_crtc->pipe;
-       uint16_t coeff = 0x7800; /* 1.0 */
-
-       /*
-        * TODO: Check what kind of values actually come out of the pipe
-        * with these coeff/postoff values and adjust to get the best
-        * accuracy. Perhaps we even need to take the bpc value into
-        * consideration.
-        */
-
-       if (intel_crtc->config->limited_color_range)
-               coeff = ((235 - 16) * (1 << 12) / 255) & 0xff8; /* 0.xxx... */
-
-       /*
-        * GY/GU and RY/RU should be the other way around according
-        * to BSpec, but reality doesn't agree. Just set them up in
-        * a way that results in the correct picture.
-        */
-       I915_WRITE(PIPE_CSC_COEFF_RY_GY(pipe), coeff << 16);
-       I915_WRITE(PIPE_CSC_COEFF_BY(pipe), 0);
-
-       I915_WRITE(PIPE_CSC_COEFF_RU_GU(pipe), coeff);
-       I915_WRITE(PIPE_CSC_COEFF_BU(pipe), 0);
-
-       I915_WRITE(PIPE_CSC_COEFF_RV_GV(pipe), 0);
-       I915_WRITE(PIPE_CSC_COEFF_BV(pipe), coeff << 16);
-
-       I915_WRITE(PIPE_CSC_PREOFF_HI(pipe), 0);
-       I915_WRITE(PIPE_CSC_PREOFF_ME(pipe), 0);
-       I915_WRITE(PIPE_CSC_PREOFF_LO(pipe), 0);
-
-       if (INTEL_INFO(dev)->gen > 6) {
-               uint16_t postoff = 0;
-
-               if (intel_crtc->config->limited_color_range)
-                       postoff = (16 * (1 << 12) / 255) & 0x1fff;
-
-               I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff);
-               I915_WRITE(PIPE_CSC_POSTOFF_ME(pipe), postoff);
-               I915_WRITE(PIPE_CSC_POSTOFF_LO(pipe), postoff);
-
-               I915_WRITE(PIPE_CSC_MODE(pipe), 0);
-       } else {
-               uint32_t mode = CSC_MODE_YUV_TO_RGB;
-
-               if (intel_crtc->config->limited_color_range)
-                       mode |= CSC_BLACK_SCREEN_OFFSET;
-
-               I915_WRITE(PIPE_CSC_MODE(pipe), mode);
-       }
-}
-
 static void haswell_set_pipeconf(struct drm_crtc *crtc)
 {
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = crtc->dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       enum pipe pipe = intel_crtc->pipe;
        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
-       uint32_t val;
-
-       val = 0;
+       u32 val = 0;
 
-       if (IS_HASWELL(dev) && intel_crtc->config->dither)
+       if (IS_HASWELL(dev_priv) && intel_crtc->config->dither)
                val |= (PIPECONF_DITHER_EN | PIPECONF_DITHER_TYPE_SP);
 
        if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_INTERLACE)
@@ -8798,12 +8741,15 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
 
        I915_WRITE(PIPECONF(cpu_transcoder), val);
        POSTING_READ(PIPECONF(cpu_transcoder));
+}
 
-       I915_WRITE(GAMMA_MODE(intel_crtc->pipe), GAMMA_MODE_MODE_8BIT);
-       POSTING_READ(GAMMA_MODE(intel_crtc->pipe));
+static void haswell_set_pipemisc(struct drm_crtc *crtc)
+{
+       struct drm_i915_private *dev_priv = crtc->dev->dev_private;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
-       if (IS_BROADWELL(dev) || INTEL_INFO(dev)->gen >= 9) {
-               val = 0;
+       if (IS_BROADWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 9) {
+               u32 val = 0;
 
                switch (intel_crtc->config->pipe_bpp) {
                case 18:
@@ -8821,42 +8767,13 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc)
                default:
                        /* Case prevented by pipe_config_set_bpp. */
                        BUG();
-               }
-
-               if (intel_crtc->config->dither)
-                       val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
-
-               I915_WRITE(PIPEMISC(pipe), val);
-       }
-}
-
-static bool ironlake_compute_clocks(struct drm_crtc *crtc,
-                                   struct intel_crtc_state *crtc_state,
-                                   intel_clock_t *clock,
-                                   bool *has_reduced_clock,
-                                   intel_clock_t *reduced_clock)
-{
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int refclk;
-       const intel_limit_t *limit;
-       bool ret;
-
-       refclk = ironlake_get_refclk(crtc_state);
+               }
 
-       /*
-        * Returns a set of divisors for the desired target clock with the given
-        * refclk, or FALSE.  The returned values represent the clock equation:
-        * reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
-        */
-       limit = intel_limit(crtc_state, refclk);
-       ret = dev_priv->display.find_dpll(limit, crtc_state,
-                                         crtc_state->port_clock,
-                                         refclk, NULL, clock);
-       if (!ret)
-               return false;
+               if (intel_crtc->config->dither)
+                       val |= PIPEMISC_DITHER_ENABLE | PIPEMISC_DITHER_TYPE_SP;
 
-       return true;
+               I915_WRITE(PIPEMISC(intel_crtc->pipe), val);
+       }
 }
 
 int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp)
@@ -8875,10 +8792,9 @@ static bool ironlake_needs_fb_cb_tune(struct dpll *dpll, int factor)
        return i9xx_dpll_compute_m(dpll) < factor * dpll->n;
 }
 
-static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
-                                     struct intel_crtc_state *crtc_state,
-                                     u32 *fp,
-                                     intel_clock_t *reduced_clock, u32 *fp2)
+static void ironlake_compute_dpll(struct intel_crtc *intel_crtc,
+                                 struct intel_crtc_state *crtc_state,
+                                 intel_clock_t *reduced_clock)
 {
        struct drm_crtc *crtc = &intel_crtc->base;
        struct drm_device *dev = crtc->dev;
@@ -8887,8 +8803,8 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
        struct drm_connector *connector;
        struct drm_connector_state *connector_state;
        struct intel_encoder *encoder;
-       uint32_t dpll;
-       int factor, num_connectors = 0, i;
+       u32 dpll, fp, fp2;
+       int factor, i;
        bool is_lvds = false, is_sdvo = false;
 
        for_each_connector_in_state(state, connector, connector_state, i) {
@@ -8908,8 +8824,6 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
                default:
                        break;
                }
-
-               num_connectors++;
        }
 
        /* Enable autotuning of the PLL clock (if permissible) */
@@ -8922,11 +8836,19 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
        } else if (crtc_state->sdvo_tv_clock)
                factor = 20;
 
+       fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
+
        if (ironlake_needs_fb_cb_tune(&crtc_state->dpll, factor))
-               *fp |= FP_CB_TUNE;
+               fp |= FP_CB_TUNE;
 
-       if (fp2 && (reduced_clock->m < factor * reduced_clock->n))
-               *fp2 |= FP_CB_TUNE;
+       if (reduced_clock) {
+               fp2 = i9xx_dpll_compute_fp(reduced_clock);
+
+               if (reduced_clock->m < factor * reduced_clock->n)
+                       fp2 |= FP_CB_TUNE;
+       } else {
+               fp2 = fp;
+       }
 
        dpll = 0;
 
@@ -8963,76 +8885,80 @@ static uint32_t ironlake_compute_dpll(struct intel_crtc *intel_crtc,
                break;
        }
 
-       if (is_lvds && intel_panel_use_ssc(dev_priv) && num_connectors < 2)
+       if (is_lvds && intel_panel_use_ssc(dev_priv))
                dpll |= PLLB_REF_INPUT_SPREADSPECTRUMIN;
        else
                dpll |= PLL_REF_INPUT_DREFCLK;
 
-       return dpll | DPLL_VCO_ENABLE;
+       dpll |= DPLL_VCO_ENABLE;
+
+       crtc_state->dpll_hw_state.dpll = dpll;
+       crtc_state->dpll_hw_state.fp0 = fp;
+       crtc_state->dpll_hw_state.fp1 = fp2;
 }
 
 static int ironlake_crtc_compute_clock(struct intel_crtc *crtc,
                                       struct intel_crtc_state *crtc_state)
 {
        struct drm_device *dev = crtc->base.dev;
-       intel_clock_t clock, reduced_clock;
-       u32 dpll = 0, fp = 0, fp2 = 0;
-       bool ok, has_reduced_clock = false;
-       bool is_lvds = false;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       intel_clock_t reduced_clock;
+       bool has_reduced_clock = false;
        struct intel_shared_dpll *pll;
+       const intel_limit_t *limit;
+       int refclk = 120000;
 
        memset(&crtc_state->dpll_hw_state, 0,
               sizeof(crtc_state->dpll_hw_state));
 
-       is_lvds = intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS);
+       crtc->lowfreq_avail = false;
+
+       /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
+       if (!crtc_state->has_pch_encoder)
+               return 0;
+
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS)) {
+               if (intel_panel_use_ssc(dev_priv)) {
+                       DRM_DEBUG_KMS("using SSC reference clock of %d kHz\n",
+                                     dev_priv->vbt.lvds_ssc_freq);
+                       refclk = dev_priv->vbt.lvds_ssc_freq;
+               }
 
-       WARN(!(HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)),
-            "Unexpected PCH type %d\n", INTEL_PCH_TYPE(dev));
+               if (intel_is_dual_link_lvds(dev)) {
+                       if (refclk == 100000)
+                               limit = &intel_limits_ironlake_dual_lvds_100m;
+                       else
+                               limit = &intel_limits_ironlake_dual_lvds;
+               } else {
+                       if (refclk == 100000)
+                               limit = &intel_limits_ironlake_single_lvds_100m;
+                       else
+                               limit = &intel_limits_ironlake_single_lvds;
+               }
+       } else {
+               limit = &intel_limits_ironlake_dac;
+       }
 
-       ok = ironlake_compute_clocks(&crtc->base, crtc_state, &clock,
-                                    &has_reduced_clock, &reduced_clock);
-       if (!ok && !crtc_state->clock_set) {
+       if (!crtc_state->clock_set &&
+           !g4x_find_best_dpll(limit, crtc_state, crtc_state->port_clock,
+                               refclk, NULL, &crtc_state->dpll)) {
                DRM_ERROR("Couldn't find PLL settings for mode!\n");
                return -EINVAL;
        }
-       /* Compat-code for transition, will disappear. */
-       if (!crtc_state->clock_set) {
-               crtc_state->dpll.n = clock.n;
-               crtc_state->dpll.m1 = clock.m1;
-               crtc_state->dpll.m2 = clock.m2;
-               crtc_state->dpll.p1 = clock.p1;
-               crtc_state->dpll.p2 = clock.p2;
-       }
-
-       /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */
-       if (crtc_state->has_pch_encoder) {
-               fp = i9xx_dpll_compute_fp(&crtc_state->dpll);
-               if (has_reduced_clock)
-                       fp2 = i9xx_dpll_compute_fp(&reduced_clock);
 
-               dpll = ironlake_compute_dpll(crtc, crtc_state,
-                                            &fp, &reduced_clock,
-                                            has_reduced_clock ? &fp2 : NULL);
-
-               crtc_state->dpll_hw_state.dpll = dpll;
-               crtc_state->dpll_hw_state.fp0 = fp;
-               if (has_reduced_clock)
-                       crtc_state->dpll_hw_state.fp1 = fp2;
-               else
-                       crtc_state->dpll_hw_state.fp1 = fp;
+       ironlake_compute_dpll(crtc, crtc_state,
+                             has_reduced_clock ? &reduced_clock : NULL);
 
-               pll = intel_get_shared_dpll(crtc, crtc_state);
-               if (pll == NULL) {
-                       DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
-                                        pipe_name(crtc->pipe));
-                       return -EINVAL;
-               }
+       pll = intel_get_shared_dpll(crtc, crtc_state, NULL);
+       if (pll == NULL) {
+               DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
+                                pipe_name(crtc->pipe));
+               return -EINVAL;
        }
 
-       if (is_lvds && has_reduced_clock)
+       if (intel_pipe_will_have_type(crtc_state, INTEL_OUTPUT_LVDS) &&
+           has_reduced_clock)
                crtc->lowfreq_avail = true;
-       else
-               crtc->lowfreq_avail = false;
 
        return 0;
 }
@@ -9334,7 +9260,7 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
                return false;
 
        pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
-       pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+       pipe_config->shared_dpll = NULL;
 
        ret = false;
        tmp = I915_READ(PIPECONF(crtc->pipe));
@@ -9363,6 +9289,7 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
 
        if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
                struct intel_shared_dpll *pll;
+               enum intel_dpll_id pll_id;
 
                pipe_config->has_pch_encoder = true;
 
@@ -9372,21 +9299,22 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
 
                ironlake_get_fdi_m_n_config(crtc, pipe_config);
 
-               if (HAS_PCH_IBX(dev_priv->dev)) {
-                       pipe_config->shared_dpll =
-                               (enum intel_dpll_id) crtc->pipe;
+               if (HAS_PCH_IBX(dev_priv)) {
+                       pll_id = (enum intel_dpll_id) crtc->pipe;
                } else {
                        tmp = I915_READ(PCH_DPLL_SEL);
                        if (tmp & TRANS_DPLLB_SEL(crtc->pipe))
-                               pipe_config->shared_dpll = DPLL_ID_PCH_PLL_B;
+                               pll_id = DPLL_ID_PCH_PLL_B;
                        else
-                               pipe_config->shared_dpll = DPLL_ID_PCH_PLL_A;
+                               pll_id= DPLL_ID_PCH_PLL_A;
                }
 
-               pll = &dev_priv->shared_dplls[pipe_config->shared_dpll];
+               pipe_config->shared_dpll =
+                       intel_get_shared_dpll_by_id(dev_priv, pll_id);
+               pll = pipe_config->shared_dpll;
 
-               WARN_ON(!pll->get_hw_state(dev_priv, pll,
-                                          &pipe_config->dpll_hw_state));
+               WARN_ON(!pll->funcs.get_hw_state(dev_priv, pll,
+                                                &pipe_config->dpll_hw_state));
 
                tmp = pipe_config->dpll_hw_state.dpll;
                pipe_config->pixel_multiplier =
@@ -9399,6 +9327,7 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
        }
 
        intel_get_pipe_timings(crtc, pipe_config);
+       intel_get_pipe_src_size(crtc, pipe_config);
 
        ironlake_get_pfit_config(crtc, pipe_config);
 
@@ -9638,7 +9567,7 @@ static void broxton_modeset_commit_cdclk(struct drm_atomic_state *old_state)
                to_intel_atomic_state(old_state);
        unsigned int req_cdclk = old_intel_state->dev_cdclk;
 
-       broxton_set_cdclk(dev, req_cdclk);
+       broxton_set_cdclk(to_i915(dev), req_cdclk);
 }
 
 /* compute the max rate for new configuration */
@@ -9706,8 +9635,8 @@ static void broadwell_set_cdclk(struct drm_device *dev, int cdclk)
        val |= LCPLL_CD_SOURCE_FCLK;
        I915_WRITE(LCPLL_CTL, val);
 
-       if (wait_for_atomic_us(I915_READ(LCPLL_CTL) &
-                              LCPLL_CD_SOURCE_FCLK_DONE, 1))
+       if (wait_for_us(I915_READ(LCPLL_CTL) &
+                       LCPLL_CD_SOURCE_FCLK_DONE, 1))
                DRM_ERROR("Switching to FCLK failed\n");
 
        val = I915_READ(LCPLL_CTL);
@@ -9741,8 +9670,8 @@ static void broadwell_set_cdclk(struct drm_device *dev, int cdclk)
        val &= ~LCPLL_CD_SOURCE_FCLK;
        I915_WRITE(LCPLL_CTL, val);
 
-       if (wait_for_atomic_us((I915_READ(LCPLL_CTL) &
-                               LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
+       if (wait_for_us((I915_READ(LCPLL_CTL) &
+                       LCPLL_CD_SOURCE_FCLK_DONE) == 0, 1))
                DRM_ERROR("Switching back to LCPLL failed\n");
 
        mutex_lock(&dev_priv->rps.hw_lock);
@@ -9821,72 +9750,193 @@ static void bxt_get_ddi_pll(struct drm_i915_private *dev_priv,
                                enum port port,
                                struct intel_crtc_state *pipe_config)
 {
+       enum intel_dpll_id id;
+
        switch (port) {
        case PORT_A:
                pipe_config->ddi_pll_sel = SKL_DPLL0;
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL1;
+               id = DPLL_ID_SKL_DPLL0;
                break;
        case PORT_B:
                pipe_config->ddi_pll_sel = SKL_DPLL1;
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL2;
+               id = DPLL_ID_SKL_DPLL1;
                break;
        case PORT_C:
                pipe_config->ddi_pll_sel = SKL_DPLL2;
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL3;
+               id = DPLL_ID_SKL_DPLL2;
                break;
        default:
                DRM_ERROR("Incorrect port type\n");
+               return;
        }
+
+       pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
 }
 
 static void skylake_get_ddi_pll(struct drm_i915_private *dev_priv,
                                enum port port,
                                struct intel_crtc_state *pipe_config)
 {
-       u32 temp, dpll_ctl1;
+       enum intel_dpll_id id;
+       u32 temp;
 
        temp = I915_READ(DPLL_CTRL2) & DPLL_CTRL2_DDI_CLK_SEL_MASK(port);
        pipe_config->ddi_pll_sel = temp >> (port * 3 + 1);
 
        switch (pipe_config->ddi_pll_sel) {
        case SKL_DPLL0:
-               /*
-                * On SKL the eDP DPLL (DPLL0 as we don't use SSC) is not part
-                * of the shared DPLL framework and thus needs to be read out
-                * separately
-                */
-               dpll_ctl1 = I915_READ(DPLL_CTRL1);
-               pipe_config->dpll_hw_state.ctrl1 = dpll_ctl1 & 0x3f;
+               id = DPLL_ID_SKL_DPLL0;
                break;
        case SKL_DPLL1:
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL1;
+               id = DPLL_ID_SKL_DPLL1;
                break;
        case SKL_DPLL2:
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL2;
+               id = DPLL_ID_SKL_DPLL2;
                break;
        case SKL_DPLL3:
-               pipe_config->shared_dpll = DPLL_ID_SKL_DPLL3;
+               id = DPLL_ID_SKL_DPLL3;
                break;
+       default:
+               MISSING_CASE(pipe_config->ddi_pll_sel);
+               return;
        }
+
+       pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
 }
 
 static void haswell_get_ddi_pll(struct drm_i915_private *dev_priv,
                                enum port port,
                                struct intel_crtc_state *pipe_config)
 {
+       enum intel_dpll_id id;
+
        pipe_config->ddi_pll_sel = I915_READ(PORT_CLK_SEL(port));
 
        switch (pipe_config->ddi_pll_sel) {
        case PORT_CLK_SEL_WRPLL1:
-               pipe_config->shared_dpll = DPLL_ID_WRPLL1;
+               id = DPLL_ID_WRPLL1;
                break;
        case PORT_CLK_SEL_WRPLL2:
-               pipe_config->shared_dpll = DPLL_ID_WRPLL2;
+               id = DPLL_ID_WRPLL2;
                break;
        case PORT_CLK_SEL_SPLL:
-               pipe_config->shared_dpll = DPLL_ID_SPLL;
+               id = DPLL_ID_SPLL;
+               break;
+       case PORT_CLK_SEL_LCPLL_810:
+               id = DPLL_ID_LCPLL_810;
+               break;
+       case PORT_CLK_SEL_LCPLL_1350:
+               id = DPLL_ID_LCPLL_1350;
+               break;
+       case PORT_CLK_SEL_LCPLL_2700:
+               id = DPLL_ID_LCPLL_2700;
+               break;
+       default:
+               MISSING_CASE(pipe_config->ddi_pll_sel);
+               /* fall through */
+       case PORT_CLK_SEL_NONE:
+               return;
+       }
+
+       pipe_config->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, id);
+}
+
+static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
+                                    struct intel_crtc_state *pipe_config,
+                                    unsigned long *power_domain_mask)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum intel_display_power_domain power_domain;
+       u32 tmp;
+
+       pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
+
+       /*
+        * XXX: Do intel_display_power_get_if_enabled before reading this (for
+        * consistency and less surprising code; it's in always on power).
+        */
+       tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
+       if (tmp & TRANS_DDI_FUNC_ENABLE) {
+               enum pipe trans_edp_pipe;
+               switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
+               default:
+                       WARN(1, "unknown pipe linked to edp transcoder\n");
+               case TRANS_DDI_EDP_INPUT_A_ONOFF:
+               case TRANS_DDI_EDP_INPUT_A_ON:
+                       trans_edp_pipe = PIPE_A;
+                       break;
+               case TRANS_DDI_EDP_INPUT_B_ONOFF:
+                       trans_edp_pipe = PIPE_B;
+                       break;
+               case TRANS_DDI_EDP_INPUT_C_ONOFF:
+                       trans_edp_pipe = PIPE_C;
+                       break;
+               }
+
+               if (trans_edp_pipe == crtc->pipe)
+                       pipe_config->cpu_transcoder = TRANSCODER_EDP;
+       }
+
+       power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
+       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+               return false;
+       *power_domain_mask |= BIT(power_domain);
+
+       tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
+
+       return tmp & PIPECONF_ENABLE;
+}
+
+static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
+                                        struct intel_crtc_state *pipe_config,
+                                        unsigned long *power_domain_mask)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       enum intel_display_power_domain power_domain;
+       enum port port;
+       enum transcoder cpu_transcoder;
+       u32 tmp;
+
+       pipe_config->has_dsi_encoder = false;
+
+       for_each_port_masked(port, BIT(PORT_A) | BIT(PORT_C)) {
+               if (port == PORT_A)
+                       cpu_transcoder = TRANSCODER_DSI_A;
+               else
+                       cpu_transcoder = TRANSCODER_DSI_C;
+
+               power_domain = POWER_DOMAIN_TRANSCODER(cpu_transcoder);
+               if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+                       continue;
+               *power_domain_mask |= BIT(power_domain);
+
+               /*
+                * The PLL needs to be enabled with a valid divider
+                * configuration, otherwise accessing DSI registers will hang
+                * the machine. See BSpec North Display Engine
+                * registers/MIPI[BXT]. We can break out here early, since we
+                * need the same DSI PLL to be enabled for both DSI ports.
+                */
+               if (!intel_dsi_pll_is_enabled(dev_priv))
+                       break;
+
+               /* XXX: this works for video mode only */
+               tmp = I915_READ(BXT_MIPI_PORT_CTRL(port));
+               if (!(tmp & DPI_ENABLE))
+                       continue;
+
+               tmp = I915_READ(MIPI_CTRL(port));
+               if ((tmp & BXT_PIPE_SELECT_MASK) != BXT_PIPE_SELECT(crtc->pipe))
+                       continue;
+
+               pipe_config->cpu_transcoder = cpu_transcoder;
+               pipe_config->has_dsi_encoder = true;
                break;
        }
+
+       return pipe_config->has_dsi_encoder;
 }
 
 static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
@@ -9909,11 +9959,10 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
        else
                haswell_get_ddi_pll(dev_priv, port, pipe_config);
 
-       if (pipe_config->shared_dpll >= 0) {
-               pll = &dev_priv->shared_dplls[pipe_config->shared_dpll];
-
-               WARN_ON(!pll->get_hw_state(dev_priv, pll,
-                                          &pipe_config->dpll_hw_state));
+       pll = pipe_config->shared_dpll;
+       if (pll) {
+               WARN_ON(!pll->funcs.get_hw_state(dev_priv, pll,
+                                                &pipe_config->dpll_hw_state));
        }
 
        /*
@@ -9940,53 +9989,37 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum intel_display_power_domain power_domain;
        unsigned long power_domain_mask;
-       uint32_t tmp;
-       bool ret;
+       bool active;
 
        power_domain = POWER_DOMAIN_PIPE(crtc->pipe);
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
        power_domain_mask = BIT(power_domain);
 
-       ret = false;
-
-       pipe_config->cpu_transcoder = (enum transcoder) crtc->pipe;
-       pipe_config->shared_dpll = DPLL_ID_PRIVATE;
+       pipe_config->shared_dpll = NULL;
 
-       tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
-       if (tmp & TRANS_DDI_FUNC_ENABLE) {
-               enum pipe trans_edp_pipe;
-               switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
-               default:
-                       WARN(1, "unknown pipe linked to edp transcoder\n");
-               case TRANS_DDI_EDP_INPUT_A_ONOFF:
-               case TRANS_DDI_EDP_INPUT_A_ON:
-                       trans_edp_pipe = PIPE_A;
-                       break;
-               case TRANS_DDI_EDP_INPUT_B_ONOFF:
-                       trans_edp_pipe = PIPE_B;
-                       break;
-               case TRANS_DDI_EDP_INPUT_C_ONOFF:
-                       trans_edp_pipe = PIPE_C;
-                       break;
-               }
+       active = hsw_get_transcoder_state(crtc, pipe_config, &power_domain_mask);
 
-               if (trans_edp_pipe == crtc->pipe)
-                       pipe_config->cpu_transcoder = TRANSCODER_EDP;
+       if (IS_BROXTON(dev_priv)) {
+               bxt_get_dsi_transcoder_state(crtc, pipe_config,
+                                            &power_domain_mask);
+               WARN_ON(active && pipe_config->has_dsi_encoder);
+               if (pipe_config->has_dsi_encoder)
+                       active = true;
        }
 
-       power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);
-       if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
+       if (!active)
                goto out;
-       power_domain_mask |= BIT(power_domain);
 
-       tmp = I915_READ(PIPECONF(pipe_config->cpu_transcoder));
-       if (!(tmp & PIPECONF_ENABLE))
-               goto out;
+       if (!pipe_config->has_dsi_encoder) {
+               haswell_get_ddi_port_state(crtc, pipe_config);
+               intel_get_pipe_timings(crtc, pipe_config);
+       }
 
-       haswell_get_ddi_port_state(crtc, pipe_config);
+       intel_get_pipe_src_size(crtc, pipe_config);
 
-       intel_get_pipe_timings(crtc, pipe_config);
+       pipe_config->gamma_mode =
+               I915_READ(GAMMA_MODE(crtc->pipe)) & GAMMA_MODE_MODE_MASK;
 
        if (INTEL_INFO(dev)->gen >= 9) {
                skl_init_scalers(dev, crtc, pipe_config);
@@ -10010,20 +10043,19 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
                pipe_config->ips_enabled = hsw_crtc_supports_ips(crtc) &&
                        (I915_READ(IPS_CTL) & IPS_ENABLE);
 
-       if (pipe_config->cpu_transcoder != TRANSCODER_EDP) {
+       if (pipe_config->cpu_transcoder != TRANSCODER_EDP &&
+           !transcoder_is_dsi(pipe_config->cpu_transcoder)) {
                pipe_config->pixel_multiplier =
                        I915_READ(PIPE_MULT(pipe_config->cpu_transcoder)) + 1;
        } else {
                pipe_config->pixel_multiplier = 1;
        }
 
-       ret = true;
-
 out:
        for_each_power_domain(power_domain, power_domain_mask)
                intel_display_power_put(dev_priv, power_domain);
 
-       return ret;
+       return active;
 }
 
 static void i845_update_cursor(struct drm_crtc *crtc, u32 base,
@@ -10216,21 +10248,6 @@ static bool cursor_size_ok(struct drm_device *dev,
        return true;
 }
 
-static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
-                                u16 *blue, uint32_t start, uint32_t size)
-{
-       int end = (start + size > 256) ? 256 : start + size, i;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-
-       for (i = start; i < end; i++) {
-               intel_crtc->lut_r[i] = red[i] >> 8;
-               intel_crtc->lut_g[i] = green[i] >> 8;
-               intel_crtc->lut_b[i] = blue[i] >> 8;
-       }
-
-       intel_crtc_load_lut(crtc);
-}
-
 /* VESA 640x480x72Hz mode to set on the pipe */
 static struct drm_display_mode load_detect_mode = {
        DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 31500, 640, 664,
@@ -10718,19 +10735,18 @@ int intel_dotclock_calculate(int link_freq,
 static void ironlake_pch_clock_get(struct intel_crtc *crtc,
                                   struct intel_crtc_state *pipe_config)
 {
-       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
 
        /* read out port_clock from the DPLL */
        i9xx_crtc_clock_get(crtc, pipe_config);
 
        /*
-        * This value does not include pixel_multiplier.
-        * We will check that port_clock and adjusted_mode.crtc_clock
-        * agree once we know their relationship in the encoder's
-        * get_config() function.
+        * In case there is an active pipe without active ports,
+        * we may need some idea for the dotclock anyway.
+        * Calculate one based on the FDI configuration.
         */
        pipe_config->base.adjusted_mode.crtc_clock =
-               intel_dotclock_calculate(intel_fdi_link_freq(dev) * 10000,
+               intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
                                         &pipe_config->fdi_m_n);
 }
 
@@ -10849,7 +10865,7 @@ static void intel_unpin_work_fn(struct work_struct *__work)
        struct drm_plane *primary = crtc->base.primary;
 
        mutex_lock(&dev->struct_mutex);
-       intel_unpin_fb_obj(work->old_fb, primary->state);
+       intel_unpin_fb_obj(work->old_fb, primary->state->rotation);
        drm_gem_object_unreference(&work->pending_flip_obj->base);
 
        if (work->flip_queued_req)
@@ -10923,9 +10939,10 @@ static bool page_flip_finished(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
+       unsigned reset_counter;
 
-       if (i915_reset_in_progress(&dev_priv->gpu_error) ||
-           crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
+       reset_counter = i915_reset_counter(&dev_priv->gpu_error);
+       if (crtc->reset_counter != reset_counter)
                return true;
 
        /*
@@ -11003,7 +11020,7 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
                                 struct drm_i915_gem_request *req,
                                 uint32_t flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 flip_mask;
        int ret;
@@ -11019,13 +11036,13 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
                flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
        else
                flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
-       intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_emit(ring, MI_DISPLAY_FLIP |
+       intel_ring_emit(engine, MI_WAIT_FOR_EVENT | flip_mask);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_emit(engine, MI_DISPLAY_FLIP |
                        MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
-       intel_ring_emit(ring, fb->pitches[0]);
-       intel_ring_emit(ring, intel_crtc->unpin_work->gtt_offset);
-       intel_ring_emit(ring, 0); /* aux display base address, unused */
+       intel_ring_emit(engine, fb->pitches[0]);
+       intel_ring_emit(engine, intel_crtc->unpin_work->gtt_offset);
+       intel_ring_emit(engine, 0); /* aux display base address, unused */
 
        intel_mark_page_flip_active(intel_crtc->unpin_work);
        return 0;
@@ -11038,7 +11055,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
                                 struct drm_i915_gem_request *req,
                                 uint32_t flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        u32 flip_mask;
        int ret;
@@ -11051,13 +11068,13 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
                flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
        else
                flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
-       intel_ring_emit(ring, MI_WAIT_FOR_EVENT | flip_mask);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 |
+       intel_ring_emit(engine, MI_WAIT_FOR_EVENT | flip_mask);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_emit(engine, MI_DISPLAY_FLIP_I915 |
                        MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
-       intel_ring_emit(ring, fb->pitches[0]);
-       intel_ring_emit(ring, intel_crtc->unpin_work->gtt_offset);
-       intel_ring_emit(ring, MI_NOOP);
+       intel_ring_emit(engine, fb->pitches[0]);
+       intel_ring_emit(engine, intel_crtc->unpin_work->gtt_offset);
+       intel_ring_emit(engine, MI_NOOP);
 
        intel_mark_page_flip_active(intel_crtc->unpin_work);
        return 0;
@@ -11070,7 +11087,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
                                 struct drm_i915_gem_request *req,
                                 uint32_t flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        uint32_t pf, pipesrc;
@@ -11084,10 +11101,10 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
         * Display Registers (which do not change across a page-flip)
         * so we need only reprogram the base address.
         */
-       intel_ring_emit(ring, MI_DISPLAY_FLIP |
+       intel_ring_emit(engine, MI_DISPLAY_FLIP |
                        MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
-       intel_ring_emit(ring, fb->pitches[0]);
-       intel_ring_emit(ring, intel_crtc->unpin_work->gtt_offset |
+       intel_ring_emit(engine, fb->pitches[0]);
+       intel_ring_emit(engine, intel_crtc->unpin_work->gtt_offset |
                        obj->tiling_mode);
 
        /* XXX Enabling the panel-fitter across page-flip is so far
@@ -11096,7 +11113,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
         */
        pf = 0;
        pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
-       intel_ring_emit(ring, pf | pipesrc);
+       intel_ring_emit(engine, pf | pipesrc);
 
        intel_mark_page_flip_active(intel_crtc->unpin_work);
        return 0;
@@ -11109,7 +11126,7 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
                                 struct drm_i915_gem_request *req,
                                 uint32_t flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        uint32_t pf, pipesrc;
@@ -11119,10 +11136,10 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_DISPLAY_FLIP |
+       intel_ring_emit(engine, MI_DISPLAY_FLIP |
                        MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
-       intel_ring_emit(ring, fb->pitches[0] | obj->tiling_mode);
-       intel_ring_emit(ring, intel_crtc->unpin_work->gtt_offset);
+       intel_ring_emit(engine, fb->pitches[0] | obj->tiling_mode);
+       intel_ring_emit(engine, intel_crtc->unpin_work->gtt_offset);
 
        /* Contrary to the suggestions in the documentation,
         * "Enable Panel Fitter" does not seem to be required when page
@@ -11132,7 +11149,7 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
         */
        pf = 0;
        pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
-       intel_ring_emit(ring, pf | pipesrc);
+       intel_ring_emit(engine, pf | pipesrc);
 
        intel_mark_page_flip_active(intel_crtc->unpin_work);
        return 0;
@@ -11145,7 +11162,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
                                 struct drm_i915_gem_request *req,
                                 uint32_t flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        uint32_t plane_bit = 0;
        int len, ret;
@@ -11166,7 +11183,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
        }
 
        len = 4;
-       if (ring->id == RCS) {
+       if (engine->id == RCS) {
                len += 6;
                /*
                 * On Gen 8, SRM is now taking an extra dword to accommodate
@@ -11204,36 +11221,36 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
         * for the RCS also doesn't appear to drop events. Setting the DERRMR
         * to zero does lead to lockups within MI_DISPLAY_FLIP.
         */
-       if (ring->id == RCS) {
-               intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1));
-               intel_ring_emit_reg(ring, DERRMR);
-               intel_ring_emit(ring, ~(DERRMR_PIPEA_PRI_FLIP_DONE |
-                                       DERRMR_PIPEB_PRI_FLIP_DONE |
-                                       DERRMR_PIPEC_PRI_FLIP_DONE));
+       if (engine->id == RCS) {
+               intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(1));
+               intel_ring_emit_reg(engine, DERRMR);
+               intel_ring_emit(engine, ~(DERRMR_PIPEA_PRI_FLIP_DONE |
+                                         DERRMR_PIPEB_PRI_FLIP_DONE |
+                                         DERRMR_PIPEC_PRI_FLIP_DONE));
                if (IS_GEN8(dev))
-                       intel_ring_emit(ring, MI_STORE_REGISTER_MEM_GEN8 |
+                       intel_ring_emit(engine, MI_STORE_REGISTER_MEM_GEN8 |
                                              MI_SRM_LRM_GLOBAL_GTT);
                else
-                       intel_ring_emit(ring, MI_STORE_REGISTER_MEM |
+                       intel_ring_emit(engine, MI_STORE_REGISTER_MEM |
                                              MI_SRM_LRM_GLOBAL_GTT);
-               intel_ring_emit_reg(ring, DERRMR);
-               intel_ring_emit(ring, ring->scratch.gtt_offset + 256);
+               intel_ring_emit_reg(engine, DERRMR);
+               intel_ring_emit(engine, engine->scratch.gtt_offset + 256);
                if (IS_GEN8(dev)) {
-                       intel_ring_emit(ring, 0);
-                       intel_ring_emit(ring, MI_NOOP);
+                       intel_ring_emit(engine, 0);
+                       intel_ring_emit(engine, MI_NOOP);
                }
        }
 
-       intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit);
-       intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode));
-       intel_ring_emit(ring, intel_crtc->unpin_work->gtt_offset);
-       intel_ring_emit(ring, (MI_NOOP));
+       intel_ring_emit(engine, MI_DISPLAY_FLIP_I915 | plane_bit);
+       intel_ring_emit(engine, (fb->pitches[0] | obj->tiling_mode));
+       intel_ring_emit(engine, intel_crtc->unpin_work->gtt_offset);
+       intel_ring_emit(engine, (MI_NOOP));
 
        intel_mark_page_flip_active(intel_crtc->unpin_work);
        return 0;
 }
 
-static bool use_mmio_flip(struct intel_engine_cs *ring,
+static bool use_mmio_flip(struct intel_engine_cs *engine,
                          struct drm_i915_gem_object *obj)
 {
        /*
@@ -11244,10 +11261,10 @@ static bool use_mmio_flip(struct intel_engine_cs *ring,
         * So using MMIO flips there would disrupt this mechanism.
         */
 
-       if (ring == NULL)
+       if (engine == NULL)
                return true;
 
-       if (INTEL_INFO(ring->dev)->gen < 5)
+       if (INTEL_INFO(engine->dev)->gen < 5)
                return false;
 
        if (i915.use_mmio_flip < 0)
@@ -11261,7 +11278,7 @@ static bool use_mmio_flip(struct intel_engine_cs *ring,
                                                       false))
                return true;
        else
-               return ring != i915_gem_request_get_ring(obj->last_write_req);
+               return engine != i915_gem_request_get_engine(obj->last_write_req);
 }
 
 static void skl_do_mmio_flip(struct intel_crtc *intel_crtc,
@@ -11379,7 +11396,6 @@ static void intel_mmio_flip_work_func(struct work_struct *work)
 
        if (mmio_flip->req) {
                WARN_ON(__i915_wait_request(mmio_flip->req,
-                                           mmio_flip->crtc->reset_counter,
                                            false, NULL,
                                            &mmio_flip->i915->rps.mmioflips));
                i915_gem_request_unreference__unlocked(mmio_flip->req);
@@ -11507,7 +11523,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        struct drm_plane *primary = crtc->primary;
        enum pipe pipe = intel_crtc->pipe;
        struct intel_unpin_work *work;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        bool mmio_flip;
        struct drm_i915_gem_request *request = NULL;
        int ret;
@@ -11587,28 +11603,33 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        if (ret)
                goto cleanup;
 
+       intel_crtc->reset_counter = i915_reset_counter(&dev_priv->gpu_error);
+       if (__i915_reset_in_progress_or_wedged(intel_crtc->reset_counter)) {
+               ret = -EIO;
+               goto cleanup;
+       }
+
        atomic_inc(&intel_crtc->unpin_work_count);
-       intel_crtc->reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
 
        if (INTEL_INFO(dev)->gen >= 5 || IS_G4X(dev))
                work->flip_count = I915_READ(PIPE_FLIPCOUNT_G4X(pipe)) + 1;
 
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
-               ring = &dev_priv->ring[BCS];
+               engine = &dev_priv->engine[BCS];
                if (obj->tiling_mode != intel_fb_obj(work->old_fb)->tiling_mode)
                        /* vlv: DISPLAY_FLIP fails to change tiling */
-                       ring = NULL;
+                       engine = NULL;
        } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) {
-               ring = &dev_priv->ring[BCS];
+               engine = &dev_priv->engine[BCS];
        } else if (INTEL_INFO(dev)->gen >= 7) {
-               ring = i915_gem_request_get_ring(obj->last_write_req);
-               if (ring == NULL || ring->id != RCS)
-                       ring = &dev_priv->ring[BCS];
+               engine = i915_gem_request_get_engine(obj->last_write_req);
+               if (engine == NULL || engine->id != RCS)
+                       engine = &dev_priv->engine[BCS];
        } else {
-               ring = &dev_priv->ring[RCS];
+               engine = &dev_priv->engine[RCS];
        }
 
-       mmio_flip = use_mmio_flip(ring, obj);
+       mmio_flip = use_mmio_flip(engine, obj);
 
        /* When using CS flips, we want to emit semaphores between rings.
         * However, when using mmio flips we will create a task to do the
@@ -11616,13 +11637,12 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
         * into the display plane and skip any waits.
         */
        if (!mmio_flip) {
-               ret = i915_gem_object_sync(obj, ring, &request);
+               ret = i915_gem_object_sync(obj, engine, &request);
                if (ret)
                        goto cleanup_pending;
        }
 
-       ret = intel_pin_and_fence_fb_obj(crtc->primary, fb,
-                                        crtc->primary->state);
+       ret = intel_pin_and_fence_fb_obj(fb, primary->state->rotation);
        if (ret)
                goto cleanup_pending;
 
@@ -11639,7 +11659,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
                                        obj->last_write_req);
        } else {
                if (!request) {
-                       request = i915_gem_request_alloc(ring, NULL);
+                       request = i915_gem_request_alloc(engine, NULL);
                        if (IS_ERR(request)) {
                                ret = PTR_ERR(request);
                                goto cleanup_unpin;
@@ -11672,10 +11692,10 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
        return 0;
 
 cleanup_unpin:
-       intel_unpin_fb_obj(fb, crtc->primary->state);
+       intel_unpin_fb_obj(fb, crtc->primary->state->rotation);
 cleanup_pending:
        if (!IS_ERR_OR_NULL(request))
-               i915_gem_request_cancel(request);
+               i915_add_request_no_flush(request);
        atomic_dec(&intel_crtc->unpin_work_count);
        mutex_unlock(&dev->struct_mutex);
 cleanup:
@@ -11725,7 +11745,7 @@ retry:
 
                if (ret == 0 && event) {
                        spin_lock_irq(&dev->event_lock);
-                       drm_send_vblank_event(dev, pipe, event);
+                       drm_crtc_send_vblank_event(crtc, event);
                        spin_unlock_irq(&dev->event_lock);
                }
        }
@@ -11785,6 +11805,7 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct drm_plane *plane = plane_state->plane;
        struct drm_device *dev = crtc->dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
        struct intel_plane_state *old_plane_state =
                to_intel_plane_state(plane->state);
        int idx = intel_crtc->base.base.id, ret;
@@ -11833,42 +11854,43 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
                         plane->base.id, was_visible, visible,
                         turn_off, turn_on, mode_changed);
 
-       if (turn_on || turn_off) {
-               pipe_config->wm_changed = true;
+       if (turn_on) {
+               pipe_config->update_wm_pre = true;
+
+               /* must disable cxsr around plane enable/disable */
+               if (plane->type != DRM_PLANE_TYPE_CURSOR)
+                       pipe_config->disable_cxsr = true;
+       } else if (turn_off) {
+               pipe_config->update_wm_post = true;
 
                /* must disable cxsr around plane enable/disable */
                if (plane->type != DRM_PLANE_TYPE_CURSOR)
                        pipe_config->disable_cxsr = true;
        } else if (intel_wm_need_update(plane, plane_state)) {
-               pipe_config->wm_changed = true;
+               /* FIXME bollocks */
+               pipe_config->update_wm_pre = true;
+               pipe_config->update_wm_post = true;
        }
 
-       if (visible || was_visible)
-               intel_crtc->atomic.fb_bits |=
-                       to_intel_plane(plane)->frontbuffer_bit;
+       /* Pre-gen9 platforms need two-step watermark updates */
+       if ((pipe_config->update_wm_pre || pipe_config->update_wm_post) &&
+           INTEL_INFO(dev)->gen < 9 && dev_priv->display.optimize_watermarks)
+               to_intel_crtc_state(crtc_state)->wm.need_postvbl_update = true;
 
-       switch (plane->type) {
-       case DRM_PLANE_TYPE_PRIMARY:
-               intel_crtc->atomic.post_enable_primary = turn_on;
-               intel_crtc->atomic.update_fbc = true;
+       if (visible || was_visible)
+               pipe_config->fb_bits |= to_intel_plane(plane)->frontbuffer_bit;
 
-               break;
-       case DRM_PLANE_TYPE_CURSOR:
-               break;
-       case DRM_PLANE_TYPE_OVERLAY:
-               /*
-                * WaCxSRDisabledForSpriteScaling:ivb
-                *
-                * cstate->update_wm was already set above, so this flag will
-                * take effect when we commit and program watermarks.
-                */
-               if (IS_IVYBRIDGE(dev) &&
-                   needs_scaling(to_intel_plane_state(plane_state)) &&
-                   !needs_scaling(old_plane_state))
-                       pipe_config->disable_lp_wm = true;
+       /*
+        * WaCxSRDisabledForSpriteScaling:ivb
+        *
+        * cstate->update_wm was already set above, so this flag will
+        * take effect when we commit and program watermarks.
+        */
+       if (plane->type == DRM_PLANE_TYPE_OVERLAY && IS_IVYBRIDGE(dev) &&
+           needs_scaling(to_intel_plane_state(plane_state)) &&
+           !needs_scaling(old_plane_state))
+               pipe_config->disable_lp_wm = true;
 
-               break;
-       }
        return 0;
 }
 
@@ -11940,22 +11962,49 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
        }
 
        if (mode_changed && !crtc_state->active)
-               pipe_config->wm_changed = true;
+               pipe_config->update_wm_post = true;
 
        if (mode_changed && crtc_state->enable &&
            dev_priv->display.crtc_compute_clock &&
-           !WARN_ON(pipe_config->shared_dpll != DPLL_ID_PRIVATE)) {
+           !WARN_ON(pipe_config->shared_dpll)) {
                ret = dev_priv->display.crtc_compute_clock(intel_crtc,
                                                           pipe_config);
                if (ret)
                        return ret;
        }
 
+       if (crtc_state->color_mgmt_changed) {
+               ret = intel_color_check(crtc, crtc_state);
+               if (ret)
+                       return ret;
+       }
+
        ret = 0;
        if (dev_priv->display.compute_pipe_wm) {
-               ret = dev_priv->display.compute_pipe_wm(intel_crtc, state);
-               if (ret)
+               ret = dev_priv->display.compute_pipe_wm(pipe_config);
+               if (ret) {
+                       DRM_DEBUG_KMS("Target pipe watermarks are invalid\n");
+                       return ret;
+               }
+       }
+
+       if (dev_priv->display.compute_intermediate_wm &&
+           !to_intel_atomic_state(state)->skip_intermediate_wm) {
+               if (WARN_ON(!dev_priv->display.compute_pipe_wm))
+                       return 0;
+
+               /*
+                * Calculate 'intermediate' watermarks that satisfy both the
+                * old state and the new state.  We can program these
+                * immediately.
+                */
+               ret = dev_priv->display.compute_intermediate_wm(crtc->dev,
+                                                               intel_crtc,
+                                                               pipe_config);
+               if (ret) {
+                       DRM_DEBUG_KMS("No valid intermediate pipe watermarks are possible\n");
                        return ret;
+               }
        }
 
        if (INTEL_INFO(dev)->gen >= 9) {
@@ -11972,7 +12021,6 @@ static int intel_crtc_atomic_check(struct drm_crtc *crtc,
 
 static const struct drm_crtc_helper_funcs intel_helper_funcs = {
        .mode_set_base_atomic = intel_pipe_set_base_atomic,
-       .load_lut = intel_crtc_load_lut,
        .atomic_begin = intel_begin_crtc_commit,
        .atomic_flush = intel_finish_crtc_commit,
        .atomic_check = intel_crtc_atomic_check,
@@ -11983,11 +12031,16 @@ static void intel_modeset_update_connector_atomic_state(struct drm_device *dev)
        struct intel_connector *connector;
 
        for_each_intel_connector(dev, connector) {
+               if (connector->base.state->crtc)
+                       drm_connector_unreference(&connector->base);
+
                if (connector->base.encoder) {
                        connector->base.state->best_encoder =
                                connector->base.encoder;
                        connector->base.state->crtc =
                                connector->base.encoder->crtc;
+
+                       drm_connector_reference(&connector->base);
                } else {
                        connector->base.state->best_encoder = NULL;
                        connector->base.state->crtc = NULL;
@@ -12089,7 +12142,7 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
        DRM_DEBUG_KMS("[CRTC:%d]%s config %p for pipe %c\n", crtc->base.base.id,
                      context, pipe_config, pipe_name(crtc->pipe));
 
-       DRM_DEBUG_KMS("cpu_transcoder: %c\n", transcoder_name(pipe_config->cpu_transcoder));
+       DRM_DEBUG_KMS("cpu_transcoder: %s\n", transcoder_name(pipe_config->cpu_transcoder));
        DRM_DEBUG_KMS("pipe bpp: %i, dithering: %i\n",
                      pipe_config->pipe_bpp, pipe_config->dither);
        DRM_DEBUG_KMS("fdi/pch: %i, lanes: %i, gmch_m: %u, gmch_n: %u, link_m: %u, link_n: %u, tu: %u\n",
@@ -12165,7 +12218,7 @@ static void intel_dump_pipe_config(struct intel_crtc *crtc,
                              pipe_config->dpll_hw_state.cfgcr1,
                              pipe_config->dpll_hw_state.cfgcr2);
        } else if (HAS_DDI(dev)) {
-               DRM_DEBUG_KMS("ddi_pll_sel: %u; dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
+               DRM_DEBUG_KMS("ddi_pll_sel: 0x%x; dpll_hw_state: wrpll: 0x%x spll: 0x%x\n",
                              pipe_config->ddi_pll_sel,
                              pipe_config->dpll_hw_state.wrpll,
                              pipe_config->dpll_hw_state.spll);
@@ -12268,7 +12321,7 @@ clear_intel_crtc_state(struct intel_crtc_state *crtc_state)
        struct drm_crtc_state tmp_state;
        struct intel_crtc_scaler_state scaler_state;
        struct intel_dpll_hw_state dpll_hw_state;
-       enum intel_dpll_id shared_dpll;
+       struct intel_shared_dpll *shared_dpll;
        uint32_t ddi_pll_sel;
        bool force_thru;
 
@@ -12538,6 +12591,15 @@ intel_pipe_config_compare(struct drm_device *dev,
                ret = false; \
        }
 
+#define PIPE_CONF_CHECK_P(name)        \
+       if (current_config->name != pipe_config->name) { \
+               INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
+                         "(expected %p, found %p)\n", \
+                         current_config->name, \
+                         pipe_config->name); \
+               ret = false; \
+       }
+
 #define PIPE_CONF_CHECK_M_N(name) \
        if (!intel_compare_link_m_n(&current_config->name, \
                                    &pipe_config->name,\
@@ -12558,6 +12620,11 @@ intel_pipe_config_compare(struct drm_device *dev,
                ret = false; \
        }
 
+/* This is required for BDW+ where there is only one set of registers for
+ * switching between high and low RR.
+ * This macro can be used whenever a comparison has to be made between one
+ * hw state and multiple sw state variables.
+ */
 #define PIPE_CONF_CHECK_M_N_ALT(name, alt_name) \
        if (!intel_compare_link_m_n(&current_config->name, \
                                    &pipe_config->name, adjust) && \
@@ -12585,22 +12652,6 @@ intel_pipe_config_compare(struct drm_device *dev,
                ret = false; \
        }
 
-/* This is required for BDW+ where there is only one set of registers for
- * switching between high and low RR.
- * This macro can be used whenever a comparison has to be made between one
- * hw state and multiple sw state variables.
- */
-#define PIPE_CONF_CHECK_I_ALT(name, alt_name) \
-       if ((current_config->name != pipe_config->name) && \
-               (current_config->alt_name != pipe_config->name)) { \
-                       INTEL_ERR_OR_DBG_KMS("mismatch in " #name " " \
-                                 "(expected %i or %i, found %i)\n", \
-                                 current_config->name, \
-                                 current_config->alt_name, \
-                                 pipe_config->name); \
-                       ret = false; \
-       }
-
 #define PIPE_CONF_CHECK_FLAGS(name, mask)      \
        if ((current_config->name ^ pipe_config->name) & (mask)) { \
                INTEL_ERR_OR_DBG_KMS("mismatch in " #name "(" #mask ") " \
@@ -12681,7 +12732,7 @@ intel_pipe_config_compare(struct drm_device *dev,
        PIPE_CONF_CHECK_X(gmch_pfit.control);
        /* pfit ratios are autocomputed by the hw on gen4+ */
        if (INTEL_INFO(dev)->gen < 4)
-               PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios);
+               PIPE_CONF_CHECK_X(gmch_pfit.pgm_ratios);
        PIPE_CONF_CHECK_X(gmch_pfit.lvds_border_bits);
 
        if (!adjust) {
@@ -12705,7 +12756,7 @@ intel_pipe_config_compare(struct drm_device *dev,
 
        PIPE_CONF_CHECK_X(ddi_pll_sel);
 
-       PIPE_CONF_CHECK_I(shared_dpll);
+       PIPE_CONF_CHECK_P(shared_dpll);
        PIPE_CONF_CHECK_X(dpll_hw_state.dpll);
        PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md);
        PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
@@ -12716,6 +12767,9 @@ intel_pipe_config_compare(struct drm_device *dev,
        PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr1);
        PIPE_CONF_CHECK_X(dpll_hw_state.cfgcr2);
 
+       PIPE_CONF_CHECK_X(dsi_pll.ctrl);
+       PIPE_CONF_CHECK_X(dsi_pll.div);
+
        if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5)
                PIPE_CONF_CHECK_I(pipe_bpp);
 
@@ -12724,7 +12778,7 @@ intel_pipe_config_compare(struct drm_device *dev,
 
 #undef PIPE_CONF_CHECK_X
 #undef PIPE_CONF_CHECK_I
-#undef PIPE_CONF_CHECK_I_ALT
+#undef PIPE_CONF_CHECK_P
 #undef PIPE_CONF_CHECK_FLAGS
 #undef PIPE_CONF_CHECK_CLOCK_FUZZY
 #undef PIPE_CONF_QUIRK
@@ -12733,48 +12787,61 @@ intel_pipe_config_compare(struct drm_device *dev,
        return ret;
 }
 
-static void check_wm_state(struct drm_device *dev)
+static void intel_pipe_config_sanity_check(struct drm_i915_private *dev_priv,
+                                          const struct intel_crtc_state *pipe_config)
+{
+       if (pipe_config->has_pch_encoder) {
+               int fdi_dotclock = intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
+                                                           &pipe_config->fdi_m_n);
+               int dotclock = pipe_config->base.adjusted_mode.crtc_clock;
+
+               /*
+                * FDI already provided one idea for the dotclock.
+                * Yell if the encoder disagrees.
+                */
+               WARN(!intel_fuzzy_clock_check(fdi_dotclock, dotclock),
+                    "FDI dotclock and encoder dotclock mismatch, fdi: %i, encoder: %i\n",
+                    fdi_dotclock, dotclock);
+       }
+}
+
+static void verify_wm_state(struct drm_crtc *crtc,
+                           struct drm_crtc_state *new_state)
 {
+       struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct skl_ddb_allocation hw_ddb, *sw_ddb;
-       struct intel_crtc *intel_crtc;
+       struct skl_ddb_entry *hw_entry, *sw_entry;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       const enum pipe pipe = intel_crtc->pipe;
        int plane;
 
-       if (INTEL_INFO(dev)->gen < 9)
+       if (INTEL_INFO(dev)->gen < 9 || !new_state->active)
                return;
 
        skl_ddb_get_hw_state(dev_priv, &hw_ddb);
        sw_ddb = &dev_priv->wm.skl_hw.ddb;
 
-       for_each_intel_crtc(dev, intel_crtc) {
-               struct skl_ddb_entry *hw_entry, *sw_entry;
-               const enum pipe pipe = intel_crtc->pipe;
+       /* planes */
+       for_each_plane(dev_priv, pipe, plane) {
+               hw_entry = &hw_ddb.plane[pipe][plane];
+               sw_entry = &sw_ddb->plane[pipe][plane];
 
-               if (!intel_crtc->active)
+               if (skl_ddb_entry_equal(hw_entry, sw_entry))
                        continue;
 
-               /* planes */
-               for_each_plane(dev_priv, pipe, plane) {
-                       hw_entry = &hw_ddb.plane[pipe][plane];
-                       sw_entry = &sw_ddb->plane[pipe][plane];
-
-                       if (skl_ddb_entry_equal(hw_entry, sw_entry))
-                               continue;
-
-                       DRM_ERROR("mismatch in DDB state pipe %c plane %d "
-                                 "(expected (%u,%u), found (%u,%u))\n",
-                                 pipe_name(pipe), plane + 1,
-                                 sw_entry->start, sw_entry->end,
-                                 hw_entry->start, hw_entry->end);
-               }
-
-               /* cursor */
-               hw_entry = &hw_ddb.plane[pipe][PLANE_CURSOR];
-               sw_entry = &sw_ddb->plane[pipe][PLANE_CURSOR];
+               DRM_ERROR("mismatch in DDB state pipe %c plane %d "
+                         "(expected (%u,%u), found (%u,%u))\n",
+                         pipe_name(pipe), plane + 1,
+                         sw_entry->start, sw_entry->end,
+                         hw_entry->start, hw_entry->end);
+       }
 
-               if (skl_ddb_entry_equal(hw_entry, sw_entry))
-                       continue;
+       /* cursor */
+       hw_entry = &hw_ddb.plane[pipe][PLANE_CURSOR];
+       sw_entry = &sw_ddb->plane[pipe][PLANE_CURSOR];
 
+       if (!skl_ddb_entry_equal(hw_entry, sw_entry)) {
                DRM_ERROR("mismatch in DDB state pipe %c cursor "
                          "(expected (%u,%u), found (%u,%u))\n",
                          pipe_name(pipe),
@@ -12784,20 +12851,18 @@ static void check_wm_state(struct drm_device *dev)
 }
 
 static void
-check_connector_state(struct drm_device *dev,
-                     struct drm_atomic_state *old_state)
+verify_connector_state(struct drm_device *dev, struct drm_crtc *crtc)
 {
-       struct drm_connector_state *old_conn_state;
        struct drm_connector *connector;
-       int i;
 
-       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
+       drm_for_each_connector(connector, dev) {
                struct drm_encoder *encoder = connector->encoder;
                struct drm_connector_state *state = connector->state;
 
-               /* This also checks the encoder/connector hw state with the
-                * ->get_hw_state callbacks. */
-               intel_connector_check_state(to_intel_connector(connector));
+               if (state->crtc != crtc)
+                       continue;
+
+               intel_connector_verify_state(to_intel_connector(connector));
 
                I915_STATE_WARN(state->best_encoder != encoder,
                     "connector's atomic encoder doesn't match legacy encoder\n");
@@ -12805,7 +12870,7 @@ check_connector_state(struct drm_device *dev,
 }
 
 static void
-check_encoder_state(struct drm_device *dev)
+verify_encoder_state(struct drm_device *dev)
 {
        struct intel_encoder *encoder;
        struct intel_connector *connector;
@@ -12845,149 +12910,186 @@ check_encoder_state(struct drm_device *dev)
 }
 
 static void
-check_crtc_state(struct drm_device *dev, struct drm_atomic_state *old_state)
+verify_crtc_state(struct drm_crtc *crtc,
+                 struct drm_crtc_state *old_crtc_state,
+                 struct drm_crtc_state *new_crtc_state)
 {
+       struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *encoder;
-       struct drm_crtc_state *old_crtc_state;
-       struct drm_crtc *crtc;
-       int i;
-
-       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
-               struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-               struct intel_crtc_state *pipe_config, *sw_config;
-               bool active;
+       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
+       struct intel_crtc_state *pipe_config, *sw_config;
+       struct drm_atomic_state *old_state;
+       bool active;
 
-               if (!needs_modeset(crtc->state) &&
-                   !to_intel_crtc_state(crtc->state)->update_pipe)
-                       continue;
+       old_state = old_crtc_state->state;
+       __drm_atomic_helper_crtc_destroy_state(old_crtc_state);
+       pipe_config = to_intel_crtc_state(old_crtc_state);
+       memset(pipe_config, 0, sizeof(*pipe_config));
+       pipe_config->base.crtc = crtc;
+       pipe_config->base.state = old_state;
 
-               __drm_atomic_helper_crtc_destroy_state(crtc, old_crtc_state);
-               pipe_config = to_intel_crtc_state(old_crtc_state);
-               memset(pipe_config, 0, sizeof(*pipe_config));
-               pipe_config->base.crtc = crtc;
-               pipe_config->base.state = old_state;
+       DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id);
 
-               DRM_DEBUG_KMS("[CRTC:%d]\n",
-                             crtc->base.id);
+       active = dev_priv->display.get_pipe_config(intel_crtc, pipe_config);
 
-               active = dev_priv->display.get_pipe_config(intel_crtc,
-                                                          pipe_config);
+       /* hw state is inconsistent with the pipe quirk */
+       if ((intel_crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) ||
+           (intel_crtc->pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE))
+               active = new_crtc_state->active;
 
-               /* hw state is inconsistent with the pipe quirk */
-               if ((intel_crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) ||
-                   (intel_crtc->pipe == PIPE_B && dev_priv->quirks & QUIRK_PIPEB_FORCE))
-                       active = crtc->state->active;
+       I915_STATE_WARN(new_crtc_state->active != active,
+            "crtc active state doesn't match with hw state "
+            "(expected %i, found %i)\n", new_crtc_state->active, active);
 
-               I915_STATE_WARN(crtc->state->active != active,
-                    "crtc active state doesn't match with hw state "
-                    "(expected %i, found %i)\n", crtc->state->active, active);
+       I915_STATE_WARN(intel_crtc->active != new_crtc_state->active,
+            "transitional active state does not match atomic hw state "
+            "(expected %i, found %i)\n", new_crtc_state->active, intel_crtc->active);
 
-               I915_STATE_WARN(intel_crtc->active != crtc->state->active,
-                    "transitional active state does not match atomic hw state "
-                    "(expected %i, found %i)\n", crtc->state->active, intel_crtc->active);
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
+               enum pipe pipe;
 
-               for_each_encoder_on_crtc(dev, crtc, encoder) {
-                       enum pipe pipe;
+               active = encoder->get_hw_state(encoder, &pipe);
+               I915_STATE_WARN(active != new_crtc_state->active,
+                       "[ENCODER:%i] active %i with crtc active %i\n",
+                       encoder->base.base.id, active, new_crtc_state->active);
 
-                       active = encoder->get_hw_state(encoder, &pipe);
-                       I915_STATE_WARN(active != crtc->state->active,
-                               "[ENCODER:%i] active %i with crtc active %i\n",
-                               encoder->base.base.id, active, crtc->state->active);
+               I915_STATE_WARN(active && intel_crtc->pipe != pipe,
+                               "Encoder connected to wrong pipe %c\n",
+                               pipe_name(pipe));
 
-                       I915_STATE_WARN(active && intel_crtc->pipe != pipe,
-                                       "Encoder connected to wrong pipe %c\n",
-                                       pipe_name(pipe));
+               if (active)
+                       encoder->get_config(encoder, pipe_config);
+       }
 
-                       if (active)
-                               encoder->get_config(encoder, pipe_config);
-               }
+       if (!new_crtc_state->active)
+               return;
 
-               if (!crtc->state->active)
-                       continue;
+       intel_pipe_config_sanity_check(dev_priv, pipe_config);
 
-               sw_config = to_intel_crtc_state(crtc->state);
-               if (!intel_pipe_config_compare(dev, sw_config,
-                                              pipe_config, false)) {
-                       I915_STATE_WARN(1, "pipe state doesn't match!\n");
-                       intel_dump_pipe_config(intel_crtc, pipe_config,
-                                              "[hw state]");
-                       intel_dump_pipe_config(intel_crtc, sw_config,
-                                              "[sw state]");
-               }
+       sw_config = to_intel_crtc_state(crtc->state);
+       if (!intel_pipe_config_compare(dev, sw_config,
+                                      pipe_config, false)) {
+               I915_STATE_WARN(1, "pipe state doesn't match!\n");
+               intel_dump_pipe_config(intel_crtc, pipe_config,
+                                      "[hw state]");
+               intel_dump_pipe_config(intel_crtc, sw_config,
+                                      "[sw state]");
        }
 }
 
 static void
-check_shared_dpll_state(struct drm_device *dev)
+verify_single_dpll_state(struct drm_i915_private *dev_priv,
+                        struct intel_shared_dpll *pll,
+                        struct drm_crtc *crtc,
+                        struct drm_crtc_state *new_state)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *crtc;
        struct intel_dpll_hw_state dpll_hw_state;
-       int i;
-
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
-               int enabled_crtcs = 0, active_crtcs = 0;
-               bool active;
+       unsigned crtc_mask;
+       bool active;
 
-               memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
+       memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
 
-               DRM_DEBUG_KMS("%s\n", pll->name);
+       DRM_DEBUG_KMS("%s\n", pll->name);
 
-               active = pll->get_hw_state(dev_priv, pll, &dpll_hw_state);
+       active = pll->funcs.get_hw_state(dev_priv, pll, &dpll_hw_state);
 
-               I915_STATE_WARN(pll->active > hweight32(pll->config.crtc_mask),
-                    "more active pll users than references: %i vs %i\n",
-                    pll->active, hweight32(pll->config.crtc_mask));
-               I915_STATE_WARN(pll->active && !pll->on,
+       if (!(pll->flags & INTEL_DPLL_ALWAYS_ON)) {
+               I915_STATE_WARN(!pll->on && pll->active_mask,
                     "pll in active use but not on in sw tracking\n");
-               I915_STATE_WARN(pll->on && !pll->active,
-                    "pll in on but not on in use in sw tracking\n");
+               I915_STATE_WARN(pll->on && !pll->active_mask,
+                    "pll is on but not used by any active crtc\n");
                I915_STATE_WARN(pll->on != active,
                     "pll on state mismatch (expected %i, found %i)\n",
                     pll->on, active);
+       }
 
-               for_each_intel_crtc(dev, crtc) {
-                       if (crtc->base.state->enable && intel_crtc_to_shared_dpll(crtc) == pll)
-                               enabled_crtcs++;
-                       if (crtc->active && intel_crtc_to_shared_dpll(crtc) == pll)
-                               active_crtcs++;
-               }
-               I915_STATE_WARN(pll->active != active_crtcs,
-                    "pll active crtcs mismatch (expected %i, found %i)\n",
-                    pll->active, active_crtcs);
-               I915_STATE_WARN(hweight32(pll->config.crtc_mask) != enabled_crtcs,
-                    "pll enabled crtcs mismatch (expected %i, found %i)\n",
-                    hweight32(pll->config.crtc_mask), enabled_crtcs);
+       if (!crtc) {
+               I915_STATE_WARN(pll->active_mask & ~pll->config.crtc_mask,
+                               "more active pll users than references: %x vs %x\n",
+                               pll->active_mask, pll->config.crtc_mask);
+
+               return;
+       }
+
+       crtc_mask = 1 << drm_crtc_index(crtc);
+
+       if (new_state->active)
+               I915_STATE_WARN(!(pll->active_mask & crtc_mask),
+                               "pll active mismatch (expected pipe %c in active mask 0x%02x)\n",
+                               pipe_name(drm_crtc_index(crtc)), pll->active_mask);
+       else
+               I915_STATE_WARN(pll->active_mask & crtc_mask,
+                               "pll active mismatch (didn't expect pipe %c in active mask 0x%02x)\n",
+                               pipe_name(drm_crtc_index(crtc)), pll->active_mask);
+
+       I915_STATE_WARN(!(pll->config.crtc_mask & crtc_mask),
+                       "pll enabled crtcs mismatch (expected 0x%x in 0x%02x)\n",
+                       crtc_mask, pll->config.crtc_mask);
+
+       I915_STATE_WARN(pll->on && memcmp(&pll->config.hw_state,
+                                         &dpll_hw_state,
+                                         sizeof(dpll_hw_state)),
+                       "pll hw state mismatch\n");
+}
+
+static void
+verify_shared_dpll_state(struct drm_device *dev, struct drm_crtc *crtc,
+                        struct drm_crtc_state *old_crtc_state,
+                        struct drm_crtc_state *new_crtc_state)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc_state *old_state = to_intel_crtc_state(old_crtc_state);
+       struct intel_crtc_state *new_state = to_intel_crtc_state(new_crtc_state);
+
+       if (new_state->shared_dpll)
+               verify_single_dpll_state(dev_priv, new_state->shared_dpll, crtc, new_crtc_state);
+
+       if (old_state->shared_dpll &&
+           old_state->shared_dpll != new_state->shared_dpll) {
+               unsigned crtc_mask = 1 << drm_crtc_index(crtc);
+               struct intel_shared_dpll *pll = old_state->shared_dpll;
 
-               I915_STATE_WARN(pll->on && memcmp(&pll->config.hw_state, &dpll_hw_state,
-                                      sizeof(dpll_hw_state)),
-                    "pll hw state mismatch\n");
+               I915_STATE_WARN(pll->active_mask & crtc_mask,
+                               "pll active mismatch (didn't expect pipe %c in active mask)\n",
+                               pipe_name(drm_crtc_index(crtc)));
+               I915_STATE_WARN(pll->config.crtc_mask & crtc_mask,
+                               "pll enabled crtcs mismatch (found %x in enabled mask)\n",
+                               pipe_name(drm_crtc_index(crtc)));
        }
 }
 
 static void
-intel_modeset_check_state(struct drm_device *dev,
-                         struct drm_atomic_state *old_state)
+intel_modeset_verify_crtc(struct drm_crtc *crtc,
+                        struct drm_crtc_state *old_state,
+                        struct drm_crtc_state *new_state)
 {
-       check_wm_state(dev);
-       check_connector_state(dev, old_state);
-       check_encoder_state(dev);
-       check_crtc_state(dev, old_state);
-       check_shared_dpll_state(dev);
+       if (!needs_modeset(new_state) &&
+           !to_intel_crtc_state(new_state)->update_pipe)
+               return;
+
+       verify_wm_state(crtc, new_state);
+       verify_connector_state(crtc->dev, crtc);
+       verify_crtc_state(crtc, old_state, new_state);
+       verify_shared_dpll_state(crtc->dev, crtc, old_state, new_state);
 }
 
-void ironlake_check_encoder_dotclock(const struct intel_crtc_state *pipe_config,
-                                    int dotclock)
+static void
+verify_disabled_dpll_state(struct drm_device *dev)
 {
-       /*
-        * FDI already provided one idea for the dotclock.
-        * Yell if the encoder disagrees.
-        */
-       WARN(!intel_fuzzy_clock_check(pipe_config->base.adjusted_mode.crtc_clock, dotclock),
-            "FDI dotclock and encoder dotclock mismatch, fdi: %i, encoder: %i\n",
-            pipe_config->base.adjusted_mode.crtc_clock, dotclock);
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       int i;
+
+       for (i = 0; i < dev_priv->num_shared_dpll; i++)
+               verify_single_dpll_state(dev_priv, &dev_priv->shared_dplls[i], NULL, NULL);
+}
+
+static void
+intel_modeset_verify_disabled(struct drm_device *dev)
+{
+       verify_encoder_state(dev);
+       verify_connector_state(dev, NULL);
+       verify_disabled_dpll_state(dev);
 }
 
 static void update_scanline_offset(struct intel_crtc *crtc)
@@ -13042,20 +13144,21 @@ static void intel_modeset_clear_plls(struct drm_atomic_state *state)
 
        for_each_crtc_in_state(state, crtc, crtc_state, i) {
                struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-               int old_dpll = to_intel_crtc_state(crtc->state)->shared_dpll;
+               struct intel_shared_dpll *old_dpll =
+                       to_intel_crtc_state(crtc->state)->shared_dpll;
 
                if (!needs_modeset(crtc_state))
                        continue;
 
-               to_intel_crtc_state(crtc_state)->shared_dpll = DPLL_ID_PRIVATE;
+               to_intel_crtc_state(crtc_state)->shared_dpll = NULL;
 
-               if (old_dpll == DPLL_ID_PRIVATE)
+               if (!old_dpll)
                        continue;
 
                if (!shared_dpll)
                        shared_dpll = intel_atomic_get_shared_dpll_state(state);
 
-               shared_dpll[old_dpll].crtc_mask &= ~(1 << intel_crtc->pipe);
+               intel_shared_dpll_config_put(shared_dpll, old_dpll, intel_crtc);
        }
 }
 
@@ -13267,9 +13370,6 @@ static int intel_atomic_check(struct drm_device *dev,
                struct intel_crtc_state *pipe_config =
                        to_intel_crtc_state(crtc_state);
 
-               memset(&to_intel_crtc(crtc)->atomic, 0,
-                      sizeof(struct intel_crtc_atomic_commit));
-
                /* Catch I915_MODE_FLAG_INHERITED */
                if (crtc_state->mode.private_flags != crtc->state->mode.private_flags)
                        crtc_state->mode_changed = true;
@@ -13335,7 +13435,7 @@ static int intel_atomic_check(struct drm_device *dev,
 
 static int intel_atomic_prepare_commit(struct drm_device *dev,
                                       struct drm_atomic_state *state,
-                                      bool async)
+                                      bool nonblock)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct drm_plane_state *plane_state;
@@ -13344,8 +13444,8 @@ static int intel_atomic_prepare_commit(struct drm_device *dev,
        struct drm_crtc *crtc;
        int i, ret;
 
-       if (async) {
-               DRM_DEBUG_KMS("i915 does not yet support async commit\n");
+       if (nonblock) {
+               DRM_DEBUG_KMS("i915 does not yet support nonblocking commit\n");
                return -EINVAL;
        }
 
@@ -13366,12 +13466,9 @@ static int intel_atomic_prepare_commit(struct drm_device *dev,
                return ret;
 
        ret = drm_atomic_helper_prepare_planes(dev, state);
-       if (!ret && !async && !i915_reset_in_progress(&dev_priv->gpu_error)) {
-               u32 reset_counter;
-
-               reset_counter = atomic_read(&dev_priv->gpu_error.reset_counter);
-               mutex_unlock(&dev->struct_mutex);
+       mutex_unlock(&dev->struct_mutex);
 
+       if (!ret && !nonblock) {
                for_each_plane_in_state(state, plane, plane_state, i) {
                        struct intel_plane_state *intel_plane_state =
                                to_intel_plane_state(plane_state);
@@ -13380,25 +13477,18 @@ static int intel_atomic_prepare_commit(struct drm_device *dev,
                                continue;
 
                        ret = __i915_wait_request(intel_plane_state->wait_req,
-                                                 reset_counter, true,
-                                                 NULL, NULL);
-
-                       /* Swallow -EIO errors to allow updates during hw lockup. */
-                       if (ret == -EIO)
-                               ret = 0;
-
-                       if (ret)
+                                                 true, NULL, NULL);
+                       if (ret) {
+                               /* Any hang should be swallowed by the wait */
+                               WARN_ON(ret == -EIO);
+                               mutex_lock(&dev->struct_mutex);
+                               drm_atomic_helper_cleanup_planes(dev, state);
+                               mutex_unlock(&dev->struct_mutex);
                                break;
+                       }
                }
-
-               if (!ret)
-                       return 0;
-
-               mutex_lock(&dev->struct_mutex);
-               drm_atomic_helper_cleanup_planes(dev, state);
        }
 
-       mutex_unlock(&dev->struct_mutex);
        return ret;
 }
 
@@ -13440,7 +13530,7 @@ static void intel_atomic_wait_for_vblanks(struct drm_device *dev,
                                        drm_crtc_vblank_count(crtc),
                                msecs_to_jiffies(50));
 
-               WARN_ON(!lret);
+               WARN(!lret, "pipe %c vblank wait timed out\n", pipe_name(pipe));
 
                drm_crtc_vblank_put(crtc);
        }
@@ -13453,12 +13543,12 @@ static bool needs_vblank_wait(struct intel_crtc_state *crtc_state)
                return true;
 
        /* wm changes, need vblank before final wm's */
-       if (crtc_state->wm_changed)
+       if (crtc_state->update_wm_post)
                return true;
 
        /*
         * cxsr is re-enabled after vblank.
-        * This is already handled by crtc_state->wm_changed,
+        * This is already handled by crtc_state->update_wm_post,
         * but added for clarity.
         */
        if (crtc_state->disable_cxsr)
@@ -13471,39 +13561,41 @@ static bool needs_vblank_wait(struct intel_crtc_state *crtc_state)
  * intel_atomic_commit - commit validated state object
  * @dev: DRM device
  * @state: the top-level driver state object
- * @async: asynchronous commit
+ * @nonblock: nonblocking commit
  *
  * This function commits a top-level state object that has been validated
  * with drm_atomic_helper_check().
  *
  * FIXME:  Atomic modeset support for i915 is not yet complete.  At the moment
  * we can only handle plane-related operations and do not yet support
- * asynchronous commit.
+ * nonblocking commit.
  *
  * RETURNS
  * Zero for success or -errno.
  */
 static int intel_atomic_commit(struct drm_device *dev,
                               struct drm_atomic_state *state,
-                              bool async)
+                              bool nonblock)
 {
        struct intel_atomic_state *intel_state = to_intel_atomic_state(state);
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_crtc_state *crtc_state;
+       struct drm_crtc_state *old_crtc_state;
        struct drm_crtc *crtc;
+       struct intel_crtc_state *intel_cstate;
        int ret = 0, i;
        bool hw_check = intel_state->modeset;
        unsigned long put_domains[I915_MAX_PIPES] = {};
        unsigned crtc_vblank_mask = 0;
 
-       ret = intel_atomic_prepare_commit(dev, state, async);
+       ret = intel_atomic_prepare_commit(dev, state, nonblock);
        if (ret) {
                DRM_DEBUG_ATOMIC("Preparing state failed with %i\n", ret);
                return ret;
        }
 
        drm_atomic_helper_swap_state(dev, state);
-       dev_priv->wm.config = to_intel_atomic_state(state)->wm_config;
+       dev_priv->wm.config = intel_state->wm_config;
+       intel_shared_dpll_commit(state);
 
        if (intel_state->modeset) {
                memcpy(dev_priv->min_pixclk, intel_state->min_pixclk,
@@ -13514,7 +13606,7 @@ static int intel_atomic_commit(struct drm_device *dev,
                intel_display_power_get(dev_priv, POWER_DOMAIN_MODESET);
        }
 
-       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+       for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
                struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
                if (needs_modeset(crtc->state) ||
@@ -13529,10 +13621,10 @@ static int intel_atomic_commit(struct drm_device *dev,
                if (!needs_modeset(crtc->state))
                        continue;
 
-               intel_pre_plane_update(to_intel_crtc_state(crtc_state));
+               intel_pre_plane_update(to_intel_crtc_state(old_crtc_state));
 
-               if (crtc_state->active) {
-                       intel_crtc_disable_planes(crtc, crtc_state->plane_mask);
+               if (old_crtc_state->active) {
+                       intel_crtc_disable_planes(crtc, old_crtc_state->plane_mask);
                        dev_priv->display.crtc_disable(crtc);
                        intel_crtc->active = false;
                        intel_fbc_disable(intel_crtc);
@@ -13555,17 +13647,17 @@ static int intel_atomic_commit(struct drm_device *dev,
        intel_modeset_update_crtc_state(state);
 
        if (intel_state->modeset) {
-               intel_shared_dpll_commit(state);
-
                drm_atomic_helper_update_legacy_modeset_state(state->dev, state);
 
                if (dev_priv->display.modeset_commit_cdclk &&
                    intel_state->dev_cdclk != dev_priv->cdclk_freq)
                        dev_priv->display.modeset_commit_cdclk(state);
+
+               intel_modeset_verify_disabled(dev);
        }
 
        /* Now enable the clocks, plane, pipe, and connectors that we set up. */
-       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+       for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
                struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
                bool modeset = needs_modeset(crtc->state);
                struct intel_crtc_state *pipe_config =
@@ -13578,14 +13670,15 @@ static int intel_atomic_commit(struct drm_device *dev,
                }
 
                if (!modeset)
-                       intel_pre_plane_update(to_intel_crtc_state(crtc_state));
+                       intel_pre_plane_update(to_intel_crtc_state(old_crtc_state));
 
-               if (crtc->state->active && intel_crtc->atomic.update_fbc)
+               if (crtc->state->active &&
+                   drm_atomic_get_existing_plane_state(state, crtc->primary))
                        intel_fbc_enable(intel_crtc);
 
                if (crtc->state->active &&
                    (crtc->state->planes_changed || update_pipe))
-                       drm_atomic_helper_commit_planes_on_crtc(crtc_state);
+                       drm_atomic_helper_commit_planes_on_crtc(old_crtc_state);
 
                if (pipe_config->base.active && needs_vblank_wait(pipe_config))
                        crtc_vblank_mask |= 1 << i;
@@ -13596,11 +13689,27 @@ static int intel_atomic_commit(struct drm_device *dev,
        if (!state->legacy_cursor_update)
                intel_atomic_wait_for_vblanks(dev, dev_priv, crtc_vblank_mask);
 
-       for_each_crtc_in_state(state, crtc, crtc_state, i) {
-               intel_post_plane_update(to_intel_crtc(crtc));
+       /*
+        * Now that the vblank has passed, we can go ahead and program the
+        * optimal watermarks on platforms that need two-step watermark
+        * programming.
+        *
+        * TODO: Move this (and other cleanup) to an async worker eventually.
+        */
+       for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
+               intel_cstate = to_intel_crtc_state(crtc->state);
+
+               if (dev_priv->display.optimize_watermarks)
+                       dev_priv->display.optimize_watermarks(intel_cstate);
+       }
+
+       for_each_crtc_in_state(state, crtc, old_crtc_state, i) {
+               intel_post_plane_update(to_intel_crtc_state(old_crtc_state));
 
                if (put_domains[i])
                        modeset_put_power_domains(dev_priv, put_domains[i]);
+
+               intel_modeset_verify_crtc(crtc, old_crtc_state, crtc->state);
        }
 
        if (intel_state->modeset)
@@ -13610,9 +13719,6 @@ static int intel_atomic_commit(struct drm_device *dev,
        drm_atomic_helper_cleanup_planes(dev, state);
        mutex_unlock(&dev->struct_mutex);
 
-       if (hw_check)
-               intel_modeset_check_state(dev, state);
-
        drm_atomic_state_free(state);
 
        /* As one of the primary mmio accessors, KMS has a high likelihood
@@ -13672,116 +13778,15 @@ out:
 #undef for_each_intel_crtc_masked
 
 static const struct drm_crtc_funcs intel_crtc_funcs = {
-       .gamma_set = intel_crtc_gamma_set,
+       .gamma_set = drm_atomic_helper_legacy_gamma_set,
        .set_config = drm_atomic_helper_set_config,
+       .set_property = drm_atomic_helper_crtc_set_property,
        .destroy = intel_crtc_destroy,
        .page_flip = intel_crtc_page_flip,
        .atomic_duplicate_state = intel_crtc_duplicate_state,
        .atomic_destroy_state = intel_crtc_destroy_state,
 };
 
-static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
-                                     struct intel_shared_dpll *pll,
-                                     struct intel_dpll_hw_state *hw_state)
-{
-       uint32_t val;
-
-       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
-               return false;
-
-       val = I915_READ(PCH_DPLL(pll->id));
-       hw_state->dpll = val;
-       hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
-       hw_state->fp1 = I915_READ(PCH_FP1(pll->id));
-
-       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
-
-       return val & DPLL_VCO_ENABLE;
-}
-
-static void ibx_pch_dpll_mode_set(struct drm_i915_private *dev_priv,
-                                 struct intel_shared_dpll *pll)
-{
-       I915_WRITE(PCH_FP0(pll->id), pll->config.hw_state.fp0);
-       I915_WRITE(PCH_FP1(pll->id), pll->config.hw_state.fp1);
-}
-
-static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
-                               struct intel_shared_dpll *pll)
-{
-       /* PCH refclock must be enabled first */
-       ibx_assert_pch_refclk_enabled(dev_priv);
-
-       I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
-
-       /* Wait for the clocks to stabilize. */
-       POSTING_READ(PCH_DPLL(pll->id));
-       udelay(150);
-
-       /* The pixel multiplier can only be updated once the
-        * DPLL is enabled and the clocks are stable.
-        *
-        * So write it again.
-        */
-       I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
-       POSTING_READ(PCH_DPLL(pll->id));
-       udelay(200);
-}
-
-static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
-                                struct intel_shared_dpll *pll)
-{
-       struct drm_device *dev = dev_priv->dev;
-       struct intel_crtc *crtc;
-
-       /* Make sure no transcoder isn't still depending on us. */
-       for_each_intel_crtc(dev, crtc) {
-               if (intel_crtc_to_shared_dpll(crtc) == pll)
-                       assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
-       }
-
-       I915_WRITE(PCH_DPLL(pll->id), 0);
-       POSTING_READ(PCH_DPLL(pll->id));
-       udelay(200);
-}
-
-static char *ibx_pch_dpll_names[] = {
-       "PCH DPLL A",
-       "PCH DPLL B",
-};
-
-static void ibx_pch_dpll_init(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int i;
-
-       dev_priv->num_shared_dpll = 2;
-
-       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
-               dev_priv->shared_dplls[i].id = i;
-               dev_priv->shared_dplls[i].name = ibx_pch_dpll_names[i];
-               dev_priv->shared_dplls[i].mode_set = ibx_pch_dpll_mode_set;
-               dev_priv->shared_dplls[i].enable = ibx_pch_dpll_enable;
-               dev_priv->shared_dplls[i].disable = ibx_pch_dpll_disable;
-               dev_priv->shared_dplls[i].get_hw_state =
-                       ibx_pch_dpll_get_hw_state;
-       }
-}
-
-static void intel_shared_dpll_init(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       if (HAS_DDI(dev))
-               intel_ddi_pll_init(dev);
-       else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
-               ibx_pch_dpll_init(dev);
-       else
-               dev_priv->num_shared_dpll = 0;
-
-       BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
-}
-
 /**
  * intel_prepare_plane_fb - Prepare fb for usage on plane
  * @plane: drm plane to prepare for
@@ -13827,10 +13832,11 @@ intel_prepare_plane_fb(struct drm_plane *plane,
                 */
                if (needs_modeset(crtc_state))
                        ret = i915_gem_object_wait_rendering(old_obj, true);
-
-               /* Swallow -EIO errors to allow updates during hw lockup. */
-               if (ret && ret != -EIO)
+               if (ret) {
+                       /* GPU hangs should have been swallowed by the wait */
+                       WARN_ON(ret == -EIO);
                        return ret;
+               }
        }
 
        /* For framebuffer backed by dmabuf, wait for fence */
@@ -13855,7 +13861,7 @@ intel_prepare_plane_fb(struct drm_plane *plane,
                if (ret)
                        DRM_DEBUG_KMS("failed to attach phys object\n");
        } else {
-               ret = intel_pin_and_fence_fb_obj(plane, fb, new_state);
+               ret = intel_pin_and_fence_fb_obj(fb, new_state->rotation);
        }
 
        if (ret == 0) {
@@ -13899,7 +13905,7 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
 
        if (old_obj && (plane->type != DRM_PLANE_TYPE_CURSOR ||
            !INTEL_INFO(dev)->cursor_needs_physical))
-               intel_unpin_fb_obj(old_state->fb, old_state);
+               intel_unpin_fb_obj(old_state->fb, old_state->rotation);
 
        /* prepare_fb aborted? */
        if ((old_obj && (old_obj->frontbuffer_bits & intel_plane->frontbuffer_bit)) ||
@@ -13907,7 +13913,6 @@ intel_cleanup_plane_fb(struct drm_plane *plane,
                i915_gem_track_fb(old_obj, obj, intel_plane->frontbuffer_bit);
 
        i915_gem_request_assign(&old_intel_state->wait_req, NULL);
-
 }
 
 int
@@ -13982,6 +13987,11 @@ static void intel_begin_crtc_commit(struct drm_crtc *crtc,
        if (modeset)
                return;
 
+       if (crtc->state->color_mgmt_changed || to_intel_crtc_state(crtc->state)->update_pipe) {
+               intel_color_set_csc(crtc->state);
+               intel_color_load_luts(crtc->state);
+       }
+
        if (to_intel_crtc_state(crtc->state)->update_pipe)
                intel_update_pipe_config(intel_crtc, old_intel_state);
        else if (INTEL_INFO(dev)->gen >= 9)
@@ -14025,20 +14035,19 @@ const struct drm_plane_funcs intel_plane_funcs = {
 static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
                                                    int pipe)
 {
-       struct intel_plane *primary;
-       struct intel_plane_state *state;
+       struct intel_plane *primary = NULL;
+       struct intel_plane_state *state = NULL;
        const uint32_t *intel_primary_formats;
        unsigned int num_formats;
+       int ret;
 
        primary = kzalloc(sizeof(*primary), GFP_KERNEL);
-       if (primary == NULL)
-               return NULL;
+       if (!primary)
+               goto fail;
 
        state = intel_create_plane_state(&primary->base);
-       if (!state) {
-               kfree(primary);
-               return NULL;
-       }
+       if (!state)
+               goto fail;
        primary->base.state = &state->base;
 
        primary->can_scale = false;
@@ -14080,10 +14089,12 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
                primary->disable_plane = i9xx_disable_primary_plane;
        }
 
-       drm_universal_plane_init(dev, &primary->base, 0,
-                                &intel_plane_funcs,
-                                intel_primary_formats, num_formats,
-                                DRM_PLANE_TYPE_PRIMARY, NULL);
+       ret = drm_universal_plane_init(dev, &primary->base, 0,
+                                      &intel_plane_funcs,
+                                      intel_primary_formats, num_formats,
+                                      DRM_PLANE_TYPE_PRIMARY, NULL);
+       if (ret)
+               goto fail;
 
        if (INTEL_INFO(dev)->gen >= 4)
                intel_create_rotation_property(dev, primary);
@@ -14091,6 +14102,12 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
        drm_plane_helper_add(&primary->base, &intel_plane_helper_funcs);
 
        return &primary->base;
+
+fail:
+       kfree(state);
+       kfree(primary);
+
+       return NULL;
 }
 
 void intel_create_rotation_property(struct drm_device *dev, struct intel_plane *plane)
@@ -14207,18 +14224,17 @@ intel_update_cursor_plane(struct drm_plane *plane,
 static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
                                                   int pipe)
 {
-       struct intel_plane *cursor;
-       struct intel_plane_state *state;
+       struct intel_plane *cursor = NULL;
+       struct intel_plane_state *state = NULL;
+       int ret;
 
        cursor = kzalloc(sizeof(*cursor), GFP_KERNEL);
-       if (cursor == NULL)
-               return NULL;
+       if (!cursor)
+               goto fail;
 
        state = intel_create_plane_state(&cursor->base);
-       if (!state) {
-               kfree(cursor);
-               return NULL;
-       }
+       if (!state)
+               goto fail;
        cursor->base.state = &state->base;
 
        cursor->can_scale = false;
@@ -14230,11 +14246,13 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
        cursor->update_plane = intel_update_cursor_plane;
        cursor->disable_plane = intel_disable_cursor_plane;
 
-       drm_universal_plane_init(dev, &cursor->base, 0,
-                                &intel_plane_funcs,
-                                intel_cursor_formats,
-                                ARRAY_SIZE(intel_cursor_formats),
-                                DRM_PLANE_TYPE_CURSOR, NULL);
+       ret = drm_universal_plane_init(dev, &cursor->base, 0,
+                                      &intel_plane_funcs,
+                                      intel_cursor_formats,
+                                      ARRAY_SIZE(intel_cursor_formats),
+                                      DRM_PLANE_TYPE_CURSOR, NULL);
+       if (ret)
+               goto fail;
 
        if (INTEL_INFO(dev)->gen >= 4) {
                if (!dev->mode_config.rotation_property)
@@ -14254,6 +14272,12 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
        drm_plane_helper_add(&cursor->base, &intel_plane_helper_funcs);
 
        return &cursor->base;
+
+fail:
+       kfree(state);
+       kfree(cursor);
+
+       return NULL;
 }
 
 static void skl_init_scalers(struct drm_device *dev, struct intel_crtc *intel_crtc,
@@ -14279,7 +14303,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
        struct intel_crtc_state *crtc_state = NULL;
        struct drm_plane *primary = NULL;
        struct drm_plane *cursor = NULL;
-       int i, ret;
+       int ret;
 
        intel_crtc = kzalloc(sizeof(*intel_crtc), GFP_KERNEL);
        if (intel_crtc == NULL)
@@ -14315,13 +14339,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
        if (ret)
                goto fail;
 
-       drm_mode_crtc_set_gamma_size(&intel_crtc->base, 256);
-       for (i = 0; i < 256; i++) {
-               intel_crtc->lut_r[i] = i;
-               intel_crtc->lut_g[i] = i;
-               intel_crtc->lut_b[i] = i;
-       }
-
        /*
         * On gen2/3 only plane A can do fbc, but the panel fitter and lvds port
         * is hooked to pipe B. Hence we want plane A feeding pipe B.
@@ -14346,6 +14363,8 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
 
        drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs);
 
+       intel_color_init(&intel_crtc->base);
+
        WARN_ON(drm_crtc_index(&intel_crtc->base) != intel_crtc->pipe);
        return;
 
@@ -14470,6 +14489,8 @@ static void intel_setup_outputs(struct drm_device *dev)
                intel_ddi_init(dev, PORT_A);
                intel_ddi_init(dev, PORT_B);
                intel_ddi_init(dev, PORT_C);
+
+               intel_dsi_init(dev);
        } else if (HAS_DDI(dev)) {
                int found;
 
@@ -14839,6 +14860,8 @@ static int intel_framebuffer_init(struct drm_device *dev,
        drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
        intel_fb->obj = obj;
 
+       intel_fill_fb_info(dev_priv, &intel_fb->base);
+
        ret = drm_framebuffer_init(dev, &intel_fb->base, &intel_fb_funcs);
        if (ret) {
                DRM_ERROR("framebuffer init failed %d\n", ret);
@@ -14859,8 +14882,7 @@ intel_user_framebuffer_create(struct drm_device *dev,
        struct drm_i915_gem_object *obj;
        struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
 
-       obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
-                                               mode_cmd.handles[0]));
+       obj = to_intel_bo(drm_gem_object_lookup(filp, mode_cmd.handles[0]));
        if (&obj->base == NULL)
                return ERR_PTR(-ENOENT);
 
@@ -14886,23 +14908,13 @@ static const struct drm_mode_config_funcs intel_mode_funcs = {
        .atomic_state_clear = intel_atomic_state_clear,
 };
 
-/* Set up chip specific display functions */
-static void intel_init_display(struct drm_device *dev)
+/**
+ * intel_init_display_hooks - initialize the display modesetting hooks
+ * @dev_priv: device private
+ */
+void intel_init_display_hooks(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       if (HAS_PCH_SPLIT(dev) || IS_G4X(dev))
-               dev_priv->display.find_dpll = g4x_find_best_dpll;
-       else if (IS_CHERRYVIEW(dev))
-               dev_priv->display.find_dpll = chv_find_best_dpll;
-       else if (IS_VALLEYVIEW(dev))
-               dev_priv->display.find_dpll = vlv_find_best_dpll;
-       else if (IS_PINEVIEW(dev))
-               dev_priv->display.find_dpll = pnv_find_best_dpll;
-       else
-               dev_priv->display.find_dpll = i9xx_find_best_dpll;
-
-       if (INTEL_INFO(dev)->gen >= 9) {
+       if (INTEL_INFO(dev_priv)->gen >= 9) {
                dev_priv->display.get_pipe_config = haswell_get_pipe_config;
                dev_priv->display.get_initial_plane_config =
                        skylake_get_initial_plane_config;
@@ -14910,7 +14922,7 @@ static void intel_init_display(struct drm_device *dev)
                        haswell_crtc_compute_clock;
                dev_priv->display.crtc_enable = haswell_crtc_enable;
                dev_priv->display.crtc_disable = haswell_crtc_disable;
-       } else if (HAS_DDI(dev)) {
+       } else if (HAS_DDI(dev_priv)) {
                dev_priv->display.get_pipe_config = haswell_get_pipe_config;
                dev_priv->display.get_initial_plane_config =
                        ironlake_get_initial_plane_config;
@@ -14918,7 +14930,7 @@ static void intel_init_display(struct drm_device *dev)
                        haswell_crtc_compute_clock;
                dev_priv->display.crtc_enable = haswell_crtc_enable;
                dev_priv->display.crtc_disable = haswell_crtc_disable;
-       } else if (HAS_PCH_SPLIT(dev)) {
+       } else if (HAS_PCH_SPLIT(dev_priv)) {
                dev_priv->display.get_pipe_config = ironlake_get_pipe_config;
                dev_priv->display.get_initial_plane_config =
                        ironlake_get_initial_plane_config;
@@ -14926,106 +14938,134 @@ static void intel_init_display(struct drm_device *dev)
                        ironlake_crtc_compute_clock;
                dev_priv->display.crtc_enable = ironlake_crtc_enable;
                dev_priv->display.crtc_disable = ironlake_crtc_disable;
-       } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
                dev_priv->display.get_initial_plane_config =
                        i9xx_get_initial_plane_config;
-               dev_priv->display.crtc_compute_clock = i9xx_crtc_compute_clock;
+               dev_priv->display.crtc_compute_clock = chv_crtc_compute_clock;
                dev_priv->display.crtc_enable = valleyview_crtc_enable;
                dev_priv->display.crtc_disable = i9xx_crtc_disable;
-       } else {
+       } else if (IS_VALLEYVIEW(dev_priv)) {
+               dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
+               dev_priv->display.get_initial_plane_config =
+                       i9xx_get_initial_plane_config;
+               dev_priv->display.crtc_compute_clock = vlv_crtc_compute_clock;
+               dev_priv->display.crtc_enable = valleyview_crtc_enable;
+               dev_priv->display.crtc_disable = i9xx_crtc_disable;
+       } else if (IS_G4X(dev_priv)) {
+               dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
+               dev_priv->display.get_initial_plane_config =
+                       i9xx_get_initial_plane_config;
+               dev_priv->display.crtc_compute_clock = g4x_crtc_compute_clock;
+               dev_priv->display.crtc_enable = i9xx_crtc_enable;
+               dev_priv->display.crtc_disable = i9xx_crtc_disable;
+       } else if (IS_PINEVIEW(dev_priv)) {
+               dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
+               dev_priv->display.get_initial_plane_config =
+                       i9xx_get_initial_plane_config;
+               dev_priv->display.crtc_compute_clock = pnv_crtc_compute_clock;
+               dev_priv->display.crtc_enable = i9xx_crtc_enable;
+               dev_priv->display.crtc_disable = i9xx_crtc_disable;
+       } else if (!IS_GEN2(dev_priv)) {
                dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
                dev_priv->display.get_initial_plane_config =
                        i9xx_get_initial_plane_config;
                dev_priv->display.crtc_compute_clock = i9xx_crtc_compute_clock;
                dev_priv->display.crtc_enable = i9xx_crtc_enable;
                dev_priv->display.crtc_disable = i9xx_crtc_disable;
+       } else {
+               dev_priv->display.get_pipe_config = i9xx_get_pipe_config;
+               dev_priv->display.get_initial_plane_config =
+                       i9xx_get_initial_plane_config;
+               dev_priv->display.crtc_compute_clock = i8xx_crtc_compute_clock;
+               dev_priv->display.crtc_enable = i9xx_crtc_enable;
+               dev_priv->display.crtc_disable = i9xx_crtc_disable;
        }
 
        /* Returns the core display clock speed */
-       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
+       if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        skylake_get_display_clock_speed;
-       else if (IS_BROXTON(dev))
+       else if (IS_BROXTON(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        broxton_get_display_clock_speed;
-       else if (IS_BROADWELL(dev))
+       else if (IS_BROADWELL(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        broadwell_get_display_clock_speed;
-       else if (IS_HASWELL(dev))
+       else if (IS_HASWELL(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        haswell_get_display_clock_speed;
-       else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
+       else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        valleyview_get_display_clock_speed;
-       else if (IS_GEN5(dev))
+       else if (IS_GEN5(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        ilk_get_display_clock_speed;
-       else if (IS_I945G(dev) || IS_BROADWATER(dev) ||
-                IS_GEN6(dev) || IS_IVYBRIDGE(dev))
+       else if (IS_I945G(dev_priv) || IS_BROADWATER(dev_priv) ||
+                IS_GEN6(dev_priv) || IS_IVYBRIDGE(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i945_get_display_clock_speed;
-       else if (IS_GM45(dev))
+       else if (IS_GM45(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        gm45_get_display_clock_speed;
-       else if (IS_CRESTLINE(dev))
+       else if (IS_CRESTLINE(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i965gm_get_display_clock_speed;
-       else if (IS_PINEVIEW(dev))
+       else if (IS_PINEVIEW(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        pnv_get_display_clock_speed;
-       else if (IS_G33(dev) || IS_G4X(dev))
+       else if (IS_G33(dev_priv) || IS_G4X(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        g33_get_display_clock_speed;
-       else if (IS_I915G(dev))
+       else if (IS_I915G(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i915_get_display_clock_speed;
-       else if (IS_I945GM(dev) || IS_845G(dev))
+       else if (IS_I945GM(dev_priv) || IS_845G(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i9xx_misc_get_display_clock_speed;
-       else if (IS_I915GM(dev))
+       else if (IS_I915GM(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i915gm_get_display_clock_speed;
-       else if (IS_I865G(dev))
+       else if (IS_I865G(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i865_get_display_clock_speed;
-       else if (IS_I85X(dev))
+       else if (IS_I85X(dev_priv))
                dev_priv->display.get_display_clock_speed =
                        i85x_get_display_clock_speed;
        else { /* 830 */
-               WARN(!IS_I830(dev), "Unknown platform. Assuming 133 MHz CDCLK\n");
+               WARN(!IS_I830(dev_priv), "Unknown platform. Assuming 133 MHz CDCLK\n");
                dev_priv->display.get_display_clock_speed =
                        i830_get_display_clock_speed;
        }
 
-       if (IS_GEN5(dev)) {
+       if (IS_GEN5(dev_priv)) {
                dev_priv->display.fdi_link_train = ironlake_fdi_link_train;
-       } else if (IS_GEN6(dev)) {
+       } else if (IS_GEN6(dev_priv)) {
                dev_priv->display.fdi_link_train = gen6_fdi_link_train;
-       } else if (IS_IVYBRIDGE(dev)) {
+       } else if (IS_IVYBRIDGE(dev_priv)) {
                /* FIXME: detect B0+ stepping and use auto training */
                dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
-       } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+       } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
                dev_priv->display.fdi_link_train = hsw_fdi_link_train;
-               if (IS_BROADWELL(dev)) {
+               if (IS_BROADWELL(dev_priv)) {
                        dev_priv->display.modeset_commit_cdclk =
                                broadwell_modeset_commit_cdclk;
                        dev_priv->display.modeset_calc_cdclk =
                                broadwell_modeset_calc_cdclk;
                }
-       } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
                dev_priv->display.modeset_commit_cdclk =
                        valleyview_modeset_commit_cdclk;
                dev_priv->display.modeset_calc_cdclk =
                        valleyview_modeset_calc_cdclk;
-       } else if (IS_BROXTON(dev)) {
+       } else if (IS_BROXTON(dev_priv)) {
                dev_priv->display.modeset_commit_cdclk =
                        broxton_modeset_commit_cdclk;
                dev_priv->display.modeset_calc_cdclk =
                        broxton_modeset_calc_cdclk;
        }
 
-       switch (INTEL_INFO(dev)->gen) {
+       switch (INTEL_INFO(dev_priv)->gen) {
        case 2:
                dev_priv->display.queue_flip = intel_gen2_queue_flip;
                break;
@@ -15052,8 +15092,6 @@ static void intel_init_display(struct drm_device *dev)
                /* Default just returns -ENODEV to indicate unsupported */
                dev_priv->display.queue_flip = intel_default_queue_flip;
        }
-
-       mutex_init(&dev_priv->pps_mutex);
 }
 
 /*
@@ -15276,7 +15314,7 @@ static void sanitize_watermarks(struct drm_device *dev)
        int i;
 
        /* Only supported on platforms that use atomic watermark design */
-       if (!dev_priv->display.program_watermarks)
+       if (!dev_priv->display.optimize_watermarks)
                return;
 
        /*
@@ -15297,6 +15335,13 @@ retry:
        if (WARN_ON(IS_ERR(state)))
                goto fail;
 
+       /*
+        * Hardware readout is the only time we don't want to calculate
+        * intermediate watermarks (since we don't trust the current
+        * watermarks).
+        */
+       to_intel_atomic_state(state)->skip_intermediate_wm = true;
+
        ret = intel_atomic_check(dev, state);
        if (ret) {
                /*
@@ -15319,7 +15364,8 @@ retry:
        for_each_crtc_in_state(state, crtc, cstate, i) {
                struct intel_crtc_state *cs = to_intel_crtc_state(cstate);
 
-               dev_priv->display.program_watermarks(cs);
+               cs->wm.need_postvbl_update = true;
+               dev_priv->display.optimize_watermarks(cs);
        }
 
        drm_atomic_state_free(state);
@@ -15330,7 +15376,8 @@ fail:
 
 void intel_modeset_init(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int sprite, ret;
        enum pipe pipe;
        struct intel_crtc *crtc;
@@ -15372,9 +15419,6 @@ void intel_modeset_init(struct drm_device *dev)
                }
        }
 
-       intel_init_display(dev);
-       intel_init_audio(dev);
-
        if (IS_GEN2(dev)) {
                dev->mode_config.max_width = 2048;
                dev->mode_config.max_height = 2048;
@@ -15397,7 +15441,7 @@ void intel_modeset_init(struct drm_device *dev)
                dev->mode_config.cursor_height = MAX_CURSOR_HEIGHT;
        }
 
-       dev->mode_config.fb_base = dev_priv->gtt.mappable_base;
+       dev->mode_config.fb_base = ggtt->mappable_base;
 
        DRM_DEBUG_KMS("%d display pipe%s available.\n",
                      INTEL_INFO(dev)->num_pipes,
@@ -15414,6 +15458,7 @@ void intel_modeset_init(struct drm_device *dev)
        }
 
        intel_update_czclk(dev_priv);
+       intel_update_rawclk(dev_priv);
        intel_update_cdclk(dev);
 
        intel_shared_dpll_init(dev);
@@ -15526,10 +15571,15 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
 {
        struct drm_device *dev = crtc->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       i915_reg_t reg = PIPECONF(crtc->config->cpu_transcoder);
+       enum transcoder cpu_transcoder = crtc->config->cpu_transcoder;
 
        /* Clear any frame start delays used for debugging left by the BIOS */
-       I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
+       if (!transcoder_is_dsi(cpu_transcoder)) {
+               i915_reg_t reg = PIPECONF(cpu_transcoder);
+
+               I915_WRITE(reg,
+                          I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
+       }
 
        /* restore vblank interrupts to correct state */
        drm_crtc_vblank_reset(&crtc->base);
@@ -15577,38 +15627,9 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
 
        /* Adjust the state of the output pipe according to whether we
         * have active connectors/encoders. */
-       if (!intel_crtc_has_encoders(crtc))
+       if (crtc->active && !intel_crtc_has_encoders(crtc))
                intel_crtc_disable_noatomic(&crtc->base);
 
-       if (crtc->active != crtc->base.state->active) {
-               struct intel_encoder *encoder;
-
-               /* This can happen either due to bugs in the get_hw_state
-                * functions or because of calls to intel_crtc_disable_noatomic,
-                * or because the pipe is force-enabled due to the
-                * pipe A quirk. */
-               DRM_DEBUG_KMS("[CRTC:%d] hw state adjusted, was %s, now %s\n",
-                             crtc->base.base.id,
-                             crtc->base.state->enable ? "enabled" : "disabled",
-                             crtc->active ? "enabled" : "disabled");
-
-               WARN_ON(drm_atomic_set_mode_for_crtc(crtc->base.state, NULL) < 0);
-               crtc->base.state->active = crtc->active;
-               crtc->base.enabled = crtc->active;
-               crtc->base.state->connector_mask = 0;
-               crtc->base.state->encoder_mask = 0;
-
-               /* Because we only establish the connector -> encoder ->
-                * crtc links if something is active, this means the
-                * crtc is now deactivated. Break the links. connector
-                * -> encoder links are only establish when things are
-                *  actually up, hence no need to break them. */
-               WARN_ON(crtc->active);
-
-               for_each_encoder_on_crtc(dev, &crtc->base, encoder)
-                       encoder->base.crtc = NULL;
-       }
-
        if (crtc->active || HAS_GMCH_DISPLAY(dev)) {
                /*
                 * We start out with underrun reporting disabled to avoid races.
@@ -15738,7 +15759,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
                struct intel_crtc_state *crtc_state = crtc->config;
                int pixclk = 0;
 
-               __drm_atomic_helper_crtc_destroy_state(&crtc->base, &crtc_state->base);
+               __drm_atomic_helper_crtc_destroy_state(&crtc_state->base);
                memset(crtc_state, 0, sizeof(*crtc_state));
                crtc_state->base.crtc = &crtc->base;
 
@@ -15777,22 +15798,17 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
 
-               pll->on = pll->get_hw_state(dev_priv, pll,
-                                           &pll->config.hw_state);
-               pll->active = 0;
+               pll->on = pll->funcs.get_hw_state(dev_priv, pll,
+                                                 &pll->config.hw_state);
                pll->config.crtc_mask = 0;
                for_each_intel_crtc(dev, crtc) {
-                       if (crtc->active && intel_crtc_to_shared_dpll(crtc) == pll) {
-                               pll->active++;
+                       if (crtc->active && crtc->config->shared_dpll == pll)
                                pll->config.crtc_mask |= 1 << crtc->pipe;
-                       }
                }
+               pll->active_mask = pll->config.crtc_mask;
 
                DRM_DEBUG_KMS("%s hw state readout: crtc_mask 0x%08x, on %i\n",
                              pll->name, pll->config.crtc_mask, pll->on);
-
-               if (pll->config.crtc_mask)
-                       intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
        }
 
        for_each_intel_encoder(dev, encoder) {
@@ -15874,6 +15890,8 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
                        drm_calc_timestamping_constants(&crtc->base, &crtc->base.hwmode);
                        update_scanline_offset(crtc);
                }
+
+               intel_pipe_config_sanity_check(dev_priv, crtc->config);
        }
 }
 
@@ -15908,12 +15926,12 @@ intel_modeset_setup_hw_state(struct drm_device *dev)
        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
                struct intel_shared_dpll *pll = &dev_priv->shared_dplls[i];
 
-               if (!pll->on || pll->active)
+               if (!pll->on || pll->active_mask)
                        continue;
 
                DRM_DEBUG_KMS("%s enabled but not in use, disabling\n", pll->name);
 
-               pll->disable(dev_priv, pll);
+               pll->funcs.disable(dev_priv, pll);
                pll->on = false;
        }
 
@@ -16022,9 +16040,8 @@ void intel_modeset_gem_init(struct drm_device *dev)
                        continue;
 
                mutex_lock(&dev->struct_mutex);
-               ret = intel_pin_and_fence_fb_obj(c->primary,
-                                                c->primary->fb,
-                                                c->primary->state);
+               ret = intel_pin_and_fence_fb_obj(c->primary->fb,
+                                                c->primary->state->rotation);
                mutex_unlock(&dev->struct_mutex);
                if (ret) {
                        DRM_ERROR("failed to pin boot fb on pipe %d\n",
@@ -16233,8 +16250,9 @@ intel_display_capture_error_state(struct drm_device *dev)
                        error->pipe[i].stat = I915_READ(PIPESTAT(i));
        }
 
+       /* Note: this does not include DSI transcoders. */
        error->num_transcoders = INTEL_INFO(dev)->num_pipes;
-       if (HAS_DDI(dev_priv->dev))
+       if (HAS_DDI(dev_priv))
                error->num_transcoders++; /* Account for eDP. */
 
        for (i = 0; i < error->num_transcoders; i++) {
@@ -16305,7 +16323,7 @@ intel_display_print_error_state(struct drm_i915_error_state_buf *m,
        }
 
        for (i = 0; i < error->num_transcoders; i++) {
-               err_printf(m, "CPU transcoder: %c\n",
+               err_printf(m, "CPU transcoder: %s\n",
                           transcoder_name(error->transcoder[i].cpu_transcoder));
                err_printf(m, "  Power: %s\n",
                           onoff(error->transcoder[i].power_domain_on));
index 412a34c39522fc8474b87eaa02a5532f8a32d859..f192f58708c25dbedf74994b4a377098093f0dc3 100644 (file)
@@ -129,6 +129,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync);
 static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp);
 static void vlv_steal_power_sequencer(struct drm_device *dev,
                                      enum pipe pipe);
+static void intel_dp_unset_edid(struct intel_dp *intel_dp);
 
 static unsigned int intel_dp_unused_lane_mask(int lane_count)
 {
@@ -671,60 +672,55 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
        return status;
 }
 
-static uint32_t i9xx_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
+static uint32_t g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
+
+       if (index)
+               return 0;
 
        /*
         * The clock divider is based off the hrawclk, and would like to run at
-        * 2MHz.  So, take the hrawclk value and divide by 2 and use that
+        * 2MHz.  So, take the hrawclk value and divide by 2000 and use that
         */
-       return index ? 0 : DIV_ROUND_CLOSEST(intel_hrawclk(dev), 2);
+       return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
 }
 
 static uint32_t ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = intel_dig_port->base.base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
 
        if (index)
                return 0;
 
-       if (intel_dig_port->port == PORT_A) {
+       /*
+        * The clock divider is based off the cdclk or PCH rawclk, and would
+        * like to run at 2MHz.  So, take the cdclk or PCH rawclk value and
+        * divide by 2000 and use that
+        */
+       if (intel_dig_port->port == PORT_A)
                return DIV_ROUND_CLOSEST(dev_priv->cdclk_freq, 2000);
-
-       } else {
-               return DIV_ROUND_CLOSEST(intel_pch_rawclk(dev), 2);
-       }
+       else
+               return DIV_ROUND_CLOSEST(dev_priv->rawclk_freq, 2000);
 }
 
 static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_device *dev = intel_dig_port->base.base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
 
-       if (intel_dig_port->port == PORT_A) {
-               if (index)
-                       return 0;
-               return DIV_ROUND_CLOSEST(dev_priv->cdclk_freq, 2000);
-       } else if (HAS_PCH_LPT_H(dev_priv)) {
+       if (intel_dig_port->port != PORT_A && HAS_PCH_LPT_H(dev_priv)) {
                /* Workaround for non-ULT HSW */
                switch (index) {
                case 0: return 63;
                case 1: return 72;
                default: return 0;
                }
-       } else  {
-               return index ? 0 : DIV_ROUND_CLOSEST(intel_pch_rawclk(dev), 2);
        }
-}
 
-static uint32_t vlv_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
-{
-       return index ? 0 : 100;
+       return ilk_get_aux_clock_divider(intel_dp, index);
 }
 
 static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
@@ -737,10 +733,10 @@ static uint32_t skl_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
        return index ? 0 : 1;
 }
 
-static uint32_t i9xx_get_aux_send_ctl(struct intel_dp *intel_dp,
-                                     bool has_aux_irq,
-                                     int send_bytes,
-                                     uint32_t aux_clock_divider)
+static uint32_t g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
+                                    bool has_aux_irq,
+                                    int send_bytes,
+                                    uint32_t aux_clock_divider)
 {
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct drm_device *dev = intel_dig_port->base.base.dev;
@@ -1229,71 +1225,6 @@ intel_dp_connector_unregister(struct intel_connector *intel_connector)
        intel_connector_unregister(intel_connector);
 }
 
-static void
-skl_edp_set_pll_config(struct intel_crtc_state *pipe_config)
-{
-       u32 ctrl1;
-
-       memset(&pipe_config->dpll_hw_state, 0,
-              sizeof(pipe_config->dpll_hw_state));
-
-       pipe_config->ddi_pll_sel = SKL_DPLL0;
-       pipe_config->dpll_hw_state.cfgcr1 = 0;
-       pipe_config->dpll_hw_state.cfgcr2 = 0;
-
-       ctrl1 = DPLL_CTRL1_OVERRIDE(SKL_DPLL0);
-       switch (pipe_config->port_clock / 2) {
-       case 81000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810,
-                                             SKL_DPLL0);
-               break;
-       case 135000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350,
-                                             SKL_DPLL0);
-               break;
-       case 270000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700,
-                                             SKL_DPLL0);
-               break;
-       case 162000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620,
-                                             SKL_DPLL0);
-               break;
-       /* TBD: For DP link rates 2.16 GHz and 4.32 GHz, VCO is 8640 which
-       results in CDCLK change. Need to handle the change of CDCLK by
-       disabling pipes and re-enabling them */
-       case 108000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
-                                             SKL_DPLL0);
-               break;
-       case 216000:
-               ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160,
-                                             SKL_DPLL0);
-               break;
-
-       }
-       pipe_config->dpll_hw_state.ctrl1 = ctrl1;
-}
-
-void
-hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config)
-{
-       memset(&pipe_config->dpll_hw_state, 0,
-              sizeof(pipe_config->dpll_hw_state));
-
-       switch (pipe_config->port_clock / 2) {
-       case 81000:
-               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_810;
-               break;
-       case 135000:
-               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_1350;
-               break;
-       case 270000:
-               pipe_config->ddi_pll_sel = PORT_CLK_SEL_LCPLL_2700;
-               break;
-       }
-}
-
 static int
 intel_dp_sink_rates(struct intel_dp *intel_dp, const int **sink_rates)
 {
@@ -1570,10 +1501,10 @@ intel_dp_compute_config(struct intel_encoder *encoder,
 
                /* Get bpp from vbt only for panels that dont have bpp in edid */
                if (intel_connector->base.display_info.bpc == 0 &&
-                       (dev_priv->vbt.edp_bpp && dev_priv->vbt.edp_bpp < bpp)) {
+                       (dev_priv->vbt.edp.bpp && dev_priv->vbt.edp.bpp < bpp)) {
                        DRM_DEBUG_KMS("clamping bpp for eDP panel to BIOS-provided %i\n",
-                                     dev_priv->vbt.edp_bpp);
-                       bpp = dev_priv->vbt.edp_bpp;
+                                     dev_priv->vbt.edp.bpp);
+                       bpp = dev_priv->vbt.edp.bpp;
                }
 
                /*
@@ -1651,13 +1582,7 @@ found:
                                &pipe_config->dp_m2_n2);
        }
 
-       if ((IS_SKYLAKE(dev)  || IS_KABYLAKE(dev)) && is_edp(intel_dp))
-               skl_edp_set_pll_config(pipe_config);
-       else if (IS_BROXTON(dev))
-               /* handled in ddi */;
-       else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
-               hsw_dp_set_ddi_pll_sel(pipe_config);
-       else
+       if (!HAS_DDI(dev))
                intel_dp_set_clock(encoder, pipe_config);
 
        return true;
@@ -1779,11 +1704,11 @@ static void wait_panel_status(struct intel_dp *intel_dp,
                        I915_READ(pp_stat_reg),
                        I915_READ(pp_ctrl_reg));
 
-       if (_wait_for((I915_READ(pp_stat_reg) & mask) == value, 5000, 10)) {
+       if (_wait_for((I915_READ(pp_stat_reg) & mask) == value,
+                     5 * USEC_PER_SEC, 10 * USEC_PER_MSEC))
                DRM_ERROR("Panel status timeout: status %08x control %08x\n",
                                I915_READ(pp_stat_reg),
                                I915_READ(pp_ctrl_reg));
-       }
 
        DRM_DEBUG_KMS("Wait complete\n");
 }
@@ -2290,6 +2215,15 @@ static void ironlake_edp_pll_on(struct intel_dp *intel_dp)
        POSTING_READ(DP_A);
        udelay(500);
 
+       /*
+        * [DevILK] Work around required when enabling DP PLL
+        * while a pipe is enabled going to FDI:
+        * 1. Wait for the start of vertical blank on the enabled pipe going to FDI
+        * 2. Program DP PLL enable
+        */
+       if (IS_GEN5(dev_priv))
+               intel_wait_for_vblank_if_active(dev_priv->dev, !crtc->pipe);
+
        intel_dp->DP |= DP_PLL_ENABLE;
 
        I915_WRITE(DP_A, intel_dp->DP);
@@ -2409,7 +2343,6 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
        struct drm_i915_private *dev_priv = dev->dev_private;
        enum port port = dp_to_dig_port(intel_dp)->port;
        struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
-       int dotclock;
 
        tmp = I915_READ(intel_dp->output_reg);
 
@@ -2459,16 +2392,12 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
                        pipe_config->port_clock = 270000;
        }
 
-       dotclock = intel_dotclock_calculate(pipe_config->port_clock,
-                                           &pipe_config->dp_m_n);
-
-       if (HAS_PCH_SPLIT(dev_priv->dev) && port != PORT_A)
-               ironlake_check_encoder_dotclock(pipe_config, dotclock);
-
-       pipe_config->base.adjusted_mode.crtc_clock = dotclock;
+       pipe_config->base.adjusted_mode.crtc_clock =
+               intel_dotclock_calculate(pipe_config->port_clock,
+                                        &pipe_config->dp_m_n);
 
-       if (is_edp(intel_dp) && dev_priv->vbt.edp_bpp &&
-           pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
+       if (is_edp(intel_dp) && dev_priv->vbt.edp.bpp &&
+           pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
                /*
                 * This is a big fat ugly hack.
                 *
@@ -2483,8 +2412,8 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
                 * load.
                 */
                DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
-                             pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
-               dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
+                             pipe_config->pipe_bpp, dev_priv->vbt.edp.bpp);
+               dev_priv->vbt.edp.bpp = pipe_config->pipe_bpp;
        }
 }
 
@@ -2710,7 +2639,6 @@ static void intel_enable_dp(struct intel_encoder *encoder)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
        uint32_t dp_reg = I915_READ(intel_dp->output_reg);
-       enum port port = dp_to_dig_port(intel_dp)->port;
        enum pipe pipe = crtc->pipe;
 
        if (WARN_ON(dp_reg & DP_PORT_EN))
@@ -2721,35 +2649,12 @@ static void intel_enable_dp(struct intel_encoder *encoder)
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
                vlv_init_panel_power_sequencer(intel_dp);
 
-       /*
-        * We get an occasional spurious underrun between the port
-        * enable and vdd enable, when enabling port A eDP.
-        *
-        * FIXME: Not sure if this applies to (PCH) port D eDP as well
-        */
-       if (port == PORT_A)
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, false);
-
        intel_dp_enable_port(intel_dp);
 
-       if (port == PORT_A && IS_GEN5(dev_priv)) {
-               /*
-                * Underrun reporting for the other pipe was disabled in
-                * g4x_pre_enable_dp(). The eDP PLL and port have now been
-                * enabled, so it's now safe to re-enable underrun reporting.
-                */
-               intel_wait_for_vblank_if_active(dev_priv->dev, !pipe);
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, !pipe, true);
-               intel_set_pch_fifo_underrun_reporting(dev_priv, !pipe, true);
-       }
-
        edp_panel_vdd_on(intel_dp);
        edp_panel_on(intel_dp);
        edp_panel_vdd_off(intel_dp, true);
 
-       if (port == PORT_A)
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
-
        pps_unlock(intel_dp);
 
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
@@ -2791,26 +2696,11 @@ static void vlv_enable_dp(struct intel_encoder *encoder)
 
 static void g4x_pre_enable_dp(struct intel_encoder *encoder)
 {
-       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
        enum port port = dp_to_dig_port(intel_dp)->port;
-       enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
 
        intel_dp_prepare(encoder);
 
-       if (port == PORT_A && IS_GEN5(dev_priv)) {
-               /*
-                * We get FIFO underruns on the other pipe when
-                * enabling the CPU eDP PLL, and when enabling CPU
-                * eDP port. We could potentially avoid the PLL
-                * underrun with a vblank wait just prior to enabling
-                * the PLL, but that doesn't appear to help the port
-                * enable case. Just sweep it all under the rug.
-                */
-               intel_set_cpu_fifo_underrun_reporting(dev_priv, !pipe, false);
-               intel_set_pch_fifo_underrun_reporting(dev_priv, !pipe, false);
-       }
-
        /* Only ilk+ has port A */
        if (port == PORT_A)
                ironlake_edp_pll_on(intel_dp);
@@ -3183,37 +3073,6 @@ static void chv_dp_post_pll_disable(struct intel_encoder *encoder)
        chv_phy_powergate_lanes(encoder, false, 0x0);
 }
 
-/*
- * Native read with retry for link status and receiver capability reads for
- * cases where the sink may still be asleep.
- *
- * Sinks are *supposed* to come up within 1ms from an off state, but we're also
- * supposed to retry 3 times per the spec.
- */
-static ssize_t
-intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
-                       void *buffer, size_t size)
-{
-       ssize_t ret;
-       int i;
-
-       /*
-        * Sometime we just get the same incorrect byte repeated
-        * over the entire buffer. Doing just one throw away read
-        * initially seems to "solve" it.
-        */
-       drm_dp_dpcd_read(aux, DP_DPCD_REV, buffer, 1);
-
-       for (i = 0; i < 3; i++) {
-               ret = drm_dp_dpcd_read(aux, offset, buffer, size);
-               if (ret == size)
-                       return ret;
-               msleep(1);
-       }
-
-       return ret;
-}
-
 /*
  * Fetch AUX CH registers 0x202 - 0x207 which contain
  * link status information
@@ -3221,10 +3080,8 @@ intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset,
 bool
 intel_dp_get_link_status(struct intel_dp *intel_dp, uint8_t link_status[DP_LINK_STATUS_SIZE])
 {
-       return intel_dp_dpcd_read_wake(&intel_dp->aux,
-                                      DP_LANE0_1_STATUS,
-                                      link_status,
-                                      DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
+       return drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS, link_status,
+                               DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE;
 }
 
 /* These are source-specific values. */
@@ -3238,7 +3095,7 @@ intel_dp_voltage_max(struct intel_dp *intel_dp)
        if (IS_BROXTON(dev))
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
        else if (INTEL_INFO(dev)->gen >= 9) {
-               if (dev_priv->edp_low_vswing && port == PORT_A)
+               if (dev_priv->vbt.edp.low_vswing && port == PORT_A)
                        return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
                return DP_TRAIN_VOLTAGE_SWING_LEVEL_2;
        } else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
@@ -3859,8 +3716,8 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint8_t rev;
 
-       if (intel_dp_dpcd_read_wake(&intel_dp->aux, 0x000, intel_dp->dpcd,
-                                   sizeof(intel_dp->dpcd)) < 0)
+       if (drm_dp_dpcd_read(&intel_dp->aux, 0x000, intel_dp->dpcd,
+                            sizeof(intel_dp->dpcd)) < 0)
                return false; /* aux transfer failed */
 
        DRM_DEBUG_KMS("DPCD: %*ph\n", (int) sizeof(intel_dp->dpcd), intel_dp->dpcd);
@@ -3868,12 +3725,33 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
        if (intel_dp->dpcd[DP_DPCD_REV] == 0)
                return false; /* DPCD not present */
 
+       if (drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT,
+                            &intel_dp->sink_count, 1) < 0)
+               return false;
+
+       /*
+        * Sink count can change between short pulse hpd hence
+        * a member variable in intel_dp will track any changes
+        * between short pulse interrupts.
+        */
+       intel_dp->sink_count = DP_GET_SINK_COUNT(intel_dp->sink_count);
+
+       /*
+        * SINK_COUNT == 0 and DOWNSTREAM_PORT_PRESENT == 1 implies that
+        * a dongle is present but no display. Unless we require to know
+        * if a dongle is present or not, we don't need to update
+        * downstream port information. So, an early return here saves
+        * time from performing other operations which are not required.
+        */
+       if (!is_edp(intel_dp) && !intel_dp->sink_count)
+               return false;
+
        /* Check if the panel supports PSR */
        memset(intel_dp->psr_dpcd, 0, sizeof(intel_dp->psr_dpcd));
        if (is_edp(intel_dp)) {
-               intel_dp_dpcd_read_wake(&intel_dp->aux, DP_PSR_SUPPORT,
-                                       intel_dp->psr_dpcd,
-                                       sizeof(intel_dp->psr_dpcd));
+               drm_dp_dpcd_read(&intel_dp->aux, DP_PSR_SUPPORT,
+                                intel_dp->psr_dpcd,
+                                sizeof(intel_dp->psr_dpcd));
                if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
                        dev_priv->psr.sink_support = true;
                        DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
@@ -3884,9 +3762,9 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
                        uint8_t frame_sync_cap;
 
                        dev_priv->psr.sink_support = true;
-                       intel_dp_dpcd_read_wake(&intel_dp->aux,
-                                       DP_SINK_DEVICE_AUX_FRAME_SYNC_CAP,
-                                       &frame_sync_cap, 1);
+                       drm_dp_dpcd_read(&intel_dp->aux,
+                                        DP_SINK_DEVICE_AUX_FRAME_SYNC_CAP,
+                                        &frame_sync_cap, 1);
                        dev_priv->psr.aux_frame_sync = frame_sync_cap ? true : false;
                        /* PSR2 needs frame sync as well */
                        dev_priv->psr.psr2_support = dev_priv->psr.aux_frame_sync;
@@ -3902,15 +3780,13 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
        /* Intermediate frequency support */
        if (is_edp(intel_dp) &&
            (intel_dp->dpcd[DP_EDP_CONFIGURATION_CAP] & DP_DPCD_DISPLAY_CONTROL_CAPABLE) &&
-           (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_EDP_DPCD_REV, &rev, 1) == 1) &&
+           (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV, &rev, 1) == 1) &&
            (rev >= 0x03)) { /* eDp v1.4 or higher */
                __le16 sink_rates[DP_MAX_SUPPORTED_RATES];
                int i;
 
-               intel_dp_dpcd_read_wake(&intel_dp->aux,
-                               DP_SUPPORTED_LINK_RATES,
-                               sink_rates,
-                               sizeof(sink_rates));
+               drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES,
+                               sink_rates, sizeof(sink_rates));
 
                for (i = 0; i < ARRAY_SIZE(sink_rates); i++) {
                        int val = le16_to_cpu(sink_rates[i]);
@@ -3933,9 +3809,9 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
        if (intel_dp->dpcd[DP_DPCD_REV] == 0x10)
                return true; /* no per-port downstream info */
 
-       if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
-                                   intel_dp->downstream_ports,
-                                   DP_MAX_DOWNSTREAM_PORTS) < 0)
+       if (drm_dp_dpcd_read(&intel_dp->aux, DP_DOWNSTREAM_PORT_0,
+                            intel_dp->downstream_ports,
+                            DP_MAX_DOWNSTREAM_PORTS) < 0)
                return false; /* downstream port status fetch failed */
 
        return true;
@@ -3949,11 +3825,11 @@ intel_dp_probe_oui(struct intel_dp *intel_dp)
        if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
                return;
 
-       if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3)
+       if (drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_OUI, buf, 3) == 3)
                DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
                              buf[0], buf[1], buf[2]);
 
-       if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3)
+       if (drm_dp_dpcd_read(&intel_dp->aux, DP_BRANCH_OUI, buf, 3) == 3)
                DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
                              buf[0], buf[1], buf[2]);
 }
@@ -3963,13 +3839,16 @@ intel_dp_probe_mst(struct intel_dp *intel_dp)
 {
        u8 buf[1];
 
+       if (!i915.enable_dp_mst)
+               return false;
+
        if (!intel_dp->can_mst)
                return false;
 
        if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
                return false;
 
-       if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_MSTM_CAP, buf, 1)) {
+       if (drm_dp_dpcd_read(&intel_dp->aux, DP_MSTM_CAP, buf, 1)) {
                if (buf[0] & DP_MST_CAP) {
                        DRM_DEBUG_KMS("Sink is MST capable\n");
                        intel_dp->is_mst = true;
@@ -4106,7 +3985,7 @@ stop:
 static bool
 intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
 {
-       return intel_dp_dpcd_read_wake(&intel_dp->aux,
+       return drm_dp_dpcd_read(&intel_dp->aux,
                                       DP_DEVICE_SERVICE_IRQ_VECTOR,
                                       sink_irq_vector, 1) == 1;
 }
@@ -4116,7 +3995,7 @@ intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
 {
        int ret;
 
-       ret = intel_dp_dpcd_read_wake(&intel_dp->aux,
+       ret = drm_dp_dpcd_read(&intel_dp->aux,
                                             DP_SINK_COUNT_ESI,
                                             sink_irq_vector, 14);
        if (ret != 14)
@@ -4292,6 +4171,36 @@ go_again:
        return -EINVAL;
 }
 
+static void
+intel_dp_check_link_status(struct intel_dp *intel_dp)
+{
+       struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
+       struct drm_device *dev = intel_dp_to_dev(intel_dp);
+       u8 link_status[DP_LINK_STATUS_SIZE];
+
+       WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
+
+       if (!intel_dp_get_link_status(intel_dp, link_status)) {
+               DRM_ERROR("Failed to get link status\n");
+               return;
+       }
+
+       if (!intel_encoder->base.crtc)
+               return;
+
+       if (!to_intel_crtc(intel_encoder->base.crtc)->active)
+               return;
+
+       /* if link training is requested we should perform it always */
+       if ((intel_dp->compliance_test_type == DP_TEST_LINK_TRAINING) ||
+           (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))) {
+               DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
+                             intel_encoder->base.name);
+               intel_dp_start_link_train(intel_dp);
+               intel_dp_stop_link_train(intel_dp);
+       }
+}
+
 /*
  * According to DP spec
  * 5.1.2:
@@ -4299,16 +4208,19 @@ go_again:
  *  2. Configure link according to Receiver Capabilities
  *  3. Use Link Training from 2.5.3.3 and 3.5.1.3
  *  4. Check link status on receipt of hot-plug interrupt
+ *
+ * intel_dp_short_pulse -  handles short pulse interrupts
+ * when full detection is not required.
+ * Returns %true if short pulse is handled and full detection
+ * is NOT required and %false otherwise.
  */
-static void
-intel_dp_check_link_status(struct intel_dp *intel_dp)
+static bool
+intel_dp_short_pulse(struct intel_dp *intel_dp)
 {
        struct drm_device *dev = intel_dp_to_dev(intel_dp);
-       struct intel_encoder *intel_encoder = &dp_to_dig_port(intel_dp)->base;
        u8 sink_irq_vector;
-       u8 link_status[DP_LINK_STATUS_SIZE];
-
-       WARN_ON(!drm_modeset_is_locked(&dev->mode_config.connection_mutex));
+       u8 old_sink_count = intel_dp->sink_count;
+       bool ret;
 
        /*
         * Clearing compliance test variables to allow capturing
@@ -4318,20 +4230,17 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
        intel_dp->compliance_test_type = 0;
        intel_dp->compliance_test_data = 0;
 
-       if (!intel_encoder->base.crtc)
-               return;
-
-       if (!to_intel_crtc(intel_encoder->base.crtc)->active)
-               return;
-
-       /* Try to read receiver status if the link appears to be up */
-       if (!intel_dp_get_link_status(intel_dp, link_status)) {
-               return;
-       }
+       /*
+        * Now read the DPCD to see if it's actually running
+        * If the current value of sink count doesn't match with
+        * the value that was stored earlier or dpcd read failed
+        * we need to do full detection
+        */
+       ret = intel_dp_get_dpcd(intel_dp);
 
-       /* Now read the DPCD to see if it's actually running */
-       if (!intel_dp_get_dpcd(intel_dp)) {
-               return;
+       if ((old_sink_count != intel_dp->sink_count) || !ret) {
+               /* No need to proceed if we are going to do full detect */
+               return false;
        }
 
        /* Try to read the source of the interrupt */
@@ -4348,14 +4257,11 @@ intel_dp_check_link_status(struct intel_dp *intel_dp)
                        DRM_DEBUG_DRIVER("CP or sink specific irq unhandled\n");
        }
 
-       /* if link training is requested we should perform it always */
-       if ((intel_dp->compliance_test_type == DP_TEST_LINK_TRAINING) ||
-               (!drm_dp_channel_eq_ok(link_status, intel_dp->lane_count))) {
-               DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n",
-                             intel_encoder->base.name);
-               intel_dp_start_link_train(intel_dp);
-               intel_dp_stop_link_train(intel_dp);
-       }
+       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
+       intel_dp_check_link_status(intel_dp);
+       drm_modeset_unlock(&dev->mode_config.connection_mutex);
+
+       return true;
 }
 
 /* XXX this is probably wrong for multiple downstream ports */
@@ -4368,6 +4274,9 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
        if (!intel_dp_get_dpcd(intel_dp))
                return connector_status_disconnected;
 
+       if (is_edp(intel_dp))
+               return connector_status_connected;
+
        /* if there's no downstream port, we're done */
        if (!(dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT))
                return connector_status_connected;
@@ -4375,14 +4284,9 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
        /* If we're HPD-aware, SINK_COUNT changes dynamically */
        if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
            intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) {
-               uint8_t reg;
 
-               if (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_SINK_COUNT,
-                                           &reg, 1) < 0)
-                       return connector_status_unknown;
-
-               return DP_GET_SINK_COUNT(reg) ? connector_status_connected
-                                             : connector_status_disconnected;
+               return intel_dp->sink_count ?
+               connector_status_connected : connector_status_disconnected;
        }
 
        /* If no HPD, poke DDC gently */
@@ -4591,6 +4495,7 @@ intel_dp_set_edid(struct intel_dp *intel_dp)
        struct intel_connector *intel_connector = intel_dp->attached_connector;
        struct edid *edid;
 
+       intel_dp_unset_edid(intel_dp);
        edid = intel_dp_get_edid(intel_dp);
        intel_connector->detect_edid = edid;
 
@@ -4611,9 +4516,10 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
        intel_dp->has_audio = false;
 }
 
-static enum drm_connector_status
-intel_dp_detect(struct drm_connector *connector, bool force)
+static void
+intel_dp_long_pulse(struct intel_connector *intel_connector)
 {
+       struct drm_connector *connector = &intel_connector->base;
        struct intel_dp *intel_dp = intel_attached_dp(connector);
        struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
        struct intel_encoder *intel_encoder = &intel_dig_port->base;
@@ -4623,17 +4529,6 @@ intel_dp_detect(struct drm_connector *connector, bool force)
        bool ret;
        u8 sink_irq_vector;
 
-       DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
-                     connector->base.id, connector->name);
-       intel_dp_unset_edid(intel_dp);
-
-       if (intel_dp->is_mst) {
-               /* MST devices are disconnected from a monitor POV */
-               if (intel_encoder->type != INTEL_OUTPUT_EDP)
-                       intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
-               return connector_status_disconnected;
-       }
-
        power_domain = intel_display_port_aux_power_domain(intel_encoder);
        intel_display_power_get(to_i915(dev), power_domain);
 
@@ -4651,19 +4546,42 @@ intel_dp_detect(struct drm_connector *connector, bool force)
                intel_dp->compliance_test_type = 0;
                intel_dp->compliance_test_data = 0;
 
+               if (intel_dp->is_mst) {
+                       DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
+                                     intel_dp->is_mst,
+                                     intel_dp->mst_mgr.mst_state);
+                       intel_dp->is_mst = false;
+                       drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
+                                                       intel_dp->is_mst);
+               }
+
                goto out;
        }
 
+       if (intel_encoder->type != INTEL_OUTPUT_EDP)
+               intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
+
        intel_dp_probe_oui(intel_dp);
 
        ret = intel_dp_probe_mst(intel_dp);
        if (ret) {
-               /* if we are in MST mode then this connector
-                  won't appear connected or have anything with EDID on it */
-               if (intel_encoder->type != INTEL_OUTPUT_EDP)
-                       intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
+               /*
+                * If we are in MST mode then this connector
+                * won't appear connected or have anything
+                * with EDID on it
+                */
                status = connector_status_disconnected;
                goto out;
+       } else if (connector->status == connector_status_connected) {
+               /*
+                * If display was connected already and is still connected
+                * check links status, there has been known issues of
+                * link loss triggerring long pulse!!!!
+                */
+               drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
+               intel_dp_check_link_status(intel_dp);
+               drm_modeset_unlock(&dev->mode_config.connection_mutex);
+               goto out;
        }
 
        /*
@@ -4676,9 +4594,8 @@ intel_dp_detect(struct drm_connector *connector, bool force)
 
        intel_dp_set_edid(intel_dp);
 
-       if (intel_encoder->type != INTEL_OUTPUT_EDP)
-               intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
        status = connector_status_connected;
+       intel_dp->detect_done = true;
 
        /* Try to read the source of the interrupt */
        if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
@@ -4695,8 +4612,43 @@ intel_dp_detect(struct drm_connector *connector, bool force)
        }
 
 out:
+       if ((status != connector_status_connected) &&
+           (intel_dp->is_mst == false))
+               intel_dp_unset_edid(intel_dp);
+
        intel_display_power_put(to_i915(dev), power_domain);
-       return status;
+       return;
+}
+
+static enum drm_connector_status
+intel_dp_detect(struct drm_connector *connector, bool force)
+{
+       struct intel_dp *intel_dp = intel_attached_dp(connector);
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct intel_encoder *intel_encoder = &intel_dig_port->base;
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+
+       DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
+                     connector->base.id, connector->name);
+
+       if (intel_dp->is_mst) {
+               /* MST devices are disconnected from a monitor POV */
+               intel_dp_unset_edid(intel_dp);
+               if (intel_encoder->type != INTEL_OUTPUT_EDP)
+                       intel_encoder->type = INTEL_OUTPUT_DISPLAYPORT;
+               return connector_status_disconnected;
+       }
+
+       /* If full detect is not performed yet, do a full detect */
+       if (!intel_dp->detect_done)
+               intel_dp_long_pulse(intel_dp->attached_connector);
+
+       intel_dp->detect_done = false;
+
+       if (intel_connector->detect_edid)
+               return connector_status_connected;
+       else
+               return connector_status_disconnected;
 }
 
 static void
@@ -4835,6 +4787,11 @@ intel_dp_set_property(struct drm_connector *connector,
                        DRM_DEBUG_KMS("no scaling not supported\n");
                        return -EINVAL;
                }
+               if (HAS_GMCH_DISPLAY(dev_priv) &&
+                   val == DRM_MODE_SCALE_CENTER) {
+                       DRM_DEBUG_KMS("centering not supported\n");
+                       return -EINVAL;
+               }
 
                if (intel_connector->panel.fitting_mode == val) {
                        /* the eDP scaling property is not changed */
@@ -5023,44 +4980,37 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
                /* indicate that we need to restart link training */
                intel_dp->train_set_valid = false;
 
-               if (!intel_digital_port_connected(dev_priv, intel_dig_port))
-                       goto mst_fail;
+               intel_dp_long_pulse(intel_dp->attached_connector);
+               if (intel_dp->is_mst)
+                       ret = IRQ_HANDLED;
+               goto put_power;
 
-               if (!intel_dp_get_dpcd(intel_dp)) {
-                       goto mst_fail;
-               }
-
-               intel_dp_probe_oui(intel_dp);
-
-               if (!intel_dp_probe_mst(intel_dp)) {
-                       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
-                       intel_dp_check_link_status(intel_dp);
-                       drm_modeset_unlock(&dev->mode_config.connection_mutex);
-                       goto mst_fail;
-               }
        } else {
                if (intel_dp->is_mst) {
-                       if (intel_dp_check_mst_status(intel_dp) == -EINVAL)
-                               goto mst_fail;
+                       if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
+                               /*
+                                * If we were in MST mode, and device is not
+                                * there, get out of MST mode
+                                */
+                               DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
+                                             intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
+                               intel_dp->is_mst = false;
+                               drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
+                                                               intel_dp->is_mst);
+                               goto put_power;
+                       }
                }
 
                if (!intel_dp->is_mst) {
-                       drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
-                       intel_dp_check_link_status(intel_dp);
-                       drm_modeset_unlock(&dev->mode_config.connection_mutex);
+                       if (!intel_dp_short_pulse(intel_dp)) {
+                               intel_dp_long_pulse(intel_dp->attached_connector);
+                               goto put_power;
+                       }
                }
        }
 
        ret = IRQ_HANDLED;
 
-       goto put_power;
-mst_fail:
-       /* if we were in MST mode, and device is not there get out of MST mode */
-       if (intel_dp->is_mst) {
-               DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
-               intel_dp->is_mst = false;
-               drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
-       }
 put_power:
        intel_display_power_put(dev_priv, power_domain);
 
@@ -5071,14 +5021,6 @@ put_power:
 bool intel_dp_is_edp(struct drm_device *dev, enum port port)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       union child_device_config *p_child;
-       int i;
-       static const short port_mapping[] = {
-               [PORT_B] = DVO_PORT_DPB,
-               [PORT_C] = DVO_PORT_DPC,
-               [PORT_D] = DVO_PORT_DPD,
-               [PORT_E] = DVO_PORT_DPE,
-       };
 
        /*
         * eDP not supported on g4x. so bail out early just
@@ -5090,18 +5032,7 @@ bool intel_dp_is_edp(struct drm_device *dev, enum port port)
        if (port == PORT_A)
                return true;
 
-       if (!dev_priv->vbt.child_dev_num)
-               return false;
-
-       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
-               p_child = dev_priv->vbt.child_dev + i;
-
-               if (p_child->common.dvo_port == port_mapping[port] &&
-                   (p_child->common.device_type & DEVICE_TYPE_eDP_BITS) ==
-                   (DEVICE_TYPE_eDP & DEVICE_TYPE_eDP_BITS))
-                       return true;
-       }
-       return false;
+       return intel_bios_is_port_edp(dev_priv, port);
 }
 
 void
@@ -5208,7 +5139,7 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev,
        DRM_DEBUG_KMS("cur t1_t3 %d t8 %d t9 %d t10 %d t11_t12 %d\n",
                      cur.t1_t3, cur.t8, cur.t9, cur.t10, cur.t11_t12);
 
-       vbt = dev_priv->vbt.edp_pps;
+       vbt = dev_priv->vbt.edp.pps;
 
        /* Upper limits from eDP 1.3 spec. Note that we use the clunky units of
         * our hw here, which are all in 100usec. */
@@ -5259,7 +5190,7 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev,
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 pp_on, pp_off, pp_div, port_sel = 0;
-       int div = HAS_PCH_SPLIT(dev) ? intel_pch_rawclk(dev) : intel_hrawclk(dev);
+       int div = dev_priv->rawclk_freq / 1000;
        i915_reg_t pp_on_reg, pp_off_reg, pp_div_reg, pp_ctrl_reg;
        enum port port = dp_to_dig_port(intel_dp)->port;
        const struct edp_power_seq *seq = &intel_dp->pps_delays;
@@ -5852,19 +5783,17 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
        /* intel_dp vfuncs */
        if (INTEL_INFO(dev)->gen >= 9)
                intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
-       else if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
-               intel_dp->get_aux_clock_divider = vlv_get_aux_clock_divider;
        else if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
        else if (HAS_PCH_SPLIT(dev))
                intel_dp->get_aux_clock_divider = ilk_get_aux_clock_divider;
        else
-               intel_dp->get_aux_clock_divider = i9xx_get_aux_clock_divider;
+               intel_dp->get_aux_clock_divider = g4x_get_aux_clock_divider;
 
        if (INTEL_INFO(dev)->gen >= 9)
                intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
        else
-               intel_dp->get_aux_send_ctl = i9xx_get_aux_send_ctl;
+               intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
 
        if (HAS_DDI(dev))
                intel_dp->prepare_link_retrain = intel_ddi_prepare_link_retrain;
index 2c999725b3d4b3ac10d9599227e00a1b392ae4f2..7a34090cef34e6a14276ab2cdfcbc4c498926be8 100644 (file)
@@ -33,7 +33,6 @@
 static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
                                        struct intel_crtc_state *pipe_config)
 {
-       struct drm_device *dev = encoder->base.dev;
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
        struct intel_digital_port *intel_dig_port = intel_mst->primary;
        struct intel_dp *intel_dp = &intel_dig_port->dp;
@@ -90,9 +89,6 @@ static bool intel_dp_mst_compute_config(struct intel_encoder *encoder,
 
        pipe_config->dp_m_n.tu = slots;
 
-       if (IS_HASWELL(dev) || IS_BROADWELL(dev))
-               hsw_dp_set_ddi_pll_sel(pipe_config);
-
        return true;
 
 }
@@ -106,7 +102,7 @@ static void intel_mst_disable_dp(struct intel_encoder *encoder)
 
        DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
 
-       drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->port);
+       drm_dp_mst_reset_vcpi_slots(&intel_dp->mst_mgr, intel_mst->connector->port);
 
        ret = drm_dp_update_payload_part1(&intel_dp->mst_mgr);
        if (ret) {
@@ -127,10 +123,11 @@ static void intel_mst_post_disable_dp(struct intel_encoder *encoder)
        /* and this can also fail */
        drm_dp_update_payload_part2(&intel_dp->mst_mgr);
 
-       drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->port);
+       drm_dp_mst_deallocate_vcpi(&intel_dp->mst_mgr, intel_mst->connector->port);
 
        intel_dp->active_mst_links--;
-       intel_mst->port = NULL;
+
+       intel_mst->connector = NULL;
        if (intel_dp->active_mst_links == 0) {
                intel_dig_port->base.post_disable(&intel_dig_port->base);
                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
@@ -170,7 +167,8 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
        found->encoder = encoder;
 
        DRM_DEBUG_KMS("%d\n", intel_dp->active_mst_links);
-       intel_mst->port = found->port;
+
+       intel_mst->connector = found;
 
        if (intel_dp->active_mst_links == 0) {
                intel_prepare_ddi_buffer(&intel_dig_port->base);
@@ -188,7 +186,7 @@ static void intel_mst_pre_enable_dp(struct intel_encoder *encoder)
        }
 
        ret = drm_dp_mst_allocate_vcpi(&intel_dp->mst_mgr,
-                                      intel_mst->port,
+                                      intel_mst->connector->port,
                                       intel_crtc->config->pbn, &slots);
        if (ret == false) {
                DRM_ERROR("failed to allocate vcpi\n");
@@ -229,7 +227,7 @@ static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
 {
        struct intel_dp_mst_encoder *intel_mst = enc_to_mst(&encoder->base);
        *pipe = intel_mst->pipe;
-       if (intel_mst->port)
+       if (intel_mst->connector)
                return true;
        return false;
 }
@@ -290,10 +288,11 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
        struct edid *edid;
        int ret;
 
-       edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
-       if (!edid)
-               return 0;
+       if (!intel_dp) {
+               return intel_connector_update_modes(connector, NULL);
+       }
 
+       edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
        ret = intel_connector_update_modes(connector, edid);
        kfree(edid);
 
@@ -306,6 +305,8 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct intel_dp *intel_dp = intel_connector->mst_port;
 
+       if (!intel_dp)
+               return connector_status_disconnected;
        return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port);
 }
 
@@ -371,6 +372,8 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c
        struct intel_dp *intel_dp = intel_connector->mst_port;
        struct intel_crtc *crtc = to_intel_crtc(state->crtc);
 
+       if (!intel_dp)
+               return NULL;
        return &intel_dp->mst_encoders[crtc->pipe]->base.base;
 }
 
@@ -378,6 +381,8 @@ static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connecto
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
        struct intel_dp *intel_dp = intel_connector->mst_port;
+       if (!intel_dp)
+               return NULL;
        return &intel_dp->mst_encoders[0]->base.base;
 }
 
@@ -488,23 +493,11 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
 
        /* need to nuke the connector */
        drm_modeset_lock_all(dev);
-       if (connector->state->crtc) {
-               struct drm_mode_set set;
-               int ret;
-
-               memset(&set, 0, sizeof(set));
-               set.crtc = connector->state->crtc,
-
-               ret = drm_atomic_helper_set_config(&set);
-
-               WARN(ret, "Disabling mst crtc failed with %i\n", ret);
-       }
-
        intel_connector_remove_from_fbdev(intel_connector);
-       drm_connector_cleanup(connector);
+       intel_connector->mst_port = NULL;
        drm_modeset_unlock_all(dev);
 
-       kfree(intel_connector);
+       drm_connector_unreference(&intel_connector->base);
        DRM_DEBUG_KMS("\n");
 }
 
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
new file mode 100644 (file)
index 0000000..639bf02
--- /dev/null
@@ -0,0 +1,1783 @@
+/*
+ * Copyright © 2006-2016 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 "intel_drv.h"
+
+struct intel_shared_dpll *
+intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
+                           enum intel_dpll_id id)
+{
+       return &dev_priv->shared_dplls[id];
+}
+
+enum intel_dpll_id
+intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
+                        struct intel_shared_dpll *pll)
+{
+       if (WARN_ON(pll < dev_priv->shared_dplls||
+                   pll > &dev_priv->shared_dplls[dev_priv->num_shared_dpll]))
+               return -1;
+
+       return (enum intel_dpll_id) (pll - dev_priv->shared_dplls);
+}
+
+void
+intel_shared_dpll_config_get(struct intel_shared_dpll_config *config,
+                            struct intel_shared_dpll *pll,
+                            struct intel_crtc *crtc)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum intel_dpll_id id = intel_get_shared_dpll_id(dev_priv, pll);
+
+       config[id].crtc_mask |= 1 << crtc->pipe;
+}
+
+void
+intel_shared_dpll_config_put(struct intel_shared_dpll_config *config,
+                            struct intel_shared_dpll *pll,
+                            struct intel_crtc *crtc)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       enum intel_dpll_id id = intel_get_shared_dpll_id(dev_priv, pll);
+
+       config[id].crtc_mask &= ~(1 << crtc->pipe);
+}
+
+/* For ILK+ */
+void assert_shared_dpll(struct drm_i915_private *dev_priv,
+                       struct intel_shared_dpll *pll,
+                       bool state)
+{
+       bool cur_state;
+       struct intel_dpll_hw_state hw_state;
+
+       if (WARN(!pll, "asserting DPLL %s with no DPLL\n", onoff(state)))
+               return;
+
+       cur_state = pll->funcs.get_hw_state(dev_priv, pll, &hw_state);
+       I915_STATE_WARN(cur_state != state,
+            "%s assertion failure (expected %s, current %s)\n",
+                       pll->name, onoff(state), onoff(cur_state));
+}
+
+void intel_prepare_shared_dpll(struct intel_crtc *crtc)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_shared_dpll *pll = crtc->config->shared_dpll;
+
+       if (WARN_ON(pll == NULL))
+               return;
+
+       mutex_lock(&dev_priv->dpll_lock);
+       WARN_ON(!pll->config.crtc_mask);
+       if (!pll->active_mask) {
+               DRM_DEBUG_DRIVER("setting up %s\n", pll->name);
+               WARN_ON(pll->on);
+               assert_shared_dpll_disabled(dev_priv, pll);
+
+               pll->funcs.mode_set(dev_priv, pll);
+       }
+       mutex_unlock(&dev_priv->dpll_lock);
+}
+
+/**
+ * intel_enable_shared_dpll - enable PCH PLL
+ * @dev_priv: i915 private structure
+ * @pipe: pipe PLL to enable
+ *
+ * The PCH PLL needs to be enabled before the PCH transcoder, since it
+ * drives the transcoder clock.
+ */
+void intel_enable_shared_dpll(struct intel_crtc *crtc)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_shared_dpll *pll = crtc->config->shared_dpll;
+       unsigned crtc_mask = 1 << drm_crtc_index(&crtc->base);
+       unsigned old_mask;
+
+       if (WARN_ON(pll == NULL))
+               return;
+
+       mutex_lock(&dev_priv->dpll_lock);
+       old_mask = pll->active_mask;
+
+       if (WARN_ON(!(pll->config.crtc_mask & crtc_mask)) ||
+           WARN_ON(pll->active_mask & crtc_mask))
+               goto out;
+
+       pll->active_mask |= crtc_mask;
+
+       DRM_DEBUG_KMS("enable %s (active %x, on? %d) for crtc %d\n",
+                     pll->name, pll->active_mask, pll->on,
+                     crtc->base.base.id);
+
+       if (old_mask) {
+               WARN_ON(!pll->on);
+               assert_shared_dpll_enabled(dev_priv, pll);
+               goto out;
+       }
+       WARN_ON(pll->on);
+
+       DRM_DEBUG_KMS("enabling %s\n", pll->name);
+       pll->funcs.enable(dev_priv, pll);
+       pll->on = true;
+
+out:
+       mutex_unlock(&dev_priv->dpll_lock);
+}
+
+void intel_disable_shared_dpll(struct intel_crtc *crtc)
+{
+       struct drm_device *dev = crtc->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_shared_dpll *pll = crtc->config->shared_dpll;
+       unsigned crtc_mask = 1 << drm_crtc_index(&crtc->base);
+
+       /* PCH only available on ILK+ */
+       if (INTEL_INFO(dev)->gen < 5)
+               return;
+
+       if (pll == NULL)
+               return;
+
+       mutex_lock(&dev_priv->dpll_lock);
+       if (WARN_ON(!(pll->active_mask & crtc_mask)))
+               goto out;
+
+       DRM_DEBUG_KMS("disable %s (active %x, on? %d) for crtc %d\n",
+                     pll->name, pll->active_mask, pll->on,
+                     crtc->base.base.id);
+
+       assert_shared_dpll_enabled(dev_priv, pll);
+       WARN_ON(!pll->on);
+
+       pll->active_mask &= ~crtc_mask;
+       if (pll->active_mask)
+               goto out;
+
+       DRM_DEBUG_KMS("disabling %s\n", pll->name);
+       pll->funcs.disable(dev_priv, pll);
+       pll->on = false;
+
+out:
+       mutex_unlock(&dev_priv->dpll_lock);
+}
+
+static struct intel_shared_dpll *
+intel_find_shared_dpll(struct intel_crtc *crtc,
+                      struct intel_crtc_state *crtc_state,
+                      enum intel_dpll_id range_min,
+                      enum intel_dpll_id range_max)
+{
+       struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
+       struct intel_shared_dpll *pll;
+       struct intel_shared_dpll_config *shared_dpll;
+       enum intel_dpll_id i;
+
+       shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
+
+       for (i = range_min; i <= range_max; i++) {
+               pll = &dev_priv->shared_dplls[i];
+
+               /* Only want to check enabled timings first */
+               if (shared_dpll[i].crtc_mask == 0)
+                       continue;
+
+               if (memcmp(&crtc_state->dpll_hw_state,
+                          &shared_dpll[i].hw_state,
+                          sizeof(crtc_state->dpll_hw_state)) == 0) {
+                       DRM_DEBUG_KMS("CRTC:%d sharing existing %s (crtc mask 0x%08x, active %x)\n",
+                                     crtc->base.base.id, pll->name,
+                                     shared_dpll[i].crtc_mask,
+                                     pll->active_mask);
+                       return pll;
+               }
+       }
+
+       /* Ok no matching timings, maybe there's a free one? */
+       for (i = range_min; i <= range_max; i++) {
+               pll = &dev_priv->shared_dplls[i];
+               if (shared_dpll[i].crtc_mask == 0) {
+                       DRM_DEBUG_KMS("CRTC:%d allocated %s\n",
+                                     crtc->base.base.id, pll->name);
+                       return pll;
+               }
+       }
+
+       return NULL;
+}
+
+static void
+intel_reference_shared_dpll(struct intel_shared_dpll *pll,
+                           struct intel_crtc_state *crtc_state)
+{
+       struct intel_shared_dpll_config *shared_dpll;
+       struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
+       enum intel_dpll_id i = pll->id;
+
+       shared_dpll = intel_atomic_get_shared_dpll_state(crtc_state->base.state);
+
+       if (shared_dpll[i].crtc_mask == 0)
+               shared_dpll[i].hw_state =
+                       crtc_state->dpll_hw_state;
+
+       crtc_state->shared_dpll = pll;
+       DRM_DEBUG_DRIVER("using %s for pipe %c\n", pll->name,
+                        pipe_name(crtc->pipe));
+
+       intel_shared_dpll_config_get(shared_dpll, pll, crtc);
+}
+
+void intel_shared_dpll_commit(struct drm_atomic_state *state)
+{
+       struct drm_i915_private *dev_priv = to_i915(state->dev);
+       struct intel_shared_dpll_config *shared_dpll;
+       struct intel_shared_dpll *pll;
+       enum intel_dpll_id i;
+
+       if (!to_intel_atomic_state(state)->dpll_set)
+               return;
+
+       shared_dpll = to_intel_atomic_state(state)->shared_dpll;
+       for (i = 0; i < dev_priv->num_shared_dpll; i++) {
+               pll = &dev_priv->shared_dplls[i];
+               pll->config = shared_dpll[i];
+       }
+}
+
+static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
+                                     struct intel_shared_dpll *pll,
+                                     struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       val = I915_READ(PCH_DPLL(pll->id));
+       hw_state->dpll = val;
+       hw_state->fp0 = I915_READ(PCH_FP0(pll->id));
+       hw_state->fp1 = I915_READ(PCH_FP1(pll->id));
+
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return val & DPLL_VCO_ENABLE;
+}
+
+static void ibx_pch_dpll_mode_set(struct drm_i915_private *dev_priv,
+                                 struct intel_shared_dpll *pll)
+{
+       I915_WRITE(PCH_FP0(pll->id), pll->config.hw_state.fp0);
+       I915_WRITE(PCH_FP1(pll->id), pll->config.hw_state.fp1);
+}
+
+static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
+{
+       u32 val;
+       bool enabled;
+
+       I915_STATE_WARN_ON(!(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv)));
+
+       val = I915_READ(PCH_DREF_CONTROL);
+       enabled = !!(val & (DREF_SSC_SOURCE_MASK | DREF_NONSPREAD_SOURCE_MASK |
+                           DREF_SUPERSPREAD_SOURCE_MASK));
+       I915_STATE_WARN(!enabled, "PCH refclk assertion failure, should be active but is disabled\n");
+}
+
+static void ibx_pch_dpll_enable(struct drm_i915_private *dev_priv,
+                               struct intel_shared_dpll *pll)
+{
+       /* PCH refclock must be enabled first */
+       ibx_assert_pch_refclk_enabled(dev_priv);
+
+       I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
+
+       /* Wait for the clocks to stabilize. */
+       POSTING_READ(PCH_DPLL(pll->id));
+       udelay(150);
+
+       /* The pixel multiplier can only be updated once the
+        * DPLL is enabled and the clocks are stable.
+        *
+        * So write it again.
+        */
+       I915_WRITE(PCH_DPLL(pll->id), pll->config.hw_state.dpll);
+       POSTING_READ(PCH_DPLL(pll->id));
+       udelay(200);
+}
+
+static void ibx_pch_dpll_disable(struct drm_i915_private *dev_priv,
+                                struct intel_shared_dpll *pll)
+{
+       struct drm_device *dev = dev_priv->dev;
+       struct intel_crtc *crtc;
+
+       /* Make sure no transcoder isn't still depending on us. */
+       for_each_intel_crtc(dev, crtc) {
+               if (crtc->config->shared_dpll == pll)
+                       assert_pch_transcoder_disabled(dev_priv, crtc->pipe);
+       }
+
+       I915_WRITE(PCH_DPLL(pll->id), 0);
+       POSTING_READ(PCH_DPLL(pll->id));
+       udelay(200);
+}
+
+static struct intel_shared_dpll *
+ibx_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
+            struct intel_encoder *encoder)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       struct intel_shared_dpll *pll;
+       enum intel_dpll_id i;
+
+       if (HAS_PCH_IBX(dev_priv)) {
+               /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
+               i = (enum intel_dpll_id) crtc->pipe;
+               pll = &dev_priv->shared_dplls[i];
+
+               DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
+                             crtc->base.base.id, pll->name);
+       } else {
+               pll = intel_find_shared_dpll(crtc, crtc_state,
+                                            DPLL_ID_PCH_PLL_A,
+                                            DPLL_ID_PCH_PLL_B);
+       }
+
+       /* reference the pll */
+       intel_reference_shared_dpll(pll, crtc_state);
+
+       return pll;
+}
+
+static const struct intel_shared_dpll_funcs ibx_pch_dpll_funcs = {
+       .mode_set = ibx_pch_dpll_mode_set,
+       .enable = ibx_pch_dpll_enable,
+       .disable = ibx_pch_dpll_disable,
+       .get_hw_state = ibx_pch_dpll_get_hw_state,
+};
+
+static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
+                              struct intel_shared_dpll *pll)
+{
+       I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
+       POSTING_READ(WRPLL_CTL(pll->id));
+       udelay(20);
+}
+
+static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
+                               struct intel_shared_dpll *pll)
+{
+       I915_WRITE(SPLL_CTL, pll->config.hw_state.spll);
+       POSTING_READ(SPLL_CTL);
+       udelay(20);
+}
+
+static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
+                                 struct intel_shared_dpll *pll)
+{
+       uint32_t val;
+
+       val = I915_READ(WRPLL_CTL(pll->id));
+       I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
+       POSTING_READ(WRPLL_CTL(pll->id));
+}
+
+static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
+                                struct intel_shared_dpll *pll)
+{
+       uint32_t val;
+
+       val = I915_READ(SPLL_CTL);
+       I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
+       POSTING_READ(SPLL_CTL);
+}
+
+static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
+                                      struct intel_shared_dpll *pll,
+                                      struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       val = I915_READ(WRPLL_CTL(pll->id));
+       hw_state->wrpll = val;
+
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return val & WRPLL_PLL_ENABLE;
+}
+
+static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
+                                     struct intel_shared_dpll *pll,
+                                     struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       val = I915_READ(SPLL_CTL);
+       hw_state->spll = val;
+
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return val & SPLL_PLL_ENABLE;
+}
+
+static uint32_t hsw_pll_to_ddi_pll_sel(struct intel_shared_dpll *pll)
+{
+       switch (pll->id) {
+       case DPLL_ID_WRPLL1:
+               return PORT_CLK_SEL_WRPLL1;
+       case DPLL_ID_WRPLL2:
+               return PORT_CLK_SEL_WRPLL2;
+       case DPLL_ID_SPLL:
+               return PORT_CLK_SEL_SPLL;
+       case DPLL_ID_LCPLL_810:
+               return PORT_CLK_SEL_LCPLL_810;
+       case DPLL_ID_LCPLL_1350:
+               return PORT_CLK_SEL_LCPLL_1350;
+       case DPLL_ID_LCPLL_2700:
+               return PORT_CLK_SEL_LCPLL_2700;
+       default:
+               return PORT_CLK_SEL_NONE;
+       }
+}
+
+#define LC_FREQ 2700
+#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
+
+#define P_MIN 2
+#define P_MAX 64
+#define P_INC 2
+
+/* Constraints for PLL good behavior */
+#define REF_MIN 48
+#define REF_MAX 400
+#define VCO_MIN 2400
+#define VCO_MAX 4800
+
+struct hsw_wrpll_rnp {
+       unsigned p, n2, r2;
+};
+
+static unsigned hsw_wrpll_get_budget_for_freq(int clock)
+{
+       unsigned budget;
+
+       switch (clock) {
+       case 25175000:
+       case 25200000:
+       case 27000000:
+       case 27027000:
+       case 37762500:
+       case 37800000:
+       case 40500000:
+       case 40541000:
+       case 54000000:
+       case 54054000:
+       case 59341000:
+       case 59400000:
+       case 72000000:
+       case 74176000:
+       case 74250000:
+       case 81000000:
+       case 81081000:
+       case 89012000:
+       case 89100000:
+       case 108000000:
+       case 108108000:
+       case 111264000:
+       case 111375000:
+       case 148352000:
+       case 148500000:
+       case 162000000:
+       case 162162000:
+       case 222525000:
+       case 222750000:
+       case 296703000:
+       case 297000000:
+               budget = 0;
+               break;
+       case 233500000:
+       case 245250000:
+       case 247750000:
+       case 253250000:
+       case 298000000:
+               budget = 1500;
+               break;
+       case 169128000:
+       case 169500000:
+       case 179500000:
+       case 202000000:
+               budget = 2000;
+               break;
+       case 256250000:
+       case 262500000:
+       case 270000000:
+       case 272500000:
+       case 273750000:
+       case 280750000:
+       case 281250000:
+       case 286000000:
+       case 291750000:
+               budget = 4000;
+               break;
+       case 267250000:
+       case 268500000:
+               budget = 5000;
+               break;
+       default:
+               budget = 1000;
+               break;
+       }
+
+       return budget;
+}
+
+static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
+                                unsigned r2, unsigned n2, unsigned p,
+                                struct hsw_wrpll_rnp *best)
+{
+       uint64_t a, b, c, d, diff, diff_best;
+
+       /* No best (r,n,p) yet */
+       if (best->p == 0) {
+               best->p = p;
+               best->n2 = n2;
+               best->r2 = r2;
+               return;
+       }
+
+       /*
+        * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
+        * freq2k.
+        *
+        * delta = 1e6 *
+        *         abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
+        *         freq2k;
+        *
+        * and we would like delta <= budget.
+        *
+        * If the discrepancy is above the PPM-based budget, always prefer to
+        * improve upon the previous solution.  However, if you're within the
+        * budget, try to maximize Ref * VCO, that is N / (P * R^2).
+        */
+       a = freq2k * budget * p * r2;
+       b = freq2k * budget * best->p * best->r2;
+       diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
+       diff_best = abs_diff(freq2k * best->p * best->r2,
+                            LC_FREQ_2K * best->n2);
+       c = 1000000 * diff;
+       d = 1000000 * diff_best;
+
+       if (a < c && b < d) {
+               /* If both are above the budget, pick the closer */
+               if (best->p * best->r2 * diff < p * r2 * diff_best) {
+                       best->p = p;
+                       best->n2 = n2;
+                       best->r2 = r2;
+               }
+       } else if (a >= c && b < d) {
+               /* If A is below the threshold but B is above it?  Update. */
+               best->p = p;
+               best->n2 = n2;
+               best->r2 = r2;
+       } else if (a >= c && b >= d) {
+               /* Both are below the limit, so pick the higher n2/(r2*r2) */
+               if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
+                       best->p = p;
+                       best->n2 = n2;
+                       best->r2 = r2;
+               }
+       }
+       /* Otherwise a < c && b >= d, do nothing */
+}
+
+static void
+hsw_ddi_calculate_wrpll(int clock /* in Hz */,
+                       unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
+{
+       uint64_t freq2k;
+       unsigned p, n2, r2;
+       struct hsw_wrpll_rnp best = { 0, 0, 0 };
+       unsigned budget;
+
+       freq2k = clock / 100;
+
+       budget = hsw_wrpll_get_budget_for_freq(clock);
+
+       /* Special case handling for 540 pixel clock: bypass WR PLL entirely
+        * and directly pass the LC PLL to it. */
+       if (freq2k == 5400000) {
+               *n2_out = 2;
+               *p_out = 1;
+               *r2_out = 2;
+               return;
+       }
+
+       /*
+        * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
+        * the WR PLL.
+        *
+        * We want R so that REF_MIN <= Ref <= REF_MAX.
+        * Injecting R2 = 2 * R gives:
+        *   REF_MAX * r2 > LC_FREQ * 2 and
+        *   REF_MIN * r2 < LC_FREQ * 2
+        *
+        * Which means the desired boundaries for r2 are:
+        *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
+        *
+        */
+       for (r2 = LC_FREQ * 2 / REF_MAX + 1;
+            r2 <= LC_FREQ * 2 / REF_MIN;
+            r2++) {
+
+               /*
+                * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
+                *
+                * Once again we want VCO_MIN <= VCO <= VCO_MAX.
+                * Injecting R2 = 2 * R and N2 = 2 * N, we get:
+                *   VCO_MAX * r2 > n2 * LC_FREQ and
+                *   VCO_MIN * r2 < n2 * LC_FREQ)
+                *
+                * Which means the desired boundaries for n2 are:
+                * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
+                */
+               for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
+                    n2 <= VCO_MAX * r2 / LC_FREQ;
+                    n2++) {
+
+                       for (p = P_MIN; p <= P_MAX; p += P_INC)
+                               hsw_wrpll_update_rnp(freq2k, budget,
+                                                    r2, n2, p, &best);
+               }
+       }
+
+       *n2_out = best.n2;
+       *p_out = best.p;
+       *r2_out = best.r2;
+}
+
+static struct intel_shared_dpll *
+hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
+            struct intel_encoder *encoder)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       struct intel_shared_dpll *pll;
+       int clock = crtc_state->port_clock;
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (encoder->type == INTEL_OUTPUT_HDMI) {
+               uint32_t val;
+               unsigned p, n2, r2;
+
+               hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
+
+               val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
+                     WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
+                     WRPLL_DIVIDER_POST(p);
+
+               crtc_state->dpll_hw_state.wrpll = val;
+
+               pll = intel_find_shared_dpll(crtc, crtc_state,
+                                            DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
+
+       } else if (encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
+                  encoder->type == INTEL_OUTPUT_DP_MST ||
+                  encoder->type == INTEL_OUTPUT_EDP) {
+               enum intel_dpll_id pll_id;
+
+               switch (clock / 2) {
+               case 81000:
+                       pll_id = DPLL_ID_LCPLL_810;
+                       break;
+               case 135000:
+                       pll_id = DPLL_ID_LCPLL_1350;
+                       break;
+               case 270000:
+                       pll_id = DPLL_ID_LCPLL_2700;
+                       break;
+               default:
+                       DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
+                       return NULL;
+               }
+
+               pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
+
+       } else if (encoder->type == INTEL_OUTPUT_ANALOG) {
+               if (WARN_ON(crtc_state->port_clock / 2 != 135000))
+                       return NULL;
+
+               crtc_state->dpll_hw_state.spll =
+                       SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC;
+
+               pll = intel_find_shared_dpll(crtc, crtc_state,
+                                            DPLL_ID_SPLL, DPLL_ID_SPLL);
+       } else {
+               return NULL;
+       }
+
+       if (!pll)
+               return NULL;
+
+       crtc_state->ddi_pll_sel = hsw_pll_to_ddi_pll_sel(pll);
+
+       intel_reference_shared_dpll(pll, crtc_state);
+
+       return pll;
+}
+
+
+static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
+       .enable = hsw_ddi_wrpll_enable,
+       .disable = hsw_ddi_wrpll_disable,
+       .get_hw_state = hsw_ddi_wrpll_get_hw_state,
+};
+
+static const struct intel_shared_dpll_funcs hsw_ddi_spll_funcs = {
+       .enable = hsw_ddi_spll_enable,
+       .disable = hsw_ddi_spll_disable,
+       .get_hw_state = hsw_ddi_spll_get_hw_state,
+};
+
+static void hsw_ddi_lcpll_enable(struct drm_i915_private *dev_priv,
+                                struct intel_shared_dpll *pll)
+{
+}
+
+static void hsw_ddi_lcpll_disable(struct drm_i915_private *dev_priv,
+                                 struct intel_shared_dpll *pll)
+{
+}
+
+static bool hsw_ddi_lcpll_get_hw_state(struct drm_i915_private *dev_priv,
+                                      struct intel_shared_dpll *pll,
+                                      struct intel_dpll_hw_state *hw_state)
+{
+       return true;
+}
+
+static const struct intel_shared_dpll_funcs hsw_ddi_lcpll_funcs = {
+       .enable = hsw_ddi_lcpll_enable,
+       .disable = hsw_ddi_lcpll_disable,
+       .get_hw_state = hsw_ddi_lcpll_get_hw_state,
+};
+
+struct skl_dpll_regs {
+       i915_reg_t ctl, cfgcr1, cfgcr2;
+};
+
+/* this array is indexed by the *shared* pll id */
+static const struct skl_dpll_regs skl_dpll_regs[4] = {
+       {
+               /* DPLL 0 */
+               .ctl = LCPLL1_CTL,
+               /* DPLL 0 doesn't support HDMI mode */
+       },
+       {
+               /* DPLL 1 */
+               .ctl = LCPLL2_CTL,
+               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
+               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
+       },
+       {
+               /* DPLL 2 */
+               .ctl = WRPLL_CTL(0),
+               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
+               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
+       },
+       {
+               /* DPLL 3 */
+               .ctl = WRPLL_CTL(1),
+               .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
+               .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
+       },
+};
+
+static void skl_ddi_pll_write_ctrl1(struct drm_i915_private *dev_priv,
+                                   struct intel_shared_dpll *pll)
+{
+       uint32_t val;
+
+       val = I915_READ(DPLL_CTRL1);
+
+       val &= ~(DPLL_CTRL1_HDMI_MODE(pll->id) | DPLL_CTRL1_SSC(pll->id) |
+                DPLL_CTRL1_LINK_RATE_MASK(pll->id));
+       val |= pll->config.hw_state.ctrl1 << (pll->id * 6);
+
+       I915_WRITE(DPLL_CTRL1, val);
+       POSTING_READ(DPLL_CTRL1);
+}
+
+static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
+                              struct intel_shared_dpll *pll)
+{
+       const struct skl_dpll_regs *regs = skl_dpll_regs;
+
+       skl_ddi_pll_write_ctrl1(dev_priv, pll);
+
+       I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
+       I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
+       POSTING_READ(regs[pll->id].cfgcr1);
+       POSTING_READ(regs[pll->id].cfgcr2);
+
+       /* the enable bit is always bit 31 */
+       I915_WRITE(regs[pll->id].ctl,
+                  I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
+
+       if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(pll->id), 5))
+               DRM_ERROR("DPLL %d not locked\n", pll->id);
+}
+
+static void skl_ddi_dpll0_enable(struct drm_i915_private *dev_priv,
+                                struct intel_shared_dpll *pll)
+{
+       skl_ddi_pll_write_ctrl1(dev_priv, pll);
+}
+
+static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
+                               struct intel_shared_dpll *pll)
+{
+       const struct skl_dpll_regs *regs = skl_dpll_regs;
+
+       /* the enable bit is always bit 31 */
+       I915_WRITE(regs[pll->id].ctl,
+                  I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
+       POSTING_READ(regs[pll->id].ctl);
+}
+
+static void skl_ddi_dpll0_disable(struct drm_i915_private *dev_priv,
+                                 struct intel_shared_dpll *pll)
+{
+}
+
+static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+                                    struct intel_shared_dpll *pll,
+                                    struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+       const struct skl_dpll_regs *regs = skl_dpll_regs;
+       bool ret;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       ret = false;
+
+       val = I915_READ(regs[pll->id].ctl);
+       if (!(val & LCPLL_PLL_ENABLE))
+               goto out;
+
+       val = I915_READ(DPLL_CTRL1);
+       hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
+
+       /* avoid reading back stale values if HDMI mode is not enabled */
+       if (val & DPLL_CTRL1_HDMI_MODE(pll->id)) {
+               hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
+               hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
+       }
+       ret = true;
+
+out:
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return ret;
+}
+
+static bool skl_ddi_dpll0_get_hw_state(struct drm_i915_private *dev_priv,
+                                      struct intel_shared_dpll *pll,
+                                      struct intel_dpll_hw_state *hw_state)
+{
+       uint32_t val;
+       const struct skl_dpll_regs *regs = skl_dpll_regs;
+       bool ret;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       ret = false;
+
+       /* DPLL0 is always enabled since it drives CDCLK */
+       val = I915_READ(regs[pll->id].ctl);
+       if (WARN_ON(!(val & LCPLL_PLL_ENABLE)))
+               goto out;
+
+       val = I915_READ(DPLL_CTRL1);
+       hw_state->ctrl1 = (val >> (pll->id * 6)) & 0x3f;
+
+       ret = true;
+
+out:
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return ret;
+}
+
+struct skl_wrpll_context {
+       uint64_t min_deviation;         /* current minimal deviation */
+       uint64_t central_freq;          /* chosen central freq */
+       uint64_t dco_freq;              /* chosen dco freq */
+       unsigned int p;                 /* chosen divider */
+};
+
+static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
+{
+       memset(ctx, 0, sizeof(*ctx));
+
+       ctx->min_deviation = U64_MAX;
+}
+
+/* DCO freq must be within +1%/-6%  of the DCO central freq */
+#define SKL_DCO_MAX_PDEVIATION 100
+#define SKL_DCO_MAX_NDEVIATION 600
+
+static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
+                                 uint64_t central_freq,
+                                 uint64_t dco_freq,
+                                 unsigned int divider)
+{
+       uint64_t deviation;
+
+       deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
+                             central_freq);
+
+       /* positive deviation */
+       if (dco_freq >= central_freq) {
+               if (deviation < SKL_DCO_MAX_PDEVIATION &&
+                   deviation < ctx->min_deviation) {
+                       ctx->min_deviation = deviation;
+                       ctx->central_freq = central_freq;
+                       ctx->dco_freq = dco_freq;
+                       ctx->p = divider;
+               }
+       /* negative deviation */
+       } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
+                  deviation < ctx->min_deviation) {
+               ctx->min_deviation = deviation;
+               ctx->central_freq = central_freq;
+               ctx->dco_freq = dco_freq;
+               ctx->p = divider;
+       }
+}
+
+static void skl_wrpll_get_multipliers(unsigned int p,
+                                     unsigned int *p0 /* out */,
+                                     unsigned int *p1 /* out */,
+                                     unsigned int *p2 /* out */)
+{
+       /* even dividers */
+       if (p % 2 == 0) {
+               unsigned int half = p / 2;
+
+               if (half == 1 || half == 2 || half == 3 || half == 5) {
+                       *p0 = 2;
+                       *p1 = 1;
+                       *p2 = half;
+               } else if (half % 2 == 0) {
+                       *p0 = 2;
+                       *p1 = half / 2;
+                       *p2 = 2;
+               } else if (half % 3 == 0) {
+                       *p0 = 3;
+                       *p1 = half / 3;
+                       *p2 = 2;
+               } else if (half % 7 == 0) {
+                       *p0 = 7;
+                       *p1 = half / 7;
+                       *p2 = 2;
+               }
+       } else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
+               *p0 = 3;
+               *p1 = 1;
+               *p2 = p / 3;
+       } else if (p == 5 || p == 7) {
+               *p0 = p;
+               *p1 = 1;
+               *p2 = 1;
+       } else if (p == 15) {
+               *p0 = 3;
+               *p1 = 1;
+               *p2 = 5;
+       } else if (p == 21) {
+               *p0 = 7;
+               *p1 = 1;
+               *p2 = 3;
+       } else if (p == 35) {
+               *p0 = 7;
+               *p1 = 1;
+               *p2 = 5;
+       }
+}
+
+struct skl_wrpll_params {
+       uint32_t        dco_fraction;
+       uint32_t        dco_integer;
+       uint32_t        qdiv_ratio;
+       uint32_t        qdiv_mode;
+       uint32_t        kdiv;
+       uint32_t        pdiv;
+       uint32_t        central_freq;
+};
+
+static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
+                                     uint64_t afe_clock,
+                                     uint64_t central_freq,
+                                     uint32_t p0, uint32_t p1, uint32_t p2)
+{
+       uint64_t dco_freq;
+
+       switch (central_freq) {
+       case 9600000000ULL:
+               params->central_freq = 0;
+               break;
+       case 9000000000ULL:
+               params->central_freq = 1;
+               break;
+       case 8400000000ULL:
+               params->central_freq = 3;
+       }
+
+       switch (p0) {
+       case 1:
+               params->pdiv = 0;
+               break;
+       case 2:
+               params->pdiv = 1;
+               break;
+       case 3:
+               params->pdiv = 2;
+               break;
+       case 7:
+               params->pdiv = 4;
+               break;
+       default:
+               WARN(1, "Incorrect PDiv\n");
+       }
+
+       switch (p2) {
+       case 5:
+               params->kdiv = 0;
+               break;
+       case 2:
+               params->kdiv = 1;
+               break;
+       case 3:
+               params->kdiv = 2;
+               break;
+       case 1:
+               params->kdiv = 3;
+               break;
+       default:
+               WARN(1, "Incorrect KDiv\n");
+       }
+
+       params->qdiv_ratio = p1;
+       params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
+
+       dco_freq = p0 * p1 * p2 * afe_clock;
+
+       /*
+        * Intermediate values are in Hz.
+        * Divide by MHz to match bsepc
+        */
+       params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
+       params->dco_fraction =
+               div_u64((div_u64(dco_freq, 24) -
+                        params->dco_integer * MHz(1)) * 0x8000, MHz(1));
+}
+
+static bool
+skl_ddi_calculate_wrpll(int clock /* in Hz */,
+                       struct skl_wrpll_params *wrpll_params)
+{
+       uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
+       uint64_t dco_central_freq[3] = {8400000000ULL,
+                                       9000000000ULL,
+                                       9600000000ULL};
+       static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
+                                            24, 28, 30, 32, 36, 40, 42, 44,
+                                            48, 52, 54, 56, 60, 64, 66, 68,
+                                            70, 72, 76, 78, 80, 84, 88, 90,
+                                            92, 96, 98 };
+       static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
+       static const struct {
+               const int *list;
+               int n_dividers;
+       } dividers[] = {
+               { even_dividers, ARRAY_SIZE(even_dividers) },
+               { odd_dividers, ARRAY_SIZE(odd_dividers) },
+       };
+       struct skl_wrpll_context ctx;
+       unsigned int dco, d, i;
+       unsigned int p0, p1, p2;
+
+       skl_wrpll_context_init(&ctx);
+
+       for (d = 0; d < ARRAY_SIZE(dividers); d++) {
+               for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
+                       for (i = 0; i < dividers[d].n_dividers; i++) {
+                               unsigned int p = dividers[d].list[i];
+                               uint64_t dco_freq = p * afe_clock;
+
+                               skl_wrpll_try_divider(&ctx,
+                                                     dco_central_freq[dco],
+                                                     dco_freq,
+                                                     p);
+                               /*
+                                * Skip the remaining dividers if we're sure to
+                                * have found the definitive divider, we can't
+                                * improve a 0 deviation.
+                                */
+                               if (ctx.min_deviation == 0)
+                                       goto skip_remaining_dividers;
+                       }
+               }
+
+skip_remaining_dividers:
+               /*
+                * If a solution is found with an even divider, prefer
+                * this one.
+                */
+               if (d == 0 && ctx.p)
+                       break;
+       }
+
+       if (!ctx.p) {
+               DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
+               return false;
+       }
+
+       /*
+        * gcc incorrectly analyses that these can be used without being
+        * initialized. To be fair, it's hard to guess.
+        */
+       p0 = p1 = p2 = 0;
+       skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
+       skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
+                                 p0, p1, p2);
+
+       return true;
+}
+
+static struct intel_shared_dpll *
+skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
+            struct intel_encoder *encoder)
+{
+       struct intel_shared_dpll *pll;
+       uint32_t ctrl1, cfgcr1, cfgcr2;
+       int clock = crtc_state->port_clock;
+
+       /*
+        * See comment in intel_dpll_hw_state to understand why we always use 0
+        * as the DPLL id in this function.
+        */
+
+       ctrl1 = DPLL_CTRL1_OVERRIDE(0);
+
+       if (encoder->type == INTEL_OUTPUT_HDMI) {
+               struct skl_wrpll_params wrpll_params = { 0, };
+
+               ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
+
+               if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
+                       return NULL;
+
+               cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
+                        DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
+                        wrpll_params.dco_integer;
+
+               cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
+                        DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
+                        DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
+                        DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
+                        wrpll_params.central_freq;
+       } else if (encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
+                  encoder->type == INTEL_OUTPUT_DP_MST ||
+                  encoder->type == INTEL_OUTPUT_EDP) {
+               switch (crtc_state->port_clock / 2) {
+               case 81000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
+                       break;
+               case 135000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
+                       break;
+               case 270000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
+                       break;
+               /* eDP 1.4 rates */
+               case 162000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
+                       break;
+               /* TBD: For DP link rates 2.16 GHz and 4.32 GHz, VCO is 8640 which
+               results in CDCLK change. Need to handle the change of CDCLK by
+               disabling pipes and re-enabling them */
+               case 108000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
+                       break;
+               case 216000:
+                       ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
+                       break;
+               }
+
+               cfgcr1 = cfgcr2 = 0;
+       } else {
+               return NULL;
+       }
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       crtc_state->dpll_hw_state.ctrl1 = ctrl1;
+       crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
+       crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
+
+       if (encoder->type == INTEL_OUTPUT_EDP)
+               pll = intel_find_shared_dpll(crtc, crtc_state,
+                                            DPLL_ID_SKL_DPLL0,
+                                            DPLL_ID_SKL_DPLL0);
+       else
+               pll = intel_find_shared_dpll(crtc, crtc_state,
+                                            DPLL_ID_SKL_DPLL1,
+                                            DPLL_ID_SKL_DPLL3);
+       if (!pll)
+               return NULL;
+
+       crtc_state->ddi_pll_sel = pll->id;
+
+       intel_reference_shared_dpll(pll, crtc_state);
+
+       return pll;
+}
+
+static const struct intel_shared_dpll_funcs skl_ddi_pll_funcs = {
+       .enable = skl_ddi_pll_enable,
+       .disable = skl_ddi_pll_disable,
+       .get_hw_state = skl_ddi_pll_get_hw_state,
+};
+
+static const struct intel_shared_dpll_funcs skl_ddi_dpll0_funcs = {
+       .enable = skl_ddi_dpll0_enable,
+       .disable = skl_ddi_dpll0_disable,
+       .get_hw_state = skl_ddi_dpll0_get_hw_state,
+};
+
+static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
+                               struct intel_shared_dpll *pll)
+{
+       uint32_t temp;
+       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
+
+       /* Non-SSC reference */
+       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
+       temp |= PORT_PLL_REF_SEL;
+       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
+
+       /* Disable 10 bit clock */
+       temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
+       temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
+       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
+
+       /* Write P1 & P2 */
+       temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
+       temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
+       temp |= pll->config.hw_state.ebb0;
+       I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
+
+       /* Write M2 integer */
+       temp = I915_READ(BXT_PORT_PLL(port, 0));
+       temp &= ~PORT_PLL_M2_MASK;
+       temp |= pll->config.hw_state.pll0;
+       I915_WRITE(BXT_PORT_PLL(port, 0), temp);
+
+       /* Write N */
+       temp = I915_READ(BXT_PORT_PLL(port, 1));
+       temp &= ~PORT_PLL_N_MASK;
+       temp |= pll->config.hw_state.pll1;
+       I915_WRITE(BXT_PORT_PLL(port, 1), temp);
+
+       /* Write M2 fraction */
+       temp = I915_READ(BXT_PORT_PLL(port, 2));
+       temp &= ~PORT_PLL_M2_FRAC_MASK;
+       temp |= pll->config.hw_state.pll2;
+       I915_WRITE(BXT_PORT_PLL(port, 2), temp);
+
+       /* Write M2 fraction enable */
+       temp = I915_READ(BXT_PORT_PLL(port, 3));
+       temp &= ~PORT_PLL_M2_FRAC_ENABLE;
+       temp |= pll->config.hw_state.pll3;
+       I915_WRITE(BXT_PORT_PLL(port, 3), temp);
+
+       /* Write coeff */
+       temp = I915_READ(BXT_PORT_PLL(port, 6));
+       temp &= ~PORT_PLL_PROP_COEFF_MASK;
+       temp &= ~PORT_PLL_INT_COEFF_MASK;
+       temp &= ~PORT_PLL_GAIN_CTL_MASK;
+       temp |= pll->config.hw_state.pll6;
+       I915_WRITE(BXT_PORT_PLL(port, 6), temp);
+
+       /* Write calibration val */
+       temp = I915_READ(BXT_PORT_PLL(port, 8));
+       temp &= ~PORT_PLL_TARGET_CNT_MASK;
+       temp |= pll->config.hw_state.pll8;
+       I915_WRITE(BXT_PORT_PLL(port, 8), temp);
+
+       temp = I915_READ(BXT_PORT_PLL(port, 9));
+       temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
+       temp |= pll->config.hw_state.pll9;
+       I915_WRITE(BXT_PORT_PLL(port, 9), temp);
+
+       temp = I915_READ(BXT_PORT_PLL(port, 10));
+       temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
+       temp &= ~PORT_PLL_DCO_AMP_MASK;
+       temp |= pll->config.hw_state.pll10;
+       I915_WRITE(BXT_PORT_PLL(port, 10), temp);
+
+       /* Recalibrate with new settings */
+       temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
+       temp |= PORT_PLL_RECALIBRATE;
+       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
+       temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
+       temp |= pll->config.hw_state.ebb4;
+       I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
+
+       /* Enable PLL */
+       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
+       temp |= PORT_PLL_ENABLE;
+       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
+       POSTING_READ(BXT_PORT_PLL_ENABLE(port));
+
+       if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
+                       PORT_PLL_LOCK), 200))
+               DRM_ERROR("PLL %d not locked\n", port);
+
+       /*
+        * While we write to the group register to program all lanes at once we
+        * can read only lane registers and we pick lanes 0/1 for that.
+        */
+       temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
+       temp &= ~LANE_STAGGER_MASK;
+       temp &= ~LANESTAGGER_STRAP_OVRD;
+       temp |= pll->config.hw_state.pcsdw12;
+       I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
+}
+
+static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
+                                       struct intel_shared_dpll *pll)
+{
+       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
+       uint32_t temp;
+
+       temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
+       temp &= ~PORT_PLL_ENABLE;
+       I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
+       POSTING_READ(BXT_PORT_PLL_ENABLE(port));
+}
+
+static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
+                                       struct intel_shared_dpll *pll,
+                                       struct intel_dpll_hw_state *hw_state)
+{
+       enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
+       uint32_t val;
+       bool ret;
+
+       if (!intel_display_power_get_if_enabled(dev_priv, POWER_DOMAIN_PLLS))
+               return false;
+
+       ret = false;
+
+       val = I915_READ(BXT_PORT_PLL_ENABLE(port));
+       if (!(val & PORT_PLL_ENABLE))
+               goto out;
+
+       hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
+       hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
+
+       hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port));
+       hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
+
+       hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
+       hw_state->pll0 &= PORT_PLL_M2_MASK;
+
+       hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
+       hw_state->pll1 &= PORT_PLL_N_MASK;
+
+       hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
+       hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
+
+       hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
+       hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
+
+       hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
+       hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
+                         PORT_PLL_INT_COEFF_MASK |
+                         PORT_PLL_GAIN_CTL_MASK;
+
+       hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
+       hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
+
+       hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9));
+       hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
+
+       hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10));
+       hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
+                          PORT_PLL_DCO_AMP_MASK;
+
+       /*
+        * While we write to the group register to program all lanes at once we
+        * can read only lane registers. We configure all lanes the same way, so
+        * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
+        */
+       hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
+       if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12)
+               DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
+                                hw_state->pcsdw12,
+                                I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
+       hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
+
+       ret = true;
+
+out:
+       intel_display_power_put(dev_priv, POWER_DOMAIN_PLLS);
+
+       return ret;
+}
+
+/* bxt clock parameters */
+struct bxt_clk_div {
+       int clock;
+       uint32_t p1;
+       uint32_t p2;
+       uint32_t m2_int;
+       uint32_t m2_frac;
+       bool m2_frac_en;
+       uint32_t n;
+};
+
+/* pre-calculated values for DP linkrates */
+static const struct bxt_clk_div bxt_dp_clk_val[] = {
+       {162000, 4, 2, 32, 1677722, 1, 1},
+       {270000, 4, 1, 27,       0, 0, 1},
+       {540000, 2, 1, 27,       0, 0, 1},
+       {216000, 3, 2, 32, 1677722, 1, 1},
+       {243000, 4, 1, 24, 1258291, 1, 1},
+       {324000, 4, 1, 32, 1677722, 1, 1},
+       {432000, 3, 1, 32, 1677722, 1, 1}
+};
+
+static struct intel_shared_dpll *
+bxt_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
+            struct intel_encoder *encoder)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       struct intel_shared_dpll *pll;
+       enum intel_dpll_id i;
+       struct intel_digital_port *intel_dig_port;
+       struct bxt_clk_div clk_div = {0};
+       int vco = 0;
+       uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
+       uint32_t lanestagger;
+       int clock = crtc_state->port_clock;
+
+       if (encoder->type == INTEL_OUTPUT_HDMI) {
+               intel_clock_t best_clock;
+
+               /* Calculate HDMI div */
+               /*
+                * FIXME: tie the following calculation into
+                * i9xx_crtc_compute_clock
+                */
+               if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
+                       DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
+                                        clock, pipe_name(crtc->pipe));
+                       return NULL;
+               }
+
+               clk_div.p1 = best_clock.p1;
+               clk_div.p2 = best_clock.p2;
+               WARN_ON(best_clock.m1 != 2);
+               clk_div.n = best_clock.n;
+               clk_div.m2_int = best_clock.m2 >> 22;
+               clk_div.m2_frac = best_clock.m2 & ((1 << 22) - 1);
+               clk_div.m2_frac_en = clk_div.m2_frac != 0;
+
+               vco = best_clock.vco;
+       } else if (encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
+                  encoder->type == INTEL_OUTPUT_EDP) {
+               int i;
+
+               clk_div = bxt_dp_clk_val[0];
+               for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
+                       if (bxt_dp_clk_val[i].clock == clock) {
+                               clk_div = bxt_dp_clk_val[i];
+                               break;
+                       }
+               }
+               vco = clock * 10 / 2 * clk_div.p1 * clk_div.p2;
+       }
+
+       if (vco >= 6200000 && vco <= 6700000) {
+               prop_coef = 4;
+               int_coef = 9;
+               gain_ctl = 3;
+               targ_cnt = 8;
+       } else if ((vco > 5400000 && vco < 6200000) ||
+                       (vco >= 4800000 && vco < 5400000)) {
+               prop_coef = 5;
+               int_coef = 11;
+               gain_ctl = 3;
+               targ_cnt = 9;
+       } else if (vco == 5400000) {
+               prop_coef = 3;
+               int_coef = 8;
+               gain_ctl = 1;
+               targ_cnt = 9;
+       } else {
+               DRM_ERROR("Invalid VCO\n");
+               return NULL;
+       }
+
+       memset(&crtc_state->dpll_hw_state, 0,
+              sizeof(crtc_state->dpll_hw_state));
+
+       if (clock > 270000)
+               lanestagger = 0x18;
+       else if (clock > 135000)
+               lanestagger = 0x0d;
+       else if (clock > 67000)
+               lanestagger = 0x07;
+       else if (clock > 33000)
+               lanestagger = 0x04;
+       else
+               lanestagger = 0x02;
+
+       crtc_state->dpll_hw_state.ebb0 =
+               PORT_PLL_P1(clk_div.p1) | PORT_PLL_P2(clk_div.p2);
+       crtc_state->dpll_hw_state.pll0 = clk_div.m2_int;
+       crtc_state->dpll_hw_state.pll1 = PORT_PLL_N(clk_div.n);
+       crtc_state->dpll_hw_state.pll2 = clk_div.m2_frac;
+
+       if (clk_div.m2_frac_en)
+               crtc_state->dpll_hw_state.pll3 =
+                       PORT_PLL_M2_FRAC_ENABLE;
+
+       crtc_state->dpll_hw_state.pll6 =
+               prop_coef | PORT_PLL_INT_COEFF(int_coef);
+       crtc_state->dpll_hw_state.pll6 |=
+               PORT_PLL_GAIN_CTL(gain_ctl);
+
+       crtc_state->dpll_hw_state.pll8 = targ_cnt;
+
+       crtc_state->dpll_hw_state.pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
+
+       crtc_state->dpll_hw_state.pll10 =
+               PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
+               | PORT_PLL_DCO_AMP_OVR_EN_H;
+
+       crtc_state->dpll_hw_state.ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
+
+       crtc_state->dpll_hw_state.pcsdw12 =
+               LANESTAGGER_STRAP_OVRD | lanestagger;
+
+       intel_dig_port = enc_to_dig_port(&encoder->base);
+
+       /* 1:1 mapping between ports and PLLs */
+       i = (enum intel_dpll_id) intel_dig_port->port;
+       pll = intel_get_shared_dpll_by_id(dev_priv, i);
+
+       DRM_DEBUG_KMS("CRTC:%d using pre-allocated %s\n",
+               crtc->base.base.id, pll->name);
+
+       intel_reference_shared_dpll(pll, crtc_state);
+
+       /* shared DPLL id 0 is DPLL A */
+       crtc_state->ddi_pll_sel = pll->id;
+
+       return pll;
+}
+
+static const struct intel_shared_dpll_funcs bxt_ddi_pll_funcs = {
+       .enable = bxt_ddi_pll_enable,
+       .disable = bxt_ddi_pll_disable,
+       .get_hw_state = bxt_ddi_pll_get_hw_state,
+};
+
+static void intel_ddi_pll_init(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       uint32_t val = I915_READ(LCPLL_CTL);
+
+       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
+               int cdclk_freq;
+
+               cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
+               dev_priv->skl_boot_cdclk = cdclk_freq;
+               if (skl_sanitize_cdclk(dev_priv))
+                       DRM_DEBUG_KMS("Sanitized cdclk programmed by pre-os\n");
+               if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
+                       DRM_ERROR("LCPLL1 is disabled\n");
+       } else if (!IS_BROXTON(dev_priv)) {
+               /*
+                * The LCPLL register should be turned on by the BIOS. For now
+                * let's just check its state and print errors in case
+                * something is wrong.  Don't even try to turn it on.
+                */
+
+               if (val & LCPLL_CD_SOURCE_FCLK)
+                       DRM_ERROR("CDCLK source is not LCPLL\n");
+
+               if (val & LCPLL_PLL_DISABLE)
+                       DRM_ERROR("LCPLL is disabled\n");
+       }
+}
+
+struct dpll_info {
+       const char *name;
+       const int id;
+       const struct intel_shared_dpll_funcs *funcs;
+       uint32_t flags;
+};
+
+struct intel_dpll_mgr {
+       const struct dpll_info *dpll_info;
+
+       struct intel_shared_dpll *(*get_dpll)(struct intel_crtc *crtc,
+                                             struct intel_crtc_state *crtc_state,
+                                             struct intel_encoder *encoder);
+};
+
+static const struct dpll_info pch_plls[] = {
+       { "PCH DPLL A", DPLL_ID_PCH_PLL_A, &ibx_pch_dpll_funcs, 0 },
+       { "PCH DPLL B", DPLL_ID_PCH_PLL_B, &ibx_pch_dpll_funcs, 0 },
+       { NULL, -1, NULL, 0 },
+};
+
+static const struct intel_dpll_mgr pch_pll_mgr = {
+       .dpll_info = pch_plls,
+       .get_dpll = ibx_get_dpll,
+};
+
+static const struct dpll_info hsw_plls[] = {
+       { "WRPLL 1",    DPLL_ID_WRPLL1,     &hsw_ddi_wrpll_funcs, 0 },
+       { "WRPLL 2",    DPLL_ID_WRPLL2,     &hsw_ddi_wrpll_funcs, 0 },
+       { "SPLL",       DPLL_ID_SPLL,       &hsw_ddi_spll_funcs,  0 },
+       { "LCPLL 810",  DPLL_ID_LCPLL_810,  &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
+       { "LCPLL 1350", DPLL_ID_LCPLL_1350, &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
+       { "LCPLL 2700", DPLL_ID_LCPLL_2700, &hsw_ddi_lcpll_funcs, INTEL_DPLL_ALWAYS_ON },
+       { NULL, -1, NULL, },
+};
+
+static const struct intel_dpll_mgr hsw_pll_mgr = {
+       .dpll_info = hsw_plls,
+       .get_dpll = hsw_get_dpll,
+};
+
+static const struct dpll_info skl_plls[] = {
+       { "DPLL 0", DPLL_ID_SKL_DPLL0, &skl_ddi_dpll0_funcs, INTEL_DPLL_ALWAYS_ON },
+       { "DPPL 1", DPLL_ID_SKL_DPLL1, &skl_ddi_pll_funcs,   0 },
+       { "DPPL 2", DPLL_ID_SKL_DPLL2, &skl_ddi_pll_funcs,   0 },
+       { "DPPL 3", DPLL_ID_SKL_DPLL3, &skl_ddi_pll_funcs,   0 },
+       { NULL, -1, NULL, },
+};
+
+static const struct intel_dpll_mgr skl_pll_mgr = {
+       .dpll_info = skl_plls,
+       .get_dpll = skl_get_dpll,
+};
+
+static const struct dpll_info bxt_plls[] = {
+       { "PORT PLL A", DPLL_ID_SKL_DPLL0, &bxt_ddi_pll_funcs, 0 },
+       { "PORT PLL B", DPLL_ID_SKL_DPLL1, &bxt_ddi_pll_funcs, 0 },
+       { "PORT PLL C", DPLL_ID_SKL_DPLL2, &bxt_ddi_pll_funcs, 0 },
+       { NULL, -1, NULL, },
+};
+
+static const struct intel_dpll_mgr bxt_pll_mgr = {
+       .dpll_info = bxt_plls,
+       .get_dpll = bxt_get_dpll,
+};
+
+void intel_shared_dpll_init(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       const struct intel_dpll_mgr *dpll_mgr = NULL;
+       const struct dpll_info *dpll_info;
+       int i;
+
+       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev))
+               dpll_mgr = &skl_pll_mgr;
+       else if (IS_BROXTON(dev))
+               dpll_mgr = &bxt_pll_mgr;
+       else if (HAS_DDI(dev))
+               dpll_mgr = &hsw_pll_mgr;
+       else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
+               dpll_mgr = &pch_pll_mgr;
+
+       if (!dpll_mgr) {
+               dev_priv->num_shared_dpll = 0;
+               return;
+       }
+
+       dpll_info = dpll_mgr->dpll_info;
+
+       for (i = 0; dpll_info[i].id >= 0; i++) {
+               WARN_ON(i != dpll_info[i].id);
+
+               dev_priv->shared_dplls[i].id = dpll_info[i].id;
+               dev_priv->shared_dplls[i].name = dpll_info[i].name;
+               dev_priv->shared_dplls[i].funcs = *dpll_info[i].funcs;
+               dev_priv->shared_dplls[i].flags = dpll_info[i].flags;
+       }
+
+       dev_priv->dpll_mgr = dpll_mgr;
+       dev_priv->num_shared_dpll = i;
+       mutex_init(&dev_priv->dpll_lock);
+
+       BUG_ON(dev_priv->num_shared_dpll > I915_NUM_PLLS);
+
+       /* FIXME: Move this to a more suitable place */
+       if (HAS_DDI(dev))
+               intel_ddi_pll_init(dev);
+}
+
+struct intel_shared_dpll *
+intel_get_shared_dpll(struct intel_crtc *crtc,
+                     struct intel_crtc_state *crtc_state,
+                     struct intel_encoder *encoder)
+{
+       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
+       const struct intel_dpll_mgr *dpll_mgr = dev_priv->dpll_mgr;
+
+       if (WARN_ON(!dpll_mgr))
+               return NULL;
+
+       return dpll_mgr->get_dpll(crtc, crtc_state, encoder);
+}
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.h b/drivers/gpu/drm/i915/intel_dpll_mgr.h
new file mode 100644 (file)
index 0000000..89c5ada
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * Copyright © 2012-2016 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 _INTEL_DPLL_MGR_H_
+#define _INTEL_DPLL_MGR_H_
+
+/*FIXME: Move this to a more appropriate place. */
+#define abs_diff(a, b) ({                      \
+       typeof(a) __a = (a);                    \
+       typeof(b) __b = (b);                    \
+       (void) (&__a == &__b);                  \
+       __a > __b ? (__a - __b) : (__b - __a); })
+
+struct drm_i915_private;
+struct intel_crtc;
+struct intel_crtc_state;
+struct intel_encoder;
+
+struct intel_shared_dpll;
+struct intel_dpll_mgr;
+
+enum intel_dpll_id {
+       DPLL_ID_PRIVATE = -1, /* non-shared dpll in use */
+       /* real shared dpll ids must be >= 0 */
+       DPLL_ID_PCH_PLL_A = 0,
+       DPLL_ID_PCH_PLL_B = 1,
+       /* hsw/bdw */
+       DPLL_ID_WRPLL1 = 0,
+       DPLL_ID_WRPLL2 = 1,
+       DPLL_ID_SPLL = 2,
+       DPLL_ID_LCPLL_810 = 3,
+       DPLL_ID_LCPLL_1350 = 4,
+       DPLL_ID_LCPLL_2700 = 5,
+
+       /* skl */
+       DPLL_ID_SKL_DPLL0 = 0,
+       DPLL_ID_SKL_DPLL1 = 1,
+       DPLL_ID_SKL_DPLL2 = 2,
+       DPLL_ID_SKL_DPLL3 = 3,
+};
+#define I915_NUM_PLLS 6
+
+/** Inform the state checker that the DPLL is kept enabled even if not
+ * in use by any crtc.
+ */
+#define INTEL_DPLL_ALWAYS_ON   (1 << 0)
+
+struct intel_dpll_hw_state {
+       /* i9xx, pch plls */
+       uint32_t dpll;
+       uint32_t dpll_md;
+       uint32_t fp0;
+       uint32_t fp1;
+
+       /* hsw, bdw */
+       uint32_t wrpll;
+       uint32_t spll;
+
+       /* skl */
+       /*
+        * DPLL_CTRL1 has 6 bits for each each this DPLL. We store those in
+        * lower part of ctrl1 and they get shifted into position when writing
+        * the register.  This allows us to easily compare the state to share
+        * the DPLL.
+        */
+       uint32_t ctrl1;
+       /* HDMI only, 0 when used for DP */
+       uint32_t cfgcr1, cfgcr2;
+
+       /* bxt */
+       uint32_t ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10,
+                pcsdw12;
+};
+
+struct intel_shared_dpll_config {
+       unsigned crtc_mask; /* mask of CRTCs sharing this PLL */
+       struct intel_dpll_hw_state hw_state;
+};
+
+struct intel_shared_dpll_funcs {
+       /* The mode_set hook is optional and should be used together with the
+        * intel_prepare_shared_dpll function. */
+       void (*mode_set)(struct drm_i915_private *dev_priv,
+                        struct intel_shared_dpll *pll);
+       void (*enable)(struct drm_i915_private *dev_priv,
+                      struct intel_shared_dpll *pll);
+       void (*disable)(struct drm_i915_private *dev_priv,
+                       struct intel_shared_dpll *pll);
+       bool (*get_hw_state)(struct drm_i915_private *dev_priv,
+                            struct intel_shared_dpll *pll,
+                            struct intel_dpll_hw_state *hw_state);
+};
+
+struct intel_shared_dpll {
+       struct intel_shared_dpll_config config;
+
+       unsigned active_mask; /* mask of active CRTCs (i.e. DPMS on) */
+       bool on; /* is the PLL actually active? Disabled during modeset */
+       const char *name;
+       /* should match the index in the dev_priv->shared_dplls array */
+       enum intel_dpll_id id;
+
+       struct intel_shared_dpll_funcs funcs;
+
+       uint32_t flags;
+};
+
+#define SKL_DPLL0 0
+#define SKL_DPLL1 1
+#define SKL_DPLL2 2
+#define SKL_DPLL3 3
+
+/* shared dpll functions */
+struct intel_shared_dpll *
+intel_get_shared_dpll_by_id(struct drm_i915_private *dev_priv,
+                           enum intel_dpll_id id);
+enum intel_dpll_id
+intel_get_shared_dpll_id(struct drm_i915_private *dev_priv,
+                        struct intel_shared_dpll *pll);
+void
+intel_shared_dpll_config_get(struct intel_shared_dpll_config *config,
+                            struct intel_shared_dpll *pll,
+                            struct intel_crtc *crtc);
+void
+intel_shared_dpll_config_put(struct intel_shared_dpll_config *config,
+                            struct intel_shared_dpll *pll,
+                            struct intel_crtc *crtc);
+void assert_shared_dpll(struct drm_i915_private *dev_priv,
+                       struct intel_shared_dpll *pll,
+                       bool state);
+#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
+#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
+struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
+                                               struct intel_crtc_state *state,
+                                               struct intel_encoder *encoder);
+void intel_prepare_shared_dpll(struct intel_crtc *crtc);
+void intel_enable_shared_dpll(struct intel_crtc *crtc);
+void intel_disable_shared_dpll(struct intel_crtc *crtc);
+void intel_shared_dpll_commit(struct drm_atomic_state *state);
+void intel_shared_dpll_init(struct drm_device *dev);
+
+
+#endif /* _INTEL_DPLL_MGR_H_ */
index 9d0770c23fdece738575cc70a372353b7ea6284e..5da29a02b9e34360f1e8cffcb8d219f49c5a5947 100644 (file)
  * contexts. Note that it's important that we check the condition again after
  * having timed out, since the timeout could be due to preemption or similar and
  * we've never had a chance to check the condition before the timeout.
+ *
+ * TODO: When modesetting has fully transitioned to atomic, the below
+ * drm_can_sleep() can be removed and in_atomic()/!in_atomic() asserts
+ * added.
  */
-#define _wait_for(COND, MS, W) ({ \
-       unsigned long timeout__ = jiffies + msecs_to_jiffies(MS) + 1;   \
+#define _wait_for(COND, US, W) ({ \
+       unsigned long timeout__ = jiffies + usecs_to_jiffies(US) + 1;   \
        int ret__ = 0;                                                  \
        while (!(COND)) {                                               \
                if (time_after(jiffies, timeout__)) {                   \
@@ -55,7 +59,7 @@
                        break;                                          \
                }                                                       \
                if ((W) && drm_can_sleep()) {                           \
-                       usleep_range((W)*1000, (W)*2000);               \
+                       usleep_range((W), (W)*2);                       \
                } else {                                                \
                        cpu_relax();                                    \
                }                                                       \
        ret__;                                                          \
 })
 
-#define wait_for(COND, MS) _wait_for(COND, MS, 1)
-#define wait_for_atomic(COND, MS) _wait_for(COND, MS, 0)
-#define wait_for_atomic_us(COND, US) _wait_for((COND), \
-                                              DIV_ROUND_UP((US), 1000), 0)
+#define wait_for(COND, MS)             _wait_for((COND), (MS) * 1000, 1000)
+#define wait_for_us(COND, US)          _wait_for((COND), (US), 1)
+
+/* If CONFIG_PREEMPT_COUNT is disabled, in_atomic() always reports false. */
+#if defined(CONFIG_DRM_I915_DEBUG) && defined(CONFIG_PREEMPT_COUNT)
+# define _WAIT_FOR_ATOMIC_CHECK WARN_ON_ONCE(!in_atomic())
+#else
+# define _WAIT_FOR_ATOMIC_CHECK do { } while (0)
+#endif
+
+#define _wait_for_atomic(COND, US) ({ \
+       unsigned long end__; \
+       int ret__ = 0; \
+       _WAIT_FOR_ATOMIC_CHECK; \
+       BUILD_BUG_ON((US) > 50000); \
+       end__ = (local_clock() >> 10) + (US) + 1; \
+       while (!(COND)) { \
+               if (time_after((unsigned long)(local_clock() >> 10), end__)) { \
+                       /* Unlike the regular wait_for(), this atomic variant \
+                        * cannot be preempted (and we'll just ignore the issue\
+                        * of irq interruptions) and so we know that no time \
+                        * has passed since the last check of COND and can \
+                        * immediately report the timeout. \
+                        */ \
+                       ret__ = -ETIMEDOUT; \
+                       break; \
+               } \
+               cpu_relax(); \
+       } \
+       ret__; \
+})
+
+#define wait_for_atomic(COND, MS)      _wait_for_atomic((COND), (MS) * 1000)
+#define wait_for_atomic_us(COND, US)   _wait_for_atomic((COND), (US))
 
 #define KHz(x) (1000 * (x))
 #define MHz(x) KHz(1000 * (x))
@@ -118,6 +152,7 @@ enum intel_output_type {
 struct intel_framebuffer {
        struct drm_framebuffer base;
        struct drm_i915_gem_object *obj;
+       struct intel_rotation_info rot_info;
 };
 
 struct intel_fbdev {
@@ -260,6 +295,12 @@ struct intel_atomic_state {
 
        struct intel_shared_dpll_config shared_dpll[I915_NUM_PLLS];
        struct intel_wm_config wm_config;
+
+       /*
+        * Current watermarks can't be trusted during hardware readout, so
+        * don't bother calculating intermediate watermarks.
+        */
+       bool skip_intermediate_wm;
 };
 
 struct intel_plane_state {
@@ -349,6 +390,7 @@ struct intel_crtc_scaler_state {
 
 struct intel_pipe_wm {
        struct intel_wm_level wm[5];
+       struct intel_wm_level raw_wm[5];
        uint32_t linetime;
        bool fbc_wm_enabled;
        bool pipe_enabled;
@@ -376,9 +418,10 @@ struct intel_crtc_state {
 #define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS      (1<<0) /* unreliable sync mode.flags */
        unsigned long quirks;
 
+       unsigned fb_bits; /* framebuffers to flip */
        bool update_pipe; /* can a fast modeset be performed? */
        bool disable_cxsr;
-       bool wm_changed; /* watermarks are updated */
+       bool update_wm_pre, update_wm_post; /* watermarks are updated */
        bool fb_changed; /* fb on any of the planes is changed */
 
        /* Pipe source size (ie. panel fitter input size)
@@ -394,7 +437,8 @@ struct intel_crtc_state {
        bool has_infoframe;
 
        /* CPU Transcoder for the pipe. Currently this can only differ from the
-        * pipe on Haswell (where we have a special eDP transcoder). */
+        * pipe on Haswell and later (where we have a special eDP transcoder)
+        * and Broxton (where we have special DSI transcoders). */
        enum transcoder cpu_transcoder;
 
        /*
@@ -441,8 +485,8 @@ struct intel_crtc_state {
         * haswell. */
        struct dpll dpll;
 
-       /* Selected dpll when shared or DPLL_ID_PRIVATE. */
-       enum intel_dpll_id shared_dpll;
+       /* Selected dpll when shared or NULL. */
+       struct intel_shared_dpll *shared_dpll;
 
        /*
         * - PORT_CLK_SEL for DDI ports on HSW/BDW.
@@ -453,6 +497,11 @@ struct intel_crtc_state {
        /* Actual register state of the dpll, for shared dpll cross-checking. */
        struct intel_dpll_hw_state dpll_hw_state;
 
+       /* DSI PLL registers */
+       struct {
+               u32 ctrl, div;
+       } dsi_pll;
+
        int pipe_bpp;
        struct intel_link_m_n dp_m_n;
 
@@ -510,14 +559,33 @@ struct intel_crtc_state {
 
        struct {
                /*
-                * optimal watermarks, programmed post-vblank when this state
-                * is committed
+                * Optimal watermarks, programmed post-vblank when this state
+                * is committed.
                 */
                union {
                        struct intel_pipe_wm ilk;
                        struct skl_pipe_wm skl;
                } optimal;
+
+               /*
+                * Intermediate watermarks; these can be programmed immediately
+                * since they satisfy both the current configuration we're
+                * switching away from and the new configuration we're switching
+                * to.
+                */
+               struct intel_pipe_wm intermediate;
+
+               /*
+                * Platforms with two-step watermark programming will need to
+                * update watermark programming post-vblank to switch from the
+                * safe intermediate watermarks to the optimal final
+                * watermarks.
+                */
+               bool need_postvbl_update;
        } wm;
+
+       /* Gamma mode programmed on the pipe */
+       uint32_t gamma_mode;
 };
 
 struct vlv_wm_state {
@@ -537,23 +605,6 @@ struct intel_mmio_flip {
        unsigned int rotation;
 };
 
-/*
- * Tracking of operations that need to be performed at the beginning/end of an
- * atomic commit, outside the atomic section where interrupts are disabled.
- * These are generally operations that grab mutexes or might otherwise sleep
- * and thus can't be run with interrupts disabled.
- */
-struct intel_crtc_atomic_commit {
-       /* Sleepable operations to perform before commit */
-
-       /* Sleepable operations to perform after commit */
-       unsigned fb_bits;
-       bool post_enable_primary;
-
-       /* Sleepable operations to perform before and after commit */
-       bool update_fbc;
-};
-
 struct intel_crtc {
        struct drm_crtc base;
        enum pipe pipe;
@@ -600,6 +651,7 @@ struct intel_crtc {
                        struct intel_pipe_wm ilk;
                        struct skl_pipe_wm skl;
                } active;
+
                /* allow CxSR on this pipe */
                bool cxsr_allowed;
        } wm;
@@ -613,8 +665,6 @@ struct intel_crtc {
                int scanline_start;
        } debug;
 
-       struct intel_crtc_atomic_commit atomic;
-
        /* scalers available on this crtc */
        int num_scalers;
 
@@ -751,7 +801,9 @@ struct intel_dp {
        uint32_t DP;
        int link_rate;
        uint8_t lane_count;
+       uint8_t sink_count;
        bool has_audio;
+       bool detect_done;
        enum hdmi_force_audio force_audio;
        bool limited_color_range;
        bool color_range_auto;
@@ -831,7 +883,7 @@ struct intel_dp_mst_encoder {
        struct intel_encoder base;
        enum pipe pipe;
        struct intel_digital_port *primary;
-       void *port; /* store this opaque as its illegal to dereference it */
+       struct intel_connector *connector;
 };
 
 static inline enum dpio_channel
@@ -1007,7 +1059,6 @@ void hsw_fdi_link_train(struct drm_crtc *crtc);
 void intel_ddi_init(struct drm_device *dev, enum port port);
 enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder);
 bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
-void intel_ddi_pll_init(struct drm_device *dev);
 void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc);
 void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
                                       enum transcoder cpu_transcoder);
@@ -1049,17 +1100,19 @@ u32 intel_fb_stride_alignment(const struct drm_i915_private *dev_priv,
                              uint64_t fb_modifier, uint32_t pixel_format);
 
 /* intel_audio.c */
-void intel_init_audio(struct drm_device *dev);
+void intel_init_audio_hooks(struct drm_i915_private *dev_priv);
 void intel_audio_codec_enable(struct intel_encoder *encoder);
 void intel_audio_codec_disable(struct intel_encoder *encoder);
 void i915_audio_component_init(struct drm_i915_private *dev_priv);
 void i915_audio_component_cleanup(struct drm_i915_private *dev_priv);
 
 /* intel_display.c */
+int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
+                     const char *name, u32 reg, int ref_freq);
 extern const struct drm_plane_funcs intel_plane_funcs;
+void intel_init_display_hooks(struct drm_i915_private *dev_priv);
+unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info);
 bool intel_has_pending_fb_unpin(struct drm_device *dev);
-int intel_pch_rawclk(struct drm_device *dev);
-int intel_hrawclk(struct drm_device *dev);
 void intel_mark_busy(struct drm_device *dev);
 void intel_mark_idle(struct drm_device *dev);
 void intel_crtc_restore_mode(struct drm_crtc *crtc);
@@ -1104,9 +1157,8 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
 void intel_release_load_detect_pipe(struct drm_connector *connector,
                                    struct intel_load_detect_pipe *old,
                                    struct drm_modeset_acquire_ctx *ctx);
-int intel_pin_and_fence_fb_obj(struct drm_plane *plane,
-                              struct drm_framebuffer *fb,
-                              const struct drm_plane_state *plane_state);
+int intel_pin_and_fence_fb_obj(struct drm_framebuffer *fb,
+                              unsigned int rotation);
 struct drm_framebuffer *
 __intel_framebuffer_create(struct drm_device *dev,
                           struct drm_mode_fb_cmd2 *mode_cmd,
@@ -1142,19 +1194,13 @@ intel_rotation_90_or_270(unsigned int rotation)
 void intel_create_rotation_property(struct drm_device *dev,
                                        struct intel_plane *plane);
 
-/* shared dpll functions */
-struct intel_shared_dpll *intel_crtc_to_shared_dpll(struct intel_crtc *crtc);
-void assert_shared_dpll(struct drm_i915_private *dev_priv,
-                       struct intel_shared_dpll *pll,
-                       bool state);
-#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
-#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
-struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
-                                               struct intel_crtc_state *state);
+void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
+                                   enum pipe pipe);
 
 int vlv_force_pll_on(struct drm_device *dev, enum pipe pipe,
                     const struct dpll *dpll);
 void vlv_force_pll_off(struct drm_device *dev, enum pipe pipe);
+int lpt_get_iclkip(struct drm_i915_private *dev_priv);
 
 /* modesetting asserts */
 void assert_panel_unlocked(struct drm_i915_private *dev_priv,
@@ -1163,6 +1209,9 @@ void assert_pll(struct drm_i915_private *dev_priv,
                enum pipe pipe, bool state);
 #define assert_pll_enabled(d, p) assert_pll(d, p, true)
 #define assert_pll_disabled(d, p) assert_pll(d, p, false)
+void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state);
+#define assert_dsi_pll_enabled(d) assert_dsi_pll(d, true)
+#define assert_dsi_pll_disabled(d) assert_dsi_pll(d, false)
 void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
                       enum pipe pipe, bool state);
 #define assert_fdi_rx_pll_enabled(d, p) assert_fdi_rx_pll(d, p, true)
@@ -1170,21 +1219,24 @@ void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
 void assert_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, bool state);
 #define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
 #define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
-u32 intel_compute_tile_offset(struct drm_i915_private *dev_priv,
-                             int *x, int *y,
-                             uint64_t fb_modifier,
-                             unsigned int cpp,
-                             unsigned int pitch);
+u32 intel_compute_tile_offset(int *x, int *y,
+                             const struct drm_framebuffer *fb, int plane,
+                             unsigned int pitch,
+                             unsigned int rotation);
 void intel_prepare_reset(struct drm_device *dev);
 void intel_finish_reset(struct drm_device *dev);
 void hsw_enable_pc8(struct drm_i915_private *dev_priv);
 void hsw_disable_pc8(struct drm_i915_private *dev_priv);
-void broxton_init_cdclk(struct drm_device *dev);
-void broxton_uninit_cdclk(struct drm_device *dev);
-void broxton_ddi_phy_init(struct drm_device *dev);
-void broxton_ddi_phy_uninit(struct drm_device *dev);
+void broxton_init_cdclk(struct drm_i915_private *dev_priv);
+void broxton_uninit_cdclk(struct drm_i915_private *dev_priv);
+bool broxton_cdclk_verify_state(struct drm_i915_private *dev_priv);
+void broxton_ddi_phy_init(struct drm_i915_private *dev_priv);
+void broxton_ddi_phy_uninit(struct drm_i915_private *dev_priv);
+void broxton_ddi_phy_verify_state(struct drm_i915_private *dev_priv);
+void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv);
 void bxt_enable_dc9(struct drm_i915_private *dev_priv);
 void bxt_disable_dc9(struct drm_i915_private *dev_priv);
+void gen9_enable_dc5(struct drm_i915_private *dev_priv);
 void skl_init_cdclk(struct drm_i915_private *dev_priv);
 int skl_sanitize_cdclk(struct drm_i915_private *dev_priv);
 void skl_uninit_cdclk(struct drm_i915_private *dev_priv);
@@ -1194,9 +1246,6 @@ void intel_dp_get_m_n(struct intel_crtc *crtc,
                      struct intel_crtc_state *pipe_config);
 void intel_dp_set_m_n(struct intel_crtc *crtc, enum link_m_n_set m_n);
 int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n);
-void
-ironlake_check_encoder_dotclock(const struct intel_crtc_state *pipe_config,
-                               int dotclock);
 bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state, int target_clock,
                        intel_clock_t *best_clock);
 int chv_calc_dpll_params(int refclk, intel_clock_t *pll_clock);
@@ -1224,8 +1273,10 @@ u32 skl_plane_ctl_rotation(unsigned int rotation);
 
 /* intel_csr.c */
 void intel_csr_ucode_init(struct drm_i915_private *);
-bool intel_csr_load_program(struct drm_i915_private *);
+void intel_csr_load_program(struct drm_i915_private *);
 void intel_csr_ucode_fini(struct drm_i915_private *);
+void intel_csr_ucode_suspend(struct drm_i915_private *);
+void intel_csr_ucode_resume(struct drm_i915_private *);
 
 /* intel_dp.c */
 void intel_dp_init(struct drm_device *dev, i915_reg_t output_reg, enum port port);
@@ -1266,7 +1317,6 @@ void intel_edp_drrs_invalidate(struct drm_device *dev,
 void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits);
 bool intel_digital_port_connected(struct drm_i915_private *dev_priv,
                                         struct intel_digital_port *port);
-void hsw_dp_set_ddi_pll_sel(struct intel_crtc_state *pipe_config);
 
 void
 intel_dp_program_link_training_pattern(struct intel_dp *intel_dp,
@@ -1423,8 +1473,8 @@ int intel_power_domains_init(struct drm_i915_private *);
 void intel_power_domains_fini(struct drm_i915_private *);
 void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume);
 void intel_power_domains_suspend(struct drm_i915_private *dev_priv);
-void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv);
-void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv);
+void bxt_display_core_init(struct drm_i915_private *dev_priv, bool resume);
+void bxt_display_core_uninit(struct drm_i915_private *dev_priv);
 void intel_runtime_pm_enable(struct drm_i915_private *dev_priv);
 const char *
 intel_display_power_domain_str(enum intel_display_power_domain domain);
@@ -1541,6 +1591,7 @@ void intel_suspend_hw(struct drm_device *dev);
 int ilk_wm_max_level(const struct drm_device *dev);
 void intel_update_watermarks(struct drm_crtc *crtc);
 void intel_init_pm(struct drm_device *dev);
+void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv);
 void intel_pm_setup(struct drm_device *dev);
 void intel_gpu_ips_init(struct drm_i915_private *dev_priv);
 void intel_gpu_ips_teardown(void);
@@ -1565,6 +1616,7 @@ void skl_wm_get_hw_state(struct drm_device *dev);
 void skl_ddb_get_hw_state(struct drm_i915_private *dev_priv,
                          struct skl_ddb_allocation *ddb /* out */);
 uint32_t ilk_pipe_pixel_rate(const struct intel_crtc_state *pipe_config);
+bool ilk_disable_lp_wm(struct drm_device *dev);
 int sanitize_rc6_option(const struct drm_device *dev, int enable_rc6);
 
 /* intel_sdvo.c */
@@ -1606,6 +1658,18 @@ intel_atomic_get_crtc_state(struct drm_atomic_state *state,
 
        return to_intel_crtc_state(crtc_state);
 }
+
+static inline struct intel_plane_state *
+intel_atomic_get_existing_plane_state(struct drm_atomic_state *state,
+                                     struct intel_plane *plane)
+{
+       struct drm_plane_state *plane_state;
+
+       plane_state = drm_atomic_get_existing_plane_state(state, &plane->base);
+
+       return to_intel_plane_state(plane_state);
+}
+
 int intel_atomic_setup_scalers(struct drm_device *dev,
        struct intel_crtc *intel_crtc,
        struct intel_crtc_state *crtc_state);
@@ -1617,4 +1681,10 @@ void intel_plane_destroy_state(struct drm_plane *plane,
                               struct drm_plane_state *state);
 extern const struct drm_plane_helper_funcs intel_plane_helper_funcs;
 
+/* intel_color.c */
+void intel_color_init(struct drm_crtc *crtc);
+int intel_color_check(struct drm_crtc *crtc, struct drm_crtc_state *state);
+void intel_color_set_csc(struct drm_crtc_state *crtc_state);
+void intel_color_load_luts(struct drm_crtc_state *crtc_state);
+
 #endif /* __INTEL_DRV_H__ */
index 01b8e9f4c2726ecd242005643f4e80de687afaee..2b22bb9bb86f01841be78dabce7a3b18b86fb7f3 100644 (file)
@@ -46,6 +46,24 @@ static const struct {
        },
 };
 
+enum mipi_dsi_pixel_format pixel_format_from_register_bits(u32 fmt)
+{
+       /* It just so happens the VBT matches register contents. */
+       switch (fmt) {
+       case VID_MODE_FORMAT_RGB888:
+               return MIPI_DSI_FMT_RGB888;
+       case VID_MODE_FORMAT_RGB666:
+               return MIPI_DSI_FMT_RGB666;
+       case VID_MODE_FORMAT_RGB666_PACKED:
+               return MIPI_DSI_FMT_RGB666_PACKED;
+       case VID_MODE_FORMAT_RGB565:
+               return MIPI_DSI_FMT_RGB565;
+       default:
+               MISSING_CASE(fmt);
+               return MIPI_DSI_FMT_RGB666;
+       }
+}
+
 static void wait_for_dsi_fifo_empty(struct intel_dsi *intel_dsi, enum port port)
 {
        struct drm_encoder *encoder = &intel_dsi->base.base;
@@ -268,22 +286,47 @@ static inline bool is_cmd_mode(struct intel_dsi *intel_dsi)
 static bool intel_dsi_compute_config(struct intel_encoder *encoder,
                                     struct intel_crtc_state *pipe_config)
 {
+       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
        struct intel_dsi *intel_dsi = container_of(encoder, struct intel_dsi,
                                                   base);
        struct intel_connector *intel_connector = intel_dsi->attached_connector;
-       struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
+       struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
+       const struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
        struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
+       int ret;
 
        DRM_DEBUG_KMS("\n");
 
        pipe_config->has_dsi_encoder = true;
 
-       if (fixed_mode)
+       if (fixed_mode) {
                intel_fixed_panel_mode(fixed_mode, adjusted_mode);
 
+               if (HAS_GMCH_DISPLAY(dev_priv))
+                       intel_gmch_panel_fitting(crtc, pipe_config,
+                                                intel_connector->panel.fitting_mode);
+               else
+                       intel_pch_panel_fitting(crtc, pipe_config,
+                                               intel_connector->panel.fitting_mode);
+       }
+
        /* DSI uses short packets for sync events, so clear mode flags for DSI */
        adjusted_mode->flags = 0;
 
+       if (IS_BROXTON(dev_priv)) {
+               /* Dual link goes to DSI transcoder A. */
+               if (intel_dsi->ports == BIT(PORT_C))
+                       pipe_config->cpu_transcoder = TRANSCODER_DSI_C;
+               else
+                       pipe_config->cpu_transcoder = TRANSCODER_DSI_A;
+       }
+
+       ret = intel_compute_dsi_pll(encoder, pipe_config);
+       if (ret)
+               return false;
+
+       pipe_config->clock_set = true;
+
        return true;
 }
 
@@ -403,7 +446,7 @@ static void intel_dsi_port_enable(struct intel_encoder *encoder)
                temp &= ~LANE_CONFIGURATION_MASK;
                temp &= ~DUAL_LINK_MODE_MASK;
 
-               if (intel_dsi->ports == ((1 << PORT_A) | (1 << PORT_C))) {
+               if (intel_dsi->ports == (BIT(PORT_A) | BIT(PORT_C))) {
                        temp |= (intel_dsi->dual_link - 1)
                                                << DUAL_LINK_MODE_SHIFT;
                        temp |= intel_crtc->pipe ?
@@ -471,14 +514,19 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        struct drm_device *dev = encoder->base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
-       struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
-       enum pipe pipe = intel_crtc->pipe;
+       struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
        enum port port;
        u32 tmp;
 
        DRM_DEBUG_KMS("\n");
 
-       intel_enable_dsi_pll(encoder);
+       /*
+        * The BIOS may leave the PLL in a wonky state where it doesn't
+        * lock. It needs to be fully powered down to fix it.
+        */
+       intel_disable_dsi_pll(encoder);
+       intel_enable_dsi_pll(encoder, crtc->config);
+
        intel_dsi_prepare(encoder);
 
        /* Panel Enable over CRC PMIC */
@@ -488,19 +536,7 @@ static void intel_dsi_pre_enable(struct intel_encoder *encoder)
        msleep(intel_dsi->panel_on_delay);
 
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
-               /*
-                * Disable DPOunit clock gating, can stall pipe
-                * and we need DPLL REFA always enabled
-                */
-               tmp = I915_READ(DPLL(pipe));
-               tmp |= DPLL_REF_CLK_ENABLE_VLV;
-               I915_WRITE(DPLL(pipe), tmp);
-
-               /* update the hw state for DPLL */
-               intel_crtc->config->dpll_hw_state.dpll =
-                               DPLL_INTEGRATED_REF_CLK_VLV |
-                                       DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
-
+               /* Disable DPOunit clock gating, can stall pipe */
                tmp = I915_READ(DSPCLK_GATE_D);
                tmp |= DPOUNIT_CLOCK_GATE_DISABLE;
                I915_WRITE(DSPCLK_GATE_D, tmp);
@@ -652,11 +688,16 @@ static void intel_dsi_post_disable(struct intel_encoder *encoder)
        drm_panel_unprepare(intel_dsi->panel);
 
        msleep(intel_dsi->panel_off_delay);
-       msleep(intel_dsi->panel_pwr_cycle_delay);
 
        /* Panel Disable over CRC PMIC */
        if (intel_dsi->gpio_panel)
                gpiod_set_value_cansleep(intel_dsi->gpio_panel, 0);
+
+       /*
+        * FIXME As we do with eDP, just make a note of the time here
+        * and perform the wait before the next panel power on.
+        */
+       msleep(intel_dsi->panel_pwr_cycle_delay);
 }
 
 static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
@@ -667,7 +708,7 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
        struct drm_device *dev = encoder->base.dev;
        enum intel_display_power_domain power_domain;
        enum port port;
-       bool ret;
+       bool active = false;
 
        DRM_DEBUG_KMS("\n");
 
@@ -675,55 +716,133 @@ static bool intel_dsi_get_hw_state(struct intel_encoder *encoder,
        if (!intel_display_power_get_if_enabled(dev_priv, power_domain))
                return false;
 
-       ret = false;
+       /*
+        * On Broxton the PLL needs to be enabled with a valid divider
+        * configuration, otherwise accessing DSI registers will hang the
+        * machine. See BSpec North Display Engine registers/MIPI[BXT].
+        */
+       if (IS_BROXTON(dev_priv) && !intel_dsi_pll_is_enabled(dev_priv))
+               goto out_put_power;
 
        /* XXX: this only works for one DSI output */
        for_each_dsi_port(port, intel_dsi->ports) {
                i915_reg_t ctrl_reg = IS_BROXTON(dev) ?
                        BXT_MIPI_PORT_CTRL(port) : MIPI_PORT_CTRL(port);
-               u32 dpi_enabled, func;
-
-               func = I915_READ(MIPI_DSI_FUNC_PRG(port));
-               dpi_enabled = I915_READ(ctrl_reg) & DPI_ENABLE;
+               bool enabled = I915_READ(ctrl_reg) & DPI_ENABLE;
 
-               /* Due to some hardware limitations on BYT, MIPI Port C DPI
-                * Enable bit does not get set. To check whether DSI Port C
-                * was enabled in BIOS, check the Pipe B enable bit
+               /*
+                * Due to some hardware limitations on VLV/CHV, the DPI enable
+                * bit in port C control register does not get set. As a
+                * workaround, check pipe B conf instead.
                 */
-               if (IS_VALLEYVIEW(dev) && port == PORT_C)
-                       dpi_enabled = I915_READ(PIPECONF(PIPE_B)) &
-                                                       PIPECONF_ENABLE;
+               if ((IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) && port == PORT_C)
+                       enabled = I915_READ(PIPECONF(PIPE_B)) & PIPECONF_ENABLE;
+
+               /* Try command mode if video mode not enabled */
+               if (!enabled) {
+                       u32 tmp = I915_READ(MIPI_DSI_FUNC_PRG(port));
+                       enabled = tmp & CMD_MODE_DATA_WIDTH_MASK;
+               }
 
-               if (dpi_enabled || (func & CMD_MODE_DATA_WIDTH_MASK)) {
-                       if (I915_READ(MIPI_DEVICE_READY(port)) & DEVICE_READY) {
-                               *pipe = port == PORT_A ? PIPE_A : PIPE_B;
-                               ret = true;
+               if (!enabled)
+                       continue;
 
-                               goto out;
-                       }
+               if (!(I915_READ(MIPI_DEVICE_READY(port)) & DEVICE_READY))
+                       continue;
+
+               if (IS_BROXTON(dev_priv)) {
+                       u32 tmp = I915_READ(MIPI_CTRL(port));
+                       tmp &= BXT_PIPE_SELECT_MASK;
+                       tmp >>= BXT_PIPE_SELECT_SHIFT;
+
+                       if (WARN_ON(tmp > PIPE_C))
+                               continue;
+
+                       *pipe = tmp;
+               } else {
+                       *pipe = port == PORT_A ? PIPE_A : PIPE_B;
                }
+
+               active = true;
+               break;
        }
-out:
+
+out_put_power:
        intel_display_power_put(dev_priv, power_domain);
 
-       return ret;
+       return active;
 }
 
+static void bxt_dsi_get_pipe_config(struct intel_encoder *encoder,
+                                struct intel_crtc_state *pipe_config)
+{
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_display_mode *adjusted_mode =
+                                       &pipe_config->base.adjusted_mode;
+       struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
+       unsigned int bpp, fmt;
+       enum port port;
+       u16 vfp, vsync, vbp;
+
+       /*
+        * Atleast one port is active as encoder->get_config called only if
+        * encoder->get_hw_state() returns true.
+        */
+       for_each_dsi_port(port, intel_dsi->ports) {
+               if (I915_READ(BXT_MIPI_PORT_CTRL(port)) & DPI_ENABLE)
+                       break;
+       }
+
+       fmt = I915_READ(MIPI_DSI_FUNC_PRG(port)) & VID_MODE_FORMAT_MASK;
+       pipe_config->pipe_bpp =
+                       mipi_dsi_pixel_format_to_bpp(
+                               pixel_format_from_register_bits(fmt));
+       bpp = pipe_config->pipe_bpp;
+
+       /* In terms of pixels */
+       adjusted_mode->crtc_hdisplay =
+                               I915_READ(BXT_MIPI_TRANS_HACTIVE(port));
+       adjusted_mode->crtc_vdisplay =
+                               I915_READ(BXT_MIPI_TRANS_VACTIVE(port));
+       adjusted_mode->crtc_vtotal =
+                               I915_READ(BXT_MIPI_TRANS_VTOTAL(port));
+
+       /*
+        * TODO: Retrieve hfp, hsync and hbp. Adjust them for dual link and
+        * calculate hsync_start, hsync_end, htotal and hblank_end
+        */
+
+       /* vertical values are in terms of lines */
+       vfp = I915_READ(MIPI_VFP_COUNT(port));
+       vsync = I915_READ(MIPI_VSYNC_PADDING_COUNT(port));
+       vbp = I915_READ(MIPI_VBP_COUNT(port));
+
+       adjusted_mode->crtc_hblank_start = adjusted_mode->crtc_hdisplay;
+
+       adjusted_mode->crtc_vsync_start =
+                               vfp + adjusted_mode->crtc_vdisplay;
+       adjusted_mode->crtc_vsync_end =
+                               vsync + adjusted_mode->crtc_vsync_start;
+       adjusted_mode->crtc_vblank_start = adjusted_mode->crtc_vdisplay;
+       adjusted_mode->crtc_vblank_end = adjusted_mode->crtc_vtotal;
+}
+
+
 static void intel_dsi_get_config(struct intel_encoder *encoder,
                                 struct intel_crtc_state *pipe_config)
 {
+       struct drm_device *dev = encoder->base.dev;
        u32 pclk;
        DRM_DEBUG_KMS("\n");
 
        pipe_config->has_dsi_encoder = true;
 
-       /*
-        * DPLL_MD is not used in case of DSI, reading will get some default value
-        * set dpll_md = 0
-        */
-       pipe_config->dpll_hw_state.dpll_md = 0;
+       if (IS_BROXTON(dev))
+               bxt_dsi_get_pipe_config(encoder, pipe_config);
 
-       pclk = intel_dsi_get_pclk(encoder, pipe_config->pipe_bpp);
+       pclk = intel_dsi_get_pclk(encoder, pipe_config->pipe_bpp,
+                                 pipe_config);
        if (!pclk)
                return;
 
@@ -736,7 +855,7 @@ intel_dsi_mode_valid(struct drm_connector *connector,
                     struct drm_display_mode *mode)
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
-       struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
+       const struct drm_display_mode *fixed_mode = intel_connector->panel.fixed_mode;
        int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
 
        DRM_DEBUG_KMS("\n");
@@ -787,7 +906,7 @@ static void set_dsi_timings(struct drm_encoder *encoder,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        enum port port;
-       unsigned int bpp = dsi_pixel_format_bpp(intel_dsi->pixel_format);
+       unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
        unsigned int lane_count = intel_dsi->lane_count;
 
        u16 hactive, hfp, hsync, hbp, vfp, vsync, vbp;
@@ -849,6 +968,23 @@ static void set_dsi_timings(struct drm_encoder *encoder,
        }
 }
 
+static u32 pixel_format_to_reg(enum mipi_dsi_pixel_format fmt)
+{
+       switch (fmt) {
+       case MIPI_DSI_FMT_RGB888:
+               return VID_MODE_FORMAT_RGB888;
+       case MIPI_DSI_FMT_RGB666:
+               return VID_MODE_FORMAT_RGB666;
+       case MIPI_DSI_FMT_RGB666_PACKED:
+               return VID_MODE_FORMAT_RGB666_PACKED;
+       case MIPI_DSI_FMT_RGB565:
+               return VID_MODE_FORMAT_RGB565;
+       default:
+               MISSING_CASE(fmt);
+               return VID_MODE_FORMAT_RGB666;
+       }
+}
+
 static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
 {
        struct drm_encoder *encoder = &intel_encoder->base;
@@ -858,7 +994,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
        const struct drm_display_mode *adjusted_mode = &intel_crtc->config->base.adjusted_mode;
        enum port port;
-       unsigned int bpp = dsi_pixel_format_bpp(intel_dsi->pixel_format);
+       unsigned int bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
        u32 val, tmp;
        u16 mode_hdisplay;
 
@@ -917,9 +1053,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder)
                val |= CMD_MODE_DATA_WIDTH_8_BIT; /* XXX */
        } else {
                val |= intel_dsi->channel << VID_MODE_CHANNEL_NUMBER_SHIFT;
-
-               /* XXX: cross-check bpp vs. pixel format? */
-               val |= intel_dsi->pixel_format;
+               val |= pixel_format_to_reg(intel_dsi->pixel_format);
        }
 
        tmp = 0;
@@ -1059,6 +1193,48 @@ static int intel_dsi_get_modes(struct drm_connector *connector)
        return 1;
 }
 
+static int intel_dsi_set_property(struct drm_connector *connector,
+                                 struct drm_property *property,
+                                 uint64_t val)
+{
+       struct drm_device *dev = connector->dev;
+       struct intel_connector *intel_connector = to_intel_connector(connector);
+       struct drm_crtc *crtc;
+       int ret;
+
+       ret = drm_object_property_set_value(&connector->base, property, val);
+       if (ret)
+               return ret;
+
+       if (property == dev->mode_config.scaling_mode_property) {
+               if (val == DRM_MODE_SCALE_NONE) {
+                       DRM_DEBUG_KMS("no scaling not supported\n");
+                       return -EINVAL;
+               }
+               if (HAS_GMCH_DISPLAY(dev) &&
+                   val == DRM_MODE_SCALE_CENTER) {
+                       DRM_DEBUG_KMS("centering not supported\n");
+                       return -EINVAL;
+               }
+
+               if (intel_connector->panel.fitting_mode == val)
+                       return 0;
+
+               intel_connector->panel.fitting_mode = val;
+       }
+
+       crtc = intel_attached_encoder(connector)->base.crtc;
+       if (crtc && crtc->state->enable) {
+               /*
+                * If the CRTC is enabled, the display will be changed
+                * according to the new panel fitting mode.
+                */
+               intel_crtc_restore_mode(crtc);
+       }
+
+       return 0;
+}
+
 static void intel_dsi_connector_destroy(struct drm_connector *connector)
 {
        struct intel_connector *intel_connector = to_intel_connector(connector);
@@ -1101,11 +1277,25 @@ static const struct drm_connector_funcs intel_dsi_connector_funcs = {
        .detect = intel_dsi_detect,
        .destroy = intel_dsi_connector_destroy,
        .fill_modes = drm_helper_probe_single_connector_modes,
+       .set_property = intel_dsi_set_property,
        .atomic_get_property = intel_connector_atomic_get_property,
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
 };
 
+static void intel_dsi_add_properties(struct intel_connector *connector)
+{
+       struct drm_device *dev = connector->base.dev;
+
+       if (connector->panel.fixed_mode) {
+               drm_mode_create_scaling_mode_property(dev);
+               drm_object_attach_property(&connector->base.base,
+                                          dev->mode_config.scaling_mode_property,
+                                          DRM_MODE_SCALE_ASPECT);
+               connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
+       }
+}
+
 void intel_dsi_init(struct drm_device *dev)
 {
        struct intel_dsi *intel_dsi;
@@ -1121,11 +1311,13 @@ void intel_dsi_init(struct drm_device *dev)
        DRM_DEBUG_KMS("\n");
 
        /* There is no detection method for MIPI so rely on VBT */
-       if (!dev_priv->vbt.has_mipi)
+       if (!intel_bios_is_dsi_present(dev_priv, &port))
                return;
 
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
                dev_priv->mipi_mmio_base = VLV_MIPI_BASE;
+       } else if (IS_BROXTON(dev)) {
+               dev_priv->mipi_mmio_base = BXT_MIPI_BASE;
        } else {
                DRM_ERROR("Unsupported Mipi device to reg base");
                return;
@@ -1161,17 +1353,21 @@ void intel_dsi_init(struct drm_device *dev)
        intel_connector->get_hw_state = intel_connector_get_hw_state;
        intel_connector->unregister = intel_connector_unregister;
 
-       /* Pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI port C */
-       if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIA) {
-               intel_encoder->crtc_mask = (1 << PIPE_A);
-               intel_dsi->ports = (1 << PORT_A);
-       } else if (dev_priv->vbt.dsi.port == DVO_PORT_MIPIC) {
-               intel_encoder->crtc_mask = (1 << PIPE_B);
-               intel_dsi->ports = (1 << PORT_C);
-       }
+       /*
+        * On BYT/CHV, pipe A maps to MIPI DSI port A, pipe B maps to MIPI DSI
+        * port C. BXT isn't limited like this.
+        */
+       if (IS_BROXTON(dev_priv))
+               intel_encoder->crtc_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C);
+       else if (port == PORT_A)
+               intel_encoder->crtc_mask = BIT(PIPE_A);
+       else
+               intel_encoder->crtc_mask = BIT(PIPE_B);
 
        if (dev_priv->vbt.dsi.config->dual_link)
-               intel_dsi->ports = ((1 << PORT_A) | (1 << PORT_C));
+               intel_dsi->ports = BIT(PORT_A) | BIT(PORT_C);
+       else
+               intel_dsi->ports = BIT(port);
 
        /* Create a DSI host (and a device) for each port. */
        for_each_dsi_port(port, intel_dsi->ports) {
@@ -1223,8 +1419,6 @@ void intel_dsi_init(struct drm_device *dev)
 
        intel_connector_attach_encoder(intel_connector, intel_encoder);
 
-       drm_connector_register(connector);
-
        drm_panel_attach(intel_dsi->panel, connector);
 
        mutex_lock(&dev->mode_config.mutex);
@@ -1243,6 +1437,11 @@ void intel_dsi_init(struct drm_device *dev)
        }
 
        intel_panel_init(&intel_connector->panel, fixed_mode, NULL);
+
+       intel_dsi_add_properties(intel_connector);
+
+       drm_connector_register(connector);
+
        intel_panel_setup_backlight(connector, INVALID_PIPE);
 
        return;
index 92f39227b3610761382d78c1b25a99c9f63cc0b8..61a6957fc6c2ce2e2192e04d0c504be864972ec8 100644 (file)
@@ -34,8 +34,6 @@
 #define DSI_DUAL_LINK_FRONT_BACK       1
 #define DSI_DUAL_LINK_PIXEL_ALT                2
 
-int dsi_pixel_format_bpp(int pixel_format);
-
 struct intel_dsi_host;
 
 struct intel_dsi {
@@ -64,8 +62,12 @@ struct intel_dsi {
        /* number of DSI lanes */
        unsigned int lane_count;
 
-       /* video mode pixel format for MIPI_DSI_FUNC_PRG register */
-       u32 pixel_format;
+       /*
+        * video mode pixel format
+        *
+        * XXX: consolidate on .format in struct mipi_dsi_device.
+        */
+       enum mipi_dsi_pixel_format pixel_format;
 
        /* video mode format for MIPI_VIDEO_MODE_FORMAT register */
        u32 video_mode_format;
@@ -117,21 +119,25 @@ static inline struct intel_dsi_host *to_intel_dsi_host(struct mipi_dsi_host *h)
        return container_of(h, struct intel_dsi_host, base);
 }
 
-#define for_each_dsi_port(__port, __ports_mask) \
-       for ((__port) = PORT_A; (__port) < I915_MAX_PORTS; (__port)++)  \
-               for_each_if ((__ports_mask) & (1 << (__port)))
+#define for_each_dsi_port(__port, __ports_mask) for_each_port_masked(__port, __ports_mask)
 
 static inline struct intel_dsi *enc_to_intel_dsi(struct drm_encoder *encoder)
 {
        return container_of(encoder, struct intel_dsi, base.base);
 }
 
-extern void intel_enable_dsi_pll(struct intel_encoder *encoder);
-extern void intel_disable_dsi_pll(struct intel_encoder *encoder);
-extern u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp);
-extern void intel_dsi_reset_clocks(struct intel_encoder *encoder,
-                                                       enum port port);
+bool intel_dsi_pll_is_enabled(struct drm_i915_private *dev_priv);
+int intel_compute_dsi_pll(struct intel_encoder *encoder,
+                         struct intel_crtc_state *config);
+void intel_enable_dsi_pll(struct intel_encoder *encoder,
+                         const struct intel_crtc_state *config);
+void intel_disable_dsi_pll(struct intel_encoder *encoder);
+u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp,
+                      struct intel_crtc_state *config);
+void intel_dsi_reset_clocks(struct intel_encoder *encoder,
+                           enum port port);
 
 struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id);
+enum mipi_dsi_pixel_format pixel_format_from_register_bits(u32 fmt);
 
 #endif /* _INTEL_DSI_H */
index 7f145b4fec6a1c96ca36a7f7edabac22b7d280d4..e498f1c3221e368a5d2d53b20c609b7633baa744 100644 (file)
@@ -58,50 +58,41 @@ static inline struct vbt_panel *to_vbt_panel(struct drm_panel *panel)
 
 #define NS_KHZ_RATIO 1000000
 
-#define GPI0_NC_0_HV_DDI0_HPD           0x4130
-#define GPIO_NC_0_HV_DDI0_PAD           0x4138
-#define GPIO_NC_1_HV_DDI0_DDC_SDA       0x4120
-#define GPIO_NC_1_HV_DDI0_DDC_SDA_PAD   0x4128
-#define GPIO_NC_2_HV_DDI0_DDC_SCL       0x4110
-#define GPIO_NC_2_HV_DDI0_DDC_SCL_PAD   0x4118
-#define GPIO_NC_3_PANEL0_VDDEN          0x4140
-#define GPIO_NC_3_PANEL0_VDDEN_PAD      0x4148
-#define GPIO_NC_4_PANEL0_BLKEN          0x4150
-#define GPIO_NC_4_PANEL0_BLKEN_PAD      0x4158
-#define GPIO_NC_5_PANEL0_BLKCTL         0x4160
-#define GPIO_NC_5_PANEL0_BLKCTL_PAD     0x4168
-#define GPIO_NC_6_PCONF0                0x4180
-#define GPIO_NC_6_PAD                   0x4188
-#define GPIO_NC_7_PCONF0                0x4190
-#define GPIO_NC_7_PAD                   0x4198
-#define GPIO_NC_8_PCONF0                0x4170
-#define GPIO_NC_8_PAD                   0x4178
-#define GPIO_NC_9_PCONF0                0x4100
-#define GPIO_NC_9_PAD                   0x4108
-#define GPIO_NC_10_PCONF0               0x40E0
-#define GPIO_NC_10_PAD                  0x40E8
-#define GPIO_NC_11_PCONF0               0x40F0
-#define GPIO_NC_11_PAD                  0x40F8
-
-struct gpio_table {
-       u16 function_reg;
-       u16 pad_reg;
-       u8 init;
+/* base offsets for gpio pads */
+#define VLV_GPIO_NC_0_HV_DDI0_HPD      0x4130
+#define VLV_GPIO_NC_1_HV_DDI0_DDC_SDA  0x4120
+#define VLV_GPIO_NC_2_HV_DDI0_DDC_SCL  0x4110
+#define VLV_GPIO_NC_3_PANEL0_VDDEN     0x4140
+#define VLV_GPIO_NC_4_PANEL0_BKLTEN    0x4150
+#define VLV_GPIO_NC_5_PANEL0_BKLTCTL   0x4160
+#define VLV_GPIO_NC_6_HV_DDI1_HPD      0x4180
+#define VLV_GPIO_NC_7_HV_DDI1_DDC_SDA  0x4190
+#define VLV_GPIO_NC_8_HV_DDI1_DDC_SCL  0x4170
+#define VLV_GPIO_NC_9_PANEL1_VDDEN     0x4100
+#define VLV_GPIO_NC_10_PANEL1_BKLTEN   0x40E0
+#define VLV_GPIO_NC_11_PANEL1_BKLTCTL  0x40F0
+
+#define VLV_GPIO_PCONF0(base_offset)   (base_offset)
+#define VLV_GPIO_PAD_VAL(base_offset)  ((base_offset) + 8)
+
+struct gpio_map {
+       u16 base_offset;
+       bool init;
 };
 
-static struct gpio_table gtable[] = {
-       { GPI0_NC_0_HV_DDI0_HPD, GPIO_NC_0_HV_DDI0_PAD, 0 },
-       { GPIO_NC_1_HV_DDI0_DDC_SDA, GPIO_NC_1_HV_DDI0_DDC_SDA_PAD, 0 },
-       { GPIO_NC_2_HV_DDI0_DDC_SCL, GPIO_NC_2_HV_DDI0_DDC_SCL_PAD, 0 },
-       { GPIO_NC_3_PANEL0_VDDEN, GPIO_NC_3_PANEL0_VDDEN_PAD, 0 },
-       { GPIO_NC_4_PANEL0_BLKEN, GPIO_NC_4_PANEL0_BLKEN_PAD, 0 },
-       { GPIO_NC_5_PANEL0_BLKCTL, GPIO_NC_5_PANEL0_BLKCTL_PAD, 0 },
-       { GPIO_NC_6_PCONF0, GPIO_NC_6_PAD, 0 },
-       { GPIO_NC_7_PCONF0, GPIO_NC_7_PAD, 0 },
-       { GPIO_NC_8_PCONF0, GPIO_NC_8_PAD, 0 },
-       { GPIO_NC_9_PCONF0, GPIO_NC_9_PAD, 0 },
-       { GPIO_NC_10_PCONF0, GPIO_NC_10_PAD, 0},
-       { GPIO_NC_11_PCONF0, GPIO_NC_11_PAD, 0}
+static struct gpio_map vlv_gpio_table[] = {
+       { VLV_GPIO_NC_0_HV_DDI0_HPD },
+       { VLV_GPIO_NC_1_HV_DDI0_DDC_SDA },
+       { VLV_GPIO_NC_2_HV_DDI0_DDC_SCL },
+       { VLV_GPIO_NC_3_PANEL0_VDDEN },
+       { VLV_GPIO_NC_4_PANEL0_BKLTEN },
+       { VLV_GPIO_NC_5_PANEL0_BKLTCTL },
+       { VLV_GPIO_NC_6_HV_DDI1_HPD },
+       { VLV_GPIO_NC_7_HV_DDI1_DDC_SDA },
+       { VLV_GPIO_NC_8_HV_DDI1_DDC_SCL },
+       { VLV_GPIO_NC_9_PANEL1_VDDEN },
+       { VLV_GPIO_NC_10_PANEL1_BKLTEN },
+       { VLV_GPIO_NC_11_PANEL1_BKLTCTL },
 };
 
 static inline enum port intel_dsi_seq_port_to_port(u8 port)
@@ -196,56 +187,76 @@ static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data)
        return data;
 }
 
-static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
+static void vlv_exec_gpio(struct drm_i915_private *dev_priv,
+                         u8 gpio_source, u8 gpio_index, bool value)
 {
-       u8 gpio, action;
-       u16 function, pad;
-       u32 val;
-       struct drm_device *dev = intel_dsi->base.base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-
-       if (dev_priv->vbt.dsi.seq_version >= 3)
-               data++;
-
-       gpio = *data++;
+       struct gpio_map *map;
+       u16 pconf0, padval;
+       u32 tmp;
+       u8 port;
 
-       /* pull up/down */
-       action = *data++ & 1;
-
-       if (gpio >= ARRAY_SIZE(gtable)) {
-               DRM_DEBUG_KMS("unknown gpio %u\n", gpio);
-               goto out;
+       if (gpio_index >= ARRAY_SIZE(vlv_gpio_table)) {
+               DRM_DEBUG_KMS("unknown gpio index %u\n", gpio_index);
+               return;
        }
 
-       if (!IS_VALLEYVIEW(dev_priv)) {
-               DRM_DEBUG_KMS("GPIO element not supported on this platform\n");
-               goto out;
-       }
+       map = &vlv_gpio_table[gpio_index];
 
        if (dev_priv->vbt.dsi.seq_version >= 3) {
                DRM_DEBUG_KMS("GPIO element v3 not supported\n");
-               goto out;
+               return;
+       } else {
+               if (gpio_source == 0) {
+                       port = IOSF_PORT_GPIO_NC;
+               } else if (gpio_source == 1) {
+                       port = IOSF_PORT_GPIO_SC;
+               } else {
+                       DRM_DEBUG_KMS("unknown gpio source %u\n", gpio_source);
+                       return;
+               }
        }
 
-       function = gtable[gpio].function_reg;
-       pad = gtable[gpio].pad_reg;
+       pconf0 = VLV_GPIO_PCONF0(map->base_offset);
+       padval = VLV_GPIO_PAD_VAL(map->base_offset);
 
        mutex_lock(&dev_priv->sb_lock);
-       if (!gtable[gpio].init) {
-               /* program the function */
+       if (!map->init) {
                /* FIXME: remove constant below */
-               vlv_iosf_sb_write(dev_priv, IOSF_PORT_GPIO_NC, function,
-                                 0x2000CC00);
-               gtable[gpio].init = 1;
+               vlv_iosf_sb_write(dev_priv, port, pconf0, 0x2000CC00);
+               map->init = true;
        }
 
-       val = 0x4 | action;
+       tmp = 0x4 | value;
+       vlv_iosf_sb_write(dev_priv, port, padval, tmp);
+       mutex_unlock(&dev_priv->sb_lock);
+}
+
+static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
+{
+       struct drm_device *dev = intel_dsi->base.base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       u8 gpio_source, gpio_index;
+       bool value;
+
+       if (dev_priv->vbt.dsi.seq_version >= 3)
+               data++;
+
+       gpio_index = *data++;
+
+       /* gpio source in sequence v2 only */
+       if (dev_priv->vbt.dsi.seq_version == 2)
+               gpio_source = (*data >> 1) & 3;
+       else
+               gpio_source = 0;
 
        /* pull up/down */
-       vlv_iosf_sb_write(dev_priv, IOSF_PORT_GPIO_NC, pad, val);
-       mutex_unlock(&dev_priv->sb_lock);
+       value = *data++ & 1;
+
+       if (IS_VALLEYVIEW(dev_priv))
+               vlv_exec_gpio(dev_priv, gpio_source, gpio_index, value);
+       else
+               DRM_DEBUG_KMS("GPIO element not supported on this platform\n");
 
-out:
        return data;
 }
 
@@ -420,7 +431,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)
        struct mipi_pps_data *pps = dev_priv->vbt.dsi.pps;
        struct drm_display_mode *mode = dev_priv->vbt.lfp_lvds_vbt_mode;
        struct vbt_panel *vbt_panel;
-       u32 bits_per_pixel = 24;
+       u32 bpp;
        u32 tlpx_ns, extra_byte_count, bitrate, tlpx_ui;
        u32 ui_num, ui_den;
        u32 prepare_cnt, exit_zero_cnt, clk_zero_cnt, trail_cnt;
@@ -436,12 +447,13 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)
        intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1;
        intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0;
        intel_dsi->lane_count = mipi_config->lane_cnt + 1;
-       intel_dsi->pixel_format = mipi_config->videomode_color_format << 7;
+       intel_dsi->pixel_format =
+                       pixel_format_from_register_bits(
+                               mipi_config->videomode_color_format << 7);
+       bpp = mipi_dsi_pixel_format_to_bpp(intel_dsi->pixel_format);
+
        intel_dsi->dual_link = mipi_config->dual_link;
        intel_dsi->pixel_overlap = mipi_config->pixel_overlap;
-
-       bits_per_pixel = dsi_pixel_format_bpp(intel_dsi->pixel_format);
-
        intel_dsi->operation_mode = mipi_config->is_cmd_mode;
        intel_dsi->video_mode_format = mipi_config->video_transfer_mode;
        intel_dsi->escape_clk_div = mipi_config->byte_clk_sel;
@@ -475,8 +487,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)
         */
        if (intel_dsi->video_mode_format == VIDEO_MODE_BURST) {
                if (mipi_config->target_burst_mode_freq) {
-                       computed_ddr =
-                               (pclk * bits_per_pixel) / intel_dsi->lane_count;
+                       computed_ddr = (pclk * bpp) / intel_dsi->lane_count;
 
                        if (mipi_config->target_burst_mode_freq <
                                                                computed_ddr) {
@@ -499,7 +510,7 @@ struct drm_panel *vbt_panel_init(struct intel_dsi *intel_dsi, u16 panel_id)
        intel_dsi->burst_mode_ratio = burst_mode_ratio;
        intel_dsi->pclk = pclk;
 
-       bitrate = (pclk * bits_per_pixel) / intel_dsi->lane_count;
+       bitrate = (pclk * bpp) / intel_dsi->lane_count;
 
        switch (intel_dsi->escape_clk_div) {
        case 0:
index 70883c54cb0a5ad84d44a7cc2fd7f79bf46717b5..1765e6e18f2c6e8aa2dfb2ac4d8f08fb9983dc40 100644 (file)
 #include "i915_drv.h"
 #include "intel_dsi.h"
 
-int dsi_pixel_format_bpp(int pixel_format)
-{
-       int bpp;
-
-       switch (pixel_format) {
-       default:
-       case VID_MODE_FORMAT_RGB888:
-       case VID_MODE_FORMAT_RGB666_LOOSE:
-               bpp = 24;
-               break;
-       case VID_MODE_FORMAT_RGB666:
-               bpp = 18;
-               break;
-       case VID_MODE_FORMAT_RGB565:
-               bpp = 16;
-               break;
-       }
-
-       return bpp;
-}
-
-struct dsi_mnp {
-       u32 dsi_pll_ctrl;
-       u32 dsi_pll_div;
-};
-
-static const u32 lfsr_converts[] = {
+static const u16 lfsr_converts[] = {
        426, 469, 234, 373, 442, 221, 110, 311, 411,            /* 62 - 70 */
        461, 486, 243, 377, 188, 350, 175, 343, 427, 213,       /* 71 - 80 */
        106, 53, 282, 397, 454, 227, 113, 56, 284, 142,         /* 81 - 90 */
@@ -64,10 +38,11 @@ static const u32 lfsr_converts[] = {
 };
 
 /* Get DSI clock from pixel clock */
-static u32 dsi_clk_from_pclk(u32 pclk, int pixel_format, int lane_count)
+static u32 dsi_clk_from_pclk(u32 pclk, enum mipi_dsi_pixel_format fmt,
+                            int lane_count)
 {
        u32 dsi_clk_khz;
-       u32 bpp = dsi_pixel_format_bpp(pixel_format);
+       u32 bpp = mipi_dsi_pixel_format_to_bpp(fmt);
 
        /* DSI data rate = pixel clock * bits per pixel / lane count
           pixel clock is converted from KHz to Hz */
@@ -77,7 +52,8 @@ static u32 dsi_clk_from_pclk(u32 pclk, int pixel_format, int lane_count)
 }
 
 static int dsi_calc_mnp(struct drm_i915_private *dev_priv,
-                       struct dsi_mnp *dsi_mnp, int target_dsi_clk)
+                       struct intel_crtc_state *config,
+                       int target_dsi_clk)
 {
        unsigned int calc_m = 0, calc_p = 0;
        unsigned int m_min, m_max, p_min = 2, p_max = 6;
@@ -123,8 +99,8 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv,
        /* register has log2(N1), this works fine for powers of two */
        n = ffs(n) - 1;
        m_seed = lfsr_converts[calc_m - 62];
-       dsi_mnp->dsi_pll_ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2);
-       dsi_mnp->dsi_pll_div = n << DSI_PLL_N1_DIV_SHIFT |
+       config->dsi_pll.ctrl = 1 << (DSI_PLL_P1_POST_DIV_SHIFT + calc_p - 2);
+       config->dsi_pll.div = n << DSI_PLL_N1_DIV_SHIFT |
                m_seed << DSI_PLL_M1_DIV_SHIFT;
 
        return 0;
@@ -134,54 +110,55 @@ static int dsi_calc_mnp(struct drm_i915_private *dev_priv,
  * XXX: The muxing and gating is hard coded for now. Need to add support for
  * sharing PLLs with two DSI outputs.
  */
-static void vlv_configure_dsi_pll(struct intel_encoder *encoder)
+static int vlv_compute_dsi_pll(struct intel_encoder *encoder,
+                              struct intel_crtc_state *config)
 {
        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
        int ret;
-       struct dsi_mnp dsi_mnp;
        u32 dsi_clk;
 
        dsi_clk = dsi_clk_from_pclk(intel_dsi->pclk, intel_dsi->pixel_format,
                                    intel_dsi->lane_count);
 
-       ret = dsi_calc_mnp(dev_priv, &dsi_mnp, dsi_clk);
+       ret = dsi_calc_mnp(dev_priv, config, dsi_clk);
        if (ret) {
                DRM_DEBUG_KMS("dsi_calc_mnp failed\n");
-               return;
+               return ret;
        }
 
        if (intel_dsi->ports & (1 << PORT_A))
-               dsi_mnp.dsi_pll_ctrl |= DSI_PLL_CLK_GATE_DSI0_DSIPLL;
+               config->dsi_pll.ctrl |= DSI_PLL_CLK_GATE_DSI0_DSIPLL;
 
        if (intel_dsi->ports & (1 << PORT_C))
-               dsi_mnp.dsi_pll_ctrl |= DSI_PLL_CLK_GATE_DSI1_DSIPLL;
+               config->dsi_pll.ctrl |= DSI_PLL_CLK_GATE_DSI1_DSIPLL;
+
+       config->dsi_pll.ctrl |= DSI_PLL_VCO_EN;
 
        DRM_DEBUG_KMS("dsi pll div %08x, ctrl %08x\n",
-                     dsi_mnp.dsi_pll_div, dsi_mnp.dsi_pll_ctrl);
+                     config->dsi_pll.div, config->dsi_pll.ctrl);
 
-       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, 0);
-       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_DIVIDER, dsi_mnp.dsi_pll_div);
-       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, dsi_mnp.dsi_pll_ctrl);
+       return 0;
 }
 
-static void vlv_enable_dsi_pll(struct intel_encoder *encoder)
+static void vlv_enable_dsi_pll(struct intel_encoder *encoder,
+                              const struct intel_crtc_state *config)
 {
-       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
-       u32 tmp;
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 
        DRM_DEBUG_KMS("\n");
 
        mutex_lock(&dev_priv->sb_lock);
 
-       vlv_configure_dsi_pll(encoder);
+       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, 0);
+       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_DIVIDER, config->dsi_pll.div);
+       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL,
+                     config->dsi_pll.ctrl & ~DSI_PLL_VCO_EN);
 
        /* wait at least 0.5 us after ungating before enabling VCO */
        usleep_range(1, 10);
 
-       tmp = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL);
-       tmp |= DSI_PLL_VCO_EN;
-       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, tmp);
+       vlv_cck_write(dev_priv, CCK_REG_DSI_PLL_CONTROL, config->dsi_pll.ctrl);
 
        if (wait_for(vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_CONTROL) &
                                                DSI_PLL_LOCK, 20)) {
@@ -197,7 +174,7 @@ static void vlv_enable_dsi_pll(struct intel_encoder *encoder)
 
 static void vlv_disable_dsi_pll(struct intel_encoder *encoder)
 {
-       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        u32 tmp;
 
        DRM_DEBUG_KMS("\n");
@@ -212,9 +189,39 @@ static void vlv_disable_dsi_pll(struct intel_encoder *encoder)
        mutex_unlock(&dev_priv->sb_lock);
 }
 
+static bool bxt_dsi_pll_is_enabled(struct drm_i915_private *dev_priv)
+{
+       bool enabled;
+       u32 val;
+       u32 mask;
+
+       mask = BXT_DSI_PLL_DO_ENABLE | BXT_DSI_PLL_LOCKED;
+       val = I915_READ(BXT_DSI_PLL_ENABLE);
+       enabled = (val & mask) == mask;
+
+       if (!enabled)
+               return false;
+
+       /*
+        * Both dividers must be programmed with valid values even if only one
+        * of the PLL is used, see BSpec/Broxton Clocks. Check this here for
+        * paranoia, since BIOS is known to misconfigure PLLs in this way at
+        * times, and since accessing DSI registers with invalid dividers
+        * causes a system hang.
+        */
+       val = I915_READ(BXT_DSI_PLL_CTL);
+       if (!(val & BXT_DSIA_16X_MASK) || !(val & BXT_DSIC_16X_MASK)) {
+               DRM_DEBUG_DRIVER("PLL is enabled with invalid divider settings (%08x)\n",
+                                val);
+               enabled = false;
+       }
+
+       return enabled;
+}
+
 static void bxt_disable_dsi_pll(struct intel_encoder *encoder)
 {
-       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        u32 val;
 
        DRM_DEBUG_KMS("\n");
@@ -232,23 +239,24 @@ static void bxt_disable_dsi_pll(struct intel_encoder *encoder)
                DRM_ERROR("Timeout waiting for PLL lock deassertion\n");
 }
 
-static void assert_bpp_mismatch(int pixel_format, int pipe_bpp)
+static void assert_bpp_mismatch(enum mipi_dsi_pixel_format fmt, int pipe_bpp)
 {
-       int bpp = dsi_pixel_format_bpp(pixel_format);
+       int bpp = mipi_dsi_pixel_format_to_bpp(fmt);
 
        WARN(bpp != pipe_bpp,
             "bpp match assertion failure (expected %d, current %d)\n",
             bpp, pipe_bpp);
 }
 
-static u32 vlv_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
+static u32 vlv_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp,
+                           struct intel_crtc_state *config)
 {
-       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
        u32 dsi_clock, pclk;
        u32 pll_ctl, pll_div;
        u32 m = 0, p = 0, n;
-       int refclk = 25000;
+       int refclk = IS_CHERRYVIEW(dev_priv) ? 100000 : 25000;
        int i;
 
        DRM_DEBUG_KMS("\n");
@@ -258,6 +266,9 @@ static u32 vlv_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
        pll_div = vlv_cck_read(dev_priv, CCK_REG_DSI_PLL_DIVIDER);
        mutex_unlock(&dev_priv->sb_lock);
 
+       config->dsi_pll.ctrl = pll_ctl & ~DSI_PLL_LOCK;
+       config->dsi_pll.div = pll_div;
+
        /* mask out other bits and extract the P1 divisor */
        pll_ctl &= DSI_PLL_P1_POST_DIV_MASK;
        pll_ctl = pll_ctl >> (DSI_PLL_P1_POST_DIV_SHIFT - 2);
@@ -303,7 +314,8 @@ static u32 vlv_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
        return pclk;
 }
 
-static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
+static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp,
+                           struct intel_crtc_state *config)
 {
        u32 pclk;
        u32 dsi_clk;
@@ -317,15 +329,9 @@ static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
                return 0;
        }
 
-       dsi_ratio = I915_READ(BXT_DSI_PLL_CTL) &
-                               BXT_DSI_PLL_RATIO_MASK;
+       config->dsi_pll.ctrl = I915_READ(BXT_DSI_PLL_CTL);
 
-       /* Invalid DSI ratio ? */
-       if (dsi_ratio < BXT_DSI_PLL_RATIO_MIN ||
-                       dsi_ratio > BXT_DSI_PLL_RATIO_MAX) {
-               DRM_ERROR("Invalid DSI pll ratio(%u) programmed\n", dsi_ratio);
-               return 0;
-       }
+       dsi_ratio = config->dsi_pll.ctrl & BXT_DSI_PLL_RATIO_MASK;
 
        dsi_clk = (dsi_ratio * BXT_REF_CLOCK_KHZ) / 2;
 
@@ -338,12 +344,13 @@ static u32 bxt_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
        return pclk;
 }
 
-u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp)
+u32 intel_dsi_get_pclk(struct intel_encoder *encoder, int pipe_bpp,
+                      struct intel_crtc_state *config)
 {
        if (IS_BROXTON(encoder->base.dev))
-               return bxt_dsi_get_pclk(encoder, pipe_bpp);
+               return bxt_dsi_get_pclk(encoder, pipe_bpp, config);
        else
-               return vlv_dsi_get_pclk(encoder, pipe_bpp);
+               return vlv_dsi_get_pclk(encoder, pipe_bpp, config);
 }
 
 static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port)
@@ -360,51 +367,72 @@ static void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port)
 }
 
 /* Program BXT Mipi clocks and dividers */
-static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port)
+static void bxt_dsi_program_clocks(struct drm_device *dev, enum port port,
+                                  const struct intel_crtc_state *config)
 {
-       u32 tmp;
-       u32 divider;
-       u32 dsi_rate;
-       u32 pll_ratio;
        struct drm_i915_private *dev_priv = dev->dev_private;
+       u32 tmp;
+       u32 dsi_rate = 0;
+       u32 pll_ratio = 0;
+       u32 rx_div;
+       u32 tx_div;
+       u32 rx_div_upper;
+       u32 rx_div_lower;
+       u32 mipi_8by3_divider;
 
        /* Clear old configurations */
        tmp = I915_READ(BXT_MIPI_CLOCK_CTL);
        tmp &= ~(BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port));
-       tmp &= ~(BXT_MIPI_RX_ESCLK_FIXDIV_MASK(port));
-       tmp &= ~(BXT_MIPI_ESCLK_VAR_DIV_MASK(port));
-       tmp &= ~(BXT_MIPI_DPHY_DIVIDER_MASK(port));
+       tmp &= ~(BXT_MIPI_RX_ESCLK_UPPER_FIXDIV_MASK(port));
+       tmp &= ~(BXT_MIPI_8X_BY3_DIVIDER_MASK(port));
+       tmp &= ~(BXT_MIPI_RX_ESCLK_LOWER_FIXDIV_MASK(port));
 
        /* Get the current DSI rate(actual) */
-       pll_ratio = I915_READ(BXT_DSI_PLL_CTL) &
-                               BXT_DSI_PLL_RATIO_MASK;
+       pll_ratio = config->dsi_pll.ctrl & BXT_DSI_PLL_RATIO_MASK;
        dsi_rate = (BXT_REF_CLOCK_KHZ * pll_ratio) / 2;
 
-       /* Max possible output of clock is 39.5 MHz, program value -1 */
-       divider = (dsi_rate / BXT_MAX_VAR_OUTPUT_KHZ) - 1;
-       tmp |= BXT_MIPI_ESCLK_VAR_DIV(port, divider);
+       /*
+        * tx clock should be <= 20MHz and the div value must be
+        * subtracted by 1 as per bspec
+        */
+       tx_div = DIV_ROUND_UP(dsi_rate, 20000) - 1;
+       /*
+        * rx clock should be <= 150MHz and the div value must be
+        * subtracted by 1 as per bspec
+        */
+       rx_div = DIV_ROUND_UP(dsi_rate, 150000) - 1;
 
        /*
-        * Tx escape clock must be as close to 20MHz possible, but should
-        * not exceed it. Hence select divide by 2
+        * rx divider value needs to be updated in the
+        * two differnt bit fields in the register hence splitting the
+        * rx divider value accordingly
         */
-       tmp |= BXT_MIPI_TX_ESCLK_8XDIV_BY2(port);
+       rx_div_lower = rx_div & RX_DIVIDER_BIT_1_2;
+       rx_div_upper = (rx_div & RX_DIVIDER_BIT_3_4) >> 2;
 
-       tmp |= BXT_MIPI_RX_ESCLK_8X_BY3(port);
+       /* As per bpsec program the 8/3X clock divider to the below value */
+       if (dev_priv->vbt.dsi.config->is_cmd_mode)
+               mipi_8by3_divider = 0x2;
+       else
+               mipi_8by3_divider = 0x3;
+
+       tmp |= BXT_MIPI_8X_BY3_DIVIDER(port, mipi_8by3_divider);
+       tmp |= BXT_MIPI_TX_ESCLK_DIVIDER(port, tx_div);
+       tmp |= BXT_MIPI_RX_ESCLK_LOWER_DIVIDER(port, rx_div_lower);
+       tmp |= BXT_MIPI_RX_ESCLK_UPPER_DIVIDER(port, rx_div_upper);
 
        I915_WRITE(BXT_MIPI_CLOCK_CTL, tmp);
 }
 
-static bool bxt_configure_dsi_pll(struct intel_encoder *encoder)
+static int bxt_compute_dsi_pll(struct intel_encoder *encoder,
+                              struct intel_crtc_state *config)
 {
-       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
        u8 dsi_ratio;
        u32 dsi_clk;
-       u32 val;
 
        dsi_clk = dsi_clk_from_pclk(intel_dsi->pclk, intel_dsi->pixel_format,
-                       intel_dsi->lane_count);
+                                   intel_dsi->lane_count);
 
        /*
         * From clock diagram, to get PLL ratio divider, divide double of DSI
@@ -413,9 +441,9 @@ static bool bxt_configure_dsi_pll(struct intel_encoder *encoder)
         */
        dsi_ratio = DIV_ROUND_UP(dsi_clk * 2, BXT_REF_CLOCK_KHZ);
        if (dsi_ratio < BXT_DSI_PLL_RATIO_MIN ||
-                       dsi_ratio > BXT_DSI_PLL_RATIO_MAX) {
+           dsi_ratio > BXT_DSI_PLL_RATIO_MAX) {
                DRM_ERROR("Cant get a suitable ratio from DSI PLL ratios\n");
-               return false;
+               return -ECHRNG;
        }
 
        /*
@@ -423,27 +451,19 @@ static bool bxt_configure_dsi_pll(struct intel_encoder *encoder)
         * Spec says both have to be programmed, even if one is not getting
         * used. Configure MIPI_CLOCK_CTL dividers in modeset
         */
-       val = I915_READ(BXT_DSI_PLL_CTL);
-       val &= ~BXT_DSI_PLL_PVD_RATIO_MASK;
-       val &= ~BXT_DSI_FREQ_SEL_MASK;
-       val &= ~BXT_DSI_PLL_RATIO_MASK;
-       val |= (dsi_ratio | BXT_DSIA_16X_BY2 | BXT_DSIC_16X_BY2);
+       config->dsi_pll.ctrl = dsi_ratio | BXT_DSIA_16X_BY2 | BXT_DSIC_16X_BY2;
 
        /* As per recommendation from hardware team,
         * Prog PVD ratio =1 if dsi ratio <= 50
         */
-       if (dsi_ratio <= 50) {
-               val &= ~BXT_DSI_PLL_PVD_RATIO_MASK;
-               val |= BXT_DSI_PLL_PVD_RATIO_1;
-       }
+       if (dsi_ratio <= 50)
+               config->dsi_pll.ctrl |= BXT_DSI_PLL_PVD_RATIO_1;
 
-       I915_WRITE(BXT_DSI_PLL_CTL, val);
-       POSTING_READ(BXT_DSI_PLL_CTL);
-
-       return true;
+       return 0;
 }
 
-static void bxt_enable_dsi_pll(struct intel_encoder *encoder)
+static void bxt_enable_dsi_pll(struct intel_encoder *encoder,
+                              const struct intel_crtc_state *config)
 {
        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
        struct intel_dsi *intel_dsi = enc_to_intel_dsi(&encoder->base);
@@ -452,23 +472,13 @@ static void bxt_enable_dsi_pll(struct intel_encoder *encoder)
 
        DRM_DEBUG_KMS("\n");
 
-       val = I915_READ(BXT_DSI_PLL_ENABLE);
-
-       if (val & BXT_DSI_PLL_DO_ENABLE) {
-               WARN(1, "DSI PLL already enabled. Disabling it.\n");
-               val &= ~BXT_DSI_PLL_DO_ENABLE;
-               I915_WRITE(BXT_DSI_PLL_ENABLE, val);
-       }
-
        /* Configure PLL vales */
-       if (!bxt_configure_dsi_pll(encoder)) {
-               DRM_ERROR("Configure DSI PLL failed, abort PLL enable\n");
-               return;
-       }
+       I915_WRITE(BXT_DSI_PLL_CTL, config->dsi_pll.ctrl);
+       POSTING_READ(BXT_DSI_PLL_CTL);
 
        /* Program TX, RX, Dphy clocks */
        for_each_dsi_port(port, intel_dsi->ports)
-               bxt_dsi_program_clocks(encoder->base.dev, port);
+               bxt_dsi_program_clocks(encoder->base.dev, port, config);
 
        /* Enable DSI PLL */
        val = I915_READ(BXT_DSI_PLL_ENABLE);
@@ -484,14 +494,38 @@ static void bxt_enable_dsi_pll(struct intel_encoder *encoder)
        DRM_DEBUG_KMS("DSI PLL locked\n");
 }
 
-void intel_enable_dsi_pll(struct intel_encoder *encoder)
+bool intel_dsi_pll_is_enabled(struct drm_i915_private *dev_priv)
+{
+       if (IS_BROXTON(dev_priv))
+               return bxt_dsi_pll_is_enabled(dev_priv);
+
+       MISSING_CASE(INTEL_DEVID(dev_priv));
+
+       return false;
+}
+
+int intel_compute_dsi_pll(struct intel_encoder *encoder,
+                         struct intel_crtc_state *config)
+{
+       struct drm_device *dev = encoder->base.dev;
+
+       if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
+               return vlv_compute_dsi_pll(encoder, config);
+       else if (IS_BROXTON(dev))
+               return bxt_compute_dsi_pll(encoder, config);
+
+       return -ENODEV;
+}
+
+void intel_enable_dsi_pll(struct intel_encoder *encoder,
+                         const struct intel_crtc_state *config)
 {
        struct drm_device *dev = encoder->base.dev;
 
        if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
-               vlv_enable_dsi_pll(encoder);
+               vlv_enable_dsi_pll(encoder, config);
        else if (IS_BROXTON(dev))
-               bxt_enable_dsi_pll(encoder);
+               bxt_enable_dsi_pll(encoder, config);
 }
 
 void intel_disable_dsi_pll(struct intel_encoder *encoder)
@@ -513,9 +547,9 @@ static void bxt_dsi_reset_clocks(struct intel_encoder *encoder, enum port port)
        /* Clear old configurations */
        tmp = I915_READ(BXT_MIPI_CLOCK_CTL);
        tmp &= ~(BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port));
-       tmp &= ~(BXT_MIPI_RX_ESCLK_FIXDIV_MASK(port));
-       tmp &= ~(BXT_MIPI_ESCLK_VAR_DIV_MASK(port));
-       tmp &= ~(BXT_MIPI_DPHY_DIVIDER_MASK(port));
+       tmp &= ~(BXT_MIPI_RX_ESCLK_UPPER_FIXDIV_MASK(port));
+       tmp &= ~(BXT_MIPI_8X_BY3_DIVIDER_MASK(port));
+       tmp &= ~(BXT_MIPI_RX_ESCLK_LOWER_FIXDIV_MASK(port));
        I915_WRITE(BXT_MIPI_CLOCK_CTL, tmp);
        I915_WRITE(MIPI_EOT_DISABLE(port), CLOCKSTOP);
 }
index 0f0492f4a35719c85f725d53efee0152024258af..d5a7cfec589b6f0c2e5b30f744eb7809ea2604a8 100644 (file)
@@ -506,6 +506,7 @@ static int find_compression_threshold(struct drm_i915_private *dev_priv,
                                      int size,
                                      int fb_cpp)
 {
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        int compression_threshold = 1;
        int ret;
        u64 end;
@@ -516,9 +517,9 @@ static int find_compression_threshold(struct drm_i915_private *dev_priv,
         * underruns, even if that range is not reserved by the BIOS. */
        if (IS_BROADWELL(dev_priv) ||
            IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
-               end = dev_priv->gtt.stolen_size - 8 * 1024 * 1024;
+               end = ggtt->stolen_size - 8 * 1024 * 1024;
        else
-               end = dev_priv->gtt.stolen_usable_size;
+               end = ggtt->stolen_usable_size;
 
        /* HACK: This code depends on what we will do in *_enable_fbc. If that
         * code changes, this code needs to change as well.
index 97a91e631915bfc721eddffd9518a4bdcdc2acf4..ab8d09a81f14130028c1c454ec5a9ccb15851851 100644 (file)
@@ -122,6 +122,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
        struct drm_framebuffer *fb;
        struct drm_device *dev = helper->dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_mode_fb_cmd2 mode_cmd = {};
        struct drm_i915_gem_object *obj = NULL;
        int size, ret;
@@ -146,7 +147,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
        /* If the FB is too big, just don't use it since fbdev is not very
         * important and we should probably use that space with FBC or other
         * features. */
-       if (size * 2 < dev_priv->gtt.stolen_usable_size)
+       if (size * 2 < ggtt->stolen_usable_size)
                obj = i915_gem_object_create_stolen(dev, size);
        if (obj == NULL)
                obj = i915_gem_alloc_object(dev, size);
@@ -181,7 +182,8 @@ static int intelfb_create(struct drm_fb_helper *helper,
                container_of(helper, struct intel_fbdev, helper);
        struct intel_framebuffer *intel_fb = ifbdev->fb;
        struct drm_device *dev = helper->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct fb_info *info;
        struct drm_framebuffer *fb;
        struct drm_i915_gem_object *obj;
@@ -220,7 +222,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
         * This also validates that any existing fb inherited from the
         * BIOS is suitable for own access.
         */
-       ret = intel_pin_and_fence_fb_obj(NULL, &ifbdev->fb->base, NULL);
+       ret = intel_pin_and_fence_fb_obj(&ifbdev->fb->base, BIT(DRM_ROTATE_0));
        if (ret)
                goto out_unlock;
 
@@ -244,13 +246,13 @@ static int intelfb_create(struct drm_fb_helper *helper,
 
        /* setup aperture base/size for vesafb takeover */
        info->apertures->ranges[0].base = dev->mode_config.fb_base;
-       info->apertures->ranges[0].size = dev_priv->gtt.mappable_end;
+       info->apertures->ranges[0].size = ggtt->mappable_end;
 
        info->fix.smem_start = dev->mode_config.fb_base + i915_gem_obj_ggtt_offset(obj);
        info->fix.smem_len = size;
 
        info->screen_base =
-               ioremap_wc(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
+               ioremap_wc(ggtt->mappable_base + i915_gem_obj_ggtt_offset(obj),
                           size);
        if (!info->screen_base) {
                DRM_ERROR("Failed to remap framebuffer into virtual memory\n");
@@ -366,12 +368,12 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,
        uint64_t conn_configured = 0, mask;
        int pass = 0;
 
-       save_enabled = kcalloc(dev->mode_config.num_connector, sizeof(bool),
+       save_enabled = kcalloc(fb_helper->connector_count, sizeof(bool),
                               GFP_KERNEL);
        if (!save_enabled)
                return false;
 
-       memcpy(save_enabled, enabled, dev->mode_config.num_connector);
+       memcpy(save_enabled, enabled, fb_helper->connector_count);
        mask = (1 << fb_helper->connector_count) - 1;
 retry:
        for (i = 0; i < fb_helper->connector_count; i++) {
@@ -379,6 +381,7 @@ retry:
                struct drm_connector *connector;
                struct drm_encoder *encoder;
                struct drm_fb_helper_crtc *new_crtc;
+               struct intel_crtc *intel_crtc;
 
                fb_conn = fb_helper->connector_info[i];
                connector = fb_conn->connector;
@@ -420,6 +423,13 @@ retry:
 
                num_connectors_enabled++;
 
+               intel_crtc = to_intel_crtc(connector->state->crtc);
+               for (j = 0; j < 256; j++) {
+                       intel_crtc->lut_r[j] = j;
+                       intel_crtc->lut_g[j] = j;
+                       intel_crtc->lut_b[j] = j;
+               }
+
                new_crtc = intel_fb_helper_crtc(fb_helper, connector->state->crtc);
 
                /*
@@ -510,7 +520,7 @@ retry:
        if (fallback) {
 bail:
                DRM_DEBUG_KMS("Not using firmware configuration\n");
-               memcpy(enabled, save_enabled, dev->mode_config.num_connector);
+               memcpy(enabled, save_enabled, fb_helper->connector_count);
                kfree(save_enabled);
                return false;
        }
index bda526660e20f673815a5e0d8cd3c4d2f36d1694..9be839a242f942752ea44c1278a036c0f94f9443 100644 (file)
@@ -212,7 +212,7 @@ static void cpt_check_pch_fifo_underruns(struct intel_crtc *crtc)
        I915_WRITE(SERR_INT, SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder));
        POSTING_READ(SERR_INT);
 
-       DRM_ERROR("pch fifo underrun on pch transcoder %c\n",
+       DRM_ERROR("pch fifo underrun on pch transcoder %s\n",
                  transcoder_name(pch_transcoder));
 }
 
@@ -235,7 +235,7 @@ static void cpt_set_fifo_underrun_reporting(struct drm_device *dev,
 
                if (old && I915_READ(SERR_INT) &
                    SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder)) {
-                       DRM_ERROR("uncleared pch fifo underrun on pch transcoder %c\n",
+                       DRM_ERROR("uncleared pch fifo underrun on pch transcoder %s\n",
                                  transcoder_name(pch_transcoder));
                }
        }
@@ -333,7 +333,7 @@ bool intel_set_pch_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
        old = !intel_crtc->pch_fifo_underrun_disabled;
        intel_crtc->pch_fifo_underrun_disabled = !enable;
 
-       if (HAS_PCH_IBX(dev_priv->dev))
+       if (HAS_PCH_IBX(dev_priv))
                ibx_set_fifo_underrun_reporting(dev_priv->dev, pch_transcoder,
                                                enable);
        else
@@ -363,7 +363,7 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
                return;
 
        /* GMCH can't disable fifo underruns, filter them. */
-       if (HAS_GMCH_DISPLAY(dev_priv->dev) &&
+       if (HAS_GMCH_DISPLAY(dev_priv) &&
            to_intel_crtc(crtc)->cpu_fifo_underrun_disabled)
                return;
 
@@ -386,7 +386,7 @@ void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
 {
        if (intel_set_pch_fifo_underrun_reporting(dev_priv, pch_transcoder,
                                                  false))
-               DRM_ERROR("PCH transcoder %c FIFO underrun\n",
+               DRM_ERROR("PCH transcoder %s FIFO underrun\n",
                          transcoder_name(pch_transcoder));
 }
 
index 73002e901ff219217bd5f17335583aa8504b2e1d..9d79c4c3e256d21fbecb579bd73ef86cf3f332d8 100644 (file)
 #include "intel_guc_fwif.h"
 #include "i915_guc_reg.h"
 
+struct drm_i915_gem_request;
+
+/*
+ * This structure primarily describes the GEM object shared with the GuC.
+ * The GEM object is held for the entire lifetime of our interaction with
+ * the GuC, being allocated before the GuC is loaded with its firmware.
+ * Because there's no way to update the address used by the GuC after
+ * initialisation, the shared object must stay pinned into the GGTT as
+ * long as the GuC is in use. We also keep the first page (only) mapped
+ * into kernel address space, as it includes shared data that must be
+ * updated on every request submission.
+ *
+ * The single GEM object described here is actually made up of several
+ * separate areas, as far as the GuC is concerned. The first page (kept
+ * kmap'd) includes the "process decriptor" which holds sequence data for
+ * the doorbell, and one cacheline which actually *is* the doorbell; a
+ * write to this will "ring the doorbell" (i.e. send an interrupt to the
+ * GuC). The subsequent  pages of the client object constitute the work
+ * queue (a circular array of work items), again described in the process
+ * descriptor. Work queue pages are mapped momentarily as required.
+ *
+ * Finally, we also keep a few statistics here, including the number of
+ * submissions to each engine, and a record of the last submission failure
+ * (if any).
+ */
 struct i915_guc_client {
        struct drm_i915_gem_object *client_obj;
+       void *client_base;              /* first page (only) of above   */
        struct intel_context *owner;
        struct intel_guc *guc;
        uint32_t priority;
@@ -43,13 +69,14 @@ struct i915_guc_client {
        uint32_t wq_offset;
        uint32_t wq_size;
        uint32_t wq_tail;
-       uint32_t wq_head;
+       uint32_t unused;                /* Was 'wq_head'                */
 
        /* GuC submission statistics & status */
        uint64_t submissions[GUC_MAX_ENGINES_NUM];
        uint32_t q_fail;
        uint32_t b_fail;
        int retcode;
+       int spare;                      /* pad to 32 DWords             */
 };
 
 enum intel_guc_fw_status {
index 82a3c03fbc0ea2948f6534648f7fc658857076df..876e5da44c4e01ec1cfe225f1b3bc8fc844a939e 100644 (file)
@@ -59,7 +59,7 @@
  *
  */
 
-#define I915_SKL_GUC_UCODE "i915/skl_guc_ver4.bin"
+#define I915_SKL_GUC_UCODE "i915/skl_guc_ver6.bin"
 MODULE_FIRMWARE(I915_SKL_GUC_UCODE);
 
 /* User-friendly representation of an enum */
@@ -81,14 +81,14 @@ const char *intel_guc_fw_status_repr(enum intel_guc_fw_status status)
 
 static void direct_interrupts_to_host(struct drm_i915_private *dev_priv)
 {
-       struct intel_engine_cs *ring;
-       int i, irqs;
+       struct intel_engine_cs *engine;
+       int irqs;
 
        /* tell all command streamers NOT to forward interrupts and vblank to GuC */
        irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_NEVER);
        irqs |= _MASKED_BIT_DISABLE(GFX_INTERRUPT_STEERING);
-       for_each_ring(ring, dev_priv, i)
-               I915_WRITE(RING_MODE_GEN7(ring), irqs);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MODE_GEN7(engine), irqs);
 
        /* route all GT interrupts to the host */
        I915_WRITE(GUC_BCS_RCS_IER, 0);
@@ -98,14 +98,14 @@ static void direct_interrupts_to_host(struct drm_i915_private *dev_priv)
 
 static void direct_interrupts_to_guc(struct drm_i915_private *dev_priv)
 {
-       struct intel_engine_cs *ring;
-       int i, irqs;
+       struct intel_engine_cs *engine;
+       int irqs;
 
        /* tell all command streamers to forward interrupts and vblank to GuC */
        irqs = _MASKED_FIELD(GFX_FORWARD_VBLANK_MASK, GFX_FORWARD_VBLANK_ALWAYS);
        irqs |= _MASKED_BIT_ENABLE(GFX_INTERRUPT_STEERING);
-       for_each_ring(ring, dev_priv, i)
-               I915_WRITE(RING_MODE_GEN7(ring), irqs);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MODE_GEN7(engine), irqs);
 
        /* route USER_INTERRUPT to Host, all others are sent to GuC. */
        irqs = GT_RENDER_USER_INTERRUPT << GEN8_RCS_IRQ_SHIFT |
@@ -353,6 +353,24 @@ static int guc_ucode_xfer(struct drm_i915_private *dev_priv)
        return ret;
 }
 
+static int i915_reset_guc(struct drm_i915_private *dev_priv)
+{
+       int ret;
+       u32 guc_status;
+
+       ret = intel_guc_reset(dev_priv);
+       if (ret) {
+               DRM_ERROR("GuC reset failed, ret = %d\n", ret);
+               return ret;
+       }
+
+       guc_status = I915_READ(GUC_STATUS);
+       WARN(!(guc_status & GS_MIA_IN_RESET),
+            "GuC status: 0x%x, MIA core expected to be in reset\n", guc_status);
+
+       return ret;
+}
+
 /**
  * intel_guc_ucode_load() - load GuC uCode into the device
  * @dev:       drm device
@@ -369,7 +387,7 @@ int intel_guc_ucode_load(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_guc_fw *guc_fw = &dev_priv->guc.guc_fw;
-       int err = 0;
+       int retries, err = 0;
 
        if (!i915.enable_guc_submission)
                return 0;
@@ -417,9 +435,33 @@ int intel_guc_ucode_load(struct drm_device *dev)
        if (err)
                goto fail;
 
-       err = guc_ucode_xfer(dev_priv);
-       if (err)
-               goto fail;
+       /*
+        * WaEnableuKernelHeaderValidFix:skl,bxt
+        * For BXT, this is only upto B0 but below WA is required for later
+        * steppings also so this is extended as well.
+        */
+       /* WaEnableGuCBootHashCheckNotSet:skl,bxt */
+       for (retries = 3; ; ) {
+               /*
+                * Always reset the GuC just before (re)loading, so
+                * that the state and timing are fairly predictable
+                */
+               err = i915_reset_guc(dev_priv);
+               if (err) {
+                       DRM_ERROR("GuC reset failed, err %d\n", err);
+                       goto fail;
+               }
+
+               err = guc_ucode_xfer(dev_priv);
+               if (!err)
+                       break;
+
+               if (--retries == 0)
+                       goto fail;
+
+               DRM_INFO("GuC fw load failed, err %d; will reset and "
+                       "retry %d more time(s)\n", err, retries);
+       }
 
        guc_fw->guc_fw_load_status = GUC_FIRMWARE_SUCCESS;
 
@@ -440,6 +482,7 @@ int intel_guc_ucode_load(struct drm_device *dev)
        return 0;
 
 fail:
+       DRM_ERROR("GuC firmware load failed, err %d\n", err);
        if (guc_fw->guc_fw_load_status == GUC_FIRMWARE_PENDING)
                guc_fw->guc_fw_load_status = GUC_FIRMWARE_FAIL;
 
@@ -595,8 +638,8 @@ void intel_guc_ucode_init(struct drm_device *dev)
                fw_path = NULL;
        } else if (IS_SKYLAKE(dev)) {
                fw_path = I915_SKL_GUC_UCODE;
-               guc_fw->guc_fw_major_wanted = 4;
-               guc_fw->guc_fw_minor_wanted = 3;
+               guc_fw->guc_fw_major_wanted = 6;
+               guc_fw->guc_fw_minor_wanted = 1;
        } else {
                i915.enable_guc_submission = false;
                fw_path = "";   /* unknown device */
index 1ab6f687f6408ff9d72956fec2ebee33640c1755..2cdab73046f8a8165a9e8e2965afd45501fbf65d 100644 (file)
@@ -638,7 +638,7 @@ static bool intel_hdmi_set_gcp_infoframe(struct drm_encoder *encoder)
                reg = HSW_TVIDEO_DIP_GCP(crtc->config->cpu_transcoder);
        else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
                reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
-       else if (HAS_PCH_SPLIT(dev_priv->dev))
+       else if (HAS_PCH_SPLIT(dev_priv))
                reg = TVIDEO_DIP_GCP(crtc->pipe);
        else
                return false;
@@ -952,9 +952,6 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
        if (pipe_config->pixel_multiplier)
                dotclock /= pipe_config->pixel_multiplier;
 
-       if (HAS_PCH_SPLIT(dev_priv->dev))
-               ironlake_check_encoder_dotclock(pipe_config, dotclock);
-
        pipe_config->base.adjusted_mode.crtc_clock = dotclock;
 }
 
index 52fbe530fc9eac207093271a05d44dbf3515e11c..81de23098be726adf14515720e40e0eee6ecb973 100644 (file)
@@ -124,7 +124,7 @@ static void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
        u32 val;
 
        /* When using bit bashing for I2C, this bit needs to be set to 1 */
-       if (!IS_PINEVIEW(dev_priv->dev))
+       if (!IS_PINEVIEW(dev_priv))
                return;
 
        val = I915_READ(DSPCLK_GATE_D);
@@ -264,7 +264,7 @@ gmbus_wait_hw_status(struct drm_i915_private *dev_priv,
        u32 gmbus2 = 0;
        DEFINE_WAIT(wait);
 
-       if (!HAS_GMBUS_IRQ(dev_priv->dev))
+       if (!HAS_GMBUS_IRQ(dev_priv))
                gmbus4_irq_en = 0;
 
        /* Important: The hw handles only the first bit, so set only one! Since
@@ -300,7 +300,7 @@ gmbus_wait_idle(struct drm_i915_private *dev_priv)
 
 #define C ((I915_READ_NOTRACE(GMBUS2) & GMBUS_ACTIVE) == 0)
 
-       if (!HAS_GMBUS_IRQ(dev_priv->dev))
+       if (!HAS_GMBUS_IRQ(dev_priv))
                return wait_for(C, 10);
 
        /* Important: The hw handles only the first bit, so set only one! */
@@ -571,15 +571,14 @@ clear_err:
        goto out;
 
 timeout:
-       DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
-                bus->adapter.name, bus->reg0 & 0xff);
+       DRM_DEBUG_KMS("GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
+                     bus->adapter.name, bus->reg0 & 0xff);
        I915_WRITE(GMBUS0, 0);
 
        /*
         * Hardware may not support GMBUS over these pins? Try GPIO bitbanging
         * instead. Use EAGAIN to have i2c core retry.
         */
-       bus->force_bit = 1;
        ret = -EAGAIN;
 
 out:
@@ -597,10 +596,15 @@ gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
        intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
        mutex_lock(&dev_priv->gmbus_mutex);
 
-       if (bus->force_bit)
+       if (bus->force_bit) {
                ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
-       else
+               if (ret < 0)
+                       bus->force_bit &= ~GMBUS_FORCE_BIT_RETRY;
+       } else {
                ret = do_gmbus_xfer(adapter, msgs, num);
+               if (ret == -EAGAIN)
+                       bus->force_bit |= GMBUS_FORCE_BIT_RETRY;
+       }
 
        mutex_unlock(&dev_priv->gmbus_mutex);
        intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS);
@@ -718,11 +722,16 @@ void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed)
 void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
 {
        struct intel_gmbus *bus = to_intel_gmbus(adapter);
+       struct drm_i915_private *dev_priv = bus->dev_priv;
+
+       mutex_lock(&dev_priv->gmbus_mutex);
 
        bus->force_bit += force_bit ? 1 : -1;
        DRM_DEBUG_KMS("%sabling bit-banging on %s. force bit now %d\n",
                      force_bit ? "en" : "dis", adapter->name,
                      bus->force_bit);
+
+       mutex_unlock(&dev_priv->gmbus_mutex);
 }
 
 void intel_teardown_gmbus(struct drm_device *dev)
index 5c6080fd09688aee82c24841fa9e4c114164f384..6179b591ee842b272007afcdc08430169493e683 100644 (file)
  * preemption, but just sampling the new tail pointer).
  *
  */
+#include <linux/interrupt.h>
 
 #include <drm/drmP.h>
 #include <drm/i915_drm.h>
@@ -228,9 +229,6 @@ enum {
 
 static int intel_lr_context_pin(struct intel_context *ctx,
                                struct intel_engine_cs *engine);
-static void lrc_setup_hardware_status_page(struct intel_engine_cs *ring,
-               struct drm_i915_gem_object *default_ctx_obj);
-
 
 /**
  * intel_sanitize_enable_execlists() - sanitize i915.enable_execlists
@@ -266,20 +264,23 @@ int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists
 }
 
 static void
-logical_ring_init_platform_invariants(struct intel_engine_cs *ring)
+logical_ring_init_platform_invariants(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
+
+       if (IS_GEN8(dev) || IS_GEN9(dev))
+               engine->idle_lite_restore_wa = ~0;
 
-       ring->disable_lite_restore_wa = (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
+       engine->disable_lite_restore_wa = (IS_SKL_REVID(dev, 0, SKL_REVID_B0) ||
                                        IS_BXT_REVID(dev, 0, BXT_REVID_A1)) &&
-                                       (ring->id == VCS || ring->id == VCS2);
+                                       (engine->id == VCS || engine->id == VCS2);
 
-       ring->ctx_desc_template = GEN8_CTX_VALID;
-       ring->ctx_desc_template |= GEN8_CTX_ADDRESSING_MODE(dev) <<
+       engine->ctx_desc_template = GEN8_CTX_VALID;
+       engine->ctx_desc_template |= GEN8_CTX_ADDRESSING_MODE(dev) <<
                                   GEN8_CTX_ADDRESSING_MODE_SHIFT;
        if (IS_GEN8(dev))
-               ring->ctx_desc_template |= GEN8_CTX_L3LLC_COHERENT;
-       ring->ctx_desc_template |= GEN8_CTX_PRIVILEGE;
+               engine->ctx_desc_template |= GEN8_CTX_L3LLC_COHERENT;
+       engine->ctx_desc_template |= GEN8_CTX_PRIVILEGE;
 
        /* TODO: WaDisableLiteRestore when we start using semaphore
         * signalling between Command Streamers */
@@ -287,8 +288,8 @@ logical_ring_init_platform_invariants(struct intel_engine_cs *ring)
 
        /* WaEnableForceRestoreInCtxtDescForVCS:skl */
        /* WaEnableForceRestoreInCtxtDescForVCS:bxt */
-       if (ring->disable_lite_restore_wa)
-               ring->ctx_desc_template |= GEN8_CTX_FORCE_RESTORE;
+       if (engine->disable_lite_restore_wa)
+               engine->ctx_desc_template |= GEN8_CTX_FORCE_RESTORE;
 }
 
 /**
@@ -311,24 +312,24 @@ logical_ring_init_platform_invariants(struct intel_engine_cs *ring)
  */
 static void
 intel_lr_context_descriptor_update(struct intel_context *ctx,
-                                  struct intel_engine_cs *ring)
+                                  struct intel_engine_cs *engine)
 {
        uint64_t lrca, desc;
 
-       lrca = ctx->engine[ring->id].lrc_vma->node.start +
+       lrca = ctx->engine[engine->id].lrc_vma->node.start +
               LRC_PPHWSP_PN * PAGE_SIZE;
 
-       desc = ring->ctx_desc_template;                    /* bits  0-11 */
+       desc = engine->ctx_desc_template;                          /* bits  0-11 */
        desc |= lrca;                                      /* bits 12-31 */
        desc |= (lrca >> PAGE_SHIFT) << GEN8_CTX_ID_SHIFT; /* bits 32-51 */
 
-       ctx->engine[ring->id].lrc_desc = desc;
+       ctx->engine[engine->id].lrc_desc = desc;
 }
 
 uint64_t intel_lr_context_descriptor(struct intel_context *ctx,
-                                    struct intel_engine_cs *ring)
+                                    struct intel_engine_cs *engine)
 {
-       return ctx->engine[ring->id].lrc_desc;
+       return ctx->engine[engine->id].lrc_desc;
 }
 
 /**
@@ -348,98 +349,103 @@ uint64_t intel_lr_context_descriptor(struct intel_context *ctx,
  * Return: 20-bits globally unique context ID.
  */
 u32 intel_execlists_ctx_id(struct intel_context *ctx,
-                          struct intel_engine_cs *ring)
+                          struct intel_engine_cs *engine)
 {
-       return intel_lr_context_descriptor(ctx, ring) >> GEN8_CTX_ID_SHIFT;
+       return intel_lr_context_descriptor(ctx, engine) >> GEN8_CTX_ID_SHIFT;
 }
 
 static void execlists_elsp_write(struct drm_i915_gem_request *rq0,
                                 struct drm_i915_gem_request *rq1)
 {
 
-       struct intel_engine_cs *ring = rq0->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = rq0->engine;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint64_t desc[2];
 
        if (rq1) {
-               desc[1] = intel_lr_context_descriptor(rq1->ctx, rq1->ring);
+               desc[1] = intel_lr_context_descriptor(rq1->ctx, rq1->engine);
                rq1->elsp_submitted++;
        } else {
                desc[1] = 0;
        }
 
-       desc[0] = intel_lr_context_descriptor(rq0->ctx, rq0->ring);
+       desc[0] = intel_lr_context_descriptor(rq0->ctx, rq0->engine);
        rq0->elsp_submitted++;
 
        /* You must always write both descriptors in the order below. */
-       spin_lock(&dev_priv->uncore.lock);
-       intel_uncore_forcewake_get__locked(dev_priv, FORCEWAKE_ALL);
-       I915_WRITE_FW(RING_ELSP(ring), upper_32_bits(desc[1]));
-       I915_WRITE_FW(RING_ELSP(ring), lower_32_bits(desc[1]));
+       I915_WRITE_FW(RING_ELSP(engine), upper_32_bits(desc[1]));
+       I915_WRITE_FW(RING_ELSP(engine), lower_32_bits(desc[1]));
 
-       I915_WRITE_FW(RING_ELSP(ring), upper_32_bits(desc[0]));
+       I915_WRITE_FW(RING_ELSP(engine), upper_32_bits(desc[0]));
        /* The context is automatically loaded after the following */
-       I915_WRITE_FW(RING_ELSP(ring), lower_32_bits(desc[0]));
+       I915_WRITE_FW(RING_ELSP(engine), lower_32_bits(desc[0]));
 
        /* ELSP is a wo register, use another nearby reg for posting */
-       POSTING_READ_FW(RING_EXECLIST_STATUS_LO(ring));
-       intel_uncore_forcewake_put__locked(dev_priv, FORCEWAKE_ALL);
-       spin_unlock(&dev_priv->uncore.lock);
+       POSTING_READ_FW(RING_EXECLIST_STATUS_LO(engine));
+}
+
+static void
+execlists_update_context_pdps(struct i915_hw_ppgtt *ppgtt, u32 *reg_state)
+{
+       ASSIGN_CTX_PDP(ppgtt, reg_state, 3);
+       ASSIGN_CTX_PDP(ppgtt, reg_state, 2);
+       ASSIGN_CTX_PDP(ppgtt, reg_state, 1);
+       ASSIGN_CTX_PDP(ppgtt, reg_state, 0);
 }
 
-static int execlists_update_context(struct drm_i915_gem_request *rq)
+static void execlists_update_context(struct drm_i915_gem_request *rq)
 {
-       struct intel_engine_cs *ring = rq->ring;
+       struct intel_engine_cs *engine = rq->engine;
        struct i915_hw_ppgtt *ppgtt = rq->ctx->ppgtt;
-       uint32_t *reg_state = rq->ctx->engine[ring->id].lrc_reg_state;
+       uint32_t *reg_state = rq->ctx->engine[engine->id].lrc_reg_state;
 
        reg_state[CTX_RING_TAIL+1] = rq->tail;
 
-       if (ppgtt && !USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
-               /* True 32b PPGTT with dynamic page allocation: update PDP
-                * registers and point the unallocated PDPs to scratch page.
-                * PML4 is allocated during ppgtt init, so this is not needed
-                * in 48-bit mode.
-                */
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 3);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 2);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 1);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 0);
-       }
-
-       return 0;
+       /* True 32b PPGTT with dynamic page allocation: update PDP
+        * registers and point the unallocated PDPs to scratch page.
+        * PML4 is allocated during ppgtt init, so this is not needed
+        * in 48-bit mode.
+        */
+       if (ppgtt && !USES_FULL_48BIT_PPGTT(ppgtt->base.dev))
+               execlists_update_context_pdps(ppgtt, reg_state);
 }
 
 static void execlists_submit_requests(struct drm_i915_gem_request *rq0,
                                      struct drm_i915_gem_request *rq1)
 {
+       struct drm_i915_private *dev_priv = rq0->i915;
+       unsigned int fw_domains = rq0->engine->fw_domains;
+
        execlists_update_context(rq0);
 
        if (rq1)
                execlists_update_context(rq1);
 
+       spin_lock_irq(&dev_priv->uncore.lock);
+       intel_uncore_forcewake_get__locked(dev_priv, fw_domains);
+
        execlists_elsp_write(rq0, rq1);
+
+       intel_uncore_forcewake_put__locked(dev_priv, fw_domains);
+       spin_unlock_irq(&dev_priv->uncore.lock);
 }
 
-static void execlists_context_unqueue(struct intel_engine_cs *ring)
+static void execlists_context_unqueue(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *req0 = NULL, *req1 = NULL;
-       struct drm_i915_gem_request *cursor = NULL, *tmp = NULL;
+       struct drm_i915_gem_request *cursor, *tmp;
 
-       assert_spin_locked(&ring->execlist_lock);
+       assert_spin_locked(&engine->execlist_lock);
 
        /*
         * If irqs are not active generate a warning as batches that finish
         * without the irqs may get lost and a GPU Hang may occur.
         */
-       WARN_ON(!intel_irqs_enabled(ring->dev->dev_private));
-
-       if (list_empty(&ring->execlist_queue))
-               return;
+       WARN_ON(!intel_irqs_enabled(engine->dev->dev_private));
 
        /* Try to read in pairs */
-       list_for_each_entry_safe(cursor, tmp, &ring->execlist_queue,
+       list_for_each_entry_safe(cursor, tmp, &engine->execlist_queue,
                                 execlist_link) {
                if (!req0) {
                        req0 = cursor;
@@ -448,172 +454,179 @@ static void execlists_context_unqueue(struct intel_engine_cs *ring)
                         * will update tail past first request's workload */
                        cursor->elsp_submitted = req0->elsp_submitted;
                        list_move_tail(&req0->execlist_link,
-                                      &ring->execlist_retired_req_list);
+                                      &engine->execlist_retired_req_list);
                        req0 = cursor;
                } else {
                        req1 = cursor;
+                       WARN_ON(req1->elsp_submitted);
                        break;
                }
        }
 
-       if (IS_GEN8(ring->dev) || IS_GEN9(ring->dev)) {
+       if (unlikely(!req0))
+               return;
+
+       if (req0->elsp_submitted & engine->idle_lite_restore_wa) {
                /*
-                * WaIdleLiteRestore: make sure we never cause a lite
-                * restore with HEAD==TAIL
+                * WaIdleLiteRestore: make sure we never cause a lite restore
+                * with HEAD==TAIL.
+                *
+                * Apply the wa NOOPS to prevent ring:HEAD == req:TAIL as we
+                * resubmit the request. See gen8_emit_request() for where we
+                * prepare the padding after the end of the request.
                 */
-               if (req0->elsp_submitted) {
-                       /*
-                        * Apply the wa NOOPS to prevent ring:HEAD == req:TAIL
-                        * as we resubmit the request. See gen8_emit_request()
-                        * for where we prepare the padding after the end of the
-                        * request.
-                        */
-                       struct intel_ringbuffer *ringbuf;
+               struct intel_ringbuffer *ringbuf;
 
-                       ringbuf = req0->ctx->engine[ring->id].ringbuf;
-                       req0->tail += 8;
-                       req0->tail &= ringbuf->size - 1;
-               }
+               ringbuf = req0->ctx->engine[engine->id].ringbuf;
+               req0->tail += 8;
+               req0->tail &= ringbuf->size - 1;
        }
 
-       WARN_ON(req1 && req1->elsp_submitted);
-
        execlists_submit_requests(req0, req1);
 }
 
-static bool execlists_check_remove_request(struct intel_engine_cs *ring,
-                                          u32 request_id)
+static unsigned int
+execlists_check_remove_request(struct intel_engine_cs *engine, u32 request_id)
 {
        struct drm_i915_gem_request *head_req;
 
-       assert_spin_locked(&ring->execlist_lock);
+       assert_spin_locked(&engine->execlist_lock);
 
-       head_req = list_first_entry_or_null(&ring->execlist_queue,
+       head_req = list_first_entry_or_null(&engine->execlist_queue,
                                            struct drm_i915_gem_request,
                                            execlist_link);
 
-       if (head_req != NULL) {
-               if (intel_execlists_ctx_id(head_req->ctx, ring) == request_id) {
-                       WARN(head_req->elsp_submitted == 0,
-                            "Never submitted head request\n");
+       if (!head_req)
+               return 0;
 
-                       if (--head_req->elsp_submitted <= 0) {
-                               list_move_tail(&head_req->execlist_link,
-                                              &ring->execlist_retired_req_list);
-                               return true;
-                       }
-               }
-       }
+       if (unlikely(intel_execlists_ctx_id(head_req->ctx, engine) != request_id))
+               return 0;
+
+       WARN(head_req->elsp_submitted == 0, "Never submitted head request\n");
+
+       if (--head_req->elsp_submitted > 0)
+               return 0;
+
+       list_move_tail(&head_req->execlist_link,
+                      &engine->execlist_retired_req_list);
 
-       return false;
+       return 1;
 }
 
-static void get_context_status(struct intel_engine_cs *ring,
-                              u8 read_pointer,
-                              u32 *status, u32 *context_id)
+static u32
+get_context_status(struct intel_engine_cs *engine, unsigned int read_pointer,
+                  u32 *context_id)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+       u32 status;
 
-       if (WARN_ON(read_pointer >= GEN8_CSB_ENTRIES))
-               return;
+       read_pointer %= GEN8_CSB_ENTRIES;
+
+       status = I915_READ_FW(RING_CONTEXT_STATUS_BUF_LO(engine, read_pointer));
+
+       if (status & GEN8_CTX_STATUS_IDLE_ACTIVE)
+               return 0;
+
+       *context_id = I915_READ_FW(RING_CONTEXT_STATUS_BUF_HI(engine,
+                                                             read_pointer));
 
-       *status = I915_READ(RING_CONTEXT_STATUS_BUF_LO(ring, read_pointer));
-       *context_id = I915_READ(RING_CONTEXT_STATUS_BUF_HI(ring, read_pointer));
+       return status;
 }
 
 /**
  * intel_lrc_irq_handler() - handle Context Switch interrupts
- * @ring: Engine Command Streamer to handle.
+ * @engine: Engine Command Streamer to handle.
  *
  * Check the unread Context Status Buffers and manage the submission of new
  * contexts to the ELSP accordingly.
  */
-void intel_lrc_irq_handler(struct intel_engine_cs *ring)
+static void intel_lrc_irq_handler(unsigned long data)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct intel_engine_cs *engine = (struct intel_engine_cs *)data;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        u32 status_pointer;
-       u8 read_pointer;
-       u8 write_pointer;
-       u32 status = 0;
-       u32 status_id;
-       u32 submit_contexts = 0;
+       unsigned int read_pointer, write_pointer;
+       u32 csb[GEN8_CSB_ENTRIES][2];
+       unsigned int csb_read = 0, i;
+       unsigned int submit_contexts = 0;
 
-       status_pointer = I915_READ(RING_CONTEXT_STATUS_PTR(ring));
+       intel_uncore_forcewake_get(dev_priv, engine->fw_domains);
 
-       read_pointer = ring->next_context_status_buffer;
+       status_pointer = I915_READ_FW(RING_CONTEXT_STATUS_PTR(engine));
+
+       read_pointer = engine->next_context_status_buffer;
        write_pointer = GEN8_CSB_WRITE_PTR(status_pointer);
        if (read_pointer > write_pointer)
                write_pointer += GEN8_CSB_ENTRIES;
 
-       spin_lock(&ring->execlist_lock);
-
        while (read_pointer < write_pointer) {
+               if (WARN_ON_ONCE(csb_read == GEN8_CSB_ENTRIES))
+                       break;
+               csb[csb_read][0] = get_context_status(engine, ++read_pointer,
+                                                     &csb[csb_read][1]);
+               csb_read++;
+       }
 
-               get_context_status(ring, ++read_pointer % GEN8_CSB_ENTRIES,
-                                  &status, &status_id);
+       engine->next_context_status_buffer = write_pointer % GEN8_CSB_ENTRIES;
 
-               if (status & GEN8_CTX_STATUS_IDLE_ACTIVE)
-                       continue;
+       /* Update the read pointer to the old write pointer. Manual ringbuffer
+        * management ftw </sarcasm> */
+       I915_WRITE_FW(RING_CONTEXT_STATUS_PTR(engine),
+                     _MASKED_FIELD(GEN8_CSB_READ_PTR_MASK,
+                                   engine->next_context_status_buffer << 8));
 
-               if (status & GEN8_CTX_STATUS_PREEMPTED) {
-                       if (status & GEN8_CTX_STATUS_LITE_RESTORE) {
-                               if (execlists_check_remove_request(ring, status_id))
+       intel_uncore_forcewake_put(dev_priv, engine->fw_domains);
+
+       spin_lock(&engine->execlist_lock);
+
+       for (i = 0; i < csb_read; i++) {
+               if (unlikely(csb[i][0] & GEN8_CTX_STATUS_PREEMPTED)) {
+                       if (csb[i][0] & GEN8_CTX_STATUS_LITE_RESTORE) {
+                               if (execlists_check_remove_request(engine, csb[i][1]))
                                        WARN(1, "Lite Restored request removed from queue\n");
                        } else
                                WARN(1, "Preemption without Lite Restore\n");
                }
 
-               if ((status & GEN8_CTX_STATUS_ACTIVE_IDLE) ||
-                   (status & GEN8_CTX_STATUS_ELEMENT_SWITCH)) {
-                       if (execlists_check_remove_request(ring, status_id))
-                               submit_contexts++;
-               }
+               if (csb[i][0] & (GEN8_CTX_STATUS_ACTIVE_IDLE |
+                   GEN8_CTX_STATUS_ELEMENT_SWITCH))
+                       submit_contexts +=
+                               execlists_check_remove_request(engine, csb[i][1]);
        }
 
-       if (ring->disable_lite_restore_wa) {
-               /* Prevent a ctx to preempt itself */
-               if ((status & GEN8_CTX_STATUS_ACTIVE_IDLE) &&
-                   (submit_contexts != 0))
-                       execlists_context_unqueue(ring);
-       } else if (submit_contexts != 0) {
-               execlists_context_unqueue(ring);
+       if (submit_contexts) {
+               if (!engine->disable_lite_restore_wa ||
+                   (csb[i][0] & GEN8_CTX_STATUS_ACTIVE_IDLE))
+                       execlists_context_unqueue(engine);
        }
 
-       spin_unlock(&ring->execlist_lock);
+       spin_unlock(&engine->execlist_lock);
 
        if (unlikely(submit_contexts > 2))
                DRM_ERROR("More than two context complete events?\n");
-
-       ring->next_context_status_buffer = write_pointer % GEN8_CSB_ENTRIES;
-
-       /* Update the read pointer to the old write pointer. Manual ringbuffer
-        * management ftw </sarcasm> */
-       I915_WRITE(RING_CONTEXT_STATUS_PTR(ring),
-                  _MASKED_FIELD(GEN8_CSB_READ_PTR_MASK,
-                                ring->next_context_status_buffer << 8));
 }
 
-static int execlists_context_queue(struct drm_i915_gem_request *request)
+static void execlists_context_queue(struct drm_i915_gem_request *request)
 {
-       struct intel_engine_cs *ring = request->ring;
+       struct intel_engine_cs *engine = request->engine;
        struct drm_i915_gem_request *cursor;
        int num_elements = 0;
 
        if (request->ctx != request->i915->kernel_context)
-               intel_lr_context_pin(request->ctx, ring);
+               intel_lr_context_pin(request->ctx, engine);
 
        i915_gem_request_reference(request);
 
-       spin_lock_irq(&ring->execlist_lock);
+       spin_lock_bh(&engine->execlist_lock);
 
-       list_for_each_entry(cursor, &ring->execlist_queue, execlist_link)
+       list_for_each_entry(cursor, &engine->execlist_queue, execlist_link)
                if (++num_elements > 2)
                        break;
 
        if (num_elements > 2) {
                struct drm_i915_gem_request *tail_req;
 
-               tail_req = list_last_entry(&ring->execlist_queue,
+               tail_req = list_last_entry(&engine->execlist_queue,
                                           struct drm_i915_gem_request,
                                           execlist_link);
 
@@ -621,41 +634,39 @@ static int execlists_context_queue(struct drm_i915_gem_request *request)
                        WARN(tail_req->elsp_submitted != 0,
                                "More than 2 already-submitted reqs queued\n");
                        list_move_tail(&tail_req->execlist_link,
-                                      &ring->execlist_retired_req_list);
+                                      &engine->execlist_retired_req_list);
                }
        }
 
-       list_add_tail(&request->execlist_link, &ring->execlist_queue);
+       list_add_tail(&request->execlist_link, &engine->execlist_queue);
        if (num_elements == 0)
-               execlists_context_unqueue(ring);
+               execlists_context_unqueue(engine);
 
-       spin_unlock_irq(&ring->execlist_lock);
-
-       return 0;
+       spin_unlock_bh(&engine->execlist_lock);
 }
 
 static int logical_ring_invalidate_all_caches(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        uint32_t flush_domains;
        int ret;
 
        flush_domains = 0;
-       if (ring->gpu_caches_dirty)
+       if (engine->gpu_caches_dirty)
                flush_domains = I915_GEM_GPU_DOMAINS;
 
-       ret = ring->emit_flush(req, I915_GEM_GPU_DOMAINS, flush_domains);
+       ret = engine->emit_flush(req, I915_GEM_GPU_DOMAINS, flush_domains);
        if (ret)
                return ret;
 
-       ring->gpu_caches_dirty = false;
+       engine->gpu_caches_dirty = false;
        return 0;
 }
 
 static int execlists_move_to_gpu(struct drm_i915_gem_request *req,
                                 struct list_head *vmas)
 {
-       const unsigned other_rings = ~intel_ring_flag(req->ring);
+       const unsigned other_rings = ~intel_engine_flag(req->engine);
        struct i915_vma *vma;
        uint32_t flush_domains = 0;
        bool flush_chipset = false;
@@ -665,7 +676,7 @@ static int execlists_move_to_gpu(struct drm_i915_gem_request *req,
                struct drm_i915_gem_object *obj = vma->obj;
 
                if (obj->active & other_rings) {
-                       ret = i915_gem_object_sync(obj, req->ring, &req);
+                       ret = i915_gem_object_sync(obj, req->engine, &req);
                        if (ret)
                                return ret;
                }
@@ -689,7 +700,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
 {
        int ret = 0;
 
-       request->ringbuf = request->ctx->engine[request->ring->id].ringbuf;
+       request->ringbuf = request->ctx->engine[request->engine->id].ringbuf;
 
        if (i915.enable_guc_submission) {
                /*
@@ -705,7 +716,7 @@ int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request
        }
 
        if (request->ctx != request->i915->kernel_context)
-               ret = intel_lr_context_pin(request->ctx, request->ring);
+               ret = intel_lr_context_pin(request->ctx, request->engine);
 
        return ret;
 }
@@ -714,7 +725,7 @@ static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
                                       int bytes)
 {
        struct intel_ringbuffer *ringbuf = req->ringbuf;
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct drm_i915_gem_request *target;
        unsigned space;
        int ret;
@@ -725,7 +736,7 @@ static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
        /* The whole point of reserving space is to not wait! */
        WARN_ON(ringbuf->reserved_in_use);
 
-       list_for_each_entry(target, &ring->request_list, list) {
+       list_for_each_entry(target, &engine->request_list, list) {
                /*
                 * The request queue is per-engine, so can contain requests
                 * from multiple ringbuffers. Here, we must ignore any that
@@ -741,7 +752,7 @@ static int logical_ring_wait_for_space(struct drm_i915_gem_request *req,
                        break;
        }
 
-       if (WARN_ON(&target->list == &ring->request_list))
+       if (WARN_ON(&target->list == &engine->request_list))
                return -ENOSPC;
 
        ret = i915_wait_request(target);
@@ -766,7 +777,7 @@ intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
 {
        struct intel_ringbuffer *ringbuf = request->ringbuf;
        struct drm_i915_private *dev_priv = request->i915;
-       struct intel_engine_cs *engine = request->ring;
+       struct intel_engine_cs *engine = request->engine;
 
        intel_logical_ring_advance(ringbuf);
        request->tail = ringbuf->tail;
@@ -781,7 +792,7 @@ intel_logical_ring_advance_and_submit(struct drm_i915_gem_request *request)
        intel_logical_ring_emit(ringbuf, MI_NOOP);
        intel_logical_ring_advance(ringbuf);
 
-       if (intel_ring_stopped(engine))
+       if (intel_engine_stopped(engine))
                return 0;
 
        if (engine->last_context != request->ctx) {
@@ -879,17 +890,8 @@ static int logical_ring_prepare(struct drm_i915_gem_request *req, int bytes)
  */
 int intel_logical_ring_begin(struct drm_i915_gem_request *req, int num_dwords)
 {
-       struct drm_i915_private *dev_priv;
        int ret;
 
-       WARN_ON(req == NULL);
-       dev_priv = req->ring->dev->dev_private;
-
-       ret = i915_gem_check_wedge(&dev_priv->gpu_error,
-                                  dev_priv->mm.interruptible);
-       if (ret)
-               return ret;
-
        ret = logical_ring_prepare(req, num_dwords * sizeof(uint32_t));
        if (ret)
                return ret;
@@ -935,9 +937,9 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
                               struct list_head *vmas)
 {
        struct drm_device       *dev = params->dev;
-       struct intel_engine_cs  *ring = params->ring;
+       struct intel_engine_cs *engine = params->engine;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_ringbuffer *ringbuf = params->ctx->engine[ring->id].ringbuf;
+       struct intel_ringbuffer *ringbuf = params->ctx->engine[engine->id].ringbuf;
        u64 exec_start;
        int instp_mode;
        u32 instp_mask;
@@ -949,7 +951,7 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
        case I915_EXEC_CONSTANTS_REL_GENERAL:
        case I915_EXEC_CONSTANTS_ABSOLUTE:
        case I915_EXEC_CONSTANTS_REL_SURFACE:
-               if (instp_mode != 0 && ring != &dev_priv->ring[RCS]) {
+               if (instp_mode != 0 && engine != &dev_priv->engine[RCS]) {
                        DRM_DEBUG("non-0 rel constants mode on non-RCS\n");
                        return -EINVAL;
                }
@@ -978,7 +980,7 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
        if (ret)
                return ret;
 
-       if (ring == &dev_priv->ring[RCS] &&
+       if (engine == &dev_priv->engine[RCS] &&
            instp_mode != dev_priv->relative_constants_mode) {
                ret = intel_logical_ring_begin(params->request, 4);
                if (ret)
@@ -996,116 +998,116 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
        exec_start = params->batch_obj_vm_offset +
                     args->batch_start_offset;
 
-       ret = ring->emit_bb_start(params->request, exec_start, params->dispatch_flags);
+       ret = engine->emit_bb_start(params->request, exec_start, params->dispatch_flags);
        if (ret)
                return ret;
 
        trace_i915_gem_ring_dispatch(params->request, params->dispatch_flags);
 
        i915_gem_execbuffer_move_to_active(vmas, params->request);
-       i915_gem_execbuffer_retire_commands(params);
 
        return 0;
 }
 
-void intel_execlists_retire_requests(struct intel_engine_cs *ring)
+void intel_execlists_retire_requests(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *req, *tmp;
        struct list_head retired_list;
 
-       WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex));
-       if (list_empty(&ring->execlist_retired_req_list))
+       WARN_ON(!mutex_is_locked(&engine->dev->struct_mutex));
+       if (list_empty(&engine->execlist_retired_req_list))
                return;
 
        INIT_LIST_HEAD(&retired_list);
-       spin_lock_irq(&ring->execlist_lock);
-       list_replace_init(&ring->execlist_retired_req_list, &retired_list);
-       spin_unlock_irq(&ring->execlist_lock);
+       spin_lock_bh(&engine->execlist_lock);
+       list_replace_init(&engine->execlist_retired_req_list, &retired_list);
+       spin_unlock_bh(&engine->execlist_lock);
 
        list_for_each_entry_safe(req, tmp, &retired_list, execlist_link) {
                struct intel_context *ctx = req->ctx;
                struct drm_i915_gem_object *ctx_obj =
-                               ctx->engine[ring->id].state;
+                               ctx->engine[engine->id].state;
 
                if (ctx_obj && (ctx != req->i915->kernel_context))
-                       intel_lr_context_unpin(ctx, ring);
+                       intel_lr_context_unpin(ctx, engine);
 
                list_del(&req->execlist_link);
                i915_gem_request_unreference(req);
        }
 }
 
-void intel_logical_ring_stop(struct intel_engine_cs *ring)
+void intel_logical_ring_stop(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        int ret;
 
-       if (!intel_ring_initialized(ring))
+       if (!intel_engine_initialized(engine))
                return;
 
-       ret = intel_ring_idle(ring);
-       if (ret && !i915_reset_in_progress(&to_i915(ring->dev)->gpu_error))
+       ret = intel_engine_idle(engine);
+       if (ret)
                DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
-                         ring->name, ret);
+                         engine->name, ret);
 
        /* TODO: Is this correct with Execlists enabled? */
-       I915_WRITE_MODE(ring, _MASKED_BIT_ENABLE(STOP_RING));
-       if (wait_for_atomic((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) {
-               DRM_ERROR("%s :timed out trying to stop ring\n", ring->name);
+       I915_WRITE_MODE(engine, _MASKED_BIT_ENABLE(STOP_RING));
+       if (wait_for((I915_READ_MODE(engine) & MODE_IDLE) != 0, 1000)) {
+               DRM_ERROR("%s :timed out trying to stop ring\n", engine->name);
                return;
        }
-       I915_WRITE_MODE(ring, _MASKED_BIT_DISABLE(STOP_RING));
+       I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));
 }
 
 int logical_ring_flush_all_caches(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
-       if (!ring->gpu_caches_dirty)
+       if (!engine->gpu_caches_dirty)
                return 0;
 
-       ret = ring->emit_flush(req, 0, I915_GEM_GPU_DOMAINS);
+       ret = engine->emit_flush(req, 0, I915_GEM_GPU_DOMAINS);
        if (ret)
                return ret;
 
-       ring->gpu_caches_dirty = false;
+       engine->gpu_caches_dirty = false;
        return 0;
 }
 
 static int intel_lr_context_do_pin(struct intel_context *ctx,
-                                  struct intel_engine_cs *ring)
+                                  struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_i915_gem_object *ctx_obj = ctx->engine[ring->id].state;
-       struct intel_ringbuffer *ringbuf = ctx->engine[ring->id].ringbuf;
-       struct page *lrc_state_page;
-       uint32_t *lrc_reg_state;
+       struct drm_i915_gem_object *ctx_obj = ctx->engine[engine->id].state;
+       struct intel_ringbuffer *ringbuf = ctx->engine[engine->id].ringbuf;
+       void *vaddr;
+       u32 *lrc_reg_state;
        int ret;
 
-       WARN_ON(!mutex_is_locked(&ring->dev->struct_mutex));
+       WARN_ON(!mutex_is_locked(&engine->dev->struct_mutex));
 
        ret = i915_gem_obj_ggtt_pin(ctx_obj, GEN8_LR_CONTEXT_ALIGN,
                        PIN_OFFSET_BIAS | GUC_WOPCM_TOP);
        if (ret)
                return ret;
 
-       lrc_state_page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN);
-       if (WARN_ON(!lrc_state_page)) {
-               ret = -ENODEV;
+       vaddr = i915_gem_object_pin_map(ctx_obj);
+       if (IS_ERR(vaddr)) {
+               ret = PTR_ERR(vaddr);
                goto unpin_ctx_obj;
        }
 
-       ret = intel_pin_and_map_ringbuffer_obj(ring->dev, ringbuf);
+       lrc_reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;
+
+       ret = intel_pin_and_map_ringbuffer_obj(engine->dev, ringbuf);
        if (ret)
-               goto unpin_ctx_obj;
+               goto unpin_map;
 
-       ctx->engine[ring->id].lrc_vma = i915_gem_obj_to_ggtt(ctx_obj);
-       intel_lr_context_descriptor_update(ctx, ring);
-       lrc_reg_state = kmap(lrc_state_page);
+       ctx->engine[engine->id].lrc_vma = i915_gem_obj_to_ggtt(ctx_obj);
+       intel_lr_context_descriptor_update(ctx, engine);
        lrc_reg_state[CTX_RING_BUFFER_START+1] = ringbuf->vma->node.start;
-       ctx->engine[ring->id].lrc_reg_state = lrc_reg_state;
+       ctx->engine[engine->id].lrc_reg_state = lrc_reg_state;
        ctx_obj->dirty = true;
 
        /* Invalidate GuC TLB. */
@@ -1114,6 +1116,8 @@ static int intel_lr_context_do_pin(struct intel_context *ctx,
 
        return ret;
 
+unpin_map:
+       i915_gem_object_unpin_map(ctx_obj);
 unpin_ctx_obj:
        i915_gem_object_ggtt_unpin(ctx_obj);
 
@@ -1146,7 +1150,7 @@ void intel_lr_context_unpin(struct intel_context *ctx,
 
        WARN_ON(!mutex_is_locked(&ctx->i915->dev->struct_mutex));
        if (--ctx->engine[engine->id].pin_count == 0) {
-               kunmap(kmap_to_page(ctx->engine[engine->id].lrc_reg_state));
+               i915_gem_object_unpin_map(ctx_obj);
                intel_unpin_ringbuffer_obj(ctx->engine[engine->id].ringbuf);
                i915_gem_object_ggtt_unpin(ctx_obj);
                ctx->engine[engine->id].lrc_vma = NULL;
@@ -1160,16 +1164,16 @@ void intel_lr_context_unpin(struct intel_context *ctx,
 static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req)
 {
        int ret, i;
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct intel_ringbuffer *ringbuf = req->ringbuf;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct i915_workarounds *w = &dev_priv->workarounds;
 
        if (w->count == 0)
                return 0;
 
-       ring->gpu_caches_dirty = true;
+       engine->gpu_caches_dirty = true;
        ret = logical_ring_flush_all_caches(req);
        if (ret)
                return ret;
@@ -1187,7 +1191,7 @@ static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req)
 
        intel_logical_ring_advance(ringbuf);
 
-       ring->gpu_caches_dirty = true;
+       engine->gpu_caches_dirty = true;
        ret = logical_ring_flush_all_caches(req);
        if (ret)
                return ret;
@@ -1223,7 +1227,7 @@ static int intel_logical_ring_workarounds_emit(struct drm_i915_gem_request *req)
  * This WA is also required for Gen9 so extracting as a function avoids
  * code duplication.
  */
-static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *ring,
+static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine,
                                                uint32_t *const batch,
                                                uint32_t index)
 {
@@ -1235,13 +1239,13 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *ring,
         * this batch updates GEN8_L3SQCREG4 with default value we need to
         * set this bit here to retain the WA during flush.
         */
-       if (IS_SKL_REVID(ring->dev, 0, SKL_REVID_E0))
+       if (IS_SKL_REVID(engine->dev, 0, SKL_REVID_E0))
                l3sqc4_flush |= GEN8_LQSC_RO_PERF_DIS;
 
        wa_ctx_emit(batch, index, (MI_STORE_REGISTER_MEM_GEN8 |
                                   MI_SRM_LRM_GLOBAL_GTT));
        wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4);
-       wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
+       wa_ctx_emit(batch, index, engine->scratch.gtt_offset + 256);
        wa_ctx_emit(batch, index, 0);
 
        wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(1));
@@ -1259,7 +1263,7 @@ static inline int gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *ring,
        wa_ctx_emit(batch, index, (MI_LOAD_REGISTER_MEM_GEN8 |
                                   MI_SRM_LRM_GLOBAL_GTT));
        wa_ctx_emit_reg(batch, index, GEN8_L3SQCREG4);
-       wa_ctx_emit(batch, index, ring->scratch.gtt_offset + 256);
+       wa_ctx_emit(batch, index, engine->scratch.gtt_offset + 256);
        wa_ctx_emit(batch, index, 0);
 
        return index;
@@ -1312,7 +1316,7 @@ static inline int wa_ctx_end(struct i915_wa_ctx_bb *wa_ctx,
  * Return: non-zero if we exceed the PAGE_SIZE limit.
  */
 
-static int gen8_init_indirectctx_bb(struct intel_engine_cs *ring,
+static int gen8_init_indirectctx_bb(struct intel_engine_cs *engine,
                                    struct i915_wa_ctx_bb *wa_ctx,
                                    uint32_t *const batch,
                                    uint32_t *offset)
@@ -1324,8 +1328,8 @@ static int gen8_init_indirectctx_bb(struct intel_engine_cs *ring,
        wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE);
 
        /* WaFlushCoherentL3CacheLinesAtContextSwitch:bdw */
-       if (IS_BROADWELL(ring->dev)) {
-               int rc = gen8_emit_flush_coherentl3_wa(ring, batch, index);
+       if (IS_BROADWELL(engine->dev)) {
+               int rc = gen8_emit_flush_coherentl3_wa(engine, batch, index);
                if (rc < 0)
                        return rc;
                index = rc;
@@ -1333,7 +1337,7 @@ static int gen8_init_indirectctx_bb(struct intel_engine_cs *ring,
 
        /* WaClearSlmSpaceAtContextSwitch:bdw,chv */
        /* Actual scratch location is at 128 bytes offset */
-       scratch_addr = ring->scratch.gtt_offset + 2*CACHELINE_BYTES;
+       scratch_addr = engine->scratch.gtt_offset + 2*CACHELINE_BYTES;
 
        wa_ctx_emit(batch, index, GFX_OP_PIPE_CONTROL(6));
        wa_ctx_emit(batch, index, (PIPE_CONTROL_FLUSH_L3 |
@@ -1375,7 +1379,7 @@ static int gen8_init_indirectctx_bb(struct intel_engine_cs *ring,
  *  This batch is terminated with MI_BATCH_BUFFER_END and so we need not add padding
  *  to align it with cacheline as padding after MI_BATCH_BUFFER_END is redundant.
  */
-static int gen8_init_perctx_bb(struct intel_engine_cs *ring,
+static int gen8_init_perctx_bb(struct intel_engine_cs *engine,
                               struct i915_wa_ctx_bb *wa_ctx,
                               uint32_t *const batch,
                               uint32_t *offset)
@@ -1390,13 +1394,13 @@ static int gen8_init_perctx_bb(struct intel_engine_cs *ring,
        return wa_ctx_end(wa_ctx, *offset = index, 1);
 }
 
-static int gen9_init_indirectctx_bb(struct intel_engine_cs *ring,
+static int gen9_init_indirectctx_bb(struct intel_engine_cs *engine,
                                    struct i915_wa_ctx_bb *wa_ctx,
                                    uint32_t *const batch,
                                    uint32_t *offset)
 {
        int ret;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
 
        /* WaDisableCtxRestoreArbitration:skl,bxt */
@@ -1405,7 +1409,7 @@ static int gen9_init_indirectctx_bb(struct intel_engine_cs *ring,
                wa_ctx_emit(batch, index, MI_ARB_ON_OFF | MI_ARB_DISABLE);
 
        /* WaFlushCoherentL3CacheLinesAtContextSwitch:skl,bxt */
-       ret = gen8_emit_flush_coherentl3_wa(ring, batch, index);
+       ret = gen8_emit_flush_coherentl3_wa(engine, batch, index);
        if (ret < 0)
                return ret;
        index = ret;
@@ -1417,12 +1421,12 @@ static int gen9_init_indirectctx_bb(struct intel_engine_cs *ring,
        return wa_ctx_end(wa_ctx, *offset = index, CACHELINE_DWORDS);
 }
 
-static int gen9_init_perctx_bb(struct intel_engine_cs *ring,
+static int gen9_init_perctx_bb(struct intel_engine_cs *engine,
                               struct i915_wa_ctx_bb *wa_ctx,
                               uint32_t *const batch,
                               uint32_t *offset)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        uint32_t index = wa_ctx_start(wa_ctx, *offset, CACHELINE_DWORDS);
 
        /* WaSetDisablePixMaskCammingAndRhwoInCommonSliceChicken:skl,bxt */
@@ -1435,6 +1439,25 @@ static int gen9_init_perctx_bb(struct intel_engine_cs *ring,
                wa_ctx_emit(batch, index, MI_NOOP);
        }
 
+       /* WaClearTdlStateAckDirtyBits:bxt */
+       if (IS_BXT_REVID(dev, 0, BXT_REVID_B0)) {
+               wa_ctx_emit(batch, index, MI_LOAD_REGISTER_IMM(4));
+
+               wa_ctx_emit_reg(batch, index, GEN8_STATE_ACK);
+               wa_ctx_emit(batch, index, _MASKED_BIT_DISABLE(GEN9_SUBSLICE_TDL_ACK_BITS));
+
+               wa_ctx_emit_reg(batch, index, GEN9_STATE_ACK_SLICE1);
+               wa_ctx_emit(batch, index, _MASKED_BIT_DISABLE(GEN9_SUBSLICE_TDL_ACK_BITS));
+
+               wa_ctx_emit_reg(batch, index, GEN9_STATE_ACK_SLICE2);
+               wa_ctx_emit(batch, index, _MASKED_BIT_DISABLE(GEN9_SUBSLICE_TDL_ACK_BITS));
+
+               wa_ctx_emit_reg(batch, index, GEN7_ROW_CHICKEN2);
+               /* dummy write to CS, mask bits are 0 to ensure the register is not modified */
+               wa_ctx_emit(batch, index, 0x0);
+               wa_ctx_emit(batch, index, MI_NOOP);
+       }
+
        /* WaDisableCtxRestoreArbitration:skl,bxt */
        if (IS_SKL_REVID(dev, 0, SKL_REVID_D0) ||
            IS_BXT_REVID(dev, 0, BXT_REVID_A1))
@@ -1445,60 +1468,61 @@ static int gen9_init_perctx_bb(struct intel_engine_cs *ring,
        return wa_ctx_end(wa_ctx, *offset = index, 1);
 }
 
-static int lrc_setup_wa_ctx_obj(struct intel_engine_cs *ring, u32 size)
+static int lrc_setup_wa_ctx_obj(struct intel_engine_cs *engine, u32 size)
 {
        int ret;
 
-       ring->wa_ctx.obj = i915_gem_alloc_object(ring->dev, PAGE_ALIGN(size));
-       if (!ring->wa_ctx.obj) {
+       engine->wa_ctx.obj = i915_gem_alloc_object(engine->dev,
+                                                  PAGE_ALIGN(size));
+       if (!engine->wa_ctx.obj) {
                DRM_DEBUG_DRIVER("alloc LRC WA ctx backing obj failed.\n");
                return -ENOMEM;
        }
 
-       ret = i915_gem_obj_ggtt_pin(ring->wa_ctx.obj, PAGE_SIZE, 0);
+       ret = i915_gem_obj_ggtt_pin(engine->wa_ctx.obj, PAGE_SIZE, 0);
        if (ret) {
                DRM_DEBUG_DRIVER("pin LRC WA ctx backing obj failed: %d\n",
                                 ret);
-               drm_gem_object_unreference(&ring->wa_ctx.obj->base);
+               drm_gem_object_unreference(&engine->wa_ctx.obj->base);
                return ret;
        }
 
        return 0;
 }
 
-static void lrc_destroy_wa_ctx_obj(struct intel_engine_cs *ring)
+static void lrc_destroy_wa_ctx_obj(struct intel_engine_cs *engine)
 {
-       if (ring->wa_ctx.obj) {
-               i915_gem_object_ggtt_unpin(ring->wa_ctx.obj);
-               drm_gem_object_unreference(&ring->wa_ctx.obj->base);
-               ring->wa_ctx.obj = NULL;
+       if (engine->wa_ctx.obj) {
+               i915_gem_object_ggtt_unpin(engine->wa_ctx.obj);
+               drm_gem_object_unreference(&engine->wa_ctx.obj->base);
+               engine->wa_ctx.obj = NULL;
        }
 }
 
-static int intel_init_workaround_bb(struct intel_engine_cs *ring)
+static int intel_init_workaround_bb(struct intel_engine_cs *engine)
 {
        int ret;
        uint32_t *batch;
        uint32_t offset;
        struct page *page;
-       struct i915_ctx_workarounds *wa_ctx = &ring->wa_ctx;
+       struct i915_ctx_workarounds *wa_ctx = &engine->wa_ctx;
 
-       WARN_ON(ring->id != RCS);
+       WARN_ON(engine->id != RCS);
 
        /* update this when WA for higher Gen are added */
-       if (INTEL_INFO(ring->dev)->gen > 9) {
+       if (INTEL_INFO(engine->dev)->gen > 9) {
                DRM_ERROR("WA batch buffer is not initialized for Gen%d\n",
-                         INTEL_INFO(ring->dev)->gen);
+                         INTEL_INFO(engine->dev)->gen);
                return 0;
        }
 
        /* some WA perform writes to scratch page, ensure it is valid */
-       if (ring->scratch.obj == NULL) {
-               DRM_ERROR("scratch page not allocated for %s\n", ring->name);
+       if (engine->scratch.obj == NULL) {
+               DRM_ERROR("scratch page not allocated for %s\n", engine->name);
                return -EINVAL;
        }
 
-       ret = lrc_setup_wa_ctx_obj(ring, PAGE_SIZE);
+       ret = lrc_setup_wa_ctx_obj(engine, PAGE_SIZE);
        if (ret) {
                DRM_DEBUG_DRIVER("Failed to setup context WA page: %d\n", ret);
                return ret;
@@ -1508,29 +1532,29 @@ static int intel_init_workaround_bb(struct intel_engine_cs *ring)
        batch = kmap_atomic(page);
        offset = 0;
 
-       if (INTEL_INFO(ring->dev)->gen == 8) {
-               ret = gen8_init_indirectctx_bb(ring,
+       if (INTEL_INFO(engine->dev)->gen == 8) {
+               ret = gen8_init_indirectctx_bb(engine,
                                               &wa_ctx->indirect_ctx,
                                               batch,
                                               &offset);
                if (ret)
                        goto out;
 
-               ret = gen8_init_perctx_bb(ring,
+               ret = gen8_init_perctx_bb(engine,
                                          &wa_ctx->per_ctx,
                                          batch,
                                          &offset);
                if (ret)
                        goto out;
-       } else if (INTEL_INFO(ring->dev)->gen == 9) {
-               ret = gen9_init_indirectctx_bb(ring,
+       } else if (INTEL_INFO(engine->dev)->gen == 9) {
+               ret = gen9_init_indirectctx_bb(engine,
                                               &wa_ctx->indirect_ctx,
                                               batch,
                                               &offset);
                if (ret)
                        goto out;
 
-               ret = gen9_init_perctx_bb(ring,
+               ret = gen9_init_perctx_bb(engine,
                                          &wa_ctx->per_ctx,
                                          batch,
                                          &offset);
@@ -1541,27 +1565,36 @@ static int intel_init_workaround_bb(struct intel_engine_cs *ring)
 out:
        kunmap_atomic(batch);
        if (ret)
-               lrc_destroy_wa_ctx_obj(ring);
+               lrc_destroy_wa_ctx_obj(engine);
 
        return ret;
 }
 
-static int gen8_init_common_ring(struct intel_engine_cs *ring)
+static void lrc_init_hws(struct intel_engine_cs *engine)
+{
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+
+       I915_WRITE(RING_HWS_PGA(engine->mmio_base),
+                  (u32)engine->status_page.gfx_addr);
+       POSTING_READ(RING_HWS_PGA(engine->mmio_base));
+}
+
+static int gen8_init_common_ring(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       u8 next_context_status_buffer_hw;
+       unsigned int next_context_status_buffer_hw;
 
-       lrc_setup_hardware_status_page(ring,
-                               dev_priv->kernel_context->engine[ring->id].state);
+       lrc_init_hws(engine);
 
-       I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask));
-       I915_WRITE(RING_HWSTAM(ring->mmio_base), 0xffffffff);
+       I915_WRITE_IMR(engine,
+                      ~(engine->irq_enable_mask | engine->irq_keep_mask));
+       I915_WRITE(RING_HWSTAM(engine->mmio_base), 0xffffffff);
 
-       I915_WRITE(RING_MODE_GEN7(ring),
+       I915_WRITE(RING_MODE_GEN7(engine),
                   _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) |
                   _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE));
-       POSTING_READ(RING_MODE_GEN7(ring));
+       POSTING_READ(RING_MODE_GEN7(engine));
 
        /*
         * Instead of resetting the Context Status Buffer (CSB) read pointer to
@@ -1576,7 +1609,7 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring)
         * BXT  |         ?                |         ?            |
         */
        next_context_status_buffer_hw =
-               GEN8_CSB_WRITE_PTR(I915_READ(RING_CONTEXT_STATUS_PTR(ring)));
+               GEN8_CSB_WRITE_PTR(I915_READ(RING_CONTEXT_STATUS_PTR(engine)));
 
        /*
         * When the CSB registers are reset (also after power-up / gpu reset),
@@ -1586,21 +1619,21 @@ static int gen8_init_common_ring(struct intel_engine_cs *ring)
        if (next_context_status_buffer_hw == GEN8_CSB_PTR_MASK)
                next_context_status_buffer_hw = (GEN8_CSB_ENTRIES - 1);
 
-       ring->next_context_status_buffer = next_context_status_buffer_hw;
-       DRM_DEBUG_DRIVER("Execlists enabled for %s\n", ring->name);
+       engine->next_context_status_buffer = next_context_status_buffer_hw;
+       DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name);
 
-       memset(&ring->hangcheck, 0, sizeof(ring->hangcheck));
+       intel_engine_init_hangcheck(engine);
 
-       return 0;
+       return intel_mocs_init_engine(engine);
 }
 
-static int gen8_init_render_ring(struct intel_engine_cs *ring)
+static int gen8_init_render_ring(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       ret = gen8_init_common_ring(ring);
+       ret = gen8_init_common_ring(engine);
        if (ret)
                return ret;
 
@@ -1614,24 +1647,24 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
 
        I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_FORCE_ORDERING));
 
-       return init_workarounds_ring(ring);
+       return init_workarounds_ring(engine);
 }
 
-static int gen9_init_render_ring(struct intel_engine_cs *ring)
+static int gen9_init_render_ring(struct intel_engine_cs *engine)
 {
        int ret;
 
-       ret = gen8_init_common_ring(ring);
+       ret = gen8_init_common_ring(engine);
        if (ret)
                return ret;
 
-       return init_workarounds_ring(ring);
+       return init_workarounds_ring(engine);
 }
 
 static int intel_logical_ring_emit_pdps(struct drm_i915_gem_request *req)
 {
        struct i915_hw_ppgtt *ppgtt = req->ctx->ppgtt;
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        struct intel_ringbuffer *ringbuf = req->ringbuf;
        const int num_lri_cmds = GEN8_LEGACY_PDPES * 2;
        int i, ret;
@@ -1644,9 +1677,11 @@ static int intel_logical_ring_emit_pdps(struct drm_i915_gem_request *req)
        for (i = GEN8_LEGACY_PDPES - 1; i >= 0; i--) {
                const dma_addr_t pd_daddr = i915_page_dir_dma_addr(ppgtt, i);
 
-               intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_UDW(ring, i));
+               intel_logical_ring_emit_reg(ringbuf,
+                                           GEN8_RING_PDP_UDW(engine, i));
                intel_logical_ring_emit(ringbuf, upper_32_bits(pd_daddr));
-               intel_logical_ring_emit_reg(ringbuf, GEN8_RING_PDP_LDW(ring, i));
+               intel_logical_ring_emit_reg(ringbuf,
+                                           GEN8_RING_PDP_LDW(engine, i));
                intel_logical_ring_emit(ringbuf, lower_32_bits(pd_daddr));
        }
 
@@ -1670,7 +1705,7 @@ static int gen8_emit_bb_start(struct drm_i915_gem_request *req,
         * not idle). PML4 is allocated during ppgtt init so this is
         * not needed in 48-bit.*/
        if (req->ctx->ppgtt &&
-           (intel_ring_flag(req->ring) & req->ctx->ppgtt->pd_dirty_rings)) {
+           (intel_engine_flag(req->engine) & req->ctx->ppgtt->pd_dirty_rings)) {
                if (!USES_FULL_48BIT_PPGTT(req->i915) &&
                    !intel_vgpu_active(req->i915->dev)) {
                        ret = intel_logical_ring_emit_pdps(req);
@@ -1678,7 +1713,7 @@ static int gen8_emit_bb_start(struct drm_i915_gem_request *req,
                                return ret;
                }
 
-               req->ctx->ppgtt->pd_dirty_rings &= ~intel_ring_flag(req->ring);
+               req->ctx->ppgtt->pd_dirty_rings &= ~intel_engine_flag(req->engine);
        }
 
        ret = intel_logical_ring_begin(req, 4);
@@ -1698,9 +1733,9 @@ static int gen8_emit_bb_start(struct drm_i915_gem_request *req,
        return 0;
 }
 
-static bool gen8_logical_ring_get_irq(struct intel_engine_cs *ring)
+static bool gen8_logical_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1708,25 +1743,26 @@ static bool gen8_logical_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               I915_WRITE_IMR(ring, ~(ring->irq_enable_mask | ring->irq_keep_mask));
-               POSTING_READ(RING_IMR(ring->mmio_base));
+       if (engine->irq_refcount++ == 0) {
+               I915_WRITE_IMR(engine,
+                              ~(engine->irq_enable_mask | engine->irq_keep_mask));
+               POSTING_READ(RING_IMR(engine->mmio_base));
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
        return true;
 }
 
-static void gen8_logical_ring_put_irq(struct intel_engine_cs *ring)
+static void gen8_logical_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               I915_WRITE_IMR(ring, ~ring->irq_keep_mask);
-               POSTING_READ(RING_IMR(ring->mmio_base));
+       if (--engine->irq_refcount == 0) {
+               I915_WRITE_IMR(engine, ~engine->irq_keep_mask);
+               POSTING_READ(RING_IMR(engine->mmio_base));
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
@@ -1736,8 +1772,8 @@ static int gen8_emit_flush(struct drm_i915_gem_request *request,
                           u32 unused)
 {
        struct intel_ringbuffer *ringbuf = request->ringbuf;
-       struct intel_engine_cs *ring = ringbuf->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = ringbuf->engine;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t cmd;
        int ret;
@@ -1757,7 +1793,7 @@ static int gen8_emit_flush(struct drm_i915_gem_request *request,
 
        if (invalidate_domains & I915_GEM_GPU_DOMAINS) {
                cmd |= MI_INVALIDATE_TLB;
-               if (ring == &dev_priv->ring[VCS])
+               if (engine == &dev_priv->engine[VCS])
                        cmd |= MI_INVALIDATE_BSD;
        }
 
@@ -1777,8 +1813,8 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
                                  u32 flush_domains)
 {
        struct intel_ringbuffer *ringbuf = request->ringbuf;
-       struct intel_engine_cs *ring = ringbuf->ring;
-       u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       struct intel_engine_cs *engine = ringbuf->engine;
+       u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        bool vf_flush_wa = false;
        u32 flags = 0;
        int ret;
@@ -1806,7 +1842,7 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
                 * On GEN9: before VF_CACHE_INVALIDATE we need to emit a NULL
                 * pipe control.
                 */
-               if (IS_GEN9(ring->dev))
+               if (IS_GEN9(engine->dev))
                        vf_flush_wa = true;
        }
 
@@ -1834,19 +1870,18 @@ static int gen8_emit_flush_render(struct drm_i915_gem_request *request,
        return 0;
 }
 
-static u32 gen8_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
+static u32 gen8_get_seqno(struct intel_engine_cs *engine)
 {
-       return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
+       return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
 }
 
-static void gen8_set_seqno(struct intel_engine_cs *ring, u32 seqno)
+static void gen8_set_seqno(struct intel_engine_cs *engine, u32 seqno)
 {
-       intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno);
+       intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
 }
 
-static u32 bxt_a_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
+static void bxt_a_seqno_barrier(struct intel_engine_cs *engine)
 {
-
        /*
         * On BXT A steppings there is a HW coherency issue whereby the
         * MI_STORE_DATA_IMM storing the completed request's seqno
@@ -1857,19 +1892,15 @@ static u32 bxt_a_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
         * bxt_a_set_seqno(), where we also do a clflush after the write. So
         * this clflush in practice becomes an invalidate operation.
         */
-
-       if (!lazy_coherency)
-               intel_flush_status_page(ring, I915_GEM_HWS_INDEX);
-
-       return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
+       intel_flush_status_page(engine, I915_GEM_HWS_INDEX);
 }
 
-static void bxt_a_set_seqno(struct intel_engine_cs *ring, u32 seqno)
+static void bxt_a_set_seqno(struct intel_engine_cs *engine, u32 seqno)
 {
-       intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno);
+       intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
 
        /* See bxt_a_get_seqno() explaining the reason for the clflush. */
-       intel_flush_status_page(ring, I915_GEM_HWS_INDEX);
+       intel_flush_status_page(engine, I915_GEM_HWS_INDEX);
 }
 
 /*
@@ -1899,7 +1930,7 @@ static int gen8_emit_request(struct drm_i915_gem_request *request)
        intel_logical_ring_emit(ringbuf,
                                (MI_FLUSH_DW + 1) | MI_FLUSH_DW_OP_STOREDW);
        intel_logical_ring_emit(ringbuf,
-                               hws_seqno_address(request->ring) |
+                               hws_seqno_address(request->engine) |
                                MI_FLUSH_DW_USE_GTT);
        intel_logical_ring_emit(ringbuf, 0);
        intel_logical_ring_emit(ringbuf, i915_gem_request_get_seqno(request));
@@ -1929,7 +1960,7 @@ static int gen8_emit_request_render(struct drm_i915_gem_request *request)
                                (PIPE_CONTROL_GLOBAL_GTT_IVB |
                                 PIPE_CONTROL_CS_STALL |
                                 PIPE_CONTROL_QW_WRITE));
-       intel_logical_ring_emit(ringbuf, hws_seqno_address(request->ring));
+       intel_logical_ring_emit(ringbuf, hws_seqno_address(request->engine));
        intel_logical_ring_emit(ringbuf, 0);
        intel_logical_ring_emit(ringbuf, i915_gem_request_get_seqno(request));
        /* We're thrashing one dword of HWS. */
@@ -1944,19 +1975,19 @@ static int intel_lr_context_render_state_init(struct drm_i915_gem_request *req)
        struct render_state so;
        int ret;
 
-       ret = i915_gem_render_state_prepare(req->ring, &so);
+       ret = i915_gem_render_state_prepare(req->engine, &so);
        if (ret)
                return ret;
 
        if (so.rodata == NULL)
                return 0;
 
-       ret = req->ring->emit_bb_start(req, so.ggtt_offset,
+       ret = req->engine->emit_bb_start(req, so.ggtt_offset,
                                       I915_DISPATCH_SECURE);
        if (ret)
                goto out;
 
-       ret = req->ring->emit_bb_start(req,
+       ret = req->engine->emit_bb_start(req,
                                       (so.ggtt_offset + so.aux_batch_offset),
                                       I915_DISPATCH_SECURE);
        if (ret)
@@ -1994,146 +2025,197 @@ static int gen8_init_rcs_context(struct drm_i915_gem_request *req)
  * @ring: Engine Command Streamer.
  *
  */
-void intel_logical_ring_cleanup(struct intel_engine_cs *ring)
+void intel_logical_ring_cleanup(struct intel_engine_cs *engine)
 {
        struct drm_i915_private *dev_priv;
 
-       if (!intel_ring_initialized(ring))
+       if (!intel_engine_initialized(engine))
                return;
 
-       dev_priv = ring->dev->dev_private;
+       /*
+        * Tasklet cannot be active at this point due intel_mark_active/idle
+        * so this is just for documentation.
+        */
+       if (WARN_ON(test_bit(TASKLET_STATE_SCHED, &engine->irq_tasklet.state)))
+               tasklet_kill(&engine->irq_tasklet);
+
+       dev_priv = engine->dev->dev_private;
 
-       if (ring->buffer) {
-               intel_logical_ring_stop(ring);
-               WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0);
+       if (engine->buffer) {
+               intel_logical_ring_stop(engine);
+               WARN_ON((I915_READ_MODE(engine) & MODE_IDLE) == 0);
        }
 
-       if (ring->cleanup)
-               ring->cleanup(ring);
+       if (engine->cleanup)
+               engine->cleanup(engine);
 
-       i915_cmd_parser_fini_ring(ring);
-       i915_gem_batch_pool_fini(&ring->batch_pool);
+       i915_cmd_parser_fini_ring(engine);
+       i915_gem_batch_pool_fini(&engine->batch_pool);
 
-       if (ring->status_page.obj) {
-               kunmap(sg_page(ring->status_page.obj->pages->sgl));
-               ring->status_page.obj = NULL;
+       if (engine->status_page.obj) {
+               i915_gem_object_unpin_map(engine->status_page.obj);
+               engine->status_page.obj = NULL;
        }
 
-       ring->disable_lite_restore_wa = false;
-       ring->ctx_desc_template = 0;
+       engine->idle_lite_restore_wa = 0;
+       engine->disable_lite_restore_wa = false;
+       engine->ctx_desc_template = 0;
 
-       lrc_destroy_wa_ctx_obj(ring);
-       ring->dev = NULL;
+       lrc_destroy_wa_ctx_obj(engine);
+       engine->dev = NULL;
 }
 
 static void
 logical_ring_default_vfuncs(struct drm_device *dev,
-                           struct intel_engine_cs *ring)
+                           struct intel_engine_cs *engine)
 {
        /* Default vfuncs which can be overriden by each engine. */
-       ring->init_hw = gen8_init_common_ring;
-       ring->emit_request = gen8_emit_request;
-       ring->emit_flush = gen8_emit_flush;
-       ring->irq_get = gen8_logical_ring_get_irq;
-       ring->irq_put = gen8_logical_ring_put_irq;
-       ring->emit_bb_start = gen8_emit_bb_start;
+       engine->init_hw = gen8_init_common_ring;
+       engine->emit_request = gen8_emit_request;
+       engine->emit_flush = gen8_emit_flush;
+       engine->irq_get = gen8_logical_ring_get_irq;
+       engine->irq_put = gen8_logical_ring_put_irq;
+       engine->emit_bb_start = gen8_emit_bb_start;
+       engine->get_seqno = gen8_get_seqno;
+       engine->set_seqno = gen8_set_seqno;
        if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
-               ring->get_seqno = bxt_a_get_seqno;
-               ring->set_seqno = bxt_a_set_seqno;
-       } else {
-               ring->get_seqno = gen8_get_seqno;
-               ring->set_seqno = gen8_set_seqno;
+               engine->irq_seqno_barrier = bxt_a_seqno_barrier;
+               engine->set_seqno = bxt_a_set_seqno;
        }
 }
 
 static inline void
-logical_ring_default_irqs(struct intel_engine_cs *ring, unsigned shift)
+logical_ring_default_irqs(struct intel_engine_cs *engine, unsigned shift)
 {
-       ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT << shift;
-       ring->irq_keep_mask = GT_CONTEXT_SWITCH_INTERRUPT << shift;
+       engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT << shift;
+       engine->irq_keep_mask = GT_CONTEXT_SWITCH_INTERRUPT << shift;
+}
+
+static int
+lrc_setup_hws(struct intel_engine_cs *engine,
+             struct drm_i915_gem_object *dctx_obj)
+{
+       void *hws;
+
+       /* The HWSP is part of the default context object in LRC mode. */
+       engine->status_page.gfx_addr = i915_gem_obj_ggtt_offset(dctx_obj) +
+                                      LRC_PPHWSP_PN * PAGE_SIZE;
+       hws = i915_gem_object_pin_map(dctx_obj);
+       if (IS_ERR(hws))
+               return PTR_ERR(hws);
+       engine->status_page.page_addr = hws + LRC_PPHWSP_PN * PAGE_SIZE;
+       engine->status_page.obj = dctx_obj;
+
+       return 0;
 }
 
 static int
-logical_ring_init(struct drm_device *dev, struct intel_engine_cs *ring)
+logical_ring_init(struct drm_device *dev, struct intel_engine_cs *engine)
 {
-       struct intel_context *dctx = to_i915(dev)->kernel_context;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct intel_context *dctx = dev_priv->kernel_context;
+       enum forcewake_domains fw_domains;
        int ret;
 
        /* Intentionally left blank. */
-       ring->buffer = NULL;
+       engine->buffer = NULL;
+
+       engine->dev = dev;
+       INIT_LIST_HEAD(&engine->active_list);
+       INIT_LIST_HEAD(&engine->request_list);
+       i915_gem_batch_pool_init(dev, &engine->batch_pool);
+       init_waitqueue_head(&engine->irq_queue);
+
+       INIT_LIST_HEAD(&engine->buffers);
+       INIT_LIST_HEAD(&engine->execlist_queue);
+       INIT_LIST_HEAD(&engine->execlist_retired_req_list);
+       spin_lock_init(&engine->execlist_lock);
+
+       tasklet_init(&engine->irq_tasklet,
+                    intel_lrc_irq_handler, (unsigned long)engine);
+
+       logical_ring_init_platform_invariants(engine);
+
+       fw_domains = intel_uncore_forcewake_for_reg(dev_priv,
+                                                   RING_ELSP(engine),
+                                                   FW_REG_WRITE);
 
-       ring->dev = dev;
-       INIT_LIST_HEAD(&ring->active_list);
-       INIT_LIST_HEAD(&ring->request_list);
-       i915_gem_batch_pool_init(dev, &ring->batch_pool);
-       init_waitqueue_head(&ring->irq_queue);
+       fw_domains |= intel_uncore_forcewake_for_reg(dev_priv,
+                                                    RING_CONTEXT_STATUS_PTR(engine),
+                                                    FW_REG_READ | FW_REG_WRITE);
 
-       INIT_LIST_HEAD(&ring->buffers);
-       INIT_LIST_HEAD(&ring->execlist_queue);
-       INIT_LIST_HEAD(&ring->execlist_retired_req_list);
-       spin_lock_init(&ring->execlist_lock);
+       fw_domains |= intel_uncore_forcewake_for_reg(dev_priv,
+                                                    RING_CONTEXT_STATUS_BUF_BASE(engine),
+                                                    FW_REG_READ);
 
-       logical_ring_init_platform_invariants(ring);
+       engine->fw_domains = fw_domains;
 
-       ret = i915_cmd_parser_init_ring(ring);
+       ret = i915_cmd_parser_init_ring(engine);
        if (ret)
                goto error;
 
-       ret = intel_lr_context_deferred_alloc(dctx, ring);
+       ret = intel_lr_context_deferred_alloc(dctx, engine);
        if (ret)
                goto error;
 
        /* As this is the default context, always pin it */
-       ret = intel_lr_context_do_pin(dctx, ring);
+       ret = intel_lr_context_do_pin(dctx, engine);
        if (ret) {
                DRM_ERROR(
                        "Failed to pin and map ringbuffer %s: %d\n",
-                       ring->name, ret);
+                       engine->name, ret);
+               goto error;
+       }
+
+       /* And setup the hardware status page. */
+       ret = lrc_setup_hws(engine, dctx->engine[engine->id].state);
+       if (ret) {
+               DRM_ERROR("Failed to set up hws %s: %d\n", engine->name, ret);
                goto error;
        }
 
        return 0;
 
 error:
-       intel_logical_ring_cleanup(ring);
+       intel_logical_ring_cleanup(engine);
        return ret;
 }
 
 static int logical_render_ring_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        int ret;
 
-       ring->name = "render ring";
-       ring->id = RCS;
-       ring->exec_id = I915_EXEC_RENDER;
-       ring->guc_id = GUC_RENDER_ENGINE;
-       ring->mmio_base = RENDER_RING_BASE;
+       engine->name = "render ring";
+       engine->id = RCS;
+       engine->exec_id = I915_EXEC_RENDER;
+       engine->guc_id = GUC_RENDER_ENGINE;
+       engine->mmio_base = RENDER_RING_BASE;
 
-       logical_ring_default_irqs(ring, GEN8_RCS_IRQ_SHIFT);
+       logical_ring_default_irqs(engine, GEN8_RCS_IRQ_SHIFT);
        if (HAS_L3_DPF(dev))
-               ring->irq_keep_mask |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
+               engine->irq_keep_mask |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
 
-       logical_ring_default_vfuncs(dev, ring);
+       logical_ring_default_vfuncs(dev, engine);
 
        /* Override some for render ring. */
        if (INTEL_INFO(dev)->gen >= 9)
-               ring->init_hw = gen9_init_render_ring;
+               engine->init_hw = gen9_init_render_ring;
        else
-               ring->init_hw = gen8_init_render_ring;
-       ring->init_context = gen8_init_rcs_context;
-       ring->cleanup = intel_fini_pipe_control;
-       ring->emit_flush = gen8_emit_flush_render;
-       ring->emit_request = gen8_emit_request_render;
+               engine->init_hw = gen8_init_render_ring;
+       engine->init_context = gen8_init_rcs_context;
+       engine->cleanup = intel_fini_pipe_control;
+       engine->emit_flush = gen8_emit_flush_render;
+       engine->emit_request = gen8_emit_request_render;
 
-       ring->dev = dev;
+       engine->dev = dev;
 
-       ret = intel_init_pipe_control(ring);
+       ret = intel_init_pipe_control(engine);
        if (ret)
                return ret;
 
-       ret = intel_init_workaround_bb(ring);
+       ret = intel_init_workaround_bb(engine);
        if (ret) {
                /*
                 * We continue even if we fail to initialize WA batch
@@ -2144,9 +2226,9 @@ static int logical_render_ring_init(struct drm_device *dev)
                          ret);
        }
 
-       ret = logical_ring_init(dev, ring);
+       ret = logical_ring_init(dev, engine);
        if (ret) {
-               lrc_destroy_wa_ctx_obj(ring);
+               lrc_destroy_wa_ctx_obj(engine);
        }
 
        return ret;
@@ -2155,69 +2237,69 @@ static int logical_render_ring_init(struct drm_device *dev)
 static int logical_bsd_ring_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[VCS];
 
-       ring->name = "bsd ring";
-       ring->id = VCS;
-       ring->exec_id = I915_EXEC_BSD;
-       ring->guc_id = GUC_VIDEO_ENGINE;
-       ring->mmio_base = GEN6_BSD_RING_BASE;
+       engine->name = "bsd ring";
+       engine->id = VCS;
+       engine->exec_id = I915_EXEC_BSD;
+       engine->guc_id = GUC_VIDEO_ENGINE;
+       engine->mmio_base = GEN6_BSD_RING_BASE;
 
-       logical_ring_default_irqs(ring, GEN8_VCS1_IRQ_SHIFT);
-       logical_ring_default_vfuncs(dev, ring);
+       logical_ring_default_irqs(engine, GEN8_VCS1_IRQ_SHIFT);
+       logical_ring_default_vfuncs(dev, engine);
 
-       return logical_ring_init(dev, ring);
+       return logical_ring_init(dev, engine);
 }
 
 static int logical_bsd2_ring_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VCS2];
+       struct intel_engine_cs *engine = &dev_priv->engine[VCS2];
 
-       ring->name = "bsd2 ring";
-       ring->id = VCS2;
-       ring->exec_id = I915_EXEC_BSD;
-       ring->guc_id = GUC_VIDEO_ENGINE2;
-       ring->mmio_base = GEN8_BSD2_RING_BASE;
+       engine->name = "bsd2 ring";
+       engine->id = VCS2;
+       engine->exec_id = I915_EXEC_BSD;
+       engine->guc_id = GUC_VIDEO_ENGINE2;
+       engine->mmio_base = GEN8_BSD2_RING_BASE;
 
-       logical_ring_default_irqs(ring, GEN8_VCS2_IRQ_SHIFT);
-       logical_ring_default_vfuncs(dev, ring);
+       logical_ring_default_irqs(engine, GEN8_VCS2_IRQ_SHIFT);
+       logical_ring_default_vfuncs(dev, engine);
 
-       return logical_ring_init(dev, ring);
+       return logical_ring_init(dev, engine);
 }
 
 static int logical_blt_ring_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[BCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[BCS];
 
-       ring->name = "blitter ring";
-       ring->id = BCS;
-       ring->exec_id = I915_EXEC_BLT;
-       ring->guc_id = GUC_BLITTER_ENGINE;
-       ring->mmio_base = BLT_RING_BASE;
+       engine->name = "blitter ring";
+       engine->id = BCS;
+       engine->exec_id = I915_EXEC_BLT;
+       engine->guc_id = GUC_BLITTER_ENGINE;
+       engine->mmio_base = BLT_RING_BASE;
 
-       logical_ring_default_irqs(ring, GEN8_BCS_IRQ_SHIFT);
-       logical_ring_default_vfuncs(dev, ring);
+       logical_ring_default_irqs(engine, GEN8_BCS_IRQ_SHIFT);
+       logical_ring_default_vfuncs(dev, engine);
 
-       return logical_ring_init(dev, ring);
+       return logical_ring_init(dev, engine);
 }
 
 static int logical_vebox_ring_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VECS];
+       struct intel_engine_cs *engine = &dev_priv->engine[VECS];
 
-       ring->name = "video enhancement ring";
-       ring->id = VECS;
-       ring->exec_id = I915_EXEC_VEBOX;
-       ring->guc_id = GUC_VIDEOENHANCE_ENGINE;
-       ring->mmio_base = VEBOX_RING_BASE;
+       engine->name = "video enhancement ring";
+       engine->id = VECS;
+       engine->exec_id = I915_EXEC_VEBOX;
+       engine->guc_id = GUC_VIDEOENHANCE_ENGINE;
+       engine->mmio_base = VEBOX_RING_BASE;
 
-       logical_ring_default_irqs(ring, GEN8_VECS_IRQ_SHIFT);
-       logical_ring_default_vfuncs(dev, ring);
+       logical_ring_default_irqs(engine, GEN8_VECS_IRQ_SHIFT);
+       logical_ring_default_vfuncs(dev, engine);
 
-       return logical_ring_init(dev, ring);
+       return logical_ring_init(dev, engine);
 }
 
 /**
@@ -2225,7 +2307,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
  * @dev: DRM device.
  *
  * This function inits the engines for an Execlists submission style (the equivalent in the
- * legacy ringbuffer submission world would be i915_gem_init_rings). It does it only for
+ * legacy ringbuffer submission world would be i915_gem_init_engines). It does it only for
  * those engines that are present in the hardware.
  *
  * Return: non-zero if the initialization failed.
@@ -2266,13 +2348,13 @@ int intel_logical_rings_init(struct drm_device *dev)
        return 0;
 
 cleanup_vebox_ring:
-       intel_logical_ring_cleanup(&dev_priv->ring[VECS]);
+       intel_logical_ring_cleanup(&dev_priv->engine[VECS]);
 cleanup_blt_ring:
-       intel_logical_ring_cleanup(&dev_priv->ring[BCS]);
+       intel_logical_ring_cleanup(&dev_priv->engine[BCS]);
 cleanup_bsd_ring:
-       intel_logical_ring_cleanup(&dev_priv->ring[VCS]);
+       intel_logical_ring_cleanup(&dev_priv->engine[VCS]);
 cleanup_render_ring:
-       intel_logical_ring_cleanup(&dev_priv->ring[RCS]);
+       intel_logical_ring_cleanup(&dev_priv->engine[RCS]);
 
        return ret;
 }
@@ -2320,13 +2402,13 @@ make_rpcs(struct drm_device *dev)
        return rpcs;
 }
 
-static u32 intel_lr_indirect_ctx_offset(struct intel_engine_cs *ring)
+static u32 intel_lr_indirect_ctx_offset(struct intel_engine_cs *engine)
 {
        u32 indirect_ctx_offset;
 
-       switch (INTEL_INFO(ring->dev)->gen) {
+       switch (INTEL_INFO(engine->dev)->gen) {
        default:
-               MISSING_CASE(INTEL_INFO(ring->dev)->gen);
+               MISSING_CASE(INTEL_INFO(engine->dev)->gen);
                /* fall through */
        case 9:
                indirect_ctx_offset =
@@ -2342,14 +2424,16 @@ static u32 intel_lr_indirect_ctx_offset(struct intel_engine_cs *ring)
 }
 
 static int
-populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_obj,
-                   struct intel_engine_cs *ring, struct intel_ringbuffer *ringbuf)
+populate_lr_context(struct intel_context *ctx,
+                   struct drm_i915_gem_object *ctx_obj,
+                   struct intel_engine_cs *engine,
+                   struct intel_ringbuffer *ringbuf)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct i915_hw_ppgtt *ppgtt = ctx->ppgtt;
-       struct page *page;
-       uint32_t *reg_state;
+       void *vaddr;
+       u32 *reg_state;
        int ret;
 
        if (!ppgtt)
@@ -2361,18 +2445,17 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
                return ret;
        }
 
-       ret = i915_gem_object_get_pages(ctx_obj);
-       if (ret) {
-               DRM_DEBUG_DRIVER("Could not get object pages\n");
+       vaddr = i915_gem_object_pin_map(ctx_obj);
+       if (IS_ERR(vaddr)) {
+               ret = PTR_ERR(vaddr);
+               DRM_DEBUG_DRIVER("Could not map object pages! (%d)\n", ret);
                return ret;
        }
-
-       i915_gem_object_pin_pages(ctx_obj);
+       ctx_obj->dirty = true;
 
        /* The second page of the context object contains some fields which must
         * be set up prior to the first execution. */
-       page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN);
-       reg_state = kmap_atomic(page);
+       reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;
 
        /* A context is actually a big batch buffer with several MI_LOAD_REGISTER_IMM
         * commands followed by (reg, value) pairs. The values we are setting here are
@@ -2380,33 +2463,47 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
         * recreate this batchbuffer with new values (including all the missing
         * MI_LOAD_REGISTER_IMM commands that we are not initializing here). */
        reg_state[CTX_LRI_HEADER_0] =
-               MI_LOAD_REGISTER_IMM(ring->id == RCS ? 14 : 11) | MI_LRI_FORCE_POSTED;
-       ASSIGN_CTX_REG(reg_state, CTX_CONTEXT_CONTROL, RING_CONTEXT_CONTROL(ring),
+               MI_LOAD_REGISTER_IMM(engine->id == RCS ? 14 : 11) | MI_LRI_FORCE_POSTED;
+       ASSIGN_CTX_REG(reg_state, CTX_CONTEXT_CONTROL,
+                      RING_CONTEXT_CONTROL(engine),
                       _MASKED_BIT_ENABLE(CTX_CTRL_INHIBIT_SYN_CTX_SWITCH |
                                          CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT |
                                          (HAS_RESOURCE_STREAMER(dev) ?
                                            CTX_CTRL_RS_CTX_ENABLE : 0)));
-       ASSIGN_CTX_REG(reg_state, CTX_RING_HEAD, RING_HEAD(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_RING_TAIL, RING_TAIL(ring->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_RING_HEAD, RING_HEAD(engine->mmio_base),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_RING_TAIL, RING_TAIL(engine->mmio_base),
+                      0);
        /* Ring buffer start address is not known until the buffer is pinned.
         * It is written to the context image in execlists_update_context()
         */
-       ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_START, RING_START(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_CONTROL, RING_CTL(ring->mmio_base),
+       ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_START,
+                      RING_START(engine->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_RING_BUFFER_CONTROL,
+                      RING_CTL(engine->mmio_base),
                       ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES) | RING_VALID);
-       ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_U, RING_BBADDR_UDW(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_L, RING_BBADDR(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_BB_STATE, RING_BBSTATE(ring->mmio_base),
+       ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_U,
+                      RING_BBADDR_UDW(engine->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_BB_HEAD_L,
+                      RING_BBADDR(engine->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_BB_STATE,
+                      RING_BBSTATE(engine->mmio_base),
                       RING_BB_PPGTT);
-       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_U, RING_SBBADDR_UDW(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_L, RING_SBBADDR(ring->mmio_base), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_STATE, RING_SBBSTATE(ring->mmio_base), 0);
-       if (ring->id == RCS) {
-               ASSIGN_CTX_REG(reg_state, CTX_BB_PER_CTX_PTR, RING_BB_PER_CTX_PTR(ring->mmio_base), 0);
-               ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX, RING_INDIRECT_CTX(ring->mmio_base), 0);
-               ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX_OFFSET, RING_INDIRECT_CTX_OFFSET(ring->mmio_base), 0);
-               if (ring->wa_ctx.obj) {
-                       struct i915_ctx_workarounds *wa_ctx = &ring->wa_ctx;
+       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_U,
+                      RING_SBBADDR_UDW(engine->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_HEAD_L,
+                      RING_SBBADDR(engine->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_SECOND_BB_STATE,
+                      RING_SBBSTATE(engine->mmio_base), 0);
+       if (engine->id == RCS) {
+               ASSIGN_CTX_REG(reg_state, CTX_BB_PER_CTX_PTR,
+                              RING_BB_PER_CTX_PTR(engine->mmio_base), 0);
+               ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX,
+                              RING_INDIRECT_CTX(engine->mmio_base), 0);
+               ASSIGN_CTX_REG(reg_state, CTX_RCS_INDIRECT_CTX_OFFSET,
+                              RING_INDIRECT_CTX_OFFSET(engine->mmio_base), 0);
+               if (engine->wa_ctx.obj) {
+                       struct i915_ctx_workarounds *wa_ctx = &engine->wa_ctx;
                        uint32_t ggtt_offset = i915_gem_obj_ggtt_offset(wa_ctx->obj);
 
                        reg_state[CTX_RCS_INDIRECT_CTX+1] =
@@ -2414,7 +2511,7 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
                                (wa_ctx->indirect_ctx.size / CACHELINE_DWORDS);
 
                        reg_state[CTX_RCS_INDIRECT_CTX_OFFSET+1] =
-                               intel_lr_indirect_ctx_offset(ring) << 6;
+                               intel_lr_indirect_ctx_offset(engine) << 6;
 
                        reg_state[CTX_BB_PER_CTX_PTR+1] =
                                (ggtt_offset + wa_ctx->per_ctx.offset * sizeof(uint32_t)) |
@@ -2422,16 +2519,25 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
                }
        }
        reg_state[CTX_LRI_HEADER_1] = MI_LOAD_REGISTER_IMM(9) | MI_LRI_FORCE_POSTED;
-       ASSIGN_CTX_REG(reg_state, CTX_CTX_TIMESTAMP, RING_CTX_TIMESTAMP(ring->mmio_base), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_CTX_TIMESTAMP,
+                      RING_CTX_TIMESTAMP(engine->mmio_base), 0);
        /* PDP values well be assigned later if needed */
-       ASSIGN_CTX_REG(reg_state, CTX_PDP3_UDW, GEN8_RING_PDP_UDW(ring, 3), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP3_LDW, GEN8_RING_PDP_LDW(ring, 3), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP2_UDW, GEN8_RING_PDP_UDW(ring, 2), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP2_LDW, GEN8_RING_PDP_LDW(ring, 2), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP1_UDW, GEN8_RING_PDP_UDW(ring, 1), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP1_LDW, GEN8_RING_PDP_LDW(ring, 1), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(ring, 0), 0);
-       ASSIGN_CTX_REG(reg_state, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(ring, 0), 0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP3_UDW, GEN8_RING_PDP_UDW(engine, 3),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP3_LDW, GEN8_RING_PDP_LDW(engine, 3),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP2_UDW, GEN8_RING_PDP_UDW(engine, 2),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP2_LDW, GEN8_RING_PDP_LDW(engine, 2),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP1_UDW, GEN8_RING_PDP_UDW(engine, 1),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP1_LDW, GEN8_RING_PDP_LDW(engine, 1),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP0_UDW, GEN8_RING_PDP_UDW(engine, 0),
+                      0);
+       ASSIGN_CTX_REG(reg_state, CTX_PDP0_LDW, GEN8_RING_PDP_LDW(engine, 0),
+                      0);
 
        if (USES_FULL_48BIT_PPGTT(ppgtt->base.dev)) {
                /* 64b PPGTT (48bit canonical)
@@ -2445,20 +2551,16 @@ populate_lr_context(struct intel_context *ctx, struct drm_i915_gem_object *ctx_o
                 * With dynamic page allocation, PDPs may not be allocated at
                 * this point. Point the unallocated PDPs to the scratch page
                 */
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 3);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 2);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 1);
-               ASSIGN_CTX_PDP(ppgtt, reg_state, 0);
+               execlists_update_context_pdps(ppgtt, reg_state);
        }
 
-       if (ring->id == RCS) {
+       if (engine->id == RCS) {
                reg_state[CTX_LRI_HEADER_2] = MI_LOAD_REGISTER_IMM(1);
                ASSIGN_CTX_REG(reg_state, CTX_R_PWR_CLK_STATE, GEN8_R_PWR_CLK_STATE,
                               make_rpcs(dev));
        }
 
-       kunmap_atomic(reg_state);
-       i915_gem_object_unpin_pages(ctx_obj);
+       i915_gem_object_unpin_map(ctx_obj);
 
        return 0;
 }
@@ -2475,7 +2577,7 @@ void intel_lr_context_free(struct intel_context *ctx)
 {
        int i;
 
-       for (i = I915_NUM_RINGS; --i >= 0; ) {
+       for (i = I915_NUM_ENGINES; --i >= 0; ) {
                struct intel_ringbuffer *ringbuf = ctx->engine[i].ringbuf;
                struct drm_i915_gem_object *ctx_obj = ctx->engine[i].state;
 
@@ -2485,6 +2587,7 @@ void intel_lr_context_free(struct intel_context *ctx)
                if (ctx == ctx->i915->kernel_context) {
                        intel_unpin_ringbuffer_obj(ringbuf);
                        i915_gem_object_ggtt_unpin(ctx_obj);
+                       i915_gem_object_unpin_map(ctx_obj);
                }
 
                WARN_ON(ctx->engine[i].pin_count);
@@ -2507,15 +2610,15 @@ void intel_lr_context_free(struct intel_context *ctx)
  * in LRC mode, but does not include the "shared data page" used with
  * GuC submission. The caller should account for this if using the GuC.
  */
-uint32_t intel_lr_context_size(struct intel_engine_cs *ring)
+uint32_t intel_lr_context_size(struct intel_engine_cs *engine)
 {
        int ret = 0;
 
-       WARN_ON(INTEL_INFO(ring->dev)->gen < 8);
+       WARN_ON(INTEL_INFO(engine->dev)->gen < 8);
 
-       switch (ring->id) {
+       switch (engine->id) {
        case RCS:
-               if (INTEL_INFO(ring->dev)->gen >= 9)
+               if (INTEL_INFO(engine->dev)->gen >= 9)
                        ret = GEN9_LR_CONTEXT_RENDER_SIZE;
                else
                        ret = GEN8_LR_CONTEXT_RENDER_SIZE;
@@ -2531,24 +2634,6 @@ uint32_t intel_lr_context_size(struct intel_engine_cs *ring)
        return ret;
 }
 
-static void lrc_setup_hardware_status_page(struct intel_engine_cs *ring,
-               struct drm_i915_gem_object *default_ctx_obj)
-{
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-       struct page *page;
-
-       /* The HWSP is part of the default context object in LRC mode. */
-       ring->status_page.gfx_addr = i915_gem_obj_ggtt_offset(default_ctx_obj)
-                       + LRC_PPHWSP_PN * PAGE_SIZE;
-       page = i915_gem_object_get_page(default_ctx_obj, LRC_PPHWSP_PN);
-       ring->status_page.page_addr = kmap(page);
-       ring->status_page.obj = default_ctx_obj;
-
-       I915_WRITE(RING_HWS_PGA(ring->mmio_base),
-                       (u32)ring->status_page.gfx_addr);
-       POSTING_READ(RING_HWS_PGA(ring->mmio_base));
-}
-
 /**
  * intel_lr_context_deferred_alloc() - create the LRC specific bits of a context
  * @ctx: LR context to create.
@@ -2564,18 +2649,18 @@ static void lrc_setup_hardware_status_page(struct intel_engine_cs *ring,
  */
 
 int intel_lr_context_deferred_alloc(struct intel_context *ctx,
-                                   struct intel_engine_cs *ring)
+                                   struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_gem_object *ctx_obj;
        uint32_t context_size;
        struct intel_ringbuffer *ringbuf;
        int ret;
 
        WARN_ON(ctx->legacy_hw_ctx.rcs_state != NULL);
-       WARN_ON(ctx->engine[ring->id].state);
+       WARN_ON(ctx->engine[engine->id].state);
 
-       context_size = round_up(intel_lr_context_size(ring), 4096);
+       context_size = round_up(intel_lr_context_size(engine), 4096);
 
        /* One extra page as the sharing data between driver and GuC */
        context_size += PAGE_SIZE * LRC_PPHWSP_PN;
@@ -2586,39 +2671,38 @@ int intel_lr_context_deferred_alloc(struct intel_context *ctx,
                return -ENOMEM;
        }
 
-       ringbuf = intel_engine_create_ringbuffer(ring, 4 * PAGE_SIZE);
+       ringbuf = intel_engine_create_ringbuffer(engine, 4 * PAGE_SIZE);
        if (IS_ERR(ringbuf)) {
                ret = PTR_ERR(ringbuf);
                goto error_deref_obj;
        }
 
-       ret = populate_lr_context(ctx, ctx_obj, ring, ringbuf);
+       ret = populate_lr_context(ctx, ctx_obj, engine, ringbuf);
        if (ret) {
                DRM_DEBUG_DRIVER("Failed to populate LRC: %d\n", ret);
                goto error_ringbuf;
        }
 
-       ctx->engine[ring->id].ringbuf = ringbuf;
-       ctx->engine[ring->id].state = ctx_obj;
+       ctx->engine[engine->id].ringbuf = ringbuf;
+       ctx->engine[engine->id].state = ctx_obj;
 
-       if (ctx != ctx->i915->kernel_context && ring->init_context) {
+       if (ctx != ctx->i915->kernel_context && engine->init_context) {
                struct drm_i915_gem_request *req;
 
-               req = i915_gem_request_alloc(ring, ctx);
+               req = i915_gem_request_alloc(engine, ctx);
                if (IS_ERR(req)) {
                        ret = PTR_ERR(req);
                        DRM_ERROR("ring create req: %d\n", ret);
                        goto error_ringbuf;
                }
 
-               ret = ring->init_context(req);
+               ret = engine->init_context(req);
+               i915_add_request_no_flush(req);
                if (ret) {
                        DRM_ERROR("ring init context: %d\n",
                                ret);
-                       i915_gem_request_cancel(req);
                        goto error_ringbuf;
                }
-               i915_add_request_no_flush(req);
        }
        return 0;
 
@@ -2626,40 +2710,38 @@ error_ringbuf:
        intel_ringbuffer_free(ringbuf);
 error_deref_obj:
        drm_gem_object_unreference(&ctx_obj->base);
-       ctx->engine[ring->id].ringbuf = NULL;
-       ctx->engine[ring->id].state = NULL;
+       ctx->engine[engine->id].ringbuf = NULL;
+       ctx->engine[engine->id].state = NULL;
        return ret;
 }
 
-void intel_lr_context_reset(struct drm_device *dev,
-                       struct intel_context *ctx)
+void intel_lr_context_reset(struct drm_i915_private *dev_priv,
+                           struct intel_context *ctx)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
-       int i;
+       struct intel_engine_cs *engine;
 
-       for_each_ring(ring, dev_priv, i) {
+       for_each_engine(engine, dev_priv) {
                struct drm_i915_gem_object *ctx_obj =
-                               ctx->engine[ring->id].state;
+                               ctx->engine[engine->id].state;
                struct intel_ringbuffer *ringbuf =
-                               ctx->engine[ring->id].ringbuf;
+                               ctx->engine[engine->id].ringbuf;
+               void *vaddr;
                uint32_t *reg_state;
-               struct page *page;
 
                if (!ctx_obj)
                        continue;
 
-               if (i915_gem_object_get_pages(ctx_obj)) {
-                       WARN(1, "Failed get_pages for context obj\n");
+               vaddr = i915_gem_object_pin_map(ctx_obj);
+               if (WARN_ON(IS_ERR(vaddr)))
                        continue;
-               }
-               page = i915_gem_object_get_dirty_page(ctx_obj, LRC_STATE_PN);
-               reg_state = kmap_atomic(page);
+
+               reg_state = vaddr + LRC_STATE_PN * PAGE_SIZE;
+               ctx_obj->dirty = true;
 
                reg_state[CTX_RING_HEAD+1] = 0;
                reg_state[CTX_RING_TAIL+1] = 0;
 
-               kunmap_atomic(reg_state);
+               i915_gem_object_unpin_map(ctx_obj);
 
                ringbuf->head = 0;
                ringbuf->tail = 0;
index e6cda3e225d02b67d2df629b0f06b2462093353f..461f1ef9b5c14c204071cbaa72ef75e3396a7e15 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef _INTEL_LRC_H_
 #define _INTEL_LRC_H_
 
+#include "intel_ringbuffer.h"
+
 #define GEN8_LR_CONTEXT_ALIGN 4096
 
 /* Execlists regs */
@@ -34,6 +36,7 @@
 #define          CTX_CTRL_INHIBIT_SYN_CTX_SWITCH       (1 << 3)
 #define          CTX_CTRL_ENGINE_CTX_RESTORE_INHIBIT   (1 << 0)
 #define   CTX_CTRL_RS_CTX_ENABLE                (1 << 1)
+#define RING_CONTEXT_STATUS_BUF_BASE(ring)     _MMIO((ring)->mmio_base + 0x370)
 #define RING_CONTEXT_STATUS_BUF_LO(ring, i)    _MMIO((ring)->mmio_base + 0x370 + (i) * 8)
 #define RING_CONTEXT_STATUS_BUF_HI(ring, i)    _MMIO((ring)->mmio_base + 0x370 + (i) * 8 + 4)
 #define RING_CONTEXT_STATUS_PTR(ring)          _MMIO((ring)->mmio_base + 0x3a0)
@@ -57,8 +60,8 @@
 /* Logical Rings */
 int intel_logical_ring_alloc_request_extras(struct drm_i915_gem_request *request);
 int intel_logical_ring_reserve_space(struct drm_i915_gem_request *request);
-void intel_logical_ring_stop(struct intel_engine_cs *ring);
-void intel_logical_ring_cleanup(struct intel_engine_cs *ring);
+void intel_logical_ring_stop(struct intel_engine_cs *engine);
+void intel_logical_ring_cleanup(struct intel_engine_cs *engine);
 int intel_logical_rings_init(struct drm_device *dev);
 int intel_logical_ring_begin(struct drm_i915_gem_request *req, int num_dwords);
 
@@ -98,18 +101,21 @@ static inline void intel_logical_ring_emit_reg(struct intel_ringbuffer *ringbuf,
 #define LRC_STATE_PN   (LRC_PPHWSP_PN + 1)
 
 void intel_lr_context_free(struct intel_context *ctx);
-uint32_t intel_lr_context_size(struct intel_engine_cs *ring);
+uint32_t intel_lr_context_size(struct intel_engine_cs *engine);
 int intel_lr_context_deferred_alloc(struct intel_context *ctx,
-                                   struct intel_engine_cs *ring);
+                                   struct intel_engine_cs *engine);
 void intel_lr_context_unpin(struct intel_context *ctx,
                            struct intel_engine_cs *engine);
-void intel_lr_context_reset(struct drm_device *dev,
-                       struct intel_context *ctx);
+
+struct drm_i915_private;
+
+void intel_lr_context_reset(struct drm_i915_private *dev_priv,
+                           struct intel_context *ctx);
 uint64_t intel_lr_context_descriptor(struct intel_context *ctx,
-                                    struct intel_engine_cs *ring);
+                                    struct intel_engine_cs *engine);
 
 u32 intel_execlists_ctx_id(struct intel_context *ctx,
-                          struct intel_engine_cs *ring);
+                          struct intel_engine_cs *engine);
 
 /* Execlists */
 int intel_sanitize_enable_execlists(struct drm_device *dev, int enable_execlists);
@@ -118,7 +124,6 @@ int intel_execlists_submission(struct i915_execbuffer_params *params,
                               struct drm_i915_gem_execbuffer2 *args,
                               struct list_head *vmas);
 
-void intel_lrc_irq_handler(struct intel_engine_cs *ring);
-void intel_execlists_retire_requests(struct intel_engine_cs *ring);
+void intel_execlists_retire_requests(struct intel_engine_cs *engine);
 
 #endif /* _INTEL_LRC_H_ */
index 10dc3517b63b32921437bcff3d2352829061c4ed..bc53c0dd34d082cc53ad2ca4b398b9d5ba85a1f5 100644 (file)
@@ -109,7 +109,6 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
        u32 tmp, flags = 0;
-       int dotclock;
 
        tmp = I915_READ(lvds_encoder->reg);
        if (tmp & LVDS_HSYNC_POLARITY)
@@ -134,12 +133,7 @@ static void intel_lvds_get_config(struct intel_encoder *encoder,
                pipe_config->gmch_pfit.control |= tmp & PANEL_8TO6_DITHER_ENABLE;
        }
 
-       dotclock = pipe_config->port_clock;
-
-       if (HAS_PCH_SPLIT(dev_priv->dev))
-               ironlake_check_encoder_dotclock(pipe_config, dotclock);
-
-       pipe_config->base.adjusted_mode.crtc_clock = dotclock;
+       pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
 }
 
 static void intel_pre_enable_lvds(struct intel_encoder *encoder)
@@ -155,7 +149,7 @@ static void intel_pre_enable_lvds(struct intel_encoder *encoder)
        if (HAS_PCH_SPLIT(dev)) {
                assert_fdi_rx_pll_disabled(dev_priv, pipe);
                assert_shared_dpll_disabled(dev_priv,
-                                           intel_crtc_to_shared_dpll(crtc));
+                                           crtc->config->shared_dpll);
        } else {
                assert_pll_disabled(dev_priv, pipe);
        }
@@ -782,57 +776,6 @@ static const struct dmi_system_id intel_no_lvds[] = {
        { }     /* terminating entry */
 };
 
-/*
- * Enumerate the child dev array parsed from VBT to check whether
- * the LVDS is present.
- * If it is present, return 1.
- * If it is not present, return false.
- * If no child dev is parsed from VBT, it assumes that the LVDS is present.
- */
-static bool lvds_is_present_in_vbt(struct drm_device *dev,
-                                  u8 *i2c_pin)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int i;
-
-       if (!dev_priv->vbt.child_dev_num)
-               return true;
-
-       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
-               union child_device_config *uchild = dev_priv->vbt.child_dev + i;
-               struct old_child_dev_config *child = &uchild->old;
-
-               /* If the device type is not LFP, continue.
-                * We have to check both the new identifiers as well as the
-                * old for compatibility with some BIOSes.
-                */
-               if (child->device_type != DEVICE_TYPE_INT_LFP &&
-                   child->device_type != DEVICE_TYPE_LFP)
-                       continue;
-
-               if (intel_gmbus_is_valid_pin(dev_priv, child->i2c_pin))
-                       *i2c_pin = child->i2c_pin;
-
-               /* However, we cannot trust the BIOS writers to populate
-                * the VBT correctly.  Since LVDS requires additional
-                * information from AIM blocks, a non-zero addin offset is
-                * a good indicator that the LVDS is actually present.
-                */
-               if (child->addin_offset)
-                       return true;
-
-               /* But even then some BIOS writers perform some black magic
-                * and instantiate the device without reference to any
-                * additional data.  Trust that if the VBT was written into
-                * the OpRegion then they have validated the LVDS's existence.
-                */
-               if (dev_priv->opregion.vbt)
-                       return true;
-       }
-
-       return false;
-}
-
 static int intel_dual_link_lvds_callback(const struct dmi_system_id *id)
 {
        DRM_INFO("Forcing lvds to dual link mode on %s\n", id->ident);
@@ -982,14 +925,14 @@ void intel_lvds_init(struct drm_device *dev)
        if (HAS_PCH_SPLIT(dev)) {
                if ((lvds & LVDS_DETECTED) == 0)
                        return;
-               if (dev_priv->vbt.edp_support) {
+               if (dev_priv->vbt.edp.support) {
                        DRM_DEBUG_KMS("disable LVDS for eDP support\n");
                        return;
                }
        }
 
        pin = GMBUS_PIN_PANEL;
-       if (!lvds_is_present_in_vbt(dev, &pin)) {
+       if (!intel_bios_is_lvds_present(dev_priv, &pin)) {
                if ((lvds & LVDS_PORT_EN) == 0) {
                        DRM_DEBUG_KMS("LVDS is not present in VBT\n");
                        return;
index fed7bea19cc94c41bf34352b6fb9b1a7b4c9f398..23b8545ad6b0f0cc50cd6a224bb3b69b1d5cfa31 100644 (file)
@@ -128,9 +128,9 @@ static const struct drm_i915_mocs_entry broxton_mocs_table[] = {
 
 /**
  * get_mocs_settings()
- * @dev:        DRM device.
+ * @dev_priv:  i915 device.
  * @table:      Output table that will be made to point at appropriate
- *              MOCS values for the device.
+ *           MOCS values for the device.
  *
  * This function will return the values of the MOCS table that needs to
  * be programmed for the platform. It will return the values that need
@@ -138,28 +138,28 @@ static const struct drm_i915_mocs_entry broxton_mocs_table[] = {
  *
  * Return: true if there are applicable MOCS settings for the device.
  */
-static bool get_mocs_settings(struct drm_device *dev,
+static bool get_mocs_settings(struct drm_i915_private *dev_priv,
                              struct drm_i915_mocs_table *table)
 {
        bool result = false;
 
-       if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
+       if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
                table->size  = ARRAY_SIZE(skylake_mocs_table);
                table->table = skylake_mocs_table;
                result = true;
-       } else if (IS_BROXTON(dev)) {
+       } else if (IS_BROXTON(dev_priv)) {
                table->size  = ARRAY_SIZE(broxton_mocs_table);
                table->table = broxton_mocs_table;
                result = true;
        } else {
-               WARN_ONCE(INTEL_INFO(dev)->gen >= 9,
+               WARN_ONCE(INTEL_INFO(dev_priv)->gen >= 9,
                          "Platform that should have a MOCS table does not.\n");
        }
 
        return result;
 }
 
-static i915_reg_t mocs_register(enum intel_ring_id ring, int index)
+static i915_reg_t mocs_register(enum intel_engine_id ring, int index)
 {
        switch (ring) {
        case RCS:
@@ -178,11 +178,50 @@ static i915_reg_t mocs_register(enum intel_ring_id ring, int index)
        }
 }
 
+/**
+ * intel_mocs_init_engine() - emit the mocs control table
+ * @engine:    The engine for whom to emit the registers.
+ *
+ * This function simply emits a MI_LOAD_REGISTER_IMM command for the
+ * given table starting at the given address.
+ *
+ * Return: 0 on success, otherwise the error status.
+ */
+int intel_mocs_init_engine(struct intel_engine_cs *engine)
+{
+       struct drm_i915_private *dev_priv = to_i915(engine->dev);
+       struct drm_i915_mocs_table table;
+       unsigned int index;
+
+       if (!get_mocs_settings(dev_priv, &table))
+               return 0;
+
+       if (WARN_ON(table.size > GEN9_NUM_MOCS_ENTRIES))
+               return -ENODEV;
+
+       for (index = 0; index < table.size; index++)
+               I915_WRITE(mocs_register(engine->id, index),
+                          table.table[index].control_value);
+
+       /*
+        * Ok, now set the unused entries to uncached. These entries
+        * are officially undefined and no contract for the contents
+        * and settings is given for these entries.
+        *
+        * Entry 0 in the table is uncached - so we are just writing
+        * that value to all the used entries.
+        */
+       for (; index < GEN9_NUM_MOCS_ENTRIES; index++)
+               I915_WRITE(mocs_register(engine->id, index),
+                          table.table[0].control_value);
+
+       return 0;
+}
+
 /**
  * emit_mocs_control_table() - emit the mocs control table
  * @req:       Request to set up the MOCS table for.
  * @table:     The values to program into the control regs.
- * @ring:      The engine for whom to emit the registers.
  *
  * This function simply emits a MI_LOAD_REGISTER_IMM command for the
  * given table starting at the given address.
@@ -190,10 +229,10 @@ static i915_reg_t mocs_register(enum intel_ring_id ring, int index)
  * Return: 0 on success, otherwise the error status.
  */
 static int emit_mocs_control_table(struct drm_i915_gem_request *req,
-                                  const struct drm_i915_mocs_table *table,
-                                  enum intel_ring_id ring)
+                                  const struct drm_i915_mocs_table *table)
 {
        struct intel_ringbuffer *ringbuf = req->ringbuf;
+       enum intel_engine_id engine = req->engine->id;
        unsigned int index;
        int ret;
 
@@ -210,7 +249,8 @@ static int emit_mocs_control_table(struct drm_i915_gem_request *req,
                                MI_LOAD_REGISTER_IMM(GEN9_NUM_MOCS_ENTRIES));
 
        for (index = 0; index < table->size; index++) {
-               intel_logical_ring_emit_reg(ringbuf, mocs_register(ring, index));
+               intel_logical_ring_emit_reg(ringbuf,
+                                           mocs_register(engine, index));
                intel_logical_ring_emit(ringbuf,
                                        table->table[index].control_value);
        }
@@ -224,8 +264,10 @@ static int emit_mocs_control_table(struct drm_i915_gem_request *req,
         * that value to all the used entries.
         */
        for (; index < GEN9_NUM_MOCS_ENTRIES; index++) {
-               intel_logical_ring_emit_reg(ringbuf, mocs_register(ring, index));
-               intel_logical_ring_emit(ringbuf, table->table[0].control_value);
+               intel_logical_ring_emit_reg(ringbuf,
+                                           mocs_register(engine, index));
+               intel_logical_ring_emit(ringbuf,
+                                       table->table[0].control_value);
        }
 
        intel_logical_ring_emit(ringbuf, MI_NOOP);
@@ -234,6 +276,14 @@ static int emit_mocs_control_table(struct drm_i915_gem_request *req,
        return 0;
 }
 
+static inline u32 l3cc_combine(const struct drm_i915_mocs_table *table,
+                              u16 low,
+                              u16 high)
+{
+       return table->table[low].l3cc_value |
+              table->table[high].l3cc_value << 16;
+}
+
 /**
  * emit_mocs_l3cc_table() - emit the mocs control table
  * @req:       Request to set up the MOCS table for.
@@ -249,11 +299,7 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
                                const struct drm_i915_mocs_table *table)
 {
        struct intel_ringbuffer *ringbuf = req->ringbuf;
-       unsigned int count;
        unsigned int i;
-       u32 value;
-       u32 filler = (table->table[0].l3cc_value & 0xffff) |
-                       ((table->table[0].l3cc_value & 0xffff) << 16);
        int ret;
 
        if (WARN_ON(table->size > GEN9_NUM_MOCS_ENTRIES))
@@ -268,20 +314,18 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
        intel_logical_ring_emit(ringbuf,
                        MI_LOAD_REGISTER_IMM(GEN9_NUM_MOCS_ENTRIES / 2));
 
-       for (i = 0, count = 0; i < table->size / 2; i++, count += 2) {
-               value = (table->table[count].l3cc_value & 0xffff) |
-                       ((table->table[count + 1].l3cc_value & 0xffff) << 16);
-
+       for (i = 0; i < table->size/2; i++) {
                intel_logical_ring_emit_reg(ringbuf, GEN9_LNCFCMOCS(i));
-               intel_logical_ring_emit(ringbuf, value);
+               intel_logical_ring_emit(ringbuf,
+                                       l3cc_combine(table, 2*i, 2*i+1));
        }
 
        if (table->size & 0x01) {
                /* Odd table size - 1 left over */
-               value = (table->table[count].l3cc_value & 0xffff) |
-                       ((table->table[0].l3cc_value & 0xffff) << 16);
-       } else
-               value = filler;
+               intel_logical_ring_emit_reg(ringbuf, GEN9_LNCFCMOCS(i));
+               intel_logical_ring_emit(ringbuf, l3cc_combine(table, 2*i, 0));
+               i++;
+       }
 
        /*
         * Now set the rest of the table to uncached - use entry 0 as
@@ -290,9 +334,7 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
         */
        for (; i < GEN9_NUM_MOCS_ENTRIES / 2; i++) {
                intel_logical_ring_emit_reg(ringbuf, GEN9_LNCFCMOCS(i));
-               intel_logical_ring_emit(ringbuf, value);
-
-               value = filler;
+               intel_logical_ring_emit(ringbuf, l3cc_combine(table, 0, 0));
        }
 
        intel_logical_ring_emit(ringbuf, MI_NOOP);
@@ -301,6 +343,47 @@ static int emit_mocs_l3cc_table(struct drm_i915_gem_request *req,
        return 0;
 }
 
+/**
+ * intel_mocs_init_l3cc_table() - program the mocs control table
+ * @dev:      The the device to be programmed.
+ *
+ * This function simply programs the mocs registers for the given table
+ * starting at the given address. This register set is  programmed in pairs.
+ *
+ * These registers may get programmed more than once, it is simpler to
+ * re-program 32 registers than maintain the state of when they were programmed.
+ * We are always reprogramming with the same values and this only on context
+ * start.
+ *
+ * Return: Nothing.
+ */
+void intel_mocs_init_l3cc_table(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_i915_mocs_table table;
+       unsigned int i;
+
+       if (!get_mocs_settings(dev_priv, &table))
+               return;
+
+       for (i = 0; i < table.size/2; i++)
+               I915_WRITE(GEN9_LNCFCMOCS(i), l3cc_combine(&table, 2*i, 2*i+1));
+
+       /* Odd table size - 1 left over */
+       if (table.size & 0x01) {
+               I915_WRITE(GEN9_LNCFCMOCS(i), l3cc_combine(&table, 2*i, 0));
+               i++;
+       }
+
+       /*
+        * Now set the rest of the table to uncached - use entry 0 as
+        * this will be uncached. Leave the last pair as initialised as
+        * they are reserved by the hardware.
+        */
+       for (; i < (GEN9_NUM_MOCS_ENTRIES / 2); i++)
+               I915_WRITE(GEN9_LNCFCMOCS(i), l3cc_combine(&table, 0, 0));
+}
+
 /**
  * intel_rcs_context_init_mocs() - program the MOCS register.
  * @req:       Request to set up the MOCS tables for.
@@ -322,17 +405,11 @@ int intel_rcs_context_init_mocs(struct drm_i915_gem_request *req)
        struct drm_i915_mocs_table t;
        int ret;
 
-       if (get_mocs_settings(req->ring->dev, &t)) {
-               struct drm_i915_private *dev_priv = req->i915;
-               struct intel_engine_cs *ring;
-               enum intel_ring_id ring_id;
-
-               /* Program the control registers */
-               for_each_ring(ring, dev_priv, ring_id) {
-                       ret = emit_mocs_control_table(req, &t, ring_id);
-                       if (ret)
-                               return ret;
-               }
+       if (get_mocs_settings(req->i915, &t)) {
+               /* Program the RCS control registers */
+               ret = emit_mocs_control_table(req, &t);
+               if (ret)
+                       return ret;
 
                /* Now program the l3cc registers */
                ret = emit_mocs_l3cc_table(req, &t);
index 76e45b1748b317f600ab636527f6883d2f9d78f8..4640299e04ecb95b5d2f9fd8c56b6d92b22b7bd9 100644 (file)
@@ -53,5 +53,7 @@
 #include "i915_drv.h"
 
 int intel_rcs_context_init_mocs(struct drm_i915_gem_request *req);
+void intel_mocs_init_l3cc_table(struct drm_device *dev);
+int intel_mocs_init_engine(struct intel_engine_cs *ring);
 
 #endif
index c15718b4862a193e0a54abf82e3eebd02c99cd4c..99e26034ae8d0df783d706839b67b0fd2f161585 100644 (file)
 #include "i915_drv.h"
 #include "intel_drv.h"
 
-#define PCI_ASLE               0xe4
-#define PCI_ASLS               0xfc
-#define PCI_SWSCI              0xe8
-#define PCI_SWSCI_SCISEL       (1 << 15)
-#define PCI_SWSCI_GSSCIE       (1 << 0)
-
 #define OPREGION_HEADER_OFFSET 0
 #define OPREGION_ACPI_OFFSET   0x100
 #define   ACPI_CLID 0x01ac /* current lid state indicator */
@@ -246,13 +240,12 @@ struct opregion_asle_ext {
 
 #define MAX_DSLP       1500
 
-#ifdef CONFIG_ACPI
 static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct opregion_swsci *swsci = dev_priv->opregion.swsci;
        u32 main_function, sub_function, scic;
-       u16 pci_swsci;
+       u16 swsci_val;
        u32 dslp;
 
        if (!swsci)
@@ -300,16 +293,16 @@ static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out)
        swsci->scic = scic;
 
        /* Ensure SCI event is selected and event trigger is cleared. */
-       pci_read_config_word(dev->pdev, PCI_SWSCI, &pci_swsci);
-       if (!(pci_swsci & PCI_SWSCI_SCISEL) || (pci_swsci & PCI_SWSCI_GSSCIE)) {
-               pci_swsci |= PCI_SWSCI_SCISEL;
-               pci_swsci &= ~PCI_SWSCI_GSSCIE;
-               pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
+       pci_read_config_word(dev->pdev, SWSCI, &swsci_val);
+       if (!(swsci_val & SWSCI_SCISEL) || (swsci_val & SWSCI_GSSCIE)) {
+               swsci_val |= SWSCI_SCISEL;
+               swsci_val &= ~SWSCI_GSSCIE;
+               pci_write_config_word(dev->pdev, SWSCI, swsci_val);
        }
 
        /* Use event trigger to tell bios to check the mail. */
-       pci_swsci |= PCI_SWSCI_GSSCIE;
-       pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
+       swsci_val |= SWSCI_GSSCIE;
+       pci_write_config_word(dev->pdev, SWSCI, swsci_val);
 
        /* Poll for the result. */
 #define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0)
@@ -905,9 +898,6 @@ static void swsci_setup(struct drm_device *dev)
                         opregion->swsci_gbda_sub_functions,
                         opregion->swsci_sbcb_sub_functions);
 }
-#else /* CONFIG_ACPI */
-static inline void swsci_setup(struct drm_device *dev) {}
-#endif  /* CONFIG_ACPI */
 
 static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
 {
@@ -943,16 +933,14 @@ int intel_opregion_setup(struct drm_device *dev)
        BUILD_BUG_ON(sizeof(struct opregion_asle) != 0x100);
        BUILD_BUG_ON(sizeof(struct opregion_asle_ext) != 0x400);
 
-       pci_read_config_dword(dev->pdev, PCI_ASLS, &asls);
+       pci_read_config_dword(dev->pdev, ASLS, &asls);
        DRM_DEBUG_DRIVER("graphic opregion physical addr: 0x%x\n", asls);
        if (asls == 0) {
                DRM_DEBUG_DRIVER("ACPI OpRegion not supported!\n");
                return -ENOTSUPP;
        }
 
-#ifdef CONFIG_ACPI
        INIT_WORK(&opregion->asle_work, asle_work);
-#endif
 
        base = memremap(asls, OPREGION_SIZE, MEMREMAP_WB);
        if (!base)
@@ -1024,3 +1012,31 @@ err_out:
        memunmap(base);
        return err;
 }
+
+int
+intel_opregion_get_panel_type(struct drm_device *dev)
+{
+       u32 panel_details;
+       int ret;
+
+       ret = swsci(dev, SWSCI_GBDA_PANEL_DETAILS, 0x0, &panel_details);
+       if (ret) {
+               DRM_DEBUG_KMS("Failed to get panel details from OpRegion (%d)\n",
+                             ret);
+               return ret;
+       }
+
+       ret = (panel_details >> 8) & 0xff;
+       if (ret > 0x10) {
+               DRM_DEBUG_KMS("Invalid OpRegion panel type 0x%x\n", ret);
+               return -EINVAL;
+       }
+
+       /* fall back to VBT panel type? */
+       if (ret == 0x0) {
+               DRM_DEBUG_KMS("No panel type in OpRegion\n");
+               return -ENODEV;
+       }
+
+       return ret - 1;
+}
index 9168413fe204402d4476d2b873be39368b099e4d..bd38e49f733406612cac8a72e3efb5a43b3516a2 100644 (file)
@@ -190,13 +190,14 @@ struct intel_overlay {
 static struct overlay_registers __iomem *
 intel_overlay_map_regs(struct intel_overlay *overlay)
 {
-       struct drm_i915_private *dev_priv = overlay->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(overlay->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct overlay_registers __iomem *regs;
 
        if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
                regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->vaddr;
        else
-               regs = io_mapping_map_wc(dev_priv->gtt.mappable,
+               regs = io_mapping_map_wc(ggtt->mappable,
                                         i915_gem_obj_ggtt_offset(overlay->reg_bo));
 
        return regs;
@@ -233,30 +234,30 @@ static int intel_overlay_on(struct intel_overlay *overlay)
 {
        struct drm_device *dev = overlay->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        struct drm_i915_gem_request *req;
        int ret;
 
        WARN_ON(overlay->active);
        WARN_ON(IS_I830(dev) && !(dev_priv->quirks & QUIRK_PIPEA_FORCE));
 
-       req = i915_gem_request_alloc(ring, NULL);
+       req = i915_gem_request_alloc(engine, NULL);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        ret = intel_ring_begin(req, 4);
        if (ret) {
-               i915_gem_request_cancel(req);
+               i915_add_request_no_flush(req);
                return ret;
        }
 
        overlay->active = true;
 
-       intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_ON);
-       intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE);
-       intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_OVERLAY_FLIP | MI_OVERLAY_ON);
+       intel_ring_emit(engine, overlay->flip_addr | OFC_UPDATE);
+       intel_ring_emit(engine, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return intel_overlay_do_wait_request(overlay, req, NULL);
 }
@@ -267,7 +268,7 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
 {
        struct drm_device *dev = overlay->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        struct drm_i915_gem_request *req;
        u32 flip_addr = overlay->flip_addr;
        u32 tmp;
@@ -283,19 +284,19 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
        if (tmp & (1 << 17))
                DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp);
 
-       req = i915_gem_request_alloc(ring, NULL);
+       req = i915_gem_request_alloc(engine, NULL);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        ret = intel_ring_begin(req, 2);
        if (ret) {
-               i915_gem_request_cancel(req);
+               i915_add_request_no_flush(req);
                return ret;
        }
 
-       intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
-       intel_ring_emit(ring, flip_addr);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
+       intel_ring_emit(engine, flip_addr);
+       intel_ring_advance(engine);
 
        WARN_ON(overlay->last_flip_req);
        i915_gem_request_assign(&overlay->last_flip_req, req);
@@ -336,7 +337,7 @@ static int intel_overlay_off(struct intel_overlay *overlay)
 {
        struct drm_device *dev = overlay->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        struct drm_i915_gem_request *req;
        u32 flip_addr = overlay->flip_addr;
        int ret;
@@ -349,33 +350,34 @@ static int intel_overlay_off(struct intel_overlay *overlay)
         * of the hw. Do it in both cases */
        flip_addr |= OFC_UPDATE;
 
-       req = i915_gem_request_alloc(ring, NULL);
+       req = i915_gem_request_alloc(engine, NULL);
        if (IS_ERR(req))
                return PTR_ERR(req);
 
        ret = intel_ring_begin(req, 6);
        if (ret) {
-               i915_gem_request_cancel(req);
+               i915_add_request_no_flush(req);
                return ret;
        }
 
        /* wait for overlay to go idle */
-       intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
-       intel_ring_emit(ring, flip_addr);
-       intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
+       intel_ring_emit(engine, MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE);
+       intel_ring_emit(engine, flip_addr);
+       intel_ring_emit(engine, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
        /* turn overlay off */
        if (IS_I830(dev)) {
                /* Workaround: Don't disable the overlay fully, since otherwise
                 * it dies on the next OVERLAY_ON cmd. */
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_emit(engine, MI_NOOP);
+               intel_ring_emit(engine, MI_NOOP);
+               intel_ring_emit(engine, MI_NOOP);
        } else {
-               intel_ring_emit(ring, MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
-               intel_ring_emit(ring, flip_addr);
-               intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
+               intel_ring_emit(engine, MI_OVERLAY_FLIP | MI_OVERLAY_OFF);
+               intel_ring_emit(engine, flip_addr);
+               intel_ring_emit(engine,
+                               MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
        }
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return intel_overlay_do_wait_request(overlay, req, intel_overlay_off_tail);
 }
@@ -408,7 +410,7 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
 {
        struct drm_device *dev = overlay->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        int ret;
 
        WARN_ON(!mutex_is_locked(&dev->struct_mutex));
@@ -423,19 +425,20 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
                /* synchronous slowpath */
                struct drm_i915_gem_request *req;
 
-               req = i915_gem_request_alloc(ring, NULL);
+               req = i915_gem_request_alloc(engine, NULL);
                if (IS_ERR(req))
                        return PTR_ERR(req);
 
                ret = intel_ring_begin(req, 2);
                if (ret) {
-                       i915_gem_request_cancel(req);
+                       i915_add_request_no_flush(req);
                        return ret;
                }
 
-               intel_ring_emit(ring, MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_advance(ring);
+               intel_ring_emit(engine,
+                               MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
+               intel_ring_emit(engine, MI_NOOP);
+               intel_ring_advance(engine);
 
                ret = intel_overlay_do_wait_request(overlay, req,
                                                    intel_overlay_release_old_vid_tail);
@@ -1124,7 +1127,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
        }
        crtc = to_intel_crtc(drmmode_crtc);
 
-       new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
+       new_bo = to_intel_bo(drm_gem_object_lookup(file_priv,
                                                   put_image_rec->bo_handle));
        if (&new_bo->base == NULL) {
                ret = -ENOENT;
@@ -1479,7 +1482,8 @@ struct intel_overlay_error_state {
 static struct overlay_registers __iomem *
 intel_overlay_map_regs_atomic(struct intel_overlay *overlay)
 {
-       struct drm_i915_private *dev_priv = overlay->dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(overlay->dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct overlay_registers __iomem *regs;
 
        if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
@@ -1488,7 +1492,7 @@ intel_overlay_map_regs_atomic(struct intel_overlay *overlay)
                regs = (struct overlay_registers __iomem *)
                        overlay->reg_bo->phys_handle->vaddr;
        else
-               regs = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
+               regs = io_mapping_map_atomic_wc(ggtt->mappable,
                                                i915_gem_obj_ggtt_offset(overlay->reg_bo));
 
        return regs;
index 21ee6477bf98d1fe7974f90e76369adb57cbcc83..a0788763757b0d650ab25d213aea9d1b5c8c032d 100644 (file)
@@ -504,7 +504,7 @@ static u32 i9xx_get_backlight(struct intel_connector *connector)
        if (panel->backlight.combination_mode) {
                u8 lbpc;
 
-               pci_read_config_byte(dev_priv->dev->pdev, PCI_LBPC, &lbpc);
+               pci_read_config_byte(dev_priv->dev->pdev, LBPC, &lbpc);
                val *= lbpc;
        }
 
@@ -592,7 +592,7 @@ static void i9xx_set_backlight(struct intel_connector *connector, u32 level)
 
                lbpc = level * 0xfe / panel->backlight.max + 1;
                level /= lbpc;
-               pci_write_config_byte(dev_priv->dev->pdev, PCI_LBPC, lbpc);
+               pci_write_config_byte(dev_priv->dev->pdev, LBPC, lbpc);
        }
 
        if (IS_GEN4(dev_priv)) {
@@ -1240,7 +1240,7 @@ static void intel_backlight_device_unregister(struct intel_connector *connector)
  */
 static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 {
-       return KHz(19200) / pwm_freq_hz;
+       return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
 }
 
 /*
@@ -1251,16 +1251,14 @@ static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 {
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
-       u32 mul, clock;
+       u32 mul;
 
        if (I915_READ(SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY)
                mul = 128;
        else
                mul = 16;
 
-       clock = MHz(24);
-
-       return clock / (pwm_freq_hz * mul);
+       return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
 }
 
 /*
@@ -1283,7 +1281,7 @@ static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
        else
                clock = MHz(24); /* LPT:LP */
 
-       return clock / (pwm_freq_hz * mul);
+       return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
 }
 
 /*
@@ -1292,10 +1290,9 @@ static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  */
 static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 {
-       struct drm_device *dev = connector->base.dev;
-       int clock = MHz(intel_pch_rawclk(dev));
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
 
-       return clock / (pwm_freq_hz * 128);
+       return DIV_ROUND_CLOSEST(KHz(dev_priv->rawclk_freq), pwm_freq_hz * 128);
 }
 
 /*
@@ -1308,16 +1305,15 @@ static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  */
 static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 {
-       struct drm_device *dev = connector->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        int clock;
 
-       if (IS_PINEVIEW(dev))
-               clock = MHz(intel_hrawclk(dev));
+       if (IS_PINEVIEW(dev_priv))
+               clock = KHz(dev_priv->rawclk_freq);
        else
-               clock = 1000 * dev_priv->cdclk_freq;
+               clock = KHz(dev_priv->cdclk_freq);
 
-       return clock / (pwm_freq_hz * 32);
+       return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
 }
 
 /*
@@ -1332,11 +1328,11 @@ static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
        int clock;
 
        if (IS_G4X(dev_priv))
-               clock = MHz(intel_hrawclk(dev));
+               clock = KHz(dev_priv->rawclk_freq);
        else
-               clock = 1000 * dev_priv->cdclk_freq;
+               clock = KHz(dev_priv->cdclk_freq);
 
-       return clock / (pwm_freq_hz * 128);
+       return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
 }
 
 /*
@@ -1346,19 +1342,21 @@ static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
  */
 static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
 {
-       struct drm_device *dev = connector->base.dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int clock;
+       struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
+       int mul, clock;
 
        if ((I915_READ(CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
-               if (IS_CHERRYVIEW(dev))
-                       return KHz(19200) / (pwm_freq_hz * 16);
+               if (IS_CHERRYVIEW(dev_priv))
+                       clock = KHz(19200);
                else
-                       return MHz(25) / (pwm_freq_hz * 16);
+                       clock = MHz(25);
+               mul = 16;
        } else {
-               clock = intel_hrawclk(dev);
-               return MHz(clock) / (pwm_freq_hz * 128);
+               clock = KHz(dev_priv->rawclk_freq);
+               mul = 128;
        }
+
+       return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
 }
 
 static u32 get_backlight_max_vbt(struct intel_connector *connector)
@@ -1745,7 +1743,7 @@ intel_panel_init_backlight_funcs(struct intel_panel *panel)
                panel->backlight.get = pch_get_backlight;
                panel->backlight.hz_to_pwm = pch_hz_to_pwm;
        } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
-               if (dev_priv->vbt.has_mipi) {
+               if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
                        panel->backlight.setup = pwm_setup_backlight;
                        panel->backlight.enable = pwm_enable_backlight;
                        panel->backlight.disable = pwm_disable_backlight;
index 3425d8e737b344ec8d43bdeab38957e2667d00bf..4b60005cda378f27293d2721baf09970818eea2e 100644 (file)
@@ -487,20 +487,6 @@ static const struct intel_watermark_params g4x_cursor_wm_info = {
        .guard_size = 2,
        .cacheline_size = G4X_FIFO_LINE_SIZE,
 };
-static const struct intel_watermark_params valleyview_wm_info = {
-       .fifo_size = VALLEYVIEW_FIFO_SIZE,
-       .max_wm = VALLEYVIEW_MAX_WM,
-       .default_wm = VALLEYVIEW_MAX_WM,
-       .guard_size = 2,
-       .cacheline_size = G4X_FIFO_LINE_SIZE,
-};
-static const struct intel_watermark_params valleyview_cursor_wm_info = {
-       .fifo_size = I965_CURSOR_FIFO,
-       .max_wm = VALLEYVIEW_CURSOR_MAX_WM,
-       .default_wm = I965_CURSOR_DFT_WM,
-       .guard_size = 2,
-       .cacheline_size = G4X_FIFO_LINE_SIZE,
-};
 static const struct intel_watermark_params i965_cursor_wm_info = {
        .fifo_size = I965_CURSOR_FIFO,
        .max_wm = I965_CURSOR_MAX_WM,
@@ -2010,11 +1996,18 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
                cur_latency *= 5;
        }
 
-       result->pri_val = ilk_compute_pri_wm(cstate, pristate,
-                                            pri_latency, level);
-       result->spr_val = ilk_compute_spr_wm(cstate, sprstate, spr_latency);
-       result->cur_val = ilk_compute_cur_wm(cstate, curstate, cur_latency);
-       result->fbc_val = ilk_compute_fbc_wm(cstate, pristate, result->pri_val);
+       if (pristate) {
+               result->pri_val = ilk_compute_pri_wm(cstate, pristate,
+                                                    pri_latency, level);
+               result->fbc_val = ilk_compute_fbc_wm(cstate, pristate, result->pri_val);
+       }
+
+       if (sprstate)
+               result->spr_val = ilk_compute_spr_wm(cstate, sprstate, spr_latency);
+
+       if (curstate)
+               result->cur_val = ilk_compute_cur_wm(cstate, curstate, cur_latency);
+
        result->enable = true;
 }
 
@@ -2278,99 +2271,170 @@ static void skl_setup_wm_latency(struct drm_device *dev)
        intel_print_wm_latency(dev, "Gen9 Plane", dev_priv->wm.skl_latency);
 }
 
+static bool ilk_validate_pipe_wm(struct drm_device *dev,
+                                struct intel_pipe_wm *pipe_wm)
+{
+       /* LP0 watermark maximums depend on this pipe alone */
+       const struct intel_wm_config config = {
+               .num_pipes_active = 1,
+               .sprites_enabled = pipe_wm->sprites_enabled,
+               .sprites_scaled = pipe_wm->sprites_scaled,
+       };
+       struct ilk_wm_maximums max;
+
+       /* LP0 watermarks always use 1/2 DDB partitioning */
+       ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max);
+
+       /* At least LP0 must be valid */
+       if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0])) {
+               DRM_DEBUG_KMS("LP0 watermark invalid\n");
+               return false;
+       }
+
+       return true;
+}
+
 /* Compute new watermarks for the pipe */
-static int ilk_compute_pipe_wm(struct intel_crtc *intel_crtc,
-                              struct drm_atomic_state *state)
+static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
 {
+       struct drm_atomic_state *state = cstate->base.state;
+       struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
        struct intel_pipe_wm *pipe_wm;
-       struct drm_device *dev = intel_crtc->base.dev;
+       struct drm_device *dev = state->dev;
        const struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc_state *cstate = NULL;
        struct intel_plane *intel_plane;
-       struct drm_plane_state *ps;
        struct intel_plane_state *pristate = NULL;
        struct intel_plane_state *sprstate = NULL;
        struct intel_plane_state *curstate = NULL;
-       int level, max_level = ilk_wm_max_level(dev);
-       /* LP0 watermark maximums depend on this pipe alone */
-       struct intel_wm_config config = {
-               .num_pipes_active = 1,
-       };
+       int level, max_level = ilk_wm_max_level(dev), usable_level;
        struct ilk_wm_maximums max;
 
-       cstate = intel_atomic_get_crtc_state(state, intel_crtc);
-       if (IS_ERR(cstate))
-               return PTR_ERR(cstate);
-
        pipe_wm = &cstate->wm.optimal.ilk;
-       memset(pipe_wm, 0, sizeof(*pipe_wm));
 
        for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
-               ps = drm_atomic_get_plane_state(state,
-                                               &intel_plane->base);
-               if (IS_ERR(ps))
-                       return PTR_ERR(ps);
+               struct intel_plane_state *ps;
+
+               ps = intel_atomic_get_existing_plane_state(state,
+                                                          intel_plane);
+               if (!ps)
+                       continue;
 
                if (intel_plane->base.type == DRM_PLANE_TYPE_PRIMARY)
-                       pristate = to_intel_plane_state(ps);
+                       pristate = ps;
                else if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY)
-                       sprstate = to_intel_plane_state(ps);
+                       sprstate = ps;
                else if (intel_plane->base.type == DRM_PLANE_TYPE_CURSOR)
-                       curstate = to_intel_plane_state(ps);
+                       curstate = ps;
        }
 
-       config.sprites_enabled = sprstate->visible;
-       config.sprites_scaled = sprstate->visible &&
-               (drm_rect_width(&sprstate->dst) != drm_rect_width(&sprstate->src) >> 16 ||
-               drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16);
-
        pipe_wm->pipe_enabled = cstate->base.active;
-       pipe_wm->sprites_enabled = config.sprites_enabled;
-       pipe_wm->sprites_scaled = config.sprites_scaled;
+       if (sprstate) {
+               pipe_wm->sprites_enabled = sprstate->visible;
+               pipe_wm->sprites_scaled = sprstate->visible &&
+                       (drm_rect_width(&sprstate->dst) != drm_rect_width(&sprstate->src) >> 16 ||
+                        drm_rect_height(&sprstate->dst) != drm_rect_height(&sprstate->src) >> 16);
+       }
+
+       usable_level = max_level;
 
        /* ILK/SNB: LP2+ watermarks only w/o sprites */
-       if (INTEL_INFO(dev)->gen <= 6 && sprstate->visible)
-               max_level = 1;
+       if (INTEL_INFO(dev)->gen <= 6 && pipe_wm->sprites_enabled)
+               usable_level = 1;
 
        /* ILK/SNB/IVB: LP1+ watermarks only w/o scaling */
-       if (config.sprites_scaled)
-               max_level = 0;
+       if (pipe_wm->sprites_scaled)
+               usable_level = 0;
 
        ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate,
-                            pristate, sprstate, curstate, &pipe_wm->wm[0]);
+                            pristate, sprstate, curstate, &pipe_wm->raw_wm[0]);
+
+       memset(&pipe_wm->wm, 0, sizeof(pipe_wm->wm));
+       pipe_wm->wm[0] = pipe_wm->raw_wm[0];
 
        if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                pipe_wm->linetime = hsw_compute_linetime_wm(dev, cstate);
 
-       /* LP0 watermarks always use 1/2 DDB partitioning */
-       ilk_compute_wm_maximums(dev, 0, &config, INTEL_DDB_PART_1_2, &max);
-
-       /* At least LP0 must be valid */
-       if (!ilk_validate_wm_level(0, &max, &pipe_wm->wm[0]))
+       if (!ilk_validate_pipe_wm(dev, pipe_wm))
                return -EINVAL;
 
        ilk_compute_wm_reg_maximums(dev, 1, &max);
 
        for (level = 1; level <= max_level; level++) {
-               struct intel_wm_level wm = {};
+               struct intel_wm_level *wm = &pipe_wm->raw_wm[level];
 
                ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate,
-                                    pristate, sprstate, curstate, &wm);
+                                    pristate, sprstate, curstate, wm);
 
                /*
                 * Disable any watermark level that exceeds the
                 * register maximums since such watermarks are
                 * always invalid.
                 */
-               if (!ilk_validate_wm_level(level, &max, &wm))
-                       break;
+               if (level > usable_level)
+                       continue;
 
-               pipe_wm->wm[level] = wm;
+               if (ilk_validate_wm_level(level, &max, wm))
+                       pipe_wm->wm[level] = *wm;
+               else
+                       usable_level = level;
        }
 
        return 0;
 }
 
+/*
+ * Build a set of 'intermediate' watermark values that satisfy both the old
+ * state and the new state.  These can be programmed to the hardware
+ * immediately.
+ */
+static int ilk_compute_intermediate_wm(struct drm_device *dev,
+                                      struct intel_crtc *intel_crtc,
+                                      struct intel_crtc_state *newstate)
+{
+       struct intel_pipe_wm *a = &newstate->wm.intermediate;
+       struct intel_pipe_wm *b = &intel_crtc->wm.active.ilk;
+       int level, max_level = ilk_wm_max_level(dev);
+
+       /*
+        * Start with the final, target watermarks, then combine with the
+        * currently active watermarks to get values that are safe both before
+        * and after the vblank.
+        */
+       *a = newstate->wm.optimal.ilk;
+       a->pipe_enabled |= b->pipe_enabled;
+       a->sprites_enabled |= b->sprites_enabled;
+       a->sprites_scaled |= b->sprites_scaled;
+
+       for (level = 0; level <= max_level; level++) {
+               struct intel_wm_level *a_wm = &a->wm[level];
+               const struct intel_wm_level *b_wm = &b->wm[level];
+
+               a_wm->enable &= b_wm->enable;
+               a_wm->pri_val = max(a_wm->pri_val, b_wm->pri_val);
+               a_wm->spr_val = max(a_wm->spr_val, b_wm->spr_val);
+               a_wm->cur_val = max(a_wm->cur_val, b_wm->cur_val);
+               a_wm->fbc_val = max(a_wm->fbc_val, b_wm->fbc_val);
+       }
+
+       /*
+        * We need to make sure that these merged watermark values are
+        * actually a valid configuration themselves.  If they're not,
+        * there's no safe way to transition from the old state to
+        * the new state, so we need to fail the atomic transaction.
+        */
+       if (!ilk_validate_pipe_wm(dev, a))
+               return -EINVAL;
+
+       /*
+        * If our intermediate WM are identical to the final WM, then we can
+        * omit the post-vblank programming; only update if it's different.
+        */
+       if (memcmp(a, &newstate->wm.optimal.ilk, sizeof(*a)) == 0)
+               newstate->wm.need_postvbl_update = false;
+
+       return 0;
+}
+
 /*
  * Merge the watermarks from all active pipes for a specific level.
  */
@@ -2383,9 +2447,7 @@ static void ilk_merge_wm_level(struct drm_device *dev,
        ret_wm->enable = true;
 
        for_each_intel_crtc(dev, intel_crtc) {
-               const struct intel_crtc_state *cstate =
-                       to_intel_crtc_state(intel_crtc->base.state);
-               const struct intel_pipe_wm *active = &cstate->wm.optimal.ilk;
+               const struct intel_pipe_wm *active = &intel_crtc->wm.active.ilk;
                const struct intel_wm_level *wm = &active->wm[level];
 
                if (!active->pipe_enabled)
@@ -2421,7 +2483,7 @@ static void ilk_wm_merge(struct drm_device *dev,
        /* ILK/SNB/IVB: LP1+ watermarks only w/ single pipe */
        if ((INTEL_INFO(dev)->gen <= 6 || IS_IVYBRIDGE(dev)) &&
            config->num_pipes_active > 1)
-               return;
+               last_enabled_level = 0;
 
        /* ILK: FBC WM must be disabled always */
        merged->fbc_wm_enabled = INTEL_INFO(dev)->gen >= 6;
@@ -2533,15 +2595,14 @@ static void ilk_compute_wm_results(struct drm_device *dev,
 
        /* LP0 register values */
        for_each_intel_crtc(dev, intel_crtc) {
-               const struct intel_crtc_state *cstate =
-                       to_intel_crtc_state(intel_crtc->base.state);
                enum pipe pipe = intel_crtc->pipe;
-               const struct intel_wm_level *r = &cstate->wm.optimal.ilk.wm[0];
+               const struct intel_wm_level *r =
+                       &intel_crtc->wm.active.ilk.wm[0];
 
                if (WARN_ON(!r->enable))
                        continue;
 
-               results->wm_linetime[pipe] = cstate->wm.optimal.ilk.linetime;
+               results->wm_linetime[pipe] = intel_crtc->wm.active.ilk.linetime;
 
                results->wm_pipe[pipe] =
                        (r->pri_val << WM0_PIPE_PLANE_SHIFT) |
@@ -2748,7 +2809,7 @@ static void ilk_write_wm_values(struct drm_i915_private *dev_priv,
        dev_priv->wm.hw = *results;
 }
 
-static bool ilk_disable_lp_wm(struct drm_device *dev)
+bool ilk_disable_lp_wm(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
@@ -3657,11 +3718,9 @@ static void ilk_compute_wm_config(struct drm_device *dev,
        }
 }
 
-static void ilk_program_watermarks(struct intel_crtc_state *cstate)
+static void ilk_program_watermarks(struct drm_i915_private *dev_priv)
 {
-       struct drm_crtc *crtc = cstate->base.crtc;
-       struct drm_device *dev = crtc->dev;
-       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct drm_device *dev = dev_priv->dev;
        struct intel_pipe_wm lp_wm_1_2 = {}, lp_wm_5_6 = {}, *best_lp_wm;
        struct ilk_wm_maximums max;
        struct intel_wm_config config = {};
@@ -3692,28 +3751,28 @@ static void ilk_program_watermarks(struct intel_crtc_state *cstate)
        ilk_write_wm_values(dev_priv, &results);
 }
 
-static void ilk_update_wm(struct drm_crtc *crtc)
+static void ilk_initial_watermarks(struct intel_crtc_state *cstate)
 {
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_crtc_state *cstate = to_intel_crtc_state(crtc->state);
-
-       WARN_ON(cstate->base.active != intel_crtc->active);
+       struct drm_i915_private *dev_priv = to_i915(cstate->base.crtc->dev);
+       struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
 
-       /*
-        * IVB workaround: must disable low power watermarks for at least
-        * one frame before enabling scaling.  LP watermarks can be re-enabled
-        * when scaling is disabled.
-        *
-        * WaCxSRDisabledForSpriteScaling:ivb
-        */
-       if (cstate->disable_lp_wm) {
-               ilk_disable_lp_wm(crtc->dev);
-               intel_wait_for_vblank(crtc->dev, intel_crtc->pipe);
-       }
+       mutex_lock(&dev_priv->wm.wm_mutex);
+       intel_crtc->wm.active.ilk = cstate->wm.intermediate;
+       ilk_program_watermarks(dev_priv);
+       mutex_unlock(&dev_priv->wm.wm_mutex);
+}
 
-       intel_crtc->wm.active.ilk = cstate->wm.optimal.ilk;
+static void ilk_optimize_watermarks(struct intel_crtc_state *cstate)
+{
+       struct drm_i915_private *dev_priv = to_i915(cstate->base.crtc->dev);
+       struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
 
-       ilk_program_watermarks(cstate);
+       mutex_lock(&dev_priv->wm.wm_mutex);
+       if (cstate->wm.need_postvbl_update) {
+               intel_crtc->wm.active.ilk = cstate->wm.optimal.ilk;
+               ilk_program_watermarks(dev_priv);
+       }
+       mutex_unlock(&dev_priv->wm.wm_mutex);
 }
 
 static void skl_pipe_wm_active_state(uint32_t val,
@@ -4243,7 +4302,7 @@ static u32 intel_rps_limits(struct drm_i915_private *dev_priv, u8 val)
         * the hw runs at the minimal clock before selecting the desired
         * frequency, if the down threshold expires in that window we will not
         * receive a down interrupt. */
-       if (IS_GEN9(dev_priv->dev)) {
+       if (IS_GEN9(dev_priv)) {
                limits = (dev_priv->rps.max_freq_softlimit) << 23;
                if (val <= dev_priv->rps.min_freq_softlimit)
                        limits |= (dev_priv->rps.min_freq_softlimit) << 14;
@@ -4528,7 +4587,7 @@ void intel_set_rps(struct drm_device *dev, u8 val)
                gen6_set_rps(dev, val);
 }
 
-static void gen9_disable_rps(struct drm_device *dev)
+static void gen9_disable_rc6(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
@@ -4536,12 +4595,20 @@ static void gen9_disable_rps(struct drm_device *dev)
        I915_WRITE(GEN9_PG_ENABLE, 0);
 }
 
+static void gen9_disable_rps(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       I915_WRITE(GEN6_RP_CONTROL, 0);
+}
+
 static void gen6_disable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        I915_WRITE(GEN6_RC_CONTROL, 0);
        I915_WRITE(GEN6_RPNSWREQ, 1 << 31);
+       I915_WRITE(GEN6_RP_CONTROL, 0);
 }
 
 static void cherryview_disable_rps(struct drm_device *dev)
@@ -4585,7 +4652,8 @@ static void intel_print_rc6_info(struct drm_device *dev, u32 mode)
 
 static bool bxt_check_bios_rc6_setup(const struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        bool enable_rc6 = true;
        unsigned long rc6_ctx_base;
 
@@ -4599,9 +4667,9 @@ static bool bxt_check_bios_rc6_setup(const struct drm_device *dev)
         * for this check.
         */
        rc6_ctx_base = I915_READ(RC6_CTX_BASE) & RC6_CTX_BASE_MASK;
-       if (!((rc6_ctx_base >= dev_priv->gtt.stolen_reserved_base) &&
-             (rc6_ctx_base + PAGE_SIZE <= dev_priv->gtt.stolen_reserved_base +
-                                       dev_priv->gtt.stolen_reserved_size))) {
+       if (!((rc6_ctx_base >= ggtt->stolen_reserved_base) &&
+             (rc6_ctx_base + PAGE_SIZE <= ggtt->stolen_reserved_base +
+                                       ggtt->stolen_reserved_size))) {
                DRM_DEBUG_KMS("RC6 Base address not as expected.\n");
                enable_rc6 = false;
        }
@@ -4744,6 +4812,16 @@ static void gen9_enable_rps(struct drm_device *dev)
 
        /* WaGsvDisableTurbo: Workaround to disable turbo on BXT A* */
        if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
+               /*
+                * BIOS could leave the Hw Turbo enabled, so need to explicitly
+                * clear out the Control register just to avoid inconsitency
+                * with debugfs interface, which will show  Turbo as enabled
+                * only and that is not expected by the User after adding the
+                * WaGsvDisableTurbo. Apart from this there is no problem even
+                * if the Turbo is left enabled in the Control register, as the
+                * Up/Down interrupts would remain masked.
+                */
+               gen9_disable_rps(dev);
                intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
                return;
        }
@@ -4762,7 +4840,7 @@ static void gen9_enable_rps(struct drm_device *dev)
         * Up/Down EI & threshold registers, as well as the RP_CONTROL,
         * RP_INTERRUPT_LIMITS & RPNSWREQ registers */
        dev_priv->rps.power = HIGH_POWER; /* force a reset */
-       gen6_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit);
+       gen6_set_rps(dev_priv->dev, dev_priv->rps.idle_freq);
 
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 }
@@ -4770,9 +4848,8 @@ static void gen9_enable_rps(struct drm_device *dev)
 static void gen9_enable_rc6(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        uint32_t rc6_mask = 0;
-       int unused;
 
        /* 1a: Software RC state - RC0 */
        I915_WRITE(GEN6_RC_STATE, 0);
@@ -4793,8 +4870,8 @@ static void gen9_enable_rc6(struct drm_device *dev)
                I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16);
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
-       for_each_ring(ring, dev_priv, unused)
-               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MAX_IDLE(engine->mmio_base), 10);
 
        if (HAS_GUC_UCODE(dev))
                I915_WRITE(GUC_MAX_IDLE_COUNT, 0xA);
@@ -4840,9 +4917,8 @@ static void gen9_enable_rc6(struct drm_device *dev)
 static void gen8_enable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        uint32_t rc6_mask = 0;
-       int unused;
 
        /* 1a: Software RC state - RC0 */
        I915_WRITE(GEN6_RC_STATE, 0);
@@ -4861,8 +4937,8 @@ static void gen8_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40 << 16);
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
-       for_each_ring(ring, dev_priv, unused)
-               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MAX_IDLE(engine->mmio_base), 10);
        I915_WRITE(GEN6_RC_SLEEP, 0);
        if (IS_BROADWELL(dev))
                I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us/1.28 for TO */
@@ -4922,11 +4998,11 @@ static void gen8_enable_rps(struct drm_device *dev)
 static void gen6_enable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        u32 rc6vids, pcu_mbox = 0, rc6_mask = 0;
        u32 gtfifodbg;
        int rc6_mode;
-       int i, ret;
+       int ret;
 
        WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
 
@@ -4939,7 +5015,8 @@ static void gen6_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RC_STATE, 0);
 
        /* Clear the DBG now so we don't confuse earlier errors */
-       if ((gtfifodbg = I915_READ(GTFIFODBG))) {
+       gtfifodbg = I915_READ(GTFIFODBG);
+       if (gtfifodbg) {
                DRM_ERROR("GT fifo had a previous error %x\n", gtfifodbg);
                I915_WRITE(GTFIFODBG, gtfifodbg);
        }
@@ -4958,8 +5035,8 @@ static void gen6_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000);
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25);
 
-       for_each_ring(ring, dev_priv, i)
-               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MAX_IDLE(engine->mmio_base), 10);
 
        I915_WRITE(GEN6_RC_SLEEP, 0);
        I915_WRITE(GEN6_RC1e_THRESHOLD, 1000);
@@ -5244,9 +5321,9 @@ static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
 
 static void cherryview_setup_pctx(struct drm_device *dev)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        unsigned long pctx_paddr, paddr;
-       struct i915_gtt *gtt = &dev_priv->gtt;
        u32 pcbr;
        int pctx_size = 32*1024;
 
@@ -5254,7 +5331,7 @@ static void cherryview_setup_pctx(struct drm_device *dev)
        if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) {
                DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n");
                paddr = (dev_priv->mm.stolen_base +
-                        (gtt->stolen_size - pctx_size));
+                        (ggtt->stolen_size - pctx_size));
 
                pctx_paddr = (paddr & (~4095));
                I915_WRITE(VLV_PCBR, pctx_paddr);
@@ -5322,6 +5399,17 @@ static void valleyview_cleanup_pctx(struct drm_device *dev)
        dev_priv->vlv_pctx = NULL;
 }
 
+static void vlv_init_gpll_ref_freq(struct drm_i915_private *dev_priv)
+{
+       dev_priv->rps.gpll_ref_freq =
+               vlv_get_cck_clock(dev_priv, "GPLL ref",
+                                 CCK_GPLL_CLOCK_CONTROL,
+                                 dev_priv->czclk_freq);
+
+       DRM_DEBUG_DRIVER("GPLL reference freq: %d kHz\n",
+                        dev_priv->rps.gpll_ref_freq);
+}
+
 static void valleyview_init_gt_powersave(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -5329,6 +5417,8 @@ static void valleyview_init_gt_powersave(struct drm_device *dev)
 
        valleyview_setup_pctx(dev);
 
+       vlv_init_gpll_ref_freq(dev_priv);
+
        mutex_lock(&dev_priv->rps.hw_lock);
 
        val = vlv_punit_read(dev_priv, PUNIT_REG_GPU_FREQ_STS);
@@ -5386,6 +5476,8 @@ static void cherryview_init_gt_powersave(struct drm_device *dev)
 
        cherryview_setup_pctx(dev);
 
+       vlv_init_gpll_ref_freq(dev_priv);
+
        mutex_lock(&dev_priv->rps.hw_lock);
 
        mutex_lock(&dev_priv->sb_lock);
@@ -5450,13 +5542,13 @@ static void valleyview_cleanup_gt_powersave(struct drm_device *dev)
 static void cherryview_enable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        u32 gtfifodbg, val, rc6_mode = 0, pcbr;
-       int i;
 
        WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
 
-       gtfifodbg = I915_READ(GTFIFODBG);
+       gtfifodbg = I915_READ(GTFIFODBG) & ~(GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV |
+                                            GT_FIFO_FREE_ENTRIES_CHV);
        if (gtfifodbg) {
                DRM_DEBUG_DRIVER("GT fifo had a previous error %x\n",
                                 gtfifodbg);
@@ -5477,8 +5569,8 @@ static void cherryview_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25); /* 25 * 1280ns */
 
-       for_each_ring(ring, dev_priv, i)
-               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MAX_IDLE(engine->mmio_base), 10);
        I915_WRITE(GEN6_RC_SLEEP, 0);
 
        /* TO threshold set to 500 us ( 0x186 * 1.28 us) */
@@ -5537,10 +5629,10 @@ static void cherryview_enable_rps(struct drm_device *dev)
                         dev_priv->rps.cur_freq);
 
        DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
-                        intel_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
-                        dev_priv->rps.efficient_freq);
+                        intel_gpu_freq(dev_priv, dev_priv->rps.idle_freq),
+                        dev_priv->rps.idle_freq);
 
-       valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+       valleyview_set_rps(dev_priv->dev, dev_priv->rps.idle_freq);
 
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 }
@@ -5548,15 +5640,15 @@ static void cherryview_enable_rps(struct drm_device *dev)
 static void valleyview_enable_rps(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        u32 gtfifodbg, val, rc6_mode = 0;
-       int i;
 
        WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
 
        valleyview_check_pctx(dev_priv);
 
-       if ((gtfifodbg = I915_READ(GTFIFODBG))) {
+       gtfifodbg = I915_READ(GTFIFODBG);
+       if (gtfifodbg) {
                DRM_DEBUG_DRIVER("GT fifo had a previous error %x\n",
                                 gtfifodbg);
                I915_WRITE(GTFIFODBG, gtfifodbg);
@@ -5588,8 +5680,8 @@ static void valleyview_enable_rps(struct drm_device *dev)
        I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000);
        I915_WRITE(GEN6_RC_IDLE_HYSTERSIS, 25);
 
-       for_each_ring(ring, dev_priv, i)
-               I915_WRITE(RING_MAX_IDLE(ring->mmio_base), 10);
+       for_each_engine(engine, dev_priv)
+               I915_WRITE(RING_MAX_IDLE(engine->mmio_base), 10);
 
        I915_WRITE(GEN6_RC6_THRESHOLD, 0x557);
 
@@ -5627,10 +5719,10 @@ static void valleyview_enable_rps(struct drm_device *dev)
                         dev_priv->rps.cur_freq);
 
        DRM_DEBUG_DRIVER("setting GPU freq to %d MHz (%u)\n",
-                        intel_gpu_freq(dev_priv, dev_priv->rps.efficient_freq),
-                        dev_priv->rps.efficient_freq);
+                        intel_gpu_freq(dev_priv, dev_priv->rps.idle_freq),
+                        dev_priv->rps.idle_freq);
 
-       valleyview_set_rps(dev_priv->dev, dev_priv->rps.efficient_freq);
+       valleyview_set_rps(dev_priv->dev, dev_priv->rps.idle_freq);
 
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 }
@@ -5965,17 +6057,16 @@ EXPORT_SYMBOL_GPL(i915_gpu_lower);
 bool i915_gpu_busy(void)
 {
        struct drm_i915_private *dev_priv;
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        bool ret = false;
-       int i;
 
        spin_lock_irq(&mchdev_lock);
        if (!i915_mch_dev)
                goto out_unlock;
        dev_priv = i915_mch_dev;
 
-       for_each_ring(ring, dev_priv, i)
-               ret |= !list_empty(&ring->request_list);
+       for_each_engine(engine, dev_priv)
+               ret |= !list_empty(&engine->request_list);
 
 out_unlock:
        spin_unlock_irq(&mchdev_lock);
@@ -6195,9 +6286,10 @@ void intel_disable_gt_powersave(struct drm_device *dev)
                intel_suspend_gt_powersave(dev);
 
                mutex_lock(&dev_priv->rps.hw_lock);
-               if (INTEL_INFO(dev)->gen >= 9)
+               if (INTEL_INFO(dev)->gen >= 9) {
+                       gen9_disable_rc6(dev);
                        gen9_disable_rps(dev);
-               else if (IS_CHERRYVIEW(dev))
+               else if (IS_CHERRYVIEW(dev))
                        cherryview_disable_rps(dev);
                else if (IS_VALLEYVIEW(dev))
                        valleyview_disable_rps(dev);
@@ -6818,23 +6910,10 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
        gen6_check_mch_setup(dev);
 }
 
-static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
-{
-       I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
-
-       /*
-        * Disable trickle feed and enable pnd deadline calculation
-        */
-       I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
-       I915_WRITE(CBR1_VLV, 0);
-}
-
 static void valleyview_init_clock_gating(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       vlv_init_display_clock_gating(dev_priv);
-
        /* WaDisableEarlyCull:vlv */
        I915_WRITE(_3D_CHICKEN3,
                   _MASKED_BIT_ENABLE(_3D_CHICKEN_SF_DISABLE_OBJEND_CULL));
@@ -6917,8 +6996,6 @@ static void cherryview_init_clock_gating(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       vlv_init_display_clock_gating(dev_priv);
-
        /* WaVSRefCountFullforceMissDisable:chv */
        /* WaDSRefCountFullforceMissDisable:chv */
        I915_WRITE(GEN7_FF_THREAD_MODE,
@@ -7058,8 +7135,7 @@ void intel_init_clock_gating(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (dev_priv->display.init_clock_gating)
-               dev_priv->display.init_clock_gating(dev);
+       dev_priv->display.init_clock_gating(dev);
 }
 
 void intel_suspend_hw(struct drm_device *dev)
@@ -7068,6 +7144,60 @@ void intel_suspend_hw(struct drm_device *dev)
                lpt_suspend_hw(dev);
 }
 
+static void nop_init_clock_gating(struct drm_device *dev)
+{
+       DRM_DEBUG_KMS("No clock gating settings or workarounds applied.\n");
+}
+
+/**
+ * intel_init_clock_gating_hooks - setup the clock gating hooks
+ * @dev_priv: device private
+ *
+ * Setup the hooks that configure which clocks of a given platform can be
+ * gated and also apply various GT and display specific workarounds for these
+ * platforms. Note that some GT specific workarounds are applied separately
+ * when GPU contexts or batchbuffers start their execution.
+ */
+void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv)
+{
+       if (IS_SKYLAKE(dev_priv))
+               dev_priv->display.init_clock_gating = nop_init_clock_gating;
+       else if (IS_KABYLAKE(dev_priv))
+               dev_priv->display.init_clock_gating = nop_init_clock_gating;
+       else if (IS_BROXTON(dev_priv))
+               dev_priv->display.init_clock_gating = bxt_init_clock_gating;
+       else if (IS_BROADWELL(dev_priv))
+               dev_priv->display.init_clock_gating = broadwell_init_clock_gating;
+       else if (IS_CHERRYVIEW(dev_priv))
+               dev_priv->display.init_clock_gating = cherryview_init_clock_gating;
+       else if (IS_HASWELL(dev_priv))
+               dev_priv->display.init_clock_gating = haswell_init_clock_gating;
+       else if (IS_IVYBRIDGE(dev_priv))
+               dev_priv->display.init_clock_gating = ivybridge_init_clock_gating;
+       else if (IS_VALLEYVIEW(dev_priv))
+               dev_priv->display.init_clock_gating = valleyview_init_clock_gating;
+       else if (IS_GEN6(dev_priv))
+               dev_priv->display.init_clock_gating = gen6_init_clock_gating;
+       else if (IS_GEN5(dev_priv))
+               dev_priv->display.init_clock_gating = ironlake_init_clock_gating;
+       else if (IS_G4X(dev_priv))
+               dev_priv->display.init_clock_gating = g4x_init_clock_gating;
+       else if (IS_CRESTLINE(dev_priv))
+               dev_priv->display.init_clock_gating = crestline_init_clock_gating;
+       else if (IS_BROADWATER(dev_priv))
+               dev_priv->display.init_clock_gating = broadwater_init_clock_gating;
+       else if (IS_GEN3(dev_priv))
+               dev_priv->display.init_clock_gating = gen3_init_clock_gating;
+       else if (IS_I85X(dev_priv) || IS_I865G(dev_priv))
+               dev_priv->display.init_clock_gating = i85x_init_clock_gating;
+       else if (IS_GEN2(dev_priv))
+               dev_priv->display.init_clock_gating = i830_init_clock_gating;
+       else {
+               MISSING_CASE(INTEL_DEVID(dev_priv));
+               dev_priv->display.init_clock_gating = nop_init_clock_gating;
+       }
+}
+
 /* Set up chip specific power management-related functions */
 void intel_init_pm(struct drm_device *dev)
 {
@@ -7084,10 +7214,6 @@ void intel_init_pm(struct drm_device *dev)
        /* For FIFO watermark updates */
        if (INTEL_INFO(dev)->gen >= 9) {
                skl_setup_wm_latency(dev);
-
-               if (IS_BROXTON(dev))
-                       dev_priv->display.init_clock_gating =
-                               bxt_init_clock_gating;
                dev_priv->display.update_wm = skl_update_wm;
        } else if (HAS_PCH_SPLIT(dev)) {
                ilk_setup_wm_latency(dev);
@@ -7096,36 +7222,23 @@ void intel_init_pm(struct drm_device *dev)
                     dev_priv->wm.spr_latency[1] && dev_priv->wm.cur_latency[1]) ||
                    (!IS_GEN5(dev) && dev_priv->wm.pri_latency[0] &&
                     dev_priv->wm.spr_latency[0] && dev_priv->wm.cur_latency[0])) {
-                       dev_priv->display.update_wm = ilk_update_wm;
                        dev_priv->display.compute_pipe_wm = ilk_compute_pipe_wm;
-                       dev_priv->display.program_watermarks = ilk_program_watermarks;
+                       dev_priv->display.compute_intermediate_wm =
+                               ilk_compute_intermediate_wm;
+                       dev_priv->display.initial_watermarks =
+                               ilk_initial_watermarks;
+                       dev_priv->display.optimize_watermarks =
+                               ilk_optimize_watermarks;
                } else {
                        DRM_DEBUG_KMS("Failed to read display plane latency. "
                                      "Disable CxSR\n");
                }
-
-               if (IS_GEN5(dev))
-                       dev_priv->display.init_clock_gating = ironlake_init_clock_gating;
-               else if (IS_GEN6(dev))
-                       dev_priv->display.init_clock_gating = gen6_init_clock_gating;
-               else if (IS_IVYBRIDGE(dev))
-                       dev_priv->display.init_clock_gating = ivybridge_init_clock_gating;
-               else if (IS_HASWELL(dev))
-                       dev_priv->display.init_clock_gating = haswell_init_clock_gating;
-               else if (INTEL_INFO(dev)->gen == 8)
-                       dev_priv->display.init_clock_gating = broadwell_init_clock_gating;
        } else if (IS_CHERRYVIEW(dev)) {
                vlv_setup_wm_latency(dev);
-
                dev_priv->display.update_wm = vlv_update_wm;
-               dev_priv->display.init_clock_gating =
-                       cherryview_init_clock_gating;
        } else if (IS_VALLEYVIEW(dev)) {
                vlv_setup_wm_latency(dev);
-
                dev_priv->display.update_wm = vlv_update_wm;
-               dev_priv->display.init_clock_gating =
-                       valleyview_init_clock_gating;
        } else if (IS_PINEVIEW(dev)) {
                if (!intel_get_cxsr_latency(IS_PINEVIEW_G(dev),
                                            dev_priv->is_ddr3,
@@ -7141,20 +7254,13 @@ void intel_init_pm(struct drm_device *dev)
                        dev_priv->display.update_wm = NULL;
                } else
                        dev_priv->display.update_wm = pineview_update_wm;
-               dev_priv->display.init_clock_gating = gen3_init_clock_gating;
        } else if (IS_G4X(dev)) {
                dev_priv->display.update_wm = g4x_update_wm;
-               dev_priv->display.init_clock_gating = g4x_init_clock_gating;
        } else if (IS_GEN4(dev)) {
                dev_priv->display.update_wm = i965_update_wm;
-               if (IS_CRESTLINE(dev))
-                       dev_priv->display.init_clock_gating = crestline_init_clock_gating;
-               else if (IS_BROADWATER(dev))
-                       dev_priv->display.init_clock_gating = broadwater_init_clock_gating;
        } else if (IS_GEN3(dev)) {
                dev_priv->display.update_wm = i9xx_update_wm;
                dev_priv->display.get_fifo_size = i9xx_get_fifo_size;
-               dev_priv->display.init_clock_gating = gen3_init_clock_gating;
        } else if (IS_GEN2(dev)) {
                if (INTEL_INFO(dev)->num_pipes == 1) {
                        dev_priv->display.update_wm = i845_update_wm;
@@ -7163,11 +7269,6 @@ void intel_init_pm(struct drm_device *dev)
                        dev_priv->display.update_wm = i9xx_update_wm;
                        dev_priv->display.get_fifo_size = i830_get_fifo_size;
                }
-
-               if (IS_I85X(dev) || IS_I865G(dev))
-                       dev_priv->display.init_clock_gating = i85x_init_clock_gating;
-               else
-                       dev_priv->display.init_clock_gating = i830_init_clock_gating;
        } else {
                DRM_ERROR("unexpected fall-through in intel_init_pm\n");
        }
@@ -7221,78 +7322,43 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 val
        return 0;
 }
 
-static int vlv_gpu_freq_div(unsigned int czclk_freq)
-{
-       switch (czclk_freq) {
-       case 200:
-               return 10;
-       case 267:
-               return 12;
-       case 320:
-       case 333:
-               return 16;
-       case 400:
-               return 20;
-       default:
-               return -1;
-       }
-}
-
 static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
-       int div, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
-
-       div = vlv_gpu_freq_div(czclk_freq);
-       if (div < 0)
-               return div;
-
-       return DIV_ROUND_CLOSEST(czclk_freq * (val + 6 - 0xbd), div);
+       /*
+        * N = val - 0xb7
+        * Slow = Fast = GPLL ref * N
+        */
+       return DIV_ROUND_CLOSEST(dev_priv->rps.gpll_ref_freq * (val - 0xb7), 1000);
 }
 
 static int byt_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
-       int mul, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
-
-       mul = vlv_gpu_freq_div(czclk_freq);
-       if (mul < 0)
-               return mul;
-
-       return DIV_ROUND_CLOSEST(mul * val, czclk_freq) + 0xbd - 6;
+       return DIV_ROUND_CLOSEST(1000 * val, dev_priv->rps.gpll_ref_freq) + 0xb7;
 }
 
 static int chv_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
-       int div, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
-
-       div = vlv_gpu_freq_div(czclk_freq);
-       if (div < 0)
-               return div;
-       div /= 2;
-
-       return DIV_ROUND_CLOSEST(czclk_freq * val, 2 * div) / 2;
+       /*
+        * N = val / 2
+        * CU (slow) = CU2x (fast) / 2 = GPLL ref * N / 2
+        */
+       return DIV_ROUND_CLOSEST(dev_priv->rps.gpll_ref_freq * val, 2 * 2 * 1000);
 }
 
 static int chv_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
-       int mul, czclk_freq = DIV_ROUND_CLOSEST(dev_priv->czclk_freq, 1000);
-
-       mul = vlv_gpu_freq_div(czclk_freq);
-       if (mul < 0)
-               return mul;
-       mul /= 2;
-
        /* CHV needs even values */
-       return DIV_ROUND_CLOSEST(val * 2 * mul, czclk_freq) * 2;
+       return DIV_ROUND_CLOSEST(2 * 1000 * val, dev_priv->rps.gpll_ref_freq) * 2;
 }
 
 int intel_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
-       if (IS_GEN9(dev_priv->dev))
+       if (IS_GEN9(dev_priv))
                return DIV_ROUND_CLOSEST(val * GT_FREQUENCY_MULTIPLIER,
                                         GEN9_FREQ_SCALER);
-       else if (IS_CHERRYVIEW(dev_priv->dev))
+       else if (IS_CHERRYVIEW(dev_priv))
                return chv_gpu_freq(dev_priv, val);
-       else if (IS_VALLEYVIEW(dev_priv->dev))
+       else if (IS_VALLEYVIEW(dev_priv))
                return byt_gpu_freq(dev_priv, val);
        else
                return val * GT_FREQUENCY_MULTIPLIER;
@@ -7300,12 +7366,12 @@ int intel_gpu_freq(struct drm_i915_private *dev_priv, int val)
 
 int intel_freq_opcode(struct drm_i915_private *dev_priv, int val)
 {
-       if (IS_GEN9(dev_priv->dev))
+       if (IS_GEN9(dev_priv))
                return DIV_ROUND_CLOSEST(val * GEN9_FREQ_SCALER,
                                         GT_FREQUENCY_MULTIPLIER);
-       else if (IS_CHERRYVIEW(dev_priv->dev))
+       else if (IS_CHERRYVIEW(dev_priv))
                return chv_freq_opcode(dev_priv, val);
-       else if (IS_VALLEYVIEW(dev_priv->dev))
+       else if (IS_VALLEYVIEW(dev_priv))
                return byt_freq_opcode(dev_priv, val);
        else
                return DIV_ROUND_CLOSEST(val, GT_FREQUENCY_MULTIPLIER);
@@ -7322,7 +7388,7 @@ static void __intel_rps_boost_work(struct work_struct *work)
        struct drm_i915_gem_request *req = boost->req;
 
        if (!i915_gem_request_completed(req, true))
-               gen6_rps_boost(to_i915(req->ring->dev), NULL,
+               gen6_rps_boost(to_i915(req->engine->dev), NULL,
                               req->emitted_jiffies);
 
        i915_gem_request_unreference__unlocked(req);
index 0b42ada338c8c8f397a8748d184f207a0cdd1fd3..c3abae4bc59644f2952f030a839c40e635ef11de 100644 (file)
@@ -507,7 +507,8 @@ static void hsw_psr_disable(struct intel_dp *intel_dp)
 
                /* Wait till PSR is idle */
                if (_wait_for((I915_READ(EDP_PSR_STATUS_CTL) &
-                              EDP_PSR_STATUS_STATE_MASK) == 0, 2000, 10))
+                              EDP_PSR_STATUS_STATE_MASK) == 0,
+                              2 * USEC_PER_SEC, 10 * USEC_PER_MSEC))
                        DRM_ERROR("Timed out waiting for PSR Idle State\n");
 
                dev_priv->psr.active = false;
@@ -562,7 +563,7 @@ static void intel_psr_work(struct work_struct *work)
         * PSR might take some time to get fully disabled
         * and be ready for re-enable.
         */
-       if (HAS_DDI(dev_priv->dev)) {
+       if (HAS_DDI(dev_priv)) {
                if (wait_for((I915_READ(EDP_PSR_STATUS_CTL) &
                              EDP_PSR_STATUS_STATE_MASK) == 0, 50)) {
                        DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
@@ -780,8 +781,7 @@ void intel_psr_init(struct drm_device *dev)
 
        /* Per platform default */
        if (i915.enable_psr == -1) {
-               if (IS_HASWELL(dev) || IS_BROADWELL(dev) ||
-                   IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev))
+               if (IS_HASWELL(dev) || IS_BROADWELL(dev))
                        i915.enable_psr = 1;
                else
                        i915.enable_psr = 0;
index 9121646d7c4dd98c4c32ed74343948e662059d06..245386e20c52dd2848c484d2a3ceb5fe7c6e1fa0 100644 (file)
@@ -59,19 +59,19 @@ int intel_ring_space(struct intel_ringbuffer *ringbuf)
        return ringbuf->space;
 }
 
-bool intel_ring_stopped(struct intel_engine_cs *ring)
+bool intel_engine_stopped(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-       return dev_priv->gpu_error.stop_rings & intel_ring_flag(ring);
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+       return dev_priv->gpu_error.stop_rings & intel_engine_flag(engine);
 }
 
-static void __intel_ring_advance(struct intel_engine_cs *ring)
+static void __intel_ring_advance(struct intel_engine_cs *engine)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        ringbuf->tail &= ringbuf->size - 1;
-       if (intel_ring_stopped(ring))
+       if (intel_engine_stopped(engine))
                return;
-       ring->write_tail(ring, ringbuf->tail);
+       engine->write_tail(engine, ringbuf->tail);
 }
 
 static int
@@ -79,7 +79,7 @@ gen2_render_ring_flush(struct drm_i915_gem_request *req,
                       u32      invalidate_domains,
                       u32      flush_domains)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        u32 cmd;
        int ret;
 
@@ -94,9 +94,9 @@ gen2_render_ring_flush(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, cmd);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, cmd);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -106,8 +106,8 @@ gen4_render_ring_flush(struct drm_i915_gem_request *req,
                       u32      invalidate_domains,
                       u32      flush_domains)
 {
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = req->engine;
+       struct drm_device *dev = engine->dev;
        u32 cmd;
        int ret;
 
@@ -153,9 +153,9 @@ gen4_render_ring_flush(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, cmd);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, cmd);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -200,34 +200,34 @@ gen4_render_ring_flush(struct drm_i915_gem_request *req,
 static int
 intel_emit_post_sync_nonzero_flush(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
-       u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       struct intel_engine_cs *engine = req->engine;
+       u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        int ret;
 
        ret = intel_ring_begin(req, 6);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
-       intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(5));
+       intel_ring_emit(engine, PIPE_CONTROL_CS_STALL |
                        PIPE_CONTROL_STALL_AT_SCOREBOARD);
-       intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
-       intel_ring_emit(ring, 0); /* low dword */
-       intel_ring_emit(ring, 0); /* high dword */
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
+       intel_ring_emit(engine, 0); /* low dword */
+       intel_ring_emit(engine, 0); /* high dword */
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        ret = intel_ring_begin(req, 6);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(5));
-       intel_ring_emit(ring, PIPE_CONTROL_QW_WRITE);
-       intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(5));
+       intel_ring_emit(engine, PIPE_CONTROL_QW_WRITE);
+       intel_ring_emit(engine, scratch_addr | PIPE_CONTROL_GLOBAL_GTT); /* address */
+       intel_ring_emit(engine, 0);
+       intel_ring_emit(engine, 0);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -236,9 +236,9 @@ static int
 gen6_render_ring_flush(struct drm_i915_gem_request *req,
                       u32 invalidate_domains, u32 flush_domains)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        u32 flags = 0;
-       u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        int ret;
 
        /* Force SNB workarounds for PIPE_CONTROL flushes */
@@ -276,11 +276,11 @@ gen6_render_ring_flush(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4));
-       intel_ring_emit(ring, flags);
-       intel_ring_emit(ring, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(4));
+       intel_ring_emit(engine, flags);
+       intel_ring_emit(engine, scratch_addr | PIPE_CONTROL_GLOBAL_GTT);
+       intel_ring_emit(engine, 0);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -288,19 +288,19 @@ gen6_render_ring_flush(struct drm_i915_gem_request *req,
 static int
 gen7_render_ring_cs_stall_wa(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 4);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4));
-       intel_ring_emit(ring, PIPE_CONTROL_CS_STALL |
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(4));
+       intel_ring_emit(engine, PIPE_CONTROL_CS_STALL |
                              PIPE_CONTROL_STALL_AT_SCOREBOARD);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, 0);
+       intel_ring_emit(engine, 0);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -309,9 +309,9 @@ static int
 gen7_render_ring_flush(struct drm_i915_gem_request *req,
                       u32 invalidate_domains, u32 flush_domains)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        u32 flags = 0;
-       u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        int ret;
 
        /*
@@ -360,11 +360,11 @@ gen7_render_ring_flush(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4));
-       intel_ring_emit(ring, flags);
-       intel_ring_emit(ring, scratch_addr);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(4));
+       intel_ring_emit(engine, flags);
+       intel_ring_emit(engine, scratch_addr);
+       intel_ring_emit(engine, 0);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -373,20 +373,20 @@ static int
 gen8_emit_pipe_control(struct drm_i915_gem_request *req,
                       u32 flags, u32 scratch_addr)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 6);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(6));
-       intel_ring_emit(ring, flags);
-       intel_ring_emit(ring, scratch_addr);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_emit(ring, 0);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, GFX_OP_PIPE_CONTROL(6));
+       intel_ring_emit(engine, flags);
+       intel_ring_emit(engine, scratch_addr);
+       intel_ring_emit(engine, 0);
+       intel_ring_emit(engine, 0);
+       intel_ring_emit(engine, 0);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -396,7 +396,7 @@ gen8_render_ring_flush(struct drm_i915_gem_request *req,
                       u32 invalidate_domains, u32 flush_domains)
 {
        u32 flags = 0;
-       u32 scratch_addr = req->ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       u32 scratch_addr = req->engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        int ret;
 
        flags |= PIPE_CONTROL_CS_STALL;
@@ -429,51 +429,51 @@ gen8_render_ring_flush(struct drm_i915_gem_request *req,
        return gen8_emit_pipe_control(req, flags, scratch_addr);
 }
 
-static void ring_write_tail(struct intel_engine_cs *ring,
+static void ring_write_tail(struct intel_engine_cs *engine,
                            u32 value)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
-       I915_WRITE_TAIL(ring, value);
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+       I915_WRITE_TAIL(engine, value);
 }
 
-u64 intel_ring_get_active_head(struct intel_engine_cs *ring)
+u64 intel_ring_get_active_head(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        u64 acthd;
 
-       if (INTEL_INFO(ring->dev)->gen >= 8)
-               acthd = I915_READ64_2x32(RING_ACTHD(ring->mmio_base),
-                                        RING_ACTHD_UDW(ring->mmio_base));
-       else if (INTEL_INFO(ring->dev)->gen >= 4)
-               acthd = I915_READ(RING_ACTHD(ring->mmio_base));
+       if (INTEL_INFO(engine->dev)->gen >= 8)
+               acthd = I915_READ64_2x32(RING_ACTHD(engine->mmio_base),
+                                        RING_ACTHD_UDW(engine->mmio_base));
+       else if (INTEL_INFO(engine->dev)->gen >= 4)
+               acthd = I915_READ(RING_ACTHD(engine->mmio_base));
        else
                acthd = I915_READ(ACTHD);
 
        return acthd;
 }
 
-static void ring_setup_phys_status_page(struct intel_engine_cs *ring)
+static void ring_setup_phys_status_page(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        u32 addr;
 
        addr = dev_priv->status_page_dmah->busaddr;
-       if (INTEL_INFO(ring->dev)->gen >= 4)
+       if (INTEL_INFO(engine->dev)->gen >= 4)
                addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;
        I915_WRITE(HWS_PGA, addr);
 }
 
-static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
+static void intel_ring_setup_status_page(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_device *dev = engine->dev;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        i915_reg_t mmio;
 
        /* The ring status page addresses are no longer next to the rest of
         * the ring registers as of gen7.
         */
        if (IS_GEN7(dev)) {
-               switch (ring->id) {
+               switch (engine->id) {
                case RCS:
                        mmio = RENDER_HWS_PGA_GEN7;
                        break;
@@ -492,14 +492,14 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
                        mmio = VEBOX_HWS_PGA_GEN7;
                        break;
                }
-       } else if (IS_GEN6(ring->dev)) {
-               mmio = RING_HWS_PGA_GEN6(ring->mmio_base);
+       } else if (IS_GEN6(engine->dev)) {
+               mmio = RING_HWS_PGA_GEN6(engine->mmio_base);
        } else {
                /* XXX: gen8 returns to sanity */
-               mmio = RING_HWS_PGA(ring->mmio_base);
+               mmio = RING_HWS_PGA(engine->mmio_base);
        }
 
-       I915_WRITE(mmio, (u32)ring->status_page.gfx_addr);
+       I915_WRITE(mmio, (u32)engine->status_page.gfx_addr);
        POSTING_READ(mmio);
 
        /*
@@ -510,10 +510,10 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
         * invalidating the TLB?
         */
        if (INTEL_INFO(dev)->gen >= 6 && INTEL_INFO(dev)->gen < 8) {
-               i915_reg_t reg = RING_INSTPM(ring->mmio_base);
+               i915_reg_t reg = RING_INSTPM(engine->mmio_base);
 
                /* ring should be idle before issuing a sync flush*/
-               WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0);
+               WARN_ON((I915_READ_MODE(engine) & MODE_IDLE) == 0);
 
                I915_WRITE(reg,
                           _MASKED_BIT_ENABLE(INSTPM_TLB_INVALIDATE |
@@ -521,117 +521,125 @@ static void intel_ring_setup_status_page(struct intel_engine_cs *ring)
                if (wait_for((I915_READ(reg) & INSTPM_SYNC_FLUSH) == 0,
                             1000))
                        DRM_ERROR("%s: wait for SyncFlush to complete for TLB invalidation timed out\n",
-                                 ring->name);
+                                 engine->name);
        }
 }
 
-static bool stop_ring(struct intel_engine_cs *ring)
+static bool stop_ring(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = to_i915(ring->dev);
+       struct drm_i915_private *dev_priv = to_i915(engine->dev);
 
-       if (!IS_GEN2(ring->dev)) {
-               I915_WRITE_MODE(ring, _MASKED_BIT_ENABLE(STOP_RING));
-               if (wait_for((I915_READ_MODE(ring) & MODE_IDLE) != 0, 1000)) {
-                       DRM_ERROR("%s : timed out trying to stop ring\n", ring->name);
+       if (!IS_GEN2(engine->dev)) {
+               I915_WRITE_MODE(engine, _MASKED_BIT_ENABLE(STOP_RING));
+               if (wait_for((I915_READ_MODE(engine) & MODE_IDLE) != 0, 1000)) {
+                       DRM_ERROR("%s : timed out trying to stop ring\n",
+                                 engine->name);
                        /* Sometimes we observe that the idle flag is not
                         * set even though the ring is empty. So double
                         * check before giving up.
                         */
-                       if (I915_READ_HEAD(ring) != I915_READ_TAIL(ring))
+                       if (I915_READ_HEAD(engine) != I915_READ_TAIL(engine))
                                return false;
                }
        }
 
-       I915_WRITE_CTL(ring, 0);
-       I915_WRITE_HEAD(ring, 0);
-       ring->write_tail(ring, 0);
+       I915_WRITE_CTL(engine, 0);
+       I915_WRITE_HEAD(engine, 0);
+       engine->write_tail(engine, 0);
 
-       if (!IS_GEN2(ring->dev)) {
-               (void)I915_READ_CTL(ring);
-               I915_WRITE_MODE(ring, _MASKED_BIT_DISABLE(STOP_RING));
+       if (!IS_GEN2(engine->dev)) {
+               (void)I915_READ_CTL(engine);
+               I915_WRITE_MODE(engine, _MASKED_BIT_DISABLE(STOP_RING));
        }
 
-       return (I915_READ_HEAD(ring) & HEAD_ADDR) == 0;
+       return (I915_READ_HEAD(engine) & HEAD_ADDR) == 0;
 }
 
-static int init_ring_common(struct intel_engine_cs *ring)
+void intel_engine_init_hangcheck(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       memset(&engine->hangcheck, 0, sizeof(engine->hangcheck));
+}
+
+static int init_ring_common(struct intel_engine_cs *engine)
+{
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        struct drm_i915_gem_object *obj = ringbuf->obj;
        int ret = 0;
 
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
 
-       if (!stop_ring(ring)) {
+       if (!stop_ring(engine)) {
                /* G45 ring initialization often fails to reset head to zero */
                DRM_DEBUG_KMS("%s head not reset to zero "
                              "ctl %08x head %08x tail %08x start %08x\n",
-                             ring->name,
-                             I915_READ_CTL(ring),
-                             I915_READ_HEAD(ring),
-                             I915_READ_TAIL(ring),
-                             I915_READ_START(ring));
+                             engine->name,
+                             I915_READ_CTL(engine),
+                             I915_READ_HEAD(engine),
+                             I915_READ_TAIL(engine),
+                             I915_READ_START(engine));
 
-               if (!stop_ring(ring)) {
+               if (!stop_ring(engine)) {
                        DRM_ERROR("failed to set %s head to zero "
                                  "ctl %08x head %08x tail %08x start %08x\n",
-                                 ring->name,
-                                 I915_READ_CTL(ring),
-                                 I915_READ_HEAD(ring),
-                                 I915_READ_TAIL(ring),
-                                 I915_READ_START(ring));
+                                 engine->name,
+                                 I915_READ_CTL(engine),
+                                 I915_READ_HEAD(engine),
+                                 I915_READ_TAIL(engine),
+                                 I915_READ_START(engine));
                        ret = -EIO;
                        goto out;
                }
        }
 
        if (I915_NEED_GFX_HWS(dev))
-               intel_ring_setup_status_page(ring);
+               intel_ring_setup_status_page(engine);
        else
-               ring_setup_phys_status_page(ring);
+               ring_setup_phys_status_page(engine);
 
        /* Enforce ordering by reading HEAD register back */
-       I915_READ_HEAD(ring);
+       I915_READ_HEAD(engine);
 
        /* Initialize the ring. This must happen _after_ we've cleared the ring
         * registers with the above sequence (the readback of the HEAD registers
         * also enforces ordering), otherwise the hw might lose the new ring
         * register values. */
-       I915_WRITE_START(ring, i915_gem_obj_ggtt_offset(obj));
+       I915_WRITE_START(engine, i915_gem_obj_ggtt_offset(obj));
 
        /* WaClearRingBufHeadRegAtInit:ctg,elk */
-       if (I915_READ_HEAD(ring))
+       if (I915_READ_HEAD(engine))
                DRM_DEBUG("%s initialization failed [head=%08x], fudging\n",
-                         ring->name, I915_READ_HEAD(ring));
-       I915_WRITE_HEAD(ring, 0);
-       (void)I915_READ_HEAD(ring);
+                         engine->name, I915_READ_HEAD(engine));
+       I915_WRITE_HEAD(engine, 0);
+       (void)I915_READ_HEAD(engine);
 
-       I915_WRITE_CTL(ring,
+       I915_WRITE_CTL(engine,
                        ((ringbuf->size - PAGE_SIZE) & RING_NR_PAGES)
                        | RING_VALID);
 
        /* If the head is still not zero, the ring is dead */
-       if (wait_for((I915_READ_CTL(ring) & RING_VALID) != 0 &&
-                    I915_READ_START(ring) == i915_gem_obj_ggtt_offset(obj) &&
-                    (I915_READ_HEAD(ring) & HEAD_ADDR) == 0, 50)) {
+       if (wait_for((I915_READ_CTL(engine) & RING_VALID) != 0 &&
+                    I915_READ_START(engine) == i915_gem_obj_ggtt_offset(obj) &&
+                    (I915_READ_HEAD(engine) & HEAD_ADDR) == 0, 50)) {
                DRM_ERROR("%s initialization failed "
                          "ctl %08x (valid? %d) head %08x tail %08x start %08x [expected %08lx]\n",
-                         ring->name,
-                         I915_READ_CTL(ring), I915_READ_CTL(ring) & RING_VALID,
-                         I915_READ_HEAD(ring), I915_READ_TAIL(ring),
-                         I915_READ_START(ring), (unsigned long)i915_gem_obj_ggtt_offset(obj));
+                         engine->name,
+                         I915_READ_CTL(engine),
+                         I915_READ_CTL(engine) & RING_VALID,
+                         I915_READ_HEAD(engine), I915_READ_TAIL(engine),
+                         I915_READ_START(engine),
+                         (unsigned long)i915_gem_obj_ggtt_offset(obj));
                ret = -EIO;
                goto out;
        }
 
        ringbuf->last_retired_head = -1;
-       ringbuf->head = I915_READ_HEAD(ring);
-       ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR;
+       ringbuf->head = I915_READ_HEAD(engine);
+       ringbuf->tail = I915_READ_TAIL(engine) & TAIL_ADDR;
        intel_ring_update_space(ringbuf);
 
-       memset(&ring->hangcheck, 0, sizeof(ring->hangcheck));
+       intel_engine_init_hangcheck(engine);
 
 out:
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
@@ -640,59 +648,60 @@ out:
 }
 
 void
-intel_fini_pipe_control(struct intel_engine_cs *ring)
+intel_fini_pipe_control(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
 
-       if (ring->scratch.obj == NULL)
+       if (engine->scratch.obj == NULL)
                return;
 
        if (INTEL_INFO(dev)->gen >= 5) {
-               kunmap(sg_page(ring->scratch.obj->pages->sgl));
-               i915_gem_object_ggtt_unpin(ring->scratch.obj);
+               kunmap(sg_page(engine->scratch.obj->pages->sgl));
+               i915_gem_object_ggtt_unpin(engine->scratch.obj);
        }
 
-       drm_gem_object_unreference(&ring->scratch.obj->base);
-       ring->scratch.obj = NULL;
+       drm_gem_object_unreference(&engine->scratch.obj->base);
+       engine->scratch.obj = NULL;
 }
 
 int
-intel_init_pipe_control(struct intel_engine_cs *ring)
+intel_init_pipe_control(struct intel_engine_cs *engine)
 {
        int ret;
 
-       WARN_ON(ring->scratch.obj);
+       WARN_ON(engine->scratch.obj);
 
-       ring->scratch.obj = i915_gem_alloc_object(ring->dev, 4096);
-       if (ring->scratch.obj == NULL) {
+       engine->scratch.obj = i915_gem_alloc_object(engine->dev, 4096);
+       if (engine->scratch.obj == NULL) {
                DRM_ERROR("Failed to allocate seqno page\n");
                ret = -ENOMEM;
                goto err;
        }
 
-       ret = i915_gem_object_set_cache_level(ring->scratch.obj, I915_CACHE_LLC);
+       ret = i915_gem_object_set_cache_level(engine->scratch.obj,
+                                             I915_CACHE_LLC);
        if (ret)
                goto err_unref;
 
-       ret = i915_gem_obj_ggtt_pin(ring->scratch.obj, 4096, 0);
+       ret = i915_gem_obj_ggtt_pin(engine->scratch.obj, 4096, 0);
        if (ret)
                goto err_unref;
 
-       ring->scratch.gtt_offset = i915_gem_obj_ggtt_offset(ring->scratch.obj);
-       ring->scratch.cpu_page = kmap(sg_page(ring->scratch.obj->pages->sgl));
-       if (ring->scratch.cpu_page == NULL) {
+       engine->scratch.gtt_offset = i915_gem_obj_ggtt_offset(engine->scratch.obj);
+       engine->scratch.cpu_page = kmap(sg_page(engine->scratch.obj->pages->sgl));
+       if (engine->scratch.cpu_page == NULL) {
                ret = -ENOMEM;
                goto err_unpin;
        }
 
        DRM_DEBUG_DRIVER("%s pipe control offset: 0x%08x\n",
-                        ring->name, ring->scratch.gtt_offset);
+                        engine->name, engine->scratch.gtt_offset);
        return 0;
 
 err_unpin:
-       i915_gem_object_ggtt_unpin(ring->scratch.obj);
+       i915_gem_object_ggtt_unpin(engine->scratch.obj);
 err_unref:
-       drm_gem_object_unreference(&ring->scratch.obj->base);
+       drm_gem_object_unreference(&engine->scratch.obj->base);
 err:
        return ret;
 }
@@ -700,15 +709,15 @@ err:
 static int intel_ring_workarounds_emit(struct drm_i915_gem_request *req)
 {
        int ret, i;
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = req->engine;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct i915_workarounds *w = &dev_priv->workarounds;
 
        if (w->count == 0)
                return 0;
 
-       ring->gpu_caches_dirty = true;
+       engine->gpu_caches_dirty = true;
        ret = intel_ring_flush_all_caches(req);
        if (ret)
                return ret;
@@ -717,16 +726,16 @@ static int intel_ring_workarounds_emit(struct drm_i915_gem_request *req)
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(w->count));
+       intel_ring_emit(engine, MI_LOAD_REGISTER_IMM(w->count));
        for (i = 0; i < w->count; i++) {
-               intel_ring_emit_reg(ring, w->reg[i].addr);
-               intel_ring_emit(ring, w->reg[i].value);
+               intel_ring_emit_reg(engine, w->reg[i].addr);
+               intel_ring_emit(engine, w->reg[i].value);
        }
-       intel_ring_emit(ring, MI_NOOP);
+       intel_ring_emit(engine, MI_NOOP);
 
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
-       ring->gpu_caches_dirty = true;
+       engine->gpu_caches_dirty = true;
        ret = intel_ring_flush_all_caches(req);
        if (ret)
                return ret;
@@ -789,25 +798,26 @@ static int wa_add(struct drm_i915_private *dev_priv,
 
 #define WA_WRITE(addr, val) WA_REG(addr, 0xffffffff, val)
 
-static int wa_ring_whitelist_reg(struct intel_engine_cs *ring, i915_reg_t reg)
+static int wa_ring_whitelist_reg(struct intel_engine_cs *engine,
+                                i915_reg_t reg)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
        struct i915_workarounds *wa = &dev_priv->workarounds;
-       const uint32_t index = wa->hw_whitelist_count[ring->id];
+       const uint32_t index = wa->hw_whitelist_count[engine->id];
 
        if (WARN_ON(index >= RING_MAX_NONPRIV_SLOTS))
                return -EINVAL;
 
-       WA_WRITE(RING_FORCE_TO_NONPRIV(ring->mmio_base, index),
+       WA_WRITE(RING_FORCE_TO_NONPRIV(engine->mmio_base, index),
                 i915_mmio_reg_offset(reg));
-       wa->hw_whitelist_count[ring->id]++;
+       wa->hw_whitelist_count[engine->id]++;
 
        return 0;
 }
 
-static int gen8_init_workarounds(struct intel_engine_cs *ring)
+static int gen8_init_workarounds(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        WA_SET_BIT_MASKED(INSTPM, INSTPM_FORCE_ORDERING);
@@ -857,13 +867,13 @@ static int gen8_init_workarounds(struct intel_engine_cs *ring)
        return 0;
 }
 
-static int bdw_init_workarounds(struct intel_engine_cs *ring)
+static int bdw_init_workarounds(struct intel_engine_cs *engine)
 {
        int ret;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       ret = gen8_init_workarounds(ring);
+       ret = gen8_init_workarounds(engine);
        if (ret)
                return ret;
 
@@ -886,13 +896,13 @@ static int bdw_init_workarounds(struct intel_engine_cs *ring)
        return 0;
 }
 
-static int chv_init_workarounds(struct intel_engine_cs *ring)
+static int chv_init_workarounds(struct intel_engine_cs *engine)
 {
        int ret;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       ret = gen8_init_workarounds(ring);
+       ret = gen8_init_workarounds(engine);
        if (ret)
                return ret;
 
@@ -905,9 +915,9 @@ static int chv_init_workarounds(struct intel_engine_cs *ring)
        return 0;
 }
 
-static int gen9_init_workarounds(struct intel_engine_cs *ring)
+static int gen9_init_workarounds(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        uint32_t tmp;
        int ret;
@@ -920,8 +930,10 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
        I915_WRITE(GAM_ECOCHK, I915_READ(GAM_ECOCHK) |
                   ECOCHK_DIS_TLB);
 
+       /* WaClearFlowControlGpgpuContextSave:skl,bxt */
        /* WaDisablePartialInstShootdown:skl,bxt */
        WA_SET_BIT_MASKED(GEN8_ROW_CHICKEN,
+                         FLOW_CONTROL_ENABLE |
                          PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE);
 
        /* Syncing dependencies between camera and graphics:skl,bxt */
@@ -947,9 +959,10 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
        }
 
        /* WaEnableYV12BugFixInHalfSliceChicken7:skl,bxt */
-       if (IS_SKL_REVID(dev, SKL_REVID_C0, REVID_FOREVER) || IS_BROXTON(dev))
-               WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7,
-                                 GEN9_ENABLE_YV12_BUGFIX);
+       /* WaEnableSamplerGPGPUPreemptionSupport:skl,bxt */
+       WA_SET_BIT_MASKED(GEN9_HALF_SLICE_CHICKEN7,
+                         GEN9_ENABLE_YV12_BUGFIX |
+                         GEN9_ENABLE_GPGPU_PREEMPTION);
 
        /* Wa4x4STCOptimizationDisable:skl,bxt */
        /* WaDisablePartialResolveInVc:skl,bxt */
@@ -986,21 +999,21 @@ static int gen9_init_workarounds(struct intel_engine_cs *ring)
                                    GEN8_LQSC_FLUSH_COHERENT_LINES));
 
        /* WaEnablePreemptionGranularityControlByUMD:skl,bxt */
-       ret= wa_ring_whitelist_reg(ring, GEN8_CS_CHICKEN1);
+       ret= wa_ring_whitelist_reg(engine, GEN8_CS_CHICKEN1);
        if (ret)
                return ret;
 
        /* WaAllowUMDToModifyHDCChicken1:skl,bxt */
-       ret = wa_ring_whitelist_reg(ring, GEN8_HDC_CHICKEN1);
+       ret = wa_ring_whitelist_reg(engine, GEN8_HDC_CHICKEN1);
        if (ret)
                return ret;
 
        return 0;
 }
 
-static int skl_tune_iz_hashing(struct intel_engine_cs *ring)
+static int skl_tune_iz_hashing(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        u8 vals[3] = { 0, 0, 0 };
        unsigned int i;
@@ -1040,13 +1053,13 @@ static int skl_tune_iz_hashing(struct intel_engine_cs *ring)
        return 0;
 }
 
-static int skl_init_workarounds(struct intel_engine_cs *ring)
+static int skl_init_workarounds(struct intel_engine_cs *engine)
 {
        int ret;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       ret = gen9_init_workarounds(ring);
+       ret = gen9_init_workarounds(engine);
        if (ret)
                return ret;
 
@@ -1114,20 +1127,20 @@ static int skl_init_workarounds(struct intel_engine_cs *ring)
                        GEN7_SBE_SS_CACHE_DISPATCH_PORT_SHARING_DISABLE);
 
        /* WaDisableLSQCROPERFforOCL:skl */
-       ret = wa_ring_whitelist_reg(ring, GEN8_L3SQCREG4);
+       ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4);
        if (ret)
                return ret;
 
-       return skl_tune_iz_hashing(ring);
+       return skl_tune_iz_hashing(engine);
 }
 
-static int bxt_init_workarounds(struct intel_engine_cs *ring)
+static int bxt_init_workarounds(struct intel_engine_cs *engine)
 {
        int ret;
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       ret = gen9_init_workarounds(ring);
+       ret = gen9_init_workarounds(engine);
        if (ret)
                return ret;
 
@@ -1158,11 +1171,11 @@ static int bxt_init_workarounds(struct intel_engine_cs *ring)
        /* WaDisableObjectLevelPreemtionForInstanceId:bxt */
        /* WaDisableLSQCROPERFforOCL:bxt */
        if (IS_BXT_REVID(dev, 0, BXT_REVID_A1)) {
-               ret = wa_ring_whitelist_reg(ring, GEN9_CS_DEBUG_MODE1);
+               ret = wa_ring_whitelist_reg(engine, GEN9_CS_DEBUG_MODE1);
                if (ret)
                        return ret;
 
-               ret = wa_ring_whitelist_reg(ring, GEN8_L3SQCREG4);
+               ret = wa_ring_whitelist_reg(engine, GEN8_L3SQCREG4);
                if (ret)
                        return ret;
        }
@@ -1170,36 +1183,36 @@ static int bxt_init_workarounds(struct intel_engine_cs *ring)
        return 0;
 }
 
-int init_workarounds_ring(struct intel_engine_cs *ring)
+int init_workarounds_ring(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       WARN_ON(ring->id != RCS);
+       WARN_ON(engine->id != RCS);
 
        dev_priv->workarounds.count = 0;
        dev_priv->workarounds.hw_whitelist_count[RCS] = 0;
 
        if (IS_BROADWELL(dev))
-               return bdw_init_workarounds(ring);
+               return bdw_init_workarounds(engine);
 
        if (IS_CHERRYVIEW(dev))
-               return chv_init_workarounds(ring);
+               return chv_init_workarounds(engine);
 
        if (IS_SKYLAKE(dev))
-               return skl_init_workarounds(ring);
+               return skl_init_workarounds(engine);
 
        if (IS_BROXTON(dev))
-               return bxt_init_workarounds(ring);
+               return bxt_init_workarounds(engine);
 
        return 0;
 }
 
-static int init_render_ring(struct intel_engine_cs *ring)
+static int init_render_ring(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       int ret = init_ring_common(ring);
+       int ret = init_ring_common(engine);
        if (ret)
                return ret;
 
@@ -1242,14 +1255,14 @@ static int init_render_ring(struct intel_engine_cs *ring)
                I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_FORCE_ORDERING));
 
        if (HAS_L3_DPF(dev))
-               I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev));
+               I915_WRITE_IMR(engine, ~GT_PARITY_ERROR(dev));
 
-       return init_workarounds_ring(ring);
+       return init_workarounds_ring(engine);
 }
 
-static void render_ring_cleanup(struct intel_engine_cs *ring)
+static void render_ring_cleanup(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
 
        if (dev_priv->semaphore_obj) {
@@ -1258,18 +1271,19 @@ static void render_ring_cleanup(struct intel_engine_cs *ring)
                dev_priv->semaphore_obj = NULL;
        }
 
-       intel_fini_pipe_control(ring);
+       intel_fini_pipe_control(engine);
 }
 
 static int gen8_rcs_signal(struct drm_i915_gem_request *signaller_req,
                           unsigned int num_dwords)
 {
 #define MBOX_UPDATE_DWORDS 8
-       struct intel_engine_cs *signaller = signaller_req->ring;
+       struct intel_engine_cs *signaller = signaller_req->engine;
        struct drm_device *dev = signaller->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *waiter;
-       int i, ret, num_rings;
+       enum intel_engine_id id;
+       int ret, num_rings;
 
        num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
        num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
@@ -1279,9 +1293,9 @@ static int gen8_rcs_signal(struct drm_i915_gem_request *signaller_req,
        if (ret)
                return ret;
 
-       for_each_ring(waiter, dev_priv, i) {
+       for_each_engine_id(waiter, dev_priv, id) {
                u32 seqno;
-               u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
+               u64 gtt_offset = signaller->semaphore.signal_ggtt[id];
                if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
                        continue;
 
@@ -1306,11 +1320,12 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *signaller_req,
                           unsigned int num_dwords)
 {
 #define MBOX_UPDATE_DWORDS 6
-       struct intel_engine_cs *signaller = signaller_req->ring;
+       struct intel_engine_cs *signaller = signaller_req->engine;
        struct drm_device *dev = signaller->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *waiter;
-       int i, ret, num_rings;
+       enum intel_engine_id id;
+       int ret, num_rings;
 
        num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
        num_dwords += (num_rings-1) * MBOX_UPDATE_DWORDS;
@@ -1320,9 +1335,9 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *signaller_req,
        if (ret)
                return ret;
 
-       for_each_ring(waiter, dev_priv, i) {
+       for_each_engine_id(waiter, dev_priv, id) {
                u32 seqno;
-               u64 gtt_offset = signaller->semaphore.signal_ggtt[i];
+               u64 gtt_offset = signaller->semaphore.signal_ggtt[id];
                if (gtt_offset == MI_SEMAPHORE_SYNC_INVALID)
                        continue;
 
@@ -1344,11 +1359,12 @@ static int gen8_xcs_signal(struct drm_i915_gem_request *signaller_req,
 static int gen6_signal(struct drm_i915_gem_request *signaller_req,
                       unsigned int num_dwords)
 {
-       struct intel_engine_cs *signaller = signaller_req->ring;
+       struct intel_engine_cs *signaller = signaller_req->engine;
        struct drm_device *dev = signaller->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *useless;
-       int i, ret, num_rings;
+       enum intel_engine_id id;
+       int ret, num_rings;
 
 #define MBOX_UPDATE_DWORDS 3
        num_rings = hweight32(INTEL_INFO(dev)->ring_mask);
@@ -1359,8 +1375,8 @@ static int gen6_signal(struct drm_i915_gem_request *signaller_req,
        if (ret)
                return ret;
 
-       for_each_ring(useless, dev_priv, i) {
-               i915_reg_t mbox_reg = signaller->semaphore.mbox.signal[i];
+       for_each_engine_id(useless, dev_priv, id) {
+               i915_reg_t mbox_reg = signaller->semaphore.mbox.signal[id];
 
                if (i915_mmio_reg_valid(mbox_reg)) {
                        u32 seqno = i915_gem_request_get_seqno(signaller_req);
@@ -1389,22 +1405,23 @@ static int gen6_signal(struct drm_i915_gem_request *signaller_req,
 static int
 gen6_add_request(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
-       if (ring->semaphore.signal)
-               ret = ring->semaphore.signal(req, 4);
+       if (engine->semaphore.signal)
+               ret = engine->semaphore.signal(req, 4);
        else
                ret = intel_ring_begin(req, 4);
 
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
-       intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
-       intel_ring_emit(ring, i915_gem_request_get_seqno(req));
-       intel_ring_emit(ring, MI_USER_INTERRUPT);
-       __intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_STORE_DWORD_INDEX);
+       intel_ring_emit(engine,
+                       I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
+       intel_ring_emit(engine, i915_gem_request_get_seqno(req));
+       intel_ring_emit(engine, MI_USER_INTERRUPT);
+       __intel_ring_advance(engine);
 
        return 0;
 }
@@ -1429,7 +1446,7 @@ gen8_ring_sync(struct drm_i915_gem_request *waiter_req,
               struct intel_engine_cs *signaller,
               u32 seqno)
 {
-       struct intel_engine_cs *waiter = waiter_req->ring;
+       struct intel_engine_cs *waiter = waiter_req->engine;
        struct drm_i915_private *dev_priv = waiter->dev->dev_private;
        int ret;
 
@@ -1455,7 +1472,7 @@ gen6_ring_sync(struct drm_i915_gem_request *waiter_req,
               struct intel_engine_cs *signaller,
               u32 seqno)
 {
-       struct intel_engine_cs *waiter = waiter_req->ring;
+       struct intel_engine_cs *waiter = waiter_req->engine;
        u32 dw1 = MI_SEMAPHORE_MBOX |
                  MI_SEMAPHORE_COMPARE |
                  MI_SEMAPHORE_REGISTER;
@@ -1503,8 +1520,8 @@ do {                                                                      \
 static int
 pc_render_add_request(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
-       u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
+       struct intel_engine_cs *engine = req->engine;
+       u32 scratch_addr = engine->scratch.gtt_offset + 2 * CACHELINE_BYTES;
        int ret;
 
        /* For Ironlake, MI_USER_INTERRUPT was deprecated and apparently
@@ -1519,78 +1536,87 @@ pc_render_add_request(struct drm_i915_gem_request *req)
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
+       intel_ring_emit(engine,
+                       GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
                        PIPE_CONTROL_WRITE_FLUSH |
                        PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE);
-       intel_ring_emit(ring, ring->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
-       intel_ring_emit(ring, i915_gem_request_get_seqno(req));
-       intel_ring_emit(ring, 0);
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       intel_ring_emit(engine,
+                       engine->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
+       intel_ring_emit(engine, i915_gem_request_get_seqno(req));
+       intel_ring_emit(engine, 0);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
        scratch_addr += 2 * CACHELINE_BYTES; /* write to separate cachelines */
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
        scratch_addr += 2 * CACHELINE_BYTES;
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
        scratch_addr += 2 * CACHELINE_BYTES;
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
        scratch_addr += 2 * CACHELINE_BYTES;
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
        scratch_addr += 2 * CACHELINE_BYTES;
-       PIPE_CONTROL_FLUSH(ring, scratch_addr);
+       PIPE_CONTROL_FLUSH(engine, scratch_addr);
 
-       intel_ring_emit(ring, GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
+       intel_ring_emit(engine,
+                       GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE |
                        PIPE_CONTROL_WRITE_FLUSH |
                        PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE |
                        PIPE_CONTROL_NOTIFY);
-       intel_ring_emit(ring, ring->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
-       intel_ring_emit(ring, i915_gem_request_get_seqno(req));
-       intel_ring_emit(ring, 0);
-       __intel_ring_advance(ring);
+       intel_ring_emit(engine,
+                       engine->scratch.gtt_offset | PIPE_CONTROL_GLOBAL_GTT);
+       intel_ring_emit(engine, i915_gem_request_get_seqno(req));
+       intel_ring_emit(engine, 0);
+       __intel_ring_advance(engine);
 
        return 0;
 }
 
-static u32
-gen6_ring_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
+static void
+gen6_seqno_barrier(struct intel_engine_cs *engine)
 {
        /* Workaround to force correct ordering between irq and seqno writes on
         * ivb (and maybe also on snb) by reading from a CS register (like
-        * ACTHD) before reading the status page. */
-       if (!lazy_coherency) {
-               struct drm_i915_private *dev_priv = ring->dev->dev_private;
-               POSTING_READ(RING_ACTHD(ring->mmio_base));
-       }
-
-       return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
+        * ACTHD) before reading the status page.
+        *
+        * Note that this effectively stalls the read by the time it takes to
+        * do a memory transaction, which more or less ensures that the write
+        * from the GPU has sufficient time to invalidate the CPU cacheline.
+        * Alternatively we could delay the interrupt from the CS ring to give
+        * the write time to land, but that would incur a delay after every
+        * batch i.e. much more frequent than a delay when waiting for the
+        * interrupt (with the same net latency).
+        */
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+       POSTING_READ_FW(RING_ACTHD(engine->mmio_base));
 }
 
 static u32
-ring_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
+ring_get_seqno(struct intel_engine_cs *engine)
 {
-       return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
+       return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
 }
 
 static void
-ring_set_seqno(struct intel_engine_cs *ring, u32 seqno)
+ring_set_seqno(struct intel_engine_cs *engine, u32 seqno)
 {
-       intel_write_status_page(ring, I915_GEM_HWS_INDEX, seqno);
+       intel_write_status_page(engine, I915_GEM_HWS_INDEX, seqno);
 }
 
 static u32
-pc_render_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
+pc_render_get_seqno(struct intel_engine_cs *engine)
 {
-       return ring->scratch.cpu_page[0];
+       return engine->scratch.cpu_page[0];
 }
 
 static void
-pc_render_set_seqno(struct intel_engine_cs *ring, u32 seqno)
+pc_render_set_seqno(struct intel_engine_cs *engine, u32 seqno)
 {
-       ring->scratch.cpu_page[0] = seqno;
+       engine->scratch.cpu_page[0] = seqno;
 }
 
 static bool
-gen5_ring_get_irq(struct intel_engine_cs *ring)
+gen5_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1598,30 +1624,30 @@ gen5_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0)
-               gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
+       if (engine->irq_refcount++ == 0)
+               gen5_enable_gt_irq(dev_priv, engine->irq_enable_mask);
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
        return true;
 }
 
 static void
-gen5_ring_put_irq(struct intel_engine_cs *ring)
+gen5_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0)
-               gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
+       if (--engine->irq_refcount == 0)
+               gen5_disable_gt_irq(dev_priv, engine->irq_enable_mask);
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
 
 static bool
-i9xx_ring_get_irq(struct intel_engine_cs *ring)
+i9xx_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1629,8 +1655,8 @@ i9xx_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               dev_priv->irq_mask &= ~ring->irq_enable_mask;
+       if (engine->irq_refcount++ == 0) {
+               dev_priv->irq_mask &= ~engine->irq_enable_mask;
                I915_WRITE(IMR, dev_priv->irq_mask);
                POSTING_READ(IMR);
        }
@@ -1640,15 +1666,15 @@ i9xx_ring_get_irq(struct intel_engine_cs *ring)
 }
 
 static void
-i9xx_ring_put_irq(struct intel_engine_cs *ring)
+i9xx_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               dev_priv->irq_mask |= ring->irq_enable_mask;
+       if (--engine->irq_refcount == 0) {
+               dev_priv->irq_mask |= engine->irq_enable_mask;
                I915_WRITE(IMR, dev_priv->irq_mask);
                POSTING_READ(IMR);
        }
@@ -1656,9 +1682,9 @@ i9xx_ring_put_irq(struct intel_engine_cs *ring)
 }
 
 static bool
-i8xx_ring_get_irq(struct intel_engine_cs *ring)
+i8xx_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1666,8 +1692,8 @@ i8xx_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               dev_priv->irq_mask &= ~ring->irq_enable_mask;
+       if (engine->irq_refcount++ == 0) {
+               dev_priv->irq_mask &= ~engine->irq_enable_mask;
                I915_WRITE16(IMR, dev_priv->irq_mask);
                POSTING_READ16(IMR);
        }
@@ -1677,15 +1703,15 @@ i8xx_ring_get_irq(struct intel_engine_cs *ring)
 }
 
 static void
-i8xx_ring_put_irq(struct intel_engine_cs *ring)
+i8xx_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               dev_priv->irq_mask |= ring->irq_enable_mask;
+       if (--engine->irq_refcount == 0) {
+               dev_priv->irq_mask |= engine->irq_enable_mask;
                I915_WRITE16(IMR, dev_priv->irq_mask);
                POSTING_READ16(IMR);
        }
@@ -1697,42 +1723,43 @@ bsd_ring_flush(struct drm_i915_gem_request *req,
               u32     invalidate_domains,
               u32     flush_domains)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 2);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_FLUSH);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_FLUSH);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
        return 0;
 }
 
 static int
 i9xx_add_request(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 4);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_STORE_DWORD_INDEX);
-       intel_ring_emit(ring, I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
-       intel_ring_emit(ring, i915_gem_request_get_seqno(req));
-       intel_ring_emit(ring, MI_USER_INTERRUPT);
-       __intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_STORE_DWORD_INDEX);
+       intel_ring_emit(engine,
+                       I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT);
+       intel_ring_emit(engine, i915_gem_request_get_seqno(req));
+       intel_ring_emit(engine, MI_USER_INTERRUPT);
+       __intel_ring_advance(engine);
 
        return 0;
 }
 
 static bool
-gen6_ring_get_irq(struct intel_engine_cs *ring)
+gen6_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1740,14 +1767,14 @@ gen6_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               if (HAS_L3_DPF(dev) && ring->id == RCS)
-                       I915_WRITE_IMR(ring,
-                                      ~(ring->irq_enable_mask |
+       if (engine->irq_refcount++ == 0) {
+               if (HAS_L3_DPF(dev) && engine->id == RCS)
+                       I915_WRITE_IMR(engine,
+                                      ~(engine->irq_enable_mask |
                                         GT_PARITY_ERROR(dev)));
                else
-                       I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
-               gen5_enable_gt_irq(dev_priv, ring->irq_enable_mask);
+                       I915_WRITE_IMR(engine, ~engine->irq_enable_mask);
+               gen5_enable_gt_irq(dev_priv, engine->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
@@ -1755,27 +1782,27 @@ gen6_ring_get_irq(struct intel_engine_cs *ring)
 }
 
 static void
-gen6_ring_put_irq(struct intel_engine_cs *ring)
+gen6_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               if (HAS_L3_DPF(dev) && ring->id == RCS)
-                       I915_WRITE_IMR(ring, ~GT_PARITY_ERROR(dev));
+       if (--engine->irq_refcount == 0) {
+               if (HAS_L3_DPF(dev) && engine->id == RCS)
+                       I915_WRITE_IMR(engine, ~GT_PARITY_ERROR(dev));
                else
-                       I915_WRITE_IMR(ring, ~0);
-               gen5_disable_gt_irq(dev_priv, ring->irq_enable_mask);
+                       I915_WRITE_IMR(engine, ~0);
+               gen5_disable_gt_irq(dev_priv, engine->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
 
 static bool
-hsw_vebox_get_irq(struct intel_engine_cs *ring)
+hsw_vebox_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1783,9 +1810,9 @@ hsw_vebox_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
-               gen6_enable_pm_irq(dev_priv, ring->irq_enable_mask);
+       if (engine->irq_refcount++ == 0) {
+               I915_WRITE_IMR(engine, ~engine->irq_enable_mask);
+               gen6_enable_pm_irq(dev_priv, engine->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
@@ -1793,24 +1820,24 @@ hsw_vebox_get_irq(struct intel_engine_cs *ring)
 }
 
 static void
-hsw_vebox_put_irq(struct intel_engine_cs *ring)
+hsw_vebox_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               I915_WRITE_IMR(ring, ~0);
-               gen6_disable_pm_irq(dev_priv, ring->irq_enable_mask);
+       if (--engine->irq_refcount == 0) {
+               I915_WRITE_IMR(engine, ~0);
+               gen6_disable_pm_irq(dev_priv, engine->irq_enable_mask);
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
 
 static bool
-gen8_ring_get_irq(struct intel_engine_cs *ring)
+gen8_ring_get_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
@@ -1818,15 +1845,15 @@ gen8_ring_get_irq(struct intel_engine_cs *ring)
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (ring->irq_refcount++ == 0) {
-               if (HAS_L3_DPF(dev) && ring->id == RCS) {
-                       I915_WRITE_IMR(ring,
-                                      ~(ring->irq_enable_mask |
+       if (engine->irq_refcount++ == 0) {
+               if (HAS_L3_DPF(dev) && engine->id == RCS) {
+                       I915_WRITE_IMR(engine,
+                                      ~(engine->irq_enable_mask |
                                         GT_RENDER_L3_PARITY_ERROR_INTERRUPT));
                } else {
-                       I915_WRITE_IMR(ring, ~ring->irq_enable_mask);
+                       I915_WRITE_IMR(engine, ~engine->irq_enable_mask);
                }
-               POSTING_READ(RING_IMR(ring->mmio_base));
+               POSTING_READ(RING_IMR(engine->mmio_base));
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 
@@ -1834,21 +1861,21 @@ gen8_ring_get_irq(struct intel_engine_cs *ring)
 }
 
 static void
-gen8_ring_put_irq(struct intel_engine_cs *ring)
+gen8_ring_put_irq(struct intel_engine_cs *engine)
 {
-       struct drm_device *dev = ring->dev;
+       struct drm_device *dev = engine->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
-       if (--ring->irq_refcount == 0) {
-               if (HAS_L3_DPF(dev) && ring->id == RCS) {
-                       I915_WRITE_IMR(ring,
+       if (--engine->irq_refcount == 0) {
+               if (HAS_L3_DPF(dev) && engine->id == RCS) {
+                       I915_WRITE_IMR(engine,
                                       ~GT_RENDER_L3_PARITY_ERROR_INTERRUPT);
                } else {
-                       I915_WRITE_IMR(ring, ~0);
+                       I915_WRITE_IMR(engine, ~0);
                }
-               POSTING_READ(RING_IMR(ring->mmio_base));
+               POSTING_READ(RING_IMR(engine->mmio_base));
        }
        spin_unlock_irqrestore(&dev_priv->irq_lock, flags);
 }
@@ -1858,20 +1885,20 @@ i965_dispatch_execbuffer(struct drm_i915_gem_request *req,
                         u64 offset, u32 length,
                         unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 2);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring,
+       intel_ring_emit(engine,
                        MI_BATCH_BUFFER_START |
                        MI_BATCH_GTT |
                        (dispatch_flags & I915_DISPATCH_SECURE ?
                         0 : MI_BATCH_NON_SECURE_I965));
-       intel_ring_emit(ring, offset);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, offset);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -1885,8 +1912,8 @@ i830_dispatch_execbuffer(struct drm_i915_gem_request *req,
                         u64 offset, u32 len,
                         unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
-       u32 cs_offset = ring->scratch.gtt_offset;
+       struct intel_engine_cs *engine = req->engine;
+       u32 cs_offset = engine->scratch.gtt_offset;
        int ret;
 
        ret = intel_ring_begin(req, 6);
@@ -1894,13 +1921,13 @@ i830_dispatch_execbuffer(struct drm_i915_gem_request *req,
                return ret;
 
        /* Evict the invalid PTE TLBs */
-       intel_ring_emit(ring, COLOR_BLT_CMD | BLT_WRITE_RGBA);
-       intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_COLOR_COPY | 4096);
-       intel_ring_emit(ring, I830_TLB_ENTRIES << 16 | 4); /* load each page */
-       intel_ring_emit(ring, cs_offset);
-       intel_ring_emit(ring, 0xdeadbeef);
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, COLOR_BLT_CMD | BLT_WRITE_RGBA);
+       intel_ring_emit(engine, BLT_DEPTH_32 | BLT_ROP_COLOR_COPY | 4096);
+       intel_ring_emit(engine, I830_TLB_ENTRIES << 16 | 4); /* load each page */
+       intel_ring_emit(engine, cs_offset);
+       intel_ring_emit(engine, 0xdeadbeef);
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        if ((dispatch_flags & I915_DISPATCH_PINNED) == 0) {
                if (len > I830_BATCH_LIMIT)
@@ -1914,16 +1941,17 @@ i830_dispatch_execbuffer(struct drm_i915_gem_request *req,
                 * stable batch scratch bo area (so that the CS never
                 * stumbles over its tlb invalidation bug) ...
                 */
-               intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
-               intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
-               intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 4096);
-               intel_ring_emit(ring, cs_offset);
-               intel_ring_emit(ring, 4096);
-               intel_ring_emit(ring, offset);
-
-               intel_ring_emit(ring, MI_FLUSH);
-               intel_ring_emit(ring, MI_NOOP);
-               intel_ring_advance(ring);
+               intel_ring_emit(engine, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
+               intel_ring_emit(engine,
+                               BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
+               intel_ring_emit(engine, DIV_ROUND_UP(len, 4096) << 16 | 4096);
+               intel_ring_emit(engine, cs_offset);
+               intel_ring_emit(engine, 4096);
+               intel_ring_emit(engine, offset);
+
+               intel_ring_emit(engine, MI_FLUSH);
+               intel_ring_emit(engine, MI_NOOP);
+               intel_ring_advance(engine);
 
                /* ... and execute it. */
                offset = cs_offset;
@@ -1933,10 +1961,10 @@ i830_dispatch_execbuffer(struct drm_i915_gem_request *req,
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_GTT);
-       intel_ring_emit(ring, offset | (dispatch_flags & I915_DISPATCH_SECURE ?
-                                       0 : MI_BATCH_NON_SECURE));
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_BATCH_BUFFER_START | MI_BATCH_GTT);
+       intel_ring_emit(engine, offset | (dispatch_flags & I915_DISPATCH_SECURE ?
+                                         0 : MI_BATCH_NON_SECURE));
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -1946,55 +1974,55 @@ i915_dispatch_execbuffer(struct drm_i915_gem_request *req,
                         u64 offset, u32 len,
                         unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 2);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring, MI_BATCH_BUFFER_START | MI_BATCH_GTT);
-       intel_ring_emit(ring, offset | (dispatch_flags & I915_DISPATCH_SECURE ?
-                                       0 : MI_BATCH_NON_SECURE));
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, MI_BATCH_BUFFER_START | MI_BATCH_GTT);
+       intel_ring_emit(engine, offset | (dispatch_flags & I915_DISPATCH_SECURE ?
+                                         0 : MI_BATCH_NON_SECURE));
+       intel_ring_advance(engine);
 
        return 0;
 }
 
-static void cleanup_phys_status_page(struct intel_engine_cs *ring)
+static void cleanup_phys_status_page(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = to_i915(ring->dev);
+       struct drm_i915_private *dev_priv = to_i915(engine->dev);
 
        if (!dev_priv->status_page_dmah)
                return;
 
-       drm_pci_free(ring->dev, dev_priv->status_page_dmah);
-       ring->status_page.page_addr = NULL;
+       drm_pci_free(engine->dev, dev_priv->status_page_dmah);
+       engine->status_page.page_addr = NULL;
 }
 
-static void cleanup_status_page(struct intel_engine_cs *ring)
+static void cleanup_status_page(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_object *obj;
 
-       obj = ring->status_page.obj;
+       obj = engine->status_page.obj;
        if (obj == NULL)
                return;
 
        kunmap(sg_page(obj->pages->sgl));
        i915_gem_object_ggtt_unpin(obj);
        drm_gem_object_unreference(&obj->base);
-       ring->status_page.obj = NULL;
+       engine->status_page.obj = NULL;
 }
 
-static int init_status_page(struct intel_engine_cs *ring)
+static int init_status_page(struct intel_engine_cs *engine)
 {
-       struct drm_i915_gem_object *obj = ring->status_page.obj;
+       struct drm_i915_gem_object *obj = engine->status_page.obj;
 
        if (obj == NULL) {
                unsigned flags;
                int ret;
 
-               obj = i915_gem_alloc_object(ring->dev, 4096);
+               obj = i915_gem_alloc_object(engine->dev, 4096);
                if (obj == NULL) {
                        DRM_ERROR("Failed to allocate status page\n");
                        return -ENOMEM;
@@ -2005,7 +2033,7 @@ static int init_status_page(struct intel_engine_cs *ring)
                        goto err_unref;
 
                flags = 0;
-               if (!HAS_LLC(ring->dev))
+               if (!HAS_LLC(engine->dev))
                        /* On g33, we cannot place HWS above 256MiB, so
                         * restrict its pinning to the low mappable arena.
                         * Though this restriction is not documented for
@@ -2024,32 +2052,32 @@ err_unref:
                        return ret;
                }
 
-               ring->status_page.obj = obj;
+               engine->status_page.obj = obj;
        }
 
-       ring->status_page.gfx_addr = i915_gem_obj_ggtt_offset(obj);
-       ring->status_page.page_addr = kmap(sg_page(obj->pages->sgl));
-       memset(ring->status_page.page_addr, 0, PAGE_SIZE);
+       engine->status_page.gfx_addr = i915_gem_obj_ggtt_offset(obj);
+       engine->status_page.page_addr = kmap(sg_page(obj->pages->sgl));
+       memset(engine->status_page.page_addr, 0, PAGE_SIZE);
 
        DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
-                       ring->name, ring->status_page.gfx_addr);
+                       engine->name, engine->status_page.gfx_addr);
 
        return 0;
 }
 
-static int init_phys_status_page(struct intel_engine_cs *ring)
+static int init_phys_status_page(struct intel_engine_cs *engine)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
 
        if (!dev_priv->status_page_dmah) {
                dev_priv->status_page_dmah =
-                       drm_pci_alloc(ring->dev, PAGE_SIZE, PAGE_SIZE);
+                       drm_pci_alloc(engine->dev, PAGE_SIZE, PAGE_SIZE);
                if (!dev_priv->status_page_dmah)
                        return -ENOMEM;
        }
 
-       ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
-       memset(ring->status_page.page_addr, 0, PAGE_SIZE);
+       engine->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
+       memset(engine->status_page.page_addr, 0, PAGE_SIZE);
 
        return 0;
 }
@@ -2057,7 +2085,7 @@ static int init_phys_status_page(struct intel_engine_cs *ring)
 void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
 {
        if (HAS_LLC(ringbuf->obj->base.dev) && !ringbuf->obj->stolen)
-               vunmap(ringbuf->virtual_start);
+               i915_gem_object_unpin_map(ringbuf->obj);
        else
                iounmap(ringbuf->virtual_start);
        ringbuf->virtual_start = NULL;
@@ -2065,34 +2093,15 @@ void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
        i915_gem_object_ggtt_unpin(ringbuf->obj);
 }
 
-static u32 *vmap_obj(struct drm_i915_gem_object *obj)
-{
-       struct sg_page_iter sg_iter;
-       struct page **pages;
-       void *addr;
-       int i;
-
-       pages = drm_malloc_ab(obj->base.size >> PAGE_SHIFT, sizeof(*pages));
-       if (pages == NULL)
-               return NULL;
-
-       i = 0;
-       for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0)
-               pages[i++] = sg_page_iter_page(&sg_iter);
-
-       addr = vmap(pages, i, 0, PAGE_KERNEL);
-       drm_free_large(pages);
-
-       return addr;
-}
-
 int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
                                     struct intel_ringbuffer *ringbuf)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
+       struct i915_ggtt *ggtt = &dev_priv->ggtt;
        struct drm_i915_gem_object *obj = ringbuf->obj;
        /* Ring wraparound at offset 0 sometimes hangs. No idea why. */
        unsigned flags = PIN_OFFSET_BIAS | 4096;
+       void *addr;
        int ret;
 
        if (HAS_LLC(dev_priv) && !obj->stolen) {
@@ -2101,15 +2110,13 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
                        return ret;
 
                ret = i915_gem_object_set_to_cpu_domain(obj, true);
-               if (ret) {
-                       i915_gem_object_ggtt_unpin(obj);
-                       return ret;
-               }
+               if (ret)
+                       goto err_unpin;
 
-               ringbuf->virtual_start = vmap_obj(obj);
-               if (ringbuf->virtual_start == NULL) {
-                       i915_gem_object_ggtt_unpin(obj);
-                       return -ENOMEM;
+               addr = i915_gem_object_pin_map(obj);
+               if (IS_ERR(addr)) {
+                       ret = PTR_ERR(addr);
+                       goto err_unpin;
                }
        } else {
                ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE,
@@ -2118,25 +2125,27 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
                        return ret;
 
                ret = i915_gem_object_set_to_gtt_domain(obj, true);
-               if (ret) {
-                       i915_gem_object_ggtt_unpin(obj);
-                       return ret;
-               }
+               if (ret)
+                       goto err_unpin;
 
                /* Access through the GTT requires the device to be awake. */
                assert_rpm_wakelock_held(dev_priv);
 
-               ringbuf->virtual_start = ioremap_wc(dev_priv->gtt.mappable_base +
-                                                   i915_gem_obj_ggtt_offset(obj), ringbuf->size);
-               if (ringbuf->virtual_start == NULL) {
-                       i915_gem_object_ggtt_unpin(obj);
-                       return -EINVAL;
+               addr = ioremap_wc(ggtt->mappable_base +
+                                 i915_gem_obj_ggtt_offset(obj), ringbuf->size);
+               if (addr == NULL) {
+                       ret = -ENOMEM;
+                       goto err_unpin;
                }
        }
 
+       ringbuf->virtual_start = addr;
        ringbuf->vma = i915_gem_obj_to_ggtt(obj);
-
        return 0;
+
+err_unpin:
+       i915_gem_object_ggtt_unpin(obj);
+       return ret;
 }
 
 static void intel_destroy_ringbuffer_obj(struct intel_ringbuffer *ringbuf)
@@ -2179,7 +2188,7 @@ intel_engine_create_ringbuffer(struct intel_engine_cs *engine, int size)
                return ERR_PTR(-ENOMEM);
        }
 
-       ring->ring = engine;
+       ring->engine = engine;
        list_add(&ring->link, &engine->buffers);
 
        ring->size = size;
@@ -2215,37 +2224,38 @@ intel_ringbuffer_free(struct intel_ringbuffer *ring)
 }
 
 static int intel_init_ring_buffer(struct drm_device *dev,
-                                 struct intel_engine_cs *ring)
+                                 struct intel_engine_cs *engine)
 {
        struct intel_ringbuffer *ringbuf;
        int ret;
 
-       WARN_ON(ring->buffer);
+       WARN_ON(engine->buffer);
 
-       ring->dev = dev;
-       INIT_LIST_HEAD(&ring->active_list);
-       INIT_LIST_HEAD(&ring->request_list);
-       INIT_LIST_HEAD(&ring->execlist_queue);
-       INIT_LIST_HEAD(&ring->buffers);
-       i915_gem_batch_pool_init(dev, &ring->batch_pool);
-       memset(ring->semaphore.sync_seqno, 0, sizeof(ring->semaphore.sync_seqno));
+       engine->dev = dev;
+       INIT_LIST_HEAD(&engine->active_list);
+       INIT_LIST_HEAD(&engine->request_list);
+       INIT_LIST_HEAD(&engine->execlist_queue);
+       INIT_LIST_HEAD(&engine->buffers);
+       i915_gem_batch_pool_init(dev, &engine->batch_pool);
+       memset(engine->semaphore.sync_seqno, 0,
+              sizeof(engine->semaphore.sync_seqno));
 
-       init_waitqueue_head(&ring->irq_queue);
+       init_waitqueue_head(&engine->irq_queue);
 
-       ringbuf = intel_engine_create_ringbuffer(ring, 32 * PAGE_SIZE);
+       ringbuf = intel_engine_create_ringbuffer(engine, 32 * PAGE_SIZE);
        if (IS_ERR(ringbuf)) {
                ret = PTR_ERR(ringbuf);
                goto error;
        }
-       ring->buffer = ringbuf;
+       engine->buffer = ringbuf;
 
        if (I915_NEED_GFX_HWS(dev)) {
-               ret = init_status_page(ring);
+               ret = init_status_page(engine);
                if (ret)
                        goto error;
        } else {
-               WARN_ON(ring->id != RCS);
-               ret = init_phys_status_page(ring);
+               WARN_ON(engine->id != RCS);
+               ret = init_phys_status_page(engine);
                if (ret)
                        goto error;
        }
@@ -2253,58 +2263,58 @@ static int intel_init_ring_buffer(struct drm_device *dev,
        ret = intel_pin_and_map_ringbuffer_obj(dev, ringbuf);
        if (ret) {
                DRM_ERROR("Failed to pin and map ringbuffer %s: %d\n",
-                               ring->name, ret);
+                               engine->name, ret);
                intel_destroy_ringbuffer_obj(ringbuf);
                goto error;
        }
 
-       ret = i915_cmd_parser_init_ring(ring);
+       ret = i915_cmd_parser_init_ring(engine);
        if (ret)
                goto error;
 
        return 0;
 
 error:
-       intel_cleanup_ring_buffer(ring);
+       intel_cleanup_engine(engine);
        return ret;
 }
 
-void intel_cleanup_ring_buffer(struct intel_engine_cs *ring)
+void intel_cleanup_engine(struct intel_engine_cs *engine)
 {
        struct drm_i915_private *dev_priv;
 
-       if (!intel_ring_initialized(ring))
+       if (!intel_engine_initialized(engine))
                return;
 
-       dev_priv = to_i915(ring->dev);
+       dev_priv = to_i915(engine->dev);
 
-       if (ring->buffer) {
-               intel_stop_ring_buffer(ring);
-               WARN_ON(!IS_GEN2(ring->dev) && (I915_READ_MODE(ring) & MODE_IDLE) == 0);
+       if (engine->buffer) {
+               intel_stop_engine(engine);
+               WARN_ON(!IS_GEN2(engine->dev) && (I915_READ_MODE(engine) & MODE_IDLE) == 0);
 
-               intel_unpin_ringbuffer_obj(ring->buffer);
-               intel_ringbuffer_free(ring->buffer);
-               ring->buffer = NULL;
+               intel_unpin_ringbuffer_obj(engine->buffer);
+               intel_ringbuffer_free(engine->buffer);
+               engine->buffer = NULL;
        }
 
-       if (ring->cleanup)
-               ring->cleanup(ring);
+       if (engine->cleanup)
+               engine->cleanup(engine);
 
-       if (I915_NEED_GFX_HWS(ring->dev)) {
-               cleanup_status_page(ring);
+       if (I915_NEED_GFX_HWS(engine->dev)) {
+               cleanup_status_page(engine);
        } else {
-               WARN_ON(ring->id != RCS);
-               cleanup_phys_status_page(ring);
+               WARN_ON(engine->id != RCS);
+               cleanup_phys_status_page(engine);
        }
 
-       i915_cmd_parser_fini_ring(ring);
-       i915_gem_batch_pool_fini(&ring->batch_pool);
-       ring->dev = NULL;
+       i915_cmd_parser_fini_ring(engine);
+       i915_gem_batch_pool_fini(&engine->batch_pool);
+       engine->dev = NULL;
 }
 
-static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
+static int ring_wait_for_space(struct intel_engine_cs *engine, int n)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        struct drm_i915_gem_request *request;
        unsigned space;
        int ret;
@@ -2315,14 +2325,14 @@ static int ring_wait_for_space(struct intel_engine_cs *ring, int n)
        /* The whole point of reserving space is to not wait! */
        WARN_ON(ringbuf->reserved_in_use);
 
-       list_for_each_entry(request, &ring->request_list, list) {
+       list_for_each_entry(request, &engine->request_list, list) {
                space = __intel_ring_space(request->postfix, ringbuf->tail,
                                           ringbuf->size);
                if (space >= n)
                        break;
        }
 
-       if (WARN_ON(&request->list == &ring->request_list))
+       if (WARN_ON(&request->list == &engine->request_list))
                return -ENOSPC;
 
        ret = i915_wait_request(request);
@@ -2347,28 +2357,27 @@ static void __wrap_ring_buffer(struct intel_ringbuffer *ringbuf)
        intel_ring_update_space(ringbuf);
 }
 
-int intel_ring_idle(struct intel_engine_cs *ring)
+int intel_engine_idle(struct intel_engine_cs *engine)
 {
        struct drm_i915_gem_request *req;
 
        /* Wait upon the last request to be completed */
-       if (list_empty(&ring->request_list))
+       if (list_empty(&engine->request_list))
                return 0;
 
-       req = list_entry(ring->request_list.prev,
-                       struct drm_i915_gem_request,
-                       list);
+       req = list_entry(engine->request_list.prev,
+                        struct drm_i915_gem_request,
+                        list);
 
        /* Make sure we do not trigger any retires */
        return __i915_wait_request(req,
-                                  atomic_read(&to_i915(ring->dev)->gpu_error.reset_counter),
-                                  to_i915(ring->dev)->mm.interruptible,
+                                  req->i915->mm.interruptible,
                                   NULL, NULL);
 }
 
 int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request)
 {
-       request->ringbuf = request->ring->buffer;
+       request->ringbuf = request->engine->buffer;
        return 0;
 }
 
@@ -2434,9 +2443,9 @@ void intel_ring_reserved_space_end(struct intel_ringbuffer *ringbuf)
        ringbuf->reserved_in_use = false;
 }
 
-static int __intel_ring_prepare(struct intel_engine_cs *ring, int bytes)
+static int __intel_ring_prepare(struct intel_engine_cs *engine, int bytes)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        int remain_usable = ringbuf->effective_size - ringbuf->tail;
        int remain_actual = ringbuf->size - ringbuf->tail;
        int ret, total_bytes, wait_bytes = 0;
@@ -2470,7 +2479,7 @@ static int __intel_ring_prepare(struct intel_engine_cs *ring, int bytes)
        }
 
        if (wait_bytes) {
-               ret = ring_wait_for_space(ring, wait_bytes);
+               ret = ring_wait_for_space(engine, wait_bytes);
                if (unlikely(ret))
                        return ret;
 
@@ -2484,32 +2493,22 @@ static int __intel_ring_prepare(struct intel_engine_cs *ring, int bytes)
 int intel_ring_begin(struct drm_i915_gem_request *req,
                     int num_dwords)
 {
-       struct intel_engine_cs *ring;
-       struct drm_i915_private *dev_priv;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
-       WARN_ON(req == NULL);
-       ring = req->ring;
-       dev_priv = ring->dev->dev_private;
-
-       ret = i915_gem_check_wedge(&dev_priv->gpu_error,
-                                  dev_priv->mm.interruptible);
-       if (ret)
-               return ret;
-
-       ret = __intel_ring_prepare(ring, num_dwords * sizeof(uint32_t));
+       ret = __intel_ring_prepare(engine, num_dwords * sizeof(uint32_t));
        if (ret)
                return ret;
 
-       ring->buffer->space -= num_dwords * sizeof(uint32_t);
+       engine->buffer->space -= num_dwords * sizeof(uint32_t);
        return 0;
 }
 
 /* Align the ring tail to a cacheline boundary */
 int intel_ring_cacheline_align(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
-       int num_dwords = (ring->buffer->tail & (CACHELINE_BYTES - 1)) / sizeof(uint32_t);
+       struct intel_engine_cs *engine = req->engine;
+       int num_dwords = (engine->buffer->tail & (CACHELINE_BYTES - 1)) / sizeof(uint32_t);
        int ret;
 
        if (num_dwords == 0)
@@ -2521,33 +2520,52 @@ int intel_ring_cacheline_align(struct drm_i915_gem_request *req)
                return ret;
 
        while (num_dwords--)
-               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_emit(engine, MI_NOOP);
 
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return 0;
 }
 
-void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno)
+void intel_ring_init_seqno(struct intel_engine_cs *engine, u32 seqno)
 {
-       struct drm_device *dev = ring->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct drm_i915_private *dev_priv = to_i915(engine->dev);
 
-       if (INTEL_INFO(dev)->gen == 6 || INTEL_INFO(dev)->gen == 7) {
-               I915_WRITE(RING_SYNC_0(ring->mmio_base), 0);
-               I915_WRITE(RING_SYNC_1(ring->mmio_base), 0);
-               if (HAS_VEBOX(dev))
-                       I915_WRITE(RING_SYNC_2(ring->mmio_base), 0);
+       /* Our semaphore implementation is strictly monotonic (i.e. we proceed
+        * so long as the semaphore value in the register/page is greater
+        * than the sync value), so whenever we reset the seqno,
+        * so long as we reset the tracking semaphore value to 0, it will
+        * always be before the next request's seqno. If we don't reset
+        * the semaphore value, then when the seqno moves backwards all
+        * future waits will complete instantly (causing rendering corruption).
+        */
+       if (INTEL_INFO(dev_priv)->gen == 6 || INTEL_INFO(dev_priv)->gen == 7) {
+               I915_WRITE(RING_SYNC_0(engine->mmio_base), 0);
+               I915_WRITE(RING_SYNC_1(engine->mmio_base), 0);
+               if (HAS_VEBOX(dev_priv))
+                       I915_WRITE(RING_SYNC_2(engine->mmio_base), 0);
+       }
+       if (dev_priv->semaphore_obj) {
+               struct drm_i915_gem_object *obj = dev_priv->semaphore_obj;
+               struct page *page = i915_gem_object_get_dirty_page(obj, 0);
+               void *semaphores = kmap(page);
+               memset(semaphores + GEN8_SEMAPHORE_OFFSET(engine->id, 0),
+                      0, I915_NUM_ENGINES * gen8_semaphore_seqno_size);
+               kunmap(page);
        }
+       memset(engine->semaphore.sync_seqno, 0,
+              sizeof(engine->semaphore.sync_seqno));
 
-       ring->set_seqno(ring, seqno);
-       ring->hangcheck.seqno = seqno;
+       engine->set_seqno(engine, seqno);
+       engine->last_submitted_seqno = seqno;
+
+       engine->hangcheck.seqno = seqno;
 }
 
-static void gen6_bsd_ring_write_tail(struct intel_engine_cs *ring,
+static void gen6_bsd_ring_write_tail(struct intel_engine_cs *engine,
                                     u32 value)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
 
        /* Every tail move must follow the sequence below */
 
@@ -2567,8 +2585,8 @@ static void gen6_bsd_ring_write_tail(struct intel_engine_cs *ring,
                DRM_ERROR("timed out waiting for the BSD ring to wake up\n");
 
        /* Now that the ring is fully powered up, update the tail */
-       I915_WRITE_TAIL(ring, value);
-       POSTING_READ(RING_TAIL(ring->mmio_base));
+       I915_WRITE_TAIL(engine, value);
+       POSTING_READ(RING_TAIL(engine->mmio_base));
 
        /* Let the ring send IDLE messages to the GT again,
         * and so let it sleep to conserve power when idle.
@@ -2580,7 +2598,7 @@ static void gen6_bsd_ring_write_tail(struct intel_engine_cs *ring,
 static int gen6_bsd_ring_flush(struct drm_i915_gem_request *req,
                               u32 invalidate, u32 flush)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        uint32_t cmd;
        int ret;
 
@@ -2589,7 +2607,7 @@ static int gen6_bsd_ring_flush(struct drm_i915_gem_request *req,
                return ret;
 
        cmd = MI_FLUSH_DW;
-       if (INTEL_INFO(ring->dev)->gen >= 8)
+       if (INTEL_INFO(engine->dev)->gen >= 8)
                cmd += 1;
 
        /* We always require a command barrier so that subsequent
@@ -2608,16 +2626,17 @@ static int gen6_bsd_ring_flush(struct drm_i915_gem_request *req,
        if (invalidate & I915_GEM_GPU_DOMAINS)
                cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD;
 
-       intel_ring_emit(ring, cmd);
-       intel_ring_emit(ring, I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT);
-       if (INTEL_INFO(ring->dev)->gen >= 8) {
-               intel_ring_emit(ring, 0); /* upper addr */
-               intel_ring_emit(ring, 0); /* value */
+       intel_ring_emit(engine, cmd);
+       intel_ring_emit(engine,
+                       I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT);
+       if (INTEL_INFO(engine->dev)->gen >= 8) {
+               intel_ring_emit(engine, 0); /* upper addr */
+               intel_ring_emit(engine, 0); /* value */
        } else  {
-               intel_ring_emit(ring, 0);
-               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_emit(engine, 0);
+               intel_ring_emit(engine, MI_NOOP);
        }
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
        return 0;
 }
 
@@ -2626,8 +2645,8 @@ gen8_ring_dispatch_execbuffer(struct drm_i915_gem_request *req,
                              u64 offset, u32 len,
                              unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
-       bool ppgtt = USES_PPGTT(ring->dev) &&
+       struct intel_engine_cs *engine = req->engine;
+       bool ppgtt = USES_PPGTT(engine->dev) &&
                        !(dispatch_flags & I915_DISPATCH_SECURE);
        int ret;
 
@@ -2636,13 +2655,13 @@ gen8_ring_dispatch_execbuffer(struct drm_i915_gem_request *req,
                return ret;
 
        /* FIXME(BDW): Address space and security selectors. */
-       intel_ring_emit(ring, MI_BATCH_BUFFER_START_GEN8 | (ppgtt<<8) |
+       intel_ring_emit(engine, MI_BATCH_BUFFER_START_GEN8 | (ppgtt<<8) |
                        (dispatch_flags & I915_DISPATCH_RS ?
                         MI_BATCH_RESOURCE_STREAMER : 0));
-       intel_ring_emit(ring, lower_32_bits(offset));
-       intel_ring_emit(ring, upper_32_bits(offset));
-       intel_ring_emit(ring, MI_NOOP);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, lower_32_bits(offset));
+       intel_ring_emit(engine, upper_32_bits(offset));
+       intel_ring_emit(engine, MI_NOOP);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -2652,22 +2671,22 @@ hsw_ring_dispatch_execbuffer(struct drm_i915_gem_request *req,
                             u64 offset, u32 len,
                             unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 2);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring,
+       intel_ring_emit(engine,
                        MI_BATCH_BUFFER_START |
                        (dispatch_flags & I915_DISPATCH_SECURE ?
                         0 : MI_BATCH_PPGTT_HSW | MI_BATCH_NON_SECURE_HSW) |
                        (dispatch_flags & I915_DISPATCH_RS ?
                         MI_BATCH_RESOURCE_STREAMER : 0));
        /* bit0-7 is the length on GEN6+ */
-       intel_ring_emit(ring, offset);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, offset);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -2677,20 +2696,20 @@ gen6_ring_dispatch_execbuffer(struct drm_i915_gem_request *req,
                              u64 offset, u32 len,
                              unsigned dispatch_flags)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
        ret = intel_ring_begin(req, 2);
        if (ret)
                return ret;
 
-       intel_ring_emit(ring,
+       intel_ring_emit(engine,
                        MI_BATCH_BUFFER_START |
                        (dispatch_flags & I915_DISPATCH_SECURE ?
                         0 : MI_BATCH_NON_SECURE_I965));
        /* bit0-7 is the length on GEN6+ */
-       intel_ring_emit(ring, offset);
-       intel_ring_advance(ring);
+       intel_ring_emit(engine, offset);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -2700,8 +2719,8 @@ gen6_ring_dispatch_execbuffer(struct drm_i915_gem_request *req,
 static int gen6_ring_flush(struct drm_i915_gem_request *req,
                           u32 invalidate, u32 flush)
 {
-       struct intel_engine_cs *ring = req->ring;
-       struct drm_device *dev = ring->dev;
+       struct intel_engine_cs *engine = req->engine;
+       struct drm_device *dev = engine->dev;
        uint32_t cmd;
        int ret;
 
@@ -2728,16 +2747,17 @@ static int gen6_ring_flush(struct drm_i915_gem_request *req,
         */
        if (invalidate & I915_GEM_DOMAIN_RENDER)
                cmd |= MI_INVALIDATE_TLB;
-       intel_ring_emit(ring, cmd);
-       intel_ring_emit(ring, I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT);
+       intel_ring_emit(engine, cmd);
+       intel_ring_emit(engine,
+                       I915_GEM_HWS_SCRATCH_ADDR | MI_FLUSH_DW_USE_GTT);
        if (INTEL_INFO(dev)->gen >= 8) {
-               intel_ring_emit(ring, 0); /* upper addr */
-               intel_ring_emit(ring, 0); /* value */
+               intel_ring_emit(engine, 0); /* upper addr */
+               intel_ring_emit(engine, 0); /* value */
        } else  {
-               intel_ring_emit(ring, 0);
-               intel_ring_emit(ring, MI_NOOP);
+               intel_ring_emit(engine, 0);
+               intel_ring_emit(engine, MI_NOOP);
        }
-       intel_ring_advance(ring);
+       intel_ring_advance(engine);
 
        return 0;
 }
@@ -2745,14 +2765,14 @@ static int gen6_ring_flush(struct drm_i915_gem_request *req,
 int intel_init_render_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[RCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[RCS];
        struct drm_i915_gem_object *obj;
        int ret;
 
-       ring->name = "render ring";
-       ring->id = RCS;
-       ring->exec_id = I915_EXEC_RENDER;
-       ring->mmio_base = RENDER_RING_BASE;
+       engine->name = "render ring";
+       engine->id = RCS;
+       engine->exec_id = I915_EXEC_RENDER;
+       engine->mmio_base = RENDER_RING_BASE;
 
        if (INTEL_INFO(dev)->gen >= 8) {
                if (i915_semaphore_is_enabled(dev)) {
@@ -2772,34 +2792,36 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
                        }
                }
 
-               ring->init_context = intel_rcs_ctx_init;
-               ring->add_request = gen6_add_request;
-               ring->flush = gen8_render_ring_flush;
-               ring->irq_get = gen8_ring_get_irq;
-               ring->irq_put = gen8_ring_put_irq;
-               ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
-               ring->get_seqno = gen6_ring_get_seqno;
-               ring->set_seqno = ring_set_seqno;
+               engine->init_context = intel_rcs_ctx_init;
+               engine->add_request = gen6_add_request;
+               engine->flush = gen8_render_ring_flush;
+               engine->irq_get = gen8_ring_get_irq;
+               engine->irq_put = gen8_ring_put_irq;
+               engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
+               engine->irq_seqno_barrier = gen6_seqno_barrier;
+               engine->get_seqno = ring_get_seqno;
+               engine->set_seqno = ring_set_seqno;
                if (i915_semaphore_is_enabled(dev)) {
                        WARN_ON(!dev_priv->semaphore_obj);
-                       ring->semaphore.sync_to = gen8_ring_sync;
-                       ring->semaphore.signal = gen8_rcs_signal;
-                       GEN8_RING_SEMAPHORE_INIT;
+                       engine->semaphore.sync_to = gen8_ring_sync;
+                       engine->semaphore.signal = gen8_rcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT(engine);
                }
        } else if (INTEL_INFO(dev)->gen >= 6) {
-               ring->init_context = intel_rcs_ctx_init;
-               ring->add_request = gen6_add_request;
-               ring->flush = gen7_render_ring_flush;
+               engine->init_context = intel_rcs_ctx_init;
+               engine->add_request = gen6_add_request;
+               engine->flush = gen7_render_ring_flush;
                if (INTEL_INFO(dev)->gen == 6)
-                       ring->flush = gen6_render_ring_flush;
-               ring->irq_get = gen6_ring_get_irq;
-               ring->irq_put = gen6_ring_put_irq;
-               ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
-               ring->get_seqno = gen6_ring_get_seqno;
-               ring->set_seqno = ring_set_seqno;
+                       engine->flush = gen6_render_ring_flush;
+               engine->irq_get = gen6_ring_get_irq;
+               engine->irq_put = gen6_ring_put_irq;
+               engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT;
+               engine->irq_seqno_barrier = gen6_seqno_barrier;
+               engine->get_seqno = ring_get_seqno;
+               engine->set_seqno = ring_set_seqno;
                if (i915_semaphore_is_enabled(dev)) {
-                       ring->semaphore.sync_to = gen6_ring_sync;
-                       ring->semaphore.signal = gen6_signal;
+                       engine->semaphore.sync_to = gen6_ring_sync;
+                       engine->semaphore.signal = gen6_signal;
                        /*
                         * The current semaphore is only applied on pre-gen8
                         * platform.  And there is no VCS2 ring on the pre-gen8
@@ -2807,59 +2829,59 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
                         * initialized as INVALID.  Gen8 will initialize the
                         * sema between VCS2 and RCS later.
                         */
-                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV;
-                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB;
-                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE;
-                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
-                       ring->semaphore.mbox.signal[VCS] = GEN6_VRSYNC;
-                       ring->semaphore.mbox.signal[BCS] = GEN6_BRSYNC;
-                       ring->semaphore.mbox.signal[VECS] = GEN6_VERSYNC;
-                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+                       engine->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_RV;
+                       engine->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_RB;
+                       engine->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_RVE;
+                       engine->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.signal[RCS] = GEN6_NOSYNC;
+                       engine->semaphore.mbox.signal[VCS] = GEN6_VRSYNC;
+                       engine->semaphore.mbox.signal[BCS] = GEN6_BRSYNC;
+                       engine->semaphore.mbox.signal[VECS] = GEN6_VERSYNC;
+                       engine->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
                }
        } else if (IS_GEN5(dev)) {
-               ring->add_request = pc_render_add_request;
-               ring->flush = gen4_render_ring_flush;
-               ring->get_seqno = pc_render_get_seqno;
-               ring->set_seqno = pc_render_set_seqno;
-               ring->irq_get = gen5_ring_get_irq;
-               ring->irq_put = gen5_ring_put_irq;
-               ring->irq_enable_mask = GT_RENDER_USER_INTERRUPT |
+               engine->add_request = pc_render_add_request;
+               engine->flush = gen4_render_ring_flush;
+               engine->get_seqno = pc_render_get_seqno;
+               engine->set_seqno = pc_render_set_seqno;
+               engine->irq_get = gen5_ring_get_irq;
+               engine->irq_put = gen5_ring_put_irq;
+               engine->irq_enable_mask = GT_RENDER_USER_INTERRUPT |
                                        GT_RENDER_PIPECTL_NOTIFY_INTERRUPT;
        } else {
-               ring->add_request = i9xx_add_request;
+               engine->add_request = i9xx_add_request;
                if (INTEL_INFO(dev)->gen < 4)
-                       ring->flush = gen2_render_ring_flush;
+                       engine->flush = gen2_render_ring_flush;
                else
-                       ring->flush = gen4_render_ring_flush;
-               ring->get_seqno = ring_get_seqno;
-               ring->set_seqno = ring_set_seqno;
+                       engine->flush = gen4_render_ring_flush;
+               engine->get_seqno = ring_get_seqno;
+               engine->set_seqno = ring_set_seqno;
                if (IS_GEN2(dev)) {
-                       ring->irq_get = i8xx_ring_get_irq;
-                       ring->irq_put = i8xx_ring_put_irq;
+                       engine->irq_get = i8xx_ring_get_irq;
+                       engine->irq_put = i8xx_ring_put_irq;
                } else {
-                       ring->irq_get = i9xx_ring_get_irq;
-                       ring->irq_put = i9xx_ring_put_irq;
+                       engine->irq_get = i9xx_ring_get_irq;
+                       engine->irq_put = i9xx_ring_put_irq;
                }
-               ring->irq_enable_mask = I915_USER_INTERRUPT;
+               engine->irq_enable_mask = I915_USER_INTERRUPT;
        }
-       ring->write_tail = ring_write_tail;
+       engine->write_tail = ring_write_tail;
 
        if (IS_HASWELL(dev))
-               ring->dispatch_execbuffer = hsw_ring_dispatch_execbuffer;
+               engine->dispatch_execbuffer = hsw_ring_dispatch_execbuffer;
        else if (IS_GEN8(dev))
-               ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
+               engine->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
        else if (INTEL_INFO(dev)->gen >= 6)
-               ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
+               engine->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
        else if (INTEL_INFO(dev)->gen >= 4)
-               ring->dispatch_execbuffer = i965_dispatch_execbuffer;
+               engine->dispatch_execbuffer = i965_dispatch_execbuffer;
        else if (IS_I830(dev) || IS_845G(dev))
-               ring->dispatch_execbuffer = i830_dispatch_execbuffer;
+               engine->dispatch_execbuffer = i830_dispatch_execbuffer;
        else
-               ring->dispatch_execbuffer = i915_dispatch_execbuffer;
-       ring->init_hw = init_render_ring;
-       ring->cleanup = render_ring_cleanup;
+               engine->dispatch_execbuffer = i915_dispatch_execbuffer;
+       engine->init_hw = init_render_ring;
+       engine->cleanup = render_ring_cleanup;
 
        /* Workaround batchbuffer to combat CS tlb bug. */
        if (HAS_BROKEN_CS_TLB(dev)) {
@@ -2876,16 +2898,16 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
                        return ret;
                }
 
-               ring->scratch.obj = obj;
-               ring->scratch.gtt_offset = i915_gem_obj_ggtt_offset(obj);
+               engine->scratch.obj = obj;
+               engine->scratch.gtt_offset = i915_gem_obj_ggtt_offset(obj);
        }
 
-       ret = intel_init_ring_buffer(dev, ring);
+       ret = intel_init_ring_buffer(dev, engine);
        if (ret)
                return ret;
 
        if (INTEL_INFO(dev)->gen >= 5) {
-               ret = intel_init_pipe_control(ring);
+               ret = intel_init_pipe_control(engine);
                if (ret)
                        return ret;
        }
@@ -2896,75 +2918,76 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
 int intel_init_bsd_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VCS];
+       struct intel_engine_cs *engine = &dev_priv->engine[VCS];
 
-       ring->name = "bsd ring";
-       ring->id = VCS;
-       ring->exec_id = I915_EXEC_BSD;
+       engine->name = "bsd ring";
+       engine->id = VCS;
+       engine->exec_id = I915_EXEC_BSD;
 
-       ring->write_tail = ring_write_tail;
+       engine->write_tail = ring_write_tail;
        if (INTEL_INFO(dev)->gen >= 6) {
-               ring->mmio_base = GEN6_BSD_RING_BASE;
+               engine->mmio_base = GEN6_BSD_RING_BASE;
                /* gen6 bsd needs a special wa for tail updates */
                if (IS_GEN6(dev))
-                       ring->write_tail = gen6_bsd_ring_write_tail;
-               ring->flush = gen6_bsd_ring_flush;
-               ring->add_request = gen6_add_request;
-               ring->get_seqno = gen6_ring_get_seqno;
-               ring->set_seqno = ring_set_seqno;
+                       engine->write_tail = gen6_bsd_ring_write_tail;
+               engine->flush = gen6_bsd_ring_flush;
+               engine->add_request = gen6_add_request;
+               engine->irq_seqno_barrier = gen6_seqno_barrier;
+               engine->get_seqno = ring_get_seqno;
+               engine->set_seqno = ring_set_seqno;
                if (INTEL_INFO(dev)->gen >= 8) {
-                       ring->irq_enable_mask =
+                       engine->irq_enable_mask =
                                GT_RENDER_USER_INTERRUPT << GEN8_VCS1_IRQ_SHIFT;
-                       ring->irq_get = gen8_ring_get_irq;
-                       ring->irq_put = gen8_ring_put_irq;
-                       ring->dispatch_execbuffer =
+                       engine->irq_get = gen8_ring_get_irq;
+                       engine->irq_put = gen8_ring_put_irq;
+                       engine->dispatch_execbuffer =
                                gen8_ring_dispatch_execbuffer;
                        if (i915_semaphore_is_enabled(dev)) {
-                               ring->semaphore.sync_to = gen8_ring_sync;
-                               ring->semaphore.signal = gen8_xcs_signal;
-                               GEN8_RING_SEMAPHORE_INIT;
+                               engine->semaphore.sync_to = gen8_ring_sync;
+                               engine->semaphore.signal = gen8_xcs_signal;
+                               GEN8_RING_SEMAPHORE_INIT(engine);
                        }
                } else {
-                       ring->irq_enable_mask = GT_BSD_USER_INTERRUPT;
-                       ring->irq_get = gen6_ring_get_irq;
-                       ring->irq_put = gen6_ring_put_irq;
-                       ring->dispatch_execbuffer =
+                       engine->irq_enable_mask = GT_BSD_USER_INTERRUPT;
+                       engine->irq_get = gen6_ring_get_irq;
+                       engine->irq_put = gen6_ring_put_irq;
+                       engine->dispatch_execbuffer =
                                gen6_ring_dispatch_execbuffer;
                        if (i915_semaphore_is_enabled(dev)) {
-                               ring->semaphore.sync_to = gen6_ring_sync;
-                               ring->semaphore.signal = gen6_signal;
-                               ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
-                               ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
-                               ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
-                               ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
-                               ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-                               ring->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
-                               ring->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
-                               ring->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
-                               ring->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
-                               ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+                               engine->semaphore.sync_to = gen6_ring_sync;
+                               engine->semaphore.signal = gen6_signal;
+                               engine->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VR;
+                               engine->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_INVALID;
+                               engine->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VB;
+                               engine->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_VVE;
+                               engine->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                               engine->semaphore.mbox.signal[RCS] = GEN6_RVSYNC;
+                               engine->semaphore.mbox.signal[VCS] = GEN6_NOSYNC;
+                               engine->semaphore.mbox.signal[BCS] = GEN6_BVSYNC;
+                               engine->semaphore.mbox.signal[VECS] = GEN6_VEVSYNC;
+                               engine->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
                        }
                }
        } else {
-               ring->mmio_base = BSD_RING_BASE;
-               ring->flush = bsd_ring_flush;
-               ring->add_request = i9xx_add_request;
-               ring->get_seqno = ring_get_seqno;
-               ring->set_seqno = ring_set_seqno;
+               engine->mmio_base = BSD_RING_BASE;
+               engine->flush = bsd_ring_flush;
+               engine->add_request = i9xx_add_request;
+               engine->get_seqno = ring_get_seqno;
+               engine->set_seqno = ring_set_seqno;
                if (IS_GEN5(dev)) {
-                       ring->irq_enable_mask = ILK_BSD_USER_INTERRUPT;
-                       ring->irq_get = gen5_ring_get_irq;
-                       ring->irq_put = gen5_ring_put_irq;
+                       engine->irq_enable_mask = ILK_BSD_USER_INTERRUPT;
+                       engine->irq_get = gen5_ring_get_irq;
+                       engine->irq_put = gen5_ring_put_irq;
                } else {
-                       ring->irq_enable_mask = I915_BSD_USER_INTERRUPT;
-                       ring->irq_get = i9xx_ring_get_irq;
-                       ring->irq_put = i9xx_ring_put_irq;
+                       engine->irq_enable_mask = I915_BSD_USER_INTERRUPT;
+                       engine->irq_get = i9xx_ring_get_irq;
+                       engine->irq_put = i9xx_ring_put_irq;
                }
-               ring->dispatch_execbuffer = i965_dispatch_execbuffer;
+               engine->dispatch_execbuffer = i965_dispatch_execbuffer;
        }
-       ring->init_hw = init_ring_common;
+       engine->init_hw = init_ring_common;
 
-       return intel_init_ring_buffer(dev, ring);
+       return intel_init_ring_buffer(dev, engine);
 }
 
 /**
@@ -2973,68 +2996,70 @@ int intel_init_bsd_ring_buffer(struct drm_device *dev)
 int intel_init_bsd2_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VCS2];
-
-       ring->name = "bsd2 ring";
-       ring->id = VCS2;
-       ring->exec_id = I915_EXEC_BSD;
-
-       ring->write_tail = ring_write_tail;
-       ring->mmio_base = GEN8_BSD2_RING_BASE;
-       ring->flush = gen6_bsd_ring_flush;
-       ring->add_request = gen6_add_request;
-       ring->get_seqno = gen6_ring_get_seqno;
-       ring->set_seqno = ring_set_seqno;
-       ring->irq_enable_mask =
+       struct intel_engine_cs *engine = &dev_priv->engine[VCS2];
+
+       engine->name = "bsd2 ring";
+       engine->id = VCS2;
+       engine->exec_id = I915_EXEC_BSD;
+
+       engine->write_tail = ring_write_tail;
+       engine->mmio_base = GEN8_BSD2_RING_BASE;
+       engine->flush = gen6_bsd_ring_flush;
+       engine->add_request = gen6_add_request;
+       engine->irq_seqno_barrier = gen6_seqno_barrier;
+       engine->get_seqno = ring_get_seqno;
+       engine->set_seqno = ring_set_seqno;
+       engine->irq_enable_mask =
                        GT_RENDER_USER_INTERRUPT << GEN8_VCS2_IRQ_SHIFT;
-       ring->irq_get = gen8_ring_get_irq;
-       ring->irq_put = gen8_ring_put_irq;
-       ring->dispatch_execbuffer =
+       engine->irq_get = gen8_ring_get_irq;
+       engine->irq_put = gen8_ring_put_irq;
+       engine->dispatch_execbuffer =
                        gen8_ring_dispatch_execbuffer;
        if (i915_semaphore_is_enabled(dev)) {
-               ring->semaphore.sync_to = gen8_ring_sync;
-               ring->semaphore.signal = gen8_xcs_signal;
-               GEN8_RING_SEMAPHORE_INIT;
+               engine->semaphore.sync_to = gen8_ring_sync;
+               engine->semaphore.signal = gen8_xcs_signal;
+               GEN8_RING_SEMAPHORE_INIT(engine);
        }
-       ring->init_hw = init_ring_common;
+       engine->init_hw = init_ring_common;
 
-       return intel_init_ring_buffer(dev, ring);
+       return intel_init_ring_buffer(dev, engine);
 }
 
 int intel_init_blt_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[BCS];
-
-       ring->name = "blitter ring";
-       ring->id = BCS;
-       ring->exec_id = I915_EXEC_BLT;
-
-       ring->mmio_base = BLT_RING_BASE;
-       ring->write_tail = ring_write_tail;
-       ring->flush = gen6_ring_flush;
-       ring->add_request = gen6_add_request;
-       ring->get_seqno = gen6_ring_get_seqno;
-       ring->set_seqno = ring_set_seqno;
+       struct intel_engine_cs *engine = &dev_priv->engine[BCS];
+
+       engine->name = "blitter ring";
+       engine->id = BCS;
+       engine->exec_id = I915_EXEC_BLT;
+
+       engine->mmio_base = BLT_RING_BASE;
+       engine->write_tail = ring_write_tail;
+       engine->flush = gen6_ring_flush;
+       engine->add_request = gen6_add_request;
+       engine->irq_seqno_barrier = gen6_seqno_barrier;
+       engine->get_seqno = ring_get_seqno;
+       engine->set_seqno = ring_set_seqno;
        if (INTEL_INFO(dev)->gen >= 8) {
-               ring->irq_enable_mask =
+               engine->irq_enable_mask =
                        GT_RENDER_USER_INTERRUPT << GEN8_BCS_IRQ_SHIFT;
-               ring->irq_get = gen8_ring_get_irq;
-               ring->irq_put = gen8_ring_put_irq;
-               ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
+               engine->irq_get = gen8_ring_get_irq;
+               engine->irq_put = gen8_ring_put_irq;
+               engine->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
                if (i915_semaphore_is_enabled(dev)) {
-                       ring->semaphore.sync_to = gen8_ring_sync;
-                       ring->semaphore.signal = gen8_xcs_signal;
-                       GEN8_RING_SEMAPHORE_INIT;
+                       engine->semaphore.sync_to = gen8_ring_sync;
+                       engine->semaphore.signal = gen8_xcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT(engine);
                }
        } else {
-               ring->irq_enable_mask = GT_BLT_USER_INTERRUPT;
-               ring->irq_get = gen6_ring_get_irq;
-               ring->irq_put = gen6_ring_put_irq;
-               ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
+               engine->irq_enable_mask = GT_BLT_USER_INTERRUPT;
+               engine->irq_get = gen6_ring_get_irq;
+               engine->irq_put = gen6_ring_put_irq;
+               engine->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
                if (i915_semaphore_is_enabled(dev)) {
-                       ring->semaphore.signal = gen6_signal;
-                       ring->semaphore.sync_to = gen6_ring_sync;
+                       engine->semaphore.signal = gen6_signal;
+                       engine->semaphore.sync_to = gen6_ring_sync;
                        /*
                         * The current semaphore is only applied on pre-gen8
                         * platform.  And there is no VCS2 ring on the pre-gen8
@@ -3042,127 +3067,128 @@ int intel_init_blt_ring_buffer(struct drm_device *dev)
                         * initialized as INVALID.  Gen8 will initialize the
                         * sema between BCS and VCS2 later.
                         */
-                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
-                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
-                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
-                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
-                       ring->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
-                       ring->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
-                       ring->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
-                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+                       engine->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_BR;
+                       engine->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_BV;
+                       engine->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_BVE;
+                       engine->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.signal[RCS] = GEN6_RBSYNC;
+                       engine->semaphore.mbox.signal[VCS] = GEN6_VBSYNC;
+                       engine->semaphore.mbox.signal[BCS] = GEN6_NOSYNC;
+                       engine->semaphore.mbox.signal[VECS] = GEN6_VEBSYNC;
+                       engine->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
                }
        }
-       ring->init_hw = init_ring_common;
+       engine->init_hw = init_ring_common;
 
-       return intel_init_ring_buffer(dev, ring);
+       return intel_init_ring_buffer(dev, engine);
 }
 
 int intel_init_vebox_ring_buffer(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_engine_cs *ring = &dev_priv->ring[VECS];
+       struct intel_engine_cs *engine = &dev_priv->engine[VECS];
 
-       ring->name = "video enhancement ring";
-       ring->id = VECS;
-       ring->exec_id = I915_EXEC_VEBOX;
+       engine->name = "video enhancement ring";
+       engine->id = VECS;
+       engine->exec_id = I915_EXEC_VEBOX;
 
-       ring->mmio_base = VEBOX_RING_BASE;
-       ring->write_tail = ring_write_tail;
-       ring->flush = gen6_ring_flush;
-       ring->add_request = gen6_add_request;
-       ring->get_seqno = gen6_ring_get_seqno;
-       ring->set_seqno = ring_set_seqno;
+       engine->mmio_base = VEBOX_RING_BASE;
+       engine->write_tail = ring_write_tail;
+       engine->flush = gen6_ring_flush;
+       engine->add_request = gen6_add_request;
+       engine->irq_seqno_barrier = gen6_seqno_barrier;
+       engine->get_seqno = ring_get_seqno;
+       engine->set_seqno = ring_set_seqno;
 
        if (INTEL_INFO(dev)->gen >= 8) {
-               ring->irq_enable_mask =
+               engine->irq_enable_mask =
                        GT_RENDER_USER_INTERRUPT << GEN8_VECS_IRQ_SHIFT;
-               ring->irq_get = gen8_ring_get_irq;
-               ring->irq_put = gen8_ring_put_irq;
-               ring->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
+               engine->irq_get = gen8_ring_get_irq;
+               engine->irq_put = gen8_ring_put_irq;
+               engine->dispatch_execbuffer = gen8_ring_dispatch_execbuffer;
                if (i915_semaphore_is_enabled(dev)) {
-                       ring->semaphore.sync_to = gen8_ring_sync;
-                       ring->semaphore.signal = gen8_xcs_signal;
-                       GEN8_RING_SEMAPHORE_INIT;
+                       engine->semaphore.sync_to = gen8_ring_sync;
+                       engine->semaphore.signal = gen8_xcs_signal;
+                       GEN8_RING_SEMAPHORE_INIT(engine);
                }
        } else {
-               ring->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
-               ring->irq_get = hsw_vebox_get_irq;
-               ring->irq_put = hsw_vebox_put_irq;
-               ring->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
+               engine->irq_enable_mask = PM_VEBOX_USER_INTERRUPT;
+               engine->irq_get = hsw_vebox_get_irq;
+               engine->irq_put = hsw_vebox_put_irq;
+               engine->dispatch_execbuffer = gen6_ring_dispatch_execbuffer;
                if (i915_semaphore_is_enabled(dev)) {
-                       ring->semaphore.sync_to = gen6_ring_sync;
-                       ring->semaphore.signal = gen6_signal;
-                       ring->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
-                       ring->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
-                       ring->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
-                       ring->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
-                       ring->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
-                       ring->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
-                       ring->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
-                       ring->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
-                       ring->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
+                       engine->semaphore.sync_to = gen6_ring_sync;
+                       engine->semaphore.signal = gen6_signal;
+                       engine->semaphore.mbox.wait[RCS] = MI_SEMAPHORE_SYNC_VER;
+                       engine->semaphore.mbox.wait[VCS] = MI_SEMAPHORE_SYNC_VEV;
+                       engine->semaphore.mbox.wait[BCS] = MI_SEMAPHORE_SYNC_VEB;
+                       engine->semaphore.mbox.wait[VECS] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.wait[VCS2] = MI_SEMAPHORE_SYNC_INVALID;
+                       engine->semaphore.mbox.signal[RCS] = GEN6_RVESYNC;
+                       engine->semaphore.mbox.signal[VCS] = GEN6_VVESYNC;
+                       engine->semaphore.mbox.signal[BCS] = GEN6_BVESYNC;
+                       engine->semaphore.mbox.signal[VECS] = GEN6_NOSYNC;
+                       engine->semaphore.mbox.signal[VCS2] = GEN6_NOSYNC;
                }
        }
-       ring->init_hw = init_ring_common;
+       engine->init_hw = init_ring_common;
 
-       return intel_init_ring_buffer(dev, ring);
+       return intel_init_ring_buffer(dev, engine);
 }
 
 int
 intel_ring_flush_all_caches(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        int ret;
 
-       if (!ring->gpu_caches_dirty)
+       if (!engine->gpu_caches_dirty)
                return 0;
 
-       ret = ring->flush(req, 0, I915_GEM_GPU_DOMAINS);
+       ret = engine->flush(req, 0, I915_GEM_GPU_DOMAINS);
        if (ret)
                return ret;
 
        trace_i915_gem_ring_flush(req, 0, I915_GEM_GPU_DOMAINS);
 
-       ring->gpu_caches_dirty = false;
+       engine->gpu_caches_dirty = false;
        return 0;
 }
 
 int
 intel_ring_invalidate_all_caches(struct drm_i915_gem_request *req)
 {
-       struct intel_engine_cs *ring = req->ring;
+       struct intel_engine_cs *engine = req->engine;
        uint32_t flush_domains;
        int ret;
 
        flush_domains = 0;
-       if (ring->gpu_caches_dirty)
+       if (engine->gpu_caches_dirty)
                flush_domains = I915_GEM_GPU_DOMAINS;
 
-       ret = ring->flush(req, I915_GEM_GPU_DOMAINS, flush_domains);
+       ret = engine->flush(req, I915_GEM_GPU_DOMAINS, flush_domains);
        if (ret)
                return ret;
 
        trace_i915_gem_ring_flush(req, I915_GEM_GPU_DOMAINS, flush_domains);
 
-       ring->gpu_caches_dirty = false;
+       engine->gpu_caches_dirty = false;
        return 0;
 }
 
 void
-intel_stop_ring_buffer(struct intel_engine_cs *ring)
+intel_stop_engine(struct intel_engine_cs *engine)
 {
        int ret;
 
-       if (!intel_ring_initialized(ring))
+       if (!intel_engine_initialized(engine))
                return;
 
-       ret = intel_ring_idle(ring);
-       if (ret && !i915_reset_in_progress(&to_i915(ring->dev)->gpu_error))
+       ret = intel_engine_idle(engine);
+       if (ret)
                DRM_ERROR("failed to quiesce %s whilst cleaning up: %d\n",
-                         ring->name, ret);
+                         engine->name, ret);
 
-       stop_ring(ring);
+       stop_ring(engine);
 }
index 566b0ae10ce00f6a3eec840734c0c26c30aef27e..2ade194bbea92d9208674ce52763a8f71a5d0b7f 100644 (file)
@@ -52,34 +52,32 @@ struct  intel_hw_status_page {
 /* seqno size is actually only a uint32, but since we plan to use MI_FLUSH_DW to
  * do the writes, and that must have qw aligned offsets, simply pretend it's 8b.
  */
-#define i915_semaphore_seqno_size sizeof(uint64_t)
+#define gen8_semaphore_seqno_size sizeof(uint64_t)
+#define GEN8_SEMAPHORE_OFFSET(__from, __to)                         \
+       (((__from) * I915_NUM_ENGINES  + (__to)) * gen8_semaphore_seqno_size)
 #define GEN8_SIGNAL_OFFSET(__ring, to)                      \
        (i915_gem_obj_ggtt_offset(dev_priv->semaphore_obj) + \
-       ((__ring)->id * I915_NUM_RINGS * i915_semaphore_seqno_size) +   \
-       (i915_semaphore_seqno_size * (to)))
-
+        GEN8_SEMAPHORE_OFFSET((__ring)->id, (to)))
 #define GEN8_WAIT_OFFSET(__ring, from)                      \
        (i915_gem_obj_ggtt_offset(dev_priv->semaphore_obj) + \
-       ((from) * I915_NUM_RINGS * i915_semaphore_seqno_size) + \
-       (i915_semaphore_seqno_size * (__ring)->id))
+        GEN8_SEMAPHORE_OFFSET(from, (__ring)->id))
 
-#define GEN8_RING_SEMAPHORE_INIT do { \
+#define GEN8_RING_SEMAPHORE_INIT(e) do { \
        if (!dev_priv->semaphore_obj) { \
                break; \
        } \
-       ring->semaphore.signal_ggtt[RCS] = GEN8_SIGNAL_OFFSET(ring, RCS); \
-       ring->semaphore.signal_ggtt[VCS] = GEN8_SIGNAL_OFFSET(ring, VCS); \
-       ring->semaphore.signal_ggtt[BCS] = GEN8_SIGNAL_OFFSET(ring, BCS); \
-       ring->semaphore.signal_ggtt[VECS] = GEN8_SIGNAL_OFFSET(ring, VECS); \
-       ring->semaphore.signal_ggtt[VCS2] = GEN8_SIGNAL_OFFSET(ring, VCS2); \
-       ring->semaphore.signal_ggtt[ring->id] = MI_SEMAPHORE_SYNC_INVALID; \
+       (e)->semaphore.signal_ggtt[RCS] = GEN8_SIGNAL_OFFSET((e), RCS); \
+       (e)->semaphore.signal_ggtt[VCS] = GEN8_SIGNAL_OFFSET((e), VCS); \
+       (e)->semaphore.signal_ggtt[BCS] = GEN8_SIGNAL_OFFSET((e), BCS); \
+       (e)->semaphore.signal_ggtt[VECS] = GEN8_SIGNAL_OFFSET((e), VECS); \
+       (e)->semaphore.signal_ggtt[VCS2] = GEN8_SIGNAL_OFFSET((e), VCS2); \
+       (e)->semaphore.signal_ggtt[(e)->id] = MI_SEMAPHORE_SYNC_INVALID; \
        } while(0)
 
 enum intel_ring_hangcheck_action {
        HANGCHECK_IDLE = 0,
        HANGCHECK_WAIT,
        HANGCHECK_ACTIVE,
-       HANGCHECK_ACTIVE_LOOP,
        HANGCHECK_KICK,
        HANGCHECK_HUNG,
 };
@@ -88,8 +86,8 @@ enum intel_ring_hangcheck_action {
 
 struct intel_ring_hangcheck {
        u64 acthd;
-       u64 max_acthd;
        u32 seqno;
+       unsigned user_interrupts;
        int score;
        enum intel_ring_hangcheck_action action;
        int deadlock;
@@ -101,7 +99,7 @@ struct intel_ringbuffer {
        void __iomem *virtual_start;
        struct i915_vma *vma;
 
-       struct intel_engine_cs *ring;
+       struct intel_engine_cs *engine;
        struct list_head link;
 
        u32 head;
@@ -125,7 +123,7 @@ struct intel_ringbuffer {
 };
 
 struct intel_context;
-struct drm_i915_reg_descriptor;
+struct drm_i915_reg_table;
 
 /*
  * we use a single page to load ctx workarounds so all of these
@@ -148,14 +146,14 @@ struct  i915_ctx_workarounds {
 
 struct  intel_engine_cs {
        const char      *name;
-       enum intel_ring_id {
+       enum intel_engine_id {
                RCS = 0,
                BCS,
                VCS,
                VCS2,   /* Keep instances of the same type engine together. */
                VECS
        } id;
-#define I915_NUM_RINGS 5
+#define I915_NUM_ENGINES 5
 #define _VCS(n) (VCS + (n))
        unsigned int exec_id;
        unsigned int guc_id;
@@ -196,8 +194,8 @@ struct  intel_engine_cs {
         * seen value is good enough. Note that the seqno will always be
         * monotonic, even if not coherent.
         */
-       u32             (*get_seqno)(struct intel_engine_cs *ring,
-                                    bool lazy_coherency);
+       void            (*irq_seqno_barrier)(struct intel_engine_cs *ring);
+       u32             (*get_seqno)(struct intel_engine_cs *ring);
        void            (*set_seqno)(struct intel_engine_cs *ring,
                                     u32 seqno);
        int             (*dispatch_execbuffer)(struct drm_i915_gem_request *req,
@@ -246,16 +244,16 @@ struct  intel_engine_cs {
         *  ie. transpose of f(x, y)
         */
        struct {
-               u32     sync_seqno[I915_NUM_RINGS-1];
+               u32     sync_seqno[I915_NUM_ENGINES-1];
 
                union {
                        struct {
                                /* our mbox written by others */
-                               u32             wait[I915_NUM_RINGS];
+                               u32             wait[I915_NUM_ENGINES];
                                /* mboxes this ring signals to */
-                               i915_reg_t      signal[I915_NUM_RINGS];
+                               i915_reg_t      signal[I915_NUM_ENGINES];
                        } mbox;
-                       u64             signal_ggtt[I915_NUM_RINGS];
+                       u64             signal_ggtt[I915_NUM_ENGINES];
                };
 
                /* AKA wait() */
@@ -268,10 +266,13 @@ struct  intel_engine_cs {
        } semaphore;
 
        /* Execlists */
-       spinlock_t execlist_lock;
+       struct tasklet_struct irq_tasklet;
+       spinlock_t execlist_lock; /* used inside tasklet, use spin_lock_bh */
        struct list_head execlist_queue;
        struct list_head execlist_retired_req_list;
-       u8 next_context_status_buffer;
+       unsigned int fw_domains;
+       unsigned int next_context_status_buffer;
+       unsigned int idle_lite_restore_wa;
        bool disable_lite_restore_wa;
        u32 ctx_desc_template;
        u32             irq_keep_mask; /* bitmask for interrupts that should not be masked */
@@ -306,6 +307,7 @@ struct  intel_engine_cs {
         * inspecting request list.
         */
        u32 last_submitted_seqno;
+       unsigned user_interrupts;
 
        bool gpu_caches_dirty;
 
@@ -332,15 +334,8 @@ struct  intel_engine_cs {
        /*
         * Table of registers allowed in commands that read/write registers.
         */
-       const struct drm_i915_reg_descriptor *reg_table;
-       int reg_count;
-
-       /*
-        * Table of registers allowed in commands that read/write registers, but
-        * only from the DRM master.
-        */
-       const struct drm_i915_reg_descriptor *master_reg_table;
-       int master_reg_count;
+       const struct drm_i915_reg_table *reg_tables;
+       int reg_table_count;
 
        /*
         * Returns the bitmask for the length field of the specified command.
@@ -356,19 +351,19 @@ struct  intel_engine_cs {
 };
 
 static inline bool
-intel_ring_initialized(struct intel_engine_cs *ring)
+intel_engine_initialized(struct intel_engine_cs *engine)
 {
-       return ring->dev != NULL;
+       return engine->dev != NULL;
 }
 
 static inline unsigned
-intel_ring_flag(struct intel_engine_cs *ring)
+intel_engine_flag(struct intel_engine_cs *engine)
 {
-       return 1 << ring->id;
+       return 1 << engine->id;
 }
 
 static inline u32
-intel_ring_sync_index(struct intel_engine_cs *ring,
+intel_ring_sync_index(struct intel_engine_cs *engine,
                      struct intel_engine_cs *other)
 {
        int idx;
@@ -381,34 +376,33 @@ intel_ring_sync_index(struct intel_engine_cs *ring,
         * vcs2 -> 0 = rcs, 1 = vcs, 2 = bcs, 3 = vecs;
         */
 
-       idx = (other - ring) - 1;
+       idx = (other - engine) - 1;
        if (idx < 0)
-               idx += I915_NUM_RINGS;
+               idx += I915_NUM_ENGINES;
 
        return idx;
 }
 
 static inline void
-intel_flush_status_page(struct intel_engine_cs *ring, int reg)
+intel_flush_status_page(struct intel_engine_cs *engine, int reg)
 {
-       drm_clflush_virt_range(&ring->status_page.page_addr[reg],
-                              sizeof(uint32_t));
+       mb();
+       clflush(&engine->status_page.page_addr[reg]);
+       mb();
 }
 
 static inline u32
-intel_read_status_page(struct intel_engine_cs *ring,
-                      int reg)
+intel_read_status_page(struct intel_engine_cs *engine, int reg)
 {
        /* Ensure that the compiler doesn't optimize away the load. */
-       barrier();
-       return ring->status_page.page_addr[reg];
+       return READ_ONCE(engine->status_page.page_addr[reg]);
 }
 
 static inline void
-intel_write_status_page(struct intel_engine_cs *ring,
+intel_write_status_page(struct intel_engine_cs *engine,
                        int reg, u32 value)
 {
-       ring->status_page.page_addr[reg] = value;
+       engine->status_page.page_addr[reg] = value;
 }
 
 /*
@@ -439,42 +433,42 @@ int intel_pin_and_map_ringbuffer_obj(struct drm_device *dev,
 void intel_unpin_ringbuffer_obj(struct intel_ringbuffer *ringbuf);
 void intel_ringbuffer_free(struct intel_ringbuffer *ring);
 
-void intel_stop_ring_buffer(struct intel_engine_cs *ring);
-void intel_cleanup_ring_buffer(struct intel_engine_cs *ring);
+void intel_stop_engine(struct intel_engine_cs *engine);
+void intel_cleanup_engine(struct intel_engine_cs *engine);
 
 int intel_ring_alloc_request_extras(struct drm_i915_gem_request *request);
 
 int __must_check intel_ring_begin(struct drm_i915_gem_request *req, int n);
 int __must_check intel_ring_cacheline_align(struct drm_i915_gem_request *req);
-static inline void intel_ring_emit(struct intel_engine_cs *ring,
+static inline void intel_ring_emit(struct intel_engine_cs *engine,
                                   u32 data)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
        ringbuf->tail += 4;
 }
-static inline void intel_ring_emit_reg(struct intel_engine_cs *ring,
+static inline void intel_ring_emit_reg(struct intel_engine_cs *engine,
                                       i915_reg_t reg)
 {
-       intel_ring_emit(ring, i915_mmio_reg_offset(reg));
+       intel_ring_emit(engine, i915_mmio_reg_offset(reg));
 }
-static inline void intel_ring_advance(struct intel_engine_cs *ring)
+static inline void intel_ring_advance(struct intel_engine_cs *engine)
 {
-       struct intel_ringbuffer *ringbuf = ring->buffer;
+       struct intel_ringbuffer *ringbuf = engine->buffer;
        ringbuf->tail &= ringbuf->size - 1;
 }
 int __intel_ring_space(int head, int tail, int size);
 void intel_ring_update_space(struct intel_ringbuffer *ringbuf);
 int intel_ring_space(struct intel_ringbuffer *ringbuf);
-bool intel_ring_stopped(struct intel_engine_cs *ring);
+bool intel_engine_stopped(struct intel_engine_cs *engine);
 
-int __must_check intel_ring_idle(struct intel_engine_cs *ring);
-void intel_ring_init_seqno(struct intel_engine_cs *ring, u32 seqno);
+int __must_check intel_engine_idle(struct intel_engine_cs *engine);
+void intel_ring_init_seqno(struct intel_engine_cs *engine, u32 seqno);
 int intel_ring_flush_all_caches(struct drm_i915_gem_request *req);
 int intel_ring_invalidate_all_caches(struct drm_i915_gem_request *req);
 
-void intel_fini_pipe_control(struct intel_engine_cs *ring);
-int intel_init_pipe_control(struct intel_engine_cs *ring);
+void intel_fini_pipe_control(struct intel_engine_cs *engine);
+int intel_init_pipe_control(struct intel_engine_cs *engine);
 
 int intel_init_render_ring_buffer(struct drm_device *dev);
 int intel_init_bsd_ring_buffer(struct drm_device *dev);
@@ -482,9 +476,9 @@ int intel_init_bsd2_ring_buffer(struct drm_device *dev);
 int intel_init_blt_ring_buffer(struct drm_device *dev);
 int intel_init_vebox_ring_buffer(struct drm_device *dev);
 
-u64 intel_ring_get_active_head(struct intel_engine_cs *ring);
+u64 intel_ring_get_active_head(struct intel_engine_cs *engine);
 
-int init_workarounds_ring(struct intel_engine_cs *ring);
+int init_workarounds_ring(struct intel_engine_cs *engine);
 
 static inline u32 intel_ring_get_tail(struct intel_ringbuffer *ringbuf)
 {
index 6e54d978d9d48d79a0d1cd830403e5f0c17c97b7..7fb1da4e7fc349dfdfe26bb32dd7e97192b2ec04 100644 (file)
@@ -89,6 +89,10 @@ intel_display_power_domain_str(enum intel_display_power_domain domain)
                return "TRANSCODER_C";
        case POWER_DOMAIN_TRANSCODER_EDP:
                return "TRANSCODER_EDP";
+       case POWER_DOMAIN_TRANSCODER_DSI_A:
+               return "TRANSCODER_DSI_A";
+       case POWER_DOMAIN_TRANSCODER_DSI_C:
+               return "TRANSCODER_DSI_C";
        case POWER_DOMAIN_PORT_DDI_A_LANES:
                return "PORT_DDI_A_LANES";
        case POWER_DOMAIN_PORT_DDI_B_LANES:
@@ -393,11 +397,6 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
        BIT(POWER_DOMAIN_MODESET) |                     \
        BIT(POWER_DOMAIN_AUX_A) |                       \
        BIT(POWER_DOMAIN_INIT))
-#define SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS (          \
-       (POWER_DOMAIN_MASK & ~(                         \
-       SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS |         \
-       SKL_DISPLAY_DC_OFF_POWER_DOMAINS)) |            \
-       BIT(POWER_DOMAIN_INIT))
 
 #define BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS (                \
        BIT(POWER_DOMAIN_TRANSCODER_A) |                \
@@ -415,36 +414,21 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
        BIT(POWER_DOMAIN_VGA) |                         \
        BIT(POWER_DOMAIN_GMBUS) |                       \
        BIT(POWER_DOMAIN_INIT))
-#define BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS (                \
-       BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS |         \
-       BIT(POWER_DOMAIN_PIPE_A) |                      \
-       BIT(POWER_DOMAIN_TRANSCODER_EDP) |              \
-       BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) |         \
-       BIT(POWER_DOMAIN_PORT_DDI_A_LANES) |            \
-       BIT(POWER_DOMAIN_AUX_A) |                       \
-       BIT(POWER_DOMAIN_PLLS) |                        \
-       BIT(POWER_DOMAIN_INIT))
 #define BXT_DISPLAY_DC_OFF_POWER_DOMAINS (             \
        BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS |         \
        BIT(POWER_DOMAIN_MODESET) |                     \
        BIT(POWER_DOMAIN_AUX_A) |                       \
        BIT(POWER_DOMAIN_INIT))
-#define BXT_DISPLAY_ALWAYS_ON_POWER_DOMAINS (          \
-       (POWER_DOMAIN_MASK & ~(BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS |  \
-       BXT_DISPLAY_POWERWELL_2_POWER_DOMAINS)) |       \
-       BIT(POWER_DOMAIN_INIT))
 
 static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
-
-       WARN(!IS_BROXTON(dev), "Platform doesn't support DC9.\n");
-       WARN((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9),
-               "DC9 already programmed to be enabled.\n");
-       WARN(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,
-               "DC5 still not disabled to enable DC9.\n");
-       WARN(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on.\n");
-       WARN(intel_irqs_enabled(dev_priv), "Interrupts not disabled yet.\n");
+       WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9),
+                 "DC9 already programmed to be enabled.\n");
+       WARN_ONCE(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,
+                 "DC5 still not disabled to enable DC9.\n");
+       WARN_ONCE(I915_READ(HSW_PWR_WELL_DRIVER), "Power well on.\n");
+       WARN_ONCE(intel_irqs_enabled(dev_priv),
+                 "Interrupts not disabled yet.\n");
 
         /*
          * TODO: check for the following to verify the conditions to enter DC9
@@ -457,11 +441,10 @@ static void assert_can_enable_dc9(struct drm_i915_private *dev_priv)
 
 static void assert_can_disable_dc9(struct drm_i915_private *dev_priv)
 {
-       WARN(intel_irqs_enabled(dev_priv), "Interrupts not disabled yet.\n");
-       WARN(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_DC9),
-               "DC9 already programmed to be disabled.\n");
-       WARN(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,
-               "DC5 still not disabled.\n");
+       WARN_ONCE(intel_irqs_enabled(dev_priv),
+                 "Interrupts not disabled yet.\n");
+       WARN_ONCE(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5,
+                 "DC5 still not disabled.\n");
 
         /*
          * TODO: check for the following to verify DC9 state was indeed
@@ -472,24 +455,6 @@ static void assert_can_disable_dc9(struct drm_i915_private *dev_priv)
          */
 }
 
-static void gen9_set_dc_state_debugmask(struct drm_i915_private *dev_priv)
-{
-       uint32_t val, mask;
-
-       mask = DC_STATE_DEBUG_MASK_MEMORY_UP;
-
-       if (IS_BROXTON(dev_priv))
-               mask |= DC_STATE_DEBUG_MASK_CORES;
-
-       /* The below bit doesn't need to be cleared ever afterwards */
-       val = I915_READ(DC_STATE_DEBUG);
-       if ((val & mask) != mask) {
-               val |= mask;
-               I915_WRITE(DC_STATE_DEBUG, val);
-               POSTING_READ(DC_STATE_DEBUG);
-       }
-}
-
 static void gen9_write_dc_state(struct drm_i915_private *dev_priv,
                                u32 state)
 {
@@ -527,10 +492,9 @@ static void gen9_write_dc_state(struct drm_i915_private *dev_priv,
                              state, rewrites);
 }
 
-static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
+static u32 gen9_dc_mask(struct drm_i915_private *dev_priv)
 {
-       uint32_t val;
-       uint32_t mask;
+       u32 mask;
 
        mask = DC_STATE_EN_UPTO_DC5;
        if (IS_BROXTON(dev_priv))
@@ -538,14 +502,30 @@ static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
        else
                mask |= DC_STATE_EN_UPTO_DC6;
 
-       WARN_ON_ONCE(state & ~mask);
+       return mask;
+}
+
+void gen9_sanitize_dc_state(struct drm_i915_private *dev_priv)
+{
+       u32 val;
 
-       if (i915.enable_dc == 0)
-               state = DC_STATE_DISABLE;
-       else if (i915.enable_dc == 1 && state > DC_STATE_EN_UPTO_DC5)
-               state = DC_STATE_EN_UPTO_DC5;
+       val = I915_READ(DC_STATE_EN) & gen9_dc_mask(dev_priv);
+
+       DRM_DEBUG_KMS("Resetting DC state tracking from %02x to %02x\n",
+                     dev_priv->csr.dc_state, val);
+       dev_priv->csr.dc_state = val;
+}
+
+static void gen9_set_dc_state(struct drm_i915_private *dev_priv, uint32_t state)
+{
+       uint32_t val;
+       uint32_t mask;
+
+       if (WARN_ON_ONCE(state & ~dev_priv->csr.allowed_dc_mask))
+               state &= dev_priv->csr.allowed_dc_mask;
 
        val = I915_READ(DC_STATE_EN);
+       mask = gen9_dc_mask(dev_priv);
        DRM_DEBUG_KMS("Setting DC state from %02x to %02x\n",
                      val & mask, state);
 
@@ -590,13 +570,9 @@ static void assert_csr_loaded(struct drm_i915_private *dev_priv)
 
 static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
        bool pg2_enabled = intel_display_power_well_is_enabled(dev_priv,
                                        SKL_DISP_PW_2);
 
-       WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev),
-                 "Platform doesn't support DC5.\n");
-       WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n");
        WARN_ONCE(pg2_enabled, "PG2 not disabled to enable DC5.\n");
 
        WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC5),
@@ -606,19 +582,7 @@ static void assert_can_enable_dc5(struct drm_i915_private *dev_priv)
        assert_csr_loaded(dev_priv);
 }
 
-static void assert_can_disable_dc5(struct drm_i915_private *dev_priv)
-{
-       /*
-        * During initialization, the firmware may not be loaded yet.
-        * We still want to make sure that the DC enabling flag is cleared.
-        */
-       if (dev_priv->power_domains.initializing)
-               return;
-
-       assert_rpm_wakelock_held(dev_priv);
-}
-
-static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
+void gen9_enable_dc5(struct drm_i915_private *dev_priv)
 {
        assert_can_enable_dc5(dev_priv);
 
@@ -629,11 +593,6 @@ static void gen9_enable_dc5(struct drm_i915_private *dev_priv)
 
 static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
 {
-       struct drm_device *dev = dev_priv->dev;
-
-       WARN_ONCE(!IS_SKYLAKE(dev) && !IS_KABYLAKE(dev),
-                 "Platform doesn't support DC6.\n");
-       WARN_ONCE(!HAS_RUNTIME_PM(dev), "Runtime PM not enabled.\n");
        WARN_ONCE(I915_READ(UTIL_PIN_CTL) & UTIL_PIN_ENABLE,
                  "Backlight is not disabled.\n");
        WARN_ONCE((I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
@@ -642,47 +601,60 @@ static void assert_can_enable_dc6(struct drm_i915_private *dev_priv)
        assert_csr_loaded(dev_priv);
 }
 
-static void assert_can_disable_dc6(struct drm_i915_private *dev_priv)
+void skl_enable_dc6(struct drm_i915_private *dev_priv)
 {
-       /*
-        * During initialization, the firmware may not be loaded yet.
-        * We still want to make sure that the DC enabling flag is cleared.
-        */
-       if (dev_priv->power_domains.initializing)
-               return;
+       assert_can_enable_dc6(dev_priv);
+
+       DRM_DEBUG_KMS("Enabling DC6\n");
+
+       gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
 
-       WARN_ONCE(!(I915_READ(DC_STATE_EN) & DC_STATE_EN_UPTO_DC6),
-                 "DC6 already programmed to be disabled.\n");
 }
 
-static void gen9_disable_dc5_dc6(struct drm_i915_private *dev_priv)
+void skl_disable_dc6(struct drm_i915_private *dev_priv)
 {
-       assert_can_disable_dc5(dev_priv);
-
-       if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
-           i915.enable_dc != 0 && i915.enable_dc != 1)
-               assert_can_disable_dc6(dev_priv);
+       DRM_DEBUG_KMS("Disabling DC6\n");
 
        gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
 }
 
-void skl_enable_dc6(struct drm_i915_private *dev_priv)
+static void
+gen9_sanitize_power_well_requests(struct drm_i915_private *dev_priv,
+                                 struct i915_power_well *power_well)
 {
-       assert_can_enable_dc6(dev_priv);
+       enum skl_disp_power_wells power_well_id = power_well->data;
+       u32 val;
+       u32 mask;
 
-       DRM_DEBUG_KMS("Enabling DC6\n");
+       mask = SKL_POWER_WELL_REQ(power_well_id);
 
-       gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
+       val = I915_READ(HSW_PWR_WELL_KVMR);
+       if (WARN_ONCE(val & mask, "Clearing unexpected KVMR request for %s\n",
+                     power_well->name))
+               I915_WRITE(HSW_PWR_WELL_KVMR, val & ~mask);
 
-}
+       val = I915_READ(HSW_PWR_WELL_BIOS);
+       val |= I915_READ(HSW_PWR_WELL_DEBUG);
 
-void skl_disable_dc6(struct drm_i915_private *dev_priv)
-{
-       assert_can_disable_dc6(dev_priv);
+       if (!(val & mask))
+               return;
 
-       DRM_DEBUG_KMS("Disabling DC6\n");
+       /*
+        * DMC is known to force on the request bits for power well 1 on SKL
+        * and BXT and the misc IO power well on SKL but we don't expect any
+        * other request bits to be set, so WARN for those.
+        */
+       if (power_well_id == SKL_DISP_PW_1 ||
+           ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
+            power_well_id == SKL_DISP_PW_MISC_IO))
+               DRM_DEBUG_DRIVER("Clearing auxiliary requests for %s forced on "
+                                "by DMC\n", power_well->name);
+       else
+               WARN_ONCE(1, "Clearing unexpected auxiliary requests for %s\n",
+                         power_well->name);
 
-       gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
+       I915_WRITE(HSW_PWR_WELL_BIOS, val & ~mask);
+       I915_WRITE(HSW_PWR_WELL_DEBUG, val & ~mask);
 }
 
 static void skl_set_power_well(struct drm_i915_private *dev_priv,
@@ -739,10 +711,6 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
 
                if (!is_enabled) {
                        DRM_DEBUG_KMS("Enabling %s\n", power_well->name);
-                       if (wait_for((I915_READ(HSW_PWR_WELL_DRIVER) &
-                               state_mask), 1))
-                               DRM_ERROR("%s enable timeout\n",
-                                       power_well->name);
                        check_fuse_status = true;
                }
        } else {
@@ -751,8 +719,16 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
                        POSTING_READ(HSW_PWR_WELL_DRIVER);
                        DRM_DEBUG_KMS("Disabling %s\n", power_well->name);
                }
+
+               if (IS_GEN9(dev_priv))
+                       gen9_sanitize_power_well_requests(dev_priv, power_well);
        }
 
+       if (wait_for(!!(I915_READ(HSW_PWR_WELL_DRIVER) & state_mask) == enable,
+                    1))
+               DRM_ERROR("%s %s timeout\n",
+                         power_well->name, enable ? "enable" : "disable");
+
        if (check_fuse_status) {
                if (power_well->data == SKL_DISP_PW_1) {
                        if (wait_for((I915_READ(SKL_FUSE_STATUS) &
@@ -833,32 +809,33 @@ static bool gen9_dc_off_power_well_enabled(struct drm_i915_private *dev_priv,
 static void gen9_dc_off_power_well_enable(struct drm_i915_private *dev_priv,
                                          struct i915_power_well *power_well)
 {
-       gen9_disable_dc5_dc6(dev_priv);
+       gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
+
+       if (IS_BROXTON(dev_priv)) {
+               broxton_cdclk_verify_state(dev_priv);
+               broxton_ddi_phy_verify_state(dev_priv);
+       }
 }
 
 static void gen9_dc_off_power_well_disable(struct drm_i915_private *dev_priv,
                                           struct i915_power_well *power_well)
 {
-       if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
-           i915.enable_dc != 0 && i915.enable_dc != 1)
+       if (!dev_priv->csr.dmc_payload)
+               return;
+
+       if (dev_priv->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC6)
                skl_enable_dc6(dev_priv);
-       else
+       else if (dev_priv->csr.allowed_dc_mask & DC_STATE_EN_UPTO_DC5)
                gen9_enable_dc5(dev_priv);
 }
 
 static void gen9_dc_off_power_well_sync_hw(struct drm_i915_private *dev_priv,
                                           struct i915_power_well *power_well)
 {
-       if (power_well->count > 0) {
-               gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
-       } else {
-               if ((IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) &&
-                   i915.enable_dc != 0 &&
-                   i915.enable_dc != 1)
-                       gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
-               else
-                       gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
-       }
+       if (power_well->count > 0)
+               gen9_dc_off_power_well_enable(dev_priv, power_well);
+       else
+               gen9_dc_off_power_well_disable(dev_priv, power_well);
 }
 
 static void i9xx_always_on_power_well_noop(struct drm_i915_private *dev_priv,
@@ -962,6 +939,17 @@ static bool vlv_power_well_enabled(struct drm_i915_private *dev_priv,
        return enabled;
 }
 
+static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
+{
+       I915_WRITE(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
+
+       /*
+        * Disable trickle feed and enable pnd deadline calculation
+        */
+       I915_WRITE(MI_ARB_VLV, MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE);
+       I915_WRITE(CBR1_VLV, 0);
+}
+
 static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
 {
        enum pipe pipe;
@@ -984,6 +972,8 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
                I915_WRITE(DPLL(pipe), val);
        }
 
+       vlv_init_display_clock_gating(dev_priv);
+
        spin_lock_irq(&dev_priv->irq_lock);
        valleyview_enable_display_irqs(dev_priv);
        spin_unlock_irq(&dev_priv->irq_lock);
@@ -1622,34 +1612,56 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
        intel_runtime_pm_put(dev_priv);
 }
 
-#define HSW_ALWAYS_ON_POWER_DOMAINS (                  \
-       BIT(POWER_DOMAIN_PIPE_A) |                      \
-       BIT(POWER_DOMAIN_TRANSCODER_EDP) |              \
-       BIT(POWER_DOMAIN_PORT_DDI_A_LANES) |            \
+#define HSW_DISPLAY_POWER_DOMAINS (                    \
+       BIT(POWER_DOMAIN_PIPE_B) |                      \
+       BIT(POWER_DOMAIN_PIPE_C) |                      \
+       BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) |         \
+       BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) |         \
+       BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) |         \
+       BIT(POWER_DOMAIN_TRANSCODER_A) |                \
+       BIT(POWER_DOMAIN_TRANSCODER_B) |                \
+       BIT(POWER_DOMAIN_TRANSCODER_C) |                \
        BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |            \
        BIT(POWER_DOMAIN_PORT_DDI_C_LANES) |            \
        BIT(POWER_DOMAIN_PORT_DDI_D_LANES) |            \
-       BIT(POWER_DOMAIN_PORT_CRT) |                    \
-       BIT(POWER_DOMAIN_PLLS) |                        \
-       BIT(POWER_DOMAIN_AUX_A) |                       \
-       BIT(POWER_DOMAIN_AUX_B) |                       \
-       BIT(POWER_DOMAIN_AUX_C) |                       \
-       BIT(POWER_DOMAIN_AUX_D) |                       \
-       BIT(POWER_DOMAIN_GMBUS) |                       \
-       BIT(POWER_DOMAIN_INIT))
-#define HSW_DISPLAY_POWER_DOMAINS (                            \
-       (POWER_DOMAIN_MASK & ~HSW_ALWAYS_ON_POWER_DOMAINS) |    \
+       BIT(POWER_DOMAIN_PORT_CRT) | /* DDI E */        \
+       BIT(POWER_DOMAIN_VGA) |                         \
+       BIT(POWER_DOMAIN_AUDIO) |                       \
        BIT(POWER_DOMAIN_INIT))
 
-#define BDW_ALWAYS_ON_POWER_DOMAINS (                  \
-       HSW_ALWAYS_ON_POWER_DOMAINS |                   \
-       BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER))
-#define BDW_DISPLAY_POWER_DOMAINS (                            \
-       (POWER_DOMAIN_MASK & ~BDW_ALWAYS_ON_POWER_DOMAINS) |    \
+#define BDW_DISPLAY_POWER_DOMAINS (                    \
+       BIT(POWER_DOMAIN_PIPE_B) |                      \
+       BIT(POWER_DOMAIN_PIPE_C) |                      \
+       BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) |         \
+       BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) |         \
+       BIT(POWER_DOMAIN_TRANSCODER_A) |                \
+       BIT(POWER_DOMAIN_TRANSCODER_B) |                \
+       BIT(POWER_DOMAIN_TRANSCODER_C) |                \
+       BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |            \
+       BIT(POWER_DOMAIN_PORT_DDI_C_LANES) |            \
+       BIT(POWER_DOMAIN_PORT_DDI_D_LANES) |            \
+       BIT(POWER_DOMAIN_PORT_CRT) | /* DDI E */        \
+       BIT(POWER_DOMAIN_VGA) |                         \
+       BIT(POWER_DOMAIN_AUDIO) |                       \
        BIT(POWER_DOMAIN_INIT))
 
-#define VLV_ALWAYS_ON_POWER_DOMAINS    BIT(POWER_DOMAIN_INIT)
-#define VLV_DISPLAY_POWER_DOMAINS      POWER_DOMAIN_MASK
+#define VLV_DISPLAY_POWER_DOMAINS (            \
+       BIT(POWER_DOMAIN_PIPE_A) |              \
+       BIT(POWER_DOMAIN_PIPE_B) |              \
+       BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
+       BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
+       BIT(POWER_DOMAIN_TRANSCODER_A) |        \
+       BIT(POWER_DOMAIN_TRANSCODER_B) |        \
+       BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |    \
+       BIT(POWER_DOMAIN_PORT_DDI_C_LANES) |    \
+       BIT(POWER_DOMAIN_PORT_DSI) |            \
+       BIT(POWER_DOMAIN_PORT_CRT) |            \
+       BIT(POWER_DOMAIN_VGA) |                 \
+       BIT(POWER_DOMAIN_AUDIO) |               \
+       BIT(POWER_DOMAIN_AUX_B) |               \
+       BIT(POWER_DOMAIN_AUX_C) |               \
+       BIT(POWER_DOMAIN_GMBUS) |               \
+       BIT(POWER_DOMAIN_INIT))
 
 #define VLV_DPIO_CMN_BC_POWER_DOMAINS (                \
        BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |    \
@@ -1679,6 +1691,28 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
        BIT(POWER_DOMAIN_AUX_C) |               \
        BIT(POWER_DOMAIN_INIT))
 
+#define CHV_DISPLAY_POWER_DOMAINS (            \
+       BIT(POWER_DOMAIN_PIPE_A) |              \
+       BIT(POWER_DOMAIN_PIPE_B) |              \
+       BIT(POWER_DOMAIN_PIPE_C) |              \
+       BIT(POWER_DOMAIN_PIPE_A_PANEL_FITTER) | \
+       BIT(POWER_DOMAIN_PIPE_B_PANEL_FITTER) | \
+       BIT(POWER_DOMAIN_PIPE_C_PANEL_FITTER) | \
+       BIT(POWER_DOMAIN_TRANSCODER_A) |        \
+       BIT(POWER_DOMAIN_TRANSCODER_B) |        \
+       BIT(POWER_DOMAIN_TRANSCODER_C) |        \
+       BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |    \
+       BIT(POWER_DOMAIN_PORT_DDI_C_LANES) |    \
+       BIT(POWER_DOMAIN_PORT_DDI_D_LANES) |    \
+       BIT(POWER_DOMAIN_PORT_DSI) |            \
+       BIT(POWER_DOMAIN_VGA) |                 \
+       BIT(POWER_DOMAIN_AUDIO) |               \
+       BIT(POWER_DOMAIN_AUX_B) |               \
+       BIT(POWER_DOMAIN_AUX_C) |               \
+       BIT(POWER_DOMAIN_AUX_D) |               \
+       BIT(POWER_DOMAIN_GMBUS) |               \
+       BIT(POWER_DOMAIN_INIT))
+
 #define CHV_DPIO_CMN_BC_POWER_DOMAINS (                \
        BIT(POWER_DOMAIN_PORT_DDI_B_LANES) |    \
        BIT(POWER_DOMAIN_PORT_DDI_C_LANES) |    \
@@ -1746,7 +1780,7 @@ static struct i915_power_well hsw_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = HSW_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
        },
        {
@@ -1760,7 +1794,7 @@ static struct i915_power_well bdw_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = BDW_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
        },
        {
@@ -1795,7 +1829,7 @@ static struct i915_power_well vlv_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = VLV_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
                .data = PUNIT_POWER_WELL_ALWAYS_ON,
        },
@@ -1853,7 +1887,7 @@ static struct i915_power_well chv_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = VLV_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
        },
        {
@@ -1863,7 +1897,7 @@ static struct i915_power_well chv_power_wells[] = {
                 * power wells don't actually exist. Pipe A power well is
                 * required for any pipe to work.
                 */
-               .domains = VLV_DISPLAY_POWER_DOMAINS,
+               .domains = CHV_DISPLAY_POWER_DOMAINS,
                .data = PIPE_A,
                .ops = &chv_pipe_power_well_ops,
        },
@@ -1897,7 +1931,7 @@ static struct i915_power_well skl_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = SKL_DISPLAY_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
                .data = SKL_DISP_PW_ALWAYS_ON,
        },
@@ -1953,44 +1987,16 @@ static struct i915_power_well skl_power_wells[] = {
        },
 };
 
-void skl_pw1_misc_io_init(struct drm_i915_private *dev_priv)
-{
-       struct i915_power_well *well;
-
-       if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)))
-               return;
-
-       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
-       intel_power_well_enable(dev_priv, well);
-
-       well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
-       intel_power_well_enable(dev_priv, well);
-}
-
-void skl_pw1_misc_io_fini(struct drm_i915_private *dev_priv)
-{
-       struct i915_power_well *well;
-
-       if (!(IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)))
-               return;
-
-       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
-       intel_power_well_disable(dev_priv, well);
-
-       well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
-       intel_power_well_disable(dev_priv, well);
-}
-
 static struct i915_power_well bxt_power_wells[] = {
        {
                .name = "always-on",
                .always_on = 1,
-               .domains = BXT_DISPLAY_ALWAYS_ON_POWER_DOMAINS,
+               .domains = POWER_DOMAIN_MASK,
                .ops = &i9xx_always_on_power_well_ops,
        },
        {
                .name = "power well 1",
-               .domains = BXT_DISPLAY_POWERWELL_1_POWER_DOMAINS,
+               .domains = 0,
                .ops = &skl_power_well_ops,
                .data = SKL_DISP_PW_1,
        },
@@ -2015,12 +2021,56 @@ sanitize_disable_power_well_option(const struct drm_i915_private *dev_priv,
        if (disable_power_well >= 0)
                return !!disable_power_well;
 
-       if (IS_BROXTON(dev_priv)) {
-               DRM_DEBUG_KMS("Disabling display power well support\n");
-               return 0;
+       return 1;
+}
+
+static uint32_t get_allowed_dc_mask(const struct drm_i915_private *dev_priv,
+                                   int enable_dc)
+{
+       uint32_t mask;
+       int requested_dc;
+       int max_dc;
+
+       if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
+               max_dc = 2;
+               mask = 0;
+       } else if (IS_BROXTON(dev_priv)) {
+               max_dc = 1;
+               /*
+                * DC9 has a separate HW flow from the rest of the DC states,
+                * not depending on the DMC firmware. It's needed by system
+                * suspend/resume, so allow it unconditionally.
+                */
+               mask = DC_STATE_EN_DC9;
+       } else {
+               max_dc = 0;
+               mask = 0;
        }
 
-       return 1;
+       if (!i915.disable_power_well)
+               max_dc = 0;
+
+       if (enable_dc >= 0 && enable_dc <= max_dc) {
+               requested_dc = enable_dc;
+       } else if (enable_dc == -1) {
+               requested_dc = max_dc;
+       } else if (enable_dc > max_dc && enable_dc <= 2) {
+               DRM_DEBUG_KMS("Adjusting requested max DC state (%d->%d)\n",
+                             enable_dc, max_dc);
+               requested_dc = max_dc;
+       } else {
+               DRM_ERROR("Unexpected value for enable_dc (%d)\n", enable_dc);
+               requested_dc = max_dc;
+       }
+
+       if (requested_dc > 1)
+               mask |= DC_STATE_EN_UPTO_DC6;
+       if (requested_dc > 0)
+               mask |= DC_STATE_EN_UPTO_DC5;
+
+       DRM_DEBUG_KMS("Allowed DC state mask %02x\n", mask);
+
+       return mask;
 }
 
 #define set_power_wells(power_domains, __power_wells) ({               \
@@ -2041,6 +2091,8 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
 
        i915.disable_power_well = sanitize_disable_power_well_option(dev_priv,
                                                     i915.disable_power_well);
+       dev_priv->csr.allowed_dc_mask = get_allowed_dc_mask(dev_priv,
+                                                           i915.enable_dc);
 
        BUILD_BUG_ON(POWER_DOMAIN_NUM > 31);
 
@@ -2050,17 +2102,17 @@ int intel_power_domains_init(struct drm_i915_private *dev_priv)
         * The enabling order will be from lower to higher indexed wells,
         * the disabling order is reversed.
         */
-       if (IS_HASWELL(dev_priv->dev)) {
+       if (IS_HASWELL(dev_priv)) {
                set_power_wells(power_domains, hsw_power_wells);
-       } else if (IS_BROADWELL(dev_priv->dev)) {
+       } else if (IS_BROADWELL(dev_priv)) {
                set_power_wells(power_domains, bdw_power_wells);
-       } else if (IS_SKYLAKE(dev_priv->dev) || IS_KABYLAKE(dev_priv->dev)) {
+       } else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
                set_power_wells(power_domains, skl_power_wells);
-       } else if (IS_BROXTON(dev_priv->dev)) {
+       } else if (IS_BROXTON(dev_priv)) {
                set_power_wells(power_domains, bxt_power_wells);
-       } else if (IS_CHERRYVIEW(dev_priv->dev)) {
+       } else if (IS_CHERRYVIEW(dev_priv)) {
                set_power_wells(power_domains, chv_power_wells);
-       } else if (IS_VALLEYVIEW(dev_priv->dev)) {
+       } else if (IS_VALLEYVIEW(dev_priv)) {
                set_power_wells(power_domains, vlv_power_wells);
        } else {
                set_power_wells(power_domains, i9xx_always_on_power_well);
@@ -2120,9 +2172,10 @@ static void intel_power_domains_sync_hw(struct drm_i915_private *dev_priv)
 }
 
 static void skl_display_core_init(struct drm_i915_private *dev_priv,
-                                 bool resume)
+                                  bool resume)
 {
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       struct i915_power_well *well;
        uint32_t val;
 
        gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
@@ -2133,7 +2186,13 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
 
        /* enable PG1 and Misc I/O */
        mutex_lock(&power_domains->lock);
-       skl_pw1_misc_io_init(dev_priv);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
+       intel_power_well_enable(dev_priv, well);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
+       intel_power_well_enable(dev_priv, well);
+
        mutex_unlock(&power_domains->lock);
 
        if (!resume)
@@ -2141,13 +2200,14 @@ static void skl_display_core_init(struct drm_i915_private *dev_priv,
 
        skl_init_cdclk(dev_priv);
 
-       if (dev_priv->csr.dmc_payload && intel_csr_load_program(dev_priv))
-               gen9_set_dc_state_debugmask(dev_priv);
+       if (dev_priv->csr.dmc_payload)
+               intel_csr_load_program(dev_priv);
 }
 
 static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
 {
        struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       struct i915_power_well *well;
 
        gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
 
@@ -2155,8 +2215,73 @@ static void skl_display_core_uninit(struct drm_i915_private *dev_priv)
 
        /* The spec doesn't call for removing the reset handshake flag */
        /* disable PG1 and Misc I/O */
+
+       mutex_lock(&power_domains->lock);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_MISC_IO);
+       intel_power_well_disable(dev_priv, well);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
+       intel_power_well_disable(dev_priv, well);
+
+       mutex_unlock(&power_domains->lock);
+}
+
+void bxt_display_core_init(struct drm_i915_private *dev_priv,
+                          bool resume)
+{
+       struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       struct i915_power_well *well;
+       uint32_t val;
+
+       gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
+
+       /*
+        * NDE_RSTWRN_OPT RST PCH Handshake En must always be 0b on BXT
+        * or else the reset will hang because there is no PCH to respond.
+        * Move the handshake programming to initialization sequence.
+        * Previously was left up to BIOS.
+        */
+       val = I915_READ(HSW_NDE_RSTWRN_OPT);
+       val &= ~RESET_PCH_HANDSHAKE_ENABLE;
+       I915_WRITE(HSW_NDE_RSTWRN_OPT, val);
+
+       /* Enable PG1 */
+       mutex_lock(&power_domains->lock);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
+       intel_power_well_enable(dev_priv, well);
+
+       mutex_unlock(&power_domains->lock);
+
+       broxton_init_cdclk(dev_priv);
+       broxton_ddi_phy_init(dev_priv);
+
+       broxton_cdclk_verify_state(dev_priv);
+       broxton_ddi_phy_verify_state(dev_priv);
+
+       if (resume && dev_priv->csr.dmc_payload)
+               intel_csr_load_program(dev_priv);
+}
+
+void bxt_display_core_uninit(struct drm_i915_private *dev_priv)
+{
+       struct i915_power_domains *power_domains = &dev_priv->power_domains;
+       struct i915_power_well *well;
+
+       gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
+
+       broxton_ddi_phy_uninit(dev_priv);
+       broxton_uninit_cdclk(dev_priv);
+
+       /* The spec doesn't call for removing the reset handshake flag */
+
+       /* Disable PG1 */
        mutex_lock(&power_domains->lock);
-       skl_pw1_misc_io_fini(dev_priv);
+
+       well = lookup_power_well(dev_priv, SKL_DISP_PW_1);
+       intel_power_well_disable(dev_priv, well);
+
        mutex_unlock(&power_domains->lock);
 }
 
@@ -2291,6 +2416,8 @@ void intel_power_domains_init_hw(struct drm_i915_private *dev_priv, bool resume)
 
        if (IS_SKYLAKE(dev) || IS_KABYLAKE(dev)) {
                skl_display_core_init(dev_priv, resume);
+       } else if (IS_BROXTON(dev)) {
+               bxt_display_core_init(dev_priv, resume);
        } else if (IS_CHERRYVIEW(dev)) {
                mutex_lock(&power_domains->lock);
                chv_phy_control_init(dev_priv);
@@ -2328,6 +2455,8 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv)
 
        if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                skl_display_core_uninit(dev_priv);
+       else if (IS_BROXTON(dev_priv))
+               bxt_display_core_uninit(dev_priv);
 }
 
 /**
index 4ecc076c40417c668e7ded7c7b51cfadac4104d7..2128fae5687d12a59c8d06ecc4003113abcc7944 100644 (file)
@@ -1398,12 +1398,10 @@ static void intel_sdvo_get_config(struct intel_encoder *encoder,
        }
 
        dotclock = pipe_config->port_clock;
+
        if (pipe_config->pixel_multiplier)
                dotclock /= pipe_config->pixel_multiplier;
 
-       if (HAS_PCH_SPLIT(dev))
-               ironlake_check_encoder_dotclock(pipe_config, dotclock);
-
        pipe_config->base.adjusted_mode.crtc_clock = dotclock;
 
        /* Cross check the port pixel multiplier with the sdvo encoder state. */
@@ -2262,9 +2260,9 @@ intel_sdvo_select_ddc_bus(struct drm_i915_private *dev_priv,
        struct sdvo_device_mapping *mapping;
 
        if (sdvo->port == PORT_B)
-               mapping = &(dev_priv->sdvo_mappings[0]);
+               mapping = &dev_priv->vbt.sdvo_mappings[0];
        else
-               mapping = &(dev_priv->sdvo_mappings[1]);
+               mapping = &dev_priv->vbt.sdvo_mappings[1];
 
        if (mapping->initialized)
                sdvo->ddc_bus = 1 << ((mapping->ddc_pin & 0xf0) >> 4);
@@ -2280,9 +2278,9 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
        u8 pin;
 
        if (sdvo->port == PORT_B)
-               mapping = &dev_priv->sdvo_mappings[0];
+               mapping = &dev_priv->vbt.sdvo_mappings[0];
        else
-               mapping = &dev_priv->sdvo_mappings[1];
+               mapping = &dev_priv->vbt.sdvo_mappings[1];
 
        if (mapping->initialized &&
            intel_gmbus_is_valid_pin(dev_priv, mapping->i2c_pin))
@@ -2318,11 +2316,11 @@ intel_sdvo_get_slave_addr(struct drm_device *dev, struct intel_sdvo *sdvo)
        struct sdvo_device_mapping *my_mapping, *other_mapping;
 
        if (sdvo->port == PORT_B) {
-               my_mapping = &dev_priv->sdvo_mappings[0];
-               other_mapping = &dev_priv->sdvo_mappings[1];
+               my_mapping = &dev_priv->vbt.sdvo_mappings[0];
+               other_mapping = &dev_priv->vbt.sdvo_mappings[1];
        } else {
-               my_mapping = &dev_priv->sdvo_mappings[1];
-               other_mapping = &dev_priv->sdvo_mappings[0];
+               my_mapping = &dev_priv->vbt.sdvo_mappings[1];
+               other_mapping = &dev_priv->vbt.sdvo_mappings[0];
        }
 
        /* If the BIOS described our SDVO device, take advantage of it. */
index a2582c455b3623a13e32bc32ac49b5b5c0bf6149..0f3e2303e0e9b08229d29a7cc47172bf0efbeef5 100644 (file)
@@ -193,7 +193,7 @@ skl_update_plane(struct drm_plane *drm_plane,
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        u32 surf_addr;
        u32 tile_height, plane_offset, plane_size;
-       unsigned int rotation;
+       unsigned int rotation = plane_state->base.rotation;
        int x_offset, y_offset;
        int crtc_x = plane_state->dst.x1;
        int crtc_y = plane_state->dst.y1;
@@ -213,7 +213,6 @@ skl_update_plane(struct drm_plane *drm_plane,
        plane_ctl |= skl_plane_ctl_format(fb->pixel_format);
        plane_ctl |= skl_plane_ctl_tiling(fb->modifier[0]);
 
-       rotation = plane_state->base.rotation;
        plane_ctl |= skl_plane_ctl_rotation(rotation);
 
        stride_div = intel_fb_stride_alignment(dev_priv, fb->modifier[0],
@@ -351,6 +350,7 @@ vlv_update_plane(struct drm_plane *dplane,
        int plane = intel_plane->plane;
        u32 sprctl;
        u32 sprsurf_offset, linear_offset;
+       unsigned int rotation = dplane->state->rotation;
        int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->dst.x1;
@@ -423,12 +423,11 @@ vlv_update_plane(struct drm_plane *dplane,
        crtc_h--;
 
        linear_offset = y * fb->pitches[0] + x * cpp;
-       sprsurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
-                                                  fb->modifier[0], cpp,
-                                                  fb->pitches[0]);
+       sprsurf_offset = intel_compute_tile_offset(&x, &y, fb, 0,
+                                                  fb->pitches[0], rotation);
        linear_offset -= sprsurf_offset;
 
-       if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
+       if (rotation == BIT(DRM_ROTATE_180)) {
                sprctl |= SP_ROTATE_180;
 
                x += src_w;
@@ -493,6 +492,7 @@ ivb_update_plane(struct drm_plane *plane,
        enum pipe pipe = intel_plane->pipe;
        u32 sprctl, sprscale = 0;
        u32 sprsurf_offset, linear_offset;
+       unsigned int rotation = plane_state->base.rotation;
        int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->dst.x1;
@@ -556,12 +556,11 @@ ivb_update_plane(struct drm_plane *plane,
                sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h;
 
        linear_offset = y * fb->pitches[0] + x * cpp;
-       sprsurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
-                                                  fb->modifier[0], cpp,
-                                                  fb->pitches[0]);
+       sprsurf_offset = intel_compute_tile_offset(&x, &y, fb, 0,
+                                                  fb->pitches[0], rotation);
        linear_offset -= sprsurf_offset;
 
-       if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
+       if (rotation == BIT(DRM_ROTATE_180)) {
                sprctl |= SPRITE_ROTATE_180;
 
                /* HSW and BDW does this automagically in hardware */
@@ -634,6 +633,7 @@ ilk_update_plane(struct drm_plane *plane,
        int pipe = intel_plane->pipe;
        u32 dvscntr, dvsscale;
        u32 dvssurf_offset, linear_offset;
+       unsigned int rotation = plane_state->base.rotation;
        int cpp = drm_format_plane_cpp(fb->pixel_format, 0);
        const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
        int crtc_x = plane_state->dst.x1;
@@ -693,12 +693,11 @@ ilk_update_plane(struct drm_plane *plane,
                dvsscale = DVS_SCALE_ENABLE | (src_w << 16) | src_h;
 
        linear_offset = y * fb->pitches[0] + x * cpp;
-       dvssurf_offset = intel_compute_tile_offset(dev_priv, &x, &y,
-                                                  fb->modifier[0], cpp,
-                                                  fb->pitches[0]);
+       dvssurf_offset = intel_compute_tile_offset(&x, &y, fb, 0,
+                                                  fb->pitches[0], rotation);
        linear_offset -= dvssurf_offset;
 
-       if (plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
+       if (rotation == BIT(DRM_ROTATE_180)) {
                dvscntr |= DVS_ROTATE_180;
 
                x += src_w;
@@ -1026,8 +1025,8 @@ static uint32_t skl_plane_formats[] = {
 int
 intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
 {
-       struct intel_plane *intel_plane;
-       struct intel_plane_state *state;
+       struct intel_plane *intel_plane = NULL;
+       struct intel_plane_state *state = NULL;
        unsigned long possible_crtcs;
        const uint32_t *plane_formats;
        int num_plane_formats;
@@ -1037,13 +1036,15 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
                return -ENODEV;
 
        intel_plane = kzalloc(sizeof(*intel_plane), GFP_KERNEL);
-       if (!intel_plane)
-               return -ENOMEM;
+       if (!intel_plane) {
+               ret = -ENOMEM;
+               goto fail;
+       }
 
        state = intel_create_plane_state(&intel_plane->base);
        if (!state) {
-               kfree(intel_plane);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto fail;
        }
        intel_plane->base.state = &state->base;
 
@@ -1098,28 +1099,34 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
                num_plane_formats = ARRAY_SIZE(skl_plane_formats);
                break;
        default:
-               kfree(intel_plane);
-               return -ENODEV;
+               MISSING_CASE(INTEL_INFO(dev)->gen);
+               ret = -ENODEV;
+               goto fail;
        }
 
        intel_plane->pipe = pipe;
        intel_plane->plane = plane;
        intel_plane->frontbuffer_bit = INTEL_FRONTBUFFER_SPRITE(pipe, plane);
        intel_plane->check_plane = intel_check_sprite_plane;
+
        possible_crtcs = (1 << pipe);
+
        ret = drm_universal_plane_init(dev, &intel_plane->base, possible_crtcs,
                                       &intel_plane_funcs,
                                       plane_formats, num_plane_formats,
                                       DRM_PLANE_TYPE_OVERLAY, NULL);
-       if (ret) {
-               kfree(intel_plane);
-               goto out;
-       }
+       if (ret)
+               goto fail;
 
        intel_create_rotation_property(dev, intel_plane);
 
        drm_plane_helper_add(&intel_plane->base, &intel_plane_helper_funcs);
 
-out:
+       return 0;
+
+fail:
+       kfree(state);
+       kfree(intel_plane);
+
        return ret;
 }
index 6745bad5bff065bd594506077e2ea95949b12a29..223129d3c765afd836118121416a9a9650813c64 100644 (file)
@@ -326,24 +326,12 @@ static const struct color_conversion sdtv_csc_yprpb = {
        .rv = 0x0100, .gv = 0x03ad, .bv = 0x074d, .av = 0x0200,
 };
 
-static const struct color_conversion sdtv_csc_rgb = {
-       .ry = 0x0000, .gy = 0x0f00, .by = 0x0000, .ay = 0x0166,
-       .ru = 0x0000, .gu = 0x0000, .bu = 0x0f00, .au = 0x0166,
-       .rv = 0x0f00, .gv = 0x0000, .bv = 0x0000, .av = 0x0166,
-};
-
 static const struct color_conversion hdtv_csc_yprpb = {
        .ry = 0x05b3, .gy = 0x016e, .by = 0x0728, .ay = 0x0145,
        .ru = 0x07d5, .gu = 0x038b, .bu = 0x0100, .au = 0x0200,
        .rv = 0x0100, .gv = 0x03d1, .bv = 0x06bc, .av = 0x0200,
 };
 
-static const struct color_conversion hdtv_csc_rgb = {
-       .ry = 0x0000, .gy = 0x0f00, .by = 0x0000, .ay = 0x0166,
-       .ru = 0x0000, .gu = 0x0000, .bu = 0x0f00, .au = 0x0166,
-       .rv = 0x0f00, .gv = 0x0000, .bv = 0x0000, .av = 0x0166,
-};
-
 static const struct video_levels component_levels = {
        .blank = 279, .black = 279, .burst = 0,
 };
@@ -1531,47 +1519,6 @@ static const struct drm_encoder_funcs intel_tv_enc_funcs = {
        .destroy = intel_encoder_destroy,
 };
 
-/*
- * Enumerate the child dev array parsed from VBT to check whether
- * the integrated TV is present.
- * If it is present, return 1.
- * If it is not present, return false.
- * If no child dev is parsed from VBT, it assumes that the TV is present.
- */
-static int tv_is_present_in_vbt(struct drm_device *dev)
-{
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       union child_device_config *p_child;
-       int i, ret;
-
-       if (!dev_priv->vbt.child_dev_num)
-               return 1;
-
-       ret = 0;
-       for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
-               p_child = dev_priv->vbt.child_dev + i;
-               /*
-                * If the device type is not TV, continue.
-                */
-               switch (p_child->old.device_type) {
-               case DEVICE_TYPE_INT_TV:
-               case DEVICE_TYPE_TV:
-               case DEVICE_TYPE_TV_SVIDEO_COMPOSITE:
-                       break;
-               default:
-                       continue;
-               }
-               /* Only when the addin_offset is non-zero, it is regarded
-                * as present.
-                */
-               if (p_child->old.addin_offset) {
-                       ret = 1;
-                       break;
-               }
-       }
-       return ret;
-}
-
 void
 intel_tv_init(struct drm_device *dev)
 {
@@ -1587,13 +1534,10 @@ intel_tv_init(struct drm_device *dev)
        if ((I915_READ(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED)
                return;
 
-       if (!tv_is_present_in_vbt(dev)) {
+       if (!intel_bios_is_tv_present(dev_priv)) {
                DRM_DEBUG_KMS("Integrated TV is not present.\n");
                return;
        }
-       /* Even if we have an encoder we may not have a connector */
-       if (!dev_priv->vbt.int_tv_support)
-               return;
 
        /*
         * Sanity check the TV output by checking to see if the
index 68b6f69aa6820d88952173e4aca801ef56370a7c..4f1dfe616856ffc748e54a1826465df5950c10f6 100644 (file)
@@ -60,7 +60,11 @@ fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
 static inline void
 fw_domain_arm_timer(struct intel_uncore_forcewake_domain *d)
 {
-       mod_timer_pinned(&d->timer, jiffies + 1);
+       d->wake_count++;
+       hrtimer_start_range_ns(&d->timer,
+                              ktime_set(0, NSEC_PER_MSEC),
+                              NSEC_PER_MSEC,
+                              HRTIMER_MODE_REL);
 }
 
 static inline void
@@ -107,22 +111,22 @@ static void
 fw_domains_get(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(d, fw_domains, dev_priv) {
                fw_domain_wait_ack_clear(d);
                fw_domain_get(d);
-               fw_domain_wait_ack(d);
        }
+
+       for_each_fw_domain_masked(d, fw_domains, dev_priv)
+               fw_domain_wait_ack(d);
 }
 
 static void
 fw_domains_put(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(d, fw_domains, dev_priv) {
                fw_domain_put(d);
                fw_domain_posting_read(d);
        }
@@ -132,10 +136,9 @@ static void
 fw_domains_posting_read(struct drm_i915_private *dev_priv)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
        /* No need to do for all, just do for first found */
-       for_each_fw_domain(d, dev_priv, id) {
+       for_each_fw_domain(d, dev_priv) {
                fw_domain_posting_read(d);
                break;
        }
@@ -145,12 +148,11 @@ static void
 fw_domains_reset(struct drm_i915_private *dev_priv, enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *d;
-       enum forcewake_domain_id id;
 
        if (dev_priv->uncore.fw_domains == 0)
                return;
 
-       for_each_fw_domain_mask(d, fw_domains, dev_priv, id)
+       for_each_fw_domain_masked(d, fw_domains, dev_priv)
                fw_domain_reset(d);
 
        fw_domains_posting_read(dev_priv);
@@ -204,7 +206,7 @@ static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
 
        /* On VLV, FIFO will be shared by both SW and HW.
         * So, we need to read the FREE_ENTRIES everytime */
-       if (IS_VALLEYVIEW(dev_priv->dev))
+       if (IS_VALLEYVIEW(dev_priv))
                dev_priv->uncore.fifo_count = fifo_free_entries(dev_priv);
 
        if (dev_priv->uncore.fifo_count < GT_FIFO_NUM_RESERVED_ENTRIES) {
@@ -224,9 +226,11 @@ static int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
        return ret;
 }
 
-static void intel_uncore_fw_release_timer(unsigned long arg)
+static enum hrtimer_restart
+intel_uncore_fw_release_timer(struct hrtimer *timer)
 {
-       struct intel_uncore_forcewake_domain *domain = (void *)arg;
+       struct intel_uncore_forcewake_domain *domain =
+              container_of(timer, struct intel_uncore_forcewake_domain, timer);
        unsigned long irqflags;
 
        assert_rpm_device_not_suspended(domain->i915);
@@ -240,6 +244,8 @@ static void intel_uncore_fw_release_timer(unsigned long arg)
                                                          1 << domain->id);
 
        spin_unlock_irqrestore(&domain->i915->uncore.lock, irqflags);
+
+       return HRTIMER_NORESTART;
 }
 
 void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
@@ -248,7 +254,6 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
        unsigned long irqflags;
        struct intel_uncore_forcewake_domain *domain;
        int retry_count = 100;
-       enum forcewake_domain_id id;
        enum forcewake_domains fw = 0, active_domains;
 
        /* Hold uncore.lock across reset to prevent any register access
@@ -258,18 +263,18 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
        while (1) {
                active_domains = 0;
 
-               for_each_fw_domain(domain, dev_priv, id) {
-                       if (del_timer_sync(&domain->timer) == 0)
+               for_each_fw_domain(domain, dev_priv) {
+                       if (hrtimer_cancel(&domain->timer) == 0)
                                continue;
 
-                       intel_uncore_fw_release_timer((unsigned long)domain);
+                       intel_uncore_fw_release_timer(&domain->timer);
                }
 
                spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
 
-               for_each_fw_domain(domain, dev_priv, id) {
-                       if (timer_pending(&domain->timer))
-                               active_domains |= (1 << id);
+               for_each_fw_domain(domain, dev_priv) {
+                       if (hrtimer_active(&domain->timer))
+                               active_domains |= domain->mask;
                }
 
                if (active_domains == 0)
@@ -286,9 +291,9 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
 
        WARN_ON(active_domains);
 
-       for_each_fw_domain(domain, dev_priv, id)
+       for_each_fw_domain(domain, dev_priv)
                if (domain->wake_count)
-                       fw |= 1 << id;
+                       fw |= domain->mask;
 
        if (fw)
                dev_priv->uncore.funcs.force_wake_put(dev_priv, fw);
@@ -310,21 +315,49 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
        spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
 }
 
-static void intel_uncore_ellc_detect(struct drm_device *dev)
+static u64 gen9_edram_size(struct drm_i915_private *dev_priv)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
+       const unsigned int ways[8] = { 4, 8, 12, 16, 16, 16, 16, 16 };
+       const unsigned int sets[4] = { 1, 1, 2, 2 };
+       const u32 cap = dev_priv->edram_cap;
+
+       return EDRAM_NUM_BANKS(cap) *
+               ways[EDRAM_WAYS_IDX(cap)] *
+               sets[EDRAM_SETS_IDX(cap)] *
+               1024 * 1024;
+}
+
+u64 intel_uncore_edram_size(struct drm_i915_private *dev_priv)
+{
+       if (!HAS_EDRAM(dev_priv))
+               return 0;
 
-       if ((IS_HASWELL(dev) || IS_BROADWELL(dev) ||
-            INTEL_INFO(dev)->gen >= 9) &&
-           (__raw_i915_read32(dev_priv, HSW_EDRAM_PRESENT) & EDRAM_ENABLED)) {
-               /* The docs do not explain exactly how the calculation can be
-                * made. It is somewhat guessable, but for now, it's always
-                * 128MB.
-                * NB: We can't write IDICR yet because we do not have gt funcs
+       /* The needed capability bits for size calculation
+        * are not there with pre gen9 so return 128MB always.
+        */
+       if (INTEL_GEN(dev_priv) < 9)
+               return 128 * 1024 * 1024;
+
+       return gen9_edram_size(dev_priv);
+}
+
+static void intel_uncore_edram_detect(struct drm_i915_private *dev_priv)
+{
+       if (IS_HASWELL(dev_priv) ||
+           IS_BROADWELL(dev_priv) ||
+           INTEL_GEN(dev_priv) >= 9) {
+               dev_priv->edram_cap = __raw_i915_read32(dev_priv,
+                                                       HSW_EDRAM_CAP);
+
+               /* NB: We can't write IDICR yet because we do not have gt funcs
                 * set up */
-               dev_priv->ellc_size = 128;
-               DRM_INFO("Found %zuMB of eLLC\n", dev_priv->ellc_size);
+       } else {
+               dev_priv->edram_cap = 0;
        }
+
+       if (HAS_EDRAM(dev_priv))
+               DRM_INFO("Found %lluMB of eDRAM\n",
+                        intel_uncore_edram_size(dev_priv) / (1024 * 1024));
 }
 
 static bool
@@ -410,16 +443,15 @@ static void __intel_uncore_forcewake_get(struct drm_i915_private *dev_priv,
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_get)
                return;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (domain->wake_count++)
-                       fw_domains &= ~(1 << id);
+                       fw_domains &= ~domain->mask;
        }
 
        if (fw_domains)
@@ -477,21 +509,19 @@ static void __intel_uncore_forcewake_put(struct drm_i915_private *dev_priv,
                                         enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_put)
                return;
 
        fw_domains &= dev_priv->uncore.fw_domains;
 
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (WARN_ON(domain->wake_count == 0))
                        continue;
 
                if (--domain->wake_count)
                        continue;
 
-               domain->wake_count++;
                fw_domain_arm_timer(domain);
        }
 }
@@ -539,18 +569,27 @@ void intel_uncore_forcewake_put__locked(struct drm_i915_private *dev_priv,
 void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (!dev_priv->uncore.funcs.force_wake_get)
                return;
 
-       for_each_fw_domain(domain, dev_priv, id)
+       for_each_fw_domain(domain, dev_priv)
                WARN_ON(domain->wake_count);
 }
 
 /* We give fast paths for the really cool registers */
 #define NEEDS_FORCE_WAKE(reg) ((reg) < 0x40000)
 
+#define __gen6_reg_read_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd; \
+       if (NEEDS_FORCE_WAKE(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else \
+               __fwd = 0; \
+       __fwd; \
+})
+
 #define REG_RANGE(reg, start, end) ((reg) >= (start) && (reg) < (end))
 
 #define FORCEWAKE_VLV_RENDER_RANGE_OFFSET(reg) \
@@ -564,6 +603,48 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
         REG_RANGE((reg), 0x22000, 0x24000) || \
         REG_RANGE((reg), 0x30000, 0x40000))
 
+#define __vlv_reg_read_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd = 0; \
+       if (!NEEDS_FORCE_WAKE(offset)) \
+               __fwd = 0; \
+       else if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_MEDIA; \
+       __fwd; \
+})
+
+static const i915_reg_t gen8_shadowed_regs[] = {
+       GEN6_RPNSWREQ,
+       GEN6_RC_VIDEO_FREQ,
+       RING_TAIL(RENDER_RING_BASE),
+       RING_TAIL(GEN6_BSD_RING_BASE),
+       RING_TAIL(VEBOX_RING_BASE),
+       RING_TAIL(BLT_RING_BASE),
+       /* TODO: Other registers are not yet used */
+};
+
+static bool is_gen8_shadowed(u32 offset)
+{
+       int i;
+       for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
+               if (offset == gen8_shadowed_regs[i].reg)
+                       return true;
+
+       return false;
+}
+
+#define __gen8_reg_write_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd; \
+       if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else \
+               __fwd = 0; \
+       __fwd; \
+})
+
 #define FORCEWAKE_CHV_RENDER_RANGE_OFFSET(reg) \
        (REG_RANGE((reg), 0x2000, 0x4000) || \
         REG_RANGE((reg), 0x5200, 0x8000) || \
@@ -586,6 +667,34 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
         REG_RANGE((reg), 0x9000, 0xB000) || \
         REG_RANGE((reg), 0xF000, 0x10000))
 
+#define __chv_reg_read_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd = 0; \
+       if (!NEEDS_FORCE_WAKE(offset)) \
+               __fwd = 0; \
+       else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_MEDIA; \
+       else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       __fwd; \
+})
+
+#define __chv_reg_write_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd = 0; \
+       if (!NEEDS_FORCE_WAKE(offset) || is_gen8_shadowed(offset)) \
+               __fwd = 0; \
+       else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_MEDIA; \
+       else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       __fwd; \
+})
+
 #define FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg) \
        REG_RANGE((reg), 0xB00,  0x2000)
 
@@ -618,6 +727,61 @@ void assert_forcewakes_inactive(struct drm_i915_private *dev_priv)
         !FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(reg) && \
         !FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(reg))
 
+#define SKL_NEEDS_FORCE_WAKE(reg) \
+       ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))
+
+#define __gen9_reg_read_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd; \
+       if (!SKL_NEEDS_FORCE_WAKE(offset)) \
+               __fwd = 0; \
+       else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_MEDIA; \
+       else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       else \
+               __fwd = FORCEWAKE_BLITTER; \
+       __fwd; \
+})
+
+static const i915_reg_t gen9_shadowed_regs[] = {
+       RING_TAIL(RENDER_RING_BASE),
+       RING_TAIL(GEN6_BSD_RING_BASE),
+       RING_TAIL(VEBOX_RING_BASE),
+       RING_TAIL(BLT_RING_BASE),
+       GEN6_RPNSWREQ,
+       GEN6_RC_VIDEO_FREQ,
+       /* TODO: Other registers are not yet used */
+};
+
+static bool is_gen9_shadowed(u32 offset)
+{
+       int i;
+       for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
+               if (offset == gen9_shadowed_regs[i].reg)
+                       return true;
+
+       return false;
+}
+
+#define __gen9_reg_write_fw_domains(offset) \
+({ \
+       enum forcewake_domains __fwd; \
+       if (!SKL_NEEDS_FORCE_WAKE(offset) || is_gen9_shadowed(offset)) \
+               __fwd = 0; \
+       else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER; \
+       else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_MEDIA; \
+       else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
+               __fwd = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       else \
+               __fwd = FORCEWAKE_BLITTER; \
+       __fwd; \
+})
+
 static void
 ilk_dummy_write(struct drm_i915_private *dev_priv)
 {
@@ -633,15 +797,6 @@ __unclaimed_reg_debug(struct drm_i915_private *dev_priv,
                      const bool read,
                      const bool before)
 {
-       /* XXX. We limit the auto arming traces for mmio
-        * debugs on these platforms. There are just too many
-        * revealed by these and CI/Bat suffers from the noise.
-        * Please fix and then re-enable the automatic traces.
-        */
-       if (i915.mmio_debug < 2 &&
-           (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)))
-               return;
-
        if (WARN(check_for_unclaimed_mmio(dev_priv),
                 "Unclaimed register detected %s %s register 0x%x\n",
                 before ? "before" : "after",
@@ -716,23 +871,21 @@ __gen2_read(64)
        trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
        return val
 
-static inline void __force_wake_get(struct drm_i915_private *dev_priv,
-                                   enum forcewake_domains fw_domains)
+static inline void __force_wake_auto(struct drm_i915_private *dev_priv,
+                                    enum forcewake_domains fw_domains)
 {
        struct intel_uncore_forcewake_domain *domain;
-       enum forcewake_domain_id id;
 
        if (WARN_ON(!fw_domains))
                return;
 
        /* Ideally GCC would be constant-fold and eliminate this loop */
-       for_each_fw_domain_mask(domain, fw_domains, dev_priv, id) {
+       for_each_fw_domain_masked(domain, fw_domains, dev_priv) {
                if (domain->wake_count) {
-                       fw_domains &= ~(1 << id);
+                       fw_domains &= ~domain->mask;
                        continue;
                }
 
-               domain->wake_count++;
                fw_domain_arm_timer(domain);
        }
 
@@ -743,9 +896,11 @@ static inline void __force_wake_get(struct drm_i915_private *dev_priv,
 #define __gen6_read(x) \
 static u##x \
 gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
+       enum forcewake_domains fw_engine; \
        GEN6_READ_HEADER(x); \
-       if (NEEDS_FORCE_WAKE(offset)) \
-               __force_wake_get(dev_priv, FORCEWAKE_RENDER); \
+       fw_engine = __gen6_reg_read_fw_domains(offset); \
+       if (fw_engine) \
+               __force_wake_auto(dev_priv, fw_engine); \
        val = __raw_i915_read##x(dev_priv, reg); \
        GEN6_READ_FOOTER; \
 }
@@ -753,16 +908,11 @@ gen6_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
 #define __vlv_read(x) \
 static u##x \
 vlv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
-       enum forcewake_domains fw_engine = 0; \
+       enum forcewake_domains fw_engine; \
        GEN6_READ_HEADER(x); \
-       if (!NEEDS_FORCE_WAKE(offset)) \
-               fw_engine = 0; \
-       else if (FORCEWAKE_VLV_RENDER_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER; \
-       else if (FORCEWAKE_VLV_MEDIA_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_MEDIA; \
+       fw_engine = __vlv_reg_read_fw_domains(offset); \
        if (fw_engine) \
-               __force_wake_get(dev_priv, fw_engine); \
+               __force_wake_auto(dev_priv, fw_engine); \
        val = __raw_i915_read##x(dev_priv, reg); \
        GEN6_READ_FOOTER; \
 }
@@ -770,42 +920,23 @@ vlv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
 #define __chv_read(x) \
 static u##x \
 chv_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
-       enum forcewake_domains fw_engine = 0; \
+       enum forcewake_domains fw_engine; \
        GEN6_READ_HEADER(x); \
-       if (!NEEDS_FORCE_WAKE(offset)) \
-               fw_engine = 0; \
-       else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER; \
-       else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_MEDIA; \
-       else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       fw_engine = __chv_reg_read_fw_domains(offset); \
        if (fw_engine) \
-               __force_wake_get(dev_priv, fw_engine); \
+               __force_wake_auto(dev_priv, fw_engine); \
        val = __raw_i915_read##x(dev_priv, reg); \
        GEN6_READ_FOOTER; \
 }
 
-#define SKL_NEEDS_FORCE_WAKE(reg) \
-       ((reg) < 0x40000 && !FORCEWAKE_GEN9_UNCORE_RANGE_OFFSET(reg))
-
 #define __gen9_read(x) \
 static u##x \
 gen9_read##x(struct drm_i915_private *dev_priv, i915_reg_t reg, bool trace) { \
        enum forcewake_domains fw_engine; \
        GEN6_READ_HEADER(x); \
-       if (!SKL_NEEDS_FORCE_WAKE(offset)) \
-               fw_engine = 0; \
-       else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER; \
-       else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_MEDIA; \
-       else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
-       else \
-               fw_engine = FORCEWAKE_BLITTER; \
+       fw_engine = __gen9_reg_read_fw_domains(offset); \
        if (fw_engine) \
-               __force_wake_get(dev_priv, fw_engine); \
+               __force_wake_auto(dev_priv, fw_engine); \
        val = __raw_i915_read##x(dev_priv, reg); \
        GEN6_READ_FOOTER; \
 }
@@ -942,34 +1073,14 @@ hsw_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool t
        GEN6_WRITE_FOOTER; \
 }
 
-static const i915_reg_t gen8_shadowed_regs[] = {
-       FORCEWAKE_MT,
-       GEN6_RPNSWREQ,
-       GEN6_RC_VIDEO_FREQ,
-       RING_TAIL(RENDER_RING_BASE),
-       RING_TAIL(GEN6_BSD_RING_BASE),
-       RING_TAIL(VEBOX_RING_BASE),
-       RING_TAIL(BLT_RING_BASE),
-       /* TODO: Other registers are not yet used */
-};
-
-static bool is_gen8_shadowed(struct drm_i915_private *dev_priv,
-                            i915_reg_t reg)
-{
-       int i;
-       for (i = 0; i < ARRAY_SIZE(gen8_shadowed_regs); i++)
-               if (i915_mmio_reg_equal(reg, gen8_shadowed_regs[i]))
-                       return true;
-
-       return false;
-}
-
 #define __gen8_write(x) \
 static void \
 gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
+       enum forcewake_domains fw_engine; \
        GEN6_WRITE_HEADER; \
-       if (NEEDS_FORCE_WAKE(offset) && !is_gen8_shadowed(dev_priv, reg)) \
-               __force_wake_get(dev_priv, FORCEWAKE_RENDER); \
+       fw_engine = __gen8_reg_write_fw_domains(offset); \
+       if (fw_engine) \
+               __force_wake_auto(dev_priv, fw_engine); \
        __raw_i915_write##x(dev_priv, reg, val); \
        GEN6_WRITE_FOOTER; \
 }
@@ -977,66 +1088,24 @@ gen8_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool
 #define __chv_write(x) \
 static void \
 chv_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, bool trace) { \
-       enum forcewake_domains fw_engine = 0; \
+       enum forcewake_domains fw_engine; \
        GEN6_WRITE_HEADER; \
-       if (!NEEDS_FORCE_WAKE(offset) || \
-           is_gen8_shadowed(dev_priv, reg)) \
-               fw_engine = 0; \
-       else if (FORCEWAKE_CHV_RENDER_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER; \
-       else if (FORCEWAKE_CHV_MEDIA_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_MEDIA; \
-       else if (FORCEWAKE_CHV_COMMON_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
+       fw_engine = __chv_reg_write_fw_domains(offset); \
        if (fw_engine) \
-               __force_wake_get(dev_priv, fw_engine); \
+               __force_wake_auto(dev_priv, fw_engine); \
        __raw_i915_write##x(dev_priv, reg, val); \
        GEN6_WRITE_FOOTER; \
 }
 
-static const i915_reg_t gen9_shadowed_regs[] = {
-       RING_TAIL(RENDER_RING_BASE),
-       RING_TAIL(GEN6_BSD_RING_BASE),
-       RING_TAIL(VEBOX_RING_BASE),
-       RING_TAIL(BLT_RING_BASE),
-       FORCEWAKE_BLITTER_GEN9,
-       FORCEWAKE_RENDER_GEN9,
-       FORCEWAKE_MEDIA_GEN9,
-       GEN6_RPNSWREQ,
-       GEN6_RC_VIDEO_FREQ,
-       /* TODO: Other registers are not yet used */
-};
-
-static bool is_gen9_shadowed(struct drm_i915_private *dev_priv,
-                            i915_reg_t reg)
-{
-       int i;
-       for (i = 0; i < ARRAY_SIZE(gen9_shadowed_regs); i++)
-               if (i915_mmio_reg_equal(reg, gen9_shadowed_regs[i]))
-                       return true;
-
-       return false;
-}
-
 #define __gen9_write(x) \
 static void \
 gen9_write##x(struct drm_i915_private *dev_priv, i915_reg_t reg, u##x val, \
                bool trace) { \
        enum forcewake_domains fw_engine; \
        GEN6_WRITE_HEADER; \
-       if (!SKL_NEEDS_FORCE_WAKE(offset) || \
-           is_gen9_shadowed(dev_priv, reg)) \
-               fw_engine = 0; \
-       else if (FORCEWAKE_GEN9_RENDER_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER; \
-       else if (FORCEWAKE_GEN9_MEDIA_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_MEDIA; \
-       else if (FORCEWAKE_GEN9_COMMON_RANGE_OFFSET(offset)) \
-               fw_engine = FORCEWAKE_RENDER | FORCEWAKE_MEDIA; \
-       else \
-               fw_engine = FORCEWAKE_BLITTER; \
+       fw_engine = __gen9_reg_write_fw_domains(offset); \
        if (fw_engine) \
-               __force_wake_get(dev_priv, fw_engine); \
+               __force_wake_auto(dev_priv, fw_engine); \
        __raw_i915_write##x(dev_priv, reg, val); \
        GEN6_WRITE_FOOTER; \
 }
@@ -1150,7 +1219,14 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
        d->i915 = dev_priv;
        d->id = domain_id;
 
-       setup_timer(&d->timer, intel_uncore_fw_release_timer, (unsigned long)d);
+       BUILD_BUG_ON(FORCEWAKE_RENDER != (1 << FW_DOMAIN_ID_RENDER));
+       BUILD_BUG_ON(FORCEWAKE_BLITTER != (1 << FW_DOMAIN_ID_BLITTER));
+       BUILD_BUG_ON(FORCEWAKE_MEDIA != (1 << FW_DOMAIN_ID_MEDIA));
+
+       d->mask = 1 << domain_id;
+
+       hrtimer_init(&d->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+       d->timer.function = intel_uncore_fw_release_timer;
 
        dev_priv->uncore.fw_domains |= (1 << domain_id);
 
@@ -1161,7 +1237,7 @@ static void intel_uncore_fw_domains_init(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
 
-       if (INTEL_INFO(dev_priv->dev)->gen <= 5)
+       if (INTEL_INFO(dev_priv)->gen <= 5)
                return;
 
        if (IS_GEN9(dev)) {
@@ -1257,7 +1333,7 @@ void intel_uncore_init(struct drm_device *dev)
 
        i915_check_vgpu(dev);
 
-       intel_uncore_ellc_detect(dev);
+       intel_uncore_edram_detect(dev_priv);
        intel_uncore_fw_domains_init(dev);
        __intel_uncore_early_sanitize(dev, false);
 
@@ -1437,7 +1513,7 @@ static int i915_reset_complete(struct drm_device *dev)
        return (gdrst & GRDOM_RESET_STATUS) == 0;
 }
 
-static int i915_do_reset(struct drm_device *dev)
+static int i915_do_reset(struct drm_device *dev, unsigned engine_mask)
 {
        /* assert reset for at least 20 usec */
        pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
@@ -1454,13 +1530,13 @@ static int g4x_reset_complete(struct drm_device *dev)
        return (gdrst & GRDOM_RESET_ENABLE) == 0;
 }
 
-static int g33_do_reset(struct drm_device *dev)
+static int g33_do_reset(struct drm_device *dev, unsigned engine_mask)
 {
        pci_write_config_byte(dev->pdev, I915_GDRST, GRDOM_RESET_ENABLE);
        return wait_for(g4x_reset_complete(dev), 500);
 }
 
-static int g4x_do_reset(struct drm_device *dev)
+static int g4x_do_reset(struct drm_device *dev, unsigned engine_mask)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
@@ -1490,7 +1566,7 @@ static int g4x_do_reset(struct drm_device *dev)
        return 0;
 }
 
-static int ironlake_do_reset(struct drm_device *dev)
+static int ironlake_do_reset(struct drm_device *dev, unsigned engine_mask)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
@@ -1514,75 +1590,132 @@ static int ironlake_do_reset(struct drm_device *dev)
        return 0;
 }
 
-static int gen6_do_reset(struct drm_device *dev)
+/* Reset the hardware domains (GENX_GRDOM_*) specified by mask */
+static int gen6_hw_domain_reset(struct drm_i915_private *dev_priv,
+                               u32 hw_domain_mask)
 {
-       struct drm_i915_private *dev_priv = dev->dev_private;
-       int     ret;
-
-       /* Reset the chip */
+       int ret;
 
        /* GEN6_GDRST is not in the gt power well, no need to check
         * for fifo space for the write or forcewake the chip for
         * the read
         */
-       __raw_i915_write32(dev_priv, GEN6_GDRST, GEN6_GRDOM_FULL);
+       __raw_i915_write32(dev_priv, GEN6_GDRST, hw_domain_mask);
+
+#define ACKED ((__raw_i915_read32(dev_priv, GEN6_GDRST) & hw_domain_mask) == 0)
+       /* Spin waiting for the device to ack the reset requests */
+       ret = wait_for(ACKED, 500);
+#undef ACKED
+
+       return ret;
+}
 
-       /* Spin waiting for the device to ack the reset request */
-       ret = wait_for((__raw_i915_read32(dev_priv, GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500);
+/**
+ * gen6_reset_engines - reset individual engines
+ * @dev: DRM device
+ * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
+ *
+ * This function will reset the individual engines that are set in engine_mask.
+ * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
+ *
+ * Note: It is responsibility of the caller to handle the difference between
+ * asking full domain reset versus reset for all available individual engines.
+ *
+ * Returns 0 on success, nonzero on error.
+ */
+static int gen6_reset_engines(struct drm_device *dev, unsigned engine_mask)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_engine_cs *engine;
+       const u32 hw_engine_mask[I915_NUM_ENGINES] = {
+               [RCS] = GEN6_GRDOM_RENDER,
+               [BCS] = GEN6_GRDOM_BLT,
+               [VCS] = GEN6_GRDOM_MEDIA,
+               [VCS2] = GEN8_GRDOM_MEDIA2,
+               [VECS] = GEN6_GRDOM_VECS,
+       };
+       u32 hw_mask;
+       int ret;
+
+       if (engine_mask == ALL_ENGINES) {
+               hw_mask = GEN6_GRDOM_FULL;
+       } else {
+               hw_mask = 0;
+               for_each_engine_masked(engine, dev_priv, engine_mask)
+                       hw_mask |= hw_engine_mask[engine->id];
+       }
+
+       ret = gen6_hw_domain_reset(dev_priv, hw_mask);
 
        intel_uncore_forcewake_reset(dev, true);
 
        return ret;
 }
 
-static int wait_for_register(struct drm_i915_private *dev_priv,
-                            i915_reg_t reg,
-                            const u32 mask,
-                            const u32 value,
-                            const unsigned long timeout_ms)
+static int wait_for_register_fw(struct drm_i915_private *dev_priv,
+                               i915_reg_t reg,
+                               const u32 mask,
+                               const u32 value,
+                               const unsigned long timeout_ms)
 {
-       return wait_for((I915_READ(reg) & mask) == value, timeout_ms);
+       return wait_for((I915_READ_FW(reg) & mask) == value, timeout_ms);
 }
 
-static int gen8_do_reset(struct drm_device *dev)
+static int gen8_request_engine_reset(struct intel_engine_cs *engine)
+{
+       int ret;
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+
+       I915_WRITE_FW(RING_RESET_CTL(engine->mmio_base),
+                     _MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET));
+
+       ret = wait_for_register_fw(dev_priv,
+                                  RING_RESET_CTL(engine->mmio_base),
+                                  RESET_CTL_READY_TO_RESET,
+                                  RESET_CTL_READY_TO_RESET,
+                                  700);
+       if (ret)
+               DRM_ERROR("%s: reset request timeout\n", engine->name);
+
+       return ret;
+}
+
+static void gen8_unrequest_engine_reset(struct intel_engine_cs *engine)
+{
+       struct drm_i915_private *dev_priv = engine->dev->dev_private;
+
+       I915_WRITE_FW(RING_RESET_CTL(engine->mmio_base),
+                     _MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
+}
+
+static int gen8_reset_engines(struct drm_device *dev, unsigned engine_mask)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_engine_cs *engine;
-       int i;
 
-       for_each_ring(engine, dev_priv, i) {
-               I915_WRITE(RING_RESET_CTL(engine->mmio_base),
-                          _MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET));
-
-               if (wait_for_register(dev_priv,
-                                     RING_RESET_CTL(engine->mmio_base),
-                                     RESET_CTL_READY_TO_RESET,
-                                     RESET_CTL_READY_TO_RESET,
-                                     700)) {
-                       DRM_ERROR("%s: reset request timeout\n", engine->name);
+       for_each_engine_masked(engine, dev_priv, engine_mask)
+               if (gen8_request_engine_reset(engine))
                        goto not_ready;
-               }
-       }
 
-       return gen6_do_reset(dev);
+       return gen6_reset_engines(dev, engine_mask);
 
 not_ready:
-       for_each_ring(engine, dev_priv, i)
-               I915_WRITE(RING_RESET_CTL(engine->mmio_base),
-                          _MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
+       for_each_engine_masked(engine, dev_priv, engine_mask)
+               gen8_unrequest_engine_reset(engine);
 
        return -EIO;
 }
 
-static int (*intel_get_gpu_reset(struct drm_device *dev))(struct drm_device *)
+static int (*intel_get_gpu_reset(struct drm_device *dev))(struct drm_device *,
+                                                         unsigned engine_mask)
 {
        if (!i915.reset)
                return NULL;
 
        if (INTEL_INFO(dev)->gen >= 8)
-               return gen8_do_reset;
+               return gen8_reset_engines;
        else if (INTEL_INFO(dev)->gen >= 6)
-               return gen6_do_reset;
+               return gen6_reset_engines;
        else if (IS_GEN5(dev))
                return ironlake_do_reset;
        else if (IS_G4X(dev))
@@ -1595,10 +1728,10 @@ static int (*intel_get_gpu_reset(struct drm_device *dev))(struct drm_device *)
                return NULL;
 }
 
-int intel_gpu_reset(struct drm_device *dev)
+int intel_gpu_reset(struct drm_device *dev, unsigned engine_mask)
 {
        struct drm_i915_private *dev_priv = to_i915(dev);
-       int (*reset)(struct drm_device *);
+       int (*reset)(struct drm_device *, unsigned);
        int ret;
 
        reset = intel_get_gpu_reset(dev);
@@ -1609,7 +1742,7 @@ int intel_gpu_reset(struct drm_device *dev)
         * request may be dropped and never completes (causing -EIO).
         */
        intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
-       ret = reset(dev);
+       ret = reset(dev, engine_mask);
        intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 
        return ret;
@@ -1620,6 +1753,25 @@ bool intel_has_gpu_reset(struct drm_device *dev)
        return intel_get_gpu_reset(dev) != NULL;
 }
 
+int intel_guc_reset(struct drm_i915_private *dev_priv)
+{
+       int ret;
+       unsigned long irqflags;
+
+       if (!i915.enable_guc_submission)
+               return -EINVAL;
+
+       intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
+       spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
+
+       ret = gen6_hw_domain_reset(dev_priv, GEN9_GRDOM_GUC);
+
+       spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
+       intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
+
+       return ret;
+}
+
 bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv)
 {
        return check_for_unclaimed_mmio(dev_priv);
@@ -1643,3 +1795,111 @@ intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv)
 
        return false;
 }
+
+static enum forcewake_domains
+intel_uncore_forcewake_for_read(struct drm_i915_private *dev_priv,
+                               i915_reg_t reg)
+{
+       enum forcewake_domains fw_domains;
+
+       if (intel_vgpu_active(dev_priv->dev))
+               return 0;
+
+       switch (INTEL_INFO(dev_priv)->gen) {
+       case 9:
+               fw_domains = __gen9_reg_read_fw_domains(i915_mmio_reg_offset(reg));
+               break;
+       case 8:
+               if (IS_CHERRYVIEW(dev_priv))
+                       fw_domains = __chv_reg_read_fw_domains(i915_mmio_reg_offset(reg));
+               else
+                       fw_domains = __gen6_reg_read_fw_domains(i915_mmio_reg_offset(reg));
+               break;
+       case 7:
+       case 6:
+               if (IS_VALLEYVIEW(dev_priv))
+                       fw_domains = __vlv_reg_read_fw_domains(i915_mmio_reg_offset(reg));
+               else
+                       fw_domains = __gen6_reg_read_fw_domains(i915_mmio_reg_offset(reg));
+               break;
+       default:
+               MISSING_CASE(INTEL_INFO(dev_priv)->gen);
+       case 5: /* forcewake was introduced with gen6 */
+       case 4:
+       case 3:
+       case 2:
+               return 0;
+       }
+
+       WARN_ON(fw_domains & ~dev_priv->uncore.fw_domains);
+
+       return fw_domains;
+}
+
+static enum forcewake_domains
+intel_uncore_forcewake_for_write(struct drm_i915_private *dev_priv,
+                                i915_reg_t reg)
+{
+       enum forcewake_domains fw_domains;
+
+       if (intel_vgpu_active(dev_priv->dev))
+               return 0;
+
+       switch (INTEL_INFO(dev_priv)->gen) {
+       case 9:
+               fw_domains = __gen9_reg_write_fw_domains(i915_mmio_reg_offset(reg));
+               break;
+       case 8:
+               if (IS_CHERRYVIEW(dev_priv))
+                       fw_domains = __chv_reg_write_fw_domains(i915_mmio_reg_offset(reg));
+               else
+                       fw_domains = __gen8_reg_write_fw_domains(i915_mmio_reg_offset(reg));
+               break;
+       case 7:
+       case 6:
+               fw_domains = FORCEWAKE_RENDER;
+               break;
+       default:
+               MISSING_CASE(INTEL_INFO(dev_priv)->gen);
+       case 5:
+       case 4:
+       case 3:
+       case 2:
+               return 0;
+       }
+
+       WARN_ON(fw_domains & ~dev_priv->uncore.fw_domains);
+
+       return fw_domains;
+}
+
+/**
+ * intel_uncore_forcewake_for_reg - which forcewake domains are needed to access
+ *                                 a register
+ * @dev_priv: pointer to struct drm_i915_private
+ * @reg: register in question
+ * @op: operation bitmask of FW_REG_READ and/or FW_REG_WRITE
+ *
+ * Returns a set of forcewake domains required to be taken with for example
+ * intel_uncore_forcewake_get for the specified register to be accessible in the
+ * specified mode (read, write or read/write) with raw mmio accessors.
+ *
+ * NOTE: On Gen6 and Gen7 write forcewake domain (FORCEWAKE_RENDER) requires the
+ * callers to do FIFO management on their own or risk losing writes.
+ */
+enum forcewake_domains
+intel_uncore_forcewake_for_reg(struct drm_i915_private *dev_priv,
+                              i915_reg_t reg, unsigned int op)
+{
+       enum forcewake_domains fw_domains = 0;
+
+       WARN_ON(!op);
+
+       if (op & FW_REG_READ)
+               fw_domains = intel_uncore_forcewake_for_read(dev_priv, reg);
+
+       if (op & FW_REG_WRITE)
+               fw_domains |= intel_uncore_forcewake_for_write(dev_priv, reg);
+
+       return fw_domains;
+}
diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h
new file mode 100644 (file)
index 0000000..9ff1e96
--- /dev/null
@@ -0,0 +1,832 @@
+/*
+ * Copyright © 2006-2016 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:
+ *    Eric Anholt <eric@anholt.net>
+ *
+ */
+
+/*
+ * This information is private to VBT parsing in intel_bios.c.
+ *
+ * Please do NOT include anywhere else.
+ */
+#ifndef _INTEL_BIOS_PRIVATE
+#error "intel_vbt_defs.h is private to intel_bios.c"
+#endif
+
+#ifndef _INTEL_VBT_DEFS_H_
+#define _INTEL_VBT_DEFS_H_
+
+#include "intel_bios.h"
+
+/**
+ * struct vbt_header - VBT Header structure
+ * @signature:         VBT signature, always starts with "$VBT"
+ * @version:           Version of this structure
+ * @header_size:       Size of this structure
+ * @vbt_size:          Size of VBT (VBT Header, BDB Header and data blocks)
+ * @vbt_checksum:      Checksum
+ * @reserved0:         Reserved
+ * @bdb_offset:                Offset of &struct bdb_header from beginning of VBT
+ * @aim_offset:                Offsets of add-in data blocks from beginning of VBT
+ */
+struct vbt_header {
+       u8 signature[20];
+       u16 version;
+       u16 header_size;
+       u16 vbt_size;
+       u8 vbt_checksum;
+       u8 reserved0;
+       u32 bdb_offset;
+       u32 aim_offset[4];
+} __packed;
+
+/**
+ * struct bdb_header - BDB Header structure
+ * @signature:         BDB signature "BIOS_DATA_BLOCK"
+ * @version:           Version of the data block definitions
+ * @header_size:       Size of this structure
+ * @bdb_size:          Size of BDB (BDB Header and data blocks)
+ */
+struct bdb_header {
+       u8 signature[16];
+       u16 version;
+       u16 header_size;
+       u16 bdb_size;
+} __packed;
+
+/* strictly speaking, this is a "skip" block, but it has interesting info */
+struct vbios_data {
+       u8 type; /* 0 == desktop, 1 == mobile */
+       u8 relstage;
+       u8 chipset;
+       u8 lvds_present:1;
+       u8 tv_present:1;
+       u8 rsvd2:6; /* finish byte */
+       u8 rsvd3[4];
+       u8 signon[155];
+       u8 copyright[61];
+       u16 code_segment;
+       u8 dos_boot_mode;
+       u8 bandwidth_percent;
+       u8 rsvd4; /* popup memory size */
+       u8 resize_pci_bios;
+       u8 rsvd5; /* is crt already on ddc2 */
+} __packed;
+
+/*
+ * There are several types of BIOS data blocks (BDBs), each block has
+ * an ID and size in the first 3 bytes (ID in first, size in next 2).
+ * Known types are listed below.
+ */
+#define BDB_GENERAL_FEATURES     1
+#define BDB_GENERAL_DEFINITIONS          2
+#define BDB_OLD_TOGGLE_LIST      3
+#define BDB_MODE_SUPPORT_LIST    4
+#define BDB_GENERIC_MODE_TABLE   5
+#define BDB_EXT_MMIO_REGS        6
+#define BDB_SWF_IO               7
+#define BDB_SWF_MMIO             8
+#define BDB_PSR                          9
+#define BDB_MODE_REMOVAL_TABLE  10
+#define BDB_CHILD_DEVICE_TABLE  11
+#define BDB_DRIVER_FEATURES     12
+#define BDB_DRIVER_PERSISTENCE  13
+#define BDB_EXT_TABLE_PTRS      14
+#define BDB_DOT_CLOCK_OVERRIDE  15
+#define BDB_DISPLAY_SELECT      16
+/* 17 rsvd */
+#define BDB_DRIVER_ROTATION     18
+#define BDB_DISPLAY_REMOVE      19
+#define BDB_OEM_CUSTOM          20
+#define BDB_EFP_LIST            21 /* workarounds for VGA hsync/vsync */
+#define BDB_SDVO_LVDS_OPTIONS   22
+#define BDB_SDVO_PANEL_DTDS     23
+#define BDB_SDVO_LVDS_PNP_IDS   24
+#define BDB_SDVO_LVDS_POWER_SEQ         25
+#define BDB_TV_OPTIONS          26
+#define BDB_EDP                         27
+#define BDB_LVDS_OPTIONS        40
+#define BDB_LVDS_LFP_DATA_PTRS  41
+#define BDB_LVDS_LFP_DATA       42
+#define BDB_LVDS_BACKLIGHT      43
+#define BDB_LVDS_POWER          44
+#define BDB_MIPI_CONFIG                 52
+#define BDB_MIPI_SEQUENCE       53
+#define BDB_SKIP               254 /* VBIOS private block, ignore */
+
+struct bdb_general_features {
+        /* bits 1 */
+       u8 panel_fitting:2;
+       u8 flexaim:1;
+       u8 msg_enable:1;
+       u8 clear_screen:3;
+       u8 color_flip:1;
+
+        /* bits 2 */
+       u8 download_ext_vbt:1;
+       u8 enable_ssc:1;
+       u8 ssc_freq:1;
+       u8 enable_lfp_on_override:1;
+       u8 disable_ssc_ddt:1;
+       u8 rsvd7:1;
+       u8 display_clock_mode:1;
+       u8 rsvd8:1; /* finish byte */
+
+        /* bits 3 */
+       u8 disable_smooth_vision:1;
+       u8 single_dvi:1;
+       u8 rsvd9:1;
+       u8 fdi_rx_polarity_inverted:1;
+       u8 rsvd10:4; /* finish byte */
+
+        /* bits 4 */
+       u8 legacy_monitor_detect;
+
+        /* bits 5 */
+       u8 int_crt_support:1;
+       u8 int_tv_support:1;
+       u8 int_efp_support:1;
+       u8 dp_ssc_enb:1;        /* PCH attached eDP supports SSC */
+       u8 dp_ssc_freq:1;       /* SSC freq for PCH attached eDP */
+       u8 rsvd11:3; /* finish byte */
+} __packed;
+
+/* pre-915 */
+#define GPIO_PIN_DVI_LVDS      0x03 /* "DVI/LVDS DDC GPIO pins" */
+#define GPIO_PIN_ADD_I2C       0x05 /* "ADDCARD I2C GPIO pins" */
+#define GPIO_PIN_ADD_DDC       0x04 /* "ADDCARD DDC GPIO pins" */
+#define GPIO_PIN_ADD_DDC_I2C   0x06 /* "ADDCARD DDC/I2C GPIO pins" */
+
+/* Pre 915 */
+#define DEVICE_TYPE_NONE       0x00
+#define DEVICE_TYPE_CRT                0x01
+#define DEVICE_TYPE_TV         0x09
+#define DEVICE_TYPE_EFP                0x12
+#define DEVICE_TYPE_LFP                0x22
+/* On 915+ */
+#define DEVICE_TYPE_CRT_DPMS           0x6001
+#define DEVICE_TYPE_CRT_DPMS_HOTPLUG   0x4001
+#define DEVICE_TYPE_TV_COMPOSITE       0x0209
+#define DEVICE_TYPE_TV_MACROVISION     0x0289
+#define DEVICE_TYPE_TV_RF_COMPOSITE    0x020c
+#define DEVICE_TYPE_TV_SVIDEO_COMPOSITE        0x0609
+#define DEVICE_TYPE_TV_SCART           0x0209
+#define DEVICE_TYPE_TV_CODEC_HOTPLUG_PWR 0x6009
+#define DEVICE_TYPE_EFP_HOTPLUG_PWR    0x6012
+#define DEVICE_TYPE_EFP_DVI_HOTPLUG_PWR        0x6052
+#define DEVICE_TYPE_EFP_DVI_I          0x6053
+#define DEVICE_TYPE_EFP_DVI_D_DUAL     0x6152
+#define DEVICE_TYPE_EFP_DVI_D_HDCP     0x60d2
+#define DEVICE_TYPE_OPENLDI_HOTPLUG_PWR        0x6062
+#define DEVICE_TYPE_OPENLDI_DUALPIX    0x6162
+#define DEVICE_TYPE_LFP_PANELLINK      0x5012
+#define DEVICE_TYPE_LFP_CMOS_PWR       0x5042
+#define DEVICE_TYPE_LFP_LVDS_PWR       0x5062
+#define DEVICE_TYPE_LFP_LVDS_DUAL      0x5162
+#define DEVICE_TYPE_LFP_LVDS_DUAL_HDCP 0x51e2
+
+#define DEVICE_CFG_NONE                0x00
+#define DEVICE_CFG_12BIT_DVOB  0x01
+#define DEVICE_CFG_12BIT_DVOC  0x02
+#define DEVICE_CFG_24BIT_DVOBC 0x09
+#define DEVICE_CFG_24BIT_DVOCB 0x0a
+#define DEVICE_CFG_DUAL_DVOB   0x11
+#define DEVICE_CFG_DUAL_DVOC   0x12
+#define DEVICE_CFG_DUAL_DVOBC  0x13
+#define DEVICE_CFG_DUAL_LINK_DVOBC     0x19
+#define DEVICE_CFG_DUAL_LINK_DVOCB     0x1a
+
+#define DEVICE_WIRE_NONE       0x00
+#define DEVICE_WIRE_DVOB       0x01
+#define DEVICE_WIRE_DVOC       0x02
+#define DEVICE_WIRE_DVOBC      0x03
+#define DEVICE_WIRE_DVOBB      0x05
+#define DEVICE_WIRE_DVOCC      0x06
+#define DEVICE_WIRE_DVOB_MASTER 0x0d
+#define DEVICE_WIRE_DVOC_MASTER 0x0e
+
+#define DEVICE_PORT_DVOA       0x00 /* none on 845+ */
+#define DEVICE_PORT_DVOB       0x01
+#define DEVICE_PORT_DVOC       0x02
+
+/*
+ * We used to keep this struct but without any version control. We should avoid
+ * using it in the future, but it should be safe to keep using it in the old
+ * code. Do not change; we rely on its size.
+ */
+struct old_child_dev_config {
+       u16 handle;
+       u16 device_type;
+       u8  device_id[10]; /* ascii string */
+       u16 addin_offset;
+       u8  dvo_port; /* See Device_PORT_* above */
+       u8  i2c_pin;
+       u8  slave_addr;
+       u8  ddc_pin;
+       u16 edid_ptr;
+       u8  dvo_cfg; /* See DEVICE_CFG_* above */
+       u8  dvo2_port;
+       u8  i2c2_pin;
+       u8  slave2_addr;
+       u8  ddc2_pin;
+       u8  capabilities;
+       u8  dvo_wiring;/* See DEVICE_WIRE_* above */
+       u8  dvo2_wiring;
+       u16 extended_type;
+       u8  dvo_function;
+} __packed;
+
+/* This one contains field offsets that are known to be common for all BDB
+ * versions. Notice that the meaning of the contents contents may still change,
+ * but at least the offsets are consistent. */
+
+struct common_child_dev_config {
+       u16 handle;
+       u16 device_type;
+       u8 not_common1[12];
+       u8 dvo_port;
+       u8 not_common2[2];
+       u8 ddc_pin;
+       u16 edid_ptr;
+       u8 dvo_cfg; /* See DEVICE_CFG_* above */
+       u8 efp_routed:1;
+       u8 lane_reversal:1;
+       u8 lspcon:1;
+       u8 iboost:1;
+       u8 hpd_invert:1;
+       u8 flag_reserved:3;
+       u8 hdmi_support:1;
+       u8 dp_support:1;
+       u8 tmds_support:1;
+       u8 support_reserved:5;
+       u8 not_common3[12];
+       u8 iboost_level;
+} __packed;
+
+
+/* This field changes depending on the BDB version, so the most reliable way to
+ * read it is by checking the BDB version and reading the raw pointer. */
+union child_device_config {
+       /* This one is safe to be used anywhere, but the code should still check
+        * the BDB version. */
+       u8 raw[33];
+       /* This one should only be kept for legacy code. */
+       struct old_child_dev_config old;
+       /* This one should also be safe to use anywhere, even without version
+        * checks. */
+       struct common_child_dev_config common;
+} __packed;
+
+struct bdb_general_definitions {
+       /* DDC GPIO */
+       u8 crt_ddc_gmbus_pin;
+
+       /* DPMS bits */
+       u8 dpms_acpi:1;
+       u8 skip_boot_crt_detect:1;
+       u8 dpms_aim:1;
+       u8 rsvd1:5; /* finish byte */
+
+       /* boot device bits */
+       u8 boot_display[2];
+       u8 child_dev_size;
+
+       /*
+        * Device info:
+        * If TV is present, it'll be at devices[0].
+        * LVDS will be next, either devices[0] or [1], if present.
+        * On some platforms the number of device is 6. But could be as few as
+        * 4 if both TV and LVDS are missing.
+        * And the device num is related with the size of general definition
+        * block. It is obtained by using the following formula:
+        * number = (block_size - sizeof(bdb_general_definitions))/
+        *           defs->child_dev_size;
+        */
+       uint8_t devices[0];
+} __packed;
+
+/* Mask for DRRS / Panel Channel / SSC / BLT control bits extraction */
+#define MODE_MASK              0x3
+
+struct bdb_lvds_options {
+       u8 panel_type;
+       u8 rsvd1;
+       /* LVDS capabilities, stored in a dword */
+       u8 pfit_mode:2;
+       u8 pfit_text_mode_enhanced:1;
+       u8 pfit_gfx_mode_enhanced:1;
+       u8 pfit_ratio_auto:1;
+       u8 pixel_dither:1;
+       u8 lvds_edid:1;
+       u8 rsvd2:1;
+       u8 rsvd4;
+       /* LVDS Panel channel bits stored here */
+       u32 lvds_panel_channel_bits;
+       /* LVDS SSC (Spread Spectrum Clock) bits stored here. */
+       u16 ssc_bits;
+       u16 ssc_freq;
+       u16 ssc_ddt;
+       /* Panel color depth defined here */
+       u16 panel_color_depth;
+       /* LVDS panel type bits stored here */
+       u32 dps_panel_type_bits;
+       /* LVDS backlight control type bits stored here */
+       u32 blt_control_type_bits;
+} __packed;
+
+/* LFP pointer table contains entries to the struct below */
+struct bdb_lvds_lfp_data_ptr {
+       u16 fp_timing_offset; /* offsets are from start of bdb */
+       u8 fp_table_size;
+       u16 dvo_timing_offset;
+       u8 dvo_table_size;
+       u16 panel_pnp_id_offset;
+       u8 pnp_table_size;
+} __packed;
+
+struct bdb_lvds_lfp_data_ptrs {
+       u8 lvds_entries; /* followed by one or more lvds_data_ptr structs */
+       struct bdb_lvds_lfp_data_ptr ptr[16];
+} __packed;
+
+/* LFP data has 3 blocks per entry */
+struct lvds_fp_timing {
+       u16 x_res;
+       u16 y_res;
+       u32 lvds_reg;
+       u32 lvds_reg_val;
+       u32 pp_on_reg;
+       u32 pp_on_reg_val;
+       u32 pp_off_reg;
+       u32 pp_off_reg_val;
+       u32 pp_cycle_reg;
+       u32 pp_cycle_reg_val;
+       u32 pfit_reg;
+       u32 pfit_reg_val;
+       u16 terminator;
+} __packed;
+
+struct lvds_dvo_timing {
+       u16 clock;              /**< In 10khz */
+       u8 hactive_lo;
+       u8 hblank_lo;
+       u8 hblank_hi:4;
+       u8 hactive_hi:4;
+       u8 vactive_lo;
+       u8 vblank_lo;
+       u8 vblank_hi:4;
+       u8 vactive_hi:4;
+       u8 hsync_off_lo;
+       u8 hsync_pulse_width;
+       u8 vsync_pulse_width:4;
+       u8 vsync_off:4;
+       u8 rsvd0:6;
+       u8 hsync_off_hi:2;
+       u8 h_image;
+       u8 v_image;
+       u8 max_hv;
+       u8 h_border;
+       u8 v_border;
+       u8 rsvd1:3;
+       u8 digital:2;
+       u8 vsync_positive:1;
+       u8 hsync_positive:1;
+       u8 rsvd2:1;
+} __packed;
+
+struct lvds_pnp_id {
+       u16 mfg_name;
+       u16 product_code;
+       u32 serial;
+       u8 mfg_week;
+       u8 mfg_year;
+} __packed;
+
+struct bdb_lvds_lfp_data_entry {
+       struct lvds_fp_timing fp_timing;
+       struct lvds_dvo_timing dvo_timing;
+       struct lvds_pnp_id pnp_id;
+} __packed;
+
+struct bdb_lvds_lfp_data {
+       struct bdb_lvds_lfp_data_entry data[16];
+} __packed;
+
+#define BDB_BACKLIGHT_TYPE_NONE        0
+#define BDB_BACKLIGHT_TYPE_PWM 2
+
+struct bdb_lfp_backlight_data_entry {
+       u8 type:2;
+       u8 active_low_pwm:1;
+       u8 obsolete1:5;
+       u16 pwm_freq_hz;
+       u8 min_brightness;
+       u8 obsolete2;
+       u8 obsolete3;
+} __packed;
+
+struct bdb_lfp_backlight_data {
+       u8 entry_size;
+       struct bdb_lfp_backlight_data_entry data[16];
+       u8 level[16];
+} __packed;
+
+struct aimdb_header {
+       char signature[16];
+       char oem_device[20];
+       u16 aimdb_version;
+       u16 aimdb_header_size;
+       u16 aimdb_size;
+} __packed;
+
+struct aimdb_block {
+       u8 aimdb_id;
+       u16 aimdb_size;
+} __packed;
+
+struct vch_panel_data {
+       u16 fp_timing_offset;
+       u8 fp_timing_size;
+       u16 dvo_timing_offset;
+       u8 dvo_timing_size;
+       u16 text_fitting_offset;
+       u8 text_fitting_size;
+       u16 graphics_fitting_offset;
+       u8 graphics_fitting_size;
+} __packed;
+
+struct vch_bdb_22 {
+       struct aimdb_block aimdb_block;
+       struct vch_panel_data panels[16];
+} __packed;
+
+struct bdb_sdvo_lvds_options {
+       u8 panel_backlight;
+       u8 h40_set_panel_type;
+       u8 panel_type;
+       u8 ssc_clk_freq;
+       u16 als_low_trip;
+       u16 als_high_trip;
+       u8 sclalarcoeff_tab_row_num;
+       u8 sclalarcoeff_tab_row_size;
+       u8 coefficient[8];
+       u8 panel_misc_bits_1;
+       u8 panel_misc_bits_2;
+       u8 panel_misc_bits_3;
+       u8 panel_misc_bits_4;
+} __packed;
+
+
+#define BDB_DRIVER_FEATURE_NO_LVDS             0
+#define BDB_DRIVER_FEATURE_INT_LVDS            1
+#define BDB_DRIVER_FEATURE_SDVO_LVDS           2
+#define BDB_DRIVER_FEATURE_EDP                 3
+
+struct bdb_driver_features {
+       u8 boot_dev_algorithm:1;
+       u8 block_display_switch:1;
+       u8 allow_display_switch:1;
+       u8 hotplug_dvo:1;
+       u8 dual_view_zoom:1;
+       u8 int15h_hook:1;
+       u8 sprite_in_clone:1;
+       u8 primary_lfp_id:1;
+
+       u16 boot_mode_x;
+       u16 boot_mode_y;
+       u8 boot_mode_bpp;
+       u8 boot_mode_refresh;
+
+       u16 enable_lfp_primary:1;
+       u16 selective_mode_pruning:1;
+       u16 dual_frequency:1;
+       u16 render_clock_freq:1; /* 0: high freq; 1: low freq */
+       u16 nt_clone_support:1;
+       u16 power_scheme_ui:1; /* 0: CUI; 1: 3rd party */
+       u16 sprite_display_assign:1; /* 0: secondary; 1: primary */
+       u16 cui_aspect_scaling:1;
+       u16 preserve_aspect_ratio:1;
+       u16 sdvo_device_power_down:1;
+       u16 crt_hotplug:1;
+       u16 lvds_config:2;
+       u16 tv_hotplug:1;
+       u16 hdmi_config:2;
+
+       u8 static_display:1;
+       u8 reserved2:7;
+       u16 legacy_crt_max_x;
+       u16 legacy_crt_max_y;
+       u8 legacy_crt_max_refresh;
+
+       u8 hdmi_termination;
+       u8 custom_vbt_version;
+       /* Driver features data block */
+       u16 rmpm_enabled:1;
+       u16 s2ddt_enabled:1;
+       u16 dpst_enabled:1;
+       u16 bltclt_enabled:1;
+       u16 adb_enabled:1;
+       u16 drrs_enabled:1;
+       u16 grs_enabled:1;
+       u16 gpmt_enabled:1;
+       u16 tbt_enabled:1;
+       u16 psr_enabled:1;
+       u16 ips_enabled:1;
+       u16 reserved3:4;
+       u16 pc_feature_valid:1;
+} __packed;
+
+#define EDP_18BPP      0
+#define EDP_24BPP      1
+#define EDP_30BPP      2
+#define EDP_RATE_1_62  0
+#define EDP_RATE_2_7   1
+#define EDP_LANE_1     0
+#define EDP_LANE_2     1
+#define EDP_LANE_4     3
+#define EDP_PREEMPHASIS_NONE   0
+#define EDP_PREEMPHASIS_3_5dB  1
+#define EDP_PREEMPHASIS_6dB    2
+#define EDP_PREEMPHASIS_9_5dB  3
+#define EDP_VSWING_0_4V                0
+#define EDP_VSWING_0_6V                1
+#define EDP_VSWING_0_8V                2
+#define EDP_VSWING_1_2V                3
+
+
+struct edp_link_params {
+       u8 rate:4;
+       u8 lanes:4;
+       u8 preemphasis:4;
+       u8 vswing:4;
+} __packed;
+
+struct bdb_edp {
+       struct edp_power_seq power_seqs[16];
+       u32 color_depth;
+       struct edp_link_params link_params[16];
+       u32 sdrrs_msa_timing_delay;
+
+       /* ith bit indicates enabled/disabled for (i+1)th panel */
+       u16 edp_s3d_feature;
+       u16 edp_t3_optimization;
+       u64 edp_vswing_preemph;         /* v173 */
+} __packed;
+
+struct psr_table {
+       /* Feature bits */
+       u8 full_link:1;
+       u8 require_aux_to_wakeup:1;
+       u8 feature_bits_rsvd:6;
+
+       /* Wait times */
+       u8 idle_frames:4;
+       u8 lines_to_wait:3;
+       u8 wait_times_rsvd:1;
+
+       /* TP wake up time in multiple of 100 */
+       u16 tp1_wakeup_time;
+       u16 tp2_tp3_wakeup_time;
+} __packed;
+
+struct bdb_psr {
+       struct psr_table psr_table[16];
+} __packed;
+
+/*
+ * Driver<->VBIOS interaction occurs through scratch bits in
+ * GR18 & SWF*.
+ */
+
+/* GR18 bits are set on display switch and hotkey events */
+#define GR18_DRIVER_SWITCH_EN  (1<<7) /* 0: VBIOS control, 1: driver control */
+#define GR18_HOTKEY_MASK       0x78 /* See also SWF4 15:0 */
+#define   GR18_HK_NONE         (0x0<<3)
+#define   GR18_HK_LFP_STRETCH  (0x1<<3)
+#define   GR18_HK_TOGGLE_DISP  (0x2<<3)
+#define   GR18_HK_DISP_SWITCH  (0x4<<3) /* see SWF14 15:0 for what to enable */
+#define   GR18_HK_POPUP_DISABLED (0x6<<3)
+#define   GR18_HK_POPUP_ENABLED        (0x7<<3)
+#define   GR18_HK_PFIT         (0x8<<3)
+#define   GR18_HK_APM_CHANGE   (0xa<<3)
+#define   GR18_HK_MULTIPLE     (0xc<<3)
+#define GR18_USER_INT_EN       (1<<2)
+#define GR18_A0000_FLUSH_EN    (1<<1)
+#define GR18_SMM_EN            (1<<0)
+
+/* Set by driver, cleared by VBIOS */
+#define SWF00_YRES_SHIFT       16
+#define SWF00_XRES_SHIFT       0
+#define SWF00_RES_MASK         0xffff
+
+/* Set by VBIOS at boot time and driver at runtime */
+#define SWF01_TV2_FORMAT_SHIFT 8
+#define SWF01_TV1_FORMAT_SHIFT 0
+#define SWF01_TV_FORMAT_MASK   0xffff
+
+#define SWF10_VBIOS_BLC_I2C_EN (1<<29)
+#define SWF10_GTT_OVERRIDE_EN  (1<<28)
+#define SWF10_LFP_DPMS_OVR     (1<<27) /* override DPMS on display switch */
+#define SWF10_ACTIVE_TOGGLE_LIST_MASK (7<<24)
+#define   SWF10_OLD_TOGGLE     0x0
+#define   SWF10_TOGGLE_LIST_1  0x1
+#define   SWF10_TOGGLE_LIST_2  0x2
+#define   SWF10_TOGGLE_LIST_3  0x3
+#define   SWF10_TOGGLE_LIST_4  0x4
+#define SWF10_PANNING_EN       (1<<23)
+#define SWF10_DRIVER_LOADED    (1<<22)
+#define SWF10_EXTENDED_DESKTOP (1<<21)
+#define SWF10_EXCLUSIVE_MODE   (1<<20)
+#define SWF10_OVERLAY_EN       (1<<19)
+#define SWF10_PLANEB_HOLDOFF   (1<<18)
+#define SWF10_PLANEA_HOLDOFF   (1<<17)
+#define SWF10_VGA_HOLDOFF      (1<<16)
+#define SWF10_ACTIVE_DISP_MASK 0xffff
+#define   SWF10_PIPEB_LFP2     (1<<15)
+#define   SWF10_PIPEB_EFP2     (1<<14)
+#define   SWF10_PIPEB_TV2      (1<<13)
+#define   SWF10_PIPEB_CRT2     (1<<12)
+#define   SWF10_PIPEB_LFP      (1<<11)
+#define   SWF10_PIPEB_EFP      (1<<10)
+#define   SWF10_PIPEB_TV       (1<<9)
+#define   SWF10_PIPEB_CRT      (1<<8)
+#define   SWF10_PIPEA_LFP2     (1<<7)
+#define   SWF10_PIPEA_EFP2     (1<<6)
+#define   SWF10_PIPEA_TV2      (1<<5)
+#define   SWF10_PIPEA_CRT2     (1<<4)
+#define   SWF10_PIPEA_LFP      (1<<3)
+#define   SWF10_PIPEA_EFP      (1<<2)
+#define   SWF10_PIPEA_TV       (1<<1)
+#define   SWF10_PIPEA_CRT      (1<<0)
+
+#define SWF11_MEMORY_SIZE_SHIFT        16
+#define SWF11_SV_TEST_EN       (1<<15)
+#define SWF11_IS_AGP           (1<<14)
+#define SWF11_DISPLAY_HOLDOFF  (1<<13)
+#define SWF11_DPMS_REDUCED     (1<<12)
+#define SWF11_IS_VBE_MODE      (1<<11)
+#define SWF11_PIPEB_ACCESS     (1<<10) /* 0 here means pipe a */
+#define SWF11_DPMS_MASK                0x07
+#define   SWF11_DPMS_OFF       (1<<2)
+#define   SWF11_DPMS_SUSPEND   (1<<1)
+#define   SWF11_DPMS_STANDBY   (1<<0)
+#define   SWF11_DPMS_ON                0
+
+#define SWF14_GFX_PFIT_EN      (1<<31)
+#define SWF14_TEXT_PFIT_EN     (1<<30)
+#define SWF14_LID_STATUS_CLOSED        (1<<29) /* 0 here means open */
+#define SWF14_POPUP_EN         (1<<28)
+#define SWF14_DISPLAY_HOLDOFF  (1<<27)
+#define SWF14_DISP_DETECT_EN   (1<<26)
+#define SWF14_DOCKING_STATUS_DOCKED (1<<25) /* 0 here means undocked */
+#define SWF14_DRIVER_STATUS    (1<<24)
+#define SWF14_OS_TYPE_WIN9X    (1<<23)
+#define SWF14_OS_TYPE_WINNT    (1<<22)
+/* 21:19 rsvd */
+#define SWF14_PM_TYPE_MASK     0x00070000
+#define   SWF14_PM_ACPI_VIDEO  (0x4 << 16)
+#define   SWF14_PM_ACPI                (0x3 << 16)
+#define   SWF14_PM_APM_12      (0x2 << 16)
+#define   SWF14_PM_APM_11      (0x1 << 16)
+#define SWF14_HK_REQUEST_MASK  0x0000ffff /* see GR18 6:3 for event type */
+          /* if GR18 indicates a display switch */
+#define   SWF14_DS_PIPEB_LFP2_EN (1<<15)
+#define   SWF14_DS_PIPEB_EFP2_EN (1<<14)
+#define   SWF14_DS_PIPEB_TV2_EN  (1<<13)
+#define   SWF14_DS_PIPEB_CRT2_EN (1<<12)
+#define   SWF14_DS_PIPEB_LFP_EN  (1<<11)
+#define   SWF14_DS_PIPEB_EFP_EN  (1<<10)
+#define   SWF14_DS_PIPEB_TV_EN   (1<<9)
+#define   SWF14_DS_PIPEB_CRT_EN  (1<<8)
+#define   SWF14_DS_PIPEA_LFP2_EN (1<<7)
+#define   SWF14_DS_PIPEA_EFP2_EN (1<<6)
+#define   SWF14_DS_PIPEA_TV2_EN  (1<<5)
+#define   SWF14_DS_PIPEA_CRT2_EN (1<<4)
+#define   SWF14_DS_PIPEA_LFP_EN  (1<<3)
+#define   SWF14_DS_PIPEA_EFP_EN  (1<<2)
+#define   SWF14_DS_PIPEA_TV_EN   (1<<1)
+#define   SWF14_DS_PIPEA_CRT_EN  (1<<0)
+          /* if GR18 indicates a panel fitting request */
+#define   SWF14_PFIT_EN                (1<<0) /* 0 means disable */
+          /* if GR18 indicates an APM change request */
+#define   SWF14_APM_HIBERNATE  0x4
+#define   SWF14_APM_SUSPEND    0x3
+#define   SWF14_APM_STANDBY    0x1
+#define   SWF14_APM_RESTORE    0x0
+
+/* Add the device class for LFP, TV, HDMI */
+#define         DEVICE_TYPE_INT_LFP    0x1022
+#define         DEVICE_TYPE_INT_TV     0x1009
+#define         DEVICE_TYPE_HDMI       0x60D2
+#define         DEVICE_TYPE_DP         0x68C6
+#define         DEVICE_TYPE_eDP        0x78C6
+
+#define  DEVICE_TYPE_CLASS_EXTENSION   (1 << 15)
+#define  DEVICE_TYPE_POWER_MANAGEMENT  (1 << 14)
+#define  DEVICE_TYPE_HOTPLUG_SIGNALING (1 << 13)
+#define  DEVICE_TYPE_INTERNAL_CONNECTOR        (1 << 12)
+#define  DEVICE_TYPE_NOT_HDMI_OUTPUT   (1 << 11)
+#define  DEVICE_TYPE_MIPI_OUTPUT       (1 << 10)
+#define  DEVICE_TYPE_COMPOSITE_OUTPUT  (1 << 9)
+#define  DEVICE_TYPE_DUAL_CHANNEL      (1 << 8)
+#define  DEVICE_TYPE_HIGH_SPEED_LINK   (1 << 6)
+#define  DEVICE_TYPE_LVDS_SINGALING    (1 << 5)
+#define  DEVICE_TYPE_TMDS_DVI_SIGNALING        (1 << 4)
+#define  DEVICE_TYPE_VIDEO_SIGNALING   (1 << 3)
+#define  DEVICE_TYPE_DISPLAYPORT_OUTPUT        (1 << 2)
+#define  DEVICE_TYPE_DIGITAL_OUTPUT    (1 << 1)
+#define  DEVICE_TYPE_ANALOG_OUTPUT     (1 << 0)
+
+/*
+ * Bits we care about when checking for DEVICE_TYPE_eDP
+ * Depending on the system, the other bits may or may not
+ * be set for eDP outputs.
+ */
+#define DEVICE_TYPE_eDP_BITS \
+       (DEVICE_TYPE_INTERNAL_CONNECTOR | \
+        DEVICE_TYPE_MIPI_OUTPUT | \
+        DEVICE_TYPE_COMPOSITE_OUTPUT | \
+        DEVICE_TYPE_DUAL_CHANNEL | \
+        DEVICE_TYPE_LVDS_SINGALING | \
+        DEVICE_TYPE_TMDS_DVI_SIGNALING | \
+        DEVICE_TYPE_VIDEO_SIGNALING | \
+        DEVICE_TYPE_DISPLAYPORT_OUTPUT | \
+        DEVICE_TYPE_ANALOG_OUTPUT)
+
+/* define the DVO port for HDMI output type */
+#define                DVO_B           1
+#define                DVO_C           2
+#define                DVO_D           3
+
+/* Possible values for the "DVO Port" field for versions >= 155: */
+#define DVO_PORT_HDMIA 0
+#define DVO_PORT_HDMIB 1
+#define DVO_PORT_HDMIC 2
+#define DVO_PORT_HDMID 3
+#define DVO_PORT_LVDS  4
+#define DVO_PORT_TV    5
+#define DVO_PORT_CRT   6
+#define DVO_PORT_DPB   7
+#define DVO_PORT_DPC   8
+#define DVO_PORT_DPD   9
+#define DVO_PORT_DPA   10
+#define DVO_PORT_DPE   11
+#define DVO_PORT_HDMIE 12
+#define DVO_PORT_MIPIA 21
+#define DVO_PORT_MIPIB 22
+#define DVO_PORT_MIPIC 23
+#define DVO_PORT_MIPID 24
+
+/* Block 52 contains MIPI configuration block
+ * 6 * bdb_mipi_config, followed by 6 pps data block
+ * block below
+ */
+#define MAX_MIPI_CONFIGURATIONS        6
+
+struct bdb_mipi_config {
+       struct mipi_config config[MAX_MIPI_CONFIGURATIONS];
+       struct mipi_pps_data pps[MAX_MIPI_CONFIGURATIONS];
+} __packed;
+
+/* Block 53 contains MIPI sequences as needed by the panel
+ * for enabling it. This block can be variable in size and
+ * can be maximum of 6 blocks
+ */
+struct bdb_mipi_sequence {
+       u8 version;
+       u8 data[0];
+} __packed;
+
+enum mipi_gpio_pin_index {
+       MIPI_GPIO_UNDEFINED = 0,
+       MIPI_GPIO_PANEL_ENABLE,
+       MIPI_GPIO_BL_ENABLE,
+       MIPI_GPIO_PWM_ENABLE,
+       MIPI_GPIO_RESET_N,
+       MIPI_GPIO_PWR_DOWN_R,
+       MIPI_GPIO_STDBY_RST_N,
+       MIPI_GPIO_MAX
+};
+
+#endif /* _INTEL_VBT_DEFS_H_ */
index e26dcdec2aba0e51233910c82f1788e49ea6f2ce..1080019e7b17ad8062d188060effcc901454227d 100644 (file)
@@ -252,13 +252,6 @@ static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
        if (ret)
                goto err_kms;
 
-       /*
-        * with vblank_disable_allowed = true, vblank interrupt will be
-        * disabled by drm timer once a current process gives up ownership
-        * of vblank event. (after drm_vblank_put function is called)
-        */
-       drm->vblank_disable_allowed = true;
-
        platform_set_drvdata(drm->platformdev, drm);
 
        /* Now try and bind all our sub-components */
@@ -411,7 +404,7 @@ static struct drm_driver imx_drm_driver = {
        .unload                 = imx_drm_driver_unload,
        .lastclose              = imx_drm_driver_lastclose,
        .set_busid              = drm_platform_set_busid,
-       .gem_free_object        = drm_gem_cma_free_object,
+       .gem_free_object_unlocked = drm_gem_cma_free_object,
        .gem_vm_ops             = &drm_gem_cma_vm_ops,
        .dumb_create            = drm_gem_cma_dumb_create,
        .dumb_map_offset        = drm_gem_cma_dumb_map_offset,
diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig
new file mode 100644 (file)
index 0000000..eeefc97
--- /dev/null
@@ -0,0 +1,16 @@
+config DRM_MEDIATEK
+       tristate "DRM Support for Mediatek SoCs"
+       depends on DRM
+       depends on ARCH_MEDIATEK || (ARM && COMPILE_TEST)
+       select DRM_GEM_CMA_HELPER
+       select DRM_KMS_HELPER
+       select DRM_MIPI_DSI
+       select DRM_PANEL
+       select IOMMU_DMA
+       select MEMORY
+       select MTK_SMI
+       help
+         Choose this option if you have a Mediatek SoCs.
+         The module will be called mediatek-drm
+         This driver provides kernel mode setting and
+         buffer management to userspace.
diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile
new file mode 100644 (file)
index 0000000..5fcf58e
--- /dev/null
@@ -0,0 +1,14 @@
+mediatek-drm-y := mtk_disp_ovl.o \
+                 mtk_disp_rdma.o \
+                 mtk_drm_crtc.o \
+                 mtk_drm_ddp.o \
+                 mtk_drm_ddp_comp.o \
+                 mtk_drm_drv.o \
+                 mtk_drm_fb.o \
+                 mtk_drm_gem.o \
+                 mtk_drm_plane.o \
+                 mtk_dsi.o \
+                 mtk_mipi_tx.o \
+                 mtk_dpi.o
+
+obj-$(CONFIG_DRM_MEDIATEK) += mediatek-drm.o
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
new file mode 100644 (file)
index 0000000..8f62671
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+
+#include "mtk_drm_crtc.h"
+#include "mtk_drm_ddp_comp.h"
+
+#define DISP_REG_OVL_INTEN                     0x0004
+#define OVL_FME_CPL_INT                                        BIT(1)
+#define DISP_REG_OVL_INTSTA                    0x0008
+#define DISP_REG_OVL_EN                                0x000c
+#define DISP_REG_OVL_RST                       0x0014
+#define DISP_REG_OVL_ROI_SIZE                  0x0020
+#define DISP_REG_OVL_ROI_BGCLR                 0x0028
+#define DISP_REG_OVL_SRC_CON                   0x002c
+#define DISP_REG_OVL_CON(n)                    (0x0030 + 0x20 * (n))
+#define DISP_REG_OVL_SRC_SIZE(n)               (0x0038 + 0x20 * (n))
+#define DISP_REG_OVL_OFFSET(n)                 (0x003c + 0x20 * (n))
+#define DISP_REG_OVL_PITCH(n)                  (0x0044 + 0x20 * (n))
+#define DISP_REG_OVL_RDMA_CTRL(n)              (0x00c0 + 0x20 * (n))
+#define DISP_REG_OVL_RDMA_GMC(n)               (0x00c8 + 0x20 * (n))
+#define DISP_REG_OVL_ADDR(n)                   (0x0f40 + 0x20 * (n))
+
+#define        OVL_RDMA_MEM_GMC        0x40402020
+
+#define OVL_CON_BYTE_SWAP      BIT(24)
+#define OVL_CON_CLRFMT_RGB565  (0 << 12)
+#define OVL_CON_CLRFMT_RGB888  (1 << 12)
+#define OVL_CON_CLRFMT_RGBA8888        (2 << 12)
+#define OVL_CON_CLRFMT_ARGB8888        (3 << 12)
+#define        OVL_CON_AEN             BIT(8)
+#define        OVL_CON_ALPHA           0xff
+
+/**
+ * struct mtk_disp_ovl - DISP_OVL driver structure
+ * @ddp_comp - structure containing type enum and hardware resources
+ * @crtc - associated crtc to report vblank events to
+ */
+struct mtk_disp_ovl {
+       struct mtk_ddp_comp             ddp_comp;
+       struct drm_crtc                 *crtc;
+};
+
+static irqreturn_t mtk_disp_ovl_irq_handler(int irq, void *dev_id)
+{
+       struct mtk_disp_ovl *priv = dev_id;
+       struct mtk_ddp_comp *ovl = &priv->ddp_comp;
+
+       /* Clear frame completion interrupt */
+       writel(0x0, ovl->regs + DISP_REG_OVL_INTSTA);
+
+       if (!priv->crtc)
+               return IRQ_NONE;
+
+       mtk_crtc_ddp_irq(priv->crtc, ovl);
+
+       return IRQ_HANDLED;
+}
+
+static void mtk_ovl_enable_vblank(struct mtk_ddp_comp *comp,
+                                 struct drm_crtc *crtc)
+{
+       struct mtk_disp_ovl *priv = container_of(comp, struct mtk_disp_ovl,
+                                                ddp_comp);
+
+       priv->crtc = crtc;
+       writel_relaxed(OVL_FME_CPL_INT, comp->regs + DISP_REG_OVL_INTEN);
+}
+
+static void mtk_ovl_disable_vblank(struct mtk_ddp_comp *comp)
+{
+       struct mtk_disp_ovl *priv = container_of(comp, struct mtk_disp_ovl,
+                                                ddp_comp);
+
+       priv->crtc = NULL;
+       writel_relaxed(0x0, comp->regs + DISP_REG_OVL_INTEN);
+}
+
+static void mtk_ovl_start(struct mtk_ddp_comp *comp)
+{
+       writel_relaxed(0x1, comp->regs + DISP_REG_OVL_EN);
+}
+
+static void mtk_ovl_stop(struct mtk_ddp_comp *comp)
+{
+       writel_relaxed(0x0, comp->regs + DISP_REG_OVL_EN);
+}
+
+static void mtk_ovl_config(struct mtk_ddp_comp *comp, unsigned int w,
+                          unsigned int h, unsigned int vrefresh)
+{
+       if (w != 0 && h != 0)
+               writel_relaxed(h << 16 | w, comp->regs + DISP_REG_OVL_ROI_SIZE);
+       writel_relaxed(0x0, comp->regs + DISP_REG_OVL_ROI_BGCLR);
+
+       writel(0x1, comp->regs + DISP_REG_OVL_RST);
+       writel(0x0, comp->regs + DISP_REG_OVL_RST);
+}
+
+static void mtk_ovl_layer_on(struct mtk_ddp_comp *comp, unsigned int idx)
+{
+       unsigned int reg;
+
+       writel(0x1, comp->regs + DISP_REG_OVL_RDMA_CTRL(idx));
+       writel(OVL_RDMA_MEM_GMC, comp->regs + DISP_REG_OVL_RDMA_GMC(idx));
+
+       reg = readl(comp->regs + DISP_REG_OVL_SRC_CON);
+       reg = reg | BIT(idx);
+       writel(reg, comp->regs + DISP_REG_OVL_SRC_CON);
+}
+
+static void mtk_ovl_layer_off(struct mtk_ddp_comp *comp, unsigned int idx)
+{
+       unsigned int reg;
+
+       reg = readl(comp->regs + DISP_REG_OVL_SRC_CON);
+       reg = reg & ~BIT(idx);
+       writel(reg, comp->regs + DISP_REG_OVL_SRC_CON);
+
+       writel(0x0, comp->regs + DISP_REG_OVL_RDMA_CTRL(idx));
+}
+
+static unsigned int ovl_fmt_convert(unsigned int fmt)
+{
+       switch (fmt) {
+       default:
+       case DRM_FORMAT_RGB565:
+               return OVL_CON_CLRFMT_RGB565;
+       case DRM_FORMAT_BGR565:
+               return OVL_CON_CLRFMT_RGB565 | OVL_CON_BYTE_SWAP;
+       case DRM_FORMAT_RGB888:
+               return OVL_CON_CLRFMT_RGB888;
+       case DRM_FORMAT_BGR888:
+               return OVL_CON_CLRFMT_RGB888 | OVL_CON_BYTE_SWAP;
+       case DRM_FORMAT_RGBX8888:
+       case DRM_FORMAT_RGBA8888:
+               return OVL_CON_CLRFMT_ARGB8888;
+       case DRM_FORMAT_BGRX8888:
+       case DRM_FORMAT_BGRA8888:
+               return OVL_CON_CLRFMT_ARGB8888 | OVL_CON_BYTE_SWAP;
+       case DRM_FORMAT_XRGB8888:
+       case DRM_FORMAT_ARGB8888:
+               return OVL_CON_CLRFMT_RGBA8888;
+       case DRM_FORMAT_XBGR8888:
+       case DRM_FORMAT_ABGR8888:
+               return OVL_CON_CLRFMT_RGBA8888 | OVL_CON_BYTE_SWAP;
+       }
+}
+
+static void mtk_ovl_layer_config(struct mtk_ddp_comp *comp, unsigned int idx,
+                                struct mtk_plane_state *state)
+{
+       struct mtk_plane_pending_state *pending = &state->pending;
+       unsigned int addr = pending->addr;
+       unsigned int pitch = pending->pitch & 0xffff;
+       unsigned int fmt = pending->format;
+       unsigned int offset = (pending->y << 16) | pending->x;
+       unsigned int src_size = (pending->height << 16) | pending->width;
+       unsigned int con;
+
+       if (!pending->enable)
+               mtk_ovl_layer_off(comp, idx);
+
+       con = ovl_fmt_convert(fmt);
+       if (idx != 0)
+               con |= OVL_CON_AEN | OVL_CON_ALPHA;
+
+       writel_relaxed(con, comp->regs + DISP_REG_OVL_CON(idx));
+       writel_relaxed(pitch, comp->regs + DISP_REG_OVL_PITCH(idx));
+       writel_relaxed(src_size, comp->regs + DISP_REG_OVL_SRC_SIZE(idx));
+       writel_relaxed(offset, comp->regs + DISP_REG_OVL_OFFSET(idx));
+       writel_relaxed(addr, comp->regs + DISP_REG_OVL_ADDR(idx));
+
+       if (pending->enable)
+               mtk_ovl_layer_on(comp, idx);
+}
+
+static const struct mtk_ddp_comp_funcs mtk_disp_ovl_funcs = {
+       .config = mtk_ovl_config,
+       .start = mtk_ovl_start,
+       .stop = mtk_ovl_stop,
+       .enable_vblank = mtk_ovl_enable_vblank,
+       .disable_vblank = mtk_ovl_disable_vblank,
+       .layer_on = mtk_ovl_layer_on,
+       .layer_off = mtk_ovl_layer_off,
+       .layer_config = mtk_ovl_layer_config,
+};
+
+static int mtk_disp_ovl_bind(struct device *dev, struct device *master,
+                            void *data)
+{
+       struct mtk_disp_ovl *priv = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       int ret;
+
+       ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp);
+       if (ret < 0) {
+               dev_err(dev, "Failed to register component %s: %d\n",
+                       dev->of_node->full_name, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static void mtk_disp_ovl_unbind(struct device *dev, struct device *master,
+                               void *data)
+{
+       struct mtk_disp_ovl *priv = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+
+       mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp);
+}
+
+static const struct component_ops mtk_disp_ovl_component_ops = {
+       .bind   = mtk_disp_ovl_bind,
+       .unbind = mtk_disp_ovl_unbind,
+};
+
+static int mtk_disp_ovl_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_disp_ovl *priv;
+       int comp_id;
+       int irq;
+       int ret;
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return irq;
+
+       ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
+                              IRQF_TRIGGER_NONE, dev_name(dev), priv);
+       if (ret < 0) {
+               dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
+               return ret;
+       }
+
+       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL);
+       if (comp_id < 0) {
+               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
+               return comp_id;
+       }
+
+       ret = mtk_ddp_comp_init(dev, dev->of_node, &priv->ddp_comp, comp_id,
+                               &mtk_disp_ovl_funcs);
+       if (ret) {
+               dev_err(dev, "Failed to initialize component: %d\n", ret);
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, priv);
+
+       ret = component_add(dev, &mtk_disp_ovl_component_ops);
+       if (ret)
+               dev_err(dev, "Failed to add component: %d\n", ret);
+
+       return ret;
+}
+
+static int mtk_disp_ovl_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &mtk_disp_ovl_component_ops);
+
+       return 0;
+}
+
+static const struct of_device_id mtk_disp_ovl_driver_dt_match[] = {
+       { .compatible = "mediatek,mt8173-disp-ovl", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, mtk_disp_ovl_driver_dt_match);
+
+struct platform_driver mtk_disp_ovl_driver = {
+       .probe          = mtk_disp_ovl_probe,
+       .remove         = mtk_disp_ovl_remove,
+       .driver         = {
+               .name   = "mediatek-disp-ovl",
+               .owner  = THIS_MODULE,
+               .of_match_table = mtk_disp_ovl_driver_dt_match,
+       },
+};
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_rdma.c b/drivers/gpu/drm/mediatek/mtk_disp_rdma.c
new file mode 100644 (file)
index 0000000..5fb80cb
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/platform_device.h>
+
+#include "mtk_drm_crtc.h"
+#include "mtk_drm_ddp_comp.h"
+
+#define DISP_REG_RDMA_INT_ENABLE               0x0000
+#define DISP_REG_RDMA_INT_STATUS               0x0004
+#define RDMA_TARGET_LINE_INT                           BIT(5)
+#define RDMA_FIFO_UNDERFLOW_INT                                BIT(4)
+#define RDMA_EOF_ABNORMAL_INT                          BIT(3)
+#define RDMA_FRAME_END_INT                             BIT(2)
+#define RDMA_FRAME_START_INT                           BIT(1)
+#define RDMA_REG_UPDATE_INT                            BIT(0)
+#define DISP_REG_RDMA_GLOBAL_CON               0x0010
+#define RDMA_ENGINE_EN                                 BIT(0)
+#define DISP_REG_RDMA_SIZE_CON_0               0x0014
+#define DISP_REG_RDMA_SIZE_CON_1               0x0018
+#define DISP_REG_RDMA_TARGET_LINE              0x001c
+#define DISP_REG_RDMA_FIFO_CON                 0x0040
+#define RDMA_FIFO_UNDERFLOW_EN                         BIT(31)
+#define RDMA_FIFO_PSEUDO_SIZE(bytes)                   (((bytes) / 16) << 16)
+#define RDMA_OUTPUT_VALID_FIFO_THRESHOLD(bytes)                ((bytes) / 16)
+
+/**
+ * struct mtk_disp_rdma - DISP_RDMA driver structure
+ * @ddp_comp - structure containing type enum and hardware resources
+ * @crtc - associated crtc to report irq events to
+ */
+struct mtk_disp_rdma {
+       struct mtk_ddp_comp             ddp_comp;
+       struct drm_crtc                 *crtc;
+};
+
+static irqreturn_t mtk_disp_rdma_irq_handler(int irq, void *dev_id)
+{
+       struct mtk_disp_rdma *priv = dev_id;
+       struct mtk_ddp_comp *rdma = &priv->ddp_comp;
+
+       /* Clear frame completion interrupt */
+       writel(0x0, rdma->regs + DISP_REG_RDMA_INT_STATUS);
+
+       if (!priv->crtc)
+               return IRQ_NONE;
+
+       mtk_crtc_ddp_irq(priv->crtc, rdma);
+
+       return IRQ_HANDLED;
+}
+
+static void rdma_update_bits(struct mtk_ddp_comp *comp, unsigned int reg,
+                            unsigned int mask, unsigned int val)
+{
+       unsigned int tmp = readl(comp->regs + reg);
+
+       tmp = (tmp & ~mask) | (val & mask);
+       writel(tmp, comp->regs + reg);
+}
+
+static void mtk_rdma_enable_vblank(struct mtk_ddp_comp *comp,
+                                  struct drm_crtc *crtc)
+{
+       struct mtk_disp_rdma *priv = container_of(comp, struct mtk_disp_rdma,
+                                                 ddp_comp);
+
+       priv->crtc = crtc;
+       rdma_update_bits(comp, DISP_REG_RDMA_INT_ENABLE, RDMA_FRAME_END_INT,
+                        RDMA_FRAME_END_INT);
+}
+
+static void mtk_rdma_disable_vblank(struct mtk_ddp_comp *comp)
+{
+       struct mtk_disp_rdma *priv = container_of(comp, struct mtk_disp_rdma,
+                                                 ddp_comp);
+
+       priv->crtc = NULL;
+       rdma_update_bits(comp, DISP_REG_RDMA_INT_ENABLE, RDMA_FRAME_END_INT, 0);
+}
+
+static void mtk_rdma_start(struct mtk_ddp_comp *comp)
+{
+       rdma_update_bits(comp, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN,
+                        RDMA_ENGINE_EN);
+}
+
+static void mtk_rdma_stop(struct mtk_ddp_comp *comp)
+{
+       rdma_update_bits(comp, DISP_REG_RDMA_GLOBAL_CON, RDMA_ENGINE_EN, 0);
+}
+
+static void mtk_rdma_config(struct mtk_ddp_comp *comp, unsigned int width,
+                           unsigned int height, unsigned int vrefresh)
+{
+       unsigned int threshold;
+       unsigned int reg;
+
+       rdma_update_bits(comp, DISP_REG_RDMA_SIZE_CON_0, 0xfff, width);
+       rdma_update_bits(comp, DISP_REG_RDMA_SIZE_CON_1, 0xfffff, height);
+
+       /*
+        * Enable FIFO underflow since DSI and DPI can't be blocked.
+        * Keep the FIFO pseudo size reset default of 8 KiB. Set the
+        * output threshold to 6 microseconds with 7/6 overhead to
+        * account for blanking, and with a pixel depth of 4 bytes:
+        */
+       threshold = width * height * vrefresh * 4 * 7 / 1000000;
+       reg = RDMA_FIFO_UNDERFLOW_EN |
+             RDMA_FIFO_PSEUDO_SIZE(SZ_8K) |
+             RDMA_OUTPUT_VALID_FIFO_THRESHOLD(threshold);
+       writel(reg, comp->regs + DISP_REG_RDMA_FIFO_CON);
+}
+
+static const struct mtk_ddp_comp_funcs mtk_disp_rdma_funcs = {
+       .config = mtk_rdma_config,
+       .start = mtk_rdma_start,
+       .stop = mtk_rdma_stop,
+       .enable_vblank = mtk_rdma_enable_vblank,
+       .disable_vblank = mtk_rdma_disable_vblank,
+};
+
+static int mtk_disp_rdma_bind(struct device *dev, struct device *master,
+                             void *data)
+{
+       struct mtk_disp_rdma *priv = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       int ret;
+
+       ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp);
+       if (ret < 0) {
+               dev_err(dev, "Failed to register component %s: %d\n",
+                       dev->of_node->full_name, ret);
+               return ret;
+       }
+
+       return 0;
+
+}
+
+static void mtk_disp_rdma_unbind(struct device *dev, struct device *master,
+                                void *data)
+{
+       struct mtk_disp_rdma *priv = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+
+       mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp);
+}
+
+static const struct component_ops mtk_disp_rdma_component_ops = {
+       .bind   = mtk_disp_rdma_bind,
+       .unbind = mtk_disp_rdma_unbind,
+};
+
+static int mtk_disp_rdma_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_disp_rdma *priv;
+       int comp_id;
+       int irq;
+       int ret;
+
+       priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return irq;
+
+       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_RDMA);
+       if (comp_id < 0) {
+               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
+               return comp_id;
+       }
+
+       ret = mtk_ddp_comp_init(dev, dev->of_node, &priv->ddp_comp, comp_id,
+                               &mtk_disp_rdma_funcs);
+       if (ret) {
+               dev_err(dev, "Failed to initialize component: %d\n", ret);
+               return ret;
+       }
+
+       /* Disable and clear pending interrupts */
+       writel(0x0, priv->ddp_comp.regs + DISP_REG_RDMA_INT_ENABLE);
+       writel(0x0, priv->ddp_comp.regs + DISP_REG_RDMA_INT_STATUS);
+
+       ret = devm_request_irq(dev, irq, mtk_disp_rdma_irq_handler,
+                              IRQF_TRIGGER_NONE, dev_name(dev), priv);
+       if (ret < 0) {
+               dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, priv);
+
+       ret = component_add(dev, &mtk_disp_rdma_component_ops);
+       if (ret)
+               dev_err(dev, "Failed to add component: %d\n", ret);
+
+       return ret;
+}
+
+static int mtk_disp_rdma_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &mtk_disp_rdma_component_ops);
+
+       return 0;
+}
+
+static const struct of_device_id mtk_disp_rdma_driver_dt_match[] = {
+       { .compatible = "mediatek,mt8173-disp-rdma", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, mtk_disp_rdma_driver_dt_match);
+
+struct platform_driver mtk_disp_rdma_driver = {
+       .probe          = mtk_disp_rdma_probe,
+       .remove         = mtk_disp_rdma_remove,
+       .driver         = {
+               .name   = "mediatek-disp-rdma",
+               .owner  = THIS_MODULE,
+               .of_match_table = mtk_disp_rdma_driver_dt_match,
+       },
+};
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
new file mode 100644 (file)
index 0000000..d05ca79
--- /dev/null
@@ -0,0 +1,769 @@
+/*
+ * Copyright (c) 2014 MediaTek Inc.
+ * Author: Jie Qiu <jie.qiu@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#include <drm/drmP.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <linux/kernel.h>
+#include <linux/component.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_graph.h>
+#include <linux/interrupt.h>
+#include <linux/types.h>
+#include <linux/clk.h>
+
+#include "mtk_dpi_regs.h"
+#include "mtk_drm_ddp_comp.h"
+
+enum mtk_dpi_out_bit_num {
+       MTK_DPI_OUT_BIT_NUM_8BITS,
+       MTK_DPI_OUT_BIT_NUM_10BITS,
+       MTK_DPI_OUT_BIT_NUM_12BITS,
+       MTK_DPI_OUT_BIT_NUM_16BITS
+};
+
+enum mtk_dpi_out_yc_map {
+       MTK_DPI_OUT_YC_MAP_RGB,
+       MTK_DPI_OUT_YC_MAP_CYCY,
+       MTK_DPI_OUT_YC_MAP_YCYC,
+       MTK_DPI_OUT_YC_MAP_CY,
+       MTK_DPI_OUT_YC_MAP_YC
+};
+
+enum mtk_dpi_out_channel_swap {
+       MTK_DPI_OUT_CHANNEL_SWAP_RGB,
+       MTK_DPI_OUT_CHANNEL_SWAP_GBR,
+       MTK_DPI_OUT_CHANNEL_SWAP_BRG,
+       MTK_DPI_OUT_CHANNEL_SWAP_RBG,
+       MTK_DPI_OUT_CHANNEL_SWAP_GRB,
+       MTK_DPI_OUT_CHANNEL_SWAP_BGR
+};
+
+enum mtk_dpi_out_color_format {
+       MTK_DPI_COLOR_FORMAT_RGB,
+       MTK_DPI_COLOR_FORMAT_RGB_FULL,
+       MTK_DPI_COLOR_FORMAT_YCBCR_444,
+       MTK_DPI_COLOR_FORMAT_YCBCR_422,
+       MTK_DPI_COLOR_FORMAT_XV_YCC,
+       MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL,
+       MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL
+};
+
+struct mtk_dpi {
+       struct mtk_ddp_comp ddp_comp;
+       struct drm_encoder encoder;
+       void __iomem *regs;
+       struct device *dev;
+       struct clk *engine_clk;
+       struct clk *pixel_clk;
+       struct clk *tvd_clk;
+       int irq;
+       struct drm_display_mode mode;
+       enum mtk_dpi_out_color_format color_format;
+       enum mtk_dpi_out_yc_map yc_map;
+       enum mtk_dpi_out_bit_num bit_num;
+       enum mtk_dpi_out_channel_swap channel_swap;
+       bool power_sta;
+       u8 power_ctl;
+};
+
+static inline struct mtk_dpi *mtk_dpi_from_encoder(struct drm_encoder *e)
+{
+       return container_of(e, struct mtk_dpi, encoder);
+}
+
+enum mtk_dpi_polarity {
+       MTK_DPI_POLARITY_RISING,
+       MTK_DPI_POLARITY_FALLING,
+};
+
+enum mtk_dpi_power_ctl {
+       DPI_POWER_START = BIT(0),
+       DPI_POWER_ENABLE = BIT(1),
+};
+
+struct mtk_dpi_polarities {
+       enum mtk_dpi_polarity de_pol;
+       enum mtk_dpi_polarity ck_pol;
+       enum mtk_dpi_polarity hsync_pol;
+       enum mtk_dpi_polarity vsync_pol;
+};
+
+struct mtk_dpi_sync_param {
+       u32 sync_width;
+       u32 front_porch;
+       u32 back_porch;
+       bool shift_half_line;
+};
+
+struct mtk_dpi_yc_limit {
+       u16 y_top;
+       u16 y_bottom;
+       u16 c_top;
+       u16 c_bottom;
+};
+
+static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask)
+{
+       u32 tmp = readl(dpi->regs + offset) & ~mask;
+
+       tmp |= (val & mask);
+       writel(tmp, dpi->regs + offset);
+}
+
+static void mtk_dpi_sw_reset(struct mtk_dpi *dpi, bool reset)
+{
+       mtk_dpi_mask(dpi, DPI_RET, reset ? RST : 0, RST);
+}
+
+static void mtk_dpi_enable(struct mtk_dpi *dpi)
+{
+       mtk_dpi_mask(dpi, DPI_EN, EN, EN);
+}
+
+static void mtk_dpi_disable(struct mtk_dpi *dpi)
+{
+       mtk_dpi_mask(dpi, DPI_EN, 0, EN);
+}
+
+static void mtk_dpi_config_hsync(struct mtk_dpi *dpi,
+                                struct mtk_dpi_sync_param *sync)
+{
+       mtk_dpi_mask(dpi, DPI_TGEN_HWIDTH,
+                    sync->sync_width << HPW, HPW_MASK);
+       mtk_dpi_mask(dpi, DPI_TGEN_HPORCH,
+                    sync->back_porch << HBP, HBP_MASK);
+       mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, sync->front_porch << HFP,
+                    HFP_MASK);
+}
+
+static void mtk_dpi_config_vsync(struct mtk_dpi *dpi,
+                                struct mtk_dpi_sync_param *sync,
+                                u32 width_addr, u32 porch_addr)
+{
+       mtk_dpi_mask(dpi, width_addr,
+                    sync->sync_width << VSYNC_WIDTH_SHIFT,
+                    VSYNC_WIDTH_MASK);
+       mtk_dpi_mask(dpi, width_addr,
+                    sync->shift_half_line << VSYNC_HALF_LINE_SHIFT,
+                    VSYNC_HALF_LINE_MASK);
+       mtk_dpi_mask(dpi, porch_addr,
+                    sync->back_porch << VSYNC_BACK_PORCH_SHIFT,
+                    VSYNC_BACK_PORCH_MASK);
+       mtk_dpi_mask(dpi, porch_addr,
+                    sync->front_porch << VSYNC_FRONT_PORCH_SHIFT,
+                    VSYNC_FRONT_PORCH_MASK);
+}
+
+static void mtk_dpi_config_vsync_lodd(struct mtk_dpi *dpi,
+                                     struct mtk_dpi_sync_param *sync)
+{
+       mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH, DPI_TGEN_VPORCH);
+}
+
+static void mtk_dpi_config_vsync_leven(struct mtk_dpi *dpi,
+                                      struct mtk_dpi_sync_param *sync)
+{
+       mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_LEVEN,
+                            DPI_TGEN_VPORCH_LEVEN);
+}
+
+static void mtk_dpi_config_vsync_rodd(struct mtk_dpi *dpi,
+                                     struct mtk_dpi_sync_param *sync)
+{
+       mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_RODD,
+                            DPI_TGEN_VPORCH_RODD);
+}
+
+static void mtk_dpi_config_vsync_reven(struct mtk_dpi *dpi,
+                                      struct mtk_dpi_sync_param *sync)
+{
+       mtk_dpi_config_vsync(dpi, sync, DPI_TGEN_VWIDTH_REVEN,
+                            DPI_TGEN_VPORCH_REVEN);
+}
+
+static void mtk_dpi_config_pol(struct mtk_dpi *dpi,
+                              struct mtk_dpi_polarities *dpi_pol)
+{
+       unsigned int pol;
+
+       pol = (dpi_pol->ck_pol == MTK_DPI_POLARITY_RISING ? 0 : CK_POL) |
+             (dpi_pol->de_pol == MTK_DPI_POLARITY_RISING ? 0 : DE_POL) |
+             (dpi_pol->hsync_pol == MTK_DPI_POLARITY_RISING ? 0 : HSYNC_POL) |
+             (dpi_pol->vsync_pol == MTK_DPI_POLARITY_RISING ? 0 : VSYNC_POL);
+       mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, pol,
+                    CK_POL | DE_POL | HSYNC_POL | VSYNC_POL);
+}
+
+static void mtk_dpi_config_3d(struct mtk_dpi *dpi, bool en_3d)
+{
+       mtk_dpi_mask(dpi, DPI_CON, en_3d ? TDFP_EN : 0, TDFP_EN);
+}
+
+static void mtk_dpi_config_interface(struct mtk_dpi *dpi, bool inter)
+{
+       mtk_dpi_mask(dpi, DPI_CON, inter ? INTL_EN : 0, INTL_EN);
+}
+
+static void mtk_dpi_config_fb_size(struct mtk_dpi *dpi, u32 width, u32 height)
+{
+       mtk_dpi_mask(dpi, DPI_SIZE, width << HSIZE, HSIZE_MASK);
+       mtk_dpi_mask(dpi, DPI_SIZE, height << VSIZE, VSIZE_MASK);
+}
+
+static void mtk_dpi_config_channel_limit(struct mtk_dpi *dpi,
+                                        struct mtk_dpi_yc_limit *limit)
+{
+       mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit->y_bottom << Y_LIMINT_BOT,
+                    Y_LIMINT_BOT_MASK);
+       mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit->y_top << Y_LIMINT_TOP,
+                    Y_LIMINT_TOP_MASK);
+       mtk_dpi_mask(dpi, DPI_C_LIMIT, limit->c_bottom << C_LIMIT_BOT,
+                    C_LIMIT_BOT_MASK);
+       mtk_dpi_mask(dpi, DPI_C_LIMIT, limit->c_top << C_LIMIT_TOP,
+                    C_LIMIT_TOP_MASK);
+}
+
+static void mtk_dpi_config_bit_num(struct mtk_dpi *dpi,
+                                  enum mtk_dpi_out_bit_num num)
+{
+       u32 val;
+
+       switch (num) {
+       case MTK_DPI_OUT_BIT_NUM_8BITS:
+               val = OUT_BIT_8;
+               break;
+       case MTK_DPI_OUT_BIT_NUM_10BITS:
+               val = OUT_BIT_10;
+               break;
+       case MTK_DPI_OUT_BIT_NUM_12BITS:
+               val = OUT_BIT_12;
+               break;
+       case MTK_DPI_OUT_BIT_NUM_16BITS:
+               val = OUT_BIT_16;
+               break;
+       default:
+               val = OUT_BIT_8;
+               break;
+       }
+       mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << OUT_BIT,
+                    OUT_BIT_MASK);
+}
+
+static void mtk_dpi_config_yc_map(struct mtk_dpi *dpi,
+                                 enum mtk_dpi_out_yc_map map)
+{
+       u32 val;
+
+       switch (map) {
+       case MTK_DPI_OUT_YC_MAP_RGB:
+               val = YC_MAP_RGB;
+               break;
+       case MTK_DPI_OUT_YC_MAP_CYCY:
+               val = YC_MAP_CYCY;
+               break;
+       case MTK_DPI_OUT_YC_MAP_YCYC:
+               val = YC_MAP_YCYC;
+               break;
+       case MTK_DPI_OUT_YC_MAP_CY:
+               val = YC_MAP_CY;
+               break;
+       case MTK_DPI_OUT_YC_MAP_YC:
+               val = YC_MAP_YC;
+               break;
+       default:
+               val = YC_MAP_RGB;
+               break;
+       }
+
+       mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << YC_MAP, YC_MAP_MASK);
+}
+
+static void mtk_dpi_config_channel_swap(struct mtk_dpi *dpi,
+                                       enum mtk_dpi_out_channel_swap swap)
+{
+       u32 val;
+
+       switch (swap) {
+       case MTK_DPI_OUT_CHANNEL_SWAP_RGB:
+               val = SWAP_RGB;
+               break;
+       case MTK_DPI_OUT_CHANNEL_SWAP_GBR:
+               val = SWAP_GBR;
+               break;
+       case MTK_DPI_OUT_CHANNEL_SWAP_BRG:
+               val = SWAP_BRG;
+               break;
+       case MTK_DPI_OUT_CHANNEL_SWAP_RBG:
+               val = SWAP_RBG;
+               break;
+       case MTK_DPI_OUT_CHANNEL_SWAP_GRB:
+               val = SWAP_GRB;
+               break;
+       case MTK_DPI_OUT_CHANNEL_SWAP_BGR:
+               val = SWAP_BGR;
+               break;
+       default:
+               val = SWAP_RGB;
+               break;
+       }
+
+       mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << CH_SWAP, CH_SWAP_MASK);
+}
+
+static void mtk_dpi_config_yuv422_enable(struct mtk_dpi *dpi, bool enable)
+{
+       mtk_dpi_mask(dpi, DPI_CON, enable ? YUV422_EN : 0, YUV422_EN);
+}
+
+static void mtk_dpi_config_csc_enable(struct mtk_dpi *dpi, bool enable)
+{
+       mtk_dpi_mask(dpi, DPI_CON, enable ? CSC_ENABLE : 0, CSC_ENABLE);
+}
+
+static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool enable)
+{
+       mtk_dpi_mask(dpi, DPI_CON, enable ? IN_RB_SWAP : 0, IN_RB_SWAP);
+}
+
+static void mtk_dpi_config_2n_h_fre(struct mtk_dpi *dpi)
+{
+       mtk_dpi_mask(dpi, DPI_H_FRE_CON, H_FRE_2N, H_FRE_2N);
+}
+
+static void mtk_dpi_config_color_format(struct mtk_dpi *dpi,
+                                       enum mtk_dpi_out_color_format format)
+{
+       if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_444) ||
+           (format == MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL)) {
+               mtk_dpi_config_yuv422_enable(dpi, false);
+               mtk_dpi_config_csc_enable(dpi, true);
+               mtk_dpi_config_swap_input(dpi, false);
+               mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_BGR);
+       } else if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_422) ||
+                  (format == MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL)) {
+               mtk_dpi_config_yuv422_enable(dpi, true);
+               mtk_dpi_config_csc_enable(dpi, true);
+               mtk_dpi_config_swap_input(dpi, true);
+               mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB);
+       } else {
+               mtk_dpi_config_yuv422_enable(dpi, false);
+               mtk_dpi_config_csc_enable(dpi, false);
+               mtk_dpi_config_swap_input(dpi, false);
+               mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB);
+       }
+}
+
+static void mtk_dpi_power_off(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl)
+{
+       dpi->power_ctl &= ~pctl;
+
+       if ((dpi->power_ctl & DPI_POWER_START) ||
+           (dpi->power_ctl & DPI_POWER_ENABLE))
+               return;
+
+       if (!dpi->power_sta)
+               return;
+
+       mtk_dpi_disable(dpi);
+       clk_disable_unprepare(dpi->pixel_clk);
+       clk_disable_unprepare(dpi->engine_clk);
+       dpi->power_sta = false;
+}
+
+static int mtk_dpi_power_on(struct mtk_dpi *dpi, enum mtk_dpi_power_ctl pctl)
+{
+       int ret;
+
+       dpi->power_ctl |= pctl;
+
+       if (!(dpi->power_ctl & DPI_POWER_START) &&
+           !(dpi->power_ctl & DPI_POWER_ENABLE))
+               return 0;
+
+       if (dpi->power_sta)
+               return 0;
+
+       ret = clk_prepare_enable(dpi->engine_clk);
+       if (ret) {
+               dev_err(dpi->dev, "Failed to enable engine clock: %d\n", ret);
+               goto err_eng;
+       }
+
+       ret = clk_prepare_enable(dpi->pixel_clk);
+       if (ret) {
+               dev_err(dpi->dev, "Failed to enable pixel clock: %d\n", ret);
+               goto err_pixel;
+       }
+
+       mtk_dpi_enable(dpi);
+       dpi->power_sta = true;
+       return 0;
+
+err_pixel:
+       clk_disable_unprepare(dpi->engine_clk);
+err_eng:
+       dpi->power_ctl &= ~pctl;
+       return ret;
+}
+
+static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
+                                   struct drm_display_mode *mode)
+{
+       struct mtk_dpi_yc_limit limit;
+       struct mtk_dpi_polarities dpi_pol;
+       struct mtk_dpi_sync_param hsync;
+       struct mtk_dpi_sync_param vsync_lodd = { 0 };
+       struct mtk_dpi_sync_param vsync_leven = { 0 };
+       struct mtk_dpi_sync_param vsync_rodd = { 0 };
+       struct mtk_dpi_sync_param vsync_reven = { 0 };
+       unsigned long pix_rate;
+       unsigned long pll_rate;
+       unsigned int factor;
+
+       if (!dpi) {
+               dev_err(dpi->dev, "invalid argument\n");
+               return -EINVAL;
+       }
+
+       pix_rate = 1000UL * mode->clock;
+       if (mode->clock <= 74000)
+               factor = 8 * 3;
+       else
+               factor = 4 * 3;
+       pll_rate = pix_rate * factor;
+
+       dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n",
+               pll_rate, pix_rate);
+
+       clk_set_rate(dpi->tvd_clk, pll_rate);
+       pll_rate = clk_get_rate(dpi->tvd_clk);
+
+       pix_rate = pll_rate / factor;
+       clk_set_rate(dpi->pixel_clk, pix_rate);
+       pix_rate = clk_get_rate(dpi->pixel_clk);
+
+       dev_dbg(dpi->dev, "Got  PLL %lu Hz, pixel clock %lu Hz\n",
+               pll_rate, pix_rate);
+
+       limit.c_bottom = 0x0010;
+       limit.c_top = 0x0FE0;
+       limit.y_bottom = 0x0010;
+       limit.y_top = 0x0FE0;
+
+       dpi_pol.ck_pol = MTK_DPI_POLARITY_FALLING;
+       dpi_pol.de_pol = MTK_DPI_POLARITY_RISING;
+       dpi_pol.hsync_pol = mode->flags & DRM_MODE_FLAG_PHSYNC ?
+                           MTK_DPI_POLARITY_FALLING : MTK_DPI_POLARITY_RISING;
+       dpi_pol.vsync_pol = mode->flags & DRM_MODE_FLAG_PVSYNC ?
+                           MTK_DPI_POLARITY_FALLING : MTK_DPI_POLARITY_RISING;
+
+       hsync.sync_width = mode->hsync_end - mode->hsync_start;
+       hsync.back_porch = mode->htotal - mode->hsync_end;
+       hsync.front_porch = mode->hsync_start - mode->hdisplay;
+       hsync.shift_half_line = false;
+
+       vsync_lodd.sync_width = mode->vsync_end - mode->vsync_start;
+       vsync_lodd.back_porch = mode->vtotal - mode->vsync_end;
+       vsync_lodd.front_porch = mode->vsync_start - mode->vdisplay;
+       vsync_lodd.shift_half_line = false;
+
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE &&
+           mode->flags & DRM_MODE_FLAG_3D_MASK) {
+               vsync_leven = vsync_lodd;
+               vsync_rodd = vsync_lodd;
+               vsync_reven = vsync_lodd;
+               vsync_leven.shift_half_line = true;
+               vsync_reven.shift_half_line = true;
+       } else if (mode->flags & DRM_MODE_FLAG_INTERLACE &&
+                  !(mode->flags & DRM_MODE_FLAG_3D_MASK)) {
+               vsync_leven = vsync_lodd;
+               vsync_leven.shift_half_line = true;
+       } else if (!(mode->flags & DRM_MODE_FLAG_INTERLACE) &&
+                  mode->flags & DRM_MODE_FLAG_3D_MASK) {
+               vsync_rodd = vsync_lodd;
+       }
+       mtk_dpi_sw_reset(dpi, true);
+       mtk_dpi_config_pol(dpi, &dpi_pol);
+
+       mtk_dpi_config_hsync(dpi, &hsync);
+       mtk_dpi_config_vsync_lodd(dpi, &vsync_lodd);
+       mtk_dpi_config_vsync_rodd(dpi, &vsync_rodd);
+       mtk_dpi_config_vsync_leven(dpi, &vsync_leven);
+       mtk_dpi_config_vsync_reven(dpi, &vsync_reven);
+
+       mtk_dpi_config_3d(dpi, !!(mode->flags & DRM_MODE_FLAG_3D_MASK));
+       mtk_dpi_config_interface(dpi, !!(mode->flags &
+                                        DRM_MODE_FLAG_INTERLACE));
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               mtk_dpi_config_fb_size(dpi, mode->hdisplay, mode->vdisplay / 2);
+       else
+               mtk_dpi_config_fb_size(dpi, mode->hdisplay, mode->vdisplay);
+
+       mtk_dpi_config_channel_limit(dpi, &limit);
+       mtk_dpi_config_bit_num(dpi, dpi->bit_num);
+       mtk_dpi_config_channel_swap(dpi, dpi->channel_swap);
+       mtk_dpi_config_yc_map(dpi, dpi->yc_map);
+       mtk_dpi_config_color_format(dpi, dpi->color_format);
+       mtk_dpi_config_2n_h_fre(dpi);
+       mtk_dpi_sw_reset(dpi, false);
+
+       return 0;
+}
+
+static void mtk_dpi_encoder_destroy(struct drm_encoder *encoder)
+{
+       drm_encoder_cleanup(encoder);
+}
+
+static const struct drm_encoder_funcs mtk_dpi_encoder_funcs = {
+       .destroy = mtk_dpi_encoder_destroy,
+};
+
+static bool mtk_dpi_encoder_mode_fixup(struct drm_encoder *encoder,
+                                      const struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
+{
+       return true;
+}
+
+static void mtk_dpi_encoder_mode_set(struct drm_encoder *encoder,
+                                    struct drm_display_mode *mode,
+                                    struct drm_display_mode *adjusted_mode)
+{
+       struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+
+       drm_mode_copy(&dpi->mode, adjusted_mode);
+}
+
+static void mtk_dpi_encoder_disable(struct drm_encoder *encoder)
+{
+       struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+
+       mtk_dpi_power_off(dpi, DPI_POWER_ENABLE);
+}
+
+static void mtk_dpi_encoder_enable(struct drm_encoder *encoder)
+{
+       struct mtk_dpi *dpi = mtk_dpi_from_encoder(encoder);
+
+       mtk_dpi_power_on(dpi, DPI_POWER_ENABLE);
+       mtk_dpi_set_display_mode(dpi, &dpi->mode);
+}
+
+static int mtk_dpi_atomic_check(struct drm_encoder *encoder,
+                               struct drm_crtc_state *crtc_state,
+                               struct drm_connector_state *conn_state)
+{
+       return 0;
+}
+
+static const struct drm_encoder_helper_funcs mtk_dpi_encoder_helper_funcs = {
+       .mode_fixup = mtk_dpi_encoder_mode_fixup,
+       .mode_set = mtk_dpi_encoder_mode_set,
+       .disable = mtk_dpi_encoder_disable,
+       .enable = mtk_dpi_encoder_enable,
+       .atomic_check = mtk_dpi_atomic_check,
+};
+
+static void mtk_dpi_start(struct mtk_ddp_comp *comp)
+{
+       struct mtk_dpi *dpi = container_of(comp, struct mtk_dpi, ddp_comp);
+
+       mtk_dpi_power_on(dpi, DPI_POWER_START);
+}
+
+static void mtk_dpi_stop(struct mtk_ddp_comp *comp)
+{
+       struct mtk_dpi *dpi = container_of(comp, struct mtk_dpi, ddp_comp);
+
+       mtk_dpi_power_off(dpi, DPI_POWER_START);
+}
+
+static const struct mtk_ddp_comp_funcs mtk_dpi_funcs = {
+       .start = mtk_dpi_start,
+       .stop = mtk_dpi_stop,
+};
+
+static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
+{
+       struct mtk_dpi *dpi = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       int ret;
+
+       ret = mtk_ddp_comp_register(drm_dev, &dpi->ddp_comp);
+       if (ret < 0) {
+               dev_err(dev, "Failed to register component %s: %d\n",
+                       dev->of_node->full_name, ret);
+               return ret;
+       }
+
+       ret = drm_encoder_init(drm_dev, &dpi->encoder, &mtk_dpi_encoder_funcs,
+                              DRM_MODE_ENCODER_TMDS, NULL);
+       if (ret) {
+               dev_err(dev, "Failed to initialize decoder: %d\n", ret);
+               goto err_unregister;
+       }
+       drm_encoder_helper_add(&dpi->encoder, &mtk_dpi_encoder_helper_funcs);
+
+       /* Currently DPI0 is fixed to be driven by OVL1 */
+       dpi->encoder.possible_crtcs = BIT(1);
+
+       dpi->encoder.bridge->encoder = &dpi->encoder;
+       ret = drm_bridge_attach(dpi->encoder.dev, dpi->encoder.bridge);
+       if (ret) {
+               dev_err(dev, "Failed to attach bridge: %d\n", ret);
+               goto err_cleanup;
+       }
+
+       dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS;
+       dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB;
+       dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB;
+       dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB;
+
+       return 0;
+
+err_cleanup:
+       drm_encoder_cleanup(&dpi->encoder);
+err_unregister:
+       mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp);
+       return ret;
+}
+
+static void mtk_dpi_unbind(struct device *dev, struct device *master,
+                          void *data)
+{
+       struct mtk_dpi *dpi = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+
+       drm_encoder_cleanup(&dpi->encoder);
+       mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp);
+}
+
+static const struct component_ops mtk_dpi_component_ops = {
+       .bind = mtk_dpi_bind,
+       .unbind = mtk_dpi_unbind,
+};
+
+static int mtk_dpi_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_dpi *dpi;
+       struct resource *mem;
+       struct device_node *ep, *bridge_node = NULL;
+       int comp_id;
+       int ret;
+
+       dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL);
+       if (!dpi)
+               return -ENOMEM;
+
+       dpi->dev = dev;
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       dpi->regs = devm_ioremap_resource(dev, mem);
+       if (IS_ERR(dpi->regs)) {
+               ret = PTR_ERR(dpi->regs);
+               dev_err(dev, "Failed to ioremap mem resource: %d\n", ret);
+               return ret;
+       }
+
+       dpi->engine_clk = devm_clk_get(dev, "engine");
+       if (IS_ERR(dpi->engine_clk)) {
+               ret = PTR_ERR(dpi->engine_clk);
+               dev_err(dev, "Failed to get engine clock: %d\n", ret);
+               return ret;
+       }
+
+       dpi->pixel_clk = devm_clk_get(dev, "pixel");
+       if (IS_ERR(dpi->pixel_clk)) {
+               ret = PTR_ERR(dpi->pixel_clk);
+               dev_err(dev, "Failed to get pixel clock: %d\n", ret);
+               return ret;
+       }
+
+       dpi->tvd_clk = devm_clk_get(dev, "pll");
+       if (IS_ERR(dpi->tvd_clk)) {
+               ret = PTR_ERR(dpi->tvd_clk);
+               dev_err(dev, "Failed to get tvdpll clock: %d\n", ret);
+               return ret;
+       }
+
+       dpi->irq = platform_get_irq(pdev, 0);
+       if (dpi->irq <= 0) {
+               dev_err(dev, "Failed to get irq: %d\n", dpi->irq);
+               return -EINVAL;
+       }
+
+       ep = of_graph_get_next_endpoint(dev->of_node, NULL);
+       if (ep) {
+               bridge_node = of_graph_get_remote_port_parent(ep);
+               of_node_put(ep);
+       }
+       if (!bridge_node) {
+               dev_err(dev, "Failed to find bridge node\n");
+               return -ENODEV;
+       }
+
+       dev_info(dev, "Found bridge node: %s\n", bridge_node->full_name);
+
+       dpi->encoder.bridge = of_drm_find_bridge(bridge_node);
+       of_node_put(bridge_node);
+       if (!dpi->encoder.bridge)
+               return -EPROBE_DEFER;
+
+       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI);
+       if (comp_id < 0) {
+               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
+               return comp_id;
+       }
+
+       ret = mtk_ddp_comp_init(dev, dev->of_node, &dpi->ddp_comp, comp_id,
+                               &mtk_dpi_funcs);
+       if (ret) {
+               dev_err(dev, "Failed to initialize component: %d\n", ret);
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, dpi);
+
+       ret = component_add(dev, &mtk_dpi_component_ops);
+       if (ret) {
+               dev_err(dev, "Failed to add component: %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int mtk_dpi_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &mtk_dpi_component_ops);
+
+       return 0;
+}
+
+static const struct of_device_id mtk_dpi_of_ids[] = {
+       { .compatible = "mediatek,mt8173-dpi", },
+       {}
+};
+
+struct platform_driver mtk_dpi_driver = {
+       .probe = mtk_dpi_probe,
+       .remove = mtk_dpi_remove,
+       .driver = {
+               .name = "mediatek-dpi",
+               .of_match_table = mtk_dpi_of_ids,
+       },
+};
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h
new file mode 100644 (file)
index 0000000..4b6ad47
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2014 MediaTek Inc.
+ * Author: Jie Qiu <jie.qiu@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+#ifndef __MTK_DPI_REGS_H
+#define __MTK_DPI_REGS_H
+
+#define DPI_EN                 0x00
+#define EN                             BIT(0)
+
+#define DPI_RET                        0x04
+#define RST                            BIT(0)
+
+#define DPI_INTEN              0x08
+#define INT_VSYNC_EN                   BIT(0)
+#define INT_VDE_EN                     BIT(1)
+#define INT_UNDERFLOW_EN               BIT(2)
+
+#define DPI_INTSTA             0x0C
+#define INT_VSYNC_STA                  BIT(0)
+#define INT_VDE_STA                    BIT(1)
+#define INT_UNDERFLOW_STA              BIT(2)
+
+#define DPI_CON                        0x10
+#define BG_ENABLE                      BIT(0)
+#define IN_RB_SWAP                     BIT(1)
+#define INTL_EN                                BIT(2)
+#define TDFP_EN                                BIT(3)
+#define CLPF_EN                                BIT(4)
+#define YUV422_EN                      BIT(5)
+#define CSC_ENABLE                     BIT(6)
+#define R601_SEL                       BIT(7)
+#define EMBSYNC_EN                     BIT(8)
+#define VS_LODD_EN                     BIT(16)
+#define VS_LEVEN_EN                    BIT(17)
+#define VS_RODD_EN                     BIT(18)
+#define VS_REVEN                       BIT(19)
+#define FAKE_DE_LODD                   BIT(20)
+#define FAKE_DE_LEVEN                  BIT(21)
+#define FAKE_DE_RODD                   BIT(22)
+#define FAKE_DE_REVEN                  BIT(23)
+
+#define DPI_OUTPUT_SETTING     0x14
+#define CH_SWAP                                0
+#define CH_SWAP_MASK                   (0x7 << 0)
+#define SWAP_RGB                       0x00
+#define SWAP_GBR                       0x01
+#define SWAP_BRG                       0x02
+#define SWAP_RBG                       0x03
+#define SWAP_GRB                       0x04
+#define SWAP_BGR                       0x05
+#define BIT_SWAP                       BIT(3)
+#define B_MASK                         BIT(4)
+#define G_MASK                         BIT(5)
+#define R_MASK                         BIT(6)
+#define DE_MASK                                BIT(8)
+#define HS_MASK                                BIT(9)
+#define VS_MASK                                BIT(10)
+#define DE_POL                         BIT(12)
+#define HSYNC_POL                      BIT(13)
+#define VSYNC_POL                      BIT(14)
+#define CK_POL                         BIT(15)
+#define OEN_OFF                                BIT(16)
+#define EDGE_SEL                       BIT(17)
+#define OUT_BIT                                18
+#define OUT_BIT_MASK                   (0x3 << 18)
+#define OUT_BIT_8                      0x00
+#define OUT_BIT_10                     0x01
+#define OUT_BIT_12                     0x02
+#define OUT_BIT_16                     0x03
+#define YC_MAP                         20
+#define YC_MAP_MASK                    (0x7 << 20)
+#define YC_MAP_RGB                     0x00
+#define YC_MAP_CYCY                    0x04
+#define YC_MAP_YCYC                    0x05
+#define YC_MAP_CY                      0x06
+#define YC_MAP_YC                      0x07
+
+#define DPI_SIZE               0x18
+#define HSIZE                          0
+#define HSIZE_MASK                     (0x1FFF << 0)
+#define VSIZE                          16
+#define VSIZE_MASK                     (0x1FFF << 16)
+
+#define DPI_DDR_SETTING                0x1C
+#define DDR_EN                         BIT(0)
+#define DDDR_SEL                       BIT(1)
+#define DDR_4PHASE                     BIT(2)
+#define DDR_WIDTH                      (0x3 << 4)
+#define DDR_PAD_MODE                   (0x1 << 8)
+
+#define DPI_TGEN_HWIDTH                0x20
+#define HPW                            0
+#define HPW_MASK                       (0xFFF << 0)
+
+#define DPI_TGEN_HPORCH                0x24
+#define HBP                            0
+#define HBP_MASK                       (0xFFF << 0)
+#define HFP                            16
+#define HFP_MASK                       (0xFFF << 16)
+
+#define DPI_TGEN_VWIDTH                0x28
+#define DPI_TGEN_VPORCH                0x2C
+
+#define VSYNC_WIDTH_SHIFT              0
+#define VSYNC_WIDTH_MASK               (0xFFF << 0)
+#define VSYNC_HALF_LINE_SHIFT          16
+#define VSYNC_HALF_LINE_MASK           BIT(16)
+#define VSYNC_BACK_PORCH_SHIFT         0
+#define VSYNC_BACK_PORCH_MASK          (0xFFF << 0)
+#define VSYNC_FRONT_PORCH_SHIFT                16
+#define VSYNC_FRONT_PORCH_MASK         (0xFFF << 16)
+
+#define DPI_BG_HCNTL           0x30
+#define BG_RIGHT                       (0x1FFF << 0)
+#define BG_LEFT                                (0x1FFF << 16)
+
+#define DPI_BG_VCNTL           0x34
+#define BG_BOT                         (0x1FFF << 0)
+#define BG_TOP                         (0x1FFF << 16)
+
+#define DPI_BG_COLOR           0x38
+#define BG_B                           (0xF << 0)
+#define BG_G                           (0xF << 8)
+#define BG_R                           (0xF << 16)
+
+#define DPI_FIFO_CTL           0x3C
+#define FIFO_VALID_SET                 (0x1F << 0)
+#define FIFO_RST_SEL                   (0x1 << 8)
+
+#define DPI_STATUS             0x40
+#define VCOUNTER                       (0x1FFF << 0)
+#define DPI_BUSY                       BIT(16)
+#define OUTEN                          BIT(17)
+#define FIELD                          BIT(20)
+#define TDLR                           BIT(21)
+
+#define DPI_TMODE              0x44
+#define DPI_OEN_ON                     BIT(0)
+
+#define DPI_CHECKSUM           0x48
+#define DPI_CHECKSUM_MASK              (0xFFFFFF << 0)
+#define DPI_CHECKSUM_READY             BIT(30)
+#define DPI_CHECKSUM_EN                        BIT(31)
+
+#define DPI_DUMMY              0x50
+#define DPI_DUMMY_MASK                 (0xFFFFFFFF << 0)
+
+#define DPI_TGEN_VWIDTH_LEVEN  0x68
+#define DPI_TGEN_VPORCH_LEVEN  0x6C
+#define DPI_TGEN_VWIDTH_RODD   0x70
+#define DPI_TGEN_VPORCH_RODD   0x74
+#define DPI_TGEN_VWIDTH_REVEN  0x78
+#define DPI_TGEN_VPORCH_REVEN  0x7C
+
+#define DPI_ESAV_VTIMING_LODD  0x80
+#define ESAV_VOFST_LODD                        (0xFFF << 0)
+#define ESAV_VWID_LODD                 (0xFFF << 16)
+
+#define DPI_ESAV_VTIMING_LEVEN 0x84
+#define ESAV_VOFST_LEVEN               (0xFFF << 0)
+#define ESAV_VWID_LEVEN                        (0xFFF << 16)
+
+#define DPI_ESAV_VTIMING_RODD  0x88
+#define ESAV_VOFST_RODD                        (0xFFF << 0)
+#define ESAV_VWID_RODD                 (0xFFF << 16)
+
+#define DPI_ESAV_VTIMING_REVEN 0x8C
+#define ESAV_VOFST_REVEN               (0xFFF << 0)
+#define ESAV_VWID_REVEN                        (0xFFF << 16)
+
+#define DPI_ESAV_FTIMING       0x90
+#define ESAV_FOFST_ODD                 (0xFFF << 0)
+#define ESAV_FOFST_EVEN                        (0xFFF << 16)
+
+#define DPI_CLPF_SETTING       0x94
+#define CLPF_TYPE                      (0x3 << 0)
+#define ROUND_EN                       BIT(4)
+
+#define DPI_Y_LIMIT            0x98
+#define Y_LIMINT_BOT                   0
+#define Y_LIMINT_BOT_MASK              (0xFFF << 0)
+#define Y_LIMINT_TOP                   16
+#define Y_LIMINT_TOP_MASK              (0xFFF << 16)
+
+#define DPI_C_LIMIT            0x9C
+#define C_LIMIT_BOT                    0
+#define C_LIMIT_BOT_MASK               (0xFFF << 0)
+#define C_LIMIT_TOP                    16
+#define C_LIMIT_TOP_MASK               (0xFFF << 16)
+
+#define DPI_YUV422_SETTING     0xA0
+#define UV_SWAP                                BIT(0)
+#define CR_DELSEL                      BIT(4)
+#define CB_DELSEL                      BIT(5)
+#define Y_DELSEL                       BIT(6)
+#define DE_DELSEL                      BIT(7)
+
+#define DPI_EMBSYNC_SETTING    0xA4
+#define EMBSYNC_R_CR_EN                        BIT(0)
+#define EMPSYNC_G_Y_EN                 BIT(1)
+#define EMPSYNC_B_CB_EN                        BIT(2)
+#define ESAV_F_INV                     BIT(4)
+#define ESAV_V_INV                     BIT(5)
+#define ESAV_H_INV                     BIT(6)
+#define ESAV_CODE_MAN                  BIT(8)
+#define VS_OUT_SEL                     (0x7 << 12)
+
+#define DPI_ESAV_CODE_SET0     0xA8
+#define ESAV_CODE0                     (0xFFF << 0)
+#define ESAV_CODE1                     (0xFFF << 16)
+
+#define DPI_ESAV_CODE_SET1     0xAC
+#define ESAV_CODE2                     (0xFFF << 0)
+#define ESAV_CODE3_MSB                 BIT(16)
+
+#define DPI_H_FRE_CON          0xE0
+#define H_FRE_2N                       BIT(25)
+#endif /* __MTK_DPI_REGS_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
new file mode 100644 (file)
index 0000000..24aa3ba
--- /dev/null
@@ -0,0 +1,582 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <asm/barrier.h>
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_plane_helper.h>
+#include <linux/clk.h>
+#include <linux/pm_runtime.h>
+#include <soc/mediatek/smi.h>
+
+#include "mtk_drm_drv.h"
+#include "mtk_drm_crtc.h"
+#include "mtk_drm_ddp.h"
+#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_gem.h"
+#include "mtk_drm_plane.h"
+
+/**
+ * struct mtk_drm_crtc - MediaTek specific crtc structure.
+ * @base: crtc object.
+ * @enabled: records whether crtc_enable succeeded
+ * @planes: array of 4 mtk_drm_plane structures, one for each overlay plane
+ * @pending_planes: whether any plane has pending changes to be applied
+ * @config_regs: memory mapped mmsys configuration register space
+ * @mutex: handle to one of the ten disp_mutex streams
+ * @ddp_comp_nr: number of components in ddp_comp
+ * @ddp_comp: array of pointers the mtk_ddp_comp structures used by this crtc
+ */
+struct mtk_drm_crtc {
+       struct drm_crtc                 base;
+       bool                            enabled;
+
+       bool                            pending_needs_vblank;
+       struct drm_pending_vblank_event *event;
+
+       struct mtk_drm_plane            planes[OVL_LAYER_NR];
+       bool                            pending_planes;
+
+       void __iomem                    *config_regs;
+       struct mtk_disp_mutex           *mutex;
+       unsigned int                    ddp_comp_nr;
+       struct mtk_ddp_comp             **ddp_comp;
+};
+
+struct mtk_crtc_state {
+       struct drm_crtc_state           base;
+
+       bool                            pending_config;
+       unsigned int                    pending_width;
+       unsigned int                    pending_height;
+       unsigned int                    pending_vrefresh;
+};
+
+static inline struct mtk_drm_crtc *to_mtk_crtc(struct drm_crtc *c)
+{
+       return container_of(c, struct mtk_drm_crtc, base);
+}
+
+static inline struct mtk_crtc_state *to_mtk_crtc_state(struct drm_crtc_state *s)
+{
+       return container_of(s, struct mtk_crtc_state, base);
+}
+
+static void mtk_drm_crtc_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
+{
+       struct drm_crtc *crtc = &mtk_crtc->base;
+       unsigned long flags;
+
+       spin_lock_irqsave(&crtc->dev->event_lock, flags);
+       drm_crtc_send_vblank_event(crtc, mtk_crtc->event);
+       drm_crtc_vblank_put(crtc);
+       mtk_crtc->event = NULL;
+       spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
+}
+
+static void mtk_drm_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
+{
+       drm_crtc_handle_vblank(&mtk_crtc->base);
+       if (mtk_crtc->pending_needs_vblank) {
+               mtk_drm_crtc_finish_page_flip(mtk_crtc);
+               mtk_crtc->pending_needs_vblank = false;
+       }
+}
+
+static void mtk_drm_crtc_destroy(struct drm_crtc *crtc)
+{
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       int i;
+
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
+               clk_unprepare(mtk_crtc->ddp_comp[i]->clk);
+
+       mtk_disp_mutex_put(mtk_crtc->mutex);
+
+       drm_crtc_cleanup(crtc);
+}
+
+static void mtk_drm_crtc_reset(struct drm_crtc *crtc)
+{
+       struct mtk_crtc_state *state;
+
+       if (crtc->state) {
+               if (crtc->state->mode_blob)
+                       drm_property_unreference_blob(crtc->state->mode_blob);
+
+               state = to_mtk_crtc_state(crtc->state);
+               memset(state, 0, sizeof(*state));
+       } else {
+               state = kzalloc(sizeof(*state), GFP_KERNEL);
+               if (!state)
+                       return;
+               crtc->state = &state->base;
+       }
+
+       state->base.crtc = crtc;
+}
+
+static struct drm_crtc_state *mtk_drm_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+       struct mtk_crtc_state *state;
+
+       state = kzalloc(sizeof(*state), GFP_KERNEL);
+       if (!state)
+               return NULL;
+
+       __drm_atomic_helper_crtc_duplicate_state(crtc, &state->base);
+
+       WARN_ON(state->base.crtc != crtc);
+       state->base.crtc = crtc;
+
+       return &state->base;
+}
+
+static void mtk_drm_crtc_destroy_state(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *state)
+{
+       __drm_atomic_helper_crtc_destroy_state(state);
+       kfree(to_mtk_crtc_state(state));
+}
+
+static bool mtk_drm_crtc_mode_fixup(struct drm_crtc *crtc,
+                                   const struct drm_display_mode *mode,
+                                   struct drm_display_mode *adjusted_mode)
+{
+       /* Nothing to do here, but this callback is mandatory. */
+       return true;
+}
+
+static void mtk_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
+{
+       struct mtk_crtc_state *state = to_mtk_crtc_state(crtc->state);
+
+       state->pending_width = crtc->mode.hdisplay;
+       state->pending_height = crtc->mode.vdisplay;
+       state->pending_vrefresh = crtc->mode.vrefresh;
+       wmb();  /* Make sure the above parameters are set before update */
+       state->pending_config = true;
+}
+
+int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe)
+{
+       struct mtk_drm_private *priv = drm->dev_private;
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(priv->crtc[pipe]);
+       struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
+
+       mtk_ddp_comp_enable_vblank(ovl, &mtk_crtc->base);
+
+       return 0;
+}
+
+void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe)
+{
+       struct mtk_drm_private *priv = drm->dev_private;
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(priv->crtc[pipe]);
+       struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
+
+       mtk_ddp_comp_disable_vblank(ovl);
+}
+
+static int mtk_crtc_ddp_clk_enable(struct mtk_drm_crtc *mtk_crtc)
+{
+       int ret;
+       int i;
+
+       DRM_DEBUG_DRIVER("%s\n", __func__);
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
+               ret = clk_enable(mtk_crtc->ddp_comp[i]->clk);
+               if (ret) {
+                       DRM_ERROR("Failed to enable clock %d: %d\n", i, ret);
+                       goto err;
+               }
+       }
+
+       return 0;
+err:
+       while (--i >= 0)
+               clk_disable(mtk_crtc->ddp_comp[i]->clk);
+       return ret;
+}
+
+static void mtk_crtc_ddp_clk_disable(struct mtk_drm_crtc *mtk_crtc)
+{
+       int i;
+
+       DRM_DEBUG_DRIVER("%s\n", __func__);
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
+               clk_disable(mtk_crtc->ddp_comp[i]->clk);
+}
+
+static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
+{
+       struct drm_crtc *crtc = &mtk_crtc->base;
+       unsigned int width, height, vrefresh;
+       int ret;
+       int i;
+
+       DRM_DEBUG_DRIVER("%s\n", __func__);
+       if (WARN_ON(!crtc->state))
+               return -EINVAL;
+
+       width = crtc->state->adjusted_mode.hdisplay;
+       height = crtc->state->adjusted_mode.vdisplay;
+       vrefresh = crtc->state->adjusted_mode.vrefresh;
+
+       ret = pm_runtime_get_sync(crtc->dev->dev);
+       if (ret < 0) {
+               DRM_ERROR("Failed to enable power domain: %d\n", ret);
+               return ret;
+       }
+
+       ret = mtk_disp_mutex_prepare(mtk_crtc->mutex);
+       if (ret < 0) {
+               DRM_ERROR("Failed to enable mutex clock: %d\n", ret);
+               goto err_pm_runtime_put;
+       }
+
+       ret = mtk_crtc_ddp_clk_enable(mtk_crtc);
+       if (ret < 0) {
+               DRM_ERROR("Failed to enable component clocks: %d\n", ret);
+               goto err_mutex_unprepare;
+       }
+
+       DRM_DEBUG_DRIVER("mediatek_ddp_ddp_path_setup\n");
+       for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
+               mtk_ddp_add_comp_to_path(mtk_crtc->config_regs,
+                                        mtk_crtc->ddp_comp[i]->id,
+                                        mtk_crtc->ddp_comp[i + 1]->id);
+               mtk_disp_mutex_add_comp(mtk_crtc->mutex,
+                                       mtk_crtc->ddp_comp[i]->id);
+       }
+       mtk_disp_mutex_add_comp(mtk_crtc->mutex, mtk_crtc->ddp_comp[i]->id);
+       mtk_disp_mutex_enable(mtk_crtc->mutex);
+
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
+               struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[i];
+
+               mtk_ddp_comp_config(comp, width, height, vrefresh);
+               mtk_ddp_comp_start(comp);
+       }
+
+       /* Initially configure all planes */
+       for (i = 0; i < OVL_LAYER_NR; i++) {
+               struct drm_plane *plane = &mtk_crtc->planes[i].base;
+               struct mtk_plane_state *plane_state;
+
+               plane_state = to_mtk_plane_state(plane->state);
+               mtk_ddp_comp_layer_config(mtk_crtc->ddp_comp[0], i,
+                                         plane_state);
+       }
+
+       return 0;
+
+err_mutex_unprepare:
+       mtk_disp_mutex_unprepare(mtk_crtc->mutex);
+err_pm_runtime_put:
+       pm_runtime_put(crtc->dev->dev);
+       return ret;
+}
+
+static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
+{
+       struct drm_device *drm = mtk_crtc->base.dev;
+       int i;
+
+       DRM_DEBUG_DRIVER("%s\n", __func__);
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
+               mtk_ddp_comp_stop(mtk_crtc->ddp_comp[i]);
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
+               mtk_disp_mutex_remove_comp(mtk_crtc->mutex,
+                                          mtk_crtc->ddp_comp[i]->id);
+       mtk_disp_mutex_disable(mtk_crtc->mutex);
+       for (i = 0; i < mtk_crtc->ddp_comp_nr - 1; i++) {
+               mtk_ddp_remove_comp_from_path(mtk_crtc->config_regs,
+                                             mtk_crtc->ddp_comp[i]->id,
+                                             mtk_crtc->ddp_comp[i + 1]->id);
+               mtk_disp_mutex_remove_comp(mtk_crtc->mutex,
+                                          mtk_crtc->ddp_comp[i]->id);
+       }
+       mtk_disp_mutex_remove_comp(mtk_crtc->mutex, mtk_crtc->ddp_comp[i]->id);
+       mtk_crtc_ddp_clk_disable(mtk_crtc);
+       mtk_disp_mutex_unprepare(mtk_crtc->mutex);
+
+       pm_runtime_put(drm->dev);
+}
+
+static void mtk_drm_crtc_enable(struct drm_crtc *crtc)
+{
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
+       int ret;
+
+       DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
+
+       ret = mtk_smi_larb_get(ovl->larb_dev);
+       if (ret) {
+               DRM_ERROR("Failed to get larb: %d\n", ret);
+               return;
+       }
+
+       ret = mtk_crtc_ddp_hw_init(mtk_crtc);
+       if (ret) {
+               mtk_smi_larb_put(ovl->larb_dev);
+               return;
+       }
+
+       drm_crtc_vblank_on(crtc);
+       mtk_crtc->enabled = true;
+}
+
+static void mtk_drm_crtc_disable(struct drm_crtc *crtc)
+{
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
+       int i;
+
+       DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
+       if (!mtk_crtc->enabled)
+               return;
+
+       /* Set all pending plane state to disabled */
+       for (i = 0; i < OVL_LAYER_NR; i++) {
+               struct drm_plane *plane = &mtk_crtc->planes[i].base;
+               struct mtk_plane_state *plane_state;
+
+               plane_state = to_mtk_plane_state(plane->state);
+               plane_state->pending.enable = false;
+               plane_state->pending.config = true;
+       }
+       mtk_crtc->pending_planes = true;
+
+       /* Wait for planes to be disabled */
+       drm_crtc_wait_one_vblank(crtc);
+
+       drm_crtc_vblank_off(crtc);
+       mtk_crtc_ddp_hw_fini(mtk_crtc);
+       mtk_smi_larb_put(ovl->larb_dev);
+
+       mtk_crtc->enabled = false;
+}
+
+static void mtk_drm_crtc_atomic_begin(struct drm_crtc *crtc,
+                                     struct drm_crtc_state *old_crtc_state)
+{
+       struct mtk_crtc_state *state = to_mtk_crtc_state(crtc->state);
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+
+       if (mtk_crtc->event && state->base.event)
+               DRM_ERROR("new event while there is still a pending event\n");
+
+       if (state->base.event) {
+               state->base.event->pipe = drm_crtc_index(crtc);
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+               mtk_crtc->event = state->base.event;
+               state->base.event = NULL;
+       }
+}
+
+static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
+                                     struct drm_crtc_state *old_crtc_state)
+{
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       unsigned int pending_planes = 0;
+       int i;
+
+       if (mtk_crtc->event)
+               mtk_crtc->pending_needs_vblank = true;
+       for (i = 0; i < OVL_LAYER_NR; i++) {
+               struct drm_plane *plane = &mtk_crtc->planes[i].base;
+               struct mtk_plane_state *plane_state;
+
+               plane_state = to_mtk_plane_state(plane->state);
+               if (plane_state->pending.dirty) {
+                       plane_state->pending.config = true;
+                       plane_state->pending.dirty = false;
+                       pending_planes |= BIT(i);
+               }
+       }
+       if (pending_planes)
+               mtk_crtc->pending_planes = true;
+}
+
+static const struct drm_crtc_funcs mtk_crtc_funcs = {
+       .set_config             = drm_atomic_helper_set_config,
+       .page_flip              = drm_atomic_helper_page_flip,
+       .destroy                = mtk_drm_crtc_destroy,
+       .reset                  = mtk_drm_crtc_reset,
+       .atomic_duplicate_state = mtk_drm_crtc_duplicate_state,
+       .atomic_destroy_state   = mtk_drm_crtc_destroy_state,
+};
+
+static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
+       .mode_fixup     = mtk_drm_crtc_mode_fixup,
+       .mode_set_nofb  = mtk_drm_crtc_mode_set_nofb,
+       .enable         = mtk_drm_crtc_enable,
+       .disable        = mtk_drm_crtc_disable,
+       .atomic_begin   = mtk_drm_crtc_atomic_begin,
+       .atomic_flush   = mtk_drm_crtc_atomic_flush,
+};
+
+static int mtk_drm_crtc_init(struct drm_device *drm,
+                            struct mtk_drm_crtc *mtk_crtc,
+                            struct drm_plane *primary,
+                            struct drm_plane *cursor, unsigned int pipe)
+{
+       int ret;
+
+       ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor,
+                                       &mtk_crtc_funcs, NULL);
+       if (ret)
+               goto err_cleanup_crtc;
+
+       drm_crtc_helper_add(&mtk_crtc->base, &mtk_crtc_helper_funcs);
+
+       return 0;
+
+err_cleanup_crtc:
+       drm_crtc_cleanup(&mtk_crtc->base);
+       return ret;
+}
+
+void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl)
+{
+       struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+       struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state);
+       unsigned int i;
+
+       /*
+        * TODO: instead of updating the registers here, we should prepare
+        * working registers in atomic_commit and let the hardware command
+        * queue update module registers on vblank.
+        */
+       if (state->pending_config) {
+               mtk_ddp_comp_config(ovl, state->pending_width,
+                                   state->pending_height,
+                                   state->pending_vrefresh);
+
+               state->pending_config = false;
+       }
+
+       if (mtk_crtc->pending_planes) {
+               for (i = 0; i < OVL_LAYER_NR; i++) {
+                       struct drm_plane *plane = &mtk_crtc->planes[i].base;
+                       struct mtk_plane_state *plane_state;
+
+                       plane_state = to_mtk_plane_state(plane->state);
+
+                       if (plane_state->pending.config) {
+                               mtk_ddp_comp_layer_config(ovl, i, plane_state);
+                               plane_state->pending.config = false;
+                       }
+               }
+               mtk_crtc->pending_planes = false;
+       }
+
+       mtk_drm_finish_page_flip(mtk_crtc);
+}
+
+int mtk_drm_crtc_create(struct drm_device *drm_dev,
+                       const enum mtk_ddp_comp_id *path, unsigned int path_len)
+{
+       struct mtk_drm_private *priv = drm_dev->dev_private;
+       struct device *dev = drm_dev->dev;
+       struct mtk_drm_crtc *mtk_crtc;
+       enum drm_plane_type type;
+       unsigned int zpos;
+       int pipe = priv->num_pipes;
+       int ret;
+       int i;
+
+       for (i = 0; i < path_len; i++) {
+               enum mtk_ddp_comp_id comp_id = path[i];
+               struct device_node *node;
+
+               node = priv->comp_node[comp_id];
+               if (!node) {
+                       dev_info(dev,
+                                "Not creating crtc %d because component %d is disabled or missing\n",
+                                pipe, comp_id);
+                       return 0;
+               }
+       }
+
+       mtk_crtc = devm_kzalloc(dev, sizeof(*mtk_crtc), GFP_KERNEL);
+       if (!mtk_crtc)
+               return -ENOMEM;
+
+       mtk_crtc->config_regs = priv->config_regs;
+       mtk_crtc->ddp_comp_nr = path_len;
+       mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr,
+                                               sizeof(*mtk_crtc->ddp_comp),
+                                               GFP_KERNEL);
+
+       mtk_crtc->mutex = mtk_disp_mutex_get(priv->mutex_dev, pipe);
+       if (IS_ERR(mtk_crtc->mutex)) {
+               ret = PTR_ERR(mtk_crtc->mutex);
+               dev_err(dev, "Failed to get mutex: %d\n", ret);
+               return ret;
+       }
+
+       for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
+               enum mtk_ddp_comp_id comp_id = path[i];
+               struct mtk_ddp_comp *comp;
+               struct device_node *node;
+
+               node = priv->comp_node[comp_id];
+               comp = priv->ddp_comp[comp_id];
+               if (!comp) {
+                       dev_err(dev, "Component %s not initialized\n",
+                               node->full_name);
+                       ret = -ENODEV;
+                       goto unprepare;
+               }
+
+               ret = clk_prepare(comp->clk);
+               if (ret) {
+                       dev_err(dev,
+                               "Failed to prepare clock for component %s: %d\n",
+                               node->full_name, ret);
+                       goto unprepare;
+               }
+
+               mtk_crtc->ddp_comp[i] = comp;
+       }
+
+       for (zpos = 0; zpos < OVL_LAYER_NR; zpos++) {
+               type = (zpos == 0) ? DRM_PLANE_TYPE_PRIMARY :
+                               (zpos == 1) ? DRM_PLANE_TYPE_CURSOR :
+                                               DRM_PLANE_TYPE_OVERLAY;
+               ret = mtk_plane_init(drm_dev, &mtk_crtc->planes[zpos],
+                                    BIT(pipe), type, zpos);
+               if (ret)
+                       goto unprepare;
+       }
+
+       ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0].base,
+                               &mtk_crtc->planes[1].base, pipe);
+       if (ret < 0)
+               goto unprepare;
+
+       priv->crtc[pipe] = &mtk_crtc->base;
+       priv->num_pipes++;
+
+       return 0;
+
+unprepare:
+       while (--i >= 0)
+               clk_unprepare(mtk_crtc->ddp_comp[i]->clk);
+
+       return ret;
+}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
new file mode 100644 (file)
index 0000000..81e5566
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef MTK_DRM_CRTC_H
+#define MTK_DRM_CRTC_H
+
+#include <drm/drm_crtc.h>
+#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_plane.h"
+
+#define OVL_LAYER_NR   4
+
+int mtk_drm_crtc_enable_vblank(struct drm_device *drm, unsigned int pipe);
+void mtk_drm_crtc_disable_vblank(struct drm_device *drm, unsigned int pipe);
+void mtk_drm_crtc_check_flush(struct drm_crtc *crtc);
+void mtk_drm_crtc_commit(struct drm_crtc *crtc);
+void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl);
+int mtk_drm_crtc_create(struct drm_device *drm_dev,
+                       const enum mtk_ddp_comp_id *path,
+                       unsigned int path_len);
+
+#endif /* MTK_DRM_CRTC_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp.c
new file mode 100644 (file)
index 0000000..17ba935
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+
+#include "mtk_drm_ddp.h"
+#include "mtk_drm_ddp_comp.h"
+
+#define DISP_REG_CONFIG_DISP_OVL0_MOUT_EN      0x040
+#define DISP_REG_CONFIG_DISP_OVL1_MOUT_EN      0x044
+#define DISP_REG_CONFIG_DISP_OD_MOUT_EN                0x048
+#define DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN     0x04c
+#define DISP_REG_CONFIG_DISP_UFOE_MOUT_EN      0x050
+#define DISP_REG_CONFIG_DISP_COLOR0_SEL_IN     0x084
+#define DISP_REG_CONFIG_DISP_COLOR1_SEL_IN     0x088
+#define DISP_REG_CONFIG_DPI_SEL_IN             0x0ac
+#define DISP_REG_CONFIG_DISP_RDMA1_MOUT_EN     0x0c8
+#define DISP_REG_CONFIG_MMSYS_CG_CON0          0x100
+
+#define DISP_REG_MUTEX_EN(n)   (0x20 + 0x20 * (n))
+#define DISP_REG_MUTEX_RST(n)  (0x28 + 0x20 * (n))
+#define DISP_REG_MUTEX_MOD(n)  (0x2c + 0x20 * (n))
+#define DISP_REG_MUTEX_SOF(n)  (0x30 + 0x20 * (n))
+
+#define MUTEX_MOD_DISP_OVL0            BIT(11)
+#define MUTEX_MOD_DISP_OVL1            BIT(12)
+#define MUTEX_MOD_DISP_RDMA0           BIT(13)
+#define MUTEX_MOD_DISP_RDMA1           BIT(14)
+#define MUTEX_MOD_DISP_RDMA2           BIT(15)
+#define MUTEX_MOD_DISP_WDMA0           BIT(16)
+#define MUTEX_MOD_DISP_WDMA1           BIT(17)
+#define MUTEX_MOD_DISP_COLOR0          BIT(18)
+#define MUTEX_MOD_DISP_COLOR1          BIT(19)
+#define MUTEX_MOD_DISP_AAL             BIT(20)
+#define MUTEX_MOD_DISP_GAMMA           BIT(21)
+#define MUTEX_MOD_DISP_UFOE            BIT(22)
+#define MUTEX_MOD_DISP_PWM0            BIT(23)
+#define MUTEX_MOD_DISP_PWM1            BIT(24)
+#define MUTEX_MOD_DISP_OD              BIT(25)
+
+#define MUTEX_SOF_SINGLE_MODE          0
+#define MUTEX_SOF_DSI0                 1
+#define MUTEX_SOF_DSI1                 2
+#define MUTEX_SOF_DPI0                 3
+
+#define OVL0_MOUT_EN_COLOR0            0x1
+#define OD_MOUT_EN_RDMA0               0x1
+#define UFOE_MOUT_EN_DSI0              0x1
+#define COLOR0_SEL_IN_OVL0             0x1
+#define OVL1_MOUT_EN_COLOR1            0x1
+#define GAMMA_MOUT_EN_RDMA1            0x1
+#define RDMA1_MOUT_DPI0                        0x2
+#define DPI0_SEL_IN_RDMA1              0x1
+#define COLOR1_SEL_IN_OVL1             0x1
+
+struct mtk_disp_mutex {
+       int id;
+       bool claimed;
+};
+
+struct mtk_ddp {
+       struct device                   *dev;
+       struct clk                      *clk;
+       void __iomem                    *regs;
+       struct mtk_disp_mutex           mutex[10];
+};
+
+static const unsigned int mutex_mod[DDP_COMPONENT_ID_MAX] = {
+       [DDP_COMPONENT_AAL] = MUTEX_MOD_DISP_AAL,
+       [DDP_COMPONENT_COLOR0] = MUTEX_MOD_DISP_COLOR0,
+       [DDP_COMPONENT_COLOR1] = MUTEX_MOD_DISP_COLOR1,
+       [DDP_COMPONENT_GAMMA] = MUTEX_MOD_DISP_GAMMA,
+       [DDP_COMPONENT_OD] = MUTEX_MOD_DISP_OD,
+       [DDP_COMPONENT_OVL0] = MUTEX_MOD_DISP_OVL0,
+       [DDP_COMPONENT_OVL1] = MUTEX_MOD_DISP_OVL1,
+       [DDP_COMPONENT_PWM0] = MUTEX_MOD_DISP_PWM0,
+       [DDP_COMPONENT_PWM1] = MUTEX_MOD_DISP_PWM1,
+       [DDP_COMPONENT_RDMA0] = MUTEX_MOD_DISP_RDMA0,
+       [DDP_COMPONENT_RDMA1] = MUTEX_MOD_DISP_RDMA1,
+       [DDP_COMPONENT_RDMA2] = MUTEX_MOD_DISP_RDMA2,
+       [DDP_COMPONENT_UFOE] = MUTEX_MOD_DISP_UFOE,
+       [DDP_COMPONENT_WDMA0] = MUTEX_MOD_DISP_WDMA0,
+       [DDP_COMPONENT_WDMA1] = MUTEX_MOD_DISP_WDMA1,
+};
+
+static unsigned int mtk_ddp_mout_en(enum mtk_ddp_comp_id cur,
+                                   enum mtk_ddp_comp_id next,
+                                   unsigned int *addr)
+{
+       unsigned int value;
+
+       if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) {
+               *addr = DISP_REG_CONFIG_DISP_OVL0_MOUT_EN;
+               value = OVL0_MOUT_EN_COLOR0;
+       } else if (cur == DDP_COMPONENT_OD && next == DDP_COMPONENT_RDMA0) {
+               *addr = DISP_REG_CONFIG_DISP_OD_MOUT_EN;
+               value = OD_MOUT_EN_RDMA0;
+       } else if (cur == DDP_COMPONENT_UFOE && next == DDP_COMPONENT_DSI0) {
+               *addr = DISP_REG_CONFIG_DISP_UFOE_MOUT_EN;
+               value = UFOE_MOUT_EN_DSI0;
+       } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) {
+               *addr = DISP_REG_CONFIG_DISP_OVL1_MOUT_EN;
+               value = OVL1_MOUT_EN_COLOR1;
+       } else if (cur == DDP_COMPONENT_GAMMA && next == DDP_COMPONENT_RDMA1) {
+               *addr = DISP_REG_CONFIG_DISP_GAMMA_MOUT_EN;
+               value = GAMMA_MOUT_EN_RDMA1;
+       } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) {
+               *addr = DISP_REG_CONFIG_DISP_RDMA1_MOUT_EN;
+               value = RDMA1_MOUT_DPI0;
+       } else {
+               value = 0;
+       }
+
+       return value;
+}
+
+static unsigned int mtk_ddp_sel_in(enum mtk_ddp_comp_id cur,
+                                  enum mtk_ddp_comp_id next,
+                                  unsigned int *addr)
+{
+       unsigned int value;
+
+       if (cur == DDP_COMPONENT_OVL0 && next == DDP_COMPONENT_COLOR0) {
+               *addr = DISP_REG_CONFIG_DISP_COLOR0_SEL_IN;
+               value = COLOR0_SEL_IN_OVL0;
+       } else if (cur == DDP_COMPONENT_RDMA1 && next == DDP_COMPONENT_DPI0) {
+               *addr = DISP_REG_CONFIG_DPI_SEL_IN;
+               value = DPI0_SEL_IN_RDMA1;
+       } else if (cur == DDP_COMPONENT_OVL1 && next == DDP_COMPONENT_COLOR1) {
+               *addr = DISP_REG_CONFIG_DISP_COLOR1_SEL_IN;
+               value = COLOR1_SEL_IN_OVL1;
+       } else {
+               value = 0;
+       }
+
+       return value;
+}
+
+void mtk_ddp_add_comp_to_path(void __iomem *config_regs,
+                             enum mtk_ddp_comp_id cur,
+                             enum mtk_ddp_comp_id next)
+{
+       unsigned int addr, value, reg;
+
+       value = mtk_ddp_mout_en(cur, next, &addr);
+       if (value) {
+               reg = readl_relaxed(config_regs + addr) | value;
+               writel_relaxed(reg, config_regs + addr);
+       }
+
+       value = mtk_ddp_sel_in(cur, next, &addr);
+       if (value) {
+               reg = readl_relaxed(config_regs + addr) | value;
+               writel_relaxed(reg, config_regs + addr);
+       }
+}
+
+void mtk_ddp_remove_comp_from_path(void __iomem *config_regs,
+                                  enum mtk_ddp_comp_id cur,
+                                  enum mtk_ddp_comp_id next)
+{
+       unsigned int addr, value, reg;
+
+       value = mtk_ddp_mout_en(cur, next, &addr);
+       if (value) {
+               reg = readl_relaxed(config_regs + addr) & ~value;
+               writel_relaxed(reg, config_regs + addr);
+       }
+
+       value = mtk_ddp_sel_in(cur, next, &addr);
+       if (value) {
+               reg = readl_relaxed(config_regs + addr) & ~value;
+               writel_relaxed(reg, config_regs + addr);
+       }
+}
+
+struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id)
+{
+       struct mtk_ddp *ddp = dev_get_drvdata(dev);
+
+       if (id >= 10)
+               return ERR_PTR(-EINVAL);
+       if (ddp->mutex[id].claimed)
+               return ERR_PTR(-EBUSY);
+
+       ddp->mutex[id].claimed = true;
+
+       return &ddp->mutex[id];
+}
+
+void mtk_disp_mutex_put(struct mtk_disp_mutex *mutex)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+
+       WARN_ON(&ddp->mutex[mutex->id] != mutex);
+
+       mutex->claimed = false;
+}
+
+int mtk_disp_mutex_prepare(struct mtk_disp_mutex *mutex)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+       return clk_prepare_enable(ddp->clk);
+}
+
+void mtk_disp_mutex_unprepare(struct mtk_disp_mutex *mutex)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+       clk_disable_unprepare(ddp->clk);
+}
+
+void mtk_disp_mutex_add_comp(struct mtk_disp_mutex *mutex,
+                            enum mtk_ddp_comp_id id)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+       unsigned int reg;
+
+       WARN_ON(&ddp->mutex[mutex->id] != mutex);
+
+       switch (id) {
+       case DDP_COMPONENT_DSI0:
+               reg = MUTEX_SOF_DSI0;
+               break;
+       case DDP_COMPONENT_DSI1:
+               reg = MUTEX_SOF_DSI0;
+               break;
+       case DDP_COMPONENT_DPI0:
+               reg = MUTEX_SOF_DPI0;
+               break;
+       default:
+               reg = readl_relaxed(ddp->regs + DISP_REG_MUTEX_MOD(mutex->id));
+               reg |= mutex_mod[id];
+               writel_relaxed(reg, ddp->regs + DISP_REG_MUTEX_MOD(mutex->id));
+               return;
+       }
+
+       writel_relaxed(reg, ddp->regs + DISP_REG_MUTEX_SOF(mutex->id));
+}
+
+void mtk_disp_mutex_remove_comp(struct mtk_disp_mutex *mutex,
+                               enum mtk_ddp_comp_id id)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+       unsigned int reg;
+
+       WARN_ON(&ddp->mutex[mutex->id] != mutex);
+
+       switch (id) {
+       case DDP_COMPONENT_DSI0:
+       case DDP_COMPONENT_DSI1:
+       case DDP_COMPONENT_DPI0:
+               writel_relaxed(MUTEX_SOF_SINGLE_MODE,
+                              ddp->regs + DISP_REG_MUTEX_SOF(mutex->id));
+               break;
+       default:
+               reg = readl_relaxed(ddp->regs + DISP_REG_MUTEX_MOD(mutex->id));
+               reg &= ~mutex_mod[id];
+               writel_relaxed(reg, ddp->regs + DISP_REG_MUTEX_MOD(mutex->id));
+               break;
+       }
+}
+
+void mtk_disp_mutex_enable(struct mtk_disp_mutex *mutex)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+
+       WARN_ON(&ddp->mutex[mutex->id] != mutex);
+
+       writel(1, ddp->regs + DISP_REG_MUTEX_EN(mutex->id));
+}
+
+void mtk_disp_mutex_disable(struct mtk_disp_mutex *mutex)
+{
+       struct mtk_ddp *ddp = container_of(mutex, struct mtk_ddp,
+                                          mutex[mutex->id]);
+
+       WARN_ON(&ddp->mutex[mutex->id] != mutex);
+
+       writel(0, ddp->regs + DISP_REG_MUTEX_EN(mutex->id));
+}
+
+static int mtk_ddp_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_ddp *ddp;
+       struct resource *regs;
+       int i;
+
+       ddp = devm_kzalloc(dev, sizeof(*ddp), GFP_KERNEL);
+       if (!ddp)
+               return -ENOMEM;
+
+       for (i = 0; i < 10; i++)
+               ddp->mutex[i].id = i;
+
+       ddp->clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(ddp->clk)) {
+               dev_err(dev, "Failed to get clock\n");
+               return PTR_ERR(ddp->clk);
+       }
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       ddp->regs = devm_ioremap_resource(dev, regs);
+       if (IS_ERR(ddp->regs)) {
+               dev_err(dev, "Failed to map mutex registers\n");
+               return PTR_ERR(ddp->regs);
+       }
+
+       platform_set_drvdata(pdev, ddp);
+
+       return 0;
+}
+
+static int mtk_ddp_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+static const struct of_device_id ddp_driver_dt_match[] = {
+       { .compatible = "mediatek,mt8173-disp-mutex" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, ddp_driver_dt_match);
+
+struct platform_driver mtk_ddp_driver = {
+       .probe          = mtk_ddp_probe,
+       .remove         = mtk_ddp_remove,
+       .driver         = {
+               .name   = "mediatek-ddp",
+               .owner  = THIS_MODULE,
+               .of_match_table = ddp_driver_dt_match,
+       },
+};
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp.h
new file mode 100644 (file)
index 0000000..92c1175
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef MTK_DRM_DDP_H
+#define MTK_DRM_DDP_H
+
+#include "mtk_drm_ddp_comp.h"
+
+struct regmap;
+struct device;
+struct mtk_disp_mutex;
+
+void mtk_ddp_add_comp_to_path(void __iomem *config_regs,
+                             enum mtk_ddp_comp_id cur,
+                             enum mtk_ddp_comp_id next);
+void mtk_ddp_remove_comp_from_path(void __iomem *config_regs,
+                                  enum mtk_ddp_comp_id cur,
+                                  enum mtk_ddp_comp_id next);
+
+struct mtk_disp_mutex *mtk_disp_mutex_get(struct device *dev, unsigned int id);
+int mtk_disp_mutex_prepare(struct mtk_disp_mutex *mutex);
+void mtk_disp_mutex_add_comp(struct mtk_disp_mutex *mutex,
+                            enum mtk_ddp_comp_id id);
+void mtk_disp_mutex_enable(struct mtk_disp_mutex *mutex);
+void mtk_disp_mutex_disable(struct mtk_disp_mutex *mutex);
+void mtk_disp_mutex_remove_comp(struct mtk_disp_mutex *mutex,
+                               enum mtk_ddp_comp_id id);
+void mtk_disp_mutex_unprepare(struct mtk_disp_mutex *mutex);
+void mtk_disp_mutex_put(struct mtk_disp_mutex *mutex);
+
+#endif /* MTK_DRM_DDP_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
new file mode 100644 (file)
index 0000000..3970fcf
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Authors:
+ *     YT Shen <yt.shen@mediatek.com>
+ *     CK Hu <ck.hu@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+#include <drm/drmP.h>
+#include "mtk_drm_drv.h"
+#include "mtk_drm_plane.h"
+#include "mtk_drm_ddp_comp.h"
+
+#define DISP_OD_EN                             0x0000
+#define DISP_OD_INTEN                          0x0008
+#define DISP_OD_INTSTA                         0x000c
+#define DISP_OD_CFG                            0x0020
+#define DISP_OD_SIZE                           0x0030
+
+#define DISP_REG_UFO_START                     0x0000
+
+#define DISP_COLOR_CFG_MAIN                    0x0400
+#define DISP_COLOR_START                       0x0c00
+#define DISP_COLOR_WIDTH                       0x0c50
+#define DISP_COLOR_HEIGHT                      0x0c54
+
+#define        OD_RELAY_MODE           BIT(0)
+
+#define        UFO_BYPASS              BIT(2)
+
+#define        COLOR_BYPASS_ALL        BIT(7)
+#define        COLOR_SEQ_SEL           BIT(13)
+
+static void mtk_color_config(struct mtk_ddp_comp *comp, unsigned int w,
+                            unsigned int h, unsigned int vrefresh)
+{
+       writel(w, comp->regs + DISP_COLOR_WIDTH);
+       writel(h, comp->regs + DISP_COLOR_HEIGHT);
+}
+
+static void mtk_color_start(struct mtk_ddp_comp *comp)
+{
+       writel(COLOR_BYPASS_ALL | COLOR_SEQ_SEL,
+              comp->regs + DISP_COLOR_CFG_MAIN);
+       writel(0x1, comp->regs + DISP_COLOR_START);
+}
+
+static void mtk_od_config(struct mtk_ddp_comp *comp, unsigned int w,
+                         unsigned int h, unsigned int vrefresh)
+{
+       writel(w << 16 | h, comp->regs + DISP_OD_SIZE);
+}
+
+static void mtk_od_start(struct mtk_ddp_comp *comp)
+{
+       writel(OD_RELAY_MODE, comp->regs + DISP_OD_CFG);
+       writel(1, comp->regs + DISP_OD_EN);
+}
+
+static void mtk_ufoe_start(struct mtk_ddp_comp *comp)
+{
+       writel(UFO_BYPASS, comp->regs + DISP_REG_UFO_START);
+}
+
+static const struct mtk_ddp_comp_funcs ddp_color = {
+       .config = mtk_color_config,
+       .start = mtk_color_start,
+};
+
+static const struct mtk_ddp_comp_funcs ddp_od = {
+       .config = mtk_od_config,
+       .start = mtk_od_start,
+};
+
+static const struct mtk_ddp_comp_funcs ddp_ufoe = {
+       .start = mtk_ufoe_start,
+};
+
+static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = {
+       [MTK_DISP_OVL] = "ovl",
+       [MTK_DISP_RDMA] = "rdma",
+       [MTK_DISP_WDMA] = "wdma",
+       [MTK_DISP_COLOR] = "color",
+       [MTK_DISP_AAL] = "aal",
+       [MTK_DISP_GAMMA] = "gamma",
+       [MTK_DISP_UFOE] = "ufoe",
+       [MTK_DSI] = "dsi",
+       [MTK_DPI] = "dpi",
+       [MTK_DISP_PWM] = "pwm",
+       [MTK_DISP_MUTEX] = "mutex",
+       [MTK_DISP_OD] = "od",
+};
+
+struct mtk_ddp_comp_match {
+       enum mtk_ddp_comp_type type;
+       int alias_id;
+       const struct mtk_ddp_comp_funcs *funcs;
+};
+
+static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = {
+       [DDP_COMPONENT_AAL]     = { MTK_DISP_AAL,       0, NULL },
+       [DDP_COMPONENT_COLOR0]  = { MTK_DISP_COLOR,     0, &ddp_color },
+       [DDP_COMPONENT_COLOR1]  = { MTK_DISP_COLOR,     1, &ddp_color },
+       [DDP_COMPONENT_DPI0]    = { MTK_DPI,            0, NULL },
+       [DDP_COMPONENT_DSI0]    = { MTK_DSI,            0, NULL },
+       [DDP_COMPONENT_DSI1]    = { MTK_DSI,            1, NULL },
+       [DDP_COMPONENT_GAMMA]   = { MTK_DISP_GAMMA,     0, NULL },
+       [DDP_COMPONENT_OD]      = { MTK_DISP_OD,        0, &ddp_od },
+       [DDP_COMPONENT_OVL0]    = { MTK_DISP_OVL,       0, NULL },
+       [DDP_COMPONENT_OVL1]    = { MTK_DISP_OVL,       1, NULL },
+       [DDP_COMPONENT_PWM0]    = { MTK_DISP_PWM,       0, NULL },
+       [DDP_COMPONENT_RDMA0]   = { MTK_DISP_RDMA,      0, NULL },
+       [DDP_COMPONENT_RDMA1]   = { MTK_DISP_RDMA,      1, NULL },
+       [DDP_COMPONENT_RDMA2]   = { MTK_DISP_RDMA,      2, NULL },
+       [DDP_COMPONENT_UFOE]    = { MTK_DISP_UFOE,      0, &ddp_ufoe },
+       [DDP_COMPONENT_WDMA0]   = { MTK_DISP_WDMA,      0, NULL },
+       [DDP_COMPONENT_WDMA1]   = { MTK_DISP_WDMA,      1, NULL },
+};
+
+int mtk_ddp_comp_get_id(struct device_node *node,
+                       enum mtk_ddp_comp_type comp_type)
+{
+       int id = of_alias_get_id(node, mtk_ddp_comp_stem[comp_type]);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mtk_ddp_matches); i++) {
+               if (comp_type == mtk_ddp_matches[i].type &&
+                   (id < 0 || id == mtk_ddp_matches[i].alias_id))
+                       return i;
+       }
+
+       return -EINVAL;
+}
+
+int mtk_ddp_comp_init(struct device *dev, struct device_node *node,
+                     struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
+                     const struct mtk_ddp_comp_funcs *funcs)
+{
+       enum mtk_ddp_comp_type type;
+       struct device_node *larb_node;
+       struct platform_device *larb_pdev;
+
+       if (comp_id < 0 || comp_id >= DDP_COMPONENT_ID_MAX)
+               return -EINVAL;
+
+       comp->id = comp_id;
+       comp->funcs = funcs ?: mtk_ddp_matches[comp_id].funcs;
+
+       if (comp_id == DDP_COMPONENT_DPI0 ||
+           comp_id == DDP_COMPONENT_DSI0 ||
+           comp_id == DDP_COMPONENT_PWM0) {
+               comp->regs = NULL;
+               comp->clk = NULL;
+               comp->irq = 0;
+               return 0;
+       }
+
+       comp->regs = of_iomap(node, 0);
+       comp->irq = of_irq_get(node, 0);
+       comp->clk = of_clk_get(node, 0);
+       if (IS_ERR(comp->clk))
+               comp->clk = NULL;
+
+       type = mtk_ddp_matches[comp_id].type;
+
+       /* Only DMA capable components need the LARB property */
+       comp->larb_dev = NULL;
+       if (type != MTK_DISP_OVL &&
+           type != MTK_DISP_RDMA &&
+           type != MTK_DISP_WDMA)
+               return 0;
+
+       larb_node = of_parse_phandle(node, "mediatek,larb", 0);
+       if (!larb_node) {
+               dev_err(dev,
+                       "Missing mediadek,larb phandle in %s node\n",
+                       node->full_name);
+               return -EINVAL;
+       }
+
+       larb_pdev = of_find_device_by_node(larb_node);
+       if (!larb_pdev) {
+               dev_warn(dev, "Waiting for larb device %s\n",
+                        larb_node->full_name);
+               of_node_put(larb_node);
+               return -EPROBE_DEFER;
+       }
+       of_node_put(larb_node);
+
+       comp->larb_dev = &larb_pdev->dev;
+
+       return 0;
+}
+
+int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp)
+{
+       struct mtk_drm_private *private = drm->dev_private;
+
+       if (private->ddp_comp[comp->id])
+               return -EBUSY;
+
+       private->ddp_comp[comp->id] = comp;
+       return 0;
+}
+
+void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp)
+{
+       struct mtk_drm_private *private = drm->dev_private;
+
+       private->ddp_comp[comp->id] = NULL;
+}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
new file mode 100644 (file)
index 0000000..6b13ba9
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef MTK_DRM_DDP_COMP_H
+#define MTK_DRM_DDP_COMP_H
+
+#include <linux/io.h>
+
+struct device;
+struct device_node;
+struct drm_crtc;
+struct drm_device;
+struct mtk_plane_state;
+
+enum mtk_ddp_comp_type {
+       MTK_DISP_OVL,
+       MTK_DISP_RDMA,
+       MTK_DISP_WDMA,
+       MTK_DISP_COLOR,
+       MTK_DISP_AAL,
+       MTK_DISP_GAMMA,
+       MTK_DISP_UFOE,
+       MTK_DSI,
+       MTK_DPI,
+       MTK_DISP_PWM,
+       MTK_DISP_MUTEX,
+       MTK_DISP_OD,
+       MTK_DDP_COMP_TYPE_MAX,
+};
+
+enum mtk_ddp_comp_id {
+       DDP_COMPONENT_AAL,
+       DDP_COMPONENT_COLOR0,
+       DDP_COMPONENT_COLOR1,
+       DDP_COMPONENT_DPI0,
+       DDP_COMPONENT_DSI0,
+       DDP_COMPONENT_DSI1,
+       DDP_COMPONENT_GAMMA,
+       DDP_COMPONENT_OD,
+       DDP_COMPONENT_OVL0,
+       DDP_COMPONENT_OVL1,
+       DDP_COMPONENT_PWM0,
+       DDP_COMPONENT_PWM1,
+       DDP_COMPONENT_RDMA0,
+       DDP_COMPONENT_RDMA1,
+       DDP_COMPONENT_RDMA2,
+       DDP_COMPONENT_UFOE,
+       DDP_COMPONENT_WDMA0,
+       DDP_COMPONENT_WDMA1,
+       DDP_COMPONENT_ID_MAX,
+};
+
+struct mtk_ddp_comp;
+
+struct mtk_ddp_comp_funcs {
+       void (*config)(struct mtk_ddp_comp *comp, unsigned int w,
+                      unsigned int h, unsigned int vrefresh);
+       void (*start)(struct mtk_ddp_comp *comp);
+       void (*stop)(struct mtk_ddp_comp *comp);
+       void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
+       void (*disable_vblank)(struct mtk_ddp_comp *comp);
+       void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
+       void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
+       void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx,
+                            struct mtk_plane_state *state);
+};
+
+struct mtk_ddp_comp {
+       struct clk *clk;
+       void __iomem *regs;
+       int irq;
+       struct device *larb_dev;
+       enum mtk_ddp_comp_id id;
+       const struct mtk_ddp_comp_funcs *funcs;
+};
+
+static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
+                                      unsigned int w, unsigned int h,
+                                      unsigned int vrefresh)
+{
+       if (comp->funcs && comp->funcs->config)
+               comp->funcs->config(comp, w, h, vrefresh);
+}
+
+static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
+{
+       if (comp->funcs && comp->funcs->start)
+               comp->funcs->start(comp);
+}
+
+static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
+{
+       if (comp->funcs && comp->funcs->stop)
+               comp->funcs->stop(comp);
+}
+
+static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp,
+                                             struct drm_crtc *crtc)
+{
+       if (comp->funcs && comp->funcs->enable_vblank)
+               comp->funcs->enable_vblank(comp, crtc);
+}
+
+static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
+{
+       if (comp->funcs && comp->funcs->disable_vblank)
+               comp->funcs->disable_vblank(comp);
+}
+
+static inline void mtk_ddp_comp_layer_on(struct mtk_ddp_comp *comp,
+                                        unsigned int idx)
+{
+       if (comp->funcs && comp->funcs->layer_on)
+               comp->funcs->layer_on(comp, idx);
+}
+
+static inline void mtk_ddp_comp_layer_off(struct mtk_ddp_comp *comp,
+                                         unsigned int idx)
+{
+       if (comp->funcs && comp->funcs->layer_off)
+               comp->funcs->layer_off(comp, idx);
+}
+
+static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
+                                            unsigned int idx,
+                                            struct mtk_plane_state *state)
+{
+       if (comp->funcs && comp->funcs->layer_config)
+               comp->funcs->layer_config(comp, idx, state);
+}
+
+int mtk_ddp_comp_get_id(struct device_node *node,
+                       enum mtk_ddp_comp_type comp_type);
+int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node,
+                     struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
+                     const struct mtk_ddp_comp_funcs *funcs);
+int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
+void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
+
+#endif /* MTK_DRM_DDP_COMP_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
new file mode 100644 (file)
index 0000000..b1223d5
--- /dev/null
@@ -0,0 +1,567 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Author: YT SHEN <yt.shen@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <linux/component.h>
+#include <linux/iommu.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/pm_runtime.h>
+
+#include "mtk_drm_crtc.h"
+#include "mtk_drm_ddp.h"
+#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_drv.h"
+#include "mtk_drm_fb.h"
+#include "mtk_drm_gem.h"
+
+#define DRIVER_NAME "mediatek"
+#define DRIVER_DESC "Mediatek SoC DRM"
+#define DRIVER_DATE "20150513"
+#define DRIVER_MAJOR 1
+#define DRIVER_MINOR 0
+
+static void mtk_atomic_schedule(struct mtk_drm_private *private,
+                               struct drm_atomic_state *state)
+{
+       private->commit.state = state;
+       schedule_work(&private->commit.work);
+}
+
+static void mtk_atomic_wait_for_fences(struct drm_atomic_state *state)
+{
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
+       int i;
+
+       for_each_plane_in_state(state, plane, plane_state, i)
+               mtk_fb_wait(plane->state->fb);
+}
+
+static void mtk_atomic_complete(struct mtk_drm_private *private,
+                               struct drm_atomic_state *state)
+{
+       struct drm_device *drm = private->drm;
+
+       mtk_atomic_wait_for_fences(state);
+
+       drm_atomic_helper_commit_modeset_disables(drm, state);
+       drm_atomic_helper_commit_planes(drm, state, false);
+       drm_atomic_helper_commit_modeset_enables(drm, state);
+       drm_atomic_helper_wait_for_vblanks(drm, state);
+       drm_atomic_helper_cleanup_planes(drm, state);
+       drm_atomic_state_free(state);
+}
+
+static void mtk_atomic_work(struct work_struct *work)
+{
+       struct mtk_drm_private *private = container_of(work,
+                       struct mtk_drm_private, commit.work);
+
+       mtk_atomic_complete(private, private->commit.state);
+}
+
+static int mtk_atomic_commit(struct drm_device *drm,
+                            struct drm_atomic_state *state,
+                            bool async)
+{
+       struct mtk_drm_private *private = drm->dev_private;
+       int ret;
+
+       ret = drm_atomic_helper_prepare_planes(drm, state);
+       if (ret)
+               return ret;
+
+       mutex_lock(&private->commit.lock);
+       flush_work(&private->commit.work);
+
+       drm_atomic_helper_swap_state(drm, state);
+
+       if (async)
+               mtk_atomic_schedule(private, state);
+       else
+               mtk_atomic_complete(private, state);
+
+       mutex_unlock(&private->commit.lock);
+
+       return 0;
+}
+
+static const struct drm_mode_config_funcs mtk_drm_mode_config_funcs = {
+       .fb_create = mtk_drm_mode_fb_create,
+       .atomic_check = drm_atomic_helper_check,
+       .atomic_commit = mtk_atomic_commit,
+};
+
+static const enum mtk_ddp_comp_id mtk_ddp_main[] = {
+       DDP_COMPONENT_OVL0,
+       DDP_COMPONENT_COLOR0,
+       DDP_COMPONENT_AAL,
+       DDP_COMPONENT_OD,
+       DDP_COMPONENT_RDMA0,
+       DDP_COMPONENT_UFOE,
+       DDP_COMPONENT_DSI0,
+       DDP_COMPONENT_PWM0,
+};
+
+static const enum mtk_ddp_comp_id mtk_ddp_ext[] = {
+       DDP_COMPONENT_OVL1,
+       DDP_COMPONENT_COLOR1,
+       DDP_COMPONENT_GAMMA,
+       DDP_COMPONENT_RDMA1,
+       DDP_COMPONENT_DPI0,
+};
+
+static int mtk_drm_kms_init(struct drm_device *drm)
+{
+       struct mtk_drm_private *private = drm->dev_private;
+       struct platform_device *pdev;
+       struct device_node *np;
+       int ret;
+
+       if (!iommu_present(&platform_bus_type))
+               return -EPROBE_DEFER;
+
+       pdev = of_find_device_by_node(private->mutex_node);
+       if (!pdev) {
+               dev_err(drm->dev, "Waiting for disp-mutex device %s\n",
+                       private->mutex_node->full_name);
+               of_node_put(private->mutex_node);
+               return -EPROBE_DEFER;
+       }
+       private->mutex_dev = &pdev->dev;
+
+       drm_mode_config_init(drm);
+
+       drm->mode_config.min_width = 64;
+       drm->mode_config.min_height = 64;
+
+       /*
+        * set max width and height as default value(4096x4096).
+        * this value would be used to check framebuffer size limitation
+        * at drm_mode_addfb().
+        */
+       drm->mode_config.max_width = 4096;
+       drm->mode_config.max_height = 4096;
+       drm->mode_config.funcs = &mtk_drm_mode_config_funcs;
+
+       ret = component_bind_all(drm->dev, drm);
+       if (ret)
+               goto err_config_cleanup;
+
+       /*
+        * We currently support two fixed data streams, each optional,
+        * and each statically assigned to a crtc:
+        * OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ...
+        */
+       ret = mtk_drm_crtc_create(drm, mtk_ddp_main, ARRAY_SIZE(mtk_ddp_main));
+       if (ret < 0)
+               goto err_component_unbind;
+       /* ... and OVL1 -> COLOR1 -> GAMMA -> RDMA1 -> DPI0. */
+       ret = mtk_drm_crtc_create(drm, mtk_ddp_ext, ARRAY_SIZE(mtk_ddp_ext));
+       if (ret < 0)
+               goto err_component_unbind;
+
+       /* Use OVL device for all DMA memory allocations */
+       np = private->comp_node[mtk_ddp_main[0]] ?:
+            private->comp_node[mtk_ddp_ext[0]];
+       pdev = of_find_device_by_node(np);
+       if (!pdev) {
+               ret = -ENODEV;
+               dev_err(drm->dev, "Need at least one OVL device\n");
+               goto err_component_unbind;
+       }
+
+       private->dma_dev = &pdev->dev;
+
+       /*
+        * We don't use the drm_irq_install() helpers provided by the DRM
+        * core, so we need to set this manually in order to allow the
+        * DRM_IOCTL_WAIT_VBLANK to operate correctly.
+        */
+       drm->irq_enabled = true;
+       ret = drm_vblank_init(drm, MAX_CRTC);
+       if (ret < 0)
+               goto err_component_unbind;
+
+       drm_kms_helper_poll_init(drm);
+       drm_mode_config_reset(drm);
+
+       return 0;
+
+err_component_unbind:
+       component_unbind_all(drm->dev, drm);
+err_config_cleanup:
+       drm_mode_config_cleanup(drm);
+
+       return ret;
+}
+
+static void mtk_drm_kms_deinit(struct drm_device *drm)
+{
+       drm_kms_helper_poll_fini(drm);
+
+       drm_vblank_cleanup(drm);
+       component_unbind_all(drm->dev, drm);
+       drm_mode_config_cleanup(drm);
+}
+
+static const struct file_operations mtk_drm_fops = {
+       .owner = THIS_MODULE,
+       .open = drm_open,
+       .release = drm_release,
+       .unlocked_ioctl = drm_ioctl,
+       .mmap = mtk_drm_gem_mmap,
+       .poll = drm_poll,
+       .read = drm_read,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
+};
+
+static struct drm_driver mtk_drm_driver = {
+       .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME |
+                          DRIVER_ATOMIC,
+
+       .get_vblank_counter = drm_vblank_count,
+       .enable_vblank = mtk_drm_crtc_enable_vblank,
+       .disable_vblank = mtk_drm_crtc_disable_vblank,
+
+       .gem_free_object = mtk_drm_gem_free_object,
+       .gem_vm_ops = &drm_gem_cma_vm_ops,
+       .dumb_create = mtk_drm_gem_dumb_create,
+       .dumb_map_offset = mtk_drm_gem_dumb_map_offset,
+       .dumb_destroy = drm_gem_dumb_destroy,
+
+       .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
+       .gem_prime_export = drm_gem_prime_export,
+       .gem_prime_import = drm_gem_prime_import,
+       .gem_prime_get_sg_table = mtk_gem_prime_get_sg_table,
+       .gem_prime_import_sg_table = mtk_gem_prime_import_sg_table,
+       .gem_prime_mmap = mtk_drm_gem_mmap_buf,
+       .fops = &mtk_drm_fops,
+
+       .name = DRIVER_NAME,
+       .desc = DRIVER_DESC,
+       .date = DRIVER_DATE,
+       .major = DRIVER_MAJOR,
+       .minor = DRIVER_MINOR,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+       return dev->of_node == data;
+}
+
+static int mtk_drm_bind(struct device *dev)
+{
+       struct mtk_drm_private *private = dev_get_drvdata(dev);
+       struct drm_device *drm;
+       int ret;
+
+       drm = drm_dev_alloc(&mtk_drm_driver, dev);
+       if (!drm)
+               return -ENOMEM;
+
+       drm_dev_set_unique(drm, dev_name(dev));
+
+       drm->dev_private = private;
+       private->drm = drm;
+
+       ret = mtk_drm_kms_init(drm);
+       if (ret < 0)
+               goto err_free;
+
+       ret = drm_dev_register(drm, 0);
+       if (ret < 0)
+               goto err_deinit;
+
+       ret = drm_connector_register_all(drm);
+       if (ret < 0)
+               goto err_unregister;
+
+       return 0;
+
+err_unregister:
+       drm_dev_unregister(drm);
+err_deinit:
+       mtk_drm_kms_deinit(drm);
+err_free:
+       drm_dev_unref(drm);
+       return ret;
+}
+
+static void mtk_drm_unbind(struct device *dev)
+{
+       struct mtk_drm_private *private = dev_get_drvdata(dev);
+
+       drm_put_dev(private->drm);
+       private->drm = NULL;
+}
+
+static const struct component_master_ops mtk_drm_ops = {
+       .bind           = mtk_drm_bind,
+       .unbind         = mtk_drm_unbind,
+};
+
+static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
+       { .compatible = "mediatek,mt8173-disp-ovl",   .data = (void *)MTK_DISP_OVL },
+       { .compatible = "mediatek,mt8173-disp-rdma",  .data = (void *)MTK_DISP_RDMA },
+       { .compatible = "mediatek,mt8173-disp-wdma",  .data = (void *)MTK_DISP_WDMA },
+       { .compatible = "mediatek,mt8173-disp-color", .data = (void *)MTK_DISP_COLOR },
+       { .compatible = "mediatek,mt8173-disp-aal",   .data = (void *)MTK_DISP_AAL},
+       { .compatible = "mediatek,mt8173-disp-gamma", .data = (void *)MTK_DISP_GAMMA, },
+       { .compatible = "mediatek,mt8173-disp-ufoe",  .data = (void *)MTK_DISP_UFOE },
+       { .compatible = "mediatek,mt8173-dsi",        .data = (void *)MTK_DSI },
+       { .compatible = "mediatek,mt8173-dpi",        .data = (void *)MTK_DPI },
+       { .compatible = "mediatek,mt8173-disp-mutex", .data = (void *)MTK_DISP_MUTEX },
+       { .compatible = "mediatek,mt8173-disp-pwm",   .data = (void *)MTK_DISP_PWM },
+       { .compatible = "mediatek,mt8173-disp-od",    .data = (void *)MTK_DISP_OD },
+       { }
+};
+
+static int mtk_drm_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_drm_private *private;
+       struct resource *mem;
+       struct device_node *node;
+       struct component_match *match = NULL;
+       int ret;
+       int i;
+
+       private = devm_kzalloc(dev, sizeof(*private), GFP_KERNEL);
+       if (!private)
+               return -ENOMEM;
+
+       mutex_init(&private->commit.lock);
+       INIT_WORK(&private->commit.work, mtk_atomic_work);
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       private->config_regs = devm_ioremap_resource(dev, mem);
+       if (IS_ERR(private->config_regs)) {
+               ret = PTR_ERR(private->config_regs);
+               dev_err(dev, "Failed to ioremap mmsys-config resource: %d\n",
+                       ret);
+               return ret;
+       }
+
+       /* Iterate over sibling DISP function blocks */
+       for_each_child_of_node(dev->of_node->parent, node) {
+               const struct of_device_id *of_id;
+               enum mtk_ddp_comp_type comp_type;
+               int comp_id;
+
+               of_id = of_match_node(mtk_ddp_comp_dt_ids, node);
+               if (!of_id)
+                       continue;
+
+               if (!of_device_is_available(node)) {
+                       dev_dbg(dev, "Skipping disabled component %s\n",
+                               node->full_name);
+                       continue;
+               }
+
+               comp_type = (enum mtk_ddp_comp_type)of_id->data;
+
+               if (comp_type == MTK_DISP_MUTEX) {
+                       private->mutex_node = of_node_get(node);
+                       continue;
+               }
+
+               comp_id = mtk_ddp_comp_get_id(node, comp_type);
+               if (comp_id < 0) {
+                       dev_warn(dev, "Skipping unknown component %s\n",
+                                node->full_name);
+                       continue;
+               }
+
+               private->comp_node[comp_id] = of_node_get(node);
+
+               /*
+                * Currently only the OVL, RDMA, DSI, and DPI blocks have
+                * separate component platform drivers and initialize their own
+                * DDP component structure. The others are initialized here.
+                */
+               if (comp_type == MTK_DISP_OVL ||
+                   comp_type == MTK_DISP_RDMA ||
+                   comp_type == MTK_DSI ||
+                   comp_type == MTK_DPI) {
+                       dev_info(dev, "Adding component match for %s\n",
+                                node->full_name);
+                       component_match_add(dev, &match, compare_of, node);
+               } else {
+                       struct mtk_ddp_comp *comp;
+
+                       comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL);
+                       if (!comp) {
+                               ret = -ENOMEM;
+                               goto err_node;
+                       }
+
+                       ret = mtk_ddp_comp_init(dev, node, comp, comp_id, NULL);
+                       if (ret)
+                               goto err_node;
+
+                       private->ddp_comp[comp_id] = comp;
+               }
+       }
+
+       if (!private->mutex_node) {
+               dev_err(dev, "Failed to find disp-mutex node\n");
+               ret = -ENODEV;
+               goto err_node;
+       }
+
+       pm_runtime_enable(dev);
+
+       platform_set_drvdata(pdev, private);
+
+       ret = component_master_add_with_match(dev, &mtk_drm_ops, match);
+       if (ret)
+               goto err_pm;
+
+       return 0;
+
+err_pm:
+       pm_runtime_disable(dev);
+err_node:
+       of_node_put(private->mutex_node);
+       for (i = 0; i < DDP_COMPONENT_ID_MAX; i++)
+               of_node_put(private->comp_node[i]);
+       return ret;
+}
+
+static int mtk_drm_remove(struct platform_device *pdev)
+{
+       struct mtk_drm_private *private = platform_get_drvdata(pdev);
+       struct drm_device *drm = private->drm;
+       int i;
+
+       drm_connector_unregister_all(drm);
+       drm_dev_unregister(drm);
+       mtk_drm_kms_deinit(drm);
+       drm_dev_unref(drm);
+
+       component_master_del(&pdev->dev, &mtk_drm_ops);
+       pm_runtime_disable(&pdev->dev);
+       of_node_put(private->mutex_node);
+       for (i = 0; i < DDP_COMPONENT_ID_MAX; i++)
+               of_node_put(private->comp_node[i]);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int mtk_drm_sys_suspend(struct device *dev)
+{
+       struct mtk_drm_private *private = dev_get_drvdata(dev);
+       struct drm_device *drm = private->drm;
+
+       drm_kms_helper_poll_disable(drm);
+
+       private->suspend_state = drm_atomic_helper_suspend(drm);
+       if (IS_ERR(private->suspend_state)) {
+               drm_kms_helper_poll_enable(drm);
+               return PTR_ERR(private->suspend_state);
+       }
+
+       DRM_DEBUG_DRIVER("mtk_drm_sys_suspend\n");
+       return 0;
+}
+
+static int mtk_drm_sys_resume(struct device *dev)
+{
+       struct mtk_drm_private *private = dev_get_drvdata(dev);
+       struct drm_device *drm = private->drm;
+
+       drm_atomic_helper_resume(drm, private->suspend_state);
+       drm_kms_helper_poll_enable(drm);
+
+       DRM_DEBUG_DRIVER("mtk_drm_sys_resume\n");
+       return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(mtk_drm_pm_ops, mtk_drm_sys_suspend,
+                        mtk_drm_sys_resume);
+
+static const struct of_device_id mtk_drm_of_ids[] = {
+       { .compatible = "mediatek,mt8173-mmsys", },
+       { }
+};
+
+static struct platform_driver mtk_drm_platform_driver = {
+       .probe  = mtk_drm_probe,
+       .remove = mtk_drm_remove,
+       .driver = {
+               .name   = "mediatek-drm",
+               .of_match_table = mtk_drm_of_ids,
+               .pm     = &mtk_drm_pm_ops,
+       },
+};
+
+static struct platform_driver * const mtk_drm_drivers[] = {
+       &mtk_ddp_driver,
+       &mtk_disp_ovl_driver,
+       &mtk_disp_rdma_driver,
+       &mtk_dpi_driver,
+       &mtk_drm_platform_driver,
+       &mtk_dsi_driver,
+       &mtk_mipi_tx_driver,
+};
+
+static int __init mtk_drm_init(void)
+{
+       int ret;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(mtk_drm_drivers); i++) {
+               ret = platform_driver_register(mtk_drm_drivers[i]);
+               if (ret < 0) {
+                       pr_err("Failed to register %s driver: %d\n",
+                              mtk_drm_drivers[i]->driver.name, ret);
+                       goto err;
+               }
+       }
+
+       return 0;
+
+err:
+       while (--i >= 0)
+               platform_driver_unregister(mtk_drm_drivers[i]);
+
+       return ret;
+}
+
+static void __exit mtk_drm_exit(void)
+{
+       int i;
+
+       for (i = ARRAY_SIZE(mtk_drm_drivers) - 1; i >= 0; i--)
+               platform_driver_unregister(mtk_drm_drivers[i]);
+}
+
+module_init(mtk_drm_init);
+module_exit(mtk_drm_exit);
+
+MODULE_AUTHOR("YT SHEN <yt.shen@mediatek.com>");
+MODULE_DESCRIPTION("Mediatek SoC DRM driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
new file mode 100644 (file)
index 0000000..aa93894
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef MTK_DRM_DRV_H
+#define MTK_DRM_DRV_H
+
+#include <linux/io.h>
+#include "mtk_drm_ddp_comp.h"
+
+#define MAX_CRTC       2
+#define MAX_CONNECTOR  2
+
+struct device;
+struct device_node;
+struct drm_crtc;
+struct drm_device;
+struct drm_fb_helper;
+struct drm_property;
+struct regmap;
+
+struct mtk_drm_private {
+       struct drm_device *drm;
+       struct device *dma_dev;
+
+       struct drm_crtc *crtc[MAX_CRTC];
+       unsigned int num_pipes;
+
+       struct device_node *mutex_node;
+       struct device *mutex_dev;
+       void __iomem *config_regs;
+       struct device_node *comp_node[DDP_COMPONENT_ID_MAX];
+       struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX];
+
+       struct {
+               struct drm_atomic_state *state;
+               struct work_struct work;
+               struct mutex lock;
+       } commit;
+
+       struct drm_atomic_state *suspend_state;
+};
+
+extern struct platform_driver mtk_ddp_driver;
+extern struct platform_driver mtk_disp_ovl_driver;
+extern struct platform_driver mtk_disp_rdma_driver;
+extern struct platform_driver mtk_dpi_driver;
+extern struct platform_driver mtk_dsi_driver;
+extern struct platform_driver mtk_mipi_tx_driver;
+
+#endif /* MTK_DRM_DRV_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_fb.c b/drivers/gpu/drm/mediatek/mtk_drm_fb.c
new file mode 100644 (file)
index 0000000..147df85
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_gem.h>
+#include <linux/dma-buf.h>
+#include <linux/reservation.h>
+
+#include "mtk_drm_drv.h"
+#include "mtk_drm_fb.h"
+#include "mtk_drm_gem.h"
+
+/*
+ * mtk specific framebuffer structure.
+ *
+ * @fb: drm framebuffer object.
+ * @gem_obj: array of gem objects.
+ */
+struct mtk_drm_fb {
+       struct drm_framebuffer  base;
+       /* For now we only support a single plane */
+       struct drm_gem_object   *gem_obj;
+};
+
+#define to_mtk_fb(x) container_of(x, struct mtk_drm_fb, base)
+
+struct drm_gem_object *mtk_fb_get_gem_obj(struct drm_framebuffer *fb)
+{
+       struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb);
+
+       return mtk_fb->gem_obj;
+}
+
+static int mtk_drm_fb_create_handle(struct drm_framebuffer *fb,
+                                   struct drm_file *file_priv,
+                                   unsigned int *handle)
+{
+       struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb);
+
+       return drm_gem_handle_create(file_priv, mtk_fb->gem_obj, handle);
+}
+
+static void mtk_drm_fb_destroy(struct drm_framebuffer *fb)
+{
+       struct mtk_drm_fb *mtk_fb = to_mtk_fb(fb);
+
+       drm_framebuffer_cleanup(fb);
+
+       drm_gem_object_unreference_unlocked(mtk_fb->gem_obj);
+
+       kfree(mtk_fb);
+}
+
+static const struct drm_framebuffer_funcs mtk_drm_fb_funcs = {
+       .create_handle = mtk_drm_fb_create_handle,
+       .destroy = mtk_drm_fb_destroy,
+};
+
+static struct mtk_drm_fb *mtk_drm_framebuffer_init(struct drm_device *dev,
+                                       const struct drm_mode_fb_cmd2 *mode,
+                                       struct drm_gem_object *obj)
+{
+       struct mtk_drm_fb *mtk_fb;
+       int ret;
+
+       if (drm_format_num_planes(mode->pixel_format) != 1)
+               return ERR_PTR(-EINVAL);
+
+       mtk_fb = kzalloc(sizeof(*mtk_fb), GFP_KERNEL);
+       if (!mtk_fb)
+               return ERR_PTR(-ENOMEM);
+
+       drm_helper_mode_fill_fb_struct(&mtk_fb->base, mode);
+
+       mtk_fb->gem_obj = obj;
+
+       ret = drm_framebuffer_init(dev, &mtk_fb->base, &mtk_drm_fb_funcs);
+       if (ret) {
+               DRM_ERROR("failed to initialize framebuffer\n");
+               kfree(mtk_fb);
+               return ERR_PTR(ret);
+       }
+
+       return mtk_fb;
+}
+
+/*
+ * Wait for any exclusive fence in fb's gem object's reservation object.
+ *
+ * Returns -ERESTARTSYS if interrupted, else 0.
+ */
+int mtk_fb_wait(struct drm_framebuffer *fb)
+{
+       struct drm_gem_object *gem;
+       struct reservation_object *resv;
+       long ret;
+
+       if (!fb)
+               return 0;
+
+       gem = mtk_fb_get_gem_obj(fb);
+       if (!gem || !gem->dma_buf || !gem->dma_buf->resv)
+               return 0;
+
+       resv = gem->dma_buf->resv;
+       ret = reservation_object_wait_timeout_rcu(resv, false, true,
+                                                 MAX_SCHEDULE_TIMEOUT);
+       /* MAX_SCHEDULE_TIMEOUT on success, -ERESTARTSYS if interrupted */
+       if (WARN_ON(ret < 0))
+               return ret;
+
+       return 0;
+}
+
+struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
+                                              struct drm_file *file,
+                                              const struct drm_mode_fb_cmd2 *cmd)
+{
+       struct mtk_drm_fb *mtk_fb;
+       struct drm_gem_object *gem;
+       unsigned int width = cmd->width;
+       unsigned int height = cmd->height;
+       unsigned int size, bpp;
+       int ret;
+
+       if (drm_format_num_planes(cmd->pixel_format) != 1)
+               return ERR_PTR(-EINVAL);
+
+       gem = drm_gem_object_lookup(file, cmd->handles[0]);
+       if (!gem)
+               return ERR_PTR(-ENOENT);
+
+       bpp = drm_format_plane_cpp(cmd->pixel_format, 0);
+       size = (height - 1) * cmd->pitches[0] + width * bpp;
+       size += cmd->offsets[0];
+
+       if (gem->size < size) {
+               ret = -EINVAL;
+               goto unreference;
+       }
+
+       mtk_fb = mtk_drm_framebuffer_init(dev, cmd, gem);
+       if (IS_ERR(mtk_fb)) {
+               ret = PTR_ERR(mtk_fb);
+               goto unreference;
+       }
+
+       return &mtk_fb->base;
+
+unreference:
+       drm_gem_object_unreference_unlocked(gem);
+       return ERR_PTR(ret);
+}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_fb.h b/drivers/gpu/drm/mediatek/mtk_drm_fb.h
new file mode 100644 (file)
index 0000000..9b2ae34
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef MTK_DRM_FB_H
+#define MTK_DRM_FB_H
+
+struct drm_gem_object *mtk_fb_get_gem_obj(struct drm_framebuffer *fb);
+int mtk_fb_wait(struct drm_framebuffer *fb);
+struct drm_framebuffer *mtk_drm_mode_fb_create(struct drm_device *dev,
+                                              struct drm_file *file,
+                                              const struct drm_mode_fb_cmd2 *cmd);
+
+#endif /* MTK_DRM_FB_H */
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c b/drivers/gpu/drm/mediatek/mtk_drm_gem.c
new file mode 100644 (file)
index 0000000..fa2ec0c
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_gem.h>
+#include <linux/dma-buf.h>
+
+#include "mtk_drm_drv.h"
+#include "mtk_drm_gem.h"
+
+static struct mtk_drm_gem_obj *mtk_drm_gem_init(struct drm_device *dev,
+                                               unsigned long size)
+{
+       struct mtk_drm_gem_obj *mtk_gem_obj;
+       int ret;
+
+       size = round_up(size, PAGE_SIZE);
+
+       mtk_gem_obj = kzalloc(sizeof(*mtk_gem_obj), GFP_KERNEL);
+       if (!mtk_gem_obj)
+               return ERR_PTR(-ENOMEM);
+
+       ret = drm_gem_object_init(dev, &mtk_gem_obj->base, size);
+       if (ret < 0) {
+               DRM_ERROR("failed to initialize gem object\n");
+               kfree(mtk_gem_obj);
+               return ERR_PTR(ret);
+       }
+
+       return mtk_gem_obj;
+}
+
+struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev,
+                                          size_t size, bool alloc_kmap)
+{
+       struct mtk_drm_private *priv = dev->dev_private;
+       struct mtk_drm_gem_obj *mtk_gem;
+       struct drm_gem_object *obj;
+       int ret;
+
+       mtk_gem = mtk_drm_gem_init(dev, size);
+       if (IS_ERR(mtk_gem))
+               return ERR_CAST(mtk_gem);
+
+       obj = &mtk_gem->base;
+
+       init_dma_attrs(&mtk_gem->dma_attrs);
+       dma_set_attr(DMA_ATTR_WRITE_COMBINE, &mtk_gem->dma_attrs);
+
+       if (!alloc_kmap)
+               dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &mtk_gem->dma_attrs);
+
+       mtk_gem->cookie = dma_alloc_attrs(priv->dma_dev, obj->size,
+                                         &mtk_gem->dma_addr, GFP_KERNEL,
+                                         &mtk_gem->dma_attrs);
+       if (!mtk_gem->cookie) {
+               DRM_ERROR("failed to allocate %zx byte dma buffer", obj->size);
+               ret = -ENOMEM;
+               goto err_gem_free;
+       }
+
+       if (alloc_kmap)
+               mtk_gem->kvaddr = mtk_gem->cookie;
+
+       DRM_DEBUG_DRIVER("cookie = %p dma_addr = %pad size = %zu\n",
+                        mtk_gem->cookie, &mtk_gem->dma_addr,
+                        size);
+
+       return mtk_gem;
+
+err_gem_free:
+       drm_gem_object_release(obj);
+       kfree(mtk_gem);
+       return ERR_PTR(ret);
+}
+
+void mtk_drm_gem_free_object(struct drm_gem_object *obj)
+{
+       struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
+       struct mtk_drm_private *priv = obj->dev->dev_private;
+
+       if (mtk_gem->sg)
+               drm_prime_gem_destroy(obj, mtk_gem->sg);
+       else
+               dma_free_attrs(priv->dma_dev, obj->size, mtk_gem->cookie,
+                              mtk_gem->dma_addr, &mtk_gem->dma_attrs);
+
+       /* release file pointer to gem object. */
+       drm_gem_object_release(obj);
+
+       kfree(mtk_gem);
+}
+
+int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
+                           struct drm_mode_create_dumb *args)
+{
+       struct mtk_drm_gem_obj *mtk_gem;
+       int ret;
+
+       args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8);
+       args->size = args->pitch * args->height;
+
+       mtk_gem = mtk_drm_gem_create(dev, args->size, false);
+       if (IS_ERR(mtk_gem))
+               return PTR_ERR(mtk_gem);
+
+       /*
+        * allocate a id of idr table where the obj is registered
+        * and handle has the id what user can see.
+        */
+       ret = drm_gem_handle_create(file_priv, &mtk_gem->base, &args->handle);
+       if (ret)
+               goto err_handle_create;
+
+       /* drop reference from allocate - handle holds it now. */
+       drm_gem_object_unreference_unlocked(&mtk_gem->base);
+
+       return 0;
+
+err_handle_create:
+       mtk_drm_gem_free_object(&mtk_gem->base);
+       return ret;
+}
+
+int mtk_drm_gem_dumb_map_offset(struct drm_file *file_priv,
+                               struct drm_device *dev, uint32_t handle,
+                               uint64_t *offset)
+{
+       struct drm_gem_object *obj;
+       int ret;
+
+       obj = drm_gem_object_lookup(file_priv, handle);
+       if (!obj) {
+               DRM_ERROR("failed to lookup gem object.\n");
+               return -EINVAL;
+       }
+
+       ret = drm_gem_create_mmap_offset(obj);
+       if (ret)
+               goto out;
+
+       *offset = drm_vma_node_offset_addr(&obj->vma_node);
+       DRM_DEBUG_KMS("offset = 0x%llx\n", *offset);
+
+out:
+       drm_gem_object_unreference_unlocked(obj);
+       return ret;
+}
+
+static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj,
+                                  struct vm_area_struct *vma)
+
+{
+       int ret;
+       struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
+       struct mtk_drm_private *priv = obj->dev->dev_private;
+
+       /*
+        * dma_alloc_attrs() allocated a struct page table for mtk_gem, so clear
+        * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap().
+        */
+       vma->vm_flags &= ~VM_PFNMAP;
+       vma->vm_pgoff = 0;
+
+       ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie,
+                            mtk_gem->dma_addr, obj->size, &mtk_gem->dma_attrs);
+       if (ret)
+               drm_gem_vm_close(vma);
+
+       return ret;
+}
+
+int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj, struct vm_area_struct *vma)
+{
+       int ret;
+
+       ret = drm_gem_mmap_obj(obj, obj->size, vma);
+       if (ret)
+               return ret;
+
+       return mtk_drm_gem_object_mmap(obj, vma);
+}
+
+int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
+{
+       struct drm_gem_object *obj;
+       int ret;
+
+       ret = drm_gem_mmap(filp, vma);
+       if (ret)
+               return ret;
+
+       obj = vma->vm_private_data;
+
+       return mtk_drm_gem_object_mmap(obj, vma);
+}
+
+/*
+ * Allocate a sg_table for this GEM object.
+ * Note: Both the table's contents, and the sg_table itself must be freed by
+ *       the caller.
+ * Returns a pointer to the newly allocated sg_table, or an ERR_PTR() error.
+ */
+struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj)
+{
+       struct mtk_drm_gem_obj *mtk_gem = to_mtk_gem_obj(obj);
+       struct mtk_drm_private *priv = obj->dev->dev_private;
+       struct sg_table *sgt;
+       int ret;
+
+       sgt = kzalloc(sizeof(*sgt), GFP_KERNEL);
+       if (!sgt)
+               return ERR_PTR(-ENOMEM);
+
+       ret = dma_get_sgtable_attrs(priv->dma_dev, sgt, mtk_gem->cookie,
+                                   mtk_gem->dma_addr, obj->size,
+                                   &mtk_gem->dma_attrs);
+       if (ret) {
+               DRM_ERROR("failed to allocate sgt, %d\n", ret);
+               kfree(sgt);
+               return ERR_PTR(ret);
+       }
+
+       return sgt;
+}
+
+struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
+                       struct dma_buf_attachment *attach, struct sg_table *sg)
+{
+       struct mtk_drm_gem_obj *mtk_gem;
+       int ret;
+       struct scatterlist *s;
+       unsigned int i;
+       dma_addr_t expected;
+
+       mtk_gem = mtk_drm_gem_init(dev, attach->dmabuf->size);
+
+       if (IS_ERR(mtk_gem))
+               return ERR_PTR(PTR_ERR(mtk_gem));
+
+       expected = sg_dma_address(sg->sgl);
+       for_each_sg(sg->sgl, s, sg->nents, i) {
+               if (sg_dma_address(s) != expected) {
+                       DRM_ERROR("sg_table is not contiguous");
+                       ret = -EINVAL;
+                       goto err_gem_free;
+               }
+               expected = sg_dma_address(s) + sg_dma_len(s);
+       }
+
+       mtk_gem->dma_addr = sg_dma_address(sg->sgl);
+       mtk_gem->sg = sg;
+
+       return &mtk_gem->base;
+
+err_gem_free:
+       kfree(mtk_gem);
+       return ERR_PTR(ret);
+}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.h b/drivers/gpu/drm/mediatek/mtk_drm_gem.h
new file mode 100644 (file)
index 0000000..3a2a562
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _MTK_DRM_GEM_H_
+#define _MTK_DRM_GEM_H_
+
+#include <drm/drm_gem.h>
+
+/*
+ * mtk drm buffer structure.
+ *
+ * @base: a gem object.
+ *     - a new handle to this gem object would be created
+ *     by drm_gem_handle_create().
+ * @cookie: the return value of dma_alloc_attrs(), keep it for dma_free_attrs()
+ * @kvaddr: kernel virtual address of gem buffer.
+ * @dma_addr: dma address of gem buffer.
+ * @dma_attrs: dma attributes of gem buffer.
+ *
+ * P.S. this object would be transferred to user as kms_bo.handle so
+ *     user can access the buffer through kms_bo.handle.
+ */
+struct mtk_drm_gem_obj {
+       struct drm_gem_object   base;
+       void                    *cookie;
+       void                    *kvaddr;
+       dma_addr_t              dma_addr;
+       struct dma_attrs        dma_attrs;
+       struct sg_table         *sg;
+};
+
+#define to_mtk_gem_obj(x)      container_of(x, struct mtk_drm_gem_obj, base)
+
+void mtk_drm_gem_free_object(struct drm_gem_object *gem);
+struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev, size_t size,
+                                          bool alloc_kmap);
+int mtk_drm_gem_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
+                           struct drm_mode_create_dumb *args);
+int mtk_drm_gem_dumb_map_offset(struct drm_file *file_priv,
+                               struct drm_device *dev, uint32_t handle,
+                               uint64_t *offset);
+int mtk_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
+int mtk_drm_gem_mmap_buf(struct drm_gem_object *obj,
+                        struct vm_area_struct *vma);
+struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj);
+struct drm_gem_object *mtk_gem_prime_import_sg_table(struct drm_device *dev,
+                       struct dma_buf_attachment *attach, struct sg_table *sg);
+
+#endif
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
new file mode 100644 (file)
index 0000000..51bc898
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Author: CK Hu <ck.hu@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_plane_helper.h>
+
+#include "mtk_drm_crtc.h"
+#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_drv.h"
+#include "mtk_drm_fb.h"
+#include "mtk_drm_gem.h"
+#include "mtk_drm_plane.h"
+
+static const u32 formats[] = {
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_RGB565,
+};
+
+static void mtk_plane_enable(struct mtk_drm_plane *mtk_plane, bool enable,
+                            dma_addr_t addr, struct drm_rect *dest)
+{
+       struct drm_plane *plane = &mtk_plane->base;
+       struct mtk_plane_state *state = to_mtk_plane_state(plane->state);
+       unsigned int pitch, format;
+       int x, y;
+
+       if (WARN_ON(!plane->state || (enable && !plane->state->fb)))
+               return;
+
+       if (plane->state->fb) {
+               pitch = plane->state->fb->pitches[0];
+               format = plane->state->fb->pixel_format;
+       } else {
+               pitch = 0;
+               format = DRM_FORMAT_RGBA8888;
+       }
+
+       x = plane->state->crtc_x;
+       y = plane->state->crtc_y;
+
+       if (x < 0) {
+               addr -= x * 4;
+               x = 0;
+       }
+
+       if (y < 0) {
+               addr -= y * pitch;
+               y = 0;
+       }
+
+       state->pending.enable = enable;
+       state->pending.pitch = pitch;
+       state->pending.format = format;
+       state->pending.addr = addr;
+       state->pending.x = x;
+       state->pending.y = y;
+       state->pending.width = dest->x2 - dest->x1;
+       state->pending.height = dest->y2 - dest->y1;
+       wmb(); /* Make sure the above parameters are set before update */
+       state->pending.dirty = true;
+}
+
+static void mtk_plane_reset(struct drm_plane *plane)
+{
+       struct mtk_plane_state *state;
+
+       if (plane->state) {
+               if (plane->state->fb)
+                       drm_framebuffer_unreference(plane->state->fb);
+
+               state = to_mtk_plane_state(plane->state);
+               memset(state, 0, sizeof(*state));
+       } else {
+               state = kzalloc(sizeof(*state), GFP_KERNEL);
+               if (!state)
+                       return;
+               plane->state = &state->base;
+       }
+
+       state->base.plane = plane;
+       state->pending.format = DRM_FORMAT_RGB565;
+}
+
+static struct drm_plane_state *mtk_plane_duplicate_state(struct drm_plane *plane)
+{
+       struct mtk_plane_state *old_state = to_mtk_plane_state(plane->state);
+       struct mtk_plane_state *state;
+
+       state = kzalloc(sizeof(*state), GFP_KERNEL);
+       if (!state)
+               return NULL;
+
+       __drm_atomic_helper_plane_duplicate_state(plane, &state->base);
+
+       WARN_ON(state->base.plane != plane);
+
+       state->pending = old_state->pending;
+
+       return &state->base;
+}
+
+static void mtk_drm_plane_destroy_state(struct drm_plane *plane,
+                                       struct drm_plane_state *state)
+{
+       __drm_atomic_helper_plane_destroy_state(state);
+       kfree(to_mtk_plane_state(state));
+}
+
+static const struct drm_plane_funcs mtk_plane_funcs = {
+       .update_plane = drm_atomic_helper_update_plane,
+       .disable_plane = drm_atomic_helper_disable_plane,
+       .destroy = drm_plane_cleanup,
+       .reset = mtk_plane_reset,
+       .atomic_duplicate_state = mtk_plane_duplicate_state,
+       .atomic_destroy_state = mtk_drm_plane_destroy_state,
+};
+
+static int mtk_plane_atomic_check(struct drm_plane *plane,
+                                 struct drm_plane_state *state)
+{
+       struct drm_framebuffer *fb = state->fb;
+       struct drm_crtc_state *crtc_state;
+       bool visible;
+       struct drm_rect dest = {
+               .x1 = state->crtc_x,
+               .y1 = state->crtc_y,
+               .x2 = state->crtc_x + state->crtc_w,
+               .y2 = state->crtc_y + state->crtc_h,
+       };
+       struct drm_rect src = {
+               /* 16.16 fixed point */
+               .x1 = state->src_x,
+               .y1 = state->src_y,
+               .x2 = state->src_x + state->src_w,
+               .y2 = state->src_y + state->src_h,
+       };
+       struct drm_rect clip = { 0, };
+
+       if (!fb)
+               return 0;
+
+       if (!mtk_fb_get_gem_obj(fb)) {
+               DRM_DEBUG_KMS("buffer is null\n");
+               return -EFAULT;
+       }
+
+       if (!state->crtc)
+               return 0;
+
+       crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc);
+       if (IS_ERR(crtc_state))
+               return PTR_ERR(crtc_state);
+
+       clip.x2 = crtc_state->mode.hdisplay;
+       clip.y2 = crtc_state->mode.vdisplay;
+
+       return drm_plane_helper_check_update(plane, state->crtc, fb,
+                                            &src, &dest, &clip,
+                                            DRM_PLANE_HELPER_NO_SCALING,
+                                            DRM_PLANE_HELPER_NO_SCALING,
+                                            true, true, &visible);
+}
+
+static void mtk_plane_atomic_update(struct drm_plane *plane,
+                                   struct drm_plane_state *old_state)
+{
+       struct mtk_plane_state *state = to_mtk_plane_state(plane->state);
+       struct drm_crtc *crtc = state->base.crtc;
+       struct drm_gem_object *gem;
+       struct mtk_drm_gem_obj *mtk_gem;
+       struct mtk_drm_plane *mtk_plane = to_mtk_plane(plane);
+       struct drm_rect dest = {
+               .x1 = state->base.crtc_x,
+               .y1 = state->base.crtc_y,
+               .x2 = state->base.crtc_x + state->base.crtc_w,
+               .y2 = state->base.crtc_y + state->base.crtc_h,
+       };
+       struct drm_rect clip = { 0, };
+
+       if (!crtc)
+               return;
+
+       clip.x2 = state->base.crtc->state->mode.hdisplay;
+       clip.y2 = state->base.crtc->state->mode.vdisplay;
+       drm_rect_intersect(&dest, &clip);
+
+       gem = mtk_fb_get_gem_obj(state->base.fb);
+       mtk_gem = to_mtk_gem_obj(gem);
+       mtk_plane_enable(mtk_plane, true, mtk_gem->dma_addr, &dest);
+}
+
+static void mtk_plane_atomic_disable(struct drm_plane *plane,
+                                    struct drm_plane_state *old_state)
+{
+       struct mtk_plane_state *state = to_mtk_plane_state(plane->state);
+
+       state->pending.enable = false;
+       wmb(); /* Make sure the above parameter is set before update */
+       state->pending.dirty = true;
+}
+
+static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
+       .atomic_check = mtk_plane_atomic_check,
+       .atomic_update = mtk_plane_atomic_update,
+       .atomic_disable = mtk_plane_atomic_disable,
+};
+
+int mtk_plane_init(struct drm_device *dev, struct mtk_drm_plane *mtk_plane,
+                  unsigned long possible_crtcs, enum drm_plane_type type,
+                  unsigned int zpos)
+{
+       int err;
+
+       err = drm_universal_plane_init(dev, &mtk_plane->base, possible_crtcs,
+                                      &mtk_plane_funcs, formats,
+                                      ARRAY_SIZE(formats), type, NULL);
+       if (err) {
+               DRM_ERROR("failed to initialize plane\n");
+               return err;
+       }
+
+       drm_plane_helper_add(&mtk_plane->base, &mtk_plane_helper_funcs);
+       mtk_plane->idx = zpos;
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.h b/drivers/gpu/drm/mediatek/mtk_drm_plane.h
new file mode 100644 (file)
index 0000000..72a7b3e
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Author: CK Hu <ck.hu@mediatek.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef _MTK_DRM_PLANE_H_
+#define _MTK_DRM_PLANE_H_
+
+#include <drm/drm_crtc.h>
+#include <linux/types.h>
+
+struct mtk_drm_plane {
+       struct drm_plane                base;
+       unsigned int                    idx;
+};
+
+struct mtk_plane_pending_state {
+       bool                            config;
+       bool                            enable;
+       dma_addr_t                      addr;
+       unsigned int                    pitch;
+       unsigned int                    format;
+       unsigned int                    x;
+       unsigned int                    y;
+       unsigned int                    width;
+       unsigned int                    height;
+       bool                            dirty;
+};
+
+struct mtk_plane_state {
+       struct drm_plane_state          base;
+       struct mtk_plane_pending_state  pending;
+};
+
+static inline struct mtk_drm_plane *to_mtk_plane(struct drm_plane *plane)
+{
+       return container_of(plane, struct mtk_drm_plane, base);
+}
+
+static inline struct mtk_plane_state *
+to_mtk_plane_state(struct drm_plane_state *state)
+{
+       return container_of(state, struct mtk_plane_state, base);
+}
+
+int mtk_plane_init(struct drm_device *dev, struct mtk_drm_plane *mtk_plane,
+                  unsigned long possible_crtcs, enum drm_plane_type type,
+                  unsigned int zpos);
+
+#endif
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
new file mode 100644 (file)
index 0000000..2d808e5
--- /dev/null
@@ -0,0 +1,913 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/of_graph.h>
+#include <linux/phy/phy.h>
+#include <linux/platform_device.h>
+#include <video/videomode.h>
+
+#include "mtk_drm_ddp_comp.h"
+
+#define DSI_VIDEO_FIFO_DEPTH   (1920 / 4)
+#define DSI_HOST_FIFO_DEPTH    64
+
+#define DSI_START              0x00
+
+#define DSI_CON_CTRL           0x10
+#define DSI_RESET                      BIT(0)
+#define DSI_EN                         BIT(1)
+
+#define DSI_MODE_CTRL          0x14
+#define MODE                           (3)
+#define CMD_MODE                       0
+#define SYNC_PULSE_MODE                        1
+#define SYNC_EVENT_MODE                        2
+#define BURST_MODE                     3
+#define FRM_MODE                       BIT(16)
+#define MIX_MODE                       BIT(17)
+
+#define DSI_TXRX_CTRL          0x18
+#define VC_NUM                         (2 << 0)
+#define LANE_NUM                       (0xf << 2)
+#define DIS_EOT                                BIT(6)
+#define NULL_EN                                BIT(7)
+#define TE_FREERUN                     BIT(8)
+#define EXT_TE_EN                      BIT(9)
+#define EXT_TE_EDGE                    BIT(10)
+#define MAX_RTN_SIZE                   (0xf << 12)
+#define HSTX_CKLP_EN                   BIT(16)
+
+#define DSI_PSCTRL             0x1c
+#define DSI_PS_WC                      0x3fff
+#define DSI_PS_SEL                     (3 << 16)
+#define PACKED_PS_16BIT_RGB565         (0 << 16)
+#define LOOSELY_PS_18BIT_RGB666                (1 << 16)
+#define PACKED_PS_18BIT_RGB666         (2 << 16)
+#define PACKED_PS_24BIT_RGB888         (3 << 16)
+
+#define DSI_VSA_NL             0x20
+#define DSI_VBP_NL             0x24
+#define DSI_VFP_NL             0x28
+#define DSI_VACT_NL            0x2C
+#define DSI_HSA_WC             0x50
+#define DSI_HBP_WC             0x54
+#define DSI_HFP_WC             0x58
+
+#define DSI_HSTX_CKL_WC                0x64
+
+#define DSI_PHY_LCCON          0x104
+#define LC_HS_TX_EN                    BIT(0)
+#define LC_ULPM_EN                     BIT(1)
+#define LC_WAKEUP_EN                   BIT(2)
+
+#define DSI_PHY_LD0CON         0x108
+#define LD0_HS_TX_EN                   BIT(0)
+#define LD0_ULPM_EN                    BIT(1)
+#define LD0_WAKEUP_EN                  BIT(2)
+
+#define DSI_PHY_TIMECON0       0x110
+#define LPX                            (0xff << 0)
+#define HS_PRPR                                (0xff << 8)
+#define HS_ZERO                                (0xff << 16)
+#define HS_TRAIL                       (0xff << 24)
+
+#define DSI_PHY_TIMECON1       0x114
+#define TA_GO                          (0xff << 0)
+#define TA_SURE                                (0xff << 8)
+#define TA_GET                         (0xff << 16)
+#define DA_HS_EXIT                     (0xff << 24)
+
+#define DSI_PHY_TIMECON2       0x118
+#define CONT_DET                       (0xff << 0)
+#define CLK_ZERO                       (0xff << 16)
+#define CLK_TRAIL                      (0xff << 24)
+
+#define DSI_PHY_TIMECON3       0x11c
+#define CLK_HS_PRPR                    (0xff << 0)
+#define CLK_HS_POST                    (0xff << 8)
+#define CLK_HS_EXIT                    (0xff << 16)
+
+#define NS_TO_CYCLE(n, c)    ((n) / (c) + (((n) % (c)) ? 1 : 0))
+
+struct phy;
+
+struct mtk_dsi {
+       struct mtk_ddp_comp ddp_comp;
+       struct device *dev;
+       struct mipi_dsi_host host;
+       struct drm_encoder encoder;
+       struct drm_connector conn;
+       struct drm_panel *panel;
+       struct drm_bridge *bridge;
+       struct phy *phy;
+
+       void __iomem *regs;
+
+       struct clk *engine_clk;
+       struct clk *digital_clk;
+       struct clk *hs_clk;
+
+       u32 data_rate;
+
+       unsigned long mode_flags;
+       enum mipi_dsi_pixel_format format;
+       unsigned int lanes;
+       struct videomode vm;
+       int refcount;
+       bool enabled;
+};
+
+static inline struct mtk_dsi *encoder_to_dsi(struct drm_encoder *e)
+{
+       return container_of(e, struct mtk_dsi, encoder);
+}
+
+static inline struct mtk_dsi *connector_to_dsi(struct drm_connector *c)
+{
+       return container_of(c, struct mtk_dsi, conn);
+}
+
+static inline struct mtk_dsi *host_to_dsi(struct mipi_dsi_host *h)
+{
+       return container_of(h, struct mtk_dsi, host);
+}
+
+static void mtk_dsi_mask(struct mtk_dsi *dsi, u32 offset, u32 mask, u32 data)
+{
+       u32 temp = readl(dsi->regs + offset);
+
+       writel((temp & ~mask) | (data & mask), dsi->regs + offset);
+}
+
+static void dsi_phy_timconfig(struct mtk_dsi *dsi)
+{
+       u32 timcon0, timcon1, timcon2, timcon3;
+       unsigned int ui, cycle_time;
+       unsigned int lpx;
+
+       ui = 1000 / dsi->data_rate + 0x01;
+       cycle_time = 8000 / dsi->data_rate + 0x01;
+       lpx = 5;
+
+       timcon0 = (8 << 24) | (0xa << 16) | (0x6 << 8) | lpx;
+       timcon1 = (7 << 24) | (5 * lpx << 16) | ((3 * lpx) / 2) << 8 |
+                 (4 * lpx);
+       timcon2 = ((NS_TO_CYCLE(0x64, cycle_time) + 0xa) << 24) |
+                 (NS_TO_CYCLE(0x150, cycle_time) << 16);
+       timcon3 = (2 * lpx) << 16 | NS_TO_CYCLE(80 + 52 * ui, cycle_time) << 8 |
+                  NS_TO_CYCLE(0x40, cycle_time);
+
+       writel(timcon0, dsi->regs + DSI_PHY_TIMECON0);
+       writel(timcon1, dsi->regs + DSI_PHY_TIMECON1);
+       writel(timcon2, dsi->regs + DSI_PHY_TIMECON2);
+       writel(timcon3, dsi->regs + DSI_PHY_TIMECON3);
+}
+
+static void mtk_dsi_enable(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_CON_CTRL, DSI_EN, DSI_EN);
+}
+
+static void mtk_dsi_disable(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_CON_CTRL, DSI_EN, 0);
+}
+
+static void mtk_dsi_reset(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_CON_CTRL, DSI_RESET, DSI_RESET);
+       mtk_dsi_mask(dsi, DSI_CON_CTRL, DSI_RESET, 0);
+}
+
+static int mtk_dsi_poweron(struct mtk_dsi *dsi)
+{
+       struct device *dev = dsi->dev;
+       int ret;
+
+       if (++dsi->refcount != 1)
+               return 0;
+
+       /**
+        * data_rate = (pixel_clock / 1000) * pixel_dipth * mipi_ratio;
+        * pixel_clock unit is Khz, data_rata unit is MHz, so need divide 1000.
+        * mipi_ratio is mipi clk coefficient for balance the pixel clk in mipi.
+        * we set mipi_ratio is 1.05.
+        */
+       dsi->data_rate = dsi->vm.pixelclock * 3 * 21 / (1 * 1000 * 10);
+
+       ret = clk_set_rate(dsi->hs_clk, dsi->data_rate * 1000000);
+       if (ret < 0) {
+               dev_err(dev, "Failed to set data rate: %d\n", ret);
+               goto err_refcount;
+       }
+
+       phy_power_on(dsi->phy);
+
+       ret = clk_prepare_enable(dsi->engine_clk);
+       if (ret < 0) {
+               dev_err(dev, "Failed to enable engine clock: %d\n", ret);
+               goto err_phy_power_off;
+       }
+
+       ret = clk_prepare_enable(dsi->digital_clk);
+       if (ret < 0) {
+               dev_err(dev, "Failed to enable digital clock: %d\n", ret);
+               goto err_disable_engine_clk;
+       }
+
+       mtk_dsi_enable(dsi);
+       mtk_dsi_reset(dsi);
+       dsi_phy_timconfig(dsi);
+
+       return 0;
+
+err_disable_engine_clk:
+       clk_disable_unprepare(dsi->engine_clk);
+err_phy_power_off:
+       phy_power_off(dsi->phy);
+err_refcount:
+       dsi->refcount--;
+       return ret;
+}
+
+static void dsi_clk_ulp_mode_enter(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_HS_TX_EN, 0);
+       mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_ULPM_EN, 0);
+}
+
+static void dsi_clk_ulp_mode_leave(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_ULPM_EN, 0);
+       mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_WAKEUP_EN, LC_WAKEUP_EN);
+       mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_WAKEUP_EN, 0);
+}
+
+static void dsi_lane0_ulp_mode_enter(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_PHY_LD0CON, LD0_HS_TX_EN, 0);
+       mtk_dsi_mask(dsi, DSI_PHY_LD0CON, LD0_ULPM_EN, 0);
+}
+
+static void dsi_lane0_ulp_mode_leave(struct mtk_dsi *dsi)
+{
+       mtk_dsi_mask(dsi, DSI_PHY_LD0CON, LD0_ULPM_EN, 0);
+       mtk_dsi_mask(dsi, DSI_PHY_LD0CON, LD0_WAKEUP_EN, LD0_WAKEUP_EN);
+       mtk_dsi_mask(dsi, DSI_PHY_LD0CON, LD0_WAKEUP_EN, 0);
+}
+
+static bool dsi_clk_hs_state(struct mtk_dsi *dsi)
+{
+       u32 tmp_reg1;
+
+       tmp_reg1 = readl(dsi->regs + DSI_PHY_LCCON);
+       return ((tmp_reg1 & LC_HS_TX_EN) == 1) ? true : false;
+}
+
+static void dsi_clk_hs_mode(struct mtk_dsi *dsi, bool enter)
+{
+       if (enter && !dsi_clk_hs_state(dsi))
+               mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_HS_TX_EN, LC_HS_TX_EN);
+       else if (!enter && dsi_clk_hs_state(dsi))
+               mtk_dsi_mask(dsi, DSI_PHY_LCCON, LC_HS_TX_EN, 0);
+}
+
+static void dsi_set_mode(struct mtk_dsi *dsi)
+{
+       u32 vid_mode = CMD_MODE;
+
+       if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
+               vid_mode = SYNC_PULSE_MODE;
+
+               if ((dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST) &&
+                   !(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE))
+                       vid_mode = BURST_MODE;
+       }
+
+       writel(vid_mode, dsi->regs + DSI_MODE_CTRL);
+}
+
+static void dsi_ps_control_vact(struct mtk_dsi *dsi)
+{
+       struct videomode *vm = &dsi->vm;
+       u32 dsi_buf_bpp, ps_wc;
+       u32 ps_bpp_mode;
+
+       if (dsi->format == MIPI_DSI_FMT_RGB565)
+               dsi_buf_bpp = 2;
+       else
+               dsi_buf_bpp = 3;
+
+       ps_wc = vm->hactive * dsi_buf_bpp;
+       ps_bpp_mode = ps_wc;
+
+       switch (dsi->format) {
+       case MIPI_DSI_FMT_RGB888:
+               ps_bpp_mode |= PACKED_PS_24BIT_RGB888;
+               break;
+       case MIPI_DSI_FMT_RGB666:
+               ps_bpp_mode |= PACKED_PS_18BIT_RGB666;
+               break;
+       case MIPI_DSI_FMT_RGB666_PACKED:
+               ps_bpp_mode |= LOOSELY_PS_18BIT_RGB666;
+               break;
+       case MIPI_DSI_FMT_RGB565:
+               ps_bpp_mode |= PACKED_PS_16BIT_RGB565;
+               break;
+       }
+
+       writel(vm->vactive, dsi->regs + DSI_VACT_NL);
+       writel(ps_bpp_mode, dsi->regs + DSI_PSCTRL);
+       writel(ps_wc, dsi->regs + DSI_HSTX_CKL_WC);
+}
+
+static void dsi_rxtx_control(struct mtk_dsi *dsi)
+{
+       u32 tmp_reg;
+
+       switch (dsi->lanes) {
+       case 1:
+               tmp_reg = 1 << 2;
+               break;
+       case 2:
+               tmp_reg = 3 << 2;
+               break;
+       case 3:
+               tmp_reg = 7 << 2;
+               break;
+       case 4:
+               tmp_reg = 0xf << 2;
+               break;
+       default:
+               tmp_reg = 0xf << 2;
+               break;
+       }
+
+       writel(tmp_reg, dsi->regs + DSI_TXRX_CTRL);
+}
+
+static void dsi_ps_control(struct mtk_dsi *dsi)
+{
+       unsigned int dsi_tmp_buf_bpp;
+       u32 tmp_reg;
+
+       switch (dsi->format) {
+       case MIPI_DSI_FMT_RGB888:
+               tmp_reg = PACKED_PS_24BIT_RGB888;
+               dsi_tmp_buf_bpp = 3;
+               break;
+       case MIPI_DSI_FMT_RGB666:
+               tmp_reg = LOOSELY_PS_18BIT_RGB666;
+               dsi_tmp_buf_bpp = 3;
+               break;
+       case MIPI_DSI_FMT_RGB666_PACKED:
+               tmp_reg = PACKED_PS_18BIT_RGB666;
+               dsi_tmp_buf_bpp = 3;
+               break;
+       case MIPI_DSI_FMT_RGB565:
+               tmp_reg = PACKED_PS_16BIT_RGB565;
+               dsi_tmp_buf_bpp = 2;
+               break;
+       default:
+               tmp_reg = PACKED_PS_24BIT_RGB888;
+               dsi_tmp_buf_bpp = 3;
+               break;
+       }
+
+       tmp_reg += dsi->vm.hactive * dsi_tmp_buf_bpp & DSI_PS_WC;
+       writel(tmp_reg, dsi->regs + DSI_PSCTRL);
+}
+
+static void dsi_config_vdo_timing(struct mtk_dsi *dsi)
+{
+       unsigned int horizontal_sync_active_byte;
+       unsigned int horizontal_backporch_byte;
+       unsigned int horizontal_frontporch_byte;
+       unsigned int dsi_tmp_buf_bpp;
+
+       struct videomode *vm = &dsi->vm;
+
+       if (dsi->format == MIPI_DSI_FMT_RGB565)
+               dsi_tmp_buf_bpp = 2;
+       else
+               dsi_tmp_buf_bpp = 3;
+
+       writel(vm->vsync_len, dsi->regs + DSI_VSA_NL);
+       writel(vm->vback_porch, dsi->regs + DSI_VBP_NL);
+       writel(vm->vfront_porch, dsi->regs + DSI_VFP_NL);
+       writel(vm->vactive, dsi->regs + DSI_VACT_NL);
+
+       horizontal_sync_active_byte = (vm->hsync_len * dsi_tmp_buf_bpp - 10);
+
+       if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
+               horizontal_backporch_byte =
+                       (vm->hback_porch * dsi_tmp_buf_bpp - 10);
+       else
+               horizontal_backporch_byte = ((vm->hback_porch + vm->hsync_len) *
+                       dsi_tmp_buf_bpp - 10);
+
+       horizontal_frontporch_byte = (vm->hfront_porch * dsi_tmp_buf_bpp - 12);
+
+       writel(horizontal_sync_active_byte, dsi->regs + DSI_HSA_WC);
+       writel(horizontal_backporch_byte, dsi->regs + DSI_HBP_WC);
+       writel(horizontal_frontporch_byte, dsi->regs + DSI_HFP_WC);
+
+       dsi_ps_control(dsi);
+}
+
+static void mtk_dsi_start(struct mtk_dsi *dsi)
+{
+       writel(0, dsi->regs + DSI_START);
+       writel(1, dsi->regs + DSI_START);
+}
+
+static void mtk_dsi_poweroff(struct mtk_dsi *dsi)
+{
+       if (WARN_ON(dsi->refcount == 0))
+               return;
+
+       if (--dsi->refcount != 0)
+               return;
+
+       dsi_lane0_ulp_mode_enter(dsi);
+       dsi_clk_ulp_mode_enter(dsi);
+
+       mtk_dsi_disable(dsi);
+
+       clk_disable_unprepare(dsi->engine_clk);
+       clk_disable_unprepare(dsi->digital_clk);
+
+       phy_power_off(dsi->phy);
+}
+
+static void mtk_output_dsi_enable(struct mtk_dsi *dsi)
+{
+       int ret;
+
+       if (dsi->enabled)
+               return;
+
+       if (dsi->panel) {
+               if (drm_panel_prepare(dsi->panel)) {
+                       DRM_ERROR("failed to setup the panel\n");
+                       return;
+               }
+       }
+
+       ret = mtk_dsi_poweron(dsi);
+       if (ret < 0) {
+               DRM_ERROR("failed to power on dsi\n");
+               return;
+       }
+
+       dsi_rxtx_control(dsi);
+
+       dsi_clk_ulp_mode_leave(dsi);
+       dsi_lane0_ulp_mode_leave(dsi);
+       dsi_clk_hs_mode(dsi, 0);
+       dsi_set_mode(dsi);
+
+       dsi_ps_control_vact(dsi);
+       dsi_config_vdo_timing(dsi);
+
+       dsi_set_mode(dsi);
+       dsi_clk_hs_mode(dsi, 1);
+
+       mtk_dsi_start(dsi);
+
+       dsi->enabled = true;
+}
+
+static void mtk_output_dsi_disable(struct mtk_dsi *dsi)
+{
+       if (!dsi->enabled)
+               return;
+
+       if (dsi->panel) {
+               if (drm_panel_disable(dsi->panel)) {
+                       DRM_ERROR("failed to disable the panel\n");
+                       return;
+               }
+       }
+
+       mtk_dsi_poweroff(dsi);
+
+       dsi->enabled = false;
+}
+
+static void mtk_dsi_encoder_destroy(struct drm_encoder *encoder)
+{
+       drm_encoder_cleanup(encoder);
+}
+
+static const struct drm_encoder_funcs mtk_dsi_encoder_funcs = {
+       .destroy = mtk_dsi_encoder_destroy,
+};
+
+static bool mtk_dsi_encoder_mode_fixup(struct drm_encoder *encoder,
+                                      const struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
+{
+       return true;
+}
+
+static void mtk_dsi_encoder_mode_set(struct drm_encoder *encoder,
+                                    struct drm_display_mode *mode,
+                                    struct drm_display_mode *adjusted)
+{
+       struct mtk_dsi *dsi = encoder_to_dsi(encoder);
+
+       dsi->vm.pixelclock = adjusted->clock;
+       dsi->vm.hactive = adjusted->hdisplay;
+       dsi->vm.hback_porch = adjusted->htotal - adjusted->hsync_end;
+       dsi->vm.hfront_porch = adjusted->hsync_start - adjusted->hdisplay;
+       dsi->vm.hsync_len = adjusted->hsync_end - adjusted->hsync_start;
+
+       dsi->vm.vactive = adjusted->vdisplay;
+       dsi->vm.vback_porch = adjusted->vtotal - adjusted->vsync_end;
+       dsi->vm.vfront_porch = adjusted->vsync_start - adjusted->vdisplay;
+       dsi->vm.vsync_len = adjusted->vsync_end - adjusted->vsync_start;
+}
+
+static void mtk_dsi_encoder_disable(struct drm_encoder *encoder)
+{
+       struct mtk_dsi *dsi = encoder_to_dsi(encoder);
+
+       mtk_output_dsi_disable(dsi);
+}
+
+static void mtk_dsi_encoder_enable(struct drm_encoder *encoder)
+{
+       struct mtk_dsi *dsi = encoder_to_dsi(encoder);
+
+       mtk_output_dsi_enable(dsi);
+}
+
+static enum drm_connector_status mtk_dsi_connector_detect(
+       struct drm_connector *connector, bool force)
+{
+       return connector_status_connected;
+}
+
+static int mtk_dsi_connector_get_modes(struct drm_connector *connector)
+{
+       struct mtk_dsi *dsi = connector_to_dsi(connector);
+
+       return drm_panel_get_modes(dsi->panel);
+}
+
+static struct drm_encoder *mtk_dsi_connector_best_encoder(
+               struct drm_connector *connector)
+{
+       struct mtk_dsi *dsi = connector_to_dsi(connector);
+
+       return &dsi->encoder;
+}
+
+static const struct drm_encoder_helper_funcs mtk_dsi_encoder_helper_funcs = {
+       .mode_fixup = mtk_dsi_encoder_mode_fixup,
+       .mode_set = mtk_dsi_encoder_mode_set,
+       .disable = mtk_dsi_encoder_disable,
+       .enable = mtk_dsi_encoder_enable,
+};
+
+static const struct drm_connector_funcs mtk_dsi_connector_funcs = {
+       .dpms = drm_atomic_helper_connector_dpms,
+       .detect = mtk_dsi_connector_detect,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .destroy = drm_connector_cleanup,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static const struct drm_connector_helper_funcs
+       mtk_dsi_connector_helper_funcs = {
+       .get_modes = mtk_dsi_connector_get_modes,
+       .best_encoder = mtk_dsi_connector_best_encoder,
+};
+
+static int mtk_drm_attach_bridge(struct drm_bridge *bridge,
+                                struct drm_encoder *encoder)
+{
+       int ret;
+
+       if (!bridge)
+               return -ENOENT;
+
+       encoder->bridge = bridge;
+       bridge->encoder = encoder;
+       ret = drm_bridge_attach(encoder->dev, bridge);
+       if (ret) {
+               DRM_ERROR("Failed to attach bridge to drm\n");
+               encoder->bridge = NULL;
+               bridge->encoder = NULL;
+       }
+
+       return ret;
+}
+
+static int mtk_dsi_create_connector(struct drm_device *drm, struct mtk_dsi *dsi)
+{
+       int ret;
+
+       ret = drm_connector_init(drm, &dsi->conn, &mtk_dsi_connector_funcs,
+                                DRM_MODE_CONNECTOR_DSI);
+       if (ret) {
+               DRM_ERROR("Failed to connector init to drm\n");
+               return ret;
+       }
+
+       drm_connector_helper_add(&dsi->conn, &mtk_dsi_connector_helper_funcs);
+
+       dsi->conn.dpms = DRM_MODE_DPMS_OFF;
+       drm_mode_connector_attach_encoder(&dsi->conn, &dsi->encoder);
+
+       if (dsi->panel) {
+               ret = drm_panel_attach(dsi->panel, &dsi->conn);
+               if (ret) {
+                       DRM_ERROR("Failed to attach panel to drm\n");
+                       goto err_connector_cleanup;
+               }
+       }
+
+       return 0;
+
+err_connector_cleanup:
+       drm_connector_cleanup(&dsi->conn);
+       return ret;
+}
+
+static int mtk_dsi_create_conn_enc(struct drm_device *drm, struct mtk_dsi *dsi)
+{
+       int ret;
+
+       ret = drm_encoder_init(drm, &dsi->encoder, &mtk_dsi_encoder_funcs,
+                              DRM_MODE_ENCODER_DSI, NULL);
+       if (ret) {
+               DRM_ERROR("Failed to encoder init to drm\n");
+               return ret;
+       }
+       drm_encoder_helper_add(&dsi->encoder, &mtk_dsi_encoder_helper_funcs);
+
+       /*
+        * Currently display data paths are statically assigned to a crtc each.
+        * crtc 0 is OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0
+        */
+       dsi->encoder.possible_crtcs = 1;
+
+       /* If there's a bridge, attach to it and let it create the connector */
+       ret = mtk_drm_attach_bridge(dsi->bridge, &dsi->encoder);
+       if (ret) {
+               /* Otherwise create our own connector and attach to a panel */
+               ret = mtk_dsi_create_connector(drm, dsi);
+               if (ret)
+                       goto err_encoder_cleanup;
+       }
+
+       return 0;
+
+err_encoder_cleanup:
+       drm_encoder_cleanup(&dsi->encoder);
+       return ret;
+}
+
+static void mtk_dsi_destroy_conn_enc(struct mtk_dsi *dsi)
+{
+       drm_encoder_cleanup(&dsi->encoder);
+       /* Skip connector cleanup if creation was delegated to the bridge */
+       if (dsi->conn.dev) {
+               drm_connector_unregister(&dsi->conn);
+               drm_connector_cleanup(&dsi->conn);
+       }
+}
+
+static void mtk_dsi_ddp_start(struct mtk_ddp_comp *comp)
+{
+       struct mtk_dsi *dsi = container_of(comp, struct mtk_dsi, ddp_comp);
+
+       mtk_dsi_poweron(dsi);
+}
+
+static void mtk_dsi_ddp_stop(struct mtk_ddp_comp *comp)
+{
+       struct mtk_dsi *dsi = container_of(comp, struct mtk_dsi, ddp_comp);
+
+       mtk_dsi_poweroff(dsi);
+}
+
+static const struct mtk_ddp_comp_funcs mtk_dsi_funcs = {
+       .start = mtk_dsi_ddp_start,
+       .stop = mtk_dsi_ddp_stop,
+};
+
+static int mtk_dsi_host_attach(struct mipi_dsi_host *host,
+                              struct mipi_dsi_device *device)
+{
+       struct mtk_dsi *dsi = host_to_dsi(host);
+
+       dsi->lanes = device->lanes;
+       dsi->format = device->format;
+       dsi->mode_flags = device->mode_flags;
+
+       if (dsi->conn.dev)
+               drm_helper_hpd_irq_event(dsi->conn.dev);
+
+       return 0;
+}
+
+static int mtk_dsi_host_detach(struct mipi_dsi_host *host,
+                              struct mipi_dsi_device *device)
+{
+       struct mtk_dsi *dsi = host_to_dsi(host);
+
+       if (dsi->conn.dev)
+               drm_helper_hpd_irq_event(dsi->conn.dev);
+
+       return 0;
+}
+
+static const struct mipi_dsi_host_ops mtk_dsi_ops = {
+       .attach = mtk_dsi_host_attach,
+       .detach = mtk_dsi_host_detach,
+};
+
+static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
+{
+       int ret;
+       struct drm_device *drm = data;
+       struct mtk_dsi *dsi = dev_get_drvdata(dev);
+
+       ret = mtk_ddp_comp_register(drm, &dsi->ddp_comp);
+       if (ret < 0) {
+               dev_err(dev, "Failed to register component %s: %d\n",
+                       dev->of_node->full_name, ret);
+               return ret;
+       }
+
+       ret = mipi_dsi_host_register(&dsi->host);
+       if (ret < 0) {
+               dev_err(dev, "failed to register DSI host: %d\n", ret);
+               goto err_ddp_comp_unregister;
+       }
+
+       ret = mtk_dsi_create_conn_enc(drm, dsi);
+       if (ret) {
+               DRM_ERROR("Encoder create failed with %d\n", ret);
+               goto err_unregister;
+       }
+
+       return 0;
+
+err_unregister:
+       mipi_dsi_host_unregister(&dsi->host);
+err_ddp_comp_unregister:
+       mtk_ddp_comp_unregister(drm, &dsi->ddp_comp);
+       return ret;
+}
+
+static void mtk_dsi_unbind(struct device *dev, struct device *master,
+                          void *data)
+{
+       struct drm_device *drm = data;
+       struct mtk_dsi *dsi = dev_get_drvdata(dev);
+
+       mtk_dsi_destroy_conn_enc(dsi);
+       mipi_dsi_host_unregister(&dsi->host);
+       mtk_ddp_comp_unregister(drm, &dsi->ddp_comp);
+}
+
+static const struct component_ops mtk_dsi_component_ops = {
+       .bind = mtk_dsi_bind,
+       .unbind = mtk_dsi_unbind,
+};
+
+static int mtk_dsi_probe(struct platform_device *pdev)
+{
+       struct mtk_dsi *dsi;
+       struct device *dev = &pdev->dev;
+       struct device_node *remote_node, *endpoint;
+       struct resource *regs;
+       int comp_id;
+       int ret;
+
+       dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
+       if (!dsi)
+               return -ENOMEM;
+
+       dsi->host.ops = &mtk_dsi_ops;
+       dsi->host.dev = dev;
+
+       endpoint = of_graph_get_next_endpoint(dev->of_node, NULL);
+       if (endpoint) {
+               remote_node = of_graph_get_remote_port_parent(endpoint);
+               if (!remote_node) {
+                       dev_err(dev, "No panel connected\n");
+                       return -ENODEV;
+               }
+
+               dsi->bridge = of_drm_find_bridge(remote_node);
+               dsi->panel = of_drm_find_panel(remote_node);
+               of_node_put(remote_node);
+               if (!dsi->bridge && !dsi->panel) {
+                       dev_info(dev, "Waiting for bridge or panel driver\n");
+                       return -EPROBE_DEFER;
+               }
+       }
+
+       dsi->engine_clk = devm_clk_get(dev, "engine");
+       if (IS_ERR(dsi->engine_clk)) {
+               ret = PTR_ERR(dsi->engine_clk);
+               dev_err(dev, "Failed to get engine clock: %d\n", ret);
+               return ret;
+       }
+
+       dsi->digital_clk = devm_clk_get(dev, "digital");
+       if (IS_ERR(dsi->digital_clk)) {
+               ret = PTR_ERR(dsi->digital_clk);
+               dev_err(dev, "Failed to get digital clock: %d\n", ret);
+               return ret;
+       }
+
+       dsi->hs_clk = devm_clk_get(dev, "hs");
+       if (IS_ERR(dsi->hs_clk)) {
+               ret = PTR_ERR(dsi->hs_clk);
+               dev_err(dev, "Failed to get hs clock: %d\n", ret);
+               return ret;
+       }
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       dsi->regs = devm_ioremap_resource(dev, regs);
+       if (IS_ERR(dsi->regs)) {
+               ret = PTR_ERR(dsi->regs);
+               dev_err(dev, "Failed to ioremap memory: %d\n", ret);
+               return ret;
+       }
+
+       dsi->phy = devm_phy_get(dev, "dphy");
+       if (IS_ERR(dsi->phy)) {
+               ret = PTR_ERR(dsi->phy);
+               dev_err(dev, "Failed to get MIPI-DPHY: %d\n", ret);
+               return ret;
+       }
+
+       comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DSI);
+       if (comp_id < 0) {
+               dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
+               return comp_id;
+       }
+
+       ret = mtk_ddp_comp_init(dev, dev->of_node, &dsi->ddp_comp, comp_id,
+                               &mtk_dsi_funcs);
+       if (ret) {
+               dev_err(dev, "Failed to initialize component: %d\n", ret);
+               return ret;
+       }
+
+       platform_set_drvdata(pdev, dsi);
+
+       return component_add(&pdev->dev, &mtk_dsi_component_ops);
+}
+
+static int mtk_dsi_remove(struct platform_device *pdev)
+{
+       struct mtk_dsi *dsi = platform_get_drvdata(pdev);
+
+       mtk_output_dsi_disable(dsi);
+       component_del(&pdev->dev, &mtk_dsi_component_ops);
+
+       return 0;
+}
+
+static const struct of_device_id mtk_dsi_of_match[] = {
+       { .compatible = "mediatek,mt8173-dsi" },
+       { },
+};
+
+struct platform_driver mtk_dsi_driver = {
+       .probe = mtk_dsi_probe,
+       .remove = mtk_dsi_remove,
+       .driver = {
+               .name = "mtk-dsi",
+               .of_match_table = mtk_dsi_of_match,
+       },
+};
diff --git a/drivers/gpu/drm/mediatek/mtk_mipi_tx.c b/drivers/gpu/drm/mediatek/mtk_mipi_tx.c
new file mode 100644 (file)
index 0000000..cf8f38d
--- /dev/null
@@ -0,0 +1,463 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/phy/phy.h>
+
+#define MIPITX_DSI_CON         0x00
+#define RG_DSI_LDOCORE_EN              BIT(0)
+#define RG_DSI_CKG_LDOOUT_EN           BIT(1)
+#define RG_DSI_BCLK_SEL                        (3 << 2)
+#define RG_DSI_LD_IDX_SEL              (7 << 4)
+#define RG_DSI_PHYCLK_SEL              (2 << 8)
+#define RG_DSI_DSICLK_FREQ_SEL         BIT(10)
+#define RG_DSI_LPTX_CLMP_EN            BIT(11)
+
+#define MIPITX_DSI_CLOCK_LANE  0x04
+#define MIPITX_DSI_DATA_LANE0  0x08
+#define MIPITX_DSI_DATA_LANE1  0x0c
+#define MIPITX_DSI_DATA_LANE2  0x10
+#define MIPITX_DSI_DATA_LANE3  0x14
+#define RG_DSI_LNTx_LDOOUT_EN          BIT(0)
+#define RG_DSI_LNTx_CKLANE_EN          BIT(1)
+#define RG_DSI_LNTx_LPTX_IPLUS1                BIT(2)
+#define RG_DSI_LNTx_LPTX_IPLUS2                BIT(3)
+#define RG_DSI_LNTx_LPTX_IMINUS                BIT(4)
+#define RG_DSI_LNTx_LPCD_IPLUS         BIT(5)
+#define RG_DSI_LNTx_LPCD_IMINUS                BIT(6)
+#define RG_DSI_LNTx_RT_CODE            (0xf << 8)
+
+#define MIPITX_DSI_TOP_CON     0x40
+#define RG_DSI_LNT_INTR_EN             BIT(0)
+#define RG_DSI_LNT_HS_BIAS_EN          BIT(1)
+#define RG_DSI_LNT_IMP_CAL_EN          BIT(2)
+#define RG_DSI_LNT_TESTMODE_EN         BIT(3)
+#define RG_DSI_LNT_IMP_CAL_CODE                (0xf << 4)
+#define RG_DSI_LNT_AIO_SEL             (7 << 8)
+#define RG_DSI_PAD_TIE_LOW_EN          BIT(11)
+#define RG_DSI_DEBUG_INPUT_EN          BIT(12)
+#define RG_DSI_PRESERVE                        (7 << 13)
+
+#define MIPITX_DSI_BG_CON      0x44
+#define RG_DSI_BG_CORE_EN              BIT(0)
+#define RG_DSI_BG_CKEN                 BIT(1)
+#define RG_DSI_BG_DIV                  (0x3 << 2)
+#define RG_DSI_BG_FAST_CHARGE          BIT(4)
+#define RG_DSI_VOUT_MSK                        (0x3ffff << 5)
+#define RG_DSI_V12_SEL                 (7 << 5)
+#define RG_DSI_V10_SEL                 (7 << 8)
+#define RG_DSI_V072_SEL                        (7 << 11)
+#define RG_DSI_V04_SEL                 (7 << 14)
+#define RG_DSI_V032_SEL                        (7 << 17)
+#define RG_DSI_V02_SEL                 (7 << 20)
+#define RG_DSI_BG_R1_TRIM              (0xf << 24)
+#define RG_DSI_BG_R2_TRIM              (0xf << 28)
+
+#define MIPITX_DSI_PLL_CON0    0x50
+#define RG_DSI_MPPLL_PLL_EN            BIT(0)
+#define RG_DSI_MPPLL_DIV_MSK           (0x1ff << 1)
+#define RG_DSI_MPPLL_PREDIV            (3 << 1)
+#define RG_DSI_MPPLL_TXDIV0            (3 << 3)
+#define RG_DSI_MPPLL_TXDIV1            (3 << 5)
+#define RG_DSI_MPPLL_POSDIV            (7 << 7)
+#define RG_DSI_MPPLL_MONVC_EN          BIT(10)
+#define RG_DSI_MPPLL_MONREF_EN         BIT(11)
+#define RG_DSI_MPPLL_VOD_EN            BIT(12)
+
+#define MIPITX_DSI_PLL_CON1    0x54
+#define RG_DSI_MPPLL_SDM_FRA_EN                BIT(0)
+#define RG_DSI_MPPLL_SDM_SSC_PH_INIT   BIT(1)
+#define RG_DSI_MPPLL_SDM_SSC_EN                BIT(2)
+#define RG_DSI_MPPLL_SDM_SSC_PRD       (0xffff << 16)
+
+#define MIPITX_DSI_PLL_CON2    0x58
+
+#define MIPITX_DSI_PLL_PWR     0x68
+#define RG_DSI_MPPLL_SDM_PWR_ON                BIT(0)
+#define RG_DSI_MPPLL_SDM_ISO_EN                BIT(1)
+#define RG_DSI_MPPLL_SDM_PWR_ACK       BIT(8)
+
+#define MIPITX_DSI_SW_CTRL     0x80
+#define SW_CTRL_EN                     BIT(0)
+
+#define MIPITX_DSI_SW_CTRL_CON0        0x84
+#define SW_LNTC_LPTX_PRE_OE            BIT(0)
+#define SW_LNTC_LPTX_OE                        BIT(1)
+#define SW_LNTC_LPTX_P                 BIT(2)
+#define SW_LNTC_LPTX_N                 BIT(3)
+#define SW_LNTC_HSTX_PRE_OE            BIT(4)
+#define SW_LNTC_HSTX_OE                        BIT(5)
+#define SW_LNTC_HSTX_ZEROCLK           BIT(6)
+#define SW_LNT0_LPTX_PRE_OE            BIT(7)
+#define SW_LNT0_LPTX_OE                        BIT(8)
+#define SW_LNT0_LPTX_P                 BIT(9)
+#define SW_LNT0_LPTX_N                 BIT(10)
+#define SW_LNT0_HSTX_PRE_OE            BIT(11)
+#define SW_LNT0_HSTX_OE                        BIT(12)
+#define SW_LNT0_LPRX_EN                        BIT(13)
+#define SW_LNT1_LPTX_PRE_OE            BIT(14)
+#define SW_LNT1_LPTX_OE                        BIT(15)
+#define SW_LNT1_LPTX_P                 BIT(16)
+#define SW_LNT1_LPTX_N                 BIT(17)
+#define SW_LNT1_HSTX_PRE_OE            BIT(18)
+#define SW_LNT1_HSTX_OE                        BIT(19)
+#define SW_LNT2_LPTX_PRE_OE            BIT(20)
+#define SW_LNT2_LPTX_OE                        BIT(21)
+#define SW_LNT2_LPTX_P                 BIT(22)
+#define SW_LNT2_LPTX_N                 BIT(23)
+#define SW_LNT2_HSTX_PRE_OE            BIT(24)
+#define SW_LNT2_HSTX_OE                        BIT(25)
+
+struct mtk_mipi_tx {
+       struct device *dev;
+       void __iomem *regs;
+       unsigned int data_rate;
+       struct clk_hw pll_hw;
+       struct clk *pll;
+};
+
+static inline struct mtk_mipi_tx *mtk_mipi_tx_from_clk_hw(struct clk_hw *hw)
+{
+       return container_of(hw, struct mtk_mipi_tx, pll_hw);
+}
+
+static void mtk_mipi_tx_clear_bits(struct mtk_mipi_tx *mipi_tx, u32 offset,
+                                  u32 bits)
+{
+       u32 temp = readl(mipi_tx->regs + offset);
+
+       writel(temp & ~bits, mipi_tx->regs + offset);
+}
+
+static void mtk_mipi_tx_set_bits(struct mtk_mipi_tx *mipi_tx, u32 offset,
+                                u32 bits)
+{
+       u32 temp = readl(mipi_tx->regs + offset);
+
+       writel(temp | bits, mipi_tx->regs + offset);
+}
+
+static void mtk_mipi_tx_update_bits(struct mtk_mipi_tx *mipi_tx, u32 offset,
+                                   u32 mask, u32 data)
+{
+       u32 temp = readl(mipi_tx->regs + offset);
+
+       writel((temp & ~mask) | (data & mask), mipi_tx->regs + offset);
+}
+
+static int mtk_mipi_tx_pll_prepare(struct clk_hw *hw)
+{
+       struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
+       unsigned int txdiv, txdiv0, txdiv1;
+       u64 pcw;
+
+       dev_dbg(mipi_tx->dev, "prepare: %u Hz\n", mipi_tx->data_rate);
+
+       if (mipi_tx->data_rate >= 500000000) {
+               txdiv = 1;
+               txdiv0 = 0;
+               txdiv1 = 0;
+       } else if (mipi_tx->data_rate >= 250000000) {
+               txdiv = 2;
+               txdiv0 = 1;
+               txdiv1 = 0;
+       } else if (mipi_tx->data_rate >= 125000000) {
+               txdiv = 4;
+               txdiv0 = 2;
+               txdiv1 = 0;
+       } else if (mipi_tx->data_rate > 62000000) {
+               txdiv = 8;
+               txdiv0 = 2;
+               txdiv1 = 1;
+       } else if (mipi_tx->data_rate >= 50000000) {
+               txdiv = 16;
+               txdiv0 = 2;
+               txdiv1 = 2;
+       } else {
+               return -EINVAL;
+       }
+
+       mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_BG_CON,
+                               RG_DSI_VOUT_MSK |
+                               RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN,
+                               (4 << 20) | (4 << 17) | (4 << 14) |
+                               (4 << 11) | (4 << 8) | (4 << 5) |
+                               RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN);
+
+       usleep_range(30, 100);
+
+       mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_TOP_CON,
+                               RG_DSI_LNT_IMP_CAL_CODE | RG_DSI_LNT_HS_BIAS_EN,
+                               (8 << 4) | RG_DSI_LNT_HS_BIAS_EN);
+
+       mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_CON,
+                            RG_DSI_CKG_LDOOUT_EN | RG_DSI_LDOCORE_EN);
+
+       mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_PWR,
+                               RG_DSI_MPPLL_SDM_PWR_ON |
+                               RG_DSI_MPPLL_SDM_ISO_EN,
+                               RG_DSI_MPPLL_SDM_PWR_ON);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
+                              RG_DSI_MPPLL_PLL_EN);
+
+       mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
+                               RG_DSI_MPPLL_TXDIV0 | RG_DSI_MPPLL_TXDIV1 |
+                               RG_DSI_MPPLL_PREDIV,
+                               (txdiv0 << 3) | (txdiv1 << 5));
+
+       /*
+        * PLL PCW config
+        * PCW bit 24~30 = integer part of pcw
+        * PCW bit 0~23 = fractional part of pcw
+        * pcw = data_Rate*4*txdiv/(Ref_clk*2);
+        * Post DIV =4, so need data_Rate*4
+        * Ref_clk is 26MHz
+        */
+       pcw = div_u64(((u64)mipi_tx->data_rate * 2 * txdiv) << 24,
+                     26000000);
+       writel(pcw, mipi_tx->regs + MIPITX_DSI_PLL_CON2);
+
+       mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_PLL_CON1,
+                            RG_DSI_MPPLL_SDM_FRA_EN);
+
+       mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_PLL_CON0, RG_DSI_MPPLL_PLL_EN);
+
+       usleep_range(20, 100);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON1,
+                              RG_DSI_MPPLL_SDM_SSC_EN);
+
+       return 0;
+}
+
+static void mtk_mipi_tx_pll_unprepare(struct clk_hw *hw)
+{
+       struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
+
+       dev_dbg(mipi_tx->dev, "unprepare\n");
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
+                              RG_DSI_MPPLL_PLL_EN);
+
+       mtk_mipi_tx_update_bits(mipi_tx, MIPITX_DSI_PLL_PWR,
+                               RG_DSI_MPPLL_SDM_ISO_EN |
+                               RG_DSI_MPPLL_SDM_PWR_ON,
+                               RG_DSI_MPPLL_SDM_ISO_EN);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_TOP_CON,
+                              RG_DSI_LNT_HS_BIAS_EN);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_CON,
+                              RG_DSI_CKG_LDOOUT_EN | RG_DSI_LDOCORE_EN);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_BG_CON,
+                              RG_DSI_BG_CKEN | RG_DSI_BG_CORE_EN);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_PLL_CON0,
+                              RG_DSI_MPPLL_DIV_MSK);
+}
+
+static long mtk_mipi_tx_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+                                      unsigned long *prate)
+{
+       return clamp_val(rate, 50000000, 1250000000);
+}
+
+static int mtk_mipi_tx_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+                                   unsigned long parent_rate)
+{
+       struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
+
+       dev_dbg(mipi_tx->dev, "set rate: %lu Hz\n", rate);
+
+       mipi_tx->data_rate = rate;
+
+       return 0;
+}
+
+static unsigned long mtk_mipi_tx_pll_recalc_rate(struct clk_hw *hw,
+                                                unsigned long parent_rate)
+{
+       struct mtk_mipi_tx *mipi_tx = mtk_mipi_tx_from_clk_hw(hw);
+
+       return mipi_tx->data_rate;
+}
+
+static const struct clk_ops mtk_mipi_tx_pll_ops = {
+       .prepare = mtk_mipi_tx_pll_prepare,
+       .unprepare = mtk_mipi_tx_pll_unprepare,
+       .round_rate = mtk_mipi_tx_pll_round_rate,
+       .set_rate = mtk_mipi_tx_pll_set_rate,
+       .recalc_rate = mtk_mipi_tx_pll_recalc_rate,
+};
+
+static int mtk_mipi_tx_power_on_signal(struct phy *phy)
+{
+       struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
+       unsigned int reg;
+
+       for (reg = MIPITX_DSI_CLOCK_LANE;
+            reg <= MIPITX_DSI_DATA_LANE3; reg += 4)
+               mtk_mipi_tx_set_bits(mipi_tx, reg, RG_DSI_LNTx_LDOOUT_EN);
+
+       mtk_mipi_tx_clear_bits(mipi_tx, MIPITX_DSI_TOP_CON,
+                              RG_DSI_PAD_TIE_LOW_EN);
+
+       return 0;
+}
+
+static int mtk_mipi_tx_power_on(struct phy *phy)
+{
+       struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
+       int ret;
+
+       /* Power up core and enable PLL */
+       ret = clk_prepare_enable(mipi_tx->pll);
+       if (ret < 0)
+               return ret;
+
+       /* Enable DSI Lane LDO outputs, disable pad tie low */
+       mtk_mipi_tx_power_on_signal(phy);
+
+       return 0;
+}
+
+static void mtk_mipi_tx_power_off_signal(struct phy *phy)
+{
+       struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
+       unsigned int reg;
+
+       mtk_mipi_tx_set_bits(mipi_tx, MIPITX_DSI_TOP_CON,
+                            RG_DSI_PAD_TIE_LOW_EN);
+
+       for (reg = MIPITX_DSI_CLOCK_LANE;
+            reg <= MIPITX_DSI_DATA_LANE3; reg += 4)
+               mtk_mipi_tx_clear_bits(mipi_tx, reg, RG_DSI_LNTx_LDOOUT_EN);
+}
+
+static int mtk_mipi_tx_power_off(struct phy *phy)
+{
+       struct mtk_mipi_tx *mipi_tx = phy_get_drvdata(phy);
+
+       /* Enable pad tie low, disable DSI Lane LDO outputs */
+       mtk_mipi_tx_power_off_signal(phy);
+
+       /* Disable PLL and power down core */
+       clk_disable_unprepare(mipi_tx->pll);
+
+       return 0;
+}
+
+static const struct phy_ops mtk_mipi_tx_ops = {
+       .power_on = mtk_mipi_tx_power_on,
+       .power_off = mtk_mipi_tx_power_off,
+       .owner = THIS_MODULE,
+};
+
+static int mtk_mipi_tx_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct mtk_mipi_tx *mipi_tx;
+       struct resource *mem;
+       struct clk *ref_clk;
+       const char *ref_clk_name;
+       struct clk_init_data clk_init = {
+               .ops = &mtk_mipi_tx_pll_ops,
+               .num_parents = 1,
+               .parent_names = (const char * const *)&ref_clk_name,
+               .flags = CLK_SET_RATE_GATE,
+       };
+       struct phy *phy;
+       struct phy_provider *phy_provider;
+       int ret;
+
+       mipi_tx = devm_kzalloc(dev, sizeof(*mipi_tx), GFP_KERNEL);
+       if (!mipi_tx)
+               return -ENOMEM;
+
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       mipi_tx->regs = devm_ioremap_resource(dev, mem);
+       if (IS_ERR(mipi_tx->regs)) {
+               ret = PTR_ERR(mipi_tx->regs);
+               dev_err(dev, "Failed to get memory resource: %d\n", ret);
+               return ret;
+       }
+
+       ref_clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(ref_clk)) {
+               ret = PTR_ERR(ref_clk);
+               dev_err(dev, "Failed to get reference clock: %d\n", ret);
+               return ret;
+       }
+       ref_clk_name = __clk_get_name(ref_clk);
+
+       ret = of_property_read_string(dev->of_node, "clock-output-names",
+                                     &clk_init.name);
+       if (ret < 0) {
+               dev_err(dev, "Failed to read clock-output-names: %d\n", ret);
+               return ret;
+       }
+
+       mipi_tx->pll_hw.init = &clk_init;
+       mipi_tx->pll = devm_clk_register(dev, &mipi_tx->pll_hw);
+       if (IS_ERR(mipi_tx->pll)) {
+               ret = PTR_ERR(mipi_tx->pll);
+               dev_err(dev, "Failed to register PLL: %d\n", ret);
+               return ret;
+       }
+
+       phy = devm_phy_create(dev, NULL, &mtk_mipi_tx_ops);
+       if (IS_ERR(phy)) {
+               ret = PTR_ERR(phy);
+               dev_err(dev, "Failed to create MIPI D-PHY: %d\n", ret);
+               return ret;
+       }
+       phy_set_drvdata(phy, mipi_tx);
+
+       phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
+       if (IS_ERR(phy)) {
+               ret = PTR_ERR(phy_provider);
+               return ret;
+       }
+
+       mipi_tx->dev = dev;
+
+       return of_clk_add_provider(dev->of_node, of_clk_src_simple_get,
+                                  mipi_tx->pll);
+}
+
+static int mtk_mipi_tx_remove(struct platform_device *pdev)
+{
+       of_clk_del_provider(pdev->dev.of_node);
+       return 0;
+}
+
+static const struct of_device_id mtk_mipi_tx_match[] = {
+       { .compatible = "mediatek,mt8173-mipi-tx", },
+       {},
+};
+
+struct platform_driver mtk_mipi_tx_driver = {
+       .probe = mtk_mipi_tx_probe,
+       .remove = mtk_mipi_tx_remove,
+       .driver = {
+               .name = "mediatek-mipi-tx",
+               .of_match_table = mtk_mipi_tx_match,
+       },
+};
index a7bf6a90eae5a30e40ae3c1c5dbada0ea893bc8b..2ac3fcbfea7bc988667eb5b2819712187dd8be81 100644 (file)
@@ -75,7 +75,7 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc,
                return 0;
        }
 
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj)
                return -ENOENT;
 
index b0af77454d523cf99e2c2c9fb52287c6341491d9..ebb470ff7200c800a44f1db3d66a72bc416cdb0f 100644 (file)
@@ -116,10 +116,8 @@ static struct pci_driver mgag200_pci_driver = {
 
 static int __init mgag200_init(void)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && mgag200_modeset == -1)
                return -EINVAL;
-#endif
 
        if (mgag200_modeset == 0)
                return -EINVAL;
index 205b2801d3b8674932c7781b8a714ae193abe098..3e02ac20777ce82fdf40b632ef8648064eb1a2dc 100644 (file)
@@ -281,7 +281,7 @@ static inline int mgag200_bo_reserve(struct mgag200_bo *bo, bool no_wait)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, NULL);
+       ret = ttm_bo_reserve(&bo->bo, true, no_wait, NULL);
        if (ret) {
                if (ret != -ERESTARTSYS && ret != -EBUSY)
                        DRM_ERROR("reserve failed %p\n", bo);
index 9147444d5bf222470e5df21ce1d9e2c5687323e1..615cbb08ba29ecdfbe8a4bfa0a02b9ce86804216 100644 (file)
@@ -53,7 +53,7 @@ mgag200_user_framebuffer_create(struct drm_device *dev,
        struct mga_framebuffer *mga_fb;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, filp, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(filp, mode_cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
@@ -358,7 +358,7 @@ mgag200_dumb_mmap_offset(struct drm_file *file,
        struct drm_gem_object *obj;
        struct mgag200_bo *bo;
 
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL)
                return -ENOENT;
 
index 05108b505fbfa1382ad071ab80e4357ad4db4ae2..9d5083d0f1eec7a0c84c2f4e9bb7746e4f21e785 100644 (file)
@@ -245,6 +245,8 @@ struct ttm_bo_driver mgag200_bo_driver = {
        .verify_access = mgag200_bo_verify_access,
        .io_mem_reserve = &mgag200_ttm_io_mem_reserve,
        .io_mem_free = &mgag200_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int mgag200_mm_init(struct mga_device *mdev)
index 215495c2780c07e7d0657997b1fcd57bc6e9d86b..167a4971f47c59d20a29b86b9a98a651426055ab 100644 (file)
@@ -23,6 +23,13 @@ config DRM_MSM_REGISTER_LOGGING
          that can be parsed by envytools demsm tool.  If enabled, register
          logging can be switched on via msm.reglog=y module param.
 
+config DRM_MSM_HDMI_HDCP
+       bool "Enable HDMI HDCP support in MSM DRM driver"
+       depends on DRM_MSM && QCOM_SCM
+       default y
+       help
+         Choose this option to enable HDCP state machine
+
 config DRM_MSM_DSI
        bool "Enable DSI support in MSM DRM driver"
        depends on DRM_MSM
index ddb4c9d097e456e7904a937b639ea07dac1b4e64..60cb02624dc0b0b1dd14cb78c41181589529c999 100644 (file)
@@ -10,7 +10,6 @@ msm-y := \
        hdmi/hdmi_audio.o \
        hdmi/hdmi_bridge.o \
        hdmi/hdmi_connector.o \
-       hdmi/hdmi_hdcp.o \
        hdmi/hdmi_i2c.o \
        hdmi/hdmi_phy.o \
        hdmi/hdmi_phy_8960.o \
@@ -40,8 +39,10 @@ msm-y := \
        mdp/mdp5/mdp5_plane.o \
        mdp/mdp5/mdp5_smp.o \
        msm_atomic.o \
+       msm_debugfs.o \
        msm_drv.o \
        msm_fb.o \
+       msm_fence.o \
        msm_gem.o \
        msm_gem_prime.o \
        msm_gem_submit.o \
@@ -56,6 +57,8 @@ msm-$(CONFIG_COMMON_CLK) += mdp/mdp4/mdp4_lvds_pll.o
 msm-$(CONFIG_COMMON_CLK) += hdmi/hdmi_pll_8960.o
 msm-$(CONFIG_COMMON_CLK) += hdmi/hdmi_phy_8996.o
 
+msm-$(CONFIG_DRM_MSM_HDMI_HDCP) += hdmi/hdmi_hdcp.o
+
 msm-$(CONFIG_DRM_MSM_DSI) += dsi/dsi.o \
                        mdp/mdp4/mdp4_dsi_encoder.o \
                        dsi/dsi_cfg.o \
index 4951172ede067f0beb9f9b863e77989c49bb84f3..fbe304ee6c809548bf734be1e9ee7d56a1554392 100644 (file)
@@ -120,8 +120,8 @@ void adreno_recover(struct msm_gpu *gpu)
        /* reset ringbuffer: */
        gpu->rb->cur = gpu->rb->start;
 
-       /* reset completed fence seqno, just discard anything pending: */
-       adreno_gpu->memptrs->fence = gpu->submitted_fence;
+       /* reset completed fence seqno: */
+       adreno_gpu->memptrs->fence = gpu->fctx->completed_fence;
        adreno_gpu->memptrs->rptr  = 0;
        adreno_gpu->memptrs->wptr  = 0;
 
@@ -133,7 +133,7 @@ void adreno_recover(struct msm_gpu *gpu)
        }
 }
 
-int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
+void adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
                struct msm_file_private *ctx)
 {
        struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
@@ -168,7 +168,7 @@ int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
                OUT_PKT2(ring);
 
        OUT_PKT0(ring, REG_AXXX_CP_SCRATCH_REG2, 1);
-       OUT_RING(ring, submit->fence);
+       OUT_RING(ring, submit->fence->seqno);
 
        if (adreno_is_a3xx(adreno_gpu) || adreno_is_a4xx(adreno_gpu)) {
                /* Flush HLSQ lazy updates to make sure there is nothing
@@ -185,7 +185,7 @@ int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
        OUT_PKT3(ring, CP_EVENT_WRITE, 3);
        OUT_RING(ring, CACHE_FLUSH_TS);
        OUT_RING(ring, rbmemptr(adreno_gpu, fence));
-       OUT_RING(ring, submit->fence);
+       OUT_RING(ring, submit->fence->seqno);
 
        /* we could maybe be clever and only CP_COND_EXEC the interrupt: */
        OUT_PKT3(ring, CP_INTERRUPT, 1);
@@ -212,8 +212,6 @@ int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
 #endif
 
        gpu->funcs->flush(gpu);
-
-       return 0;
 }
 
 void adreno_flush(struct msm_gpu *gpu)
@@ -254,7 +252,7 @@ void adreno_show(struct msm_gpu *gpu, struct seq_file *m)
                        adreno_gpu->rev.patchid);
 
        seq_printf(m, "fence:    %d/%d\n", adreno_gpu->memptrs->fence,
-                       gpu->submitted_fence);
+                       gpu->fctx->last_fence);
        seq_printf(m, "rptr:     %d\n", get_rptr(adreno_gpu));
        seq_printf(m, "wptr:     %d\n", adreno_gpu->memptrs->wptr);
        seq_printf(m, "rb wptr:  %d\n", get_wptr(gpu->rb));
@@ -295,7 +293,7 @@ void adreno_dump_info(struct msm_gpu *gpu)
                        adreno_gpu->rev.patchid);
 
        printk("fence:    %d/%d\n", adreno_gpu->memptrs->fence,
-                       gpu->submitted_fence);
+                       gpu->fctx->last_fence);
        printk("rptr:     %d\n", get_rptr(adreno_gpu));
        printk("wptr:     %d\n", adreno_gpu->memptrs->wptr);
        printk("rb wptr:  %d\n", get_wptr(gpu->rb));
index 1d07511f4d225eff989183bf01f2b8872c98ed4b..a54f6e036b4ab740700cf79d7fcd53f8c084d2e9 100644 (file)
@@ -238,7 +238,7 @@ int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value);
 int adreno_hw_init(struct msm_gpu *gpu);
 uint32_t adreno_last_fence(struct msm_gpu *gpu);
 void adreno_recover(struct msm_gpu *gpu);
-int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
+void adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
                struct msm_file_private *ctx);
 void adreno_flush(struct msm_gpu *gpu);
 void adreno_idle(struct msm_gpu *gpu);
index 749fbb28ec3d1fbeaaee12b39ebe031f3760a1f4..03f115f532c240a82f199efefdb0af6996ded09c 100644 (file)
@@ -41,8 +41,6 @@ enum msm_dsi_phy_type {
 /* Regulators for DSI devices */
 struct dsi_reg_entry {
        char name[32];
-       int min_voltage;
-       int max_voltage;
        int enable_load;
        int disable_load;
 };
index e58e9b91b34d341baf9ed9e348f20c42e44aeb0f..93c1ee094eac867074c3da9be5b38970703c657f 100644 (file)
@@ -22,9 +22,9 @@ static const struct msm_dsi_config apq8064_dsi_cfg = {
        .reg_cfg = {
                .num = 3,
                .regs = {
-                       {"vdda", 1200000, 1200000, 100000, 100},
-                       {"avdd", 3000000, 3000000, 110000, 100},
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"vdda", 100000, 100},  /* 1.2 V */
+                       {"avdd", 10000, 100},   /* 3.0 V */
+                       {"vddio", 100000, 100}, /* 1.8 V */
                },
        },
        .bus_clk_names = dsi_v2_bus_clk_names,
@@ -40,10 +40,10 @@ static const struct msm_dsi_config msm8974_apq8084_dsi_cfg = {
        .reg_cfg = {
                .num = 4,
                .regs = {
-                       {"gdsc", -1, -1, -1, -1},
-                       {"vdd", 3000000, 3000000, 150000, 100},
-                       {"vdda", 1200000, 1200000, 100000, 100},
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"gdsc", -1, -1},
+                       {"vdd", 150000, 100},   /* 3.0 V */
+                       {"vdda", 100000, 100},  /* 1.2 V */
+                       {"vddio", 100000, 100}, /* 1.8 V */
                },
        },
        .bus_clk_names = dsi_6g_bus_clk_names,
@@ -59,9 +59,9 @@ static const struct msm_dsi_config msm8916_dsi_cfg = {
        .reg_cfg = {
                .num = 3,
                .regs = {
-                       {"gdsc", -1, -1, -1, -1},
-                       {"vdda", 1200000, 1200000, 100000, 100},
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"gdsc", -1, -1},
+                       {"vdda", 100000, 100},  /* 1.2 V */
+                       {"vddio", 100000, 100}, /* 1.8 V */
                },
        },
        .bus_clk_names = dsi_8916_bus_clk_names,
@@ -73,13 +73,13 @@ static const struct msm_dsi_config msm8994_dsi_cfg = {
        .reg_cfg = {
                .num = 7,
                .regs = {
-                       {"gdsc", -1, -1, -1, -1},
-                       {"vdda", 1250000, 1250000, 100000, 100},
-                       {"vddio", 1800000, 1800000, 100000, 100},
-                       {"vcca", 1000000, 1000000, 10000, 100},
-                       {"vdd", 1800000, 1800000, 100000, 100},
-                       {"lab_reg", -1, -1, -1, -1},
-                       {"ibb_reg", -1, -1, -1, -1},
+                       {"gdsc", -1, -1},
+                       {"vdda", 100000, 100},  /* 1.25 V */
+                       {"vddio", 100000, 100}, /* 1.8 V */
+                       {"vcca", 10000, 100},   /* 1.0 V */
+                       {"vdd", 100000, 100},   /* 1.8 V */
+                       {"lab_reg", -1, -1},
+                       {"ibb_reg", -1, -1},
                },
        },
        .bus_clk_names = dsi_6g_bus_clk_names,
index 4282ec6bbaafd2937e0d8bf2dca91908d23737da..a3e47ad83eb398f1e1c803eb86d0c2a8b13885d5 100644 (file)
@@ -325,18 +325,6 @@ static int dsi_regulator_init(struct msm_dsi_host *msm_host)
                return ret;
        }
 
-       for (i = 0; i < num; i++) {
-               if (regulator_can_change_voltage(s[i].consumer)) {
-                       ret = regulator_set_voltage(s[i].consumer,
-                               regs[i].min_voltage, regs[i].max_voltage);
-                       if (ret < 0) {
-                               pr_err("regulator %d set voltage failed, %d\n",
-                                       i, ret);
-                               return ret;
-                       }
-               }
-       }
-
        return 0;
 }
 
index 58ba7ec17f512a0413f915dc7984915702525fe7..c8d1f19c9a6d92c7a5ee9f642abec21dfdda20a0 100644 (file)
@@ -198,9 +198,13 @@ static enum drm_connector_status dsi_mgr_connector_detect(
 
 static void dsi_mgr_connector_destroy(struct drm_connector *connector)
 {
+       struct dsi_connector *dsi_connector = to_dsi_connector(connector);
+
        DBG("");
-       drm_connector_unregister(connector);
+
        drm_connector_cleanup(connector);
+
+       kfree(dsi_connector);
 }
 
 static void dsi_dual_connector_fix_modes(struct drm_connector *connector)
@@ -538,12 +542,9 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
        struct dsi_connector *dsi_connector;
        int ret, i;
 
-       dsi_connector = devm_kzalloc(msm_dsi->dev->dev,
-                               sizeof(*dsi_connector), GFP_KERNEL);
-       if (!dsi_connector) {
-               ret = -ENOMEM;
-               goto fail;
-       }
+       dsi_connector = kzalloc(sizeof(*dsi_connector), GFP_KERNEL);
+       if (!dsi_connector)
+               return ERR_PTR(-ENOMEM);
 
        dsi_connector->id = id;
 
@@ -552,7 +553,7 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
        ret = drm_connector_init(msm_dsi->dev, connector,
                        &dsi_mgr_connector_funcs, DRM_MODE_CONNECTOR_DSI);
        if (ret)
-               goto fail;
+               return ERR_PTR(ret);
 
        drm_connector_helper_add(connector, &dsi_mgr_conn_helper_funcs);
 
@@ -565,21 +566,11 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
        connector->interlace_allowed = 0;
        connector->doublescan_allowed = 0;
 
-       ret = drm_connector_register(connector);
-       if (ret)
-               goto fail;
-
        for (i = 0; i < MSM_DSI_ENCODER_NUM; i++)
                drm_mode_connector_attach_encoder(connector,
                                                msm_dsi->encoders[i]);
 
        return connector;
-
-fail:
-       if (connector)
-               dsi_mgr_connector_destroy(connector);
-
-       return ERR_PTR(ret);
 }
 
 /* initialize bridge */
index 91a95fb04a4a00394874e0ef2825ead71e2d74d4..e2f42d8ea29412e415577f33367d9494bd726ab0 100644 (file)
@@ -177,19 +177,6 @@ static int dsi_phy_regulator_init(struct msm_dsi_phy *phy)
                return ret;
        }
 
-       for (i = 0; i < num; i++) {
-               if (regulator_can_change_voltage(s[i].consumer)) {
-                       ret = regulator_set_voltage(s[i].consumer,
-                               regs[i].min_voltage, regs[i].max_voltage);
-                       if (ret < 0) {
-                               dev_err(dev,
-                                       "regulator %d set voltage failed, %d\n",
-                                       i, ret);
-                               return ret;
-                       }
-               }
-       }
-
        return 0;
 }
 
index 2e9ba118d50ac0899519aa6163d9551ea9decdd5..f4bc11af849a5ea23272c7f5e64ec58f70900815 100644 (file)
@@ -138,8 +138,8 @@ const struct msm_dsi_phy_cfg dsi_phy_20nm_cfgs = {
        .reg_cfg = {
                .num = 2,
                .regs = {
-                       {"vddio", 1800000, 1800000, 100000, 100},
-                       {"vcca", 1000000, 1000000, 10000, 100},
+                       {"vddio", 100000, 100}, /* 1.8 V */
+                       {"vcca", 10000, 100},   /* 1.0 V */
                },
        },
        .ops = {
index edf74110ced7bd1ec15a96f96114681006b6cb43..96d1852af41868a79d0eceeffa66e44eb34e9f5f 100644 (file)
@@ -138,7 +138,7 @@ const struct msm_dsi_phy_cfg dsi_phy_28nm_hpm_cfgs = {
        .reg_cfg = {
                .num = 1,
                .regs = {
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"vddio", 100000, 100},
                },
        },
        .ops = {
@@ -153,7 +153,7 @@ const struct msm_dsi_phy_cfg dsi_phy_28nm_lp_cfgs = {
        .reg_cfg = {
                .num = 1,
                .regs = {
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"vddio", 100000, 100}, /* 1.8 V */
                },
        },
        .ops = {
index 197b039ca1f1ce085542dd9186c5259155dc6048..213355a3e767a54d19498679cae2bb908992d7da 100644 (file)
@@ -185,7 +185,7 @@ const struct msm_dsi_phy_cfg dsi_phy_28nm_8960_cfgs = {
        .reg_cfg = {
                .num = 1,
                .regs = {
-                       {"vddio", 1800000, 1800000, 100000, 100},
+                       {"vddio", 100000, 100}, /* 1.8 V */
                },
        },
        .ops = {
index b4d1b469862a4c0281156f578492b8de43b2765e..72360cd038c02f35f2e1fdc435fb5873ae03414c 100644 (file)
@@ -37,7 +37,7 @@ static void edp_connector_destroy(struct drm_connector *connector)
        struct edp_connector *edp_connector = to_edp_connector(connector);
 
        DBG("");
-       drm_connector_unregister(connector);
+
        drm_connector_cleanup(connector);
 
        kfree(edp_connector);
@@ -124,10 +124,8 @@ struct drm_connector *msm_edp_connector_init(struct msm_edp *edp)
        int ret;
 
        edp_connector = kzalloc(sizeof(*edp_connector), GFP_KERNEL);
-       if (!edp_connector) {
-               ret = -ENOMEM;
-               goto fail;
-       }
+       if (!edp_connector)
+               return ERR_PTR(-ENOMEM);
 
        edp_connector->edp = edp;
 
@@ -136,7 +134,7 @@ struct drm_connector *msm_edp_connector_init(struct msm_edp *edp)
        ret = drm_connector_init(edp->dev, connector, &edp_connector_funcs,
                        DRM_MODE_CONNECTOR_eDP);
        if (ret)
-               goto fail;
+               return ERR_PTR(ret);
 
        drm_connector_helper_add(connector, &edp_connector_helper_funcs);
 
@@ -147,17 +145,7 @@ struct drm_connector *msm_edp_connector_init(struct msm_edp *edp)
        connector->interlace_allowed = false;
        connector->doublescan_allowed = false;
 
-       ret = drm_connector_register(connector);
-       if (ret)
-               goto fail;
-
        drm_mode_connector_attach_encoder(connector, edp->encoder);
 
        return connector;
-
-fail:
-       if (connector)
-               edp_connector_destroy(connector);
-
-       return ERR_PTR(ret);
 }
index 81200e9be3821c9c87db1a26d46318d133378ba8..149bfe7ddd82de83d9b780ba26e9913bc73ec633 100644 (file)
@@ -21,8 +21,6 @@
 #include "edp.h"
 #include "edp.xml.h"
 
-#define VDDA_MIN_UV            1800000 /* uV units */
-#define VDDA_MAX_UV            1800000 /* uV units */
 #define VDDA_UA_ON_LOAD                100000  /* uA units */
 #define VDDA_UA_OFF_LOAD       100     /* uA units */
 
@@ -67,7 +65,7 @@ struct edp_ctrl {
        void __iomem *base;
 
        /* regulators */
-       struct regulator *vdda_vreg;
+       struct regulator *vdda_vreg;    /* 1.8 V */
        struct regulator *lvl_vreg;
 
        /* clocks */
@@ -302,21 +300,24 @@ static void edp_clk_disable(struct edp_ctrl *ctrl, u32 clk_mask)
 static int edp_regulator_init(struct edp_ctrl *ctrl)
 {
        struct device *dev = &ctrl->pdev->dev;
+       int ret;
 
        DBG("");
        ctrl->vdda_vreg = devm_regulator_get(dev, "vdda");
-       if (IS_ERR(ctrl->vdda_vreg)) {
-               pr_err("%s: Could not get vdda reg, ret = %ld\n", __func__,
-                               PTR_ERR(ctrl->vdda_vreg));
+       ret = PTR_ERR_OR_ZERO(ctrl->vdda_vreg);
+       if (ret) {
+               pr_err("%s: Could not get vdda reg, ret = %d\n", __func__,
+                               ret);
                ctrl->vdda_vreg = NULL;
-               return PTR_ERR(ctrl->vdda_vreg);
+               return ret;
        }
        ctrl->lvl_vreg = devm_regulator_get(dev, "lvl-vdd");
-       if (IS_ERR(ctrl->lvl_vreg)) {
-               pr_err("Could not get lvl-vdd reg, %ld",
-                               PTR_ERR(ctrl->lvl_vreg));
+       ret = PTR_ERR_OR_ZERO(ctrl->lvl_vreg);
+       if (ret) {
+               pr_err("%s: Could not get lvl-vdd reg, ret = %d\n", __func__,
+                               ret);
                ctrl->lvl_vreg = NULL;
-               return PTR_ERR(ctrl->lvl_vreg);
+               return ret;
        }
 
        return 0;
@@ -326,12 +327,6 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl)
 {
        int ret;
 
-       ret = regulator_set_voltage(ctrl->vdda_vreg, VDDA_MIN_UV, VDDA_MAX_UV);
-       if (ret) {
-               pr_err("%s:vdda_vreg set_voltage failed, %d\n", __func__, ret);
-               goto vdda_set_fail;
-       }
-
        ret = regulator_set_load(ctrl->vdda_vreg, VDDA_UA_ON_LOAD);
        if (ret < 0) {
                pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__);
index 65428cf233ce3cd69063a2b815655c42dddbf349..bc7ba0bdee072056526f3f1da8cc88c981ec1150 100644 (file)
@@ -243,10 +243,21 @@ struct i2c_adapter *msm_hdmi_i2c_init(struct hdmi *hdmi);
 /*
  * hdcp
  */
+#ifdef CONFIG_DRM_MSM_HDMI_HDCP
 struct hdmi_hdcp_ctrl *msm_hdmi_hdcp_init(struct hdmi *hdmi);
 void msm_hdmi_hdcp_destroy(struct hdmi *hdmi);
 void msm_hdmi_hdcp_on(struct hdmi_hdcp_ctrl *hdcp_ctrl);
 void msm_hdmi_hdcp_off(struct hdmi_hdcp_ctrl *hdcp_ctrl);
 void msm_hdmi_hdcp_irq(struct hdmi_hdcp_ctrl *hdcp_ctrl);
+#else
+static inline struct hdmi_hdcp_ctrl *msm_hdmi_hdcp_init(struct hdmi *hdmi)
+{
+       return ERR_PTR(-ENXIO);
+}
+static inline void msm_hdmi_hdcp_destroy(struct hdmi *hdmi) {}
+static inline void msm_hdmi_hdcp_on(struct hdmi_hdcp_ctrl *hdcp_ctrl) {}
+static inline void msm_hdmi_hdcp_off(struct hdmi_hdcp_ctrl *hdcp_ctrl) {}
+static inline void msm_hdmi_hdcp_irq(struct hdmi_hdcp_ctrl *hdcp_ctrl) {}
+#endif
 
 #endif /* __HDMI_CONNECTOR_H__ */
index 26129bff2dd69ab5f2bae05ca5a47e68773ba81a..b15d72683112dc9bcf37f1cf1a8d5983a663c889 100644 (file)
@@ -112,6 +112,9 @@ static int gpio_config(struct hdmi *hdmi, bool on)
                for (i = 0; i < HDMI_MAX_NUM_GPIO; i++) {
                        struct hdmi_gpio_data gpio = config->gpios[i];
 
+                       if (gpio.num == -1)
+                               continue;
+
                        if (gpio.output) {
                                int value = gpio.value ? 0 : 1;
 
@@ -126,8 +129,10 @@ static int gpio_config(struct hdmi *hdmi, bool on)
 
        return 0;
 err:
-       while (i--)
-               gpio_free(config->gpios[i].num);
+       while (i--) {
+               if (config->gpios[i].num != -1)
+                       gpio_free(config->gpios[i].num);
+       }
 
        return ret;
 }
@@ -341,7 +346,6 @@ static void hdmi_connector_destroy(struct drm_connector *connector)
 
        hdp_disable(hdmi_connector);
 
-       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 
        kfree(hdmi_connector);
@@ -433,10 +437,8 @@ struct drm_connector *msm_hdmi_connector_init(struct hdmi *hdmi)
        int ret;
 
        hdmi_connector = kzalloc(sizeof(*hdmi_connector), GFP_KERNEL);
-       if (!hdmi_connector) {
-               ret = -ENOMEM;
-               goto fail;
-       }
+       if (!hdmi_connector)
+               return ERR_PTR(-ENOMEM);
 
        hdmi_connector->hdmi = hdmi;
        INIT_WORK(&hdmi_connector->hpd_work, msm_hdmi_hotplug_work);
@@ -453,21 +455,13 @@ struct drm_connector *msm_hdmi_connector_init(struct hdmi *hdmi)
        connector->interlace_allowed = 0;
        connector->doublescan_allowed = 0;
 
-       drm_connector_register(connector);
-
        ret = hpd_enable(hdmi_connector);
        if (ret) {
                dev_err(&hdmi->pdev->dev, "failed to enable HPD: %d\n", ret);
-               goto fail;
+               return ERR_PTR(ret);
        }
 
        drm_mode_connector_attach_encoder(connector, hdmi->encoder);
 
        return connector;
-
-fail:
-       if (connector)
-               hdmi_connector_destroy(connector);
-
-       return ERR_PTR(ret);
 }
index e233acf523349c8e0e84aa6df34cb1fecce1da91..9527dafc3e69be58a0167f04d5b4a684fae7c9ae 100644 (file)
@@ -121,7 +121,7 @@ static void complete_flip(struct drm_crtc *crtc, struct drm_file *file)
                if (!file || (event->base.file_priv == file)) {
                        mdp4_crtc->event = NULL;
                        DBG("%s: send event: %p", mdp4_crtc->name, event);
-                       drm_send_vblank_event(dev, mdp4_crtc->id, event);
+                       drm_crtc_send_vblank_event(crtc, event);
                }
        }
        spin_unlock_irqrestore(&dev->event_lock, flags);
@@ -427,7 +427,7 @@ static int mdp4_crtc_cursor_set(struct drm_crtc *crtc,
        }
 
        if (handle) {
-               cursor_bo = drm_gem_object_lookup(dev, file_priv, handle);
+               cursor_bo = drm_gem_object_lookup(file_priv, handle);
                if (!cursor_bo)
                        return -ENOENT;
        } else {
index 76e1dfb5d25ea4e6a77012fd3f088be473237c1c..67442d50a6c2161e5ea676c8b8e8983230f456fa 100644 (file)
@@ -50,30 +50,6 @@ static int mdp4_hw_init(struct msm_kms *kms)
 
        mdp4_kms->rev = minor;
 
-       if (mdp4_kms->dsi_pll_vdda) {
-               if ((mdp4_kms->rev == 2) || (mdp4_kms->rev == 4)) {
-                       ret = regulator_set_voltage(mdp4_kms->dsi_pll_vdda,
-                                       1200000, 1200000);
-                       if (ret) {
-                               dev_err(dev->dev,
-                                       "failed to set dsi_pll_vdda voltage: %d\n", ret);
-                               goto out;
-                       }
-               }
-       }
-
-       if (mdp4_kms->dsi_pll_vddio) {
-               if (mdp4_kms->rev == 2) {
-                       ret = regulator_set_voltage(mdp4_kms->dsi_pll_vddio,
-                                       1800000, 1800000);
-                       if (ret) {
-                               dev_err(dev->dev,
-                                       "failed to set dsi_pll_vddio voltage: %d\n", ret);
-                               goto out;
-                       }
-               }
-       }
-
        if (mdp4_kms->rev > 1) {
                mdp4_write(mdp4_kms, REG_MDP4_CS_CONTROLLER0, 0x0707ffff);
                mdp4_write(mdp4_kms, REG_MDP4_CS_CONTROLLER1, 0x03073f3f);
@@ -485,16 +461,6 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
                goto fail;
        }
 
-       mdp4_kms->dsi_pll_vdda =
-                       devm_regulator_get_optional(&pdev->dev, "dsi_pll_vdda");
-       if (IS_ERR(mdp4_kms->dsi_pll_vdda))
-               mdp4_kms->dsi_pll_vdda = NULL;
-
-       mdp4_kms->dsi_pll_vddio =
-                       devm_regulator_get_optional(&pdev->dev, "dsi_pll_vddio");
-       if (IS_ERR(mdp4_kms->dsi_pll_vddio))
-               mdp4_kms->dsi_pll_vddio = NULL;
-
        /* NOTE: driver for this regulator still missing upstream.. use
         * _get_exclusive() and ignore the error if it does not exist
         * (and hope that the bootloader left it on for us)
index b2828717be2ad18b01370bb434425be27897c1e4..c5d045d5680d74f5ef91715a1c00759fe8288a13 100644 (file)
@@ -37,8 +37,6 @@ struct mdp4_kms {
 
        void __iomem *mmio;
 
-       struct regulator *dsi_pll_vdda;
-       struct regulator *dsi_pll_vddio;
        struct regulator *vdd;
 
        struct clk *clk;
index e73e1742b25005d85c8620c36e85c9f2a45cdd3a..2648cd7631efc7738ea21e69aa205385a1160c26 100644 (file)
@@ -48,7 +48,6 @@ static void mdp4_lvds_connector_destroy(struct drm_connector *connector)
        struct mdp4_lvds_connector *mdp4_lvds_connector =
                        to_mdp4_lvds_connector(connector);
 
-       drm_connector_unregister(connector);
        drm_connector_cleanup(connector);
 
        kfree(mdp4_lvds_connector);
@@ -121,13 +120,10 @@ struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
 {
        struct drm_connector *connector = NULL;
        struct mdp4_lvds_connector *mdp4_lvds_connector;
-       int ret;
 
        mdp4_lvds_connector = kzalloc(sizeof(*mdp4_lvds_connector), GFP_KERNEL);
-       if (!mdp4_lvds_connector) {
-               ret = -ENOMEM;
-               goto fail;
-       }
+       if (!mdp4_lvds_connector)
+               return ERR_PTR(-ENOMEM);
 
        mdp4_lvds_connector->encoder = encoder;
        mdp4_lvds_connector->panel_node = panel_node;
@@ -143,15 +139,7 @@ struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
        connector->interlace_allowed = 0;
        connector->doublescan_allowed = 0;
 
-       drm_connector_register(connector);
-
        drm_mode_connector_attach_encoder(connector, encoder);
 
        return connector;
-
-fail:
-       if (connector)
-               mdp4_lvds_connector_destroy(connector);
-
-       return ERR_PTR(ret);
 }
index 9673b9520b6aeb56d2f6d6823b389828ea4b7a8f..88fe256c1931a5767f08158669d62e376f8ee1f3 100644 (file)
@@ -149,7 +149,7 @@ static void complete_flip(struct drm_crtc *crtc, struct drm_file *file)
                if (!file || (event->base.file_priv == file)) {
                        mdp5_crtc->event = NULL;
                        DBG("%s: send event: %p", mdp5_crtc->name, event);
-                       drm_send_vblank_event(dev, mdp5_crtc->id, event);
+                       drm_crtc_send_vblank_event(crtc, event);
                }
        }
        spin_unlock_irqrestore(&dev->event_lock, flags);
@@ -518,7 +518,7 @@ static int mdp5_crtc_cursor_set(struct drm_crtc *crtc,
                goto set_cursor;
        }
 
-       cursor_bo = drm_gem_object_lookup(dev, file, handle);
+       cursor_bo = drm_gem_object_lookup(file, handle);
        if (!cursor_bo)
                return -ENOENT;
 
index 1c2caffc97e400b650b96a3e554fb5fe25d312a8..b4a8aa4490eed8ced3aaf167d4172331abcd5d4f 100644 (file)
@@ -105,6 +105,12 @@ static const struct mdp_format formats[] = {
                        MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
        FMT(XRGB8888, 8, 8, 8, 8,  1, 0, 2, 3,  false,  true,  4,  4,
                        MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
+       FMT(XBGR8888, 8, 8, 8, 8,  2, 0, 1, 3,  false,   true,  4,  4,
+                       MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
+       FMT(RGBX8888, 8, 8, 8, 8,  3, 1, 0, 2,  false,   true,  4,  4,
+                       MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
+       FMT(BGRX8888, 8, 8, 8, 8,  3, 2, 0, 1,  false,   true,  4,  4,
+                       MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
        FMT(RGB888,   0, 8, 8, 8,  1, 0, 2, 0,  false,  true,  3,  3,
                        MDP_PLANE_INTERLEAVED, CHROMA_FULL, false),
        FMT(BGR888,   0, 8, 8, 8,  2, 0, 1, 0,  false,  true,  3,  3,
index 7eb253bc24df3156b75f6409f6b9a9df184b66ae..e3892c263f2791b82a6a93fc4e2100710631265a 100644 (file)
 #include "msm_drv.h"
 #include "msm_kms.h"
 #include "msm_gem.h"
+#include "msm_fence.h"
 
 struct msm_commit {
        struct drm_device *dev;
        struct drm_atomic_state *state;
-       uint32_t fence;
-       struct msm_fence_cb fence_cb;
+       struct work_struct work;
        uint32_t crtc_mask;
 };
 
-static void fence_cb(struct msm_fence_cb *cb);
+static void commit_worker(struct work_struct *work);
 
 /* block until specified crtcs are no longer pending update, and
  * atomically mark them as pending update
@@ -69,11 +69,7 @@ static struct msm_commit *commit_init(struct drm_atomic_state *state)
        c->dev = state->dev;
        c->state = state;
 
-       /* TODO we might need a way to indicate to run the cb on a
-        * different wq so wait_for_vblanks() doesn't block retiring
-        * bo's..
-        */
-       INIT_FENCE_CB(&c->fence_cb, fence_cb);
+       INIT_WORK(&c->work, commit_worker);
 
        return c;
 }
@@ -114,13 +110,15 @@ static void msm_atomic_wait_for_commit_done(struct drm_device *dev,
 /* The (potentially) asynchronous part of the commit.  At this point
  * nothing can fail short of armageddon.
  */
-static void complete_commit(struct msm_commit *c)
+static void complete_commit(struct msm_commit *c, bool async)
 {
        struct drm_atomic_state *state = c->state;
        struct drm_device *dev = state->dev;
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_kms *kms = priv->kms;
 
+       drm_atomic_helper_wait_for_fences(dev, state);
+
        kms->funcs->prepare_commit(kms, state);
 
        drm_atomic_helper_commit_modeset_disables(dev, state);
@@ -153,17 +151,9 @@ static void complete_commit(struct msm_commit *c)
        commit_destroy(c);
 }
 
-static void fence_cb(struct msm_fence_cb *cb)
-{
-       struct msm_commit *c =
-                       container_of(cb, struct msm_commit, fence_cb);
-       complete_commit(c);
-}
-
-static void add_fb(struct msm_commit *c, struct drm_framebuffer *fb)
+static void commit_worker(struct work_struct *work)
 {
-       struct drm_gem_object *obj = msm_framebuffer_bo(fb, 0);
-       c->fence = max(c->fence, msm_gem_fence(to_msm_bo(obj), MSM_PREP_READ));
+       complete_commit(container_of(work, struct msm_commit, work), true);
 }
 
 int msm_atomic_check(struct drm_device *dev,
@@ -190,21 +180,20 @@ int msm_atomic_check(struct drm_device *dev,
  * drm_atomic_helper_commit - commit validated state object
  * @dev: DRM device
  * @state: the driver state object
- * @async: asynchronous commit
+ * @nonblock: nonblocking commit
  *
  * This function commits a with drm_atomic_helper_check() pre-validated state
- * object. This can still fail when e.g. the framebuffer reservation fails. For
- * now this doesn't implement asynchronous commits.
+ * object. This can still fail when e.g. the framebuffer reservation fails.
  *
  * RETURNS
  * Zero for success or -errno.
  */
 int msm_atomic_commit(struct drm_device *dev,
-               struct drm_atomic_state *state, bool async)
+               struct drm_atomic_state *state, bool nonblock)
 {
+       struct msm_drm_private *priv = dev->dev_private;
        int nplanes = dev->mode_config.num_total_plane;
        int ncrtcs = dev->mode_config.num_crtc;
-       ktime_t timeout;
        struct msm_commit *c;
        int i, ret;
 
@@ -238,8 +227,12 @@ int msm_atomic_commit(struct drm_device *dev,
                if (!plane)
                        continue;
 
-               if ((plane->state->fb != new_state->fb) && new_state->fb)
-                       add_fb(c, new_state->fb);
+               if ((plane->state->fb != new_state->fb) && new_state->fb) {
+                       struct drm_gem_object *obj = msm_framebuffer_bo(new_state->fb, 0);
+                       struct msm_gem_object *msm_obj = to_msm_bo(obj);
+
+                       new_state->fence = reservation_object_get_excl_rcu(msm_obj->resv);
+               }
        }
 
        /*
@@ -276,17 +269,12 @@ int msm_atomic_commit(struct drm_device *dev,
         * current layout.
         */
 
-       if (async) {
-               msm_queue_fence_cb(dev, &c->fence_cb, c->fence);
+       if (nonblock) {
+               queue_work(priv->atomic_wq, &c->work);
                return 0;
        }
 
-       timeout = ktime_add_ms(ktime_get(), 1000);
-
-       /* uninterruptible wait */
-       msm_wait_fence(dev, c->fence, &timeout, false);
-
-       complete_commit(c);
+       complete_commit(c, false);
 
        return 0;
 
diff --git a/drivers/gpu/drm/msm/msm_debugfs.c b/drivers/gpu/drm/msm/msm_debugfs.c
new file mode 100644 (file)
index 0000000..663f2b6
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2013-2016 Red Hat
+ * Author: Rob Clark <robdclark@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef CONFIG_DEBUG_FS
+#include "msm_drv.h"
+#include "msm_gpu.h"
+
+static int msm_gpu_show(struct drm_device *dev, struct seq_file *m)
+{
+       struct msm_drm_private *priv = dev->dev_private;
+       struct msm_gpu *gpu = priv->gpu;
+
+       if (gpu) {
+               seq_printf(m, "%s Status:\n", gpu->name);
+               gpu->funcs->show(gpu, m);
+       }
+
+       return 0;
+}
+
+static int msm_gem_show(struct drm_device *dev, struct seq_file *m)
+{
+       struct msm_drm_private *priv = dev->dev_private;
+       struct msm_gpu *gpu = priv->gpu;
+
+       if (gpu) {
+               seq_printf(m, "Active Objects (%s):\n", gpu->name);
+               msm_gem_describe_objects(&gpu->active_list, m);
+       }
+
+       seq_printf(m, "Inactive Objects:\n");
+       msm_gem_describe_objects(&priv->inactive_list, m);
+
+       return 0;
+}
+
+static int msm_mm_show(struct drm_device *dev, struct seq_file *m)
+{
+       return drm_mm_dump_table(m, &dev->vma_offset_manager->vm_addr_space_mm);
+}
+
+static int msm_fb_show(struct drm_device *dev, struct seq_file *m)
+{
+       struct msm_drm_private *priv = dev->dev_private;
+       struct drm_framebuffer *fb, *fbdev_fb = NULL;
+
+       if (priv->fbdev) {
+               seq_printf(m, "fbcon ");
+               fbdev_fb = priv->fbdev->fb;
+               msm_framebuffer_describe(fbdev_fb, m);
+       }
+
+       mutex_lock(&dev->mode_config.fb_lock);
+       list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
+               if (fb == fbdev_fb)
+                       continue;
+
+               seq_printf(m, "user ");
+               msm_framebuffer_describe(fb, m);
+       }
+       mutex_unlock(&dev->mode_config.fb_lock);
+
+       return 0;
+}
+
+static int show_locked(struct seq_file *m, void *arg)
+{
+       struct drm_info_node *node = (struct drm_info_node *) m->private;
+       struct drm_device *dev = node->minor->dev;
+       int (*show)(struct drm_device *dev, struct seq_file *m) =
+                       node->info_ent->data;
+       int ret;
+
+       ret = mutex_lock_interruptible(&dev->struct_mutex);
+       if (ret)
+               return ret;
+
+       ret = show(dev, m);
+
+       mutex_unlock(&dev->struct_mutex);
+
+       return ret;
+}
+
+static struct drm_info_list msm_debugfs_list[] = {
+               {"gpu", show_locked, 0, msm_gpu_show},
+               {"gem", show_locked, 0, msm_gem_show},
+               { "mm", show_locked, 0, msm_mm_show },
+               { "fb", show_locked, 0, msm_fb_show },
+};
+
+static int late_init_minor(struct drm_minor *minor)
+{
+       int ret;
+
+       if (!minor)
+               return 0;
+
+       ret = msm_rd_debugfs_init(minor);
+       if (ret) {
+               dev_err(minor->dev->dev, "could not install rd debugfs\n");
+               return ret;
+       }
+
+       ret = msm_perf_debugfs_init(minor);
+       if (ret) {
+               dev_err(minor->dev->dev, "could not install perf debugfs\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+int msm_debugfs_late_init(struct drm_device *dev)
+{
+       int ret;
+       ret = late_init_minor(dev->primary);
+       if (ret)
+               return ret;
+       ret = late_init_minor(dev->render);
+       if (ret)
+               return ret;
+       ret = late_init_minor(dev->control);
+       return ret;
+}
+
+int msm_debugfs_init(struct drm_minor *minor)
+{
+       struct drm_device *dev = minor->dev;
+       int ret;
+
+       ret = drm_debugfs_create_files(msm_debugfs_list,
+                       ARRAY_SIZE(msm_debugfs_list),
+                       minor->debugfs_root, minor);
+
+       if (ret) {
+               dev_err(dev->dev, "could not install msm_debugfs_list\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+void msm_debugfs_cleanup(struct drm_minor *minor)
+{
+       drm_debugfs_remove_files(msm_debugfs_list,
+                       ARRAY_SIZE(msm_debugfs_list), minor);
+       if (!minor->dev->dev_private)
+               return;
+       msm_rd_debugfs_cleanup(minor);
+       msm_perf_debugfs_cleanup(minor);
+}
+#endif
+
diff --git a/drivers/gpu/drm/msm/msm_debugfs.h b/drivers/gpu/drm/msm/msm_debugfs.h
new file mode 100644 (file)
index 0000000..6110c97
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 Red Hat
+ * Author: Rob Clark <robdclark@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MSM_DEBUGFS_H__
+#define __MSM_DEBUGFS_H__
+
+#ifdef CONFIG_DEBUG_FS
+int msm_debugfs_init(struct drm_minor *minor);
+void msm_debugfs_cleanup(struct drm_minor *minor);
+#endif
+
+#endif /* __MSM_DEBUGFS_H__ */
index c03b96709179bcb882764b961d891d54e08dc28b..9c654092ef7891c8e3edab6e4492373adb72caa7 100644 (file)
@@ -16,6 +16,8 @@
  */
 
 #include "msm_drv.h"
+#include "msm_debugfs.h"
+#include "msm_fence.h"
 #include "msm_gpu.h"
 #include "msm_kms.h"
 
@@ -173,13 +175,11 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
        return 0;
 }
 
-/*
- * DRM operations:
- */
-
-static int msm_unload(struct drm_device *dev)
+static int msm_drm_uninit(struct device *dev)
 {
-       struct msm_drm_private *priv = dev->dev_private;
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *ddev = platform_get_drvdata(pdev);
+       struct msm_drm_private *priv = ddev->dev_private;
        struct msm_kms *kms = priv->kms;
        struct msm_gpu *gpu = priv->gpu;
        struct msm_vblank_ctrl *vbl_ctrl = &priv->vblank_ctrl;
@@ -195,31 +195,37 @@ static int msm_unload(struct drm_device *dev)
                kfree(vbl_ev);
        }
 
-       drm_kms_helper_poll_fini(dev);
+       drm_kms_helper_poll_fini(ddev);
+
+       drm_connector_unregister_all(ddev);
+
+       drm_dev_unregister(ddev);
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
        if (fbdev && priv->fbdev)
-               msm_fbdev_free(dev);
+               msm_fbdev_free(ddev);
 #endif
-       drm_mode_config_cleanup(dev);
-       drm_vblank_cleanup(dev);
+       drm_mode_config_cleanup(ddev);
 
-       pm_runtime_get_sync(dev->dev);
-       drm_irq_uninstall(dev);
-       pm_runtime_put_sync(dev->dev);
+       pm_runtime_get_sync(dev);
+       drm_irq_uninstall(ddev);
+       pm_runtime_put_sync(dev);
 
        flush_workqueue(priv->wq);
        destroy_workqueue(priv->wq);
 
+       flush_workqueue(priv->atomic_wq);
+       destroy_workqueue(priv->atomic_wq);
+
        if (kms) {
-               pm_runtime_disable(dev->dev);
+               pm_runtime_disable(dev);
                kms->funcs->destroy(kms);
        }
 
        if (gpu) {
-               mutex_lock(&dev->struct_mutex);
+               mutex_lock(&ddev->struct_mutex);
                gpu->funcs->pm_suspend(gpu);
-               mutex_unlock(&dev->struct_mutex);
+               mutex_unlock(&ddev->struct_mutex);
                gpu->funcs->destroy(gpu);
        }
 
@@ -227,13 +233,14 @@ static int msm_unload(struct drm_device *dev)
                DEFINE_DMA_ATTRS(attrs);
                dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &attrs);
                drm_mm_takedown(&priv->vram.mm);
-               dma_free_attrs(dev->dev, priv->vram.size, NULL,
-                               priv->vram.paddr, &attrs);
+               dma_free_attrs(dev, priv->vram.size, NULL,
+                              priv->vram.paddr, &attrs);
        }
 
-       component_unbind_all(dev->dev, dev);
+       component_unbind_all(dev, ddev);
 
-       dev->dev_private = NULL;
+       ddev->dev_private = NULL;
+       drm_dev_unref(ddev);
 
        kfree(priv);
 
@@ -321,50 +328,60 @@ static int msm_init_vram(struct drm_device *dev)
        return ret;
 }
 
-static int msm_load(struct drm_device *dev, unsigned long flags)
+static int msm_drm_init(struct device *dev, struct drm_driver *drv)
 {
-       struct platform_device *pdev = dev->platformdev;
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *ddev;
        struct msm_drm_private *priv;
        struct msm_kms *kms;
        int ret;
 
+       ddev = drm_dev_alloc(drv, dev);
+       if (!ddev) {
+               dev_err(dev, "failed to allocate drm_device\n");
+               return -ENOMEM;
+       }
+
+       platform_set_drvdata(pdev, ddev);
+       ddev->platformdev = pdev;
+
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv) {
-               dev_err(dev->dev, "failed to allocate private data\n");
+               drm_dev_unref(ddev);
                return -ENOMEM;
        }
 
-       dev->dev_private = priv;
+       ddev->dev_private = priv;
 
        priv->wq = alloc_ordered_workqueue("msm", 0);
-       init_waitqueue_head(&priv->fence_event);
+       priv->atomic_wq = alloc_ordered_workqueue("msm:atomic", 0);
        init_waitqueue_head(&priv->pending_crtcs_event);
 
        INIT_LIST_HEAD(&priv->inactive_list);
-       INIT_LIST_HEAD(&priv->fence_cbs);
        INIT_LIST_HEAD(&priv->vblank_ctrl.event_list);
        INIT_WORK(&priv->vblank_ctrl.work, vblank_ctrl_worker);
        spin_lock_init(&priv->vblank_ctrl.lock);
 
-       drm_mode_config_init(dev);
-
-       platform_set_drvdata(pdev, dev);
+       drm_mode_config_init(ddev);
 
        /* Bind all our sub-components: */
-       ret = component_bind_all(dev->dev, dev);
-       if (ret)
+       ret = component_bind_all(dev, ddev);
+       if (ret) {
+               kfree(priv);
+               drm_dev_unref(ddev);
                return ret;
+       }
 
-       ret = msm_init_vram(dev);
+       ret = msm_init_vram(ddev);
        if (ret)
                goto fail;
 
        switch (get_mdp_ver(pdev)) {
        case 4:
-               kms = mdp4_kms_init(dev);
+               kms = mdp4_kms_init(ddev);
                break;
        case 5:
-               kms = mdp5_kms_init(dev);
+               kms = mdp5_kms_init(ddev);
                break;
        default:
                kms = ERR_PTR(-ENODEV);
@@ -378,7 +395,7 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
                 * and (for example) use dmabuf/prime to share buffers with
                 * imx drm driver on iMX5
                 */
-               dev_err(dev->dev, "failed to load kms\n");
+               dev_err(dev, "failed to load kms\n");
                ret = PTR_ERR(kms);
                goto fail;
        }
@@ -386,50 +403,64 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
        priv->kms = kms;
 
        if (kms) {
-               pm_runtime_enable(dev->dev);
+               pm_runtime_enable(dev);
                ret = kms->funcs->hw_init(kms);
                if (ret) {
-                       dev_err(dev->dev, "kms hw init failed: %d\n", ret);
+                       dev_err(dev, "kms hw init failed: %d\n", ret);
                        goto fail;
                }
        }
 
-       dev->mode_config.funcs = &mode_config_funcs;
+       ddev->mode_config.funcs = &mode_config_funcs;
 
-       ret = drm_vblank_init(dev, priv->num_crtcs);
+       ret = drm_vblank_init(ddev, priv->num_crtcs);
        if (ret < 0) {
-               dev_err(dev->dev, "failed to initialize vblank\n");
+               dev_err(dev, "failed to initialize vblank\n");
                goto fail;
        }
 
-       pm_runtime_get_sync(dev->dev);
-       ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));
-       pm_runtime_put_sync(dev->dev);
+       pm_runtime_get_sync(dev);
+       ret = drm_irq_install(ddev, platform_get_irq(pdev, 0));
+       pm_runtime_put_sync(dev);
        if (ret < 0) {
-               dev_err(dev->dev, "failed to install IRQ handler\n");
+               dev_err(dev, "failed to install IRQ handler\n");
+               goto fail;
+       }
+
+       ret = drm_dev_register(ddev, 0);
+       if (ret)
+               goto fail;
+
+       ret = drm_connector_register_all(ddev);
+       if (ret) {
+               dev_err(dev, "failed to register connectors\n");
                goto fail;
        }
 
-       drm_mode_config_reset(dev);
+       drm_mode_config_reset(ddev);
 
 #ifdef CONFIG_DRM_FBDEV_EMULATION
        if (fbdev)
-               priv->fbdev = msm_fbdev_init(dev);
+               priv->fbdev = msm_fbdev_init(ddev);
 #endif
 
-       ret = msm_debugfs_late_init(dev);
+       ret = msm_debugfs_late_init(ddev);
        if (ret)
                goto fail;
 
-       drm_kms_helper_poll_init(dev);
+       drm_kms_helper_poll_init(ddev);
 
        return 0;
 
 fail:
-       msm_unload(dev);
+       msm_drm_uninit(dev);
        return ret;
 }
 
+/*
+ * DRM operations:
+ */
+
 static void load_gpu(struct drm_device *dev)
 {
        static DEFINE_MUTEX(init_lock);
@@ -465,7 +496,6 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file)
 {
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_file_private *ctx = file->driver_priv;
-       struct msm_kms *kms = priv->kms;
 
        mutex_lock(&dev->struct_mutex);
        if (ctx == priv->lastctx)
@@ -535,265 +565,6 @@ static void msm_disable_vblank(struct drm_device *dev, unsigned int pipe)
        vblank_ctrl_queue_work(priv, pipe, false);
 }
 
-/*
- * DRM debugfs:
- */
-
-#ifdef CONFIG_DEBUG_FS
-static int msm_gpu_show(struct drm_device *dev, struct seq_file *m)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       struct msm_gpu *gpu = priv->gpu;
-
-       if (gpu) {
-               seq_printf(m, "%s Status:\n", gpu->name);
-               gpu->funcs->show(gpu, m);
-       }
-
-       return 0;
-}
-
-static int msm_gem_show(struct drm_device *dev, struct seq_file *m)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       struct msm_gpu *gpu = priv->gpu;
-
-       if (gpu) {
-               seq_printf(m, "Active Objects (%s):\n", gpu->name);
-               msm_gem_describe_objects(&gpu->active_list, m);
-       }
-
-       seq_printf(m, "Inactive Objects:\n");
-       msm_gem_describe_objects(&priv->inactive_list, m);
-
-       return 0;
-}
-
-static int msm_mm_show(struct drm_device *dev, struct seq_file *m)
-{
-       return drm_mm_dump_table(m, &dev->vma_offset_manager->vm_addr_space_mm);
-}
-
-static int msm_fb_show(struct drm_device *dev, struct seq_file *m)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       struct drm_framebuffer *fb, *fbdev_fb = NULL;
-
-       if (priv->fbdev) {
-               seq_printf(m, "fbcon ");
-               fbdev_fb = priv->fbdev->fb;
-               msm_framebuffer_describe(fbdev_fb, m);
-       }
-
-       mutex_lock(&dev->mode_config.fb_lock);
-       list_for_each_entry(fb, &dev->mode_config.fb_list, head) {
-               if (fb == fbdev_fb)
-                       continue;
-
-               seq_printf(m, "user ");
-               msm_framebuffer_describe(fb, m);
-       }
-       mutex_unlock(&dev->mode_config.fb_lock);
-
-       return 0;
-}
-
-static int show_locked(struct seq_file *m, void *arg)
-{
-       struct drm_info_node *node = (struct drm_info_node *) m->private;
-       struct drm_device *dev = node->minor->dev;
-       int (*show)(struct drm_device *dev, struct seq_file *m) =
-                       node->info_ent->data;
-       int ret;
-
-       ret = mutex_lock_interruptible(&dev->struct_mutex);
-       if (ret)
-               return ret;
-
-       ret = show(dev, m);
-
-       mutex_unlock(&dev->struct_mutex);
-
-       return ret;
-}
-
-static struct drm_info_list msm_debugfs_list[] = {
-               {"gpu", show_locked, 0, msm_gpu_show},
-               {"gem", show_locked, 0, msm_gem_show},
-               { "mm", show_locked, 0, msm_mm_show },
-               { "fb", show_locked, 0, msm_fb_show },
-};
-
-static int late_init_minor(struct drm_minor *minor)
-{
-       int ret;
-
-       if (!minor)
-               return 0;
-
-       ret = msm_rd_debugfs_init(minor);
-       if (ret) {
-               dev_err(minor->dev->dev, "could not install rd debugfs\n");
-               return ret;
-       }
-
-       ret = msm_perf_debugfs_init(minor);
-       if (ret) {
-               dev_err(minor->dev->dev, "could not install perf debugfs\n");
-               return ret;
-       }
-
-       return 0;
-}
-
-int msm_debugfs_late_init(struct drm_device *dev)
-{
-       int ret;
-       ret = late_init_minor(dev->primary);
-       if (ret)
-               return ret;
-       ret = late_init_minor(dev->render);
-       if (ret)
-               return ret;
-       ret = late_init_minor(dev->control);
-       return ret;
-}
-
-static int msm_debugfs_init(struct drm_minor *minor)
-{
-       struct drm_device *dev = minor->dev;
-       int ret;
-
-       ret = drm_debugfs_create_files(msm_debugfs_list,
-                       ARRAY_SIZE(msm_debugfs_list),
-                       minor->debugfs_root, minor);
-
-       if (ret) {
-               dev_err(dev->dev, "could not install msm_debugfs_list\n");
-               return ret;
-       }
-
-       return 0;
-}
-
-static void msm_debugfs_cleanup(struct drm_minor *minor)
-{
-       drm_debugfs_remove_files(msm_debugfs_list,
-                       ARRAY_SIZE(msm_debugfs_list), minor);
-       if (!minor->dev->dev_private)
-               return;
-       msm_rd_debugfs_cleanup(minor);
-       msm_perf_debugfs_cleanup(minor);
-}
-#endif
-
-/*
- * Fences:
- */
-
-int msm_wait_fence(struct drm_device *dev, uint32_t fence,
-               ktime_t *timeout , bool interruptible)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       int ret;
-
-       if (!priv->gpu)
-               return 0;
-
-       if (fence > priv->gpu->submitted_fence) {
-               DRM_ERROR("waiting on invalid fence: %u (of %u)\n",
-                               fence, priv->gpu->submitted_fence);
-               return -EINVAL;
-       }
-
-       if (!timeout) {
-               /* no-wait: */
-               ret = fence_completed(dev, fence) ? 0 : -EBUSY;
-       } else {
-               ktime_t now = ktime_get();
-               unsigned long remaining_jiffies;
-
-               if (ktime_compare(*timeout, now) < 0) {
-                       remaining_jiffies = 0;
-               } else {
-                       ktime_t rem = ktime_sub(*timeout, now);
-                       struct timespec ts = ktime_to_timespec(rem);
-                       remaining_jiffies = timespec_to_jiffies(&ts);
-               }
-
-               if (interruptible)
-                       ret = wait_event_interruptible_timeout(priv->fence_event,
-                               fence_completed(dev, fence),
-                               remaining_jiffies);
-               else
-                       ret = wait_event_timeout(priv->fence_event,
-                               fence_completed(dev, fence),
-                               remaining_jiffies);
-
-               if (ret == 0) {
-                       DBG("timeout waiting for fence: %u (completed: %u)",
-                                       fence, priv->completed_fence);
-                       ret = -ETIMEDOUT;
-               } else if (ret != -ERESTARTSYS) {
-                       ret = 0;
-               }
-       }
-
-       return ret;
-}
-
-int msm_queue_fence_cb(struct drm_device *dev,
-               struct msm_fence_cb *cb, uint32_t fence)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       int ret = 0;
-
-       mutex_lock(&dev->struct_mutex);
-       if (!list_empty(&cb->work.entry)) {
-               ret = -EINVAL;
-       } else if (fence > priv->completed_fence) {
-               cb->fence = fence;
-               list_add_tail(&cb->work.entry, &priv->fence_cbs);
-       } else {
-               queue_work(priv->wq, &cb->work);
-       }
-       mutex_unlock(&dev->struct_mutex);
-
-       return ret;
-}
-
-/* called from workqueue */
-void msm_update_fence(struct drm_device *dev, uint32_t fence)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-
-       mutex_lock(&dev->struct_mutex);
-       priv->completed_fence = max(fence, priv->completed_fence);
-
-       while (!list_empty(&priv->fence_cbs)) {
-               struct msm_fence_cb *cb;
-
-               cb = list_first_entry(&priv->fence_cbs,
-                               struct msm_fence_cb, work.entry);
-
-               if (cb->fence > priv->completed_fence)
-                       break;
-
-               list_del_init(&cb->work.entry);
-               queue_work(priv->wq, &cb->work);
-       }
-
-       mutex_unlock(&dev->struct_mutex);
-
-       wake_up_all(&priv->fence_event);
-}
-
-void __msm_fence_worker(struct work_struct *work)
-{
-       struct msm_fence_cb *cb = container_of(work, struct msm_fence_cb, work);
-       cb->func(cb);
-}
-
 /*
  * DRM ioctls:
  */
@@ -851,7 +622,7 @@ static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -869,7 +640,7 @@ static int msm_ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
        struct drm_gem_object *obj;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -890,7 +661,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
        if (args->pad)
                return -EINVAL;
 
-       obj = drm_gem_object_lookup(dev, file, args->handle);
+       obj = drm_gem_object_lookup(file, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -904,6 +675,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,
 static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,
                struct drm_file *file)
 {
+       struct msm_drm_private *priv = dev->dev_private;
        struct drm_msm_wait_fence *args = data;
        ktime_t timeout = to_ktime(args->timeout);
 
@@ -912,7 +684,10 @@ static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       return msm_wait_fence(dev, args->fence, &timeout, true);
+       if (!priv->gpu)
+               return 0;
+
+       return msm_wait_fence(priv->gpu->fctx, args->fence, &timeout, true);
 }
 
 static const struct drm_ioctl_desc msm_ioctls[] = {
@@ -952,8 +727,6 @@ static struct drm_driver msm_driver = {
                                DRIVER_RENDER |
                                DRIVER_ATOMIC |
                                DRIVER_MODESET,
-       .load               = msm_load,
-       .unload             = msm_unload,
        .open               = msm_open,
        .preclose           = msm_preclose,
        .lastclose          = msm_lastclose,
@@ -1053,12 +826,12 @@ static int add_components(struct device *dev, struct component_match **matchptr,
 
 static int msm_drm_bind(struct device *dev)
 {
-       return drm_platform_init(&msm_driver, to_platform_device(dev));
+       return msm_drm_init(dev, &msm_driver);
 }
 
 static void msm_drm_unbind(struct device *dev)
 {
-       drm_put_dev(platform_get_drvdata(to_platform_device(dev)));
+       msm_drm_uninit(dev);
 }
 
 static const struct component_master_ops msm_drm_ops = {
index 870dbe58c2593562cfd47ebe93769df949753a3b..5b2963f32291bd0e4c1423c893090fbdf63212dc 100644 (file)
@@ -49,6 +49,8 @@ struct msm_mmu;
 struct msm_rd_state;
 struct msm_perf_state;
 struct msm_gem_submit;
+struct msm_fence_context;
+struct msm_fence_cb;
 
 #define NUM_DOMAINS 2    /* one for KMS, then one per gpu core (?) */
 
@@ -100,9 +102,6 @@ struct msm_drm_private {
 
        struct drm_fb_helper *fbdev;
 
-       uint32_t next_fence, completed_fence;
-       wait_queue_head_t fence_event;
-
        struct msm_rd_state *rd;
        struct msm_perf_state *perf;
 
@@ -110,9 +109,7 @@ struct msm_drm_private {
        struct list_head inactive_list;
 
        struct workqueue_struct *wq;
-
-       /* callbacks deferred until bo is inactive: */
-       struct list_head fence_cbs;
+       struct workqueue_struct *atomic_wq;
 
        /* crtcs pending async atomic updates: */
        uint32_t pending_crtcs;
@@ -157,33 +154,14 @@ struct msm_format {
        uint32_t pixel_format;
 };
 
-/* callback from wq once fence has passed: */
-struct msm_fence_cb {
-       struct work_struct work;
-       uint32_t fence;
-       void (*func)(struct msm_fence_cb *cb);
-};
-
-void __msm_fence_worker(struct work_struct *work);
-
-#define INIT_FENCE_CB(_cb, _func)  do {                     \
-               INIT_WORK(&(_cb)->work, __msm_fence_worker); \
-               (_cb)->func = _func;                         \
-       } while (0)
-
 int msm_atomic_check(struct drm_device *dev,
                     struct drm_atomic_state *state);
 int msm_atomic_commit(struct drm_device *dev,
-               struct drm_atomic_state *state, bool async);
+               struct drm_atomic_state *state, bool nonblock);
 
 int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu);
 
-int msm_wait_fence(struct drm_device *dev, uint32_t fence,
-               ktime_t *timeout, bool interruptible);
-int msm_queue_fence_cb(struct drm_device *dev,
-               struct msm_fence_cb *cb, uint32_t fence);
-void msm_update_fence(struct drm_device *dev, uint32_t fence);
-
+void msm_gem_submit_free(struct msm_gem_submit *submit);
 int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                struct drm_file *file);
 
@@ -213,13 +191,12 @@ int msm_gem_prime_pin(struct drm_gem_object *obj);
 void msm_gem_prime_unpin(struct drm_gem_object *obj);
 void *msm_gem_vaddr_locked(struct drm_gem_object *obj);
 void *msm_gem_vaddr(struct drm_gem_object *obj);
-int msm_gem_queue_inactive_cb(struct drm_gem_object *obj,
-               struct msm_fence_cb *cb);
+int msm_gem_sync_object(struct drm_gem_object *obj,
+               struct msm_fence_context *fctx, bool exclusive);
 void msm_gem_move_to_active(struct drm_gem_object *obj,
-               struct msm_gpu *gpu, bool write, uint32_t fence);
+               struct msm_gpu *gpu, bool exclusive, struct fence *fence);
 void msm_gem_move_to_inactive(struct drm_gem_object *obj);
-int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op,
-               ktime_t *timeout);
+int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout);
 int msm_gem_cpu_fini(struct drm_gem_object *obj);
 void msm_gem_free_object(struct drm_gem_object *obj);
 int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
@@ -227,7 +204,7 @@ int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
 struct drm_gem_object *msm_gem_new(struct drm_device *dev,
                uint32_t size, uint32_t flags);
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
-               uint32_t size, struct sg_table *sgt);
+               struct dma_buf *dmabuf, struct sg_table *sgt);
 
 int msm_framebuffer_prepare(struct drm_framebuffer *fb, int id);
 void msm_framebuffer_cleanup(struct drm_framebuffer *fb, int id);
@@ -303,12 +280,6 @@ u32 msm_readl(const void __iomem *addr);
 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
 #define VERB(fmt, ...) if (0) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
 
-static inline bool fence_completed(struct drm_device *dev, uint32_t fence)
-{
-       struct msm_drm_private *priv = dev->dev_private;
-       return priv->completed_fence >= fence;
-}
-
 static inline int align_pitch(int width, int bpp)
 {
        int bytespp = (bpp + 7) / 8;
@@ -327,5 +298,20 @@ static inline int align_pitch(int width, int bpp)
 /* for conditionally setting boolean flag(s): */
 #define COND(bool, val) ((bool) ? (val) : 0)
 
+static inline unsigned long timeout_to_jiffies(const ktime_t *timeout)
+{
+       ktime_t now = ktime_get();
+       unsigned long remaining_jiffies;
+
+       if (ktime_compare(*timeout, now) < 0) {
+               remaining_jiffies = 0;
+       } else {
+               ktime_t rem = ktime_sub(*timeout, now);
+               struct timespec ts = ktime_to_timespec(rem);
+               remaining_jiffies = timespec_to_jiffies(&ts);
+       }
+
+       return remaining_jiffies;
+}
 
 #endif /* __MSM_DRV_H__ */
index a474d6cf5d9f5d28e5c451cca475f0e7429fc144..461dc8b873f04738cb43c31df0e025a6a89fde7b 100644 (file)
@@ -77,7 +77,7 @@ void msm_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
 
        seq_printf(m, "fb: %dx%d@%4.4s (%2d, ID:%d)\n",
                        fb->width, fb->height, (char *)&fb->pixel_format,
-                       fb->refcount.refcount.counter, fb->base.id);
+                       drm_framebuffer_read_refcount(fb), fb->base.id);
 
        for (i = 0; i < n; i++) {
                seq_printf(m, "   %d: offset=%d pitch=%d, obj: ",
@@ -145,8 +145,7 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
        int ret, i, n = drm_format_num_planes(mode_cmd->pixel_format);
 
        for (i = 0; i < n; i++) {
-               bos[i] = drm_gem_object_lookup(dev, file,
-                               mode_cmd->handles[i]);
+               bos[i] = drm_gem_object_lookup(file, mode_cmd->handles[i]);
                if (!bos[i]) {
                        ret = -ENXIO;
                        goto out_unref;
diff --git a/drivers/gpu/drm/msm/msm_fence.c b/drivers/gpu/drm/msm/msm_fence.c
new file mode 100644 (file)
index 0000000..a9b9b1c
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2013-2016 Red Hat
+ * Author: Rob Clark <robdclark@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/fence.h>
+
+#include "msm_drv.h"
+#include "msm_fence.h"
+
+
+struct msm_fence_context *
+msm_fence_context_alloc(struct drm_device *dev, const char *name)
+{
+       struct msm_fence_context *fctx;
+
+       fctx = kzalloc(sizeof(*fctx), GFP_KERNEL);
+       if (!fctx)
+               return ERR_PTR(-ENOMEM);
+
+       fctx->dev = dev;
+       fctx->name = name;
+       fctx->context = fence_context_alloc(1);
+       init_waitqueue_head(&fctx->event);
+       spin_lock_init(&fctx->spinlock);
+
+       return fctx;
+}
+
+void msm_fence_context_free(struct msm_fence_context *fctx)
+{
+       kfree(fctx);
+}
+
+static inline bool fence_completed(struct msm_fence_context *fctx, uint32_t fence)
+{
+       return (int32_t)(fctx->completed_fence - fence) >= 0;
+}
+
+/* legacy path for WAIT_FENCE ioctl: */
+int msm_wait_fence(struct msm_fence_context *fctx, uint32_t fence,
+               ktime_t *timeout, bool interruptible)
+{
+       int ret;
+
+       if (fence > fctx->last_fence) {
+               DRM_ERROR("%s: waiting on invalid fence: %u (of %u)\n",
+                               fctx->name, fence, fctx->last_fence);
+               return -EINVAL;
+       }
+
+       if (!timeout) {
+               /* no-wait: */
+               ret = fence_completed(fctx, fence) ? 0 : -EBUSY;
+       } else {
+               unsigned long remaining_jiffies = timeout_to_jiffies(timeout);
+
+               if (interruptible)
+                       ret = wait_event_interruptible_timeout(fctx->event,
+                               fence_completed(fctx, fence),
+                               remaining_jiffies);
+               else
+                       ret = wait_event_timeout(fctx->event,
+                               fence_completed(fctx, fence),
+                               remaining_jiffies);
+
+               if (ret == 0) {
+                       DBG("timeout waiting for fence: %u (completed: %u)",
+                                       fence, fctx->completed_fence);
+                       ret = -ETIMEDOUT;
+               } else if (ret != -ERESTARTSYS) {
+                       ret = 0;
+               }
+       }
+
+       return ret;
+}
+
+/* called from workqueue */
+void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence)
+{
+       spin_lock(&fctx->spinlock);
+       fctx->completed_fence = max(fence, fctx->completed_fence);
+       spin_unlock(&fctx->spinlock);
+
+       wake_up_all(&fctx->event);
+}
+
+struct msm_fence {
+       struct msm_fence_context *fctx;
+       struct fence base;
+};
+
+static inline struct msm_fence *to_msm_fence(struct fence *fence)
+{
+       return container_of(fence, struct msm_fence, base);
+}
+
+static const char *msm_fence_get_driver_name(struct fence *fence)
+{
+       return "msm";
+}
+
+static const char *msm_fence_get_timeline_name(struct fence *fence)
+{
+       struct msm_fence *f = to_msm_fence(fence);
+       return f->fctx->name;
+}
+
+static bool msm_fence_enable_signaling(struct fence *fence)
+{
+       return true;
+}
+
+static bool msm_fence_signaled(struct fence *fence)
+{
+       struct msm_fence *f = to_msm_fence(fence);
+       return fence_completed(f->fctx, f->base.seqno);
+}
+
+static void msm_fence_release(struct fence *fence)
+{
+       struct msm_fence *f = to_msm_fence(fence);
+       kfree_rcu(f, base.rcu);
+}
+
+static const struct fence_ops msm_fence_ops = {
+       .get_driver_name = msm_fence_get_driver_name,
+       .get_timeline_name = msm_fence_get_timeline_name,
+       .enable_signaling = msm_fence_enable_signaling,
+       .signaled = msm_fence_signaled,
+       .wait = fence_default_wait,
+       .release = msm_fence_release,
+};
+
+struct fence *
+msm_fence_alloc(struct msm_fence_context *fctx)
+{
+       struct msm_fence *f;
+
+       f = kzalloc(sizeof(*f), GFP_KERNEL);
+       if (!f)
+               return ERR_PTR(-ENOMEM);
+
+       f->fctx = fctx;
+
+       fence_init(&f->base, &msm_fence_ops, &fctx->spinlock,
+                       fctx->context, ++fctx->last_fence);
+
+       return &f->base;
+}
diff --git a/drivers/gpu/drm/msm/msm_fence.h b/drivers/gpu/drm/msm/msm_fence.h
new file mode 100644 (file)
index 0000000..ceb5b3d
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013-2016 Red Hat
+ * Author: Rob Clark <robdclark@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MSM_FENCE_H__
+#define __MSM_FENCE_H__
+
+#include "msm_drv.h"
+
+struct msm_fence_context {
+       struct drm_device *dev;
+       const char *name;
+       unsigned context;
+       /* last_fence == completed_fence --> no pending work */
+       uint32_t last_fence;          /* last assigned fence */
+       uint32_t completed_fence;     /* last completed fence */
+       wait_queue_head_t event;
+       spinlock_t spinlock;
+};
+
+struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev,
+               const char *name);
+void msm_fence_context_free(struct msm_fence_context *fctx);
+
+int msm_wait_fence(struct msm_fence_context *fctx, uint32_t fence,
+               ktime_t *timeout, bool interruptible);
+int msm_queue_fence_cb(struct msm_fence_context *fctx,
+               struct msm_fence_cb *cb, uint32_t fence);
+void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence);
+
+struct fence * msm_fence_alloc(struct msm_fence_context *fctx);
+
+#endif
index 3cedb8d5c855ac26c3e775db521ab48ddf42fb39..7daf4054dd2b78ea634641bf4554fa6cb3d3a444 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/pfn_t.h>
 
 #include "msm_drv.h"
+#include "msm_fence.h"
 #include "msm_gem.h"
 #include "msm_gpu.h"
 #include "msm_mmu.h"
@@ -373,7 +374,7 @@ int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
        int ret = 0;
 
        /* GEM does all our handle to object mapping */
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL) {
                ret = -ENOENT;
                goto fail;
@@ -410,27 +411,62 @@ void *msm_gem_vaddr(struct drm_gem_object *obj)
        return ret;
 }
 
-/* setup callback for when bo is no longer busy..
- * TODO probably want to differentiate read vs write..
- */
-int msm_gem_queue_inactive_cb(struct drm_gem_object *obj,
-               struct msm_fence_cb *cb)
+/* must be called before _move_to_active().. */
+int msm_gem_sync_object(struct drm_gem_object *obj,
+               struct msm_fence_context *fctx, bool exclusive)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       uint32_t fence = msm_gem_fence(msm_obj,
-                       MSM_PREP_READ | MSM_PREP_WRITE);
-       return msm_queue_fence_cb(obj->dev, cb, fence);
+       struct reservation_object_list *fobj;
+       struct fence *fence;
+       int i, ret;
+
+       if (!exclusive) {
+               /* NOTE: _reserve_shared() must happen before _add_shared_fence(),
+                * which makes this a slightly strange place to call it.  OTOH this
+                * is a convenient can-fail point to hook it in.  (And similar to
+                * how etnaviv and nouveau handle this.)
+                */
+               ret = reservation_object_reserve_shared(msm_obj->resv);
+               if (ret)
+                       return ret;
+       }
+
+       fobj = reservation_object_get_list(msm_obj->resv);
+       if (!fobj || (fobj->shared_count == 0)) {
+               fence = reservation_object_get_excl(msm_obj->resv);
+               /* don't need to wait on our own fences, since ring is fifo */
+               if (fence && (fence->context != fctx->context)) {
+                       ret = fence_wait(fence, true);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       if (!exclusive || !fobj)
+               return 0;
+
+       for (i = 0; i < fobj->shared_count; i++) {
+               fence = rcu_dereference_protected(fobj->shared[i],
+                                               reservation_object_held(msm_obj->resv));
+               if (fence->context != fctx->context) {
+                       ret = fence_wait(fence, true);
+                       if (ret)
+                               return ret;
+               }
+       }
+
+       return 0;
 }
 
 void msm_gem_move_to_active(struct drm_gem_object *obj,
-               struct msm_gpu *gpu, bool write, uint32_t fence)
+               struct msm_gpu *gpu, bool exclusive, struct fence *fence)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
        msm_obj->gpu = gpu;
-       if (write)
-               msm_obj->write_fence = fence;
+       if (exclusive)
+               reservation_object_add_excl_fence(msm_obj->resv, fence);
        else
-               msm_obj->read_fence = fence;
+               reservation_object_add_shared_fence(msm_obj->resv, fence);
        list_del_init(&msm_obj->mm_list);
        list_add_tail(&msm_obj->mm_list, &gpu->active_list);
 }
@@ -444,30 +480,30 @@ void msm_gem_move_to_inactive(struct drm_gem_object *obj)
        WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 
        msm_obj->gpu = NULL;
-       msm_obj->read_fence = 0;
-       msm_obj->write_fence = 0;
        list_del_init(&msm_obj->mm_list);
        list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
 }
 
 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)
 {
-       struct drm_device *dev = obj->dev;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       int ret = 0;
+       bool write = !!(op & MSM_PREP_WRITE);
 
-       if (is_active(msm_obj)) {
-               uint32_t fence = msm_gem_fence(msm_obj, op);
-
-               if (op & MSM_PREP_NOSYNC)
-                       timeout = NULL;
+       if (op & MSM_PREP_NOSYNC) {
+               if (!reservation_object_test_signaled_rcu(msm_obj->resv, write))
+                       return -EBUSY;
+       } else {
+               int ret;
 
-               ret = msm_wait_fence(dev, fence, timeout, true);
+               ret = reservation_object_wait_timeout_rcu(msm_obj->resv, write,
+                               true, timeout_to_jiffies(timeout));
+               if (ret <= 0)
+                       return ret == 0 ? -ETIMEDOUT : ret;
        }
 
        /* TODO cache maintenance */
 
-       return ret;
+       return 0;
 }
 
 int msm_gem_cpu_fini(struct drm_gem_object *obj)
@@ -477,18 +513,46 @@ int msm_gem_cpu_fini(struct drm_gem_object *obj)
 }
 
 #ifdef CONFIG_DEBUG_FS
+static void describe_fence(struct fence *fence, const char *type,
+               struct seq_file *m)
+{
+       if (!fence_is_signaled(fence))
+               seq_printf(m, "\t%9s: %s %s seq %u\n", type,
+                               fence->ops->get_driver_name(fence),
+                               fence->ops->get_timeline_name(fence),
+                               fence->seqno);
+}
+
 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
 {
-       struct drm_device *dev = obj->dev;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
+       struct reservation_object *robj = msm_obj->resv;
+       struct reservation_object_list *fobj;
+       struct fence *fence;
        uint64_t off = drm_vma_node_start(&obj->vma_node);
 
-       WARN_ON(!mutex_is_locked(&dev->struct_mutex));
-       seq_printf(m, "%08x: %c(r=%u,w=%u) %2d (%2d) %08llx %p %zu\n",
+       WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
+
+       seq_printf(m, "%08x: %c %2d (%2d) %08llx %p %zu\n",
                        msm_obj->flags, is_active(msm_obj) ? 'A' : 'I',
-                       msm_obj->read_fence, msm_obj->write_fence,
                        obj->name, obj->refcount.refcount.counter,
                        off, msm_obj->vaddr, obj->size);
+
+       rcu_read_lock();
+       fobj = rcu_dereference(robj->fence);
+       if (fobj) {
+               unsigned int i, shared_count = fobj->shared_count;
+
+               for (i = 0; i < shared_count; i++) {
+                       fence = rcu_dereference(fobj->shared[i]);
+                       describe_fence(fence, "Shared", m);
+               }
+       }
+
+       fence = rcu_dereference(robj->fence_excl);
+       if (fence)
+               describe_fence(fence, "Exclusive", m);
+       rcu_read_unlock();
 }
 
 void msm_gem_describe_objects(struct list_head *list, struct seq_file *m)
@@ -583,6 +647,7 @@ int msm_gem_new_handle(struct drm_device *dev, struct drm_file *file,
 
 static int msm_gem_new_impl(struct drm_device *dev,
                uint32_t size, uint32_t flags,
+               struct reservation_object *resv,
                struct drm_gem_object **obj)
 {
        struct msm_drm_private *priv = dev->dev_private;
@@ -622,8 +687,12 @@ static int msm_gem_new_impl(struct drm_device *dev,
 
        msm_obj->flags = flags;
 
-       msm_obj->resv = &msm_obj->_resv;
-       reservation_object_init(msm_obj->resv);
+       if (resv) {
+               msm_obj->resv = resv;
+       } else {
+               msm_obj->resv = &msm_obj->_resv;
+               reservation_object_init(msm_obj->resv);
+       }
 
        INIT_LIST_HEAD(&msm_obj->submit_entry);
        list_add_tail(&msm_obj->mm_list, &priv->inactive_list);
@@ -643,7 +712,7 @@ struct drm_gem_object *msm_gem_new(struct drm_device *dev,
 
        size = PAGE_ALIGN(size);
 
-       ret = msm_gem_new_impl(dev, size, flags, &obj);
+       ret = msm_gem_new_impl(dev, size, flags, NULL, &obj);
        if (ret)
                goto fail;
 
@@ -665,10 +734,11 @@ fail:
 }
 
 struct drm_gem_object *msm_gem_import(struct drm_device *dev,
-               uint32_t size, struct sg_table *sgt)
+               struct dma_buf *dmabuf, struct sg_table *sgt)
 {
        struct msm_gem_object *msm_obj;
        struct drm_gem_object *obj;
+       uint32_t size;
        int ret, npages;
 
        /* if we don't have IOMMU, don't bother pretending we can import: */
@@ -677,9 +747,9 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
                return ERR_PTR(-EINVAL);
        }
 
-       size = PAGE_ALIGN(size);
+       size = PAGE_ALIGN(dmabuf->size);
 
-       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj);
+       ret = msm_gem_new_impl(dev, size, MSM_BO_WC, dmabuf->resv, &obj);
        if (ret)
                goto fail;
 
index 6fc59bfeedeb52cb06a2518d53912f5f215a3437..9facd4b6ffd9366a5a8105bf4a0c3d33f4a439f8 100644 (file)
@@ -39,7 +39,6 @@ struct msm_gem_object {
         */
        struct list_head mm_list;
        struct msm_gpu *gpu;     /* non-null if active */
-       uint32_t read_fence, write_fence;
 
        /* Transiently in the process of submit ioctl, objects associated
         * with the submit are on submit->bo_list.. this only lasts for
@@ -73,19 +72,6 @@ static inline bool is_active(struct msm_gem_object *msm_obj)
        return msm_obj->gpu != NULL;
 }
 
-static inline uint32_t msm_gem_fence(struct msm_gem_object *msm_obj,
-               uint32_t op)
-{
-       uint32_t fence = 0;
-
-       if (op & MSM_PREP_READ)
-               fence = msm_obj->write_fence;
-       if (op & MSM_PREP_WRITE)
-               fence = max(fence, msm_obj->read_fence);
-
-       return fence;
-}
-
 #define MAX_CMDS 4
 
 /* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,
@@ -99,8 +85,9 @@ struct msm_gem_submit {
        struct list_head node;   /* node in gpu submit_list */
        struct list_head bo_list;
        struct ww_acquire_ctx ticket;
-       uint32_t fence;
-       bool valid;
+       struct fence *fence;
+       struct pid *pid;    /* submitting process */
+       bool valid;         /* true if no cmdstream patching needed */
        unsigned int nr_cmds;
        unsigned int nr_bos;
        struct {
index 121975b07cd4196a0372bbbe8e2bfb2913790a58..6b90890faffec93f8586b5f2a1e251338d2a3102 100644 (file)
@@ -55,7 +55,7 @@ int msm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
 struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev,
                struct dma_buf_attachment *attach, struct sg_table *sg)
 {
-       return msm_gem_import(dev, attach->dmabuf->size, sg);
+       return msm_gem_import(dev, attach->dmabuf, sg);
 }
 
 int msm_gem_prime_pin(struct drm_gem_object *obj)
index 23d25283616cb3dbd62e3e072fa2ffab2a4a9933..b89ca5174863e7ab73c48117605ded1d56626e19 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 /* make sure these don't conflict w/ MSM_SUBMIT_BO_x */
-#define BO_VALID    0x8000
+#define BO_VALID    0x8000   /* is current addr in cmdstream correct/valid? */
 #define BO_LOCKED   0x4000
 #define BO_PINNED   0x2000
 
@@ -35,21 +35,31 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
        int sz = sizeof(*submit) + (nr * sizeof(submit->bos[0]));
 
        submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY);
-       if (submit) {
-               submit->dev = dev;
-               submit->gpu = gpu;
+       if (!submit)
+               return NULL;
 
-               /* initially, until copy_from_user() and bo lookup succeeds: */
-               submit->nr_bos = 0;
-               submit->nr_cmds = 0;
+       submit->dev = dev;
+       submit->gpu = gpu;
+       submit->pid = get_pid(task_pid(current));
 
-               INIT_LIST_HEAD(&submit->bo_list);
-               ww_acquire_init(&submit->ticket, &reservation_ww_class);
-       }
+       /* initially, until copy_from_user() and bo lookup succeeds: */
+       submit->nr_bos = 0;
+       submit->nr_cmds = 0;
+
+       INIT_LIST_HEAD(&submit->bo_list);
+       ww_acquire_init(&submit->ticket, &reservation_ww_class);
 
        return submit;
 }
 
+void msm_gem_submit_free(struct msm_gem_submit *submit)
+{
+       fence_put(submit->fence);
+       list_del(&submit->node);
+       put_pid(submit->pid);
+       kfree(submit);
+}
+
 static int submit_lookup_objects(struct msm_gem_submit *submit,
                struct drm_msm_gem_submit *args, struct drm_file *file)
 {
@@ -131,16 +141,13 @@ static void submit_unlock_unpin_bo(struct msm_gem_submit *submit, int i)
 }
 
 /* This is where we make sure all the bo's are reserved and pin'd: */
-static int submit_validate_objects(struct msm_gem_submit *submit)
+static int submit_lock_objects(struct msm_gem_submit *submit)
 {
        int contended, slow_locked = -1, i, ret = 0;
 
 retry:
-       submit->valid = true;
-
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
-               uint32_t iova;
 
                if (slow_locked == i)
                        slow_locked = -1;
@@ -154,30 +161,6 @@ retry:
                                goto fail;
                        submit->bos[i].flags |= BO_LOCKED;
                }
-
-
-               /* if locking succeeded, pin bo: */
-               ret = msm_gem_get_iova_locked(&msm_obj->base,
-                               submit->gpu->id, &iova);
-
-               /* this would break the logic in the fail path.. there is no
-                * reason for this to happen, but just to be on the safe side
-                * let's notice if this starts happening in the future:
-                */
-               WARN_ON(ret == -EDEADLK);
-
-               if (ret)
-                       goto fail;
-
-               submit->bos[i].flags |= BO_PINNED;
-
-               if (iova == submit->bos[i].iova) {
-                       submit->bos[i].flags |= BO_VALID;
-               } else {
-                       submit->bos[i].iova = iova;
-                       submit->bos[i].flags &= ~BO_VALID;
-                       submit->valid = false;
-               }
        }
 
        ww_acquire_done(&submit->ticket);
@@ -206,6 +189,54 @@ fail:
        return ret;
 }
 
+static int submit_fence_sync(struct msm_gem_submit *submit)
+{
+       int i, ret = 0;
+
+       for (i = 0; i < submit->nr_bos; i++) {
+               struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               bool write = submit->bos[i].flags & MSM_SUBMIT_BO_WRITE;
+
+               ret = msm_gem_sync_object(&msm_obj->base, submit->gpu->fctx, write);
+               if (ret)
+                       break;
+       }
+
+       return ret;
+}
+
+static int submit_pin_objects(struct msm_gem_submit *submit)
+{
+       int i, ret = 0;
+
+       submit->valid = true;
+
+       for (i = 0; i < submit->nr_bos; i++) {
+               struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               uint32_t iova;
+
+               /* if locking succeeded, pin bo: */
+               ret = msm_gem_get_iova_locked(&msm_obj->base,
+                               submit->gpu->id, &iova);
+
+               if (ret)
+                       break;
+
+               submit->bos[i].flags |= BO_PINNED;
+
+               if (iova == submit->bos[i].iova) {
+                       submit->bos[i].flags |= BO_VALID;
+               } else {
+                       submit->bos[i].iova = iova;
+                       /* iova changed, so address in cmdstream is not valid: */
+                       submit->bos[i].flags &= ~BO_VALID;
+                       submit->valid = false;
+               }
+       }
+
+       return ret;
+}
+
 static int submit_bo(struct msm_gem_submit *submit, uint32_t idx,
                struct msm_gem_object **obj, uint32_t *iova, bool *valid)
 {
@@ -297,7 +328,7 @@ static int submit_reloc(struct msm_gem_submit *submit, struct msm_gem_object *ob
        return 0;
 }
 
-static void submit_cleanup(struct msm_gem_submit *submit, bool fail)
+static void submit_cleanup(struct msm_gem_submit *submit)
 {
        unsigned i;
 
@@ -344,7 +375,15 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        if (ret)
                goto out;
 
-       ret = submit_validate_objects(submit);
+       ret = submit_lock_objects(submit);
+       if (ret)
+               goto out;
+
+       ret = submit_fence_sync(submit);
+       if (ret)
+               goto out;
+
+       ret = submit_pin_objects(submit);
        if (ret)
                goto out;
 
@@ -410,10 +449,12 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 
        ret = msm_gpu_submit(gpu, submit, ctx);
 
-       args->fence = submit->fence;
+       args->fence = submit->fence->seqno;
 
 out:
-       submit_cleanup(submit, !!ret);
+       submit_cleanup(submit);
+       if (ret)
+               msm_gem_submit_free(submit);
        mutex_unlock(&dev->struct_mutex);
        return ret;
 }
index 6b02ada6579a737d36f6ad7403ad53519ee7e0f7..36ed53e661fe81f86a403a3ff30ee895983510ac 100644 (file)
@@ -18,6 +18,7 @@
 #include "msm_gpu.h"
 #include "msm_gem.h"
 #include "msm_mmu.h"
+#include "msm_fence.h"
 
 
 /*
@@ -265,22 +266,38 @@ static void inactive_start(struct msm_gpu *gpu)
  * Hangcheck detection for locked gpu:
  */
 
-static void retire_submits(struct msm_gpu *gpu, uint32_t fence);
+static void retire_submits(struct msm_gpu *gpu);
 
 static void recover_worker(struct work_struct *work)
 {
        struct msm_gpu *gpu = container_of(work, struct msm_gpu, recover_work);
        struct drm_device *dev = gpu->dev;
+       struct msm_gem_submit *submit;
+       uint32_t fence = gpu->funcs->last_fence(gpu);
 
-       dev_err(dev->dev, "%s: hangcheck recover!\n", gpu->name);
+       msm_update_fence(gpu->fctx, fence + 1);
 
        mutex_lock(&dev->struct_mutex);
-       if (msm_gpu_active(gpu)) {
-               struct msm_gem_submit *submit;
-               uint32_t fence = gpu->funcs->last_fence(gpu);
 
+       dev_err(dev->dev, "%s: hangcheck recover!\n", gpu->name);
+       list_for_each_entry(submit, &gpu->submit_list, node) {
+               if (submit->fence->seqno == (fence + 1)) {
+                       struct task_struct *task;
+
+                       rcu_read_lock();
+                       task = pid_task(submit->pid, PIDTYPE_PID);
+                       if (task) {
+                               dev_err(dev->dev, "%s: offending task: %s\n",
+                                               gpu->name, task->comm);
+                       }
+                       rcu_read_unlock();
+                       break;
+               }
+       }
+
+       if (msm_gpu_active(gpu)) {
                /* retire completed submits, plus the one that hung: */
-               retire_submits(gpu, fence + 1);
+               retire_submits(gpu);
 
                inactive_cancel(gpu);
                gpu->funcs->recover(gpu);
@@ -290,6 +307,7 @@ static void recover_worker(struct work_struct *work)
                        gpu->funcs->submit(gpu, submit, NULL);
                }
        }
+
        mutex_unlock(&dev->struct_mutex);
 
        msm_gpu_retire(gpu);
@@ -312,7 +330,7 @@ static void hangcheck_handler(unsigned long data)
        if (fence != gpu->hangcheck_fence) {
                /* some progress has been made.. ya! */
                gpu->hangcheck_fence = fence;
-       } else if (fence < gpu->submitted_fence) {
+       } else if (fence < gpu->fctx->last_fence) {
                /* no progress and not done.. hung! */
                gpu->hangcheck_fence = fence;
                dev_err(dev->dev, "%s: hangcheck detected gpu lockup!\n",
@@ -320,12 +338,12 @@ static void hangcheck_handler(unsigned long data)
                dev_err(dev->dev, "%s:     completed fence: %u\n",
                                gpu->name, fence);
                dev_err(dev->dev, "%s:     submitted fence: %u\n",
-                               gpu->name, gpu->submitted_fence);
+                               gpu->name, gpu->fctx->last_fence);
                queue_work(priv->wq, &gpu->recover_work);
        }
 
        /* if still more pending work, reset the hangcheck timer: */
-       if (gpu->submitted_fence > gpu->hangcheck_fence)
+       if (gpu->fctx->last_fence > gpu->hangcheck_fence)
                hangcheck_timer_reset(gpu);
 
        /* workaround for missing irq: */
@@ -431,7 +449,22 @@ out:
  * Cmdstream submission/retirement:
  */
 
-static void retire_submits(struct msm_gpu *gpu, uint32_t fence)
+static void retire_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
+{
+       int i;
+
+       for (i = 0; i < submit->nr_bos; i++) {
+               struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               /* move to inactive: */
+               msm_gem_move_to_inactive(&msm_obj->base);
+               msm_gem_put_iova(&msm_obj->base, gpu->id);
+               drm_gem_object_unreference(&msm_obj->base);
+       }
+
+       msm_gem_submit_free(submit);
+}
+
+static void retire_submits(struct msm_gpu *gpu)
 {
        struct drm_device *dev = gpu->dev;
 
@@ -443,9 +476,8 @@ static void retire_submits(struct msm_gpu *gpu, uint32_t fence)
                submit = list_first_entry(&gpu->submit_list,
                                struct msm_gem_submit, node);
 
-               if (submit->fence <= fence) {
-                       list_del(&submit->node);
-                       kfree(submit);
+               if (fence_is_signaled(submit->fence)) {
+                       retire_submit(gpu, submit);
                } else {
                        break;
                }
@@ -458,29 +490,10 @@ static void retire_worker(struct work_struct *work)
        struct drm_device *dev = gpu->dev;
        uint32_t fence = gpu->funcs->last_fence(gpu);
 
-       msm_update_fence(gpu->dev, fence);
+       msm_update_fence(gpu->fctx, fence);
 
        mutex_lock(&dev->struct_mutex);
-
-       retire_submits(gpu, fence);
-
-       while (!list_empty(&gpu->active_list)) {
-               struct msm_gem_object *obj;
-
-               obj = list_first_entry(&gpu->active_list,
-                               struct msm_gem_object, mm_list);
-
-               if ((obj->read_fence <= fence) &&
-                               (obj->write_fence <= fence)) {
-                       /* move to inactive: */
-                       msm_gem_move_to_inactive(&obj->base);
-                       msm_gem_put_iova(&obj->base, gpu->id);
-                       drm_gem_object_unreference(&obj->base);
-               } else {
-                       break;
-               }
-       }
-
+       retire_submits(gpu);
        mutex_unlock(&dev->struct_mutex);
 
        if (!msm_gpu_active(gpu))
@@ -505,9 +518,12 @@ int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
 
        WARN_ON(!mutex_is_locked(&dev->struct_mutex));
 
-       submit->fence = ++priv->next_fence;
-
-       gpu->submitted_fence = submit->fence;
+       submit->fence = msm_fence_alloc(gpu->fctx);
+       if (IS_ERR(submit->fence)) {
+               ret = PTR_ERR(submit->fence);
+               submit->fence = NULL;
+               return ret;
+       }
 
        inactive_cancel(gpu);
 
@@ -515,40 +531,34 @@ int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
 
        msm_rd_dump_submit(submit);
 
-       gpu->submitted_fence = submit->fence;
-
        update_sw_cntrs(gpu);
 
        for (i = 0; i < submit->nr_bos; i++) {
                struct msm_gem_object *msm_obj = submit->bos[i].obj;
+               uint32_t iova;
 
                /* can't happen yet.. but when we add 2d support we'll have
                 * to deal w/ cross-ring synchronization:
                 */
                WARN_ON(is_active(msm_obj) && (msm_obj->gpu != gpu));
 
-               if (!is_active(msm_obj)) {
-                       uint32_t iova;
-
-                       /* ring takes a reference to the bo and iova: */
-                       drm_gem_object_reference(&msm_obj->base);
-                       msm_gem_get_iova_locked(&msm_obj->base,
-                                       submit->gpu->id, &iova);
-               }
-
-               if (submit->bos[i].flags & MSM_SUBMIT_BO_READ)
-                       msm_gem_move_to_active(&msm_obj->base, gpu, false, submit->fence);
+               /* submit takes a reference to the bo and iova until retired: */
+               drm_gem_object_reference(&msm_obj->base);
+               msm_gem_get_iova_locked(&msm_obj->base,
+                               submit->gpu->id, &iova);
 
                if (submit->bos[i].flags & MSM_SUBMIT_BO_WRITE)
                        msm_gem_move_to_active(&msm_obj->base, gpu, true, submit->fence);
+               else if (submit->bos[i].flags & MSM_SUBMIT_BO_READ)
+                       msm_gem_move_to_active(&msm_obj->base, gpu, false, submit->fence);
        }
 
-       ret = gpu->funcs->submit(gpu, submit, ctx);
+       gpu->funcs->submit(gpu, submit, ctx);
        priv->lastctx = ctx;
 
        hangcheck_timer_reset(gpu);
 
-       return ret;
+       return 0;
 }
 
 /*
@@ -580,6 +590,12 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,
        gpu->funcs = funcs;
        gpu->name = name;
        gpu->inactive = true;
+       gpu->fctx = msm_fence_context_alloc(drm, name);
+       if (IS_ERR(gpu->fctx)) {
+               ret = PTR_ERR(gpu->fctx);
+               gpu->fctx = NULL;
+               goto fail;
+       }
 
        INIT_LIST_HEAD(&gpu->active_list);
        INIT_WORK(&gpu->retire_work, retire_worker);
@@ -700,4 +716,7 @@ void msm_gpu_cleanup(struct msm_gpu *gpu)
 
        if (gpu->mmu)
                gpu->mmu->funcs->destroy(gpu->mmu);
+
+       if (gpu->fctx)
+               msm_fence_context_free(gpu->fctx);
 }
index 2bbe85a3d6f60efe3e40afb83afa7c0d65aeadaf..c9022837a1a47d0674150f04187b3a493ee7c15c 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/regulator/consumer.h>
 
 #include "msm_drv.h"
+#include "msm_fence.h"
 #include "msm_ringbuffer.h"
 
 struct msm_gem_submit;
@@ -46,7 +47,7 @@ struct msm_gpu_funcs {
        int (*hw_init)(struct msm_gpu *gpu);
        int (*pm_suspend)(struct msm_gpu *gpu);
        int (*pm_resume)(struct msm_gpu *gpu);
-       int (*submit)(struct msm_gpu *gpu, struct msm_gem_submit *submit,
+       void (*submit)(struct msm_gpu *gpu, struct msm_gem_submit *submit,
                        struct msm_file_private *ctx);
        void (*flush)(struct msm_gpu *gpu);
        void (*idle)(struct msm_gpu *gpu);
@@ -77,13 +78,15 @@ struct msm_gpu {
        const struct msm_gpu_perfcntr *perfcntrs;
        uint32_t num_perfcntrs;
 
+       /* ringbuffer: */
        struct msm_ringbuffer *rb;
        uint32_t rb_iova;
 
        /* list of GEM active objects: */
        struct list_head active_list;
 
-       uint32_t submitted_fence;
+       /* fencing: */
+       struct msm_fence_context *fctx;
 
        /* is gpu powered/active? */
        int active_cnt;
@@ -125,7 +128,7 @@ struct msm_gpu {
 
 static inline bool msm_gpu_active(struct msm_gpu *gpu)
 {
-       return gpu->submitted_fence > gpu->funcs->last_fence(gpu);
+       return gpu->fctx->last_fence > gpu->funcs->last_fence(gpu);
 }
 
 /* Perf-Counters:
index 9a78c48817c6a46e7baf181a87cd737d88abdd70..b48f73ac63896a087938ae6225836a5d30d1a482 100644 (file)
@@ -296,7 +296,7 @@ void msm_rd_dump_submit(struct msm_gem_submit *submit)
 
        n = snprintf(msg, sizeof(msg), "%.*s/%d: fence=%u",
                        TASK_COMM_LEN, current->comm, task_pid_nr(current),
-                       submit->fence);
+                       submit->fence->seqno);
 
        rd_write_section(rd, RD_CMD, msg, ALIGN(n, 4));
 
index 82bd4658aa588f4c41d1b10aa8ae605580ecaf88..a555681c30961f50a5157cd2d926a583304abb76 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <drm/drmP.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "hw.h"
 
index 55ccbf006b5e5ced72409f5863f3bf074d8494e3..6f318c54da3347577555b6a636d7132214d4be6d 100644 (file)
@@ -28,8 +28,9 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_plane_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
+#include "nouveau_ttm.h"
 #include "nouveau_bo.h"
 #include "nouveau_gem.h"
 #include "nouveau_encoder.h"
@@ -995,7 +996,7 @@ nv04_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
        if (width != 64 || height != 64)
                return -EINVAL;
 
-       gem = drm_gem_object_lookup(dev, file_priv, buffer_handle);
+       gem = drm_gem_object_lookup(file_priv, buffer_handle);
        if (!gem)
                return -ENOENT;
        cursor = nouveau_gem_object(gem);
index 4e61173c3353e068b6309838078c2b5c26ed4520..c83116a308a4583485c1e550bc43d0fc627decfb 100644 (file)
@@ -1,6 +1,6 @@
 #include <drm/drmP.h>
 #include <drm/drm_mode.h>
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "nouveau_crtc.h"
 #include "hw.h"
index b48eec395f0746a9e6ab33a6428b2a4b21ab7158..b6cc7766e6f76364bad7324ee70d5171d89e639d 100644 (file)
@@ -27,7 +27,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_encoder.h"
 #include "nouveau_connector.h"
 #include "nouveau_crtc.h"
index 05bfd151d1d8000c37f16d372020a389df79249b..c2947ef7d4fcefe54c574c28f7013d4496f5e2fd 100644 (file)
@@ -27,7 +27,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "nouveau_encoder.h"
 #include "nouveau_connector.h"
index b4a6bc433ef5a4b524cb72f00992da92ebe47c20..aea81a547e8514621ac9aaaa05f402fbe39f3233 100644 (file)
@@ -25,7 +25,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "hw.h"
 #include "nouveau_encoder.h"
index 6c9a1e89810febf010375c0129a6b12d90ea3f93..7030307d2d48b59384fbe0376c18dad33a6ed318 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef __NV04_DISPLAY_H__
 #define __NV04_DISPLAY_H__
-
+#include <subdev/bios.h>
 #include <subdev/bios/pll.h>
 
 #include "nouveau_display.h"
index 956a833b82005be4410d7a96618b710cfaa446eb..74856a8b8f35943b08a59f8aed5a546e98058d3c 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 #include <drm/drmP.h>
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "hw.h"
 
 #include <subdev/bios/pll.h>
index aeebdd402478b9fb4f0ed4576425d136075e87b0..ec444eac6258c75124a4565ef22d0772d8cbd968 100644 (file)
@@ -27,7 +27,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_fourcc.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 
 #include "nouveau_bo.h"
 #include "nouveau_connector.h"
index 903c473d266ff5d32d71059abb6406bface455f0..2b83b2c39d1ddfb838fa90652917f6b7e11ce079 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_encoder.h"
 #include "nouveau_crtc.h"
 #include "hw.h"
index 54e9fb9eb5c06b36f9b709a8543d6757951cc419..477a8d072af4b6fd06b1c7a819214fc37da4a156 100644 (file)
@@ -25,7 +25,7 @@
  */
 
 #include <drm/drmP.h>
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "nouveau_encoder.h"
 #include "nouveau_connector.h"
index 163317d26de9bc866a6305dc2e963e4cffa6f242..a665b78b2af5ee6f3ecef85883586061b1161c3c 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "nouveau_encoder.h"
 #include "nouveau_connector.h"
index 4993a863adb9eb0f84eadbc979a174b0975d0b09..c612dc1f1eb4ef651faa4ec398904a894b0ac814 100644 (file)
@@ -7,6 +7,7 @@ enum nvkm_devidx {
        NVKM_SUBDEV_PCI,
        NVKM_SUBDEV_VBIOS,
        NVKM_SUBDEV_DEVINIT,
+       NVKM_SUBDEV_TOP,
        NVKM_SUBDEV_IBUS,
        NVKM_SUBDEV_GPIO,
        NVKM_SUBDEV_I2C,
@@ -131,6 +132,7 @@ struct nvkm_device {
        struct nvkm_secboot *secboot;
        struct nvkm_therm *therm;
        struct nvkm_timer *timer;
+       struct nvkm_top *top;
        struct nvkm_volt *volt;
 
        struct nvkm_engine *bsp;
@@ -200,6 +202,7 @@ struct nvkm_device_chip {
        int (*secboot )(struct nvkm_device *, int idx, struct nvkm_secboot **);
        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 **);
index 48bf128456a16ba90e036e246902bbba3e6db36c..9ebfd8782366005ec54ea2536848b1cf4650f14f 100644 (file)
@@ -38,11 +38,9 @@ struct nvkm_engine_func {
 };
 
 int nvkm_engine_ctor(const struct nvkm_engine_func *, struct nvkm_device *,
-                    int index, u32 pmc_enable, bool enable,
-                    struct nvkm_engine *);
+                    int index, bool enable, struct nvkm_engine *);
 int nvkm_engine_new_(const struct nvkm_engine_func *, struct nvkm_device *,
-                    int index, u32 pmc_enable, bool enable,
-                    struct nvkm_engine **);
+                    int index, 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 3b5dc9c6306916f608882997d1fefd8dc50659cc..57adefa8b08ef44337c0e62335d448a4799c926f 100644 (file)
@@ -6,7 +6,6 @@ struct nvkm_subdev {
        const struct nvkm_subdev_func *func;
        struct nvkm_device *device;
        enum nvkm_devidx index;
-       u32 pmc_enable;
        struct mutex mutex;
        u32 debug;
 
@@ -24,7 +23,7 @@ struct nvkm_subdev_func {
 
 extern const char *nvkm_subdev_name[NVKM_SUBDEV_NR];
 void nvkm_subdev_ctor(const struct nvkm_subdev_func *, struct nvkm_device *,
-                     int index, u32 pmc_enable, struct nvkm_subdev *);
+                     int index, struct nvkm_subdev *);
 void nvkm_subdev_del(struct nvkm_subdev **);
 int  nvkm_subdev_preinit(struct nvkm_subdev *);
 int  nvkm_subdev_init(struct nvkm_subdev *);
index 81c0bc66a9f8394b7c4f967769bcec503827f241..e6baf039c269dfb36c128ae0f60c5a70afc16be9 100644 (file)
@@ -40,7 +40,6 @@ struct nvkm_falcon_func {
                u32 *data;
                u32  size;
        } data;
-       u32 pmc_enable;
        void (*init)(struct nvkm_falcon *);
        void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *);
        struct nvkm_sclass sclass[];
index 3128d21a5d1a6409acbbbbdfd16b09551055bfdf..b1fcc416732f9366b4facb092615fc0839cfe0b7 100644 (file)
@@ -15,7 +15,6 @@ int nvkm_xtensa_new_(const struct nvkm_xtensa_func *, struct nvkm_device *,
                     int index, bool enable, u32 addr, struct nvkm_engine **);
 
 struct nvkm_xtensa_func {
-       u32 pmc_enable;
        u32 fifo_val;
        u32 unkd28;
        struct nvkm_sclass sclass[];
index 193626c69517512ff24bce801a94f5b757263c0c..709d786f180867fae521dfe2134234ddcbda0cce 100644 (file)
@@ -7,6 +7,7 @@ struct nvkm_devinit {
        const struct nvkm_devinit_func *func;
        struct nvkm_subdev subdev;
        bool post;
+       bool force_post;
 };
 
 u32 nvkm_devinit_mmio(struct nvkm_devinit *, u32 addr);
index 85ab72c7f821eff59e9021cc88d42cf4e63bc1a6..0a734fd06acf347aeee52368ee159c62d99a4e75 100644 (file)
@@ -55,6 +55,9 @@ struct nvkm_fb {
                struct nvkm_fb_tile region[16];
                int regions;
        } tile;
+
+       struct nvkm_memory *mmu_rd;
+       struct nvkm_memory *mmu_wr;
 };
 
 bool nvkm_fb_memtype_valid(struct nvkm_fb *, u32 memtype);
@@ -87,6 +90,7 @@ int gf100_fb_new(struct nvkm_device *, int, struct nvkm_fb **);
 int gk104_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 **);
 
 #include <subdev/bios.h>
 #include <subdev/bios/ramcfg.h>
index 530c6215fe4f2d38866fac16ba0a009d27bc4a1b..3c2ddd975273f11e0efbafe2d2143fe5d39989ff 100644 (file)
@@ -3,15 +3,13 @@
 
 #include <core/subdev.h>
 
-struct nkvm_iccsense_rail;
 struct nvkm_iccsense {
        struct nvkm_subdev subdev;
-       u8 rail_count;
        bool data_valid;
-       struct nvkm_iccsense_rail *rails;
+       struct list_head sensors;
+       struct list_head rails;
 };
 
 int gf100_iccsense_new(struct nvkm_device *, int index, struct nvkm_iccsense **);
-int nvkm_iccsense_read(struct nvkm_iccsense *iccsense, u8 idx);
 int nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense);
 #endif
index 4de05e718f83825a3f67317213716afb1bd45a24..2e80682b2da1a7305d65c5911c099697120bef68 100644 (file)
@@ -10,12 +10,18 @@ struct nvkm_mc {
 void nvkm_mc_intr(struct nvkm_mc *, bool *handled);
 void nvkm_mc_intr_unarm(struct nvkm_mc *);
 void nvkm_mc_intr_rearm(struct nvkm_mc *);
+void nvkm_mc_reset(struct nvkm_mc *, enum nvkm_devidx);
 void nvkm_mc_unk260(struct nvkm_mc *, 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 **);
 #endif
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h
new file mode 100644 (file)
index 0000000..8fb575a
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef __NVKM_TOP_H__
+#define __NVKM_TOP_H__
+#include <core/subdev.h>
+
+struct nvkm_top {
+       const struct nvkm_top_func *func;
+       struct nvkm_subdev subdev;
+       struct list_head device;
+};
+
+u32 nvkm_top_reset(struct nvkm_top *, enum nvkm_devidx);
+u32 nvkm_top_intr(struct nvkm_top *, u32 intr, u64 *subdevs);
+enum nvkm_devidx nvkm_top_fault(struct nvkm_top *, int fault);
+enum nvkm_devidx nvkm_top_engine(struct nvkm_top *, int, int *runl, int *engn);
+
+int gk104_top_new(struct nvkm_device *, int, struct nvkm_top **);
+#endif
index a59e524c028c99039644aa7c12d58abf9aa52918..eb7de487a2b3f16936c70b183c4945d1e26072a8 100644 (file)
@@ -29,7 +29,7 @@
 #include <nvif/cla06f.h>
 #include <nvif/unpack.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_gem.h"
 #include "nouveau_chan.h"
index cdf522770cfaf508486d928c62ad0bea6cd4453c..db76b94e6e26fc1d7a5f5968850d94a7bb61d41e 100644 (file)
@@ -6,7 +6,7 @@
 #include <drm/drm_edid.h>
 #include <acpi/video.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_acpi.h"
 
 #define NOUVEAU_DSM_LED 0x02
index 89eb46040b139d7ef235ec8bac22286610b72488..f5101be806cbf4e1baf5a1db5661eb760588d0bf 100644 (file)
@@ -32,7 +32,7 @@
 
 #include <linux/backlight.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "nouveau_encoder.h"
 
index 4dca65a63b9226fa17c64452feff876b8faebd45..a1570b109434057db887acff8fc71e634595a430 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <drm/drmP.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_reg.h"
 #include "dispnv04/hw.h"
 #include "nouveau_encoder.h"
index 2cdaea58678daa204ce8909c8f38f124b5a5ed1e..5e3f3e826476cc0b71b64bc12d615841191cebd7 100644 (file)
@@ -30,7 +30,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/swiotlb.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
@@ -312,7 +312,7 @@ nouveau_bo_pin(struct nouveau_bo *nvbo, uint32_t memtype, bool contig)
        bool force = false, evict = false;
        int ret;
 
-       ret = ttm_bo_reserve(bo, false, false, false, NULL);
+       ret = ttm_bo_reserve(bo, false, false, NULL);
        if (ret)
                return ret;
 
@@ -385,7 +385,7 @@ nouveau_bo_unpin(struct nouveau_bo *nvbo)
        struct ttm_buffer_object *bo = &nvbo->bo;
        int ret, ref;
 
-       ret = ttm_bo_reserve(bo, false, false, false, NULL);
+       ret = ttm_bo_reserve(bo, false, false, NULL);
        if (ret)
                return ret;
 
@@ -420,7 +420,7 @@ nouveau_bo_map(struct nouveau_bo *nvbo)
 {
        int ret;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
        if (ret)
                return ret;
 
@@ -1322,7 +1322,7 @@ nouveau_bo_move(struct ttm_buffer_object *bo, bool evict, bool intr,
        }
 
        /* Fallback to software copy. */
-       ret = ttm_bo_wait(bo, true, intr, no_wait_gpu);
+       ret = ttm_bo_wait(bo, intr, no_wait_gpu);
        if (ret == 0)
                ret = ttm_bo_move_memcpy(bo, evict, no_wait_gpu, new_mem);
 
@@ -1611,6 +1611,8 @@ struct ttm_bo_driver nouveau_bo_driver = {
        .fault_reserve_notify = &nouveau_ttm_fault_reserve_notify,
        .io_mem_reserve = &nouveau_ttm_io_mem_reserve,
        .io_mem_free = &nouveau_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 struct nvkm_vma *
index 879655c03ae9d699a2c4e1bbfcf3f4728db04553..b1d2527c56256372007537399f0abaa11d4f0d49 100644 (file)
@@ -34,7 +34,7 @@
 /*XXX*/
 #include <core/client.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_bo.h"
 #include "nouveau_chan.h"
index e81aefe5ffa7c3c278cdda8253cdd228f228369e..c1084088f9e4e048ae386a1fdf53b393e407e650 100644 (file)
@@ -34,7 +34,7 @@
 #include <drm/drm_crtc_helper.h>
 
 #include "nouveau_reg.h"
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "dispnv04/hw.h"
 #include "nouveau_acpi.h"
 
index 3d0dc199b2539f2b146fc26ea253c19ba6846657..411c12cdb24991a70d15884651ba22c10f504494 100644 (file)
@@ -32,7 +32,7 @@
 #include <nvif/class.h>
 #include <nvif/if0001.h>
 #include "nouveau_debugfs.h"
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 
 static int
 nouveau_debugfs_vbios_image(struct seq_file *m, void *data)
index b8c03ff5bf050e8fbd7515a20dae442fe87413c7..eab58811417a20fb72ad35f6017e6e11af78fd55 100644 (file)
@@ -5,7 +5,7 @@
 
 #if defined(CONFIG_DEBUG_FS)
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 
 struct nouveau_debugfs {
        struct nvif_object ctrl;
index 7ce7fa5cb5e6d08cfd26a77d66c3ac9b6b9622d4..7c77f960c8b8662ea171e98be8522166221110f7 100644 (file)
@@ -279,7 +279,7 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
        struct drm_gem_object *gem;
        int ret = -ENOMEM;
 
-       gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+       gem = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (!gem)
                return ERR_PTR(-ENOENT);
 
@@ -296,7 +296,7 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
 err:
        kfree(nouveau_fb);
 err_unref:
-       drm_gem_object_unreference(gem);
+       drm_gem_object_unreference_unlocked(gem);
        return ERR_PTR(ret);
 }
 
@@ -739,7 +739,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
        }
 
        mutex_lock(&cli->mutex);
-       ret = ttm_bo_reserve(&new_bo->bo, true, false, false, NULL);
+       ret = ttm_bo_reserve(&new_bo->bo, true, false, NULL);
        if (ret)
                goto fail_unpin;
 
@@ -753,7 +753,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
        if (new_bo != old_bo) {
                ttm_bo_unreserve(&new_bo->bo);
 
-               ret = ttm_bo_reserve(&old_bo->bo, true, false, false, NULL);
+               ret = ttm_bo_reserve(&old_bo->bo, true, false, NULL);
                if (ret)
                        goto fail_unpin;
        }
@@ -916,7 +916,7 @@ nouveau_display_dumb_map_offset(struct drm_file *file_priv,
 {
        struct drm_gem_object *gem;
 
-       gem = drm_gem_object_lookup(dev, file_priv, handle);
+       gem = drm_gem_object_lookup(file_priv, handle);
        if (gem) {
                struct nouveau_bo *bo = nouveau_gem_object(gem);
                *poffset = drm_vma_node_offset_addr(&bo->bo.vma_node);
index 5a57d8b472c4f181823a275bc09b17671b1b0057..24273bacd885520c4d007c40a5efd2105d842d1b 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <subdev/mmu.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 
 struct nouveau_framebuffer {
        struct drm_framebuffer base;
index d168c63533c1797b3ee994b51752a19965082c9d..2634a1a798885229caae7b2c4353f4955fb91046 100644 (file)
@@ -24,7 +24,7 @@
  *
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 
 void
index e17e15ec7d431c12002a06f42229d10cdc165099..87d52d36f4fc6754efa979f5aadca8bd0be66102 100644 (file)
@@ -25,7 +25,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_dp_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_connector.h"
 #include "nouveau_encoder.h"
 #include "nouveau_crtc.h"
index d06877d9c1edd910c093ae53939d0269f2df2006..11f8dd9c0edb8657111ee2f340c364daea6df783 100644 (file)
@@ -44,7 +44,7 @@
 #include <nvif/cla06f.h>
 #include <nvif/if0004.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_ttm.h"
 #include "nouveau_gem.h"
@@ -1083,10 +1083,8 @@ nouveau_drm_init(void)
        nouveau_display_options();
 
        if (nouveau_modeset == -1) {
-#ifdef CONFIG_VGA_CONSOLE
                if (vgacon_text_force())
                        nouveau_modeset = 0;
-#endif
        }
 
        if (!nouveau_modeset)
similarity index 98%
rename from drivers/gpu/drm/nouveau/nouveau_drm.h
rename to drivers/gpu/drm/nouveau/nouveau_drv.h
index 5c363ed1c84268f4aa28886ec470f9f3aa5e309c..822a0212cd481c1a6522bb0803ca902a80f99912 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __NOUVEAU_DRMCLI_H__
-#define __NOUVEAU_DRMCLI_H__
+#ifndef __NOUVEAU_DRV_H__
+#define __NOUVEAU_DRV_H__
 
 #define DRIVER_AUTHOR          "Nouveau Project"
 #define DRIVER_EMAIL           "nouveau@lists.freedesktop.org"
index 59f27e774acb5e9c98c9854bd72195efdbec3a48..57aaf98a26f9c3d5bcfd91e351f29c2e89b7c276 100644 (file)
@@ -43,7 +43,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_gem.h"
 #include "nouveau_bo.h"
 #include "nouveau_fbcon.h"
@@ -386,8 +386,6 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
                }
        }
 
-       mutex_lock(&dev->struct_mutex);
-
        info = drm_fb_helper_alloc_fbi(helper);
        if (IS_ERR(info)) {
                ret = PTR_ERR(info);
@@ -426,8 +424,6 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
 
        /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
 
-       mutex_unlock(&dev->struct_mutex);
-
        if (chan)
                nouveau_fbcon_accel_init(dev);
        nouveau_fbcon_zfill(dev, fbcon);
@@ -441,7 +437,6 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
        return 0;
 
 out_unlock:
-       mutex_unlock(&dev->struct_mutex);
        if (chan)
                nouveau_bo_vma_del(nvbo, &fbcon->nouveau_fb.vma);
        nouveau_bo_unmap(nvbo);
index 9a8c5b727f59d39235fc844f6ab8fbfc692009f3..4bb9ab892ae19c3afe6f7e1bf235f8e7869bd28b 100644 (file)
@@ -34,7 +34,7 @@
 #include <nvif/notify.h>
 #include <nvif/event.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
index a0865c49ec83e95cb5477a41e1df4a1e2dc24160..72e2399bce39f97cd2d2e82d3c62227b09743ca9 100644 (file)
@@ -24,7 +24,7 @@
  *
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 #include "nouveau_abi16.h"
@@ -71,7 +71,7 @@ nouveau_gem_object_open(struct drm_gem_object *gem, struct drm_file *file_priv)
        if (!cli->vm)
                return 0;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
        if (ret)
                return ret;
 
@@ -126,7 +126,7 @@ nouveau_gem_object_unmap(struct nouveau_bo *nvbo, struct nvkm_vma *vma)
        list_del(&vma->head);
 
        if (fobj && fobj->shared_count > 1)
-               ttm_bo_wait(&nvbo->bo, true, false, false);
+               ttm_bo_wait(&nvbo->bo, false, false);
        else if (fobj && fobj->shared_count == 1)
                fence = rcu_dereference_protected(fobj->shared[0],
                                                reservation_object_held(resv));
@@ -156,7 +156,7 @@ nouveau_gem_object_close(struct drm_gem_object *gem, struct drm_file *file_priv)
        if (!cli->vm)
                return;
 
-       ret = ttm_bo_reserve(&nvbo->bo, false, false, false, NULL);
+       ret = ttm_bo_reserve(&nvbo->bo, false, false, NULL);
        if (ret)
                return;
 
@@ -368,7 +368,6 @@ validate_init(struct nouveau_channel *chan, struct drm_file *file_priv,
              int nr_buffers, struct validate_op *op)
 {
        struct nouveau_cli *cli = nouveau_cli(file_priv);
-       struct drm_device *dev = chan->drm->dev;
        int trycnt = 0;
        int ret, i;
        struct nouveau_bo *res_bo = NULL;
@@ -388,7 +387,7 @@ retry:
                struct drm_gem_object *gem;
                struct nouveau_bo *nvbo;
 
-               gem = drm_gem_object_lookup(dev, file_priv, b->handle);
+               gem = drm_gem_object_lookup(file_priv, b->handle);
                if (!gem) {
                        NV_PRINTK(err, cli, "Unknown handle 0x%08x\n", b->handle);
                        ret = -ENOENT;
@@ -409,7 +408,7 @@ retry:
                        break;
                }
 
-               ret = ttm_bo_reserve(&nvbo->bo, true, false, true, &op->ticket);
+               ret = ttm_bo_reserve(&nvbo->bo, true, false, &op->ticket);
                if (ret) {
                        list_splice_tail_init(&vram_list, &op->list);
                        list_splice_tail_init(&gart_list, &op->list);
@@ -651,7 +650,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
                                data |= r->vor;
                }
 
-               ret = ttm_bo_wait(&nvbo->bo, true, false, false);
+               ret = ttm_bo_wait(&nvbo->bo, false, false);
                if (ret) {
                        NV_PRINTK(err, cli, "reloc wait_idle failed: %d\n", ret);
                        break;
@@ -864,7 +863,7 @@ nouveau_gem_ioctl_cpu_prep(struct drm_device *dev, void *data,
        bool write = !!(req->flags & NOUVEAU_GEM_CPU_PREP_WRITE);
        int ret;
 
-       gem = drm_gem_object_lookup(dev, file_priv, req->handle);
+       gem = drm_gem_object_lookup(file_priv, req->handle);
        if (!gem)
                return -ENOENT;
        nvbo = nouveau_gem_object(gem);
@@ -896,7 +895,7 @@ nouveau_gem_ioctl_cpu_fini(struct drm_device *dev, void *data,
        struct drm_gem_object *gem;
        struct nouveau_bo *nvbo;
 
-       gem = drm_gem_object_lookup(dev, file_priv, req->handle);
+       gem = drm_gem_object_lookup(file_priv, req->handle);
        if (!gem)
                return -ENOENT;
        nvbo = nouveau_gem_object(gem);
@@ -914,7 +913,7 @@ nouveau_gem_ioctl_info(struct drm_device *dev, void *data,
        struct drm_gem_object *gem;
        int ret;
 
-       gem = drm_gem_object_lookup(dev, file_priv, req->handle);
+       gem = drm_gem_object_lookup(file_priv, req->handle);
        if (!gem)
                return -ENOENT;
 
index e4049faca780453f07dccbf034950a8215fa786e..7e32da2e037a2219b796f405b5aeca0bf8a726bd 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <drm/drmP.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_bo.h"
 
 #define nouveau_bo_tile_layout(nvbo)                           \
index 67edd2f5b71a580602aa33ef86e2c9f2976531b8..1ff4166af26ece5b20927f89c14297eb853841be 100644 (file)
@@ -31,7 +31,7 @@
 
 #include <drm/drmP.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_hwmon.h"
 
 #include <nvkm/subdev/iccsense.h>
@@ -689,7 +689,7 @@ nouveau_hwmon_init(struct drm_device *dev)
                        goto error;
        }
 
-       if (iccsense && iccsense->data_valid && iccsense->rail_count) {
+       if (iccsense && iccsense->data_valid && !list_empty(&iccsense->rails)) {
                ret = sysfs_create_group(&hwmon_dev->kobj,
                                         &hwmon_power_attrgroup);
                if (ret)
index 55eb942847fa67db72130d1c50e183b019f39a23..15f0925ea13b3cb5157d6bf9ebb4f5c9b811e644 100644 (file)
@@ -36,7 +36,7 @@
 #include <nvif/event.h>
 #include <nvif/ioctl.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_usif.h"
 
 static void
index f41056d0f5f49b65ecb32814054f29daa77bc9c7..a90d72767b8bbcb62defd910400608b8bb63a4e5 100644 (file)
@@ -21,7 +21,7 @@
  */
 #ifndef __NOUVEAU_PLATFORM_H__
 #define __NOUVEAU_PLATFORM_H__
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 
 extern struct platform_driver nouveau_platform_driver;
 #endif
index dd32ad6db53d2525bfbdde846a87f8b369269cc8..a0a9704cfe2b25cdc1b87b56227b05635131d077 100644 (file)
@@ -25,7 +25,7 @@
 #include <drm/drmP.h>
 #include <linux/dma-buf.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_gem.h"
 
 struct sg_table *nouveau_gem_prime_get_sg_table(struct drm_gem_object *obj)
index 8c3053a177d6c4c36a0b5acd405fc72c340eea2c..db35ab5883acdf20deef20f21f2b5430fe61da0c 100644 (file)
@@ -1,7 +1,7 @@
 #include <linux/pagemap.h>
 #include <linux/slab.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_ttm.h"
 
 struct nouveau_sgdma_be {
index d2e7d209f6517450165c33b7485f94102f887e6d..bcee91497eb9778fb1c8c266369b33cdfe44a2b7 100644 (file)
@@ -24,7 +24,7 @@
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_ttm.h"
 #include "nouveau_gem.h"
 
index e9f52ef0be830442e1ea136a4580275d0cb5022c..675e9e077a95c6ec7a69a6891a7d6f16b8c6b139 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs <bskeggs@redhat.com>
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_usif.h"
 #include "nouveau_abi16.h"
 
index af89c3665b2abc5e8db0d9b13a9f921879208d5b..c6a180a0c28448cff5275c4315b92364d3977347 100644 (file)
@@ -4,7 +4,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_acpi.h"
 #include "nouveau_fbcon.h"
 #include "nouveau_vga.h"
index 789dc2993b0dd36ea07da39bdf372ba074c79f13..0f3e4bb411cc99c9052beb5b862dd9927888ad7e 100644 (file)
@@ -22,7 +22,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fbcon.h"
 
index 3022d24ed88bfb91f011935b8c5fe69876f9454b..1915b7b82a59e6213cf9c0c06f566b82d939e9bd 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
index 2c35213da27588745129ceb9b52b72a3f8a8e8da..4e3de34ff6f4b9dc92bcb71c3e4746e868aabd0d 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs <bskeggs@redhat.com>
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nv10_fence.h"
 
index 6a141c9bf5b7cb3e80e1de75d55c52beed629a89..7d5e562a55c5abf738b8eae21c110aa75af34938 100644 (file)
@@ -26,7 +26,7 @@
 #include <nvif/class.h>
 #include <nvif/cl0002.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nv10_fence.h"
 
index a43445caae60b9d6bfdcd8a95eba0ec1271907b6..3ffc2b0057bfeaa0dd1f34ed57f6131f457ab121 100644 (file)
@@ -39,7 +39,7 @@
 #include <nvif/cl507d.h>
 #include <nvif/cl507e.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_gem.h"
 #include "nouveau_connector.h"
@@ -1305,7 +1305,6 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
                     uint32_t handle, uint32_t width, uint32_t height)
 {
        struct nouveau_crtc *nv_crtc = nouveau_crtc(crtc);
-       struct drm_device *dev = crtc->dev;
        struct drm_gem_object *gem = NULL;
        struct nouveau_bo *nvbo = NULL;
        int ret = 0;
@@ -1314,7 +1313,7 @@ nv50_crtc_cursor_set(struct drm_crtc *crtc, struct drm_file *file_priv,
                if (width != 64 || height != 64)
                        return -EINVAL;
 
-               gem = drm_gem_object_lookup(dev, file_priv, handle);
+               gem = drm_gem_object_lookup(file_priv, handle);
                if (unlikely(!gem))
                        return -ENOENT;
                nvbo = nouveau_gem_object(gem);
index e05499d6ed8394fd2d2f8ad572d017fb29730211..33d9ee0fac4084918c002d2164977a53e03ae65a 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fbcon.h"
 
index 3695ccce68c7c15628bdfbbe51d7a8d3e33a4400..4d6f202b77707c8cf01db5a6362772720fe1bbc9 100644 (file)
@@ -26,7 +26,7 @@
 #include <nvif/class.h>
 #include <nvif/cl0002.h>
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nv10_fence.h"
 
index 412c5be5a9ca2858e6ae208dae05bb08ff062558..18bde9d8e6d6c2534accb6f39b790bdf5612a8f2 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
index c97395b4a312493aa066e409144b30c682b2a5ae..a0913359ac05a02046f9286254b98fa58a650ef4 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fbcon.h"
 
index becf19abda2d8a3f5d2a8cd6e565e6e17250640c..b79775788bbd7e57f151e64fb8aa2fcfe62b1f9d 100644 (file)
@@ -22,7 +22,7 @@
  * Authors: Ben Skeggs
  */
 
-#include "nouveau_drm.h"
+#include "nouveau_drv.h"
 #include "nouveau_dma.h"
 #include "nouveau_fence.h"
 
index 8a7bae7bd995cda66479effd8f30e0adf90812f9..ee8e5831fe374ddef75dd60e2bc597e4c176e8c3 100644 (file)
@@ -137,11 +137,10 @@ nvkm_engine_func = {
 
 int
 nvkm_engine_ctor(const struct nvkm_engine_func *func,
-                struct nvkm_device *device, int index, u32 pmc_enable,
-                bool enable, struct nvkm_engine *engine)
+                struct nvkm_device *device, int index, bool enable,
+                struct nvkm_engine *engine)
 {
-       nvkm_subdev_ctor(&nvkm_engine_func, device, index,
-                        pmc_enable, &engine->subdev);
+       nvkm_subdev_ctor(&nvkm_engine_func, device, index, &engine->subdev);
        engine->func = func;
 
        if (!nvkm_boolopt(device->cfgopt, nvkm_subdev_name[index], enable)) {
@@ -155,11 +154,10 @@ 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, u32 pmc_enable,
-                bool enable, struct nvkm_engine **pengine)
+                struct nvkm_device *device, int index, bool enable,
+                struct nvkm_engine **pengine)
 {
        if (!(*pengine = kzalloc(sizeof(**pengine), GFP_KERNEL)))
                return -ENOMEM;
-       return nvkm_engine_ctor(func, device, index, pmc_enable,
-                               enable, *pengine);
+       return nvkm_engine_ctor(func, device, index, enable, *pengine);
 }
index 3bf08cb1a289cd5e378f9d97a1785d376866da86..b18557858f19e25c8fbbad4b34d5ec58cd4a8d17 100644 (file)
@@ -24,6 +24,7 @@
 #include <core/subdev.h>
 #include <core/device.h>
 #include <core/option.h>
+#include <subdev/mc.h>
 
 static struct lock_class_key nvkm_subdev_lock_class[NVKM_SUBDEV_NR];
 
@@ -50,6 +51,7 @@ nvkm_subdev_name[NVKM_SUBDEV_NR] = {
        [NVKM_SUBDEV_SECBOOT ] = "secboot",
        [NVKM_SUBDEV_THERM   ] = "therm",
        [NVKM_SUBDEV_TIMER   ] = "tmr",
+       [NVKM_SUBDEV_TOP     ] = "top",
        [NVKM_SUBDEV_VOLT    ] = "volt",
        [NVKM_ENGINE_BSP     ] = "bsp",
        [NVKM_ENGINE_CE0     ] = "ce0",
@@ -89,7 +91,6 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
 {
        struct nvkm_device *device = subdev->device;
        const char *action = suspend ? "suspend" : "fini";
-       u32 pmc_enable = subdev->pmc_enable;
        s64 time;
 
        nvkm_trace(subdev, "%s running...\n", action);
@@ -104,11 +105,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
                }
        }
 
-       if (pmc_enable) {
-               nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
-               nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
-               nvkm_rd32(device, 0x000200);
-       }
+       nvkm_mc_reset(device->mc, subdev->index);
 
        time = ktime_to_us(ktime_get()) - time;
        nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
@@ -193,14 +190,13 @@ nvkm_subdev_del(struct nvkm_subdev **psubdev)
 
 void
 nvkm_subdev_ctor(const struct nvkm_subdev_func *func,
-                struct nvkm_device *device, int index, u32 pmc_enable,
+                struct nvkm_device *device, int index,
                 struct nvkm_subdev *subdev)
 {
        const char *name = nvkm_subdev_name[index];
        subdev->func = func;
        subdev->device = device;
        subdev->index = index;
-       subdev->pmc_enable = pmc_enable;
 
        __mutex_init(&subdev->mutex, name, &nvkm_subdev_lock_class[index]);
        subdev->debug = nvkm_dbgopt(device->dbgopt, name);
index 3ef01071f073ddd0d1ecb49915cd0b3bca7f188e..8e2e24a7477458d0ad2361885e79fca4f936068a 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_xtensa_func
 g84_bsp = {
-       .pmc_enable = 0x04008000,
        .fifo_val = 0x1111,
        .unkd28 = 0x90044,
        .sclass = {
index 92a9f35df1a65514d60a47a279d7917f26f03b16..ad9f855c9a407223c63b505e151e34b6953a1f16 100644 (file)
@@ -40,7 +40,6 @@ gf100_ce0 = {
        .code.size = sizeof(gf100_ce_code),
        .data.data = gf100_ce_data,
        .data.size = sizeof(gf100_ce_data),
-       .pmc_enable = 0x00000040,
        .init = gf100_ce_init,
        .intr = gt215_ce_intr,
        .sclass = {
@@ -55,7 +54,6 @@ gf100_ce1 = {
        .code.size = sizeof(gf100_ce_code),
        .data.data = gf100_ce_data,
        .data.size = sizeof(gf100_ce_data),
-       .pmc_enable = 0x00000080,
        .init = gf100_ce_init,
        .intr = gt215_ce_intr,
        .sclass = {
index e2b944dce9b8a829026b671eb15fa06555986f4b..9e0b53a10f773bf648f046cc8e151427a88afc94 100644 (file)
@@ -97,17 +97,5 @@ int
 gk104_ce_new(struct nvkm_device *device, int index,
             struct nvkm_engine **pengine)
 {
-       if (index == NVKM_ENGINE_CE0) {
-               return nvkm_engine_new_(&gk104_ce, device, index,
-                                       0x00000040, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE1) {
-               return nvkm_engine_new_(&gk104_ce, device, index,
-                                       0x00000080, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE2) {
-               return nvkm_engine_new_(&gk104_ce, device, index,
-                                       0x00200000, true, pengine);
-       }
-       return -ENODEV;
+       return nvkm_engine_new_(&gk104_ce, device, index, true, pengine);
 }
index 4c2f42919c1f31607510630350b18a1a638a20b6..c0df7daa85e274760e13cde68d4530fce514f7cf 100644 (file)
@@ -39,17 +39,5 @@ int
 gm107_ce_new(struct nvkm_device *device, int index,
             struct nvkm_engine **pengine)
 {
-       if (index == NVKM_ENGINE_CE0) {
-               return nvkm_engine_new_(&gm107_ce, device, index,
-                                       0x00000040, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE1) {
-               return nvkm_engine_new_(&gm107_ce, device, index,
-                                       0x00000080, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE2) {
-               return nvkm_engine_new_(&gm107_ce, device, index,
-                                       0x00200000, true, pengine);
-       }
-       return -ENODEV;
+       return nvkm_engine_new_(&gm107_ce, device, index, true, pengine);
 }
index 13f07b32cd9c4bdd076903be08da69278f41b2b7..c6fa8b20737e690cdc6d5d9e94bdd23b91b1129e 100644 (file)
@@ -38,17 +38,5 @@ int
 gm200_ce_new(struct nvkm_device *device, int index,
             struct nvkm_engine **pengine)
 {
-       if (index == NVKM_ENGINE_CE0) {
-               return nvkm_engine_new_(&gm200_ce, device, index,
-                                       0x00000040, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE1) {
-               return nvkm_engine_new_(&gm200_ce, device, index,
-                                       0x00000080, true, pengine);
-       } else
-       if (index == NVKM_ENGINE_CE2) {
-               return nvkm_engine_new_(&gm200_ce, device, index,
-                                       0x00200000, true, pengine);
-       }
-       return -ENODEV;
+       return nvkm_engine_new_(&gm200_ce, device, index, true, pengine);
 }
index 402dcbcc2192fda50057f9097585d2bf10fa78d1..63ac51a54fd3c981d105e9b1cdb0525ac7016be9 100644 (file)
@@ -67,7 +67,6 @@ gt215_ce = {
        .code.size = sizeof(gt215_ce_code),
        .data.data = gt215_ce_data,
        .data.size = sizeof(gt215_ce_data),
-       .pmc_enable = 0x00802000,
        .intr = gt215_ce_intr,
        .sclass = {
                { -1, -1, GT212_DMA },
index bfd01625ec7f8ccd8d82366cd6400dd1cea9e520..68ffb520531e0f784b485e663f3f637b99528253 100644 (file)
@@ -130,6 +130,5 @@ int
 g84_cipher_new(struct nvkm_device *device, int index,
               struct nvkm_engine **pengine)
 {
-       return nvkm_engine_new_(&g84_cipher, device, index,
-                               0x00004000, true, pengine);
+       return nvkm_engine_new_(&g84_cipher, device, index, true, pengine);
 }
index 9f32c8739254b41b06c854a0a434458566f3817e..4572debcb0c9862f54fa5d7f4db436b885b2df42 100644 (file)
@@ -146,7 +146,7 @@ nv11_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv11_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -190,7 +190,7 @@ nv17_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -212,7 +212,7 @@ nv18_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -256,7 +256,7 @@ nv1f_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -278,7 +278,7 @@ nv20_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -300,7 +300,7 @@ nv25_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -322,7 +322,7 @@ nv28_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -344,7 +344,7 @@ nv2a_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -366,7 +366,7 @@ nv30_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -388,7 +388,7 @@ nv31_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -411,7 +411,7 @@ nv34_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -434,7 +434,7 @@ nv35_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -456,7 +456,7 @@ nv36_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv04_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv04_pci_new,
        .timer = nv04_timer_new,
@@ -479,7 +479,7 @@ nv40_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -505,7 +505,7 @@ nv41_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -531,7 +531,7 @@ nv42_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -557,7 +557,7 @@ nv43_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -609,7 +609,7 @@ nv45_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv04_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -661,7 +661,7 @@ nv47_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -687,7 +687,7 @@ nv49_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -739,7 +739,7 @@ nv4b_chipset = {
        .gpio = nv10_gpio_new,
        .i2c = nv04_i2c_new,
        .imem = nv40_instmem_new,
-       .mc = nv04_mc_new,
+       .mc = nv17_mc_new,
        .mmu = nv41_mmu_new,
        .pci = nv40_pci_new,
        .therm = nv40_therm_new,
@@ -926,7 +926,7 @@ nv84_chipset = {
        .gpio = nv50_gpio_new,
        .i2c = nv50_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g84_pci_new,
@@ -958,7 +958,7 @@ nv86_chipset = {
        .gpio = nv50_gpio_new,
        .i2c = nv50_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g84_pci_new,
@@ -990,7 +990,7 @@ nv92_chipset = {
        .gpio = nv50_gpio_new,
        .i2c = nv50_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g84_pci_new,
@@ -1022,7 +1022,7 @@ nv94_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1054,7 +1054,7 @@ nv96_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = nv50_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1118,7 +1118,7 @@ nva0_chipset = {
        .gpio = g94_gpio_new,
        .i2c = nv50_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
+       .mc = g84_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1150,7 +1150,7 @@ nva3_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
+       .mc = gt215_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1184,7 +1184,7 @@ nva5_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
+       .mc = gt215_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1217,7 +1217,7 @@ nva8_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
+       .mc = gt215_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1314,7 +1314,7 @@ nvaf_chipset = {
        .gpio = g94_gpio_new,
        .i2c = g94_i2c_new,
        .imem = nv50_instmem_new,
-       .mc = g98_mc_new,
+       .mc = gt215_mc_new,
        .mmu = nv50_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = g94_pci_new,
@@ -1676,13 +1676,14 @@ nve4_chipset = {
        .iccsense = gf100_iccsense_new,
        .imem = nv50_instmem_new,
        .ltc = gk104_ltc_new,
-       .mc = gf100_mc_new,
+       .mc = gk104_mc_new,
        .mmu = gf100_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = gk104_pci_new,
        .pmu = gk104_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1714,13 +1715,14 @@ nve6_chipset = {
        .iccsense = gf100_iccsense_new,
        .imem = nv50_instmem_new,
        .ltc = gk104_ltc_new,
-       .mc = gf100_mc_new,
+       .mc = gk104_mc_new,
        .mmu = gf100_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = gk104_pci_new,
        .pmu = gk104_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1752,13 +1754,14 @@ nve7_chipset = {
        .iccsense = gf100_iccsense_new,
        .imem = nv50_instmem_new,
        .ltc = gk104_ltc_new,
-       .mc = gf100_mc_new,
+       .mc = gk104_mc_new,
        .mmu = gf100_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = gk104_pci_new,
        .pmu = gk104_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1789,6 +1792,7 @@ nvea_chipset = {
        .mmu = gf100_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,
@@ -1814,13 +1818,14 @@ nvf0_chipset = {
        .iccsense = gf100_iccsense_new,
        .imem = nv50_instmem_new,
        .ltc = gk104_ltc_new,
-       .mc = gf100_mc_new,
+       .mc = gk104_mc_new,
        .mmu = gf100_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = gk104_pci_new,
        .pmu = gk110_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1851,13 +1856,14 @@ nvf1_chipset = {
        .iccsense = gf100_iccsense_new,
        .imem = nv50_instmem_new,
        .ltc = gk104_ltc_new,
-       .mc = gf100_mc_new,
+       .mc = gk104_mc_new,
        .mmu = gf100_mmu_new,
        .mxm = nv50_mxm_new,
        .pci = gk104_pci_new,
        .pmu = gk110_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1895,6 +1901,7 @@ nv106_chipset = {
        .pmu = gk208_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1932,6 +1939,7 @@ nv108_chipset = {
        .pmu = gk208_pmu_new,
        .therm = gf119_therm_new,
        .timer = nv41_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gk104_ce_new,
        .ce[1] = gk104_ce_new,
@@ -1969,6 +1977,41 @@ nv117_chipset = {
        .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,
+};
+
+static const struct nvkm_device_chip
+nv118_chipset = {
+       .name = "GM108",
+       .bar = gf100_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 = gf119_i2c_new,
+       .ibus = gk104_ibus_new,
+       .iccsense = gf100_iccsense_new,
+       .imem = nv50_instmem_new,
+       .ltc = gm107_ltc_new,
+       .mc = gk20a_mc_new,
+       .mmu = gf100_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,
@@ -1986,7 +2029,7 @@ nv120_chipset = {
        .bios = nvkm_bios_new,
        .bus = gf100_bus_new,
        .devinit = gm200_devinit_new,
-       .fb = gm107_fb_new,
+       .fb = gm200_fb_new,
        .fuse = gm107_fuse_new,
        .gpio = gk104_gpio_new,
        .i2c = gm200_i2c_new,
@@ -2001,6 +2044,7 @@ nv120_chipset = {
        .pmu = gm107_pmu_new,
        .secboot = gm200_secboot_new,
        .timer = gk20a_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gm200_ce_new,
        .ce[1] = gm200_ce_new,
@@ -2019,7 +2063,7 @@ nv124_chipset = {
        .bios = nvkm_bios_new,
        .bus = gf100_bus_new,
        .devinit = gm200_devinit_new,
-       .fb = gm107_fb_new,
+       .fb = gm200_fb_new,
        .fuse = gm107_fuse_new,
        .gpio = gk104_gpio_new,
        .i2c = gm200_i2c_new,
@@ -2034,6 +2078,7 @@ nv124_chipset = {
        .pmu = gm107_pmu_new,
        .secboot = gm200_secboot_new,
        .timer = gk20a_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gm200_ce_new,
        .ce[1] = gm200_ce_new,
@@ -2052,7 +2097,7 @@ nv126_chipset = {
        .bios = nvkm_bios_new,
        .bus = gf100_bus_new,
        .devinit = gm200_devinit_new,
-       .fb = gm107_fb_new,
+       .fb = gm200_fb_new,
        .fuse = gm107_fuse_new,
        .gpio = gk104_gpio_new,
        .i2c = gm200_i2c_new,
@@ -2067,6 +2112,7 @@ nv126_chipset = {
        .pmu = gm107_pmu_new,
        .secboot = gm200_secboot_new,
        .timer = gk20a_timer_new,
+       .top = gk104_top_new,
        .volt = gk104_volt_new,
        .ce[0] = gm200_ce_new,
        .ce[1] = gm200_ce_new,
@@ -2093,6 +2139,7 @@ nv12b_chipset = {
        .mmu = gf100_mmu_new,
        .secboot = gm20b_secboot_new,
        .timer = gk20a_timer_new,
+       .top = gk104_top_new,
        .ce[2] = gm200_ce_new,
        .volt = gm20b_volt_new,
        .dma = gf119_dma_new,
@@ -2150,6 +2197,7 @@ nvkm_device_subdev(struct nvkm_device *device, int index)
        _(SECBOOT , device->secboot , &device->secboot->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:
@@ -2523,6 +2571,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                case 0x106: device->chip = &nv106_chipset; break;
                case 0x108: device->chip = &nv108_chipset; break;
                case 0x117: device->chip = &nv117_chipset; break;
+               case 0x118: device->chip = &nv118_chipset; break;
                case 0x120: device->chip = &nv120_chipset; break;
                case 0x124: device->chip = &nv124_chipset; break;
                case 0x126: device->chip = &nv126_chipset; break;
@@ -2604,6 +2653,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
                _(NVKM_SUBDEV_SECBOOT ,  secboot);
                _(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]);
index e80f6ab1c41525a6c13045b827e5605a83c1bf65..1a06ac175f5548a1d9d6413ac6c84bc643bd3044 100644 (file)
@@ -22,6 +22,7 @@
 #include <subdev/pmu.h>
 #include <subdev/therm.h>
 #include <subdev/timer.h>
+#include <subdev/top.h>
 #include <subdev/volt.h>
 #include <subdev/secboot.h>
 
index 785fa76d0fbf3e8d7a9dbcc0ae790696c6a72e5b..1efe91b1e22b164e02c55acf0d3db5ef2f9c29fa 100644 (file)
@@ -298,8 +298,7 @@ nvkm_disp_ctor(const struct nvkm_disp_func *func, struct nvkm_device *device,
        disp->func = func;
        disp->head.nr = heads;
 
-       ret = nvkm_engine_ctor(&nvkm_disp, device, index, 0,
-                              true, &disp->engine);
+       ret = nvkm_engine_ctor(&nvkm_disp, device, index, true, &disp->engine);
        if (ret)
                return ret;
 
index 9769fc0d5351bf65430f7f938b8f7b11fe7ebbf7..f11ebdd16c77f0a8516d01336bef6837f660eea6 100644 (file)
@@ -152,6 +152,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,
-                               0, true, &dma->engine);
+       return nvkm_engine_ctor(&nvkm_dma, device, index, true, &dma->engine);
 }
index 74000602fbb127463c1a5d0b269adb305fc84f90..2e7b4e2105efc4983a63eceb3376aa685fd5cf07 100644 (file)
@@ -348,6 +348,6 @@ 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, func->pmc_enable,
+       return nvkm_engine_ctor(&nvkm_falcon, device, index,
                                enable, &falcon->engine);
 }
index cfc7d5725a61faa25bd268e4aee7f18803fceaa7..1c9682ae3a6bf0a0b5b7bc6ddb129e7d1aa452d3 100644 (file)
@@ -178,6 +178,17 @@ nvkm_fifo_class_get(struct nvkm_oclass *oclass, int index,
        const struct nvkm_fifo_chan_oclass *sclass;
        int c = 0;
 
+       if (fifo->func->class_get) {
+               int ret = fifo->func->class_get(fifo, index, &sclass);
+               if (ret == 0) {
+                       oclass->base = sclass->base;
+                       oclass->engn = sclass;
+                       *class = &nvkm_fifo_class;
+                       return 0;
+               }
+               return ret;
+       }
+
        while ((sclass = fifo->func->chan[c])) {
                if (c++ == index) {
                        oclass->base = sclass->base;
@@ -261,8 +272,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, 0x00000100,
-                              true, &fifo->engine);
+       ret = nvkm_engine_ctor(&nvkm_fifo, device, index, true, &fifo->engine);
        if (ret)
                return ret;
 
index 68acb36b3e6d1ea31325ad36588331c8b0bfb0f5..743f3a189f285dd6234a54efe6e5d50009fbf25e 100644 (file)
 #include "changk104.h"
 
 #include <core/client.h>
-#include <core/enum.h>
 #include <core/gpuobj.h>
 #include <subdev/bar.h>
+#include <subdev/top.h>
 #include <engine/sw.h>
 
 #include <nvif/class.h>
 
-void
+static int
+gk104_fifo_class_get(struct nvkm_fifo *base, int index,
+                    const struct nvkm_fifo_chan_oclass **psclass)
+{
+       struct gk104_fifo *fifo = gk104_fifo(base);
+       int c = 0;
+
+       while ((*psclass = fifo->func->chan[c])) {
+               if (c++ == index)
+                       return 0;
+       }
+
+       return c;
+}
+
+static void
 gk104_fifo_uevent_fini(struct nvkm_fifo *fifo)
 {
        struct nvkm_device *device = fifo->engine.subdev.device;
        nvkm_mask(device, 0x002140, 0x80000000, 0x00000000);
 }
 
-void
+static void
 gk104_fifo_uevent_init(struct nvkm_fifo *fifo)
 {
        struct nvkm_device *device = fifo->engine.subdev.device;
@@ -267,111 +282,6 @@ gk104_fifo_intr_dropped_fault(struct gk104_fifo *fifo)
        nvkm_error(subdev, "DROPPED_MMU_FAULT %08x\n", stat);
 }
 
-static const struct nvkm_enum
-gk104_fifo_fault_engine[] = {
-       { 0x00, "GR", NULL, NVKM_ENGINE_GR },
-       { 0x03, "IFB", NULL, NVKM_ENGINE_IFB },
-       { 0x04, "BAR1", NULL, NVKM_SUBDEV_BAR },
-       { 0x05, "BAR3", NULL, NVKM_SUBDEV_INSTMEM },
-       { 0x07, "PBDMA0", NULL, NVKM_ENGINE_FIFO },
-       { 0x08, "PBDMA1", NULL, NVKM_ENGINE_FIFO },
-       { 0x09, "PBDMA2", NULL, NVKM_ENGINE_FIFO },
-       { 0x10, "MSVLD", NULL, NVKM_ENGINE_MSVLD },
-       { 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 },
-       { 0x17, "PMU" },
-       { 0x19, "MSENC", NULL, NVKM_ENGINE_MSENC },
-       { 0x1b, "CE2", NULL, NVKM_ENGINE_CE2 },
-       {}
-};
-
-static const struct nvkm_enum
-gk104_fifo_fault_reason[] = {
-       { 0x00, "PDE" },
-       { 0x01, "PDE_SIZE" },
-       { 0x02, "PTE" },
-       { 0x03, "VA_LIMIT_VIOLATION" },
-       { 0x04, "UNBOUND_INST_BLOCK" },
-       { 0x05, "PRIV_VIOLATION" },
-       { 0x06, "RO_VIOLATION" },
-       { 0x07, "WO_VIOLATION" },
-       { 0x08, "PITCH_MASK_VIOLATION" },
-       { 0x09, "WORK_CREATION" },
-       { 0x0a, "UNSUPPORTED_APERTURE" },
-       { 0x0b, "COMPRESSION_FAILURE" },
-       { 0x0c, "UNSUPPORTED_KIND" },
-       { 0x0d, "REGION_VIOLATION" },
-       { 0x0e, "BOTH_PTES_VALID" },
-       { 0x0f, "INFO_TYPE_POISONED" },
-       {}
-};
-
-static const struct nvkm_enum
-gk104_fifo_fault_hubclient[] = {
-       { 0x00, "VIP" },
-       { 0x01, "CE0" },
-       { 0x02, "CE1" },
-       { 0x03, "DNISO" },
-       { 0x04, "FE" },
-       { 0x05, "FECS" },
-       { 0x06, "HOST" },
-       { 0x07, "HOST_CPU" },
-       { 0x08, "HOST_CPU_NB" },
-       { 0x09, "ISO" },
-       { 0x0a, "MMU" },
-       { 0x0b, "MSPDEC" },
-       { 0x0c, "MSPPP" },
-       { 0x0d, "MSVLD" },
-       { 0x0e, "NISO" },
-       { 0x0f, "P2P" },
-       { 0x10, "PD" },
-       { 0x11, "PERF" },
-       { 0x12, "PMU" },
-       { 0x13, "RASTERTWOD" },
-       { 0x14, "SCC" },
-       { 0x15, "SCC_NB" },
-       { 0x16, "SEC" },
-       { 0x17, "SSYNC" },
-       { 0x18, "GR_CE" },
-       { 0x19, "CE2" },
-       { 0x1a, "XV" },
-       { 0x1b, "MMU_NB" },
-       { 0x1c, "MSENC" },
-       { 0x1d, "DFALCON" },
-       { 0x1e, "SKED" },
-       { 0x1f, "AFALCON" },
-       {}
-};
-
-static const struct nvkm_enum
-gk104_fifo_fault_gpcclient[] = {
-       { 0x00, "L1_0" }, { 0x01, "T1_0" }, { 0x02, "PE_0" },
-       { 0x03, "L1_1" }, { 0x04, "T1_1" }, { 0x05, "PE_1" },
-       { 0x06, "L1_2" }, { 0x07, "T1_2" }, { 0x08, "PE_2" },
-       { 0x09, "L1_3" }, { 0x0a, "T1_3" }, { 0x0b, "PE_3" },
-       { 0x0c, "RAST" },
-       { 0x0d, "GCC" },
-       { 0x0e, "GPCCS" },
-       { 0x0f, "PROP_0" },
-       { 0x10, "PROP_1" },
-       { 0x11, "PROP_2" },
-       { 0x12, "PROP_3" },
-       { 0x13, "L1_4" }, { 0x14, "T1_4" }, { 0x15, "PE_4" },
-       { 0x16, "L1_5" }, { 0x17, "T1_5" }, { 0x18, "PE_5" },
-       { 0x19, "L1_6" }, { 0x1a, "T1_6" }, { 0x1b, "PE_6" },
-       { 0x1c, "L1_7" }, { 0x1d, "T1_7" }, { 0x1e, "PE_7" },
-       { 0x1f, "GPM" },
-       { 0x20, "LTP_UTLB_0" },
-       { 0x21, "LTP_UTLB_1" },
-       { 0x22, "LTP_UTLB_2" },
-       { 0x23, "LTP_UTLB_3" },
-       { 0x24, "GPC_RGG_UTLB" },
-       {}
-};
-
 static void
 gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
 {
@@ -390,14 +300,14 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
        struct nvkm_engine *engine = NULL;
        struct nvkm_fifo_chan *chan;
        unsigned long flags;
-       char gpcid[8] = "";
+       char gpcid[8] = "", en[16] = "";
 
-       er = nvkm_enum_find(gk104_fifo_fault_reason, reason);
-       eu = nvkm_enum_find(gk104_fifo_fault_engine, unit);
+       er = nvkm_enum_find(fifo->func->fault.reason, reason);
+       eu = nvkm_enum_find(fifo->func->fault.engine, unit);
        if (hub) {
-               ec = nvkm_enum_find(gk104_fifo_fault_hubclient, client);
+               ec = nvkm_enum_find(fifo->func->fault.hubclient, client);
        } else {
-               ec = nvkm_enum_find(gk104_fifo_fault_gpcclient, client);
+               ec = nvkm_enum_find(fifo->func->fault.gpcclient, client);
                snprintf(gpcid, sizeof(gpcid), "GPC%d/", gpc);
        }
 
@@ -418,13 +328,27 @@ gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
                }
        }
 
+       if (eu == NULL) {
+               enum nvkm_devidx engidx = nvkm_top_fault(device->top, unit);
+               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);
+               }
+       } else {
+               snprintf(en, sizeof(en), "%s", eu->name);
+       }
+
        chan = nvkm_fifo_chan_inst(&fifo->base, (u64)inst << 12, &flags);
 
        nvkm_error(subdev,
                   "%s fault at %010llx engine %02x [%s] client %02x [%s%s] "
                   "reason %02x [%s] on channel %d [%010llx %s]\n",
                   write ? "write" : "read", (u64)vahi << 32 | valo,
-                  unit, eu ? eu->name : "", client, gpcid, ec ? ec->name : "",
+                  unit, en, client, gpcid, ec ? ec->name : "",
                   reason, er ? er->name : "", chan ? chan->chid : -1,
                   (u64)inst << 12,
                   chan ? chan->object.client->name : "unknown");
@@ -557,7 +481,7 @@ gk104_fifo_intr_engine(struct gk104_fifo *fifo)
        nvkm_fifo_uevent(&fifo->base);
 }
 
-void
+static void
 gk104_fifo_intr(struct nvkm_fifo *base)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
@@ -649,7 +573,7 @@ gk104_fifo_intr(struct nvkm_fifo *base)
        }
 }
 
-void
+static void
 gk104_fifo_fini(struct nvkm_fifo *base)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
@@ -659,13 +583,15 @@ gk104_fifo_fini(struct nvkm_fifo *base)
        nvkm_mask(device, 0x002140, 0x10000000, 0x10000000);
 }
 
-int
+static int
 gk104_fifo_oneinit(struct nvkm_fifo *base)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
        struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
        struct nvkm_device *device = subdev->device;
-       int ret, i;
+       struct nvkm_top *top = device->top;
+       int engn, runl, pbid, ret, i, j;
+       enum nvkm_devidx engidx;
        u32 *map;
 
        /* Determine number of PBDMAs by checking valid enable bits. */
@@ -680,86 +606,26 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
        for (i = 0; i < fifo->pbdma_nr; i++)
                map[i] = nvkm_rd32(device, 0x002390 + (i * 0x04));
 
-       /* Read device topology from HW. */
-       for (i = 0; i < 64; i++) {
-               int type = -1, pbid = -1, engidx = -1;
-               int engn = -1, runl = -1, intr = -1, mcen = -1;
-               int fault = -1, j;
-               u32 data, addr = 0;
-
-               do {
-                       data = nvkm_rd32(device, 0x022700 + (i * 0x04));
-                       nvkm_trace(subdev, "%02x: %08x\n", i, data);
-                       switch (data & 0x00000003) {
-                       case 0x00000000: /* NOT_VALID */
-                               continue;
-                       case 0x00000001: /* DATA */
-                               addr  = (data & 0x00fff000);
-                               fault = (data & 0x000000f8) >> 3;
-                               break;
-                       case 0x00000002: /* ENUM */
-                               if (data & 0x00000020)
-                                       engn = (data & 0x3c000000) >> 26;
-                               if (data & 0x00000010)
-                                       runl = (data & 0x01e00000) >> 21;
-                               if (data & 0x00000008)
-                                       intr = (data & 0x000f8000) >> 15;
-                               if (data & 0x00000004)
-                                       mcen = (data & 0x00003e00) >> 9;
-                               break;
-                       case 0x00000003: /* ENGINE_TYPE */
-                               type = (data & 0x7ffffffc) >> 2;
-                               break;
-                       }
-               } while ((data & 0x80000000) && ++i < 64);
-
-               if (!data)
-                       continue;
-
+       /* Determine runlist configuration from topology device info. */
+       i = 0;
+       while ((int)(engidx = nvkm_top_engine(top, i++, &runl, &engn)) >= 0) {
                /* Determine which PBDMA handles requests for this engine. */
-               for (j = 0; runl >= 0 && j < fifo->pbdma_nr; j++) {
+               for (j = 0, pbid = -1; j < fifo->pbdma_nr; j++) {
                        if (map[j] & (1 << runl)) {
                                pbid = j;
                                break;
                        }
                }
 
-               /* Translate engine type to NVKM engine identifier. */
-               switch (type) {
-               case 0x00000000: engidx = NVKM_ENGINE_GR; break;
-               case 0x00000001: engidx = NVKM_ENGINE_CE0; break;
-               case 0x00000002: engidx = NVKM_ENGINE_CE1; break;
-               case 0x00000003: engidx = NVKM_ENGINE_CE2; break;
-               case 0x00000008: engidx = NVKM_ENGINE_MSPDEC; break;
-               case 0x00000009: engidx = NVKM_ENGINE_MSPPP; break;
-               case 0x0000000a: engidx = NVKM_ENGINE_MSVLD; break;
-               case 0x0000000b: engidx = NVKM_ENGINE_MSENC; break;
-               case 0x0000000c: engidx = NVKM_ENGINE_VIC; break;
-               case 0x0000000d: engidx = NVKM_ENGINE_SEC; break;
-               case 0x0000000e: engidx = NVKM_ENGINE_NVENC0; break;
-               case 0x0000000f: engidx = NVKM_ENGINE_NVENC1; break;
-               case 0x00000010: engidx = NVKM_ENGINE_NVDEC; break;
-                       break;
-               default:
-                       break;
-               }
+               nvkm_debug(subdev, "engine %2d: runlist %2d pbdma %2d\n",
+                          engn, runl, pbid);
 
-               nvkm_debug(subdev, "%02x (%8s): engine %2d runlist %2d "
-                                  "pbdma %2d intr %2d reset %2d "
-                                  "fault %2d addr %06x\n", type,
-                          engidx < 0 ? NULL : nvkm_subdev_name[engidx],
-                          engn, runl, pbid, intr, mcen, fault, addr);
-
-               /* Mark the engine as supported if everything checks out. */
-               if (engn >= 0 && runl >= 0) {
-                       fifo->engine[engn].engine = engidx < 0 ? NULL :
-                               nvkm_device_engine(device, engidx);
-                       fifo->engine[engn].runl = runl;
-                       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->engine[engn].engine = nvkm_device_engine(device, engidx);
+               fifo->engine[engn].runl = runl;
+               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);
        }
 
        kfree(map);
@@ -796,7 +662,7 @@ gk104_fifo_oneinit(struct nvkm_fifo *base)
        return 0;
 }
 
-void
+static void
 gk104_fifo_init(struct nvkm_fifo *base)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
@@ -825,7 +691,7 @@ gk104_fifo_init(struct nvkm_fifo *base)
        nvkm_wr32(device, 0x002140, 0x7fffffff);
 }
 
-void *
+static void *
 gk104_fifo_dtor(struct nvkm_fifo *base)
 {
        struct gk104_fifo *fifo = gk104_fifo(base);
@@ -842,29 +708,154 @@ gk104_fifo_dtor(struct nvkm_fifo *base)
        return fifo;
 }
 
+static const struct nvkm_fifo_func
+gk104_fifo_ = {
+       .dtor = gk104_fifo_dtor,
+       .oneinit = gk104_fifo_oneinit,
+       .init = gk104_fifo_init,
+       .fini = gk104_fifo_fini,
+       .intr = gk104_fifo_intr,
+       .uevent_init = gk104_fifo_uevent_init,
+       .uevent_fini = gk104_fifo_uevent_fini,
+       .class_get = gk104_fifo_class_get,
+};
+
 int
-gk104_fifo_new_(const struct nvkm_fifo_func *func, struct nvkm_device *device,
+gk104_fifo_new_(const struct gk104_fifo_func *func, struct nvkm_device *device,
                int index, int nr, struct nvkm_fifo **pfifo)
 {
        struct gk104_fifo *fifo;
 
        if (!(fifo = kzalloc(sizeof(*fifo), GFP_KERNEL)))
                return -ENOMEM;
+       fifo->func = func;
        INIT_WORK(&fifo->recover.work, gk104_fifo_recover_work);
        *pfifo = &fifo->base;
 
-       return nvkm_fifo_ctor(func, device, index, nr, &fifo->base);
+       return nvkm_fifo_ctor(&gk104_fifo_, device, index, nr, &fifo->base);
 }
 
-static const struct nvkm_fifo_func
+const struct nvkm_enum
+gk104_fifo_fault_engine[] = {
+       { 0x00, "GR", NULL, NVKM_ENGINE_GR },
+       { 0x01, "DISPLAY" },
+       { 0x02, "CAPTURE" },
+       { 0x03, "IFB", NULL, NVKM_ENGINE_IFB },
+       { 0x04, "BAR1", NULL, NVKM_SUBDEV_BAR },
+       { 0x05, "BAR2", NULL, NVKM_SUBDEV_INSTMEM },
+       { 0x06, "SCHED" },
+       { 0x07, "HOST0" },
+       { 0x08, "HOST1" },
+       { 0x09, "HOST2" },
+       { 0x0a, "HOST3" },
+       { 0x0b, "HOST4" },
+       { 0x0c, "HOST5" },
+       { 0x0d, "HOST6" },
+       { 0x0e, "HOST7" },
+       { 0x0f, "HOSTSR" },
+       { 0x10, "MSVLD", NULL, NVKM_ENGINE_MSVLD },
+       { 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 },
+       { 0x17, "PMU" },
+       { 0x18, "PTP" },
+       { 0x19, "MSENC", NULL, NVKM_ENGINE_MSENC },
+       { 0x1b, "CE2", NULL, NVKM_ENGINE_CE2 },
+       {}
+};
+
+const struct nvkm_enum
+gk104_fifo_fault_reason[] = {
+       { 0x00, "PDE" },
+       { 0x01, "PDE_SIZE" },
+       { 0x02, "PTE" },
+       { 0x03, "VA_LIMIT_VIOLATION" },
+       { 0x04, "UNBOUND_INST_BLOCK" },
+       { 0x05, "PRIV_VIOLATION" },
+       { 0x06, "RO_VIOLATION" },
+       { 0x07, "WO_VIOLATION" },
+       { 0x08, "PITCH_MASK_VIOLATION" },
+       { 0x09, "WORK_CREATION" },
+       { 0x0a, "UNSUPPORTED_APERTURE" },
+       { 0x0b, "COMPRESSION_FAILURE" },
+       { 0x0c, "UNSUPPORTED_KIND" },
+       { 0x0d, "REGION_VIOLATION" },
+       { 0x0e, "BOTH_PTES_VALID" },
+       { 0x0f, "INFO_TYPE_POISONED" },
+       {}
+};
+
+const struct nvkm_enum
+gk104_fifo_fault_hubclient[] = {
+       { 0x00, "VIP" },
+       { 0x01, "CE0" },
+       { 0x02, "CE1" },
+       { 0x03, "DNISO" },
+       { 0x04, "FE" },
+       { 0x05, "FECS" },
+       { 0x06, "HOST" },
+       { 0x07, "HOST_CPU" },
+       { 0x08, "HOST_CPU_NB" },
+       { 0x09, "ISO" },
+       { 0x0a, "MMU" },
+       { 0x0b, "MSPDEC" },
+       { 0x0c, "MSPPP" },
+       { 0x0d, "MSVLD" },
+       { 0x0e, "NISO" },
+       { 0x0f, "P2P" },
+       { 0x10, "PD" },
+       { 0x11, "PERF" },
+       { 0x12, "PMU" },
+       { 0x13, "RASTERTWOD" },
+       { 0x14, "SCC" },
+       { 0x15, "SCC_NB" },
+       { 0x16, "SEC" },
+       { 0x17, "SSYNC" },
+       { 0x18, "GR_CE" },
+       { 0x19, "CE2" },
+       { 0x1a, "XV" },
+       { 0x1b, "MMU_NB" },
+       { 0x1c, "MSENC" },
+       { 0x1d, "DFALCON" },
+       { 0x1e, "SKED" },
+       { 0x1f, "AFALCON" },
+       {}
+};
+
+const struct nvkm_enum
+gk104_fifo_fault_gpcclient[] = {
+       { 0x00, "L1_0" }, { 0x01, "T1_0" }, { 0x02, "PE_0" },
+       { 0x03, "L1_1" }, { 0x04, "T1_1" }, { 0x05, "PE_1" },
+       { 0x06, "L1_2" }, { 0x07, "T1_2" }, { 0x08, "PE_2" },
+       { 0x09, "L1_3" }, { 0x0a, "T1_3" }, { 0x0b, "PE_3" },
+       { 0x0c, "RAST" },
+       { 0x0d, "GCC" },
+       { 0x0e, "GPCCS" },
+       { 0x0f, "PROP_0" },
+       { 0x10, "PROP_1" },
+       { 0x11, "PROP_2" },
+       { 0x12, "PROP_3" },
+       { 0x13, "L1_4" }, { 0x14, "T1_4" }, { 0x15, "PE_4" },
+       { 0x16, "L1_5" }, { 0x17, "T1_5" }, { 0x18, "PE_5" },
+       { 0x19, "L1_6" }, { 0x1a, "T1_6" }, { 0x1b, "PE_6" },
+       { 0x1c, "L1_7" }, { 0x1d, "T1_7" }, { 0x1e, "PE_7" },
+       { 0x1f, "GPM" },
+       { 0x20, "LTP_UTLB_0" },
+       { 0x21, "LTP_UTLB_1" },
+       { 0x22, "LTP_UTLB_2" },
+       { 0x23, "LTP_UTLB_3" },
+       { 0x24, "GPC_RGG_UTLB" },
+       {}
+};
+
+static const struct gk104_fifo_func
 gk104_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gk104_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gk104_fifo_gpfifo_oclass,
                NULL
index 9e5d00ba34a219bd6c3b9808783a4168f80c8c37..679f3ec311e9bf2558f33ceee7e4a26ca33031f6 100644 (file)
@@ -3,10 +3,12 @@
 #define gk104_fifo(p) container_of((p), struct gk104_fifo, base)
 #include "priv.h"
 
+#include <core/enum.h>
 #include <subdev/mmu.h>
 
 struct gk104_fifo_chan;
 struct gk104_fifo {
+       const struct gk104_fifo_func *func;
        struct nvkm_fifo base;
 
        struct {
@@ -39,15 +41,19 @@ struct gk104_fifo {
        } user;
 };
 
-int gk104_fifo_new_(const struct nvkm_fifo_func *, struct nvkm_device *,
+struct gk104_fifo_func {
+       struct {
+               const struct nvkm_enum *engine;
+               const struct nvkm_enum *reason;
+               const struct nvkm_enum *hubclient;
+               const struct nvkm_enum *gpcclient;
+       } fault;
+
+       const struct nvkm_fifo_chan_oclass *chan[];
+};
+
+int gk104_fifo_new_(const struct gk104_fifo_func *, struct nvkm_device *,
                    int index, int nr, struct nvkm_fifo **);
-void *gk104_fifo_dtor(struct nvkm_fifo *);
-int gk104_fifo_oneinit(struct nvkm_fifo *);
-void gk104_fifo_init(struct nvkm_fifo *);
-void gk104_fifo_fini(struct nvkm_fifo *);
-void gk104_fifo_intr(struct nvkm_fifo *);
-void gk104_fifo_uevent_init(struct nvkm_fifo *);
-void gk104_fifo_uevent_fini(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 *);
 void gk104_fifo_runlist_commit(struct gk104_fifo *, int runl);
@@ -70,4 +76,11 @@ gk104_fifo_engine_subdev(int engine)
                return 0;
        }
 }
+
+extern const struct nvkm_enum gk104_fifo_fault_engine[];
+extern const struct nvkm_enum gk104_fifo_fault_reason[];
+extern const struct nvkm_enum gk104_fifo_fault_hubclient[];
+extern const struct nvkm_enum gk104_fifo_fault_gpcclient[];
+
+extern const struct nvkm_enum gm107_fifo_fault_engine[];
 #endif
index 41307fcd4bb30460cdaf4995b71af4e2ecd8e86e..b2f8ab7bf84711936618a804869bf0e49eb2bfcc 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+static const struct gk104_fifo_func
 gk110_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gk104_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gk110_fifo_gpfifo_oclass,
                NULL
index ce01c1a7d41cb3a7b396498495da39b986c298ec..160617d376e4876c0f04628655118761ca8d3da2 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+static const struct gk104_fifo_func
 gk208_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gk104_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gk104_fifo_gpfifo_oclass,
                NULL
index b47fe98f41818ab7105abbb237577f1665932268..be9f5c16ed7dd1e3aa1e168ac56bc940ebfd49e0 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+static const struct gk104_fifo_func
 gk20a_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gk104_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gk104_fifo_gpfifo_oclass,
                NULL
index 6d59d65794a19c112b99c1c21f01f48f90ed38b4..bd1ff877aa0687c70193faba68659af5ce08856e 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+const struct nvkm_enum
+gm107_fifo_fault_engine[] = {
+       { 0x01, "DISPLAY" },
+       { 0x02, "CAPTURE" },
+       { 0x03, "IFB", NULL, NVKM_ENGINE_IFB },
+       { 0x04, "BAR1", NULL, NVKM_SUBDEV_BAR },
+       { 0x05, "BAR2", NULL, NVKM_SUBDEV_INSTMEM },
+       { 0x06, "SCHED" },
+       { 0x07, "HOST0" },
+       { 0x08, "HOST1" },
+       { 0x09, "HOST2" },
+       { 0x0a, "HOST3" },
+       { 0x0b, "HOST4" },
+       { 0x0c, "HOST5" },
+       { 0x0d, "HOST6" },
+       { 0x0e, "HOST7" },
+       { 0x0f, "HOSTSR" },
+       { 0x13, "PERF" },
+       { 0x17, "PMU" },
+       { 0x18, "PTP" },
+       {}
+};
+
+static const struct gk104_fifo_func
 gm107_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gm107_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gk110_fifo_gpfifo_oclass,
                NULL
index 4bdd43078df94e6483bf46011e2168e7303deb48..b069f785c5d8b51e9ee7bda88a504312508afaf2 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+static const struct gk104_fifo_func
 gm200_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gm107_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gm200_fifo_gpfifo_oclass,
                NULL
index 4c91d4aa1e9e92d73bebf9b78fd70229a4a9f30f..2ed87c2e829966767d83b9f4ab03c97e4a61c0c2 100644 (file)
 #include "gk104.h"
 #include "changk104.h"
 
-static const struct nvkm_fifo_func
+static const struct gk104_fifo_func
 gm20b_fifo = {
-       .dtor = gk104_fifo_dtor,
-       .oneinit = gk104_fifo_oneinit,
-       .init = gk104_fifo_init,
-       .fini = gk104_fifo_fini,
-       .intr = gk104_fifo_intr,
-       .uevent_init = gk104_fifo_uevent_init,
-       .uevent_fini = gk104_fifo_uevent_fini,
+       .fault.engine = gm107_fifo_fault_engine,
+       .fault.reason = gk104_fifo_fault_reason,
+       .fault.hubclient = gk104_fifo_fault_hubclient,
+       .fault.gpcclient = gk104_fifo_fault_gpcclient,
        .chan = {
                &gm200_fifo_gpfifo_oclass,
                NULL
index cb1432e9be08ca6bbb618bccf584759a10b1bb1c..f6dfb37d94296378c65d368650fa07d9f8cad83a 100644 (file)
@@ -7,6 +7,7 @@ int nvkm_fifo_ctor(const struct nvkm_fifo_func *, struct nvkm_device *,
                   int index, int nr, struct nvkm_fifo *);
 void nvkm_fifo_uevent(struct nvkm_fifo *);
 
+struct nvkm_fifo_chan_oclass;
 struct nvkm_fifo_func {
        void *(*dtor)(struct nvkm_fifo *);
        int (*oneinit)(struct nvkm_fifo *);
@@ -17,6 +18,8 @@ struct nvkm_fifo_func {
        void (*start)(struct nvkm_fifo *, unsigned long *);
        void (*uevent_init)(struct nvkm_fifo *);
        void (*uevent_fini)(struct nvkm_fifo *);
+       int (*class_get)(struct nvkm_fifo *, int index,
+                        const struct nvkm_fifo_chan_oclass **);
        const struct nvkm_fifo_chan_oclass *chan[];
 };
 
index 090765ff070debcb2f33e9361f6dc27c20576caa..467065d1b4e6464d202bbe996d33d4cc6a56b52f 100644 (file)
@@ -128,9 +128,8 @@ nvkm_gr = {
 
 int
 nvkm_gr_ctor(const struct nvkm_gr_func *func, struct nvkm_device *device,
-            int index, u32 pmc_enable, bool enable, struct nvkm_gr *gr)
+            int index, bool enable, struct nvkm_gr *gr)
 {
        gr->func = func;
-       return nvkm_engine_ctor(&nvkm_gr, device, index, pmc_enable,
-                               enable, &gr->engine);
+       return nvkm_engine_ctor(&nvkm_gr, device, index, enable, &gr->engine);
 }
index 56f392d3d4fdc0cecf7726a0cdec91e5ea81e80a..b02d8f50ea6aff4549a27b3e3917da5b4731b883 100644 (file)
@@ -1181,20 +1181,20 @@ gf100_grctx_generate_r418bb8(struct gf100_gr *gr)
 
        /* GPC_BROADCAST */
        nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr);
+                                    gr->screen_tile_row_offset);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
 
        /* GPC_BROADCAST.TP_BROADCAST */
        nvkm_wr32(device, 0x419bd0, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr | data2[0]);
+                                    gr->screen_tile_row_offset | data2[0]);
        nvkm_wr32(device, 0x419be4, data2[1]);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x419b00 + (i * 4), data[i]);
 
        /* UNK78xx */
        nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr);
+                                    gr->screen_tile_row_offset);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
 }
@@ -1238,6 +1238,7 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
+       u32 idle_timeout;
 
        nvkm_mc_unk260(device->mc, 0);
 
@@ -1247,7 +1248,7 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gf100_gr_mmio(gr, grctx->tpc);
        gf100_gr_mmio(gr, grctx->ppc);
 
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->bundle(info);
        grctx->pagepool(info);
@@ -1261,7 +1262,7 @@ gf100_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gf100_grctx_generate_r406800(gr);
 
        gf100_gr_icmd(gr, grctx->icmd);
-       nvkm_wr32(device, 0x404154, 0x00000400);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_mthd(gr, grctx->mthd);
        nvkm_mc_unk260(device->mc, 1);
 }
index 3c8673958f22b6d26aca007844e733883e2b8ce8..ac895edce164558fff1893405aef32f5cbf486ff 100644 (file)
@@ -81,8 +81,6 @@ void gk104_grctx_generate_bundle(struct gf100_grctx *);
 void gk104_grctx_generate_pagepool(struct gf100_grctx *);
 void gk104_grctx_generate_unkn(struct gf100_gr *);
 void gk104_grctx_generate_r418bb8(struct gf100_gr *);
-void gk104_grctx_generate_rop_active_fbps(struct gf100_gr *);
-
 
 void gm107_grctx_generate_bundle(struct gf100_grctx *);
 void gm107_grctx_generate_pagepool(struct gf100_grctx *);
@@ -98,7 +96,6 @@ void gm107_grctx_generate_pagepool(struct gf100_grctx *);
 void gm107_grctx_generate_attrib(struct gf100_grctx *);
 
 extern const struct gf100_grctx_func gm200_grctx;
-void gm200_grctx_generate_main(struct gf100_gr *, struct gf100_grctx *);
 void gm200_grctx_generate_tpcid(struct gf100_gr *);
 void gm200_grctx_generate_405b60(struct gf100_gr *);
 
index 74de7a96c22afea939059db4a20ebc5adef162e1..f521de11a299f3cdaac3241fbb62f101ce653dc1 100644 (file)
@@ -223,6 +223,7 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
+       u32 idle_timeout;
        int i;
 
        nvkm_mc_unk260(device->mc, 0);
@@ -233,7 +234,7 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gf100_gr_mmio(gr, grctx->tpc);
        gf100_gr_mmio(gr, grctx->ppc);
 
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->bundle(info);
        grctx->pagepool(info);
@@ -250,7 +251,7 @@ gf117_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
                nvkm_wr32(device, 0x4064d0 + (i * 0x04), 0x00000000);
 
        gf100_gr_icmd(gr, grctx->icmd);
-       nvkm_wr32(device, 0x404154, 0x00000400);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_mthd(gr, grctx->mthd);
        nvkm_mc_unk260(device->mc, 1);
 }
index a843e3689c3c46e59b5f5aef940841be62807ba0..9ba337778ef550ac0d7ab270f8f8f32105dba54b 100644 (file)
@@ -924,38 +924,30 @@ gk104_grctx_generate_r418bb8(struct gf100_gr *gr)
 
        /* GPC_BROADCAST */
        nvkm_wr32(device, 0x418bb8, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr);
+                                    gr->screen_tile_row_offset);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x418b08 + (i * 4), data[i]);
 
        /* GPC_BROADCAST.TP_BROADCAST */
        nvkm_wr32(device, 0x41bfd0, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr | data2[0]);
+                                    gr->screen_tile_row_offset | data2[0]);
        nvkm_wr32(device, 0x41bfe4, data2[1]);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x41bf00 + (i * 4), data[i]);
 
        /* UNK78xx */
        nvkm_wr32(device, 0x4078bc, (gr->tpc_total << 8) |
-                                gr->magic_not_rop_nr);
+                                    gr->screen_tile_row_offset);
        for (i = 0; i < 6; i++)
                nvkm_wr32(device, 0x40780c + (i * 4), data[i]);
 }
 
-void
-gk104_grctx_generate_rop_active_fbps(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       const u32 fbp_count = nvkm_rd32(device, 0x120074);
-       nvkm_mask(device, 0x408850, 0x0000000f, fbp_count); /* zrop */
-       nvkm_mask(device, 0x408958, 0x0000000f, fbp_count); /* crop */
-}
-
 void
 gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
+       u32 idle_timeout;
        int i;
 
        nvkm_mc_unk260(device->mc, 0);
@@ -966,7 +958,7 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gf100_gr_mmio(gr, grctx->tpc);
        gf100_gr_mmio(gr, grctx->ppc);
 
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->bundle(info);
        grctx->pagepool(info);
@@ -982,11 +974,10 @@ gk104_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
                nvkm_wr32(device, 0x4064d0 + (i * 0x04), 0x00000000);
 
        nvkm_wr32(device, 0x405b00, (gr->tpc_total << 8) | gr->gpc_nr);
-       gk104_grctx_generate_rop_active_fbps(gr);
        nvkm_mask(device, 0x419f78, 0x00000001, 0x00000000);
 
        gf100_gr_icmd(gr, grctx->icmd);
-       nvkm_wr32(device, 0x404154, 0x00000400);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_mthd(gr, grctx->mthd);
        nvkm_mc_unk260(device->mc, 1);
 
index ad0a6cfe7580d97a205882e07ed82d5882ef8efd..da7c35a6a3d20dadc5766860197801c887541303 100644 (file)
@@ -29,15 +29,14 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
-       int idle_timeout_save;
+       u32 idle_timeout;
        int i;
 
        gf100_gr_mmio(gr, gr->fuc_sw_ctx);
 
        gf100_gr_wait_idle(gr);
 
-       idle_timeout_save = nvkm_rd32(device, 0x404154);
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->attrib(info);
 
@@ -53,13 +52,11 @@ gk20a_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        nvkm_wr32(device, 0x405b00, (gr->tpc_total << 8) | gr->gpc_nr);
 
-       gk104_grctx_generate_rop_active_fbps(gr);
-
        nvkm_mask(device, 0x5044b0, 0x08000000, 0x08000000);
 
        gf100_gr_wait_idle(gr);
 
-       nvkm_wr32(device, 0x404154, idle_timeout_save);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_wait_idle(gr);
 
        gf100_gr_mthd(gr, gr->fuc_method);
index 95f59e3169f25c9e523d06034c64b83794107057..6d3c5011e18c98ddd6585529f22e5a6231b5710b 100644 (file)
@@ -920,13 +920,15 @@ gm107_grctx_generate_attrib(struct gf100_grctx *info)
                        const u32 bs = attrib * gr->ppc_tpc_nr[gpc][ppc];
                        const u32 u = 0x418ea0 + (n * 0x04);
                        const u32 o = PPC_UNIT(gpc, ppc, 0);
+                       if (!(gr->ppc_mask[gpc] & (1 << ppc)))
+                               continue;
                        mmio_wr32(info, o + 0xc0, bs);
                        mmio_wr32(info, o + 0xf4, bo);
                        bo += grctx->attrib_nr_max * gr->ppc_tpc_nr[gpc][ppc];
                        mmio_wr32(info, o + 0xe4, as);
                        mmio_wr32(info, o + 0xf8, ao);
                        ao += grctx->alpha_nr_max * gr->ppc_tpc_nr[gpc][ppc];
-                       mmio_wr32(info, u, ((bs / 3 /*XXX*/) << 16) | bs);
+                       mmio_wr32(info, u, ((bs / 3) << 16) | bs);
                }
        }
 }
@@ -957,6 +959,7 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
+       u32 idle_timeout;
        int i;
 
        gf100_gr_mmio(gr, grctx->hub);
@@ -965,7 +968,7 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gf100_gr_mmio(gr, grctx->tpc);
        gf100_gr_mmio(gr, grctx->ppc);
 
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->bundle(info);
        grctx->pagepool(info);
@@ -984,10 +987,8 @@ gm107_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        nvkm_wr32(device, 0x405b00, (gr->tpc_total << 8) | gr->gpc_nr);
 
-       gk104_grctx_generate_rop_active_fbps(gr);
-
        gf100_gr_icmd(gr, grctx->icmd);
-       nvkm_wr32(device, 0x404154, 0x00000400);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_mthd(gr, grctx->mthd);
 
        nvkm_mask(device, 0x419e00, 0x00808080, 0x00808080);
index e586699fc43f89608f11cdd971163e680f80f4ac..db209d33f48648e307be0d3c5fa3e6e156c62fbf 100644 (file)
@@ -33,7 +33,7 @@ gm200_grctx_generate_tpcid(struct gf100_gr *gr)
        struct nvkm_device *device = gr->base.engine.subdev.device;
        int gpc, tpc, id;
 
-       for (tpc = 0, id = 0; tpc < 4; tpc++) {
+       for (tpc = 0, id = 0; tpc < TPC_MAX_PER_GPC; tpc++) {
                for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                        if (tpc < gr->tpc_nr[gpc]) {
                                nvkm_wr32(device, TPC_UNIT(gpc, tpc, 0x698), id);
@@ -45,15 +45,6 @@ gm200_grctx_generate_tpcid(struct gf100_gr *gr)
        }
 }
 
-static void
-gm200_grctx_generate_rop_active_fbps(struct gf100_gr *gr)
-{
-       struct nvkm_device *device = gr->base.engine.subdev.device;
-       const u32 fbp_count = nvkm_rd32(device, 0x12006c);
-       nvkm_mask(device, 0x408850, 0x0000000f, fbp_count); /* zrop */
-       nvkm_mask(device, 0x408958, 0x0000000f, fbp_count); /* crop */
-}
-
 void
 gm200_grctx_generate_405b60(struct gf100_gr *gr)
 {
@@ -86,17 +77,17 @@ gm200_grctx_generate_405b60(struct gf100_gr *gr)
                nvkm_wr32(device, 0x405ba0 + (i * 4), gpcs[i]);
 }
 
-void
+static void
 gm200_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
-       u32 tmp;
+       u32 idle_timeout, tmp;
        int i;
 
        gf100_gr_mmio(gr, gr->fuc_sw_ctx);
 
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->bundle(info);
        grctx->pagepool(info);
@@ -113,8 +104,6 @@ gm200_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        nvkm_wr32(device, 0x405b00, (gr->tpc_total << 8) | gr->gpc_nr);
 
-       gm200_grctx_generate_rop_active_fbps(gr);
-
        for (tmp = 0, i = 0; i < gr->gpc_nr; i++)
                tmp |= ((1 << gr->tpc_nr[i]) - 1) << (i * 4);
        nvkm_wr32(device, 0x4041c4, tmp);
@@ -122,7 +111,7 @@ gm200_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
        gm200_grctx_generate_405b60(gr);
 
        gf100_gr_icmd(gr, gr->fuc_bundle);
-       nvkm_wr32(device, 0x404154, 0x00000800);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_mthd(gr, gr->fuc_method);
 
        nvkm_mask(device, 0x418e94, 0xffffffff, 0xc4230000);
index a8827efa90ae18f0de690a97d2a01db135970654..e5702e3e0a5aa1f97c75576d77530085d55256b6 100644 (file)
@@ -40,15 +40,14 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const struct gf100_grctx_func *grctx = gr->func->grctx;
-       int idle_timeout_save;
+       u32 idle_timeout;
        int i, tmp;
 
        gf100_gr_mmio(gr, gr->fuc_sw_ctx);
 
        gf100_gr_wait_idle(gr);
 
-       idle_timeout_save = nvkm_rd32(device, 0x404154);
-       nvkm_wr32(device, 0x404154, 0x00000000);
+       idle_timeout = nvkm_mask(device, 0x404154, 0xffffffff, 0x00000000);
 
        grctx->attrib(info);
 
@@ -63,7 +62,6 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        nvkm_wr32(device, 0x405b00, (gr->tpc_total << 8) | gr->gpc_nr);
 
-       gk104_grctx_generate_rop_active_fbps(gr);
        nvkm_wr32(device, 0x408908, nvkm_rd32(device, 0x410108) | 0x80000000);
 
        for (tmp = 0, i = 0; i < gr->gpc_nr; i++)
@@ -74,7 +72,7 @@ gm20b_grctx_generate_main(struct gf100_gr *gr, struct gf100_grctx *info)
 
        gf100_gr_wait_idle(gr);
 
-       nvkm_wr32(device, 0x404154, idle_timeout_save);
+       nvkm_wr32(device, 0x404154, idle_timeout);
        gf100_gr_wait_idle(gr);
 
        gf100_gr_mthd(gr, gr->fuc_method);
index dc60509f76f7f85ba9f39eea8355f464c5277054..4984b0069dfda636b34c4a775b24a84874e01cfb 100644 (file)
@@ -291,12 +291,13 @@ init:
 // Main program loop, very simple, sleeps until woken up by the interrupt
 // handler, pulls a command from the queue and executes its handler
 //
-main:
-       bset $flags $p0
+wait:
        sleep $p0
+       bset $flags $p0
+main:
        mov $r13 #cmd_queue
        call(queue_get)
-       bra $p1 #main
+       bra $p1 #wait
 
        // 0x0000-0x0003 are all context transfers
        cmpu b32 $r14 0x04
index 5f4ddfee48a2d21c0ad6701d42179dc048512676..8cb240b65ec2003ba31e71d817d6a55ee3986e42 100644 (file)
@@ -370,9 +370,10 @@ uint32_t gf100_grgpc_code[] = {
        0xf11f29f0,
        0xf0080007,
        0x02d00203,
-/* 0x04bb: main */
+/* 0x04bb: wait */
        0xf404bd00,
-       0x28f40031,
+       0x31f40028,
+/* 0x04c1: main */
        0x1cd7f000,
        0xf43921f4,
        0xe4b0f401,
@@ -384,10 +385,10 @@ uint32_t gf100_grgpc_code[] = {
        0x0018fe05,
        0x05b421f5,
 /* 0x04eb: main_not_ctx_xfer */
-       0x94d30ef4,
+       0x94d90ef4,
        0xf5f010ef,
        0x7e21f501,
-       0xc60ef403,
+       0xcc0ef403,
 /* 0x04f8: ih */
        0x80f900f9,
        0xf90188fe,
index 03381b163cfc0225360f8b72870f5f60d150cbd2..550d6ba0933b5ffdf99a97eae9dc3838b3948285 100644 (file)
@@ -397,9 +397,10 @@ uint32_t gf117_grgpc_code[] = {
        0x080007f1,
        0xd00203f0,
        0x04bd0002,
-/* 0x0508: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0508: wait */
+       0xf40028f4,
+/* 0x050e: main */
+       0xd7f00031,
        0x3921f424,
        0xb0f401f4,
        0x18f404e4,
@@ -409,13 +410,13 @@ uint32_t gf117_grgpc_code[] = {
        0xfd01e4b6,
        0x18fe051e,
        0x0121f500,
-       0xd30ef406,
+       0xd90ef406,
 /* 0x0538: main_not_ctx_xfer */
        0xf010ef94,
        0x21f501f5,
        0x0ef4037e,
 /* 0x0545: ih */
-       0xf900f9c6,
+       0xf900f9cc,
        0x0188fe80,
        0x90f980f9,
        0xb0f9a0f9,
index 99d9b48a3b504b3b4a69099ec2291e81c2951c94..271b59d365e5478570b95ae5673307c970e4f812 100644 (file)
@@ -397,9 +397,10 @@ uint32_t gk104_grgpc_code[] = {
        0x080007f1,
        0xd00203f0,
        0x04bd0002,
-/* 0x0508: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0508: wait */
+       0xf40028f4,
+/* 0x050e: main */
+       0xd7f00031,
        0x3921f424,
        0xb0f401f4,
        0x18f404e4,
@@ -409,13 +410,13 @@ uint32_t gk104_grgpc_code[] = {
        0xfd01e4b6,
        0x18fe051e,
        0x0121f500,
-       0xd30ef406,
+       0xd90ef406,
 /* 0x0538: main_not_ctx_xfer */
        0xf010ef94,
        0x21f501f5,
        0x0ef4037e,
 /* 0x0545: ih */
-       0xf900f9c6,
+       0xf900f9cc,
        0x0188fe80,
        0x90f980f9,
        0xb0f9a0f9,
index f7267696cbfd49e18c05d57b217d1214ba6875d4..73b4a32c5d2903cd2f3fd5f10ccb953366031c4c 100644 (file)
@@ -397,9 +397,10 @@ uint32_t gk110_grgpc_code[] = {
        0x300007f1,
        0xd00203f0,
        0x04bd0002,
-/* 0x0508: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0508: wait */
+       0xf40028f4,
+/* 0x050e: main */
+       0xd7f00031,
        0x3921f424,
        0xb0f401f4,
        0x18f404e4,
@@ -409,13 +410,13 @@ uint32_t gk110_grgpc_code[] = {
        0xfd01e4b6,
        0x18fe051e,
        0x0121f500,
-       0xd30ef406,
+       0xd90ef406,
 /* 0x0538: main_not_ctx_xfer */
        0xf010ef94,
        0x21f501f5,
        0x0ef4037e,
 /* 0x0545: ih */
-       0xf900f9c6,
+       0xf900f9cc,
        0x0188fe80,
        0x90f980f9,
        0xb0f9a0f9,
index 387d1fa3e231b50465eb95a94b87b62021d0dca8..01816981831738d33446d7f9eda23c34f6507606 100644 (file)
@@ -349,9 +349,10 @@ uint32_t gk208_grgpc_code[] = {
        0x801f29f0,
        0xf6023000,
        0x04bd0002,
-/* 0x0448: main */
-       0xf40031f4,
-       0x240d0028,
+/* 0x0448: wait */
+       0xf40028f4,
+/* 0x044e: main */
+       0x240d0031,
        0x0000377e,
        0xb0f401f4,
        0x18f404e4,
@@ -362,10 +363,10 @@ uint32_t gk208_grgpc_code[] = {
        0x0018fe05,
        0x00051f7e,
 /* 0x0477: main_not_ctx_xfer */
-       0x94d40ef4,
+       0x94da0ef4,
        0xf5f010ef,
        0x02f87e01,
-       0xc70ef400,
+       0xcd0ef400,
 /* 0x0484: ih */
        0x80f900f9,
        0xf90188fe,
index fa9f3c0c599449eb4927aebfa369e53a1e9cd5ca..eca007f03fa9698b496d014fd5664f57a17fdaa0 100644 (file)
@@ -427,9 +427,10 @@ uint32_t gm107_grgpc_code[] = {
        0x1f29f024,
        0x02300080,
        0xbd0002f6,
-/* 0x0571: main */
-       0x0031f404,
-       0x0d0028f4,
+/* 0x0571: wait */
+       0x0028f404,
+/* 0x0577: main */
+       0x0d0031f4,
        0x00377e24,
        0xf401f400,
        0xf404e4b0,
@@ -439,13 +440,13 @@ uint32_t gm107_grgpc_code[] = {
        0xfd01e4b6,
        0x18fe051e,
        0x06487e00,
-       0xd40ef400,
+       0xda0ef400,
 /* 0x05a0: main_not_ctx_xfer */
        0xf010ef94,
        0xf87e01f5,
        0x0ef40002,
 /* 0x05ad: ih */
-       0xf900f9c7,
+       0xf900f9cd,
        0x0188fe80,
        0x90f980f9,
        0xb0f9a0f9,
index e3a2fb3082710095051a21feaca3a0ac5cda4778..4d416d4f82d759bd1a1004d804c894bfbdbf11f6 100644 (file)
@@ -218,13 +218,14 @@ init:
 // Main program loop, very simple, sleeps until woken up by the interrupt
 // handler, pulls a command from the queue and executes its handler
 //
-main:
+wait:
        // sleep until we have something to do
-       bset $flags $p0
        sleep $p0
+       bset $flags $p0
+main:
        mov $r13 #cmd_queue
        call(queue_get)
-       bra $p1 #main
+       bra $p1 #wait
 
        // context switch, requested by GPU?
        cmpu b32 $r14 0x4001
index 397921a9a46cf419b417535dbe7e20ff11bae846..8015b40a61d69de7863dac560b531b1dc3f090b3 100644 (file)
@@ -584,9 +584,10 @@ uint32_t gf100_grhub_code[] = {
        0x080007f1,
        0xd00203f0,
        0x04bd0001,
-/* 0x0564: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0564: wait */
+       0xf40028f4,
+/* 0x056a: main */
+       0xd7f00031,
        0x3921f410,
        0xb1f401f4,
        0xf54001e4,
@@ -650,7 +651,7 @@ uint32_t gf100_grhub_code[] = {
        0x170007f1,
        0xd00203f0,
        0x04bd0009,
-       0xff080ef5,
+       0xff0e0ef5,
 /* 0x0660: main_not_ctx_switch */
        0xf401e4b0,
        0xf2b90d1b,
@@ -675,12 +676,12 @@ uint32_t gf100_grhub_code[] = {
        0xf501f5f0,
        0xf5037e21,
 /* 0x06b3: main_done */
-       0xbdfeb50e,
+       0xbdfebb0e,
        0x1f29f024,
        0x080007f1,
        0xd00203f0,
        0x04bd0002,
-       0xfea00ef5,
+       0xfea60ef5,
 /* 0x06c8: ih */
        0x80f900f9,
        0xf90188fe,
index 50c97163dcdb0709f4127b7390c4edc6174d373b..2af90ec6852a0e5ab5f5514c1981153a61a91fc7 100644 (file)
@@ -584,9 +584,10 @@ uint32_t gf117_grhub_code[] = {
        0x080007f1,
        0xd00203f0,
        0x04bd0001,
-/* 0x0564: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0564: wait */
+       0xf40028f4,
+/* 0x056a: main */
+       0xd7f00031,
        0x3921f410,
        0xb1f401f4,
        0xf54001e4,
@@ -650,7 +651,7 @@ uint32_t gf117_grhub_code[] = {
        0x170007f1,
        0xd00203f0,
        0x04bd0009,
-       0xff080ef5,
+       0xff0e0ef5,
 /* 0x0660: main_not_ctx_switch */
        0xf401e4b0,
        0xf2b90d1b,
@@ -675,12 +676,12 @@ uint32_t gf117_grhub_code[] = {
        0xf501f5f0,
        0xf5037e21,
 /* 0x06b3: main_done */
-       0xbdfeb50e,
+       0xbdfebb0e,
        0x1f29f024,
        0x080007f1,
        0xd00203f0,
        0x04bd0002,
-       0xfea00ef5,
+       0xfea60ef5,
 /* 0x06c8: ih */
        0x80f900f9,
        0xf90188fe,
index 125824b394bbd632ec1c3dc2bcbf4a0683e0fd4c..e8b8c1c94700fc365e3187ec728365f4cf73d4af 100644 (file)
@@ -584,9 +584,10 @@ uint32_t gk104_grhub_code[] = {
        0x080007f1,
        0xd00203f0,
        0x04bd0001,
-/* 0x0564: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0564: wait */
+       0xf40028f4,
+/* 0x056a: main */
+       0xd7f00031,
        0x3921f410,
        0xb1f401f4,
        0xf54001e4,
@@ -650,7 +651,7 @@ uint32_t gk104_grhub_code[] = {
        0x170007f1,
        0xd00203f0,
        0x04bd0009,
-       0xff080ef5,
+       0xff0e0ef5,
 /* 0x0660: main_not_ctx_switch */
        0xf401e4b0,
        0xf2b90d1b,
@@ -675,12 +676,12 @@ uint32_t gk104_grhub_code[] = {
        0xf501f5f0,
        0xf5037e21,
 /* 0x06b3: main_done */
-       0xbdfeb50e,
+       0xbdfebb0e,
        0x1f29f024,
        0x080007f1,
        0xd00203f0,
        0x04bd0002,
-       0xfea00ef5,
+       0xfea60ef5,
 /* 0x06c8: ih */
        0x80f900f9,
        0xf90188fe,
index 0a1b8c0b8b828adaf87186a63327751dc7eff5d2..f4ed2fb6f714d3f8ddf202bf07fb8ebdf07e8898 100644 (file)
@@ -584,9 +584,10 @@ uint32_t gk110_grhub_code[] = {
        0x300007f1,
        0xd00203f0,
        0x04bd0001,
-/* 0x0564: main */
-       0xf40031f4,
-       0xd7f00028,
+/* 0x0564: wait */
+       0xf40028f4,
+/* 0x056a: main */
+       0xd7f00031,
        0x3921f410,
        0xb1f401f4,
        0xf54001e4,
@@ -650,7 +651,7 @@ uint32_t gk110_grhub_code[] = {
        0x170007f1,
        0xd00203f0,
        0x04bd0009,
-       0xff080ef5,
+       0xff0e0ef5,
 /* 0x0660: main_not_ctx_switch */
        0xf401e4b0,
        0xf2b90d1b,
@@ -675,12 +676,12 @@ uint32_t gk110_grhub_code[] = {
        0xf501f5f0,
        0xf5037e21,
 /* 0x06b3: main_done */
-       0xbdfeb50e,
+       0xbdfebb0e,
        0x1f29f024,
        0x300007f1,
        0xd00203f0,
        0x04bd0002,
-       0xfea00ef5,
+       0xfea60ef5,
 /* 0x06c8: ih */
        0x80f900f9,
        0xf90188fe,
index 16869d0b109b6dfdd56f20d873c53ec73d179eb1..ed488973c1179ddbf4365a6e7e014d0782dbb2a6 100644 (file)
@@ -531,9 +531,10 @@ uint32_t gk208_grhub_code[] = {
        0x1f19f014,
        0x02300080,
        0xbd0001f6,
-/* 0x0491: main */
-       0x0031f404,
-       0x0d0028f4,
+/* 0x0491: wait */
+       0x0028f404,
+/* 0x0497: main */
+       0x0d0031f4,
        0x00377e10,
        0xf401f400,
        0x4001e4b1,
@@ -590,7 +591,7 @@ uint32_t gk208_grhub_code[] = {
        0x09f60217,
        0xf504bd00,
 /* 0x056b: main_not_ctx_switch */
-       0xb0ff2a0e,
+       0xb0ff300e,
        0x1bf401e4,
        0x7ef2b20c,
        0xf4000820,
@@ -612,11 +613,11 @@ uint32_t gk208_grhub_code[] = {
        0x7e01f5f0,
        0xf50002f8,
 /* 0x05b7: main_done */
-       0xbdfede0e,
+       0xbdfee40e,
        0x1f29f024,
        0x02300080,
        0xbd0002f6,
-       0xcc0ef504,
+       0xd20ef504,
 /* 0x05c9: ih */
        0xf900f9fe,
        0x0188fe80,
index d6343d2a614cb6cf99590642078be89cccf505f8..5c9051839557f03cc5f90955763590b75ade6d57 100644 (file)
@@ -531,9 +531,10 @@ uint32_t gm107_grhub_code[] = {
        0x1f19f014,
        0x02300080,
        0xbd0001f6,
-/* 0x0491: main */
-       0x0031f404,
-       0x0d0028f4,
+/* 0x0491: wait */
+       0x0028f404,
+/* 0x0497: main */
+       0x0d0031f4,
        0x00377e10,
        0xf401f400,
        0x4001e4b1,
@@ -590,7 +591,7 @@ uint32_t gm107_grhub_code[] = {
        0x09f60217,
        0xf504bd00,
 /* 0x056b: main_not_ctx_switch */
-       0xb0ff2a0e,
+       0xb0ff300e,
        0x1bf401e4,
        0x7ef2b20c,
        0xf4000820,
@@ -612,11 +613,11 @@ uint32_t gm107_grhub_code[] = {
        0x7e01f5f0,
        0xf50002f8,
 /* 0x05b7: main_done */
-       0xbdfede0e,
+       0xbdfee40e,
        0x1f29f024,
        0x02300080,
        0xbd0002f6,
-       0xcc0ef504,
+       0xd20ef504,
 /* 0x05c9: ih */
        0xf900f9fe,
        0x0188fe80,
index b2de290da16feedf3834f31a32879ab315a586b5..9513badb8220e8dfa01f4fa5f129692507f90c01 100644 (file)
@@ -702,6 +702,13 @@ gf100_gr_pack_mmio[] = {
  * PGRAPH engine/subdev functions
  ******************************************************************************/
 
+int
+gf100_gr_rops(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       return (nvkm_rd32(device, 0x409604) & 0x001f0000) >> 16;
+}
+
 void
 gf100_gr_zbc_init(struct gf100_gr *gr)
 {
@@ -1609,32 +1616,12 @@ gf100_gr_oneinit(struct nvkm_gr *base)
 {
        struct gf100_gr *gr = gf100_gr(base);
        struct nvkm_device *device = gr->base.engine.subdev.device;
-       int ret, i, j;
+       int i, j;
 
        nvkm_pmu_pgob(device->pmu, false);
 
-       ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 256, false,
-                             &gr->unk4188b4);
-       if (ret)
-               return ret;
-
-       ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, 0x1000, 256, false,
-                             &gr->unk4188b8);
-       if (ret)
-               return ret;
-
-       nvkm_kmap(gr->unk4188b4);
-       for (i = 0; i < 0x1000; i += 4)
-               nvkm_wo32(gr->unk4188b4, i, 0x00000010);
-       nvkm_done(gr->unk4188b4);
-
-       nvkm_kmap(gr->unk4188b8);
-       for (i = 0; i < 0x1000; i += 4)
-               nvkm_wo32(gr->unk4188b8, i, 0x00000010);
-       nvkm_done(gr->unk4188b8);
-
-       gr->rop_nr = (nvkm_rd32(device, 0x409604) & 0x001f0000) >> 16;
-       gr->gpc_nr =  nvkm_rd32(device, 0x409604) & 0x0000001f;
+       gr->rop_nr = gr->func->rops(gr);
+       gr->gpc_nr = nvkm_rd32(device, 0x409604) & 0x0000001f;
        for (i = 0; i < gr->gpc_nr; i++) {
                gr->tpc_nr[i]  = nvkm_rd32(device, GPC_UNIT(i, 0x2608));
                gr->tpc_total += gr->tpc_nr[i];
@@ -1651,38 +1638,38 @@ gf100_gr_oneinit(struct nvkm_gr *base)
        switch (device->chipset) {
        case 0xc0:
                if (gr->tpc_total == 11) { /* 465, 3/4/4/0, 4 */
-                       gr->magic_not_rop_nr = 0x07;
+                       gr->screen_tile_row_offset = 0x07;
                } else
                if (gr->tpc_total == 14) { /* 470, 3/3/4/4, 5 */
-                       gr->magic_not_rop_nr = 0x05;
+                       gr->screen_tile_row_offset = 0x05;
                } else
                if (gr->tpc_total == 15) { /* 480, 3/4/4/4, 6 */
-                       gr->magic_not_rop_nr = 0x06;
+                       gr->screen_tile_row_offset = 0x06;
                }
                break;
        case 0xc3: /* 450, 4/0/0/0, 2 */
-               gr->magic_not_rop_nr = 0x03;
+               gr->screen_tile_row_offset = 0x03;
                break;
        case 0xc4: /* 460, 3/4/0/0, 4 */
-               gr->magic_not_rop_nr = 0x01;
+               gr->screen_tile_row_offset = 0x01;
                break;
        case 0xc1: /* 2/0/0/0, 1 */
-               gr->magic_not_rop_nr = 0x01;
+               gr->screen_tile_row_offset = 0x01;
                break;
        case 0xc8: /* 4/4/3/4, 5 */
-               gr->magic_not_rop_nr = 0x06;
+               gr->screen_tile_row_offset = 0x06;
                break;
        case 0xce: /* 4/4/0/0, 4 */
-               gr->magic_not_rop_nr = 0x03;
+               gr->screen_tile_row_offset = 0x03;
                break;
        case 0xcf: /* 4/0/0/0, 3 */
-               gr->magic_not_rop_nr = 0x03;
+               gr->screen_tile_row_offset = 0x03;
                break;
        case 0xd7:
        case 0xd9: /* 1/0/0/0, 1 */
        case 0xea: /* gk20a */
        case 0x12b: /* gm20b */
-               gr->magic_not_rop_nr = 0x01;
+               gr->screen_tile_row_offset = 0x01;
                break;
        }
 
@@ -1729,8 +1716,6 @@ gf100_gr_dtor(struct nvkm_gr *base)
        gf100_gr_dtor_init(gr->fuc_sw_ctx);
        gf100_gr_dtor_init(gr->fuc_sw_nonctx);
 
-       nvkm_memory_del(&gr->unk4188b8);
-       nvkm_memory_del(&gr->unk4188b4);
        return gr;
 }
 
@@ -1776,7 +1761,7 @@ gf100_gr_ctor(const struct gf100_gr_func *func, struct nvkm_device *device,
        gr->firmware = nvkm_boolopt(device->cfgopt, "NvGrUseFW",
                                    func->fecs.ucode == NULL);
 
-       ret = nvkm_gr_ctor(&gf100_gr_, device, index, 0x08001000,
+       ret = nvkm_gr_ctor(&gf100_gr_, device, index,
                           gr->firmware || func->fecs.ucode != NULL,
                           &gr->base);
        if (ret)
@@ -1815,6 +1800,7 @@ int
 gf100_gr_init(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
+       struct nvkm_fb *fb = device->fb;
        const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
        u32 data[TPC_MAX / 8] = {};
        u8  tpcnr[GPC_MAX];
@@ -1827,8 +1813,8 @@ gf100_gr_init(struct gf100_gr *gr)
        nvkm_wr32(device, GPC_BCAST(0x088c), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0890), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0894), 0x00000000);
-       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(gr->unk4188b8) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(fb->mmu_wr) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(fb->mmu_rd) >> 8);
 
        gf100_gr_mmio(gr, gr->func->mmio);
 
@@ -1851,9 +1837,9 @@ gf100_gr_init(struct gf100_gr *gr)
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
-                       gr->magic_not_rop_nr << 8 | gr->tpc_nr[gpc]);
+                         gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
-                       gr->tpc_total);
+                                                        gr->tpc_total);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
        }
 
@@ -1946,6 +1932,7 @@ gf100_gr = {
        .mmio = gf100_gr_pack_mmio,
        .fecs.ucode = &gf100_gr_fecs_ucode,
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .grctx = &gf100_grctx,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
index f0c6acb0f8fd56f32903bf627562fc08b6e87625..2b98abdb92703bec9b56f6834703c77c8d33510b 100644 (file)
@@ -31,7 +31,8 @@
 #include <subdev/mmu.h>
 
 #define GPC_MAX 32
-#define TPC_MAX (GPC_MAX * 8)
+#define TPC_MAX_PER_GPC 8
+#define TPC_MAX (GPC_MAX * TPC_MAX_PER_GPC)
 
 #define ROP_BCAST(r)      (0x408800 + (r))
 #define ROP_UNIT(u, r)    (0x410000 + (u) * 0x400 + (r))
@@ -100,15 +101,12 @@ struct gf100_gr {
        u8 ppc_mask[GPC_MAX];
        u8 ppc_tpc_nr[GPC_MAX][4];
 
-       struct nvkm_memory *unk4188b4;
-       struct nvkm_memory *unk4188b8;
-
        struct gf100_gr_data mmio_data[4];
        struct gf100_gr_mmio mmio_list[4096/8];
        u32  size;
        u32 *data;
 
-       u8 magic_not_rop_nr;
+       u8 screen_tile_row_offset;
 };
 
 int gf100_gr_ctor(const struct gf100_gr_func *, struct nvkm_device *,
@@ -121,6 +119,8 @@ struct gf100_gr_func {
        void (*dtor)(struct gf100_gr *);
        int (*init)(struct gf100_gr *);
        void (*init_gpc_mmu)(struct gf100_gr *);
+       void (*init_rop_active_fbps)(struct gf100_gr *);
+       void (*init_ppc_exceptions)(struct gf100_gr *);
        void (*set_hww_esr_report_mask)(struct gf100_gr *);
        const struct gf100_gr_pack *mmio;
        struct {
@@ -129,18 +129,23 @@ struct gf100_gr_func {
        struct {
                struct gf100_gr_ucode *ucode;
        } gpccs;
+       int (*rops)(struct gf100_gr *);
        int ppc_nr;
        const struct gf100_grctx_func *grctx;
        struct nvkm_sclass sclass[];
 };
 
 int gf100_gr_init(struct gf100_gr *);
+int gf100_gr_rops(struct gf100_gr *);
 
 int gk104_gr_init(struct gf100_gr *);
+void gk104_gr_init_rop_active_fbps(struct gf100_gr *);
+void gk104_gr_init_ppc_exceptions(struct gf100_gr *);
 
 int gk20a_gr_init(struct gf100_gr *);
 
 int gm200_gr_init(struct gf100_gr *);
+int gm200_gr_rops(struct gf100_gr *);
 
 #define gf100_gr_chan(p) container_of((p), struct gf100_gr_chan, object)
 
index 8f253e0a22f40c182773fcda1eaf80bd183ea5eb..d736dcd55ea2068f9119be1a261466f4d51bfd8b 100644 (file)
@@ -118,6 +118,7 @@ gf104_gr = {
        .mmio = gf104_gr_pack_mmio,
        .fecs.ucode = &gf100_gr_fecs_ucode,
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .grctx = &gf104_grctx,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
index 815a5aafa2457976d3bf5d9d22f28e73111c8d9f..2f0d24498427b779fc17e6f7ea23b04ef29fd901 100644 (file)
@@ -109,6 +109,7 @@ gf108_gr = {
        .mmio = gf108_gr_pack_mmio,
        .fecs.ucode = &gf100_gr_fecs_ucode,
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .grctx = &gf108_grctx,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
index d081ee41fc14eeef46112ab1a4b7a62a4dcbad8f..d1d942eb86af2cf191b22c01c79997599fe5247e 100644 (file)
@@ -90,6 +90,7 @@ gf110_gr = {
        .mmio = gf110_gr_pack_mmio,
        .fecs.ucode = &gf100_gr_fecs_ucode,
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .grctx = &gf110_grctx,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
index d8e8af4d3b300d6c5c6e1db6aa89013f53e33c01..70335f65c51efbe7d4b1293e9ef2ec2dd67e3279 100644 (file)
@@ -126,6 +126,7 @@ gf117_gr = {
        .mmio = gf117_gr_pack_mmio,
        .fecs.ucode = &gf117_gr_fecs_ucode,
        .gpccs.ucode = &gf117_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gf117_grctx,
        .sclass = {
index 01faf9a737749fa4014d89c1b6c9c2cf056a768d..8d8e4cafe28f8c0bead7f64bfc10ab115a776d6b 100644 (file)
@@ -181,6 +181,7 @@ gf119_gr = {
        .mmio = gf119_gr_pack_mmio,
        .fecs.ucode = &gf100_gr_fecs_ucode,
        .gpccs.ucode = &gf100_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .grctx = &gf119_grctx,
        .sclass = {
                { -1, -1, FERMI_TWOD_A },
index abf54928a1a44afefac30138392f6743cc21a583..ec22da6c99fc4863efbc8364749801338e383f6d 100644 (file)
@@ -24,6 +24,8 @@
 #include "gf100.h"
 #include "ctxgf100.h"
 
+#include <subdev/fb.h>
+
 #include <nvif/class.h>
 
 /*******************************************************************************
@@ -177,10 +179,35 @@ gk104_gr_pack_mmio[] = {
  * PGRAPH engine/subdev functions
  ******************************************************************************/
 
+void
+gk104_gr_init_rop_active_fbps(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       const u32 fbp_count = nvkm_rd32(device, 0x120074);
+       nvkm_mask(device, 0x408850, 0x0000000f, fbp_count); /* zrop */
+       nvkm_mask(device, 0x408958, 0x0000000f, fbp_count); /* crop */
+}
+
+void
+gk104_gr_init_ppc_exceptions(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       int gpc, ppc;
+
+       for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
+               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++) {
+                       if (!(gr->ppc_mask[gpc] & (1 << ppc)))
+                               continue;
+                       nvkm_wr32(device, PPC_UNIT(gpc, ppc, 0x038), 0xc0000000);
+               }
+       }
+}
+
 int
 gk104_gr_init(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
+       struct nvkm_fb *fb = device->fb;
        const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
        u32 data[TPC_MAX / 8] = {};
        u8  tpcnr[GPC_MAX];
@@ -193,8 +220,8 @@ gk104_gr_init(struct gf100_gr *gr)
        nvkm_wr32(device, GPC_BCAST(0x088c), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0890), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0894), 0x00000000);
-       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(gr->unk4188b8) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(fb->mmu_wr) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(fb->mmu_rd) >> 8);
 
        gf100_gr_mmio(gr, gr->func->mmio);
 
@@ -218,15 +245,17 @@ gk104_gr_init(struct gf100_gr *gr)
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
-                       gr->magic_not_rop_nr << 8 | gr->tpc_nr[gpc]);
+                         gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
-                       gr->tpc_total);
+                                                        gr->tpc_total);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
        }
 
        nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
        nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
 
+       gr->func->init_rop_active_fbps(gr);
+
        nvkm_wr32(device, 0x400500, 0x00010001);
 
        nvkm_wr32(device, 0x400100, 0xffffffff);
@@ -246,8 +275,9 @@ gk104_gr_init(struct gf100_gr *gr)
        nvkm_mask(device, 0x419cc0, 0x00000008, 0x00000008);
        nvkm_mask(device, 0x419eb4, 0x00001000, 0x00001000);
 
+       gr->func->init_ppc_exceptions(gr);
+
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               nvkm_wr32(device, GPC_UNIT(gpc, 0x3038), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0420), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0900), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x1028), 0xc0000000);
@@ -309,9 +339,12 @@ gk104_gr_gpccs_ucode = {
 static const struct gf100_gr_func
 gk104_gr = {
        .init = gk104_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
        .mmio = gk104_gr_pack_mmio,
        .fecs.ucode = &gk104_gr_fecs_ucode,
        .gpccs.ucode = &gk104_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gk104_grctx,
        .sclass = {
index 32aa2946e7b70731ca2a3f87e3e6f815978fa4d4..f31b171a4102d00db49b38a9e3db12cdc43295da 100644 (file)
@@ -183,9 +183,12 @@ gk110_gr_gpccs_ucode = {
 static const struct gf100_gr_func
 gk110_gr = {
        .init = gk104_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
        .mmio = gk110_gr_pack_mmio,
        .fecs.ucode = &gk110_gr_fecs_ucode,
        .gpccs.ucode = &gk110_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 2,
        .grctx = &gk110_grctx,
        .sclass = {
index 22f88afbf35fd3fb8fe1707d6feb5e95f437e739..d76dd178007fbc1a5eed220a663b2476187f438c 100644 (file)
@@ -103,9 +103,12 @@ gk110b_gr_pack_mmio[] = {
 static const struct gf100_gr_func
 gk110b_gr = {
        .init = gk104_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
        .mmio = gk110b_gr_pack_mmio,
        .fecs.ucode = &gk110_gr_fecs_ucode,
        .gpccs.ucode = &gk110_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 2,
        .grctx = &gk110b_grctx,
        .sclass = {
index ee7554fc87dc7ba921129be226a2378f551b4e86..14bbe6ed02a9ae4fc9cef9f1a8be5f9d53f4f8bf 100644 (file)
@@ -162,9 +162,12 @@ gk208_gr_gpccs_ucode = {
 static const struct gf100_gr_func
 gk208_gr = {
        .init = gk104_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
        .mmio = gk208_gr_pack_mmio,
        .fecs.ucode = &gk208_gr_fecs_ucode,
        .gpccs.ucode = &gk208_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gk208_grctx,
        .sclass = {
index 7ffb8a626196c82975bbf423e74ac6a9abf0c18f..4ca8ed15191c6ea158ef1bf8ef1cb6ed4a770661 100644 (file)
@@ -239,9 +239,6 @@ gk20a_gr_init(struct gf100_gr *gr)
                return ret;
 
        /* MMU debug buffer */
-       nvkm_wr32(device, 0x100cc8, nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, 0x100ccc, nvkm_memory_addr(gr->unk4188b8) >> 8);
-
        if (gr->func->init_gpc_mmu)
                gr->func->init_gpc_mmu(gr);
 
@@ -267,7 +264,7 @@ gk20a_gr_init(struct gf100_gr *gr)
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
-                         gr->magic_not_rop_nr << 8 | gr->tpc_nr[gpc]);
+                         gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
                          gr->tpc_total);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
@@ -275,6 +272,8 @@ gk20a_gr_init(struct gf100_gr *gr)
 
        nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
 
+       gr->func->init_rop_active_fbps(gr);
+
        /* Enable FIFO access */
        nvkm_wr32(device, 0x400500, 0x00010001);
 
@@ -312,7 +311,9 @@ gk20a_gr_init(struct gf100_gr *gr)
 static const struct gf100_gr_func
 gk20a_gr = {
        .init = gk20a_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
        .set_hww_esr_report_mask = gk20a_gr_set_hww_esr_report_mask,
+       .rops = gf100_gr_rops,
        .ppc_nr = 1,
        .grctx = &gk20a_grctx,
        .sclass = {
index 56e960212e5df280cd6c6a7b1e13cb6f0473852a..45f965f608a73787a7026768bb75ec611485439f 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <subdev/bios.h>
 #include <subdev/bios/P0260.h>
+#include <subdev/fb.h>
 
 #include <nvif/class.h>
 
@@ -311,17 +312,18 @@ int
 gm107_gr_init(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
+       struct nvkm_fb *fb = device->fb;
        const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
        u32 data[TPC_MAX / 8] = {};
        u8  tpcnr[GPC_MAX];
-       int gpc, tpc, ppc, rop;
+       int gpc, tpc, rop;
        int i;
 
        nvkm_wr32(device, GPC_BCAST(0x0880), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0890), 0x00000000);
        nvkm_wr32(device, GPC_BCAST(0x0894), 0x00000000);
-       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(gr->unk4188b8) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b4), nvkm_memory_addr(fb->mmu_wr) >> 8);
+       nvkm_wr32(device, GPC_BCAST(0x08b8), nvkm_memory_addr(fb->mmu_rd) >> 8);
 
        gf100_gr_mmio(gr, gr->func->mmio);
 
@@ -347,15 +349,17 @@ gm107_gr_init(struct gf100_gr *gr)
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
-                       gr->magic_not_rop_nr << 8 | gr->tpc_nr[gpc]);
+                         gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
-                       gr->tpc_total);
+                                                        gr->tpc_total);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
        }
 
        nvkm_wr32(device, GPC_BCAST(0x3fd4), magicgpc918);
        nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
 
+       gr->func->init_rop_active_fbps(gr);
+
        nvkm_wr32(device, 0x400500, 0x00010001);
 
        nvkm_wr32(device, 0x400100, 0xffffffff);
@@ -373,9 +377,9 @@ gm107_gr_init(struct gf100_gr *gr)
        nvkm_wr32(device, 0x405844, 0x00ffffff);
        nvkm_mask(device, 0x419cc0, 0x00000008, 0x00000008);
 
+       gr->func->init_ppc_exceptions(gr);
+
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < 2 /* gr->ppc_nr[gpc] */; ppc++)
-                       nvkm_wr32(device, PPC_UNIT(gpc, ppc, 0x038), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0420), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0900), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x1028), 0xc0000000);
@@ -438,9 +442,12 @@ gm107_gr_gpccs_ucode = {
 static const struct gf100_gr_func
 gm107_gr = {
        .init = gm107_gr_init,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
        .mmio = gm107_gr_pack_mmio,
        .fecs.ucode = &gm107_gr_fecs_ucode,
        .gpccs.ucode = &gm107_gr_gpccs_ucode,
+       .rops = gf100_gr_rops,
        .ppc_nr = 2,
        .grctx = &gm107_grctx,
        .sclass = {
index 058fc1d22c0992126ad15b5eb96f440e0bc6ce83..4dfa4513bb6c5a0d8ba45ce615f221d3883d06f1 100644 (file)
  * PGRAPH engine/subdev functions
  ******************************************************************************/
 
+int
+gm200_gr_rops(struct gf100_gr *gr)
+{
+       return nvkm_rd32(gr->base.engine.subdev.device, 0x12006c);
+}
+
+static void
+gm200_gr_init_gpc_mmu(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+
+       nvkm_wr32(device, 0x418880, nvkm_rd32(device, 0x100c80) & 0xf0001fff);
+       nvkm_wr32(device, 0x418890, 0x00000000);
+       nvkm_wr32(device, 0x418894, 0x00000000);
+
+       nvkm_wr32(device, 0x4188b4, nvkm_rd32(device, 0x100cc8));
+       nvkm_wr32(device, 0x4188b8, nvkm_rd32(device, 0x100ccc));
+       nvkm_wr32(device, 0x4188b0, nvkm_rd32(device, 0x100cc4));
+}
+
+static void
+gm200_gr_init_rop_active_fbps(struct gf100_gr *gr)
+{
+       struct nvkm_device *device = gr->base.engine.subdev.device;
+       const u32 fbp_count = nvkm_rd32(device, 0x12006c);
+       nvkm_mask(device, 0x408850, 0x0000000f, fbp_count); /* zrop */
+       nvkm_mask(device, 0x408958, 0x0000000f, fbp_count); /* crop */
+}
+
 int
 gm200_gr_init(struct gf100_gr *gr)
 {
        struct nvkm_device *device = gr->base.engine.subdev.device;
        const u32 magicgpc918 = DIV_ROUND_UP(0x00800000, gr->tpc_total);
-       u32 data[TPC_MAX / 8] = {}, tmp;
+       u32 data[TPC_MAX / 8] = {};
        u8  tpcnr[GPC_MAX];
-       int gpc, tpc, ppc, rop;
+       int gpc, tpc, rop;
        int i;
 
-       tmp = nvkm_rd32(device, 0x100c80); /*XXX: mask? */
-       nvkm_wr32(device, 0x418880, 0x00001000 | (tmp & 0x00000fff));
-       nvkm_wr32(device, 0x418890, 0x00000000);
-       nvkm_wr32(device, 0x418894, 0x00000000);
-       nvkm_wr32(device, 0x4188b4, nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, 0x4188b8, nvkm_memory_addr(gr->unk4188b8) >> 8);
-       nvkm_mask(device, 0x4188b0, 0x00040000, 0x00040000);
-
-       /*XXX: belongs in fb */
-       nvkm_wr32(device, 0x100cc8, nvkm_memory_addr(gr->unk4188b4) >> 8);
-       nvkm_wr32(device, 0x100ccc, nvkm_memory_addr(gr->unk4188b8) >> 8);
-       nvkm_mask(device, 0x100cc4, 0x00040000, 0x00040000);
+       gr->func->init_gpc_mmu(gr);
 
        gf100_gr_mmio(gr, gr->fuc_sw_nonctx);
 
@@ -79,9 +97,9 @@ gm200_gr_init(struct gf100_gr *gr)
 
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0914),
-                       gr->magic_not_rop_nr << 8 | gr->tpc_nr[gpc]);
+                         gr->screen_tile_row_offset << 8 | gr->tpc_nr[gpc]);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0910), 0x00040000 |
-                       gr->tpc_total);
+                                                        gr->tpc_total);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0918), magicgpc918);
        }
 
@@ -89,6 +107,8 @@ gm200_gr_init(struct gf100_gr *gr)
        nvkm_wr32(device, GPC_BCAST(0x08ac), nvkm_rd32(device, 0x100800));
        nvkm_wr32(device, GPC_BCAST(0x033c), nvkm_rd32(device, 0x100804));
 
+       gr->func->init_rop_active_fbps(gr);
+
        nvkm_wr32(device, 0x400500, 0x00010001);
        nvkm_wr32(device, 0x400100, 0xffffffff);
        nvkm_wr32(device, 0x40013c, 0xffffffff);
@@ -106,9 +126,9 @@ gm200_gr_init(struct gf100_gr *gr)
        nvkm_wr32(device, 0x405844, 0x00ffffff);
        nvkm_mask(device, 0x419cc0, 0x00000008, 0x00000008);
 
+       gr->func->init_ppc_exceptions(gr);
+
        for (gpc = 0; gpc < gr->gpc_nr; gpc++) {
-               for (ppc = 0; ppc < gr->ppc_nr[gpc]; ppc++)
-                       nvkm_wr32(device, PPC_UNIT(gpc, ppc, 0x038), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0420), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x0900), 0xc0000000);
                nvkm_wr32(device, GPC_UNIT(gpc, 0x1028), 0xc0000000);
@@ -189,6 +209,10 @@ gm200_gr_new_(const struct gf100_gr_func *func, struct nvkm_device *device,
 static const struct gf100_gr_func
 gm200_gr = {
        .init = gm200_gr_init,
+       .init_gpc_mmu = gm200_gr_init_gpc_mmu,
+       .init_rop_active_fbps = gm200_gr_init_rop_active_fbps,
+       .init_ppc_exceptions = gk104_gr_init_ppc_exceptions,
+       .rops = gm200_gr_rops,
        .ppc_nr = 2,
        .grctx = &gm200_grctx,
        .sclass = {
index 29732bc144158303f66408e403b2af03d8495b6e..69479af1d829fa5ae0625a29daf3bf68be97d1ed 100644 (file)
@@ -42,7 +42,7 @@ gm20b_gr_init_gpc_mmu(struct gf100_gr *gr)
        }
 
        val = nvkm_rd32(device, 0x100c80);
-       val &= 0xf000087f;
+       val &= 0xf000187f;
        nvkm_wr32(device, 0x418880, val);
        nvkm_wr32(device, 0x418890, 0);
        nvkm_wr32(device, 0x418894, 0);
@@ -66,7 +66,9 @@ static const struct gf100_gr_func
 gm20b_gr = {
        .init = gk20a_gr_init,
        .init_gpc_mmu = gm20b_gr_init_gpc_mmu,
+       .init_rop_active_fbps = gk104_gr_init_rop_active_fbps,
        .set_hww_esr_report_mask = gm20b_gr_set_hww_esr_report_mask,
+       .rops = gm200_gr_rops,
        .ppc_nr = 1,
        .grctx = &gm20b_grctx,
        .sclass = {
index 85c5b7fea5f5e177c347632aae8fb978f18d16c5..9c2e985dc079e9b142add0d32646ef554fc0ed85 100644 (file)
@@ -1422,6 +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, 0x00001000,
-                           true, &gr->base);
+       return nvkm_gr_ctor(&nv04_gr, device, index, true, &gr->base);
 }
index 4542867fa9e627736b12693456bba75d59bdb41b..4ebbfbdd8240455c2a17fa58ac650f668897ded6 100644 (file)
@@ -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, 0x00001000, true, &gr->base);
+       return nvkm_gr_ctor(func, device, index, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
index 5caef65d3c6ebd1dc86b7bd2db6bbd3f79e88857..d1dc92999dc00f281f5c38507403a3ae0ff8e801 100644 (file)
@@ -337,7 +337,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, 0x00001000, true, &gr->base);
+       return nvkm_gr_ctor(func, device, index, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
index 05a895496fc66f6f96efd64cbdbe822e4baaf1cc..5f1ad8344ea9d2c4b9f79c6eda0f11db1a5b5571 100644 (file)
@@ -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, 0x00001000, true, &gr->base);
+       return nvkm_gr_ctor(func, device, index, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
index b19b912d57877bfb9747f3f54a53143522f83e23..fca67de43f2b6f7d8710f7382d52bb5c6ba0b029 100644 (file)
@@ -768,7 +768,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, 0x00201000, true, &gr->base);
+       return nvkm_gr_ctor(func, device, index, true, &gr->base);
 }
 
 static const struct nvkm_gr_func
index a234590be88e83b309e40428c3c47470472074de..d8adcdf6985aa65e3782ffbf98ec200201a4d17b 100644 (file)
@@ -7,8 +7,7 @@ struct nvkm_fb_tile;
 struct nvkm_fifo_chan;
 
 int nvkm_gr_ctor(const struct nvkm_gr_func *, struct nvkm_device *,
-                int index, u32 pmc_enable, bool enable,
-                struct nvkm_gr *);
+                int index, bool enable, struct nvkm_gr *);
 
 bool nv04_gr_idle(struct nvkm_gr *);
 
index 34ff0014a6c1f8c26dce5d96c6307f430c4a5aba..c0e11a071843b22470af3fd82119d3b4c96215e7 100644 (file)
@@ -39,6 +39,5 @@ g84_mpeg = {
 int
 g84_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
 {
-       return nvkm_engine_new_(&g84_mpeg, device, index, 0x00000002,
-                               true, pmpeg);
+       return nvkm_engine_new_(&g84_mpeg, device, index, true, pmpeg);
 }
index d4d8942b13472c26af9fdb392728d6d2f751c244..003ac915eaadad44c5b0ad2c1bbab9d18377596e 100644 (file)
@@ -278,7 +278,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, 0x00000002,
+       return nvkm_engine_ctor(&nv31_mpeg_, device, index,
                                true, &mpeg->engine);
 }
 
index d433cfa4a8ab4ca8d098442e231d4a0745eff98c..e536f37e24b0c75fbf7882eccae37c5b1d0aeae8 100644 (file)
@@ -212,6 +212,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, 0x00000002,
-                               true, &mpeg->engine);
+       return nvkm_engine_ctor(&nv44_mpeg, device, index, true, &mpeg->engine);
 }
index c3a85dffc7822648fec3637e781c4f400e5d4cdf..4e528851e9c00653e0bf5d7a362a3af2b316a634 100644 (file)
@@ -130,6 +130,5 @@ nv50_mpeg = {
 int
 nv50_mpeg_new(struct nvkm_device *device, int index, struct nvkm_engine **pmpeg)
 {
-       return nvkm_engine_new_(&nv50_mpeg, device, index, 0x00400002,
-                               true, pmpeg);
+       return nvkm_engine_new_(&nv50_mpeg, device, index, true, pmpeg);
 }
index 1f1a99e927b2c3a10bb38681a6df5321d0067249..f30cf1dcfb30b999bac4f9f5a864465046de167a 100644 (file)
@@ -35,7 +35,6 @@ g98_mspdec_init(struct nvkm_falcon *mspdec)
 
 static const struct nvkm_falcon_func
 g98_mspdec = {
-       .pmc_enable = 0x01020000,
        .init = g98_mspdec_init,
        .sclass = {
                { -1, -1, G98_MSPDEC },
index 371fd6c3c66306627f184bbfec43919279a581aa..cfe1aa81bd144f503d0ca318e9c5d2279f8ef0f8 100644 (file)
@@ -35,7 +35,6 @@ gf100_mspdec_init(struct nvkm_falcon *mspdec)
 
 static const struct nvkm_falcon_func
 gf100_mspdec = {
-       .pmc_enable = 0x00020000,
        .init = gf100_mspdec_init,
        .sclass = {
                { -1, -1, GF100_MSPDEC },
index de804a15bfd46138189c31b8dc4753286eb721b1..24272b4927bcdf41a46a146a2e1f07bd316668e1 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 gk104_mspdec = {
-       .pmc_enable = 0x00020000,
        .init = gf100_mspdec_init,
        .sclass = {
                { -1, -1, GK104_MSPDEC },
index 835631713c950f3919e164d073529c41499ae4d8..cf6e59ad6ee296dfab8de7a3e19ab3e3e3db6893 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 gt215_mspdec = {
-       .pmc_enable = 0x01020000,
        .init = g98_mspdec_init,
        .sclass = {
                { -1, -1, GT212_MSPDEC },
index 73f633ae2ee7edfcefcab18fa20184cd124b48b8..c45dbf79d1f9d1977da44da1306b1dd52846da7b 100644 (file)
@@ -35,7 +35,6 @@ g98_msppp_init(struct nvkm_falcon *msppp)
 
 static const struct nvkm_falcon_func
 g98_msppp = {
-       .pmc_enable = 0x00400002,
        .init = g98_msppp_init,
        .sclass = {
                { -1, -1, G98_MSPPP },
index c42c0c07e2db12c16246dd8b8fa6d297bb11cf3c..803c62ab516e107858f5c396e27c45be4755ce59 100644 (file)
@@ -35,7 +35,6 @@ gf100_msppp_init(struct nvkm_falcon *msppp)
 
 static const struct nvkm_falcon_func
 gf100_msppp = {
-       .pmc_enable = 0x00000002,
        .init = gf100_msppp_init,
        .sclass = {
                { -1, -1, GF100_MSPPP },
index 00e7795f1d512825d79b3190c11fbbcd40697147..49cbf72cee4bd6ac587317be85dd339551f33c20 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 gt215_msppp = {
-       .pmc_enable = 0x00400002,
        .init = g98_msppp_init,
        .sclass = {
                { -1, -1, GT212_MSPPP },
index 47e2929bfaf02ebb95c1e26d4e7493bfde4b74e6..4a2a9f0494af8aa625903ca5a7531808089ea03f 100644 (file)
@@ -35,7 +35,6 @@ g98_msvld_init(struct nvkm_falcon *msvld)
 
 static const struct nvkm_falcon_func
 g98_msvld = {
-       .pmc_enable = 0x04008000,
        .init = g98_msvld_init,
        .sclass = {
                { -1, -1, G98_MSVLD },
index 1ac581ba9f96fbbb1d30dead263c3449f11469e2..1695e532c081f543fd3b0b7166188737e56804f4 100644 (file)
@@ -35,7 +35,6 @@ gf100_msvld_init(struct nvkm_falcon *msvld)
 
 static const struct nvkm_falcon_func
 gf100_msvld = {
-       .pmc_enable = 0x00008000,
        .init = gf100_msvld_init,
        .sclass = {
                { -1, -1, GF100_MSVLD },
index 4bba16e0f560005fb403c6c716b0736301cbfca8..b640cd63ebe8593f96bbb75503385e2090673c70 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 gk104_msvld = {
-       .pmc_enable = 0x00008000,
        .init = gf100_msvld_init,
        .sclass = {
                { -1, -1, GK104_MSVLD },
index e17cb5605b2d4822be24543cb0287ccc66d51e8c..201e8ef3519ec0941f2c0dde67733e91aff76d79 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 gt215_msvld = {
-       .pmc_enable = 0x04008000,
        .init = g98_msvld_init,
        .sclass = {
                { -1, -1, GT212_MSVLD },
index 511800f6a43b89b4b13e33392b5f0bb6325106e1..a0f540ef257b8dbc418cc780f5644f0ca4bfc63e 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_falcon_func
 mcp89_msvld = {
-       .pmc_enable = 0x04008000,
        .init = g98_msvld_init,
        .sclass = {
                { -1, -1, IGT21A_MSVLD },
index f19fabef8d73ce1a64206e3bca70519a53d3a3d9..8616636ad7b407e49f49c981437d7799bc42696b 100644 (file)
@@ -863,5 +863,5 @@ nvkm_pm_ctor(const struct nvkm_pm_func *func, struct nvkm_device *device,
        pm->func = func;
        INIT_LIST_HEAD(&pm->domains);
        INIT_LIST_HEAD(&pm->sources);
-       return nvkm_engine_ctor(&nvkm_pm, device, index, 0, true, &pm->engine);
+       return nvkm_engine_ctor(&nvkm_pm, device, index, true, &pm->engine);
 }
index 995c2c5ec15038f815640f00d52b7fdecc26c63a..6d2a7f0afbb55d8bed5add0641a0f1a6c7cb5f37 100644 (file)
@@ -66,7 +66,6 @@ g98_sec = {
        .code.size = sizeof(g98_sec_code),
        .data.data = g98_sec_data,
        .data.size = sizeof(g98_sec_data),
-       .pmc_enable = 0x00004000,
        .intr = g98_sec_intr,
        .sclass = {
                { -1, -1, G98_SEC },
index 53c1f7e75b54c3fdba248054503d7db929d8450a..7be3198e11de402e413083729cacbda3f51181f7 100644 (file)
@@ -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, 0, true, &sw->engine);
+       return nvkm_engine_ctor(&nvkm_sw, device, index, true, &sw->engine);
 }
index 4188c77ac927557bd688cda20753b238239dbe64..7a96178786c4ca6a90bccc3bbd6ba86318801c63 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct nvkm_xtensa_func
 g84_vp = {
-       .pmc_enable = 0x01020000,
        .fifo_val = 0x111,
        .unkd28 = 0x9c544,
        .sclass = {
index a3d4f5bcec7a450e522c6cdcf17d0d4901a082b9..06bdb67a020586c45ef2b6c9f2c4f6ece7d8231a 100644 (file)
@@ -187,6 +187,6 @@ nvkm_xtensa_new_(const struct nvkm_xtensa_func *func,
        xtensa->addr = addr;
        *pengine = &xtensa->engine;
 
-       return nvkm_engine_ctor(&nvkm_xtensa, device, index, func->pmc_enable,
+       return nvkm_engine_ctor(&nvkm_xtensa, device, index,
                                enable, &xtensa->engine);
 }
index 642d27dc99a3756d7e22b2358e36ebc14f5c9f38..3f5d38d74fba482159d42e09076ccb16aaa4057a 100644 (file)
@@ -19,4 +19,5 @@ include $(src)/nvkm/subdev/pmu/Kbuild
 include $(src)/nvkm/subdev/secboot/Kbuild
 include $(src)/nvkm/subdev/therm/Kbuild
 include $(src)/nvkm/subdev/timer/Kbuild
+include $(src)/nvkm/subdev/top/Kbuild
 include $(src)/nvkm/subdev/volt/Kbuild
index a9433ad45b1e6b60ae16a14902f500940ffdfe41..c561d148cebcd7909a047cec7585265588934d9f 100644 (file)
@@ -77,7 +77,7 @@ void
 nvkm_bar_ctor(const struct nvkm_bar_func *func, struct nvkm_device *device,
              int index, struct nvkm_bar *bar)
 {
-       nvkm_subdev_ctor(&nvkm_bar, device, index, 0, &bar->subdev);
+       nvkm_subdev_ctor(&nvkm_bar, device, index, &bar->subdev);
        bar->func = func;
        spin_lock_init(&bar->lock);
 }
index 79536897efaadc73e5508b39b28e5f1776bfe92a..e15b9627b07e12cacca0bb671813d9d9e3b58628 100644 (file)
@@ -105,7 +105,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, 0, &bios->subdev);
+       nvkm_subdev_ctor(&nvkm_bios, device, index, &bios->subdev);
 
        ret = nvbios_shadow(bios);
        if (ret)
index 125ec2ed6c2e007ee36e51ac67bb3b28ed955f71..91a7dc56e406980ccf225fb76f232a9ab1a983fd 100644 (file)
@@ -81,9 +81,11 @@ static u16
 pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
 {
        struct bit_entry bit_C;
+       u16 data = 0x0000;
 
-       if (!bit_entry(bios, 'C', &bit_C) && bit_C.length >= 10) {
-               u16 data = nvbios_rd16(bios, bit_C.offset + 8);
+       if (!bit_entry(bios, 'C', &bit_C)) {
+               if (bit_C.version == 1 && bit_C.length >= 10)
+                       data = nvbios_rd16(bios, bit_C.offset + 8);
                if (data) {
                        *ver = nvbios_rd08(bios, data + 0);
                        *hdr = nvbios_rd08(bios, data + 1);
@@ -94,7 +96,7 @@ pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
        }
 
        if (bmp_version(bios) >= 0x0524) {
-               u16 data = nvbios_rd16(bios, bios->bmp_offset + 142);
+               data = nvbios_rd16(bios, bios->bmp_offset + 142);
                if (data) {
                        *ver = nvbios_rd08(bios, data + 0);
                        *hdr = 1;
@@ -105,7 +107,7 @@ pll_limits_table(struct nvkm_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
        }
 
        *ver = 0x00;
-       return 0x0000;
+       return data;
 }
 
 static struct pll_mapping *
@@ -156,7 +158,7 @@ pll_map_reg(struct nvkm_bios *bios, u32 reg, u32 *type, u8 *ver, u8 *len)
        }
 
        map = pll_map(bios);
-       while (map->reg) {
+       while (map && map->reg) {
                if (map->reg == reg && *ver >= 0x20) {
                        u16 addr = (data += hdr);
                        *type = map->type;
@@ -198,7 +200,7 @@ pll_map_type(struct nvkm_bios *bios, u8 type, u32 *reg, u8 *ver, u8 *len)
        }
 
        map = pll_map(bios);
-       while (map->reg) {
+       while (map && map->reg) {
                if (map->type == type && *ver >= 0x20) {
                        u16 addr = (data += hdr);
                        *reg = map->reg;
index dc5a10f18bdb54fb049b118bb9ff607283d97c69..52ad73bce5febd0a1d8b166ca9422fa4e59e7c3f 100644 (file)
@@ -58,7 +58,7 @@ nvkm_bus_new_(const struct nvkm_bus_func *func, struct nvkm_device *device,
        struct nvkm_bus *bus;
        if (!(bus = *pbus = kzalloc(sizeof(*bus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_bus, device, index, 0, &bus->subdev);
+       nvkm_subdev_ctor(&nvkm_bus, device, index, &bus->subdev);
        bus->func = func;
        return 0;
 }
index 889cce2eb7277aa2d608ca99a6041ff7a43fc7b9..7102c25320fc273c64da5534e9339c7ff27cabce 100644 (file)
@@ -564,7 +564,7 @@ nvkm_clk_ctor(const struct nvkm_clk_func *func, struct nvkm_device *device,
        int ret, idx, arglen;
        const char *mode;
 
-       nvkm_subdev_ctor(&nvkm_clk, device, index, 0, &clk->subdev);
+       nvkm_subdev_ctor(&nvkm_clk, device, index, &clk->subdev);
        clk->func = func;
        INIT_LIST_HEAD(&clk->states);
        clk->domains = func->domains;
index 5f25402f6b096f0e7ff67c39b4f8bef6ff8f57f8..4756019ddf3fba74bf69795a7fd567e38241d813 100644 (file)
@@ -83,6 +83,12 @@ nvkm_devinit_preinit(struct nvkm_subdev *subdev)
        if (init->func->preinit)
                init->func->preinit(init);
 
+       /* Override the post flag during the first call if NvForcePost is set */
+       if (init->force_post) {
+               init->post = init->force_post;
+               init->force_post = false;
+       }
+
        /* unlock the extended vga crtc regs */
        nvkm_lockvgac(subdev->device, false);
        return 0;
@@ -124,7 +130,7 @@ nvkm_devinit_ctor(const struct nvkm_devinit_func *func,
                  struct nvkm_device *device, int index,
                  struct nvkm_devinit *init)
 {
-       nvkm_subdev_ctor(&nvkm_devinit, device, index, 0, &init->subdev);
+       nvkm_subdev_ctor(&nvkm_devinit, device, index, &init->subdev);
        init->func = func;
-       init->post = nvkm_boolopt(device->cfgopt, "NvForcePost", false);
+       init->force_post = nvkm_boolopt(device->cfgopt, "NvForcePost", false);
 }
index 2923598b5fe99e239c6cde5e55d5c6af5cf77c7b..8b1b34c3ad2624cfbda40054a7c5410b8a0364f6 100644 (file)
@@ -97,9 +97,11 @@ gf100_devinit_preinit(struct nvkm_devinit *base)
        struct nvkm_subdev *subdev = &init->base.subdev;
        struct nvkm_device *device = subdev->device;
 
-       /* This bit is set by devinit, and flips back to 0 on suspend */
-       if (!base->post)
-               base->post = ((nvkm_rd32(device, 0x2240c) & BIT(1)) == 0);
+       /*
+        * This bit is set by devinit, and flips back to 0 on suspend. We
+        * can use it as a reliable way to know whether we should run devinit.
+        */
+       base->post = ((nvkm_rd32(device, 0x2240c) & BIT(1)) == 0);
 }
 
 static const struct nvkm_devinit_func
index 08105701af7e3e4fc014584acefd76542b637115..842d5de96d73169be05fc86d2462fb1e27ebdcf9 100644 (file)
@@ -23,6 +23,7 @@ nvkm-y += nvkm/subdev/fb/gf100.o
 nvkm-y += nvkm/subdev/fb/gk104.o
 nvkm-y += nvkm/subdev/fb/gk20a.o
 nvkm-y += nvkm/subdev/fb/gm107.o
+nvkm-y += nvkm/subdev/fb/gm200.o
 
 nvkm-y += nvkm/subdev/fb/ram.o
 nvkm-y += nvkm/subdev/fb/ramnv04.o
index a719b9becb7300c86a91d8e0b3c0d5ba81f2ef77..ce90242b8cceeca8718b2daa7c1c6e8553d77db5 100644 (file)
@@ -24,6 +24,7 @@
 #include "priv.h"
 #include "ram.h"
 
+#include <core/memory.h>
 #include <subdev/bios.h>
 #include <subdev/bios/M0203.h>
 #include <engine/gr.h>
@@ -98,6 +99,7 @@ static int
 nvkm_fb_oneinit(struct nvkm_subdev *subdev)
 {
        struct nvkm_fb *fb = nvkm_fb(subdev);
+
        if (fb->func->ram_new) {
                int ret = fb->func->ram_new(fb, &fb->ram);
                if (ret) {
@@ -105,6 +107,13 @@ nvkm_fb_oneinit(struct nvkm_subdev *subdev)
                        return ret;
                }
        }
+
+       if (fb->func->oneinit) {
+               int ret = fb->func->oneinit(fb);
+               if (ret)
+                       return ret;
+       }
+
        return 0;
 }
 
@@ -134,6 +143,9 @@ nvkm_fb_dtor(struct nvkm_subdev *subdev)
        struct nvkm_fb *fb = nvkm_fb(subdev);
        int i;
 
+       nvkm_memory_del(&fb->mmu_wr);
+       nvkm_memory_del(&fb->mmu_rd);
+
        for (i = 0; i < fb->tile.regions; i++)
                fb->func->tile.fini(fb, i, &fb->tile.region[i]);
 
@@ -156,7 +168,7 @@ void
 nvkm_fb_ctor(const struct nvkm_fb_func *func, struct nvkm_device *device,
             int index, struct nvkm_fb *fb)
 {
-       nvkm_subdev_ctor(&nvkm_fb, device, index, 0, &fb->subdev);
+       nvkm_subdev_ctor(&nvkm_fb, device, index, &fb->subdev);
        fb->func = func;
        fb->tile.regions = fb->func->tile.regions;
 }
index 008bb9849f3b42cf462370dfa46188e8e01f1777..e649ead5ccfc74c7416e78f4294d7d1bcdbbf9b3 100644 (file)
@@ -24,6 +24,9 @@
 #include "gf100.h"
 #include "ram.h"
 
+#include <core/memory.h>
+#include <core/option.h>
+
 extern const u8 gf100_pte_storage_type_map[256];
 
 bool
@@ -46,6 +49,28 @@ gf100_fb_intr(struct nvkm_fb *base)
                nvkm_debug(subdev, "PBFB intr\n");
 }
 
+int
+gf100_fb_oneinit(struct nvkm_fb *fb)
+{
+       struct nvkm_device *device = fb->subdev.device;
+       int ret, size = 0x1000;
+
+       size = nvkm_longopt(device->cfgopt, "MmuDebugBufferSize", size);
+       size = min(size, 0x1000);
+
+       ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, size, 0x1000,
+                             false, &fb->mmu_rd);
+       if (ret)
+               return ret;
+
+       ret = nvkm_memory_new(device, NVKM_MEM_TARGET_INST, size, 0x1000,
+                             false, &fb->mmu_wr);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 void
 gf100_fb_init(struct nvkm_fb *base)
 {
@@ -98,6 +123,7 @@ gf100_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
 static const struct nvkm_fb_func
 gf100_fb = {
        .dtor = gf100_fb_dtor,
+       .oneinit = gf100_fb_oneinit,
        .init = gf100_fb_init,
        .intr = gf100_fb_intr,
        .ram_new = gf100_ram_new,
index 0edb3c316f5cdc4ad560ca3ad0de4e3cb360363e..b41f0f70038cb4c8a9d2d0ee464ed7a6fc768392 100644 (file)
@@ -27,6 +27,7 @@
 static const struct nvkm_fb_func
 gk104_fb = {
        .dtor = gf100_fb_dtor,
+       .oneinit = gf100_fb_oneinit,
        .init = gf100_fb_init,
        .intr = gf100_fb_intr,
        .ram_new = gk104_ram_new,
index 81447eb4c948b5f1203d64576ba89f1ebbe867e2..7306f7dfc3b93f4455942e9c2cb8387c51320669 100644 (file)
  */
 #include "priv.h"
 
+#include <core/memory.h>
+
 static void
 gk20a_fb_init(struct nvkm_fb *fb)
 {
        struct nvkm_device *device = fb->subdev.device;
        nvkm_mask(device, 0x100c80, 0x00000001, 0x00000000); /* 128KiB lpg */
+       nvkm_wr32(device, 0x100cc8, nvkm_memory_addr(fb->mmu_wr) >> 8);
+       nvkm_wr32(device, 0x100ccc, nvkm_memory_addr(fb->mmu_rd) >> 8);
 }
 
 static const struct nvkm_fb_func
 gk20a_fb = {
+       .oneinit = gf100_fb_oneinit,
        .init = gk20a_fb_init,
        .memtype_valid = gf100_fb_memtype_valid,
 };
index 2a91df8655ddb06b452e2193c921fc03a4758b0b..4869fdb753c971f7cc35a880cd3bad06c3efa031 100644 (file)
@@ -27,6 +27,7 @@
 static const struct nvkm_fb_func
 gm107_fb = {
        .dtor = gf100_fb_dtor,
+       .oneinit = gf100_fb_oneinit,
        .init = gf100_fb_init,
        .intr = gf100_fb_intr,
        .ram_new = gm107_ram_new,
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm200.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/gm200.c
new file mode 100644 (file)
index 0000000..44f5716
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * 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 "gf100.h"
+#include "ram.h"
+
+#include <core/memory.h>
+
+static void
+gm200_fb_init(struct nvkm_fb *base)
+{
+       struct gf100_fb *fb = gf100_fb(base);
+       struct nvkm_device *device = fb->base.subdev.device;
+
+       if (fb->r100c10_page)
+               nvkm_wr32(device, 0x100c10, fb->r100c10 >> 8);
+
+       nvkm_mask(device, 0x100c80, 0x00000001, 0x00000000); /* 128KiB lpg */
+
+       nvkm_wr32(device, 0x100cc8, nvkm_memory_addr(fb->base.mmu_wr) >> 8);
+       nvkm_wr32(device, 0x100ccc, nvkm_memory_addr(fb->base.mmu_rd) >> 8);
+       nvkm_mask(device, 0x100cc4, 0x00060000,
+                 min(nvkm_memory_size(fb->base.mmu_rd) >> 16, (u64)2) << 17);
+}
+
+static const struct nvkm_fb_func
+gm200_fb = {
+       .dtor = gf100_fb_dtor,
+       .oneinit = gf100_fb_oneinit,
+       .init = gm200_fb_init,
+       .intr = gf100_fb_intr,
+       .ram_new = gm107_ram_new,
+       .memtype_valid = gf100_fb_memtype_valid,
+};
+
+int
+gm200_fb_new(struct nvkm_device *device, int index, struct nvkm_fb **pfb)
+{
+       return gf100_fb_new_(&gm200_fb, device, index, pfb);
+}
index 62b9feb531dc1d5a7d47bf9c7216c43b61739ba4..d97d640e60a0a32e5e92af83c116128ca8559dce 100644 (file)
@@ -6,6 +6,7 @@ struct nvkm_bios;
 
 struct nvkm_fb_func {
        void *(*dtor)(struct nvkm_fb *);
+       int (*oneinit)(struct nvkm_fb *);
        void (*init)(struct nvkm_fb *);
        void (*intr)(struct nvkm_fb *);
 
@@ -58,5 +59,6 @@ void nv44_fb_tile_prog(struct nvkm_fb *, int, struct nvkm_fb_tile *);
 void nv46_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
                       u32 pitch, u32 flags, struct nvkm_fb_tile *);
 
+int gf100_fb_oneinit(struct nvkm_fb *);
 bool gf100_fb_memtype_valid(struct nvkm_fb *, u32);
 #endif
index f4144979a79c0aa86b202a1258a1673962d182d1..1c3c18ea8cedfcc8fe1699290e35eaea45252483 100644 (file)
@@ -47,7 +47,7 @@ nvkm_fuse_new_(const struct nvkm_fuse_func *func, struct nvkm_device *device,
        struct nvkm_fuse *fuse;
        if (!(fuse = *pfuse = kzalloc(sizeof(*fuse), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_fuse, device, index, 0, &fuse->subdev);
+       nvkm_subdev_ctor(&nvkm_fuse, device, index, &fuse->subdev);
        fuse->func = func;
        spin_lock_init(&fuse->lock);
        return 0;
index d45ec99f0e3855f3e65c7d6002f71caad8190a99..77c649723ad7602055752445863ba50653c392c7 100644 (file)
@@ -216,7 +216,7 @@ nvkm_gpio_new_(const struct nvkm_gpio_func *func, struct nvkm_device *device,
        if (!(gpio = *pgpio = kzalloc(sizeof(*gpio), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_gpio, device, index, 0, &gpio->subdev);
+       nvkm_subdev_ctor(&nvkm_gpio, device, index, &gpio->subdev);
        gpio->func = func;
 
        return nvkm_event_init(&nvkm_gpio_intr_func, 2, func->lines,
index 243a71ff0a0d9d9ebee40bf2aa3653eea41a7d6a..4f197b15acf6138c415185de24cbb3eb04887295 100644 (file)
@@ -254,7 +254,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, 0, &i2c->subdev);
+       nvkm_subdev_ctor(&nvkm_i2c, device, index, &i2c->subdev);
        i2c->func = func;
        INIT_LIST_HEAD(&i2c->pad);
        INIT_LIST_HEAD(&i2c->bus);
index 72d6330d243d2c5451656444a7e9f8226589183c..2c6b374f14200ca28f32af2eded5bf36422357e3 100644 (file)
@@ -117,6 +117,6 @@ gf100_ibus_new(struct nvkm_device *device, int index,
        struct nvkm_subdev *ibus;
        if (!(ibus = *pibus = kzalloc(sizeof(*ibus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&gf100_ibus, device, index, 0, ibus);
+       nvkm_subdev_ctor(&gf100_ibus, device, index, ibus);
        return 0;
 }
index f69f263c5906f0e716f9a129615ff662bf58b093..3905a80da811997566728bafd39a57050c2881e9 100644 (file)
@@ -46,6 +46,6 @@ gf117_ibus_new(struct nvkm_device *device, int index,
        struct nvkm_subdev *ibus;
        if (!(ibus = *pibus = kzalloc(sizeof(*ibus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&gf117_ibus, device, index, 0, ibus);
+       nvkm_subdev_ctor(&gf117_ibus, device, index, ibus);
        return 0;
 }
index b5cee3f89aaaed1968ec2366f1a949153813f29d..c673853f3213c999b20b942ea9a88da1ce24bf56 100644 (file)
@@ -120,6 +120,6 @@ gk104_ibus_new(struct nvkm_device *device, int index,
        struct nvkm_subdev *ibus;
        if (!(ibus = *pibus = kzalloc(sizeof(*ibus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&gk104_ibus, device, index, 0, ibus);
+       nvkm_subdev_ctor(&gk104_ibus, device, index, ibus);
        return 0;
 }
index 3484079e885a836a9b65af81fcf1353bcf805f36..b7159b338fac06af9db9c83ca82b189d718d35b0 100644 (file)
@@ -84,6 +84,6 @@ gk20a_ibus_new(struct nvkm_device *device, int index,
        struct nvkm_subdev *ibus;
        if (!(ibus = *pibus = kzalloc(sizeof(*ibus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&gk20a_ibus, device, index, 0, ibus);
+       nvkm_subdev_ctor(&gk20a_ibus, device, index, ibus);
        return 0;
 }
index ef0b7f3b1128a92db74de0e54ef84b41189237e5..c63328152bfa669d17d642ab1f7a55045198326b 100644 (file)
@@ -35,6 +35,6 @@ gm200_ibus_new(struct nvkm_device *device, int index,
        struct nvkm_subdev *ibus;
        if (!(ibus = *pibus = kzalloc(sizeof(*ibus), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&gm200_ibus, device, index, 0, ibus);
+       nvkm_subdev_ctor(&gm200_ibus, device, index, ibus);
        return 0;
 }
index c44a85228074e02db3435e29e119e9d3ef7f930e..323c79abe46855f45ec5e91a722324f93d183a8a 100644 (file)
 
 static bool
 nvkm_iccsense_validate_device(struct i2c_adapter *i2c, u8 addr,
-                             enum nvbios_extdev_type type, u8 rail)
+                             enum nvbios_extdev_type type)
 {
        switch (type) {
        case NVBIOS_EXTDEV_INA209:
        case NVBIOS_EXTDEV_INA219:
-               return rail == 0 && nv_rd16i2cr(i2c, addr, 0x0) >= 0;
+               return nv_rd16i2cr(i2c, addr, 0x0) >= 0;
        case NVBIOS_EXTDEV_INA3221:
-               return rail <= 3 &&
-                      nv_rd16i2cr(i2c, addr, 0xff) == 0x3220 &&
+               return nv_rd16i2cr(i2c, addr, 0xff) == 0x3220 &&
                       nv_rd16i2cr(i2c, addr, 0xfe) == 0x5449;
        default:
                return false;
@@ -67,8 +66,9 @@ nvkm_iccsense_ina2x9_read(struct nvkm_iccsense *iccsense,
                           struct nvkm_iccsense_rail *rail,
                          u8 shunt_reg, u8 bus_reg)
 {
-       return nvkm_iccsense_poll_lane(rail->i2c, rail->addr, shunt_reg, 0,
-                                      bus_reg, 3, rail->mohm, 10 * 4);
+       return nvkm_iccsense_poll_lane(rail->sensor->i2c, rail->sensor->addr,
+                                      shunt_reg, 0, bus_reg, 3, rail->mohm,
+                                      10 * 4);
 }
 
 static int
@@ -89,37 +89,87 @@ static int
 nvkm_iccsense_ina3221_read(struct nvkm_iccsense *iccsense,
                           struct nvkm_iccsense_rail *rail)
 {
-       return nvkm_iccsense_poll_lane(rail->i2c, rail->addr,
-                                      1 + (rail->rail * 2), 3,
-                                      2 + (rail->rail * 2), 3, rail->mohm,
+       return nvkm_iccsense_poll_lane(rail->sensor->i2c, rail->sensor->addr,
+                                      1 + (rail->idx * 2), 3,
+                                      2 + (rail->idx * 2), 3, rail->mohm,
                                       40 * 8);
 }
 
-int
-nvkm_iccsense_read(struct nvkm_iccsense *iccsense, u8 idx)
+static void
+nvkm_iccsense_ina209_config(struct nvkm_iccsense *iccsense,
+                           struct nvkm_iccsense_sensor *sensor)
 {
-       struct nvkm_iccsense_rail *rail;
-
-       if (!iccsense || idx >= iccsense->rail_count)
-               return -EINVAL;
+       struct nvkm_subdev *subdev = &iccsense->subdev;
+       /* configuration:
+        * 0x0007: 0x0007 shunt and bus continous
+        * 0x0078: 0x0078 128 samples shunt
+        * 0x0780: 0x0780 128 samples bus
+        * 0x1800: 0x0000 +-40 mV shunt range
+        * 0x2000: 0x0000 16V FSR
+         */
+       u16 value = 0x07ff;
+       nvkm_debug(subdev, "config for sensor id %i: 0x%x\n", sensor->id, value);
+       nv_wr16i2cr(sensor->i2c, sensor->addr, 0x00, value);
+}
 
-       rail = &iccsense->rails[idx];
-       if (!rail->read)
-               return -ENODEV;
+static void
+nvkm_iccsense_ina3221_config(struct nvkm_iccsense *iccsense,
+                            struct nvkm_iccsense_sensor *sensor)
+{
+       struct nvkm_subdev *subdev = &iccsense->subdev;
+       /* configuration:
+        * 0x0007: 0x0007 shunt and bus continous
+        * 0x0031: 0x0000 140 us conversion time shunt
+        * 0x01c0: 0x0000 140 us conversion time bus
+        * 0x0f00: 0x0f00 1024 samples
+        * 0x7000: 0x?000 channels
+         */
+       u16 value = 0x0e07;
+       if (sensor->rail_mask & 0x1)
+               value |= 0x1 << 14;
+       if (sensor->rail_mask & 0x2)
+               value |= 0x1 << 13;
+       if (sensor->rail_mask & 0x4)
+               value |= 0x1 << 12;
+       nvkm_debug(subdev, "config for sensor id %i: 0x%x\n", sensor->id, value);
+       nv_wr16i2cr(sensor->i2c, sensor->addr, 0x00, value);
+}
 
-       return rail->read(iccsense, rail);
+static void
+nvkm_iccsense_sensor_config(struct nvkm_iccsense *iccsense,
+                           struct nvkm_iccsense_sensor *sensor)
+{
+       switch (sensor->type) {
+       case NVBIOS_EXTDEV_INA209:
+       case NVBIOS_EXTDEV_INA219:
+               nvkm_iccsense_ina209_config(iccsense, sensor);
+               break;
+       case NVBIOS_EXTDEV_INA3221:
+               nvkm_iccsense_ina3221_config(iccsense, sensor);
+               break;
+       default:
+               break;
+       }
 }
 
 int
 nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense)
 {
-       int result = 0, i;
-       for (i = 0; i < iccsense->rail_count; ++i) {
-               int res = nvkm_iccsense_read(iccsense, i);
-               if (res >= 0)
-                       result += res;
-               else
+       int result = 0;
+       struct nvkm_iccsense_rail *rail;
+
+       if (!iccsense)
+               return -EINVAL;
+
+       list_for_each_entry(rail, &iccsense->rails, head) {
+               int res;
+               if (!rail->read)
+                       return -ENODEV;
+
+               res = rail->read(iccsense, rail);
+               if (res < 0)
                        return res;
+               result += res;
        }
        return result;
 }
@@ -128,89 +178,158 @@ static void *
 nvkm_iccsense_dtor(struct nvkm_subdev *subdev)
 {
        struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
+       struct nvkm_iccsense_sensor *sensor, *tmps;
+       struct nvkm_iccsense_rail *rail, *tmpr;
 
-       if (iccsense->rails)
-               kfree(iccsense->rails);
+       list_for_each_entry_safe(sensor, tmps, &iccsense->sensors, head) {
+               list_del(&sensor->head);
+               kfree(sensor);
+       }
+       list_for_each_entry_safe(rail, tmpr, &iccsense->rails, head) {
+               list_del(&rail->head);
+               kfree(rail);
+       }
 
        return iccsense;
 }
 
+static struct nvkm_iccsense_sensor*
+nvkm_iccsense_create_sensor(struct nvkm_iccsense *iccsense, u8 id)
+{
+
+       struct nvkm_subdev *subdev = &iccsense->subdev;
+       struct nvkm_bios *bios = subdev->device->bios;
+       struct nvkm_i2c *i2c = subdev->device->i2c;
+       struct nvbios_extdev_func extdev;
+       struct nvkm_i2c_bus *i2c_bus;
+       struct nvkm_iccsense_sensor *sensor;
+       u8 addr;
+
+       if (!i2c || !bios || nvbios_extdev_parse(bios, id, &extdev))
+               return NULL;
+
+       if (extdev.type == 0xff)
+               return NULL;
+
+       if (extdev.type != NVBIOS_EXTDEV_INA209 &&
+           extdev.type != NVBIOS_EXTDEV_INA219 &&
+           extdev.type != NVBIOS_EXTDEV_INA3221) {
+               iccsense->data_valid = false;
+               nvkm_error(subdev, "Unknown sensor type %x, power reading "
+                          "disabled\n", extdev.type);
+               return NULL;
+       }
+
+       if (extdev.bus)
+               i2c_bus = nvkm_i2c_bus_find(i2c, NVKM_I2C_BUS_SEC);
+       else
+               i2c_bus = nvkm_i2c_bus_find(i2c, NVKM_I2C_BUS_PRI);
+       if (!i2c_bus)
+               return NULL;
+
+       addr = extdev.addr >> 1;
+       if (!nvkm_iccsense_validate_device(&i2c_bus->i2c, addr,
+                                          extdev.type)) {
+               iccsense->data_valid = false;
+               nvkm_warn(subdev, "found invalid sensor id: %i, power reading"
+                         "might be invalid\n", id);
+               return NULL;
+       }
+
+       sensor = kmalloc(sizeof(*sensor), GFP_KERNEL);
+       if (!sensor)
+               return NULL;
+
+       list_add_tail(&sensor->head, &iccsense->sensors);
+       sensor->id = id;
+       sensor->type = extdev.type;
+       sensor->i2c = &i2c_bus->i2c;
+       sensor->addr = addr;
+       sensor->rail_mask = 0x0;
+       return sensor;
+}
+
+static struct nvkm_iccsense_sensor*
+nvkm_iccsense_get_sensor(struct nvkm_iccsense *iccsense, u8 id)
+{
+       struct nvkm_iccsense_sensor *sensor;
+       list_for_each_entry(sensor, &iccsense->sensors, head) {
+               if (sensor->id == id)
+                       return sensor;
+       }
+       return nvkm_iccsense_create_sensor(iccsense, id);
+}
+
 static int
 nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
 {
        struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
        struct nvkm_bios *bios = subdev->device->bios;
-       struct nvkm_i2c *i2c = subdev->device->i2c;
        struct nvbios_iccsense stbl;
        int i;
 
-       if (!i2c || !bios || nvbios_iccsense_parse(bios, &stbl)
-           || !stbl.nr_entry)
+       if (!bios || nvbios_iccsense_parse(bios, &stbl) || !stbl.nr_entry)
                return 0;
 
-       iccsense->rails = kmalloc(sizeof(*iccsense->rails) * stbl.nr_entry,
-                                 GFP_KERNEL);
-       if (!iccsense->rails)
-               return -ENOMEM;
-
        iccsense->data_valid = true;
        for (i = 0; i < stbl.nr_entry; ++i) {
                struct pwr_rail_t *r = &stbl.rail[i];
-               struct nvbios_extdev_func extdev;
                struct nvkm_iccsense_rail *rail;
-               struct nvkm_i2c_bus *i2c_bus;
-               u8 addr;
+               struct nvkm_iccsense_sensor *sensor;
 
                if (!r->mode || r->resistor_mohm == 0)
                        continue;
 
-               if (nvbios_extdev_parse(bios, r->extdev_id, &extdev))
+               sensor = nvkm_iccsense_get_sensor(iccsense, r->extdev_id);
+               if (!sensor)
                        continue;
 
-               if (extdev.type == 0xff)
-                       continue;
+               rail = kmalloc(sizeof(*rail), GFP_KERNEL);
+               if (!rail)
+                       return -ENOMEM;
 
-               if (extdev.bus)
-                       i2c_bus = nvkm_i2c_bus_find(i2c, NVKM_I2C_BUS_SEC);
-               else
-                       i2c_bus = nvkm_i2c_bus_find(i2c, NVKM_I2C_BUS_PRI);
-               if (!i2c_bus)
-                       continue;
-
-               addr = extdev.addr >> 1;
-               if (!nvkm_iccsense_validate_device(&i2c_bus->i2c, addr,
-                                                  extdev.type, r->rail)) {
-                       iccsense->data_valid = false;
-                       nvkm_warn(subdev, "found unknown or invalid rail entry"
-                                 " type 0x%x rail %i, power reading might be"
-                                 " invalid\n", extdev.type, r->rail);
-                       continue;
-               }
-
-               rail = &iccsense->rails[iccsense->rail_count];
-               switch (extdev.type) {
+               switch (sensor->type) {
                case NVBIOS_EXTDEV_INA209:
+                       if (r->rail != 0)
+                               continue;
                        rail->read = nvkm_iccsense_ina209_read;
                        break;
                case NVBIOS_EXTDEV_INA219:
+                       if (r->rail != 0)
+                               continue;
                        rail->read = nvkm_iccsense_ina219_read;
                        break;
                case NVBIOS_EXTDEV_INA3221:
+                       if (r->rail >= 3)
+                               continue;
                        rail->read = nvkm_iccsense_ina3221_read;
                        break;
+               default:
+                       continue;
                }
 
-               rail->addr = addr;
-               rail->rail = r->rail;
+               sensor->rail_mask |= 1 << r->rail;
+               rail->sensor = sensor;
+               rail->idx = r->rail;
                rail->mohm = r->resistor_mohm;
-               rail->i2c = &i2c_bus->i2c;
-               ++iccsense->rail_count;
+               list_add_tail(&rail->head, &iccsense->rails);
        }
        return 0;
 }
 
+static int
+nvkm_iccsense_init(struct nvkm_subdev *subdev)
+{
+       struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
+       struct nvkm_iccsense_sensor *sensor;
+       list_for_each_entry(sensor, &iccsense->sensors, head)
+               nvkm_iccsense_sensor_config(iccsense, sensor);
+       return 0;
+}
+
 struct nvkm_subdev_func iccsense_func = {
        .oneinit = nvkm_iccsense_oneinit,
+       .init = nvkm_iccsense_init,
        .dtor = nvkm_iccsense_dtor,
 };
 
@@ -218,7 +337,7 @@ void
 nvkm_iccsense_ctor(struct nvkm_device *device, int index,
                   struct nvkm_iccsense *iccsense)
 {
-       nvkm_subdev_ctor(&iccsense_func, device, index, 0, &iccsense->subdev);
+       nvkm_subdev_ctor(&iccsense_func, device, index, &iccsense->subdev);
 }
 
 int
@@ -227,6 +346,8 @@ nvkm_iccsense_new_(struct nvkm_device *device, int index,
 {
        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);
        return 0;
 }
index ed398b81e86e231c7ab72d488cf1de55b543304e..b72c31d2f90890ba6fcab8b024053776e9477aae 100644 (file)
@@ -2,12 +2,22 @@
 #define __NVKM_ICCSENSE_PRIV_H__
 #define nvkm_iccsense(p) container_of((p), struct nvkm_iccsense, subdev)
 #include <subdev/iccsense.h>
+#include <subdev/bios/extdev.h>
 
-struct nvkm_iccsense_rail {
-       int (*read)(struct nvkm_iccsense *, struct nvkm_iccsense_rail *);
+struct nvkm_iccsense_sensor {
+       struct list_head head;
+       int id;
+       enum nvbios_extdev_type type;
        struct i2c_adapter *i2c;
        u8 addr;
-       u8 rail;
+       u8 rail_mask;
+};
+
+struct nvkm_iccsense_rail {
+       struct list_head head;
+       int (*read)(struct nvkm_iccsense *, struct nvkm_iccsense_rail *);
+       struct nvkm_iccsense_sensor *sensor;
+       u8 idx;
        u8 mohm;
 };
 
index 1d7dd38292b375bd73ec35ff4e844cd2ae1defe7..8ed8f65ff664f5b0014f7326923dd079a3188f0e 100644 (file)
@@ -311,7 +311,7 @@ nvkm_instmem_ctor(const struct nvkm_instmem_func *func,
                  struct nvkm_device *device, int index,
                  struct nvkm_instmem *imem)
 {
-       nvkm_subdev_ctor(&nvkm_instmem, device, index, 0, &imem->subdev);
+       nvkm_subdev_ctor(&nvkm_instmem, device, index, &imem->subdev);
        imem->func = func;
        spin_lock_init(&imem->lock);
        INIT_LIST_HEAD(&imem->list);
index 85b1464c01942013f22055be345d751636bc68cb..39c2a38e54f74e6e2a4af834feca795823a21408 100644 (file)
@@ -138,7 +138,7 @@ nvkm_ltc_new_(const struct nvkm_ltc_func *func, struct nvkm_device *device,
        if (!(ltc = *pltc = kzalloc(sizeof(*ltc), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_ltc, device, index, 0, &ltc->subdev);
+       nvkm_subdev_ctor(&nvkm_ltc, device, index, &ltc->subdev);
        ltc->func = func;
        ltc->zbc_min = 1; /* reserve 0 for disabled */
        ltc->zbc_max = min(func->zbc, NVKM_LTC_MAX_ZBC_CNT) - 1;
index bef325dcb4d001c02a8c161edca772cff86347d5..49695ac7be2e66331a8b96fae726fff2e17c613f 100644 (file)
@@ -1,7 +1,12 @@
 nvkm-y += nvkm/subdev/mc/base.o
 nvkm-y += nvkm/subdev/mc/nv04.o
+nvkm-y += nvkm/subdev/mc/nv11.o
+nvkm-y += nvkm/subdev/mc/nv17.o
 nvkm-y += nvkm/subdev/mc/nv44.o
 nvkm-y += nvkm/subdev/mc/nv50.o
+nvkm-y += nvkm/subdev/mc/g84.o
 nvkm-y += nvkm/subdev/mc/g98.o
+nvkm-y += nvkm/subdev/mc/gt215.o
 nvkm-y += nvkm/subdev/mc/gf100.o
+nvkm-y += nvkm/subdev/mc/gk104.o
 nvkm-y += nvkm/subdev/mc/gk20a.o
index 954fbbe56c4ba1a15ff4b450d799bdb14c7099d1..350a8caa84c8dbd9b565cb2ea4b71a2b428bb116 100644 (file)
@@ -24,6 +24,7 @@
 #include "priv.h"
 
 #include <core/option.h>
+#include <subdev/top.h>
 
 void
 nvkm_mc_unk260(struct nvkm_mc *mc, u32 data)
@@ -58,10 +59,19 @@ nvkm_mc_intr(struct nvkm_mc *mc, bool *handled)
 {
        struct nvkm_device *device = mc->subdev.device;
        struct nvkm_subdev *subdev;
-       const struct nvkm_mc_intr *map = mc->func->intr;
-       u32 stat, intr;
+       const struct nvkm_mc_map *map = mc->func->intr;
+       u32 stat, intr = nvkm_mc_intr_mask(mc);
+       u64 subdevs;
+
+       stat = nvkm_top_intr(device->top, 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_mask(mc);
        while (map->stat) {
                if (intr & map->stat) {
                        subdev = nvkm_device_subdev(device, map->unit);
@@ -77,6 +87,36 @@ nvkm_mc_intr(struct nvkm_mc *mc, bool *handled)
        *handled = intr != 0;
 }
 
+static void
+nvkm_mc_reset_(struct nvkm_mc *mc, enum nvkm_devidx devidx)
+{
+       struct nvkm_device *device = mc->subdev.device;
+       const struct nvkm_mc_map *map;
+       u64 pmc_enable;
+
+       if (!(pmc_enable = nvkm_top_reset(device->top, devidx))) {
+               for (map = mc->func->reset; map && map->stat; map++) {
+                       if (map->unit == devidx) {
+                               pmc_enable = map->stat;
+                               break;
+                       }
+               }
+       }
+
+       if (pmc_enable) {
+               nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
+               nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
+               nvkm_rd32(device, 0x000200);
+       }
+}
+
+void
+nvkm_mc_reset(struct nvkm_mc *mc, enum nvkm_devidx devidx)
+{
+       if (likely(mc))
+               nvkm_mc_reset_(mc, devidx);
+}
+
 static int
 nvkm_mc_fini(struct nvkm_subdev *subdev, bool suspend)
 {
@@ -117,7 +157,7 @@ nvkm_mc_new_(const struct nvkm_mc_func *func, struct nvkm_device *device,
        if (!(mc = *pmc = kzalloc(sizeof(*mc), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_mc, device, index, 0, &mc->subdev);
+       nvkm_subdev_ctor(&nvkm_mc, device, index, &mc->subdev);
        mc->func = func;
        return 0;
 }
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/g84.c
new file mode 100644 (file)
index 0000000..5c85b47
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * 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"
+
+static const struct nvkm_mc_map
+g84_mc_reset[] = {
+       { 0x04008000, NVKM_ENGINE_BSP },
+       { 0x02004000, NVKM_ENGINE_CIPHER },
+       { 0x01020000, NVKM_ENGINE_VP },
+       { 0x00400002, NVKM_ENGINE_MPEG },
+       { 0x00201000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       {}
+};
+
+const struct nvkm_mc_map
+g84_mc_intr[] = {
+       { 0x04000000, NVKM_ENGINE_DISP },
+       { 0x00020000, NVKM_ENGINE_VP },
+       { 0x00008000, NVKM_ENGINE_BSP },
+       { 0x00004000, NVKM_ENGINE_CIPHER },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000001, NVKM_ENGINE_MPEG },
+       { 0x0002d101, NVKM_SUBDEV_FB },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       {},
+};
+
+static const struct nvkm_mc_func
+g84_mc = {
+       .init = nv50_mc_init,
+       .intr = g84_mc_intr,
+       .intr_unarm = nv04_mc_intr_unarm,
+       .intr_rearm = nv04_mc_intr_rearm,
+       .intr_mask = nv04_mc_intr_mask,
+       .reset = g84_mc_reset,
+};
+
+int
+g84_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+{
+       return nvkm_mc_new_(&g84_mc, device, index, pmc);
+}
index 7344ad659105c9883f200ce7dd6d9b08eb1530bd..0280b43cc10c9eb2dfacbe31aee636488443fca1 100644 (file)
  */
 #include "priv.h"
 
-static const struct nvkm_mc_intr
-g98_mc_intr[] = {
-       { 0x04000000, NVKM_ENGINE_DISP },  /* DISP first, so pageflip timestamps work */
-       { 0x00000001, NVKM_ENGINE_MSPPP },
+static const struct nvkm_mc_map
+g98_mc_reset[] = {
+       { 0x04008000, NVKM_ENGINE_MSVLD },
+       { 0x02004000, NVKM_ENGINE_SEC },
+       { 0x01020000, NVKM_ENGINE_MSPDEC },
+       { 0x00400002, NVKM_ENGINE_MSPPP },
+       { 0x00201000, NVKM_ENGINE_GR },
        { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x00001000, NVKM_ENGINE_GR },
-       { 0x00004000, NVKM_ENGINE_SEC },        /* NV84:NVA3 */
-       { 0x00008000, NVKM_ENGINE_MSVLD },
+       {}
+};
+
+static const struct nvkm_mc_map
+g98_mc_intr[] = {
+       { 0x04000000, NVKM_ENGINE_DISP },
        { 0x00020000, NVKM_ENGINE_MSPDEC },
-       { 0x00040000, NVKM_SUBDEV_PMU },        /* NVA3:NVC0 */
-       { 0x00080000, NVKM_SUBDEV_THERM },      /* NVA3:NVC0 */
-       { 0x00100000, NVKM_SUBDEV_TIMER },
-       { 0x00200000, NVKM_SUBDEV_GPIO },       /* PMGR->GPIO */
-       { 0x00200000, NVKM_SUBDEV_I2C },        /* PMGR->I2C/AUX */
-       { 0x00400000, NVKM_ENGINE_CE0 },        /* NVA3-     */
+       { 0x00008000, NVKM_ENGINE_MSVLD },
+       { 0x00004000, NVKM_ENGINE_SEC },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000001, NVKM_ENGINE_MSPPP },
+       { 0x0002d101, NVKM_SUBDEV_FB },
        { 0x10000000, NVKM_SUBDEV_BUS },
-       { 0x80000000, NVKM_ENGINE_SW },
-       { 0x0042d101, NVKM_SUBDEV_FB },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
        {},
 };
 
@@ -51,6 +58,7 @@ g98_mc = {
        .intr_unarm = nv04_mc_intr_unarm,
        .intr_rearm = nv04_mc_intr_rearm,
        .intr_mask = nv04_mc_intr_mask,
+       .reset = g98_mc_reset,
 };
 
 int
index 122fe69e83e41227ac86f494581586e6f89da734..8397e223bd4305295cf714463b099f5c63a8b5ac 100644 (file)
  */
 #include "priv.h"
 
-const struct nvkm_mc_intr
-gf100_mc_intr[] = {
-       { 0x04000000, NVKM_ENGINE_DISP },  /* DISP first, so pageflip timestamps work. */
-       { 0x00000001, NVKM_ENGINE_MSPPP },
-       { 0x00000020, NVKM_ENGINE_CE0 },
-       { 0x00000040, NVKM_ENGINE_CE1 },
-       { 0x00000080, NVKM_ENGINE_CE2 },
-       { 0x00000100, NVKM_ENGINE_FIFO },
-       { 0x00001000, NVKM_ENGINE_GR },
-       { 0x00002000, NVKM_SUBDEV_FB },
+static const struct nvkm_mc_map
+gf100_mc_reset[] = {
+       { 0x00020000, NVKM_ENGINE_MSPDEC },
        { 0x00008000, NVKM_ENGINE_MSVLD },
-       { 0x00040000, NVKM_SUBDEV_THERM },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000080, NVKM_ENGINE_CE1 },
+       { 0x00000040, NVKM_ENGINE_CE0 },
+       { 0x00000002, NVKM_ENGINE_MSPPP },
+       {}
+};
+
+static const struct nvkm_mc_map
+gf100_mc_intr[] = {
+       { 0x04000000, NVKM_ENGINE_DISP },
        { 0x00020000, NVKM_ENGINE_MSPDEC },
-       { 0x00100000, NVKM_SUBDEV_TIMER },
-       { 0x00200000, NVKM_SUBDEV_GPIO },       /* PMGR->GPIO */
-       { 0x00200000, NVKM_SUBDEV_I2C },        /* PMGR->I2C/AUX */
-       { 0x01000000, NVKM_SUBDEV_PMU },
-       { 0x02000000, NVKM_SUBDEV_LTC },
-       { 0x08000000, NVKM_SUBDEV_FB },
-       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x00008000, NVKM_ENGINE_MSVLD },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000040, NVKM_ENGINE_CE1 },
+       { 0x00000020, NVKM_ENGINE_CE0 },
+       { 0x00000001, NVKM_ENGINE_MSPPP },
        { 0x40000000, NVKM_SUBDEV_IBUS },
-       { 0x80000000, NVKM_ENGINE_SW },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x08000000, NVKM_SUBDEV_FB },
+       { 0x02000000, NVKM_SUBDEV_LTC },
+       { 0x01000000, NVKM_SUBDEV_PMU },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       { 0x00040000, NVKM_SUBDEV_THERM },
+       { 0x00002000, NVKM_SUBDEV_FB },
        {},
 };
 
@@ -87,6 +97,7 @@ gf100_mc = {
        .intr_unarm = gf100_mc_intr_unarm,
        .intr_rearm = gf100_mc_intr_rearm,
        .intr_mask = gf100_mc_intr_mask,
+       .reset = gf100_mc_reset,
        .unk260 = gf100_mc_unk260,
 };
 
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/gk104.c
new file mode 100644 (file)
index 0000000..3174642
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2016 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"
+
+const struct nvkm_mc_map
+gk104_mc_reset[] = {
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       {}
+};
+
+const struct nvkm_mc_map
+gk104_mc_intr[] = {
+       { 0x04000000, NVKM_ENGINE_DISP },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x40000000, NVKM_SUBDEV_IBUS },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x08000000, NVKM_SUBDEV_FB },
+       { 0x02000000, NVKM_SUBDEV_LTC },
+       { 0x01000000, NVKM_SUBDEV_PMU },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       { 0x00040000, NVKM_SUBDEV_THERM },
+       { 0x00002000, NVKM_SUBDEV_FB },
+       {},
+};
+
+static const struct nvkm_mc_func
+gk104_mc = {
+       .init = nv50_mc_init,
+       .intr = gk104_mc_intr,
+       .intr_unarm = gf100_mc_intr_unarm,
+       .intr_rearm = gf100_mc_intr_rearm,
+       .intr_mask = gf100_mc_intr_mask,
+       .reset = gk104_mc_reset,
+       .unk260 = gf100_mc_unk260,
+};
+
+int
+gk104_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+{
+       return nvkm_mc_new_(&gk104_mc, device, index, pmc);
+}
index d92efb33bcc3ce0039ff9a24b3252b5dc9bc05cf..60b044f517ed5d70aec8d8f424322edf4afd821a 100644 (file)
 static const struct nvkm_mc_func
 gk20a_mc = {
        .init = nv50_mc_init,
-       .intr = gf100_mc_intr,
+       .intr = gk104_mc_intr,
        .intr_unarm = gf100_mc_intr_unarm,
        .intr_rearm = gf100_mc_intr_rearm,
        .intr_mask = gf100_mc_intr_mask,
+       .reset = gk104_mc_reset,
 };
 
 int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/gt215.c
new file mode 100644 (file)
index 0000000..aad0ba9
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2016 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"
+
+static const struct nvkm_mc_map
+gt215_mc_reset[] = {
+       { 0x04008000, NVKM_ENGINE_MSVLD },
+       { 0x01020000, NVKM_ENGINE_MSPDEC },
+       { 0x00802000, NVKM_ENGINE_CE0 },
+       { 0x00400002, NVKM_ENGINE_MSPPP },
+       { 0x00201000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       {}
+};
+
+static const struct nvkm_mc_map
+gt215_mc_intr[] = {
+       { 0x04000000, NVKM_ENGINE_DISP },
+       { 0x00400000, NVKM_ENGINE_CE0 },
+       { 0x00020000, NVKM_ENGINE_MSPDEC },
+       { 0x00008000, NVKM_ENGINE_MSVLD },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000001, NVKM_ENGINE_MSPPP },
+       { 0x00429101, NVKM_SUBDEV_FB },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       { 0x00080000, NVKM_SUBDEV_THERM },
+       { 0x00040000, NVKM_SUBDEV_PMU },
+       {},
+};
+
+static const struct nvkm_mc_func
+gt215_mc = {
+       .init = nv50_mc_init,
+       .intr = gt215_mc_intr,
+       .intr_unarm = nv04_mc_intr_unarm,
+       .intr_rearm = nv04_mc_intr_rearm,
+       .intr_mask = nv04_mc_intr_mask,
+       .reset = gt215_mc_reset,
+};
+
+int
+gt215_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+{
+       return nvkm_mc_new_(&gt215_mc, device, index, pmc);
+}
index d282ec1555f864742b941cc661e1002615bbf17e..a062624e906b3396f4b5b74c3da704be4b1a9765 100644 (file)
  */
 #include "priv.h"
 
-const struct nvkm_mc_intr
-nv04_mc_intr[] = {
-       { 0x00000001, NVKM_ENGINE_MPEG },       /* NV17- MPEG/ME */
+const struct nvkm_mc_map
+nv04_mc_reset[] = {
+       { 0x00001000, NVKM_ENGINE_GR },
        { 0x00000100, NVKM_ENGINE_FIFO },
+       {}
+};
+
+static const struct nvkm_mc_map
+nv04_mc_intr[] = {
+       { 0x01010000, NVKM_ENGINE_DISP },
        { 0x00001000, NVKM_ENGINE_GR },
-       { 0x00010000, NVKM_ENGINE_DISP },
-       { 0x00020000, NVKM_ENGINE_VP }, /* NV40- */
-       { 0x00100000, NVKM_SUBDEV_TIMER },
-       { 0x01000000, NVKM_ENGINE_DISP },       /* NV04- PCRTC0 */
-       { 0x02000000, NVKM_ENGINE_DISP },       /* NV11- PCRTC1 */
+       { 0x00000100, NVKM_ENGINE_FIFO },
        { 0x10000000, NVKM_SUBDEV_BUS },
-       { 0x80000000, NVKM_ENGINE_SW },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
        {}
 };
 
@@ -74,6 +76,7 @@ nv04_mc = {
        .intr_unarm = nv04_mc_intr_unarm,
        .intr_rearm = nv04_mc_intr_rearm,
        .intr_mask = nv04_mc_intr_mask,
+       .reset = nv04_mc_reset,
 };
 
 int
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv11.c
new file mode 100644 (file)
index 0000000..55f0b91
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016 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_mc_map
+nv11_mc_intr[] = {
+       { 0x03010000, NVKM_ENGINE_DISP },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       {}
+};
+
+static const struct nvkm_mc_func
+nv11_mc = {
+       .init = nv04_mc_init,
+       .intr = nv11_mc_intr,
+       .intr_unarm = nv04_mc_intr_unarm,
+       .intr_rearm = nv04_mc_intr_rearm,
+       .intr_mask = nv04_mc_intr_mask,
+       .reset = nv04_mc_reset,
+};
+
+int
+nv11_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+{
+       return nvkm_mc_new_(&nv11_mc, device, index, pmc);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.c b/drivers/gpu/drm/nouveau/nvkm/subdev/mc/nv17.c
new file mode 100644 (file)
index 0000000..c40fa67
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2016 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"
+
+const struct nvkm_mc_map
+nv17_mc_reset[] = {
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000002, NVKM_ENGINE_MPEG },
+       {}
+};
+
+const struct nvkm_mc_map
+nv17_mc_intr[] = {
+       { 0x03010000, NVKM_ENGINE_DISP },
+       { 0x00001000, NVKM_ENGINE_GR },
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000001, NVKM_ENGINE_MPEG },
+       { 0x10000000, NVKM_SUBDEV_BUS },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
+       {}
+};
+
+static const struct nvkm_mc_func
+nv17_mc = {
+       .init = nv04_mc_init,
+       .intr = nv17_mc_intr,
+       .intr_unarm = nv04_mc_intr_unarm,
+       .intr_rearm = nv04_mc_intr_rearm,
+       .intr_mask = nv04_mc_intr_mask,
+       .reset = nv17_mc_reset,
+};
+
+int
+nv17_mc_new(struct nvkm_device *device, int index, struct nvkm_mc **pmc)
+{
+       return nvkm_mc_new_(&nv17_mc, device, index, pmc);
+}
index 9a3ac9965be06255722b288abbf97037fbf1842e..cc56271db5643695add777bad34059c27d7f9b49 100644 (file)
@@ -40,10 +40,11 @@ nv44_mc_init(struct nvkm_mc *mc)
 static const struct nvkm_mc_func
 nv44_mc = {
        .init = nv44_mc_init,
-       .intr = nv04_mc_intr,
+       .intr = nv17_mc_intr,
        .intr_unarm = nv04_mc_intr_unarm,
        .intr_rearm = nv04_mc_intr_rearm,
        .intr_mask = nv04_mc_intr_mask,
+       .reset = nv17_mc_reset,
 };
 
 int
index 5f27d7b8fddda2aa64e7ea93ded3619112bac430..343b6078580de8bee982c56c267db9d48a6858a0 100644 (file)
  */
 #include "priv.h"
 
-const struct nvkm_mc_intr
+static const struct nvkm_mc_map
 nv50_mc_intr[] = {
-       { 0x04000000, NVKM_ENGINE_DISP },  /* DISP before FIFO, so pageflip-timestamping works! */
-       { 0x00000001, NVKM_ENGINE_MPEG },
-       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x04000000, NVKM_ENGINE_DISP },
        { 0x00001000, NVKM_ENGINE_GR },
-       { 0x00004000, NVKM_ENGINE_CIPHER },     /* NV84- */
-       { 0x00008000, NVKM_ENGINE_BSP },        /* NV84- */
-       { 0x00020000, NVKM_ENGINE_VP }, /* NV84- */
-       { 0x00100000, NVKM_SUBDEV_TIMER },
-       { 0x00200000, NVKM_SUBDEV_GPIO },       /* PMGR->GPIO */
-       { 0x00200000, NVKM_SUBDEV_I2C },        /* PMGR->I2C/AUX */
+       { 0x00000100, NVKM_ENGINE_FIFO },
+       { 0x00000001, NVKM_ENGINE_MPEG },
+       { 0x00001101, NVKM_SUBDEV_FB },
        { 0x10000000, NVKM_SUBDEV_BUS },
-       { 0x80000000, NVKM_ENGINE_SW },
-       { 0x0002d101, NVKM_SUBDEV_FB },
+       { 0x00200000, NVKM_SUBDEV_GPIO },
+       { 0x00200000, NVKM_SUBDEV_I2C },
+       { 0x00100000, NVKM_SUBDEV_TIMER },
        {},
 };
 
@@ -55,6 +51,7 @@ nv50_mc = {
        .intr_unarm = nv04_mc_intr_unarm,
        .intr_rearm = nv04_mc_intr_rearm,
        .intr_mask = nv04_mc_intr_mask,
+       .reset = nv17_mc_reset,
 };
 
 int
index 307f6c6922879eec61f5af8035a18dc0aa948274..a1203811851238b462981a3d5e1a38717926ee33 100644 (file)
@@ -6,37 +6,42 @@
 int nvkm_mc_new_(const struct nvkm_mc_func *, struct nvkm_device *,
                 int index, struct nvkm_mc **);
 
-struct nvkm_mc_intr {
+struct nvkm_mc_map {
        u32 stat;
        u32 unit;
 };
 
 struct nvkm_mc_func {
        void (*init)(struct nvkm_mc *);
-       const struct nvkm_mc_intr *intr;
+       const struct nvkm_mc_map *intr;
        /* disable reporting of interrupts to host */
        void (*intr_unarm)(struct nvkm_mc *);
        /* enable reporting of interrupts to host */
        void (*intr_rearm)(struct nvkm_mc *);
        /* retrieve pending interrupt mask (NV_PMC_INTR) */
        u32 (*intr_mask)(struct nvkm_mc *);
+       const struct nvkm_mc_map *reset;
        void (*unk260)(struct nvkm_mc *, u32);
 };
 
 void nv04_mc_init(struct nvkm_mc *);
-extern const struct nvkm_mc_intr nv04_mc_intr[];
 void nv04_mc_intr_unarm(struct nvkm_mc *);
 void nv04_mc_intr_rearm(struct nvkm_mc *);
 u32 nv04_mc_intr_mask(struct nvkm_mc *);
+extern const struct nvkm_mc_map nv04_mc_reset[];
+
+extern const struct nvkm_mc_map nv17_mc_intr[];
+extern const struct nvkm_mc_map nv17_mc_reset[];
 
 void nv44_mc_init(struct nvkm_mc *);
 
 void nv50_mc_init(struct nvkm_mc *);
-extern const struct nvkm_mc_intr nv50_mc_intr[];
 
-extern const struct nvkm_mc_intr gf100_mc_intr[];
 void gf100_mc_intr_unarm(struct nvkm_mc *);
 void gf100_mc_intr_rearm(struct nvkm_mc *);
 u32 gf100_mc_intr_mask(struct nvkm_mc *);
 void gf100_mc_unk260(struct nvkm_mc *, u32);
+
+extern const struct nvkm_mc_map gk104_mc_intr[];
+extern const struct nvkm_mc_map gk104_mc_reset[];
 #endif
index e04a2296ecd0c0a67522c08c423589369fcdb58f..5df9669ea39c1705a631685a2530bc20bfd5a458 100644 (file)
@@ -524,7 +524,7 @@ void
 nvkm_mmu_ctor(const struct nvkm_mmu_func *func, struct nvkm_device *device,
              int index, struct nvkm_mmu *mmu)
 {
-       nvkm_subdev_ctor(&nvkm_mmu, device, index, 0, &mmu->subdev);
+       nvkm_subdev_ctor(&nvkm_mmu, device, index, &mmu->subdev);
        mmu->func = func;
        mmu->limit = func->limit;
        mmu->dma_bits = func->dma_bits;
index 9700a7625012d7cf9724f746e77dbc87b5bd52e1..21b65ee254e4d5a9d07f95d1bf87804ef4b3ad7b 100644 (file)
@@ -241,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, 0, &mxm->subdev);
+       nvkm_subdev_ctor(&nvkm_mxm, device, index, &mxm->subdev);
 
        data = mxm_table(bios, &ver, &len);
        if (!data || !(ver = nvbios_rd08(bios, data))) {
index 65057c8310a295de4596e46c65ded680583de219..6b0328bd7eede2ee2d43d55152f0b6022218f76b 100644 (file)
@@ -168,7 +168,7 @@ nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device,
 
        if (!(pci = *ppci = kzalloc(sizeof(**ppci), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_pci_func, device, index, 0, &pci->subdev);
+       nvkm_subdev_ctor(&nvkm_pci_func, device, index, &pci->subdev);
        pci->func = func;
        pci->pdev = device->func->pci(device)->pdev;
        pci->irq = -1;
index d95eb8659d1bdb6279d256b6e90f49d04cff2215..8dd164d13043ffe663f6460d8daf26d4be37eda3 100644 (file)
@@ -40,21 +40,23 @@ nvkm_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
        struct nvkm_device *device = subdev->device;
        u32 addr;
 
+       mutex_lock(&subdev->mutex);
        /* wait for a free slot in the fifo */
        addr  = nvkm_rd32(device, 0x10a4a0);
        if (nvkm_msec(device, 2000,
                u32 tmp = nvkm_rd32(device, 0x10a4b0);
                if (tmp != (addr ^ 8))
                        break;
-       ) < 0)
+       ) < 0) {
+               mutex_unlock(&subdev->mutex);
                return -EBUSY;
+       }
 
        /* we currently only support a single process at a time waiting
         * on a synchronous reply, take the PMU mutex and tell the
         * receive handler what we're waiting for
         */
        if (reply) {
-               mutex_lock(&subdev->mutex);
                pmu->recv.message = message;
                pmu->recv.process = process;
        }
@@ -81,9 +83,9 @@ nvkm_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
                wait_event(pmu->recv.wait, (pmu->recv.process == 0));
                reply[0] = pmu->recv.data[0];
                reply[1] = pmu->recv.data[1];
-               mutex_unlock(&subdev->mutex);
        }
 
+       mutex_unlock(&subdev->mutex);
        return 0;
 }
 
@@ -272,7 +274,7 @@ nvkm_pmu_new_(const struct nvkm_pmu_func *func, struct nvkm_device *device,
        struct nvkm_pmu *pmu;
        if (!(pmu = *ppmu = kzalloc(sizeof(*pmu), GFP_KERNEL)))
                return -ENOMEM;
-       nvkm_subdev_ctor(&nvkm_pmu, device, index, 0, &pmu->subdev);
+       nvkm_subdev_ctor(&nvkm_pmu, device, index, &pmu->subdev);
        pmu->func = func;
        INIT_WORK(&pmu->recv.work, nvkm_pmu_recv);
        init_waitqueue_head(&pmu->recv.wait);
index 6689d0290a7e2bf8d7685b880253aa1b34964a5d..f996d90c9f0dc260821d6208c36c91ea7d7177de 100644 (file)
@@ -220,7 +220,7 @@ gk20a_pmu_new(struct nvkm_device *device, int index, struct nvkm_pmu **ppmu)
        pmu->base.func = &func;
        *ppmu = &pmu->base;
 
-       nvkm_subdev_ctor(&gk20a_pmu, device, index, 0, &pmu->base.subdev);
+       nvkm_subdev_ctor(&gk20a_pmu, device, index, &pmu->base.subdev);
        pmu->data = &gk20a_dvfs_data;
        nvkm_alarm_init(&pmu->alarm, gk20a_pmu_dvfs_work);
        return 0;
index 520facf9bc0737d3622948e8cc727c06f7d27cfc..213fdba6cfa0c8813cdf7276ed3c9dc72e2c40d6 100644 (file)
@@ -264,7 +264,7 @@ nvkm_secboot_ctor(const struct nvkm_secboot_func *func,
 {
        unsigned long fid;
 
-       nvkm_subdev_ctor(&nvkm_secboot, device, index, 0, &sb->subdev);
+       nvkm_subdev_ctor(&nvkm_secboot, device, index, &sb->subdev);
        sb->func = func;
 
        /* setup the performing falcon's base address and masks */
index 949dc6101a58b3293355605b45caa9c546b109b3..8894fee30cbc66e5170d9b4c616ef89c7aa22c80 100644 (file)
@@ -366,7 +366,7 @@ nvkm_therm_new_(const struct nvkm_therm_func *func, struct nvkm_device *device,
        if (!(therm = *ptherm = kzalloc(sizeof(*therm), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_therm, device, index, 0, &therm->subdev);
+       nvkm_subdev_ctor(&nvkm_therm, device, index, &therm->subdev);
        therm->func = func;
 
        nvkm_alarm_init(&therm->alarm, nvkm_therm_alarm);
index d4dae1f12d622b03cb2af61d2dcb966fed28f7fb..07dc82bfe346029aab3827f8d435769b433d1ced 100644 (file)
@@ -143,7 +143,7 @@ nvkm_timer_new_(const struct nvkm_timer_func *func, struct nvkm_device *device,
        if (!(tmr = *ptmr = kzalloc(sizeof(*tmr), GFP_KERNEL)))
                return -ENOMEM;
 
-       nvkm_subdev_ctor(&nvkm_timer, device, index, 0, &tmr->subdev);
+       nvkm_subdev_ctor(&nvkm_timer, device, index, &tmr->subdev);
        tmr->func = func;
        INIT_LIST_HEAD(&tmr->alarms);
        spin_lock_init(&tmr->lock);
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/Kbuild b/drivers/gpu/drm/nouveau/nvkm/subdev/top/Kbuild
new file mode 100644 (file)
index 0000000..1078401
--- /dev/null
@@ -0,0 +1,2 @@
+nvkm-y += nvkm/subdev/top/base.o
+nvkm-y += nvkm/subdev/top/gk104.o
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c
new file mode 100644 (file)
index 0000000..a1b2646
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2016 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"
+
+struct nvkm_top_device *
+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->addr = 0;
+               info->fault = -1;
+               info->engine = -1;
+               info->runlist = -1;
+               info->reset = -1;
+               info->intr = -1;
+               list_add_tail(&info->head, &top->device);
+       }
+       return info;
+}
+
+u32
+nvkm_top_reset(struct nvkm_top *top, enum nvkm_devidx index)
+{
+       struct nvkm_top_device *info;
+
+       if (top) {
+               list_for_each_entry(info, &top->device, head) {
+                       if (info->index == index && info->reset >= 0)
+                               return BIT(info->reset);
+               }
+       }
+
+       return 0;
+}
+
+u32
+nvkm_top_intr(struct nvkm_top *top, u32 intr, u64 *psubdevs)
+{
+       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;
+}
+
+enum nvkm_devidx
+nvkm_top_fault(struct nvkm_top *top, int fault)
+{
+       struct nvkm_top_device *info;
+
+       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_top *top, int index, int *runl, int *engn)
+{
+       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 -ENODEV;
+}
+
+static int
+nvkm_top_oneinit(struct nvkm_subdev *subdev)
+{
+       struct nvkm_top *top = nvkm_top(subdev);
+       return top->func->oneinit(top);
+}
+
+static void *
+nvkm_top_dtor(struct nvkm_subdev *subdev)
+{
+       struct nvkm_top *top = nvkm_top(subdev);
+       struct nvkm_top_device *info, *temp;
+
+       list_for_each_entry_safe(info, temp, &top->device, head) {
+               list_del(&info->head);
+               kfree(info);
+       }
+
+       return top;
+}
+
+static const struct nvkm_subdev_func
+nvkm_top = {
+       .dtor = nvkm_top_dtor,
+       .oneinit = nvkm_top_oneinit,
+};
+
+int
+nvkm_top_new_(const struct nvkm_top_func *func, struct nvkm_device *device,
+             int index, 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);
+       top->func = func;
+       INIT_LIST_HEAD(&top->device);
+       return 0;
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c b/drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.c
new file mode 100644 (file)
index 0000000..e06acc3
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2016 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 int
+gk104_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;
+       int i;
+
+       for (i = 0; i < 64; i++) {
+               if (!info) {
+                       if (!(info = nvkm_top_device_new(top)))
+                               return -ENOMEM;
+                       type = ~0;
+               }
+
+               data = nvkm_rd32(device, 0x022700 + (i * 0x04));
+               nvkm_trace(subdev, "%02x: %08x\n", i, data);
+               switch (data & 0x00000003) {
+               case 0x00000000: /* NOT_VALID */
+                       continue;
+               case 0x00000001: /* DATA */
+                       info->addr  = (data & 0x00fff000);
+                       info->fault = (data & 0x000000f8) >> 3;
+                       break;
+               case 0x00000002: /* ENUM */
+                       if (data & 0x00000020)
+                               info->engine  = (data & 0x3c000000) >> 26;
+                       if (data & 0x00000010)
+                               info->runlist = (data & 0x01e00000) >> 21;
+                       if (data & 0x00000008)
+                               info->intr    = (data & 0x000f8000) >> 15;
+                       if (data & 0x00000004)
+                               info->reset   = (data & 0x00003e00) >> 9;
+                       break;
+               case 0x00000003: /* ENGINE_TYPE */
+                       type = (data & 0x7ffffffc) >> 2;
+                       break;
+               }
+
+               if (data & 0x80000000)
+                       continue;
+
+               /* Translate engine type to NVKM engine identifier. */
+               switch (type) {
+               case 0x00000000: info->index = NVKM_ENGINE_GR; break;
+               case 0x00000001: info->index = NVKM_ENGINE_CE0; break;
+               case 0x00000002: info->index = NVKM_ENGINE_CE1; break;
+               case 0x00000003: info->index = NVKM_ENGINE_CE2; break;
+               case 0x00000008: info->index = NVKM_ENGINE_MSPDEC; break;
+               case 0x00000009: info->index = NVKM_ENGINE_MSPPP; break;
+               case 0x0000000a: info->index = NVKM_ENGINE_MSVLD; break;
+               case 0x0000000b: info->index = NVKM_ENGINE_MSENC; break;
+               case 0x0000000c: info->index = NVKM_ENGINE_VIC; break;
+               case 0x0000000d: info->index = NVKM_ENGINE_SEC; break;
+               case 0x0000000e: info->index = NVKM_ENGINE_NVENC0; break;
+               case 0x0000000f: info->index = NVKM_ENGINE_NVENC1; break;
+               case 0x00000010: info->index = NVKM_ENGINE_NVDEC; break;
+                       break;
+               default:
+                       break;
+               }
+
+               nvkm_debug(subdev, "%02x (%8s): addr %06x fault %2d engine %2d "
+                                  "runlist %2d intr %2d reset %2d\n", type,
+                          info->index == NVKM_SUBDEV_NR ? NULL :
+                                         nvkm_subdev_name[info->index],
+                          info->addr, info->fault, info->engine, info->runlist,
+                          info->intr, info->reset);
+               info = NULL;
+       }
+
+       return 0;
+}
+
+static const struct nvkm_top_func
+gk104_top = {
+       .oneinit = gk104_top_oneinit,
+};
+
+int
+gk104_top_new(struct nvkm_device *device, int index, struct nvkm_top **ptop)
+{
+       return nvkm_top_new_(&gk104_top, device, index, ptop);
+}
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/top/priv.h b/drivers/gpu/drm/nouveau/nvkm/subdev/top/priv.h
new file mode 100644 (file)
index 0000000..adb3ed0
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef __NVKM_TOP_PRIV_H__
+#define __NVKM_TOP_PRIV_H__
+#define nvkm_top(p) container_of((p), struct nvkm_top, subdev)
+#include <subdev/top.h>
+
+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;
+};
+
+struct nvkm_top_device *nvkm_top_device_new(struct nvkm_top *);
+#endif
index 50b5649ad1a47ee43b7c39778946a9ffdc40d872..6b2d7531a7ff1beff1ee943745a0d5328e108940 100644 (file)
@@ -177,7 +177,7 @@ nvkm_volt_ctor(const struct nvkm_volt_func *func, struct nvkm_device *device,
        struct nvkm_bios *bios = device->bios;
        int i;
 
-       nvkm_subdev_ctor(&nvkm_volt, device, index, 0, &volt->subdev);
+       nvkm_subdev_ctor(&nvkm_volt, device, index, &volt->subdev);
        volt->func = func;
 
        /* Assuming the non-bios device should build the voltage table later */
index b735173a18ff3d055dcfafcae2cd17c58b6a6c4a..420bd84d84834083cfddcb56203811af94a5d799 100644 (file)
@@ -56,7 +56,7 @@ gk104_volt_set(struct nvkm_volt *base, u32 uv)
 
        /* the blob uses this crystal frequency, let's use it too. */
        div = 27648000 / bios->pwm_freq;
-       duty = (uv - bios->base) * div / bios->pwm_range;
+       duty = DIV_ROUND_UP((uv - bios->base) * div, bios->pwm_range);
 
        nvkm_wr32(device, 0x20340, div);
        nvkm_wr32(device, 0x20344, 0x80000000 | duty);
index 80398a684cae3a4d9a8af3630d8c0a24939de289..d86f5479345b7ac055b6e003b0296ff46a05f6d1 100644 (file)
@@ -138,7 +138,7 @@ static bool omap_atomic_is_pending(struct omap_drm_private *priv,
 }
 
 static int omap_atomic_commit(struct drm_device *dev,
-                             struct drm_atomic_state *state, bool async)
+                             struct drm_atomic_state *state, bool nonblock)
 {
        struct omap_drm_private *priv = dev->dev_private;
        struct omap_atomic_state_commit *commit;
@@ -177,7 +177,7 @@ static int omap_atomic_commit(struct drm_device *dev,
        /* Swap the state, this is the point of no return. */
        drm_atomic_helper_swap_state(dev, state);
 
-       if (async)
+       if (nonblock)
                schedule_work(&commit->work);
        else
                omap_atomic_complete(commit);
@@ -561,7 +561,7 @@ static int ioctl_gem_cpu_prep(struct drm_device *dev, void *data,
 
        VERB("%p:%p: handle=%d, op=%x", dev, file_priv, args->handle, args->op);
 
-       obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -584,7 +584,7 @@ static int ioctl_gem_cpu_fini(struct drm_device *dev, void *data,
 
        VERB("%p:%p: handle=%d", dev, file_priv, args->handle);
 
-       obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!obj)
                return -ENOENT;
 
@@ -608,7 +608,7 @@ static int ioctl_gem_info(struct drm_device *dev, void *data,
 
        VERB("%p:%p: handle=%d", dev, file_priv, args->handle);
 
-       obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!obj)
                return -ENOENT;
 
index 0fbe17d0ec6f07af668fdcc4ecbe3bbe20e3ce60..3f823c36891267a388db643176c3662333f4a779 100644 (file)
@@ -257,14 +257,14 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
 /* should these be made into common util helpers?
  */
 
-static inline int objects_lookup(struct drm_device *dev,
+static inline int objects_lookup(
                struct drm_file *filp, uint32_t pixel_format,
                struct drm_gem_object **bos, const uint32_t *handles)
 {
        int i, n = drm_format_num_planes(pixel_format);
 
        for (i = 0; i < n; i++) {
-               bos[i] = drm_gem_object_lookup(dev, filp, handles[i]);
+               bos[i] = drm_gem_object_lookup(filp, handles[i]);
                if (!bos[i])
                        goto fail;
 
index 610962396eb0e67669ef786afa45e2010d1df216..94ec06d3d737cd137f60cc3e632068dc9a48fe17 100644 (file)
@@ -378,7 +378,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
        struct drm_framebuffer *fb;
        int ret;
 
-       ret = objects_lookup(dev, file, mode_cmd->pixel_format,
+       ret = objects_lookup(file, mode_cmd->pixel_format,
                        bos, mode_cmd->handles);
        if (ret)
                return ERR_PTR(ret);
index 3cb16f0cf38155a3d21a72674887d6656c214535..89da41ac64d2548508f774e2819e7a986e16087a 100644 (file)
@@ -153,7 +153,7 @@ static int omap_fbdev_create(struct drm_fb_helper *helper,
                /* note: if fb creation failed, we can't rely on fb destroy
                 * to unref the bo:
                 */
-               drm_gem_object_unreference(fbdev->bo);
+               drm_gem_object_unreference_unlocked(fbdev->bo);
                ret = PTR_ERR(fb);
                goto fail;
        }
index 907154f5b67ce07ab6c7c2486a8149d1ba8f8e34..b97afc281778df99853c89da9e80bda2c0759e1c 100644 (file)
@@ -687,7 +687,7 @@ int omap_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
        int ret = 0;
 
        /* GEM does all our handle to object mapping */
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL) {
                ret = -ENOENT;
                goto fail;
index 93ee538a99f54c13ad182806ee21be5b57f98642..5252ab720e70043435b0ac7ecad70113948dbaff 100644 (file)
@@ -245,7 +245,7 @@ omap_plane_atomic_duplicate_state(struct drm_plane *plane)
 static void omap_plane_atomic_destroy_state(struct drm_plane *plane,
                                            struct drm_plane_state *state)
 {
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
        kfree(to_omap_plane_state(state));
 }
 
index ceb20486dacf4edb314f16adc241140dba8164c5..3a7bdf1c842b8f2b3ee9215a5a542dc7f76e3ab5 100644 (file)
@@ -72,6 +72,7 @@ struct panel_desc {
        } delay;
 
        u32 bus_format;
+       u32 bus_flags;
 };
 
 struct panel_simple {
@@ -116,7 +117,11 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
                }
 
                drm_display_mode_from_videomode(&vm, mode);
-               drm_mode_set_name(mode);
+
+               mode->type |= DRM_MODE_TYPE_DRIVER;
+
+               if (panel->desc->num_modes == 1)
+                       mode->type |= DRM_MODE_TYPE_PREFERRED;
 
                drm_mode_probed_add(connector, mode);
                num++;
@@ -132,6 +137,11 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
                        continue;
                }
 
+               mode->type |= DRM_MODE_TYPE_DRIVER;
+
+               if (panel->desc->num_modes == 1)
+                       mode->type |= DRM_MODE_TYPE_PREFERRED;
+
                drm_mode_set_name(mode);
 
                drm_mode_probed_add(connector, mode);
@@ -144,6 +154,7 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
        if (panel->desc->bus_format)
                drm_display_info_set_bus_formats(&connector->display_info,
                                                 &panel->desc->bus_format, 1);
+       connector->display_info.bus_flags = panel->desc->bus_flags;
 
        return num;
 }
@@ -813,6 +824,29 @@ static const struct panel_desc innolux_at043tn24 = {
        .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
 };
 
+static const struct drm_display_mode innolux_at070tn92_mode = {
+       .clock = 33333,
+       .hdisplay = 800,
+       .hsync_start = 800 + 210,
+       .hsync_end = 800 + 210 + 20,
+       .htotal = 800 + 210 + 20 + 46,
+       .vdisplay = 480,
+       .vsync_start = 480 + 22,
+       .vsync_end = 480 + 22 + 10,
+       .vtotal = 480 + 22 + 23 + 10,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc innolux_at070tn92 = {
+       .modes = &innolux_at070tn92_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 154,
+               .height = 86,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+};
+
 static const struct drm_display_mode innolux_g121i1_l01_mode = {
        .clock = 71000,
        .hdisplay = 1280,
@@ -1051,7 +1085,8 @@ static const struct panel_desc nec_nl4827hc19_05b = {
                .width = 95,
                .height = 54,
        },
-       .bus_format = MEDIA_BUS_FMT_RGB888_1X24
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+       .bus_flags = DRM_BUS_FLAG_PIXDATA_POSEDGE,
 };
 
 static const struct display_timing okaya_rs800480t_7x0gp_timing = {
@@ -1084,6 +1119,63 @@ static const struct panel_desc okaya_rs800480t_7x0gp = {
        .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 };
 
+static const struct drm_display_mode olimex_lcd_olinuxino_43ts_mode = {
+       .clock = 9000,
+       .hdisplay = 480,
+       .hsync_start = 480 + 5,
+       .hsync_end = 480 + 5 + 30,
+       .htotal = 480 + 5 + 30 + 10,
+       .vdisplay = 272,
+       .vsync_start = 272 + 8,
+       .vsync_end = 272 + 8 + 5,
+       .vtotal = 272 + 8 + 5 + 3,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc olimex_lcd_olinuxino_43ts = {
+       .modes = &olimex_lcd_olinuxino_43ts_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 105,
+               .height = 67,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
+};
+
+/*
+ * 800x480 CVT. The panel appears to be quite accepting, at least as far as
+ * pixel clocks, but this is the timing that was being used in the Adafruit
+ * installation instructions.
+ */
+static const struct drm_display_mode ontat_yx700wv03_mode = {
+       .clock = 29500,
+       .hdisplay = 800,
+       .hsync_start = 824,
+       .hsync_end = 896,
+       .htotal = 992,
+       .vdisplay = 480,
+       .vsync_start = 483,
+       .vsync_end = 493,
+       .vtotal = 500,
+       .vrefresh = 60,
+       .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC,
+};
+
+/*
+ * Specification at:
+ * https://www.adafruit.com/images/product-files/2406/c3163.pdf
+ */
+static const struct panel_desc ontat_yx700wv03 = {
+       .modes = &ontat_yx700wv03_mode,
+       .num_modes = 1,
+       .bpc = 8,
+       .size = {
+               .width = 154,
+               .height = 83,
+       },
+       .bus_format = MEDIA_BUS_FMT_RGB888_1X24,
+};
+
 static const struct drm_display_mode ortustech_com43h4m85ulc_mode  = {
        .clock = 25000,
        .hdisplay = 480,
@@ -1201,6 +1293,51 @@ static const struct panel_desc shelly_sca07010_bfn_lnn = {
        .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 };
 
+static const struct drm_display_mode tpk_f07a_0102_mode = {
+       .clock = 33260,
+       .hdisplay = 800,
+       .hsync_start = 800 + 40,
+       .hsync_end = 800 + 40 + 128,
+       .htotal = 800 + 40 + 128 + 88,
+       .vdisplay = 480,
+       .vsync_start = 480 + 10,
+       .vsync_end = 480 + 10 + 2,
+       .vtotal = 480 + 10 + 2 + 33,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc tpk_f07a_0102 = {
+       .modes = &tpk_f07a_0102_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 152,
+               .height = 91,
+       },
+       .bus_flags = DRM_BUS_FLAG_PIXDATA_POSEDGE,
+};
+
+static const struct drm_display_mode tpk_f10a_0102_mode = {
+       .clock = 45000,
+       .hdisplay = 1024,
+       .hsync_start = 1024 + 176,
+       .hsync_end = 1024 + 176 + 5,
+       .htotal = 1024 + 176 + 5 + 88,
+       .vdisplay = 600,
+       .vsync_start = 600 + 20,
+       .vsync_end = 600 + 20 + 5,
+       .vtotal = 600 + 20 + 5 + 25,
+       .vrefresh = 60,
+};
+
+static const struct panel_desc tpk_f10a_0102 = {
+       .modes = &tpk_f10a_0102_mode,
+       .num_modes = 1,
+       .size = {
+               .width = 223,
+               .height = 125,
+       },
+};
+
 static const struct display_timing urt_umsh_8596md_timing = {
        .pixelclock = { 33260000, 33260000, 33260000 },
        .hactive = { 800, 800, 800 },
@@ -1295,6 +1432,9 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "innolux,at043tn24",
                .data = &innolux_at043tn24,
+       }, {
+               .compatible = "innolux,at070tn92",
+               .data = &innolux_at070tn92,
        }, {
                .compatible ="innolux,g121i1-l01",
                .data = &innolux_g121i1_l01
@@ -1328,6 +1468,12 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "okaya,rs800480t-7x0gp",
                .data = &okaya_rs800480t_7x0gp,
+       }, {
+               .compatible = "olimex,lcd-olinuxino-43-ts",
+               .data = &olimex_lcd_olinuxino_43ts,
+       }, {
+               .compatible = "ontat,yx700wv03",
+               .data = &ontat_yx700wv03,
        }, {
                .compatible = "ortustech,com43h4m85ulc",
                .data = &ortustech_com43h4m85ulc,
@@ -1343,6 +1489,12 @@ static const struct of_device_id platform_of_match[] = {
        }, {
                .compatible = "shelly,sca07010-bfn-lnn",
                .data = &shelly_sca07010_bfn_lnn,
+       }, {
+               .compatible = "tpk,f07a-0102",
+               .data = &tpk_f07a_0102,
+       }, {
+               .compatible = "tpk,f10a-0102",
+               .data = &tpk_f10a_0102,
        }, {
                .compatible = "urt,umsh-8596md-t",
                .data = &urt_umsh_8596md_parallel,
index fdc1833b1af8eef1675dbb73db5a6c82e75e6d93..b5d4b41361bdf3d78575e60d9c95d0b9da23a0d6 100644 (file)
@@ -624,7 +624,7 @@ static int qxl_reap_surf(struct qxl_device *qdev, struct qxl_bo *surf, bool stal
        if (stall)
                mutex_unlock(&qdev->surf_evict_mutex);
 
-       ret = ttm_bo_wait(&surf->tbo, true, true, !stall);
+       ret = ttm_bo_wait(&surf->tbo, true, !stall);
 
        if (stall)
                mutex_lock(&qdev->surf_evict_mutex);
index 030409a3ee4e014ab512b5141d4b4e0ededbfe5d..8b5d543858927d9718a34fc5c2027f36d27325ed 100644 (file)
@@ -318,7 +318,7 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc,
        if (!handle)
                return qxl_hide_cursor(qdev);
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("cannot find cursor object\n");
                return -ENOENT;
@@ -465,7 +465,7 @@ static const struct drm_crtc_funcs qxl_crtc_funcs = {
        .page_flip = qxl_crtc_page_flip,
 };
 
-static void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb)
+void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb)
 {
        struct qxl_framebuffer *qxl_fb = to_qxl_framebuffer(fb);
 
@@ -527,12 +527,13 @@ int
 qxl_framebuffer_init(struct drm_device *dev,
                     struct qxl_framebuffer *qfb,
                     const struct drm_mode_fb_cmd2 *mode_cmd,
-                    struct drm_gem_object *obj)
+                    struct drm_gem_object *obj,
+                    const struct drm_framebuffer_funcs *funcs)
 {
        int ret;
 
        qfb->obj = obj;
-       ret = drm_framebuffer_init(dev, &qfb->base, &qxl_fb_funcs);
+       ret = drm_framebuffer_init(dev, &qfb->base, funcs);
        if (ret) {
                qfb->obj = NULL;
                return ret;
@@ -993,13 +994,15 @@ qxl_user_framebuffer_create(struct drm_device *dev,
        struct qxl_framebuffer *qxl_fb;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
+       if (!obj)
+               return NULL;
 
        qxl_fb = kzalloc(sizeof(*qxl_fb), GFP_KERNEL);
        if (qxl_fb == NULL)
                return NULL;
 
-       ret = qxl_framebuffer_init(dev, qxl_fb, mode_cmd, obj);
+       ret = qxl_framebuffer_init(dev, qxl_fb, mode_cmd, obj, &qxl_fb_funcs);
        if (ret) {
                kfree(qxl_fb);
                drm_gem_object_unreference_unlocked(obj);
index 7307b07fe06ba6f3aab0e60914de0a998bdbe7b0..dc9df5fe50baae2929d53a6ba0d5dc271618d218 100644 (file)
@@ -272,10 +272,8 @@ static struct drm_driver qxl_driver = {
 
 static int __init qxl_init(void)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && qxl_modeset == -1)
                return -EINVAL;
-#endif
 
        if (qxl_modeset == 0)
                return -EINVAL;
index 3f3897eb458ce326f39a32d6b324c4361d70747d..3ad6604b34ce76972b52fc67c593b323eee2897f 100644 (file)
@@ -324,8 +324,6 @@ struct qxl_device {
        struct workqueue_struct *gc_queue;
        struct work_struct gc_work;
 
-       struct work_struct fb_work;
-
        struct drm_property *hotplug_mode_update_property;
        int monitors_config_width;
        int monitors_config_height;
@@ -389,11 +387,13 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
 void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
 
 /* qxl_display.c */
+void qxl_user_framebuffer_destroy(struct drm_framebuffer *fb);
 int
 qxl_framebuffer_init(struct drm_device *dev,
                     struct qxl_framebuffer *rfb,
                     const struct drm_mode_fb_cmd2 *mode_cmd,
-                    struct drm_gem_object *obj);
+                    struct drm_gem_object *obj,
+                    const struct drm_framebuffer_funcs *funcs);
 void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
 void qxl_send_monitors_config(struct qxl_device *qdev);
 int qxl_create_monitors_object(struct qxl_device *qdev);
@@ -553,7 +553,6 @@ int qxl_irq_init(struct qxl_device *qdev);
 irqreturn_t qxl_irq_handler(int irq, void *arg);
 
 /* qxl_fb.c */
-int qxl_fb_init(struct qxl_device *qdev);
 bool qxl_fbdev_qobj_is_fb(struct qxl_device *qdev, struct qxl_bo *qobj);
 
 int qxl_debugfs_add_files(struct qxl_device *qdev,
index d34bb4130ff095d74d915abbe2d3503b78077fc1..5e65d5d2d937d5f3db4be062dbf48eab5d116d29 100644 (file)
@@ -76,7 +76,7 @@ int qxl_mode_dumb_mmap(struct drm_file *file_priv,
        struct qxl_bo *qobj;
 
        BUG_ON(!offset_p);
-       gobj = drm_gem_object_lookup(dev, file_priv, handle);
+       gobj = drm_gem_object_lookup(file_priv, handle);
        if (gobj == NULL)
                return -ENOENT;
        qobj = gem_to_qxl_bo(gobj);
index 7136e521e6dba7e3bc7f9671a580ab218d138e7a..5ea57f6320b880e78b6183965751198350134e3e 100644 (file)
@@ -46,15 +46,6 @@ struct qxl_fbdev {
        struct list_head delayed_ops;
        void *shadow;
        int size;
-
-       /* dirty memory logging */
-       struct {
-               spinlock_t lock;
-               unsigned x1;
-               unsigned y1;
-               unsigned x2;
-               unsigned y2;
-       } dirty;
 };
 
 static void qxl_fb_image_init(struct qxl_fb_image *qxl_fb_image,
@@ -82,169 +73,18 @@ static void qxl_fb_image_init(struct qxl_fb_image *qxl_fb_image,
        }
 }
 
-static void qxl_fb_dirty_flush(struct fb_info *info)
-{
-       struct qxl_fbdev *qfbdev = info->par;
-       struct qxl_device *qdev = qfbdev->qdev;
-       struct qxl_fb_image qxl_fb_image;
-       struct fb_image *image = &qxl_fb_image.fb_image;
-       unsigned long flags;
-       u32 x1, x2, y1, y2;
-
-       /* TODO: hard coding 32 bpp */
-       int stride = qfbdev->qfb.base.pitches[0];
-
-       spin_lock_irqsave(&qfbdev->dirty.lock, flags);
-
-       x1 = qfbdev->dirty.x1;
-       x2 = qfbdev->dirty.x2;
-       y1 = qfbdev->dirty.y1;
-       y2 = qfbdev->dirty.y2;
-       qfbdev->dirty.x1 = 0;
-       qfbdev->dirty.x2 = 0;
-       qfbdev->dirty.y1 = 0;
-       qfbdev->dirty.y2 = 0;
-
-       spin_unlock_irqrestore(&qfbdev->dirty.lock, flags);
-
-       /*
-        * we are using a shadow draw buffer, at qdev->surface0_shadow
-        */
-       qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", x1, x2, y1, y2);
-       image->dx = x1;
-       image->dy = y1;
-       image->width = x2 - x1 + 1;
-       image->height = y2 - y1 + 1;
-       image->fg_color = 0xffffffff; /* unused, just to avoid uninitialized
-                                        warnings */
-       image->bg_color = 0;
-       image->depth = 32;           /* TODO: take from somewhere? */
-       image->cmap.start = 0;
-       image->cmap.len = 0;
-       image->cmap.red = NULL;
-       image->cmap.green = NULL;
-       image->cmap.blue = NULL;
-       image->cmap.transp = NULL;
-       image->data = qfbdev->shadow + (x1 * 4) + (stride * y1);
-
-       qxl_fb_image_init(&qxl_fb_image, qdev, info, NULL);
-       qxl_draw_opaque_fb(&qxl_fb_image, stride);
-}
-
-static void qxl_dirty_update(struct qxl_fbdev *qfbdev,
-                            int x, int y, int width, int height)
-{
-       struct qxl_device *qdev = qfbdev->qdev;
-       unsigned long flags;
-       int x2, y2;
-
-       x2 = x + width - 1;
-       y2 = y + height - 1;
-
-       spin_lock_irqsave(&qfbdev->dirty.lock, flags);
-
-       if ((qfbdev->dirty.y2 - qfbdev->dirty.y1) &&
-           (qfbdev->dirty.x2 - qfbdev->dirty.x1)) {
-               if (qfbdev->dirty.y1 < y)
-                       y = qfbdev->dirty.y1;
-               if (qfbdev->dirty.y2 > y2)
-                       y2 = qfbdev->dirty.y2;
-               if (qfbdev->dirty.x1 < x)
-                       x = qfbdev->dirty.x1;
-               if (qfbdev->dirty.x2 > x2)
-                       x2 = qfbdev->dirty.x2;
-       }
-
-       qfbdev->dirty.x1 = x;
-       qfbdev->dirty.x2 = x2;
-       qfbdev->dirty.y1 = y;
-       qfbdev->dirty.y2 = y2;
-
-       spin_unlock_irqrestore(&qfbdev->dirty.lock, flags);
-
-       schedule_work(&qdev->fb_work);
-}
-
-static void qxl_deferred_io(struct fb_info *info,
-                           struct list_head *pagelist)
-{
-       struct qxl_fbdev *qfbdev = info->par;
-       unsigned long start, end, min, max;
-       struct page *page;
-       int y1, y2;
-
-       min = ULONG_MAX;
-       max = 0;
-       list_for_each_entry(page, pagelist, lru) {
-               start = page->index << PAGE_SHIFT;
-               end = start + PAGE_SIZE - 1;
-               min = min(min, start);
-               max = max(max, end);
-       }
-
-       if (min < max) {
-               y1 = min / info->fix.line_length;
-               y2 = (max / info->fix.line_length) + 1;
-               qxl_dirty_update(qfbdev, 0, y1, info->var.xres, y2 - y1);
-       }
-};
-
 static struct fb_deferred_io qxl_defio = {
        .delay          = QXL_DIRTY_DELAY,
-       .deferred_io    = qxl_deferred_io,
+       .deferred_io    = drm_fb_helper_deferred_io,
 };
 
-static void qxl_fb_fillrect(struct fb_info *info,
-                           const struct fb_fillrect *rect)
-{
-       struct qxl_fbdev *qfbdev = info->par;
-
-       drm_fb_helper_sys_fillrect(info, rect);
-       qxl_dirty_update(qfbdev, rect->dx, rect->dy, rect->width,
-                        rect->height);
-}
-
-static void qxl_fb_copyarea(struct fb_info *info,
-                           const struct fb_copyarea *area)
-{
-       struct qxl_fbdev *qfbdev = info->par;
-
-       drm_fb_helper_sys_copyarea(info, area);
-       qxl_dirty_update(qfbdev, area->dx, area->dy, area->width,
-                        area->height);
-}
-
-static void qxl_fb_imageblit(struct fb_info *info,
-                            const struct fb_image *image)
-{
-       struct qxl_fbdev *qfbdev = info->par;
-
-       drm_fb_helper_sys_imageblit(info, image);
-       qxl_dirty_update(qfbdev, image->dx, image->dy, image->width,
-                        image->height);
-}
-
-static void qxl_fb_work(struct work_struct *work)
-{
-       struct qxl_device *qdev = container_of(work, struct qxl_device, fb_work);
-       struct qxl_fbdev *qfbdev = qdev->mode_info.qfbdev;
-
-       qxl_fb_dirty_flush(qfbdev->helper.fbdev);
-}
-
-int qxl_fb_init(struct qxl_device *qdev)
-{
-       INIT_WORK(&qdev->fb_work, qxl_fb_work);
-       return 0;
-}
-
 static struct fb_ops qxlfb_ops = {
        .owner = THIS_MODULE,
        .fb_check_var = drm_fb_helper_check_var,
        .fb_set_par = drm_fb_helper_set_par, /* TODO: copy vmwgfx */
-       .fb_fillrect = qxl_fb_fillrect,
-       .fb_copyarea = qxl_fb_copyarea,
-       .fb_imageblit = qxl_fb_imageblit,
+       .fb_fillrect = drm_fb_helper_sys_fillrect,
+       .fb_copyarea = drm_fb_helper_sys_copyarea,
+       .fb_imageblit = drm_fb_helper_sys_imageblit,
        .fb_pan_display = drm_fb_helper_pan_display,
        .fb_blank = drm_fb_helper_blank,
        .fb_setcmap = drm_fb_helper_setcmap,
@@ -338,6 +178,57 @@ out_unref:
        return ret;
 }
 
+/*
+ * FIXME
+ * It should not be necessary to have a special dirty() callback for fbdev.
+ */
+static int qxlfb_framebuffer_dirty(struct drm_framebuffer *fb,
+                                  struct drm_file *file_priv,
+                                  unsigned flags, unsigned color,
+                                  struct drm_clip_rect *clips,
+                                  unsigned num_clips)
+{
+       struct qxl_device *qdev = fb->dev->dev_private;
+       struct fb_info *info = qdev->fbdev_info;
+       struct qxl_fbdev *qfbdev = info->par;
+       struct qxl_fb_image qxl_fb_image;
+       struct fb_image *image = &qxl_fb_image.fb_image;
+
+       /* TODO: hard coding 32 bpp */
+       int stride = qfbdev->qfb.base.pitches[0];
+
+       /*
+        * we are using a shadow draw buffer, at qdev->surface0_shadow
+        */
+       qxl_io_log(qdev, "dirty x[%d, %d], y[%d, %d]", clips->x1, clips->x2,
+                  clips->y1, clips->y2);
+       image->dx = clips->x1;
+       image->dy = clips->y1;
+       image->width = clips->x2 - clips->x1;
+       image->height = clips->y2 - clips->y1;
+       image->fg_color = 0xffffffff; /* unused, just to avoid uninitialized
+                                        warnings */
+       image->bg_color = 0;
+       image->depth = 32;           /* TODO: take from somewhere? */
+       image->cmap.start = 0;
+       image->cmap.len = 0;
+       image->cmap.red = NULL;
+       image->cmap.green = NULL;
+       image->cmap.blue = NULL;
+       image->cmap.transp = NULL;
+       image->data = qfbdev->shadow + (clips->x1 * 4) + (stride * clips->y1);
+
+       qxl_fb_image_init(&qxl_fb_image, qdev, info, NULL);
+       qxl_draw_opaque_fb(&qxl_fb_image, stride);
+
+       return 0;
+}
+
+static const struct drm_framebuffer_funcs qxlfb_fb_funcs = {
+       .destroy = qxl_user_framebuffer_destroy,
+       .dirty = qxlfb_framebuffer_dirty,
+};
+
 static int qxlfb_create(struct qxl_fbdev *qfbdev,
                        struct drm_fb_helper_surface_size *sizes)
 {
@@ -360,6 +251,9 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev,
        mode_cmd.pixel_format = drm_mode_legacy_fb_format(bpp, depth);
 
        ret = qxlfb_create_pinned_object(qfbdev, &mode_cmd, &gobj);
+       if (ret < 0)
+               return ret;
+
        qbo = gem_to_qxl_bo(gobj);
        QXL_INFO(qdev, "%s: %dx%d %d\n", __func__, mode_cmd.width,
                 mode_cmd.height, mode_cmd.pitches[0]);
@@ -383,7 +277,8 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev,
 
        info->par = qfbdev;
 
-       qxl_framebuffer_init(qdev->ddev, &qfbdev->qfb, &mode_cmd, gobj);
+       qxl_framebuffer_init(qdev->ddev, &qfbdev->qfb, &mode_cmd, gobj,
+                            &qxlfb_fb_funcs);
 
        fb = &qfbdev->qfb.base;
 
@@ -443,11 +338,11 @@ out_unref:
                }
        }
        if (fb && ret) {
-               drm_gem_object_unreference(gobj);
+               drm_gem_object_unreference_unlocked(gobj);
                drm_framebuffer_cleanup(fb);
                kfree(fb);
        }
-       drm_gem_object_unreference(gobj);
+       drm_gem_object_unreference_unlocked(gobj);
        return ret;
 }
 
@@ -504,7 +399,6 @@ int qxl_fbdev_init(struct qxl_device *qdev)
        qfbdev->qdev = qdev;
        qdev->mode_info.qfbdev = qfbdev;
        spin_lock_init(&qfbdev->delayed_ops_lock);
-       spin_lock_init(&qfbdev->dirty.lock);
        INIT_LIST_HEAD(&qfbdev->delayed_ops);
 
        drm_fb_helper_prepare(qdev->ddev, &qfbdev->helper,
index 7c2e78201ead9d475c3ba97d083c523026c21a47..5a4c8c492683048156b853b7a88fce4582b51b90 100644 (file)
@@ -107,15 +107,14 @@ apply_surf_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info)
 }
 
 /* return holding the reference to this object */
-static int qxlhw_handle_to_bo(struct qxl_device *qdev,
-                             struct drm_file *file_priv, uint64_t handle,
+static int qxlhw_handle_to_bo(struct drm_file *file_priv, uint64_t handle,
                              struct qxl_release *release, struct qxl_bo **qbo_p)
 {
        struct drm_gem_object *gobj;
        struct qxl_bo *qobj;
        int ret;
 
-       gobj = drm_gem_object_lookup(qdev->ddev, file_priv, handle);
+       gobj = drm_gem_object_lookup(file_priv, handle);
        if (!gobj)
                return -EINVAL;
 
@@ -221,7 +220,7 @@ static int qxl_process_single_command(struct qxl_device *qdev,
                reloc_info[i].type = reloc.reloc_type;
 
                if (reloc.dst_handle) {
-                       ret = qxlhw_handle_to_bo(qdev, file_priv, reloc.dst_handle, release,
+                       ret = qxlhw_handle_to_bo(file_priv, reloc.dst_handle, release,
                                                 &reloc_info[i].dst_bo);
                        if (ret)
                                goto out_free_bos;
@@ -234,7 +233,7 @@ static int qxl_process_single_command(struct qxl_device *qdev,
 
                /* reserve and validate the reloc dst bo */
                if (reloc.reloc_type == QXL_RELOC_TYPE_BO || reloc.src_handle) {
-                       ret = qxlhw_handle_to_bo(qdev, file_priv, reloc.src_handle, release,
+                       ret = qxlhw_handle_to_bo(file_priv, reloc.src_handle, release,
                                                 &reloc_info[i].src_bo);
                        if (ret)
                                goto out_free_bos;
@@ -314,7 +313,7 @@ static int qxl_update_area_ioctl(struct drm_device *dev, void *data,
            update_area->top >= update_area->bottom)
                return -EINVAL;
 
-       gobj = drm_gem_object_lookup(dev, file, update_area->handle);
+       gobj = drm_gem_object_lookup(file, update_area->handle);
        if (gobj == NULL)
                return -ENOENT;
 
index b2977a18193589250f1c0e69814eb72ec05ef05e..2319800b7addc5af25cda7d33a5f186d7ea4c69a 100644 (file)
@@ -261,10 +261,6 @@ static int qxl_device_init(struct qxl_device *qdev,
        qdev->gc_queue = create_singlethread_workqueue("qxl_gc");
        INIT_WORK(&qdev->gc_work, qxl_gc_work);
 
-       r = qxl_fb_init(qdev);
-       if (r)
-               return r;
-
        return 0;
 }
 
index 37af1bc0dd00102431e1f9415e0af7cf39b4edf8..4d8311373ba3ee6116256c6a1d5d32b86cc3e9b4 100644 (file)
@@ -31,7 +31,7 @@ static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS) {
                        struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private;
@@ -67,7 +67,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type,
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS) {
                        struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private;
@@ -79,7 +79,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type,
        if (mem_type)
                *mem_type = bo->tbo.mem.mem_type;
 
-       r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
+       r = ttm_bo_wait(&bo->tbo, true, no_wait);
        ttm_bo_unreserve(&bo->tbo);
        return r;
 }
index 953412766416f379e04a521f2c9f91a1078c8e12..0738d74c8d049faf18f0153378de60a1978a49e7 100644 (file)
@@ -384,6 +384,8 @@ static struct ttm_bo_driver qxl_bo_driver = {
        .io_mem_reserve = &qxl_ttm_io_mem_reserve,
        .io_mem_free = &qxl_ttm_io_mem_free,
        .move_notify = &qxl_bo_move_notify,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int qxl_ttm_init(struct qxl_device *qdev)
index 532127c55de64197698336c92d602b0ff3043071..2e216e2ea78c3535a07b761327c04c345a6667ff 100644 (file)
@@ -1375,6 +1375,11 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
                break;
        }
 
+       /* Make sure surface address is updated at vertical blank rather than
+        * horizontal blank
+        */
+       WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 0);
+
        WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
               upper_32_bits(fb_location));
        WREG32(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
@@ -1427,12 +1432,6 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
        WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
               (viewport_w << 16) | viewport_h);
 
-       /* pageflip setup */
-       /* make sure flip is at vb rather than hb */
-       tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
-       tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN;
-       WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
-
        /* set pageflip to happen only at start of vblank interval (front porch) */
        WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
 
@@ -1466,7 +1465,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
        uint64_t fb_location;
        uint32_t fb_format, fb_pitch_pixels, tiling_flags;
        u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE;
-       u32 tmp, viewport_w, viewport_h;
+       u32 viewport_w, viewport_h;
        int r;
        bool bypass_lut = false;
 
@@ -1581,6 +1580,11 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
        else
                WREG32(AVIVO_D2VGA_CONTROL, 0);
 
+       /* Make sure surface address is update at vertical blank rather than
+        * horizontal blank
+        */
+       WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, 0);
+
        if (rdev->family >= CHIP_RV770) {
                if (radeon_crtc->crtc_id) {
                        WREG32(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location));
@@ -1627,12 +1631,6 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,
        WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,
               (viewport_w << 16) | viewport_h);
 
-       /* pageflip setup */
-       /* make sure flip is at vb rather than hb */
-       tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset);
-       tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN;
-       WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp);
-
        /* set pageflip to happen only at start of vblank interval (front porch) */
        WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 3);
 
index 8ac82df2efde4d7359fcf81e38092358780a9ee9..ba192a35c60771cbcd9461b6d127379ca17295b2 100644 (file)
@@ -5261,15 +5261,21 @@ static void cik_gpu_pci_config_reset(struct radeon_device *rdev)
  * cik_asic_reset - soft reset GPU
  *
  * @rdev: radeon_device pointer
+ * @hard: force hard reset
  *
  * Look up which blocks are hung and attempt
  * to reset them.
  * Returns 0 for success.
  */
-int cik_asic_reset(struct radeon_device *rdev)
+int cik_asic_reset(struct radeon_device *rdev, bool hard)
 {
        u32 reset_mask;
 
+       if (hard) {
+               cik_gpu_pci_config_reset(rdev);
+               return 0;
+       }
+
        reset_mask = cik_gpu_check_soft_reset(rdev);
 
        if (reset_mask)
@@ -8137,6 +8143,164 @@ restart_ih:
 /*
  * startup/shutdown callbacks
  */
+static void cik_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails cik_uvd_start() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void cik_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = uvd_v4_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD 4.2 resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void cik_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
+static void cik_vce_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
+               /*
+                * At this point rdev->vce.vcpu_bo is NULL which trickles down
+                * to early fails cik_vce_start() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable vce here.
+                */
+               rdev->has_vce = 0;
+               return;
+       }
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
+}
+
+static void cik_vce_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = vce_v2_0_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
+}
+
+static void cik_vce_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       r = vce_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
+               return;
+       }
+}
+
 /**
  * cik_startup - program the asic to a functional state
  *
@@ -8239,34 +8403,8 @@ static int cik_startup(struct radeon_device *rdev)
                return r;
        }
 
-       r = radeon_uvd_resume(rdev);
-       if (!r) {
-               r = uvd_v4_2_resume(rdev);
-               if (!r) {
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          R600_RING_TYPE_UVD_INDEX);
-                       if (r)
-                               dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-               }
-       }
-       if (r)
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
-
-       r = radeon_vce_resume(rdev);
-       if (!r) {
-               r = vce_v2_0_resume(rdev);
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE1_INDEX);
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE2_INDEX);
-       }
-       if (r) {
-               dev_err(rdev->dev, "VCE init error (%d).\n", r);
-               rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
-               rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
-       }
+       cik_uvd_start(rdev);
+       cik_vce_start(rdev);
 
        /* Enable IRQ */
        if (!rdev->irq.installed) {
@@ -8342,32 +8480,8 @@ static int cik_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-       if (ring->ring_size) {
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    RADEON_CP_PACKET2);
-               if (!r)
-                       r = uvd_v1_0_init(rdev);
-               if (r)
-                       DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-       }
-
-       r = -ENOENT;
-
-       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-       if (ring->ring_size)
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    VCE_CMD_NO_OP);
-
-       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-       if (ring->ring_size)
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    VCE_CMD_NO_OP);
-
-       if (!r)
-               r = vce_v1_0_init(rdev);
-       else if (r != -ENOENT)
-               DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
+       cik_uvd_resume(rdev);
+       cik_vce_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -8443,9 +8557,12 @@ int cik_suspend(struct radeon_device *rdev)
        radeon_vm_manager_fini(rdev);
        cik_cp_enable(rdev, false);
        cik_sdma_enable(rdev, false);
-       uvd_v1_0_fini(rdev);
-       radeon_uvd_suspend(rdev);
-       radeon_vce_suspend(rdev);
+       if (rdev->has_uvd) {
+               uvd_v1_0_fini(rdev);
+               radeon_uvd_suspend(rdev);
+       }
+       if (rdev->has_vce)
+               radeon_vce_suspend(rdev);
        cik_fini_pg(rdev);
        cik_fini_cg(rdev);
        cik_irq_suspend(rdev);
@@ -8571,23 +8688,8 @@ int cik_init(struct radeon_device *rdev)
        ring->ring_obj = NULL;
        r600_ring_init(rdev, ring, 256 * 1024);
 
-       r = radeon_uvd_init(rdev);
-       if (!r) {
-               ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-       }
-
-       r = radeon_vce_init(rdev);
-       if (!r) {
-               ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-
-               ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-       }
+       cik_uvd_init(rdev);
+       cik_vce_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
index 391ff9d5d70668326cea4ff4a078eeec673198bd..cead2284fd796790fba849343b8891aa86134031 100644 (file)
 #define UVD_UDEC_DBW_ADDR_CONFIG       0xef54
 
 #define UVD_LMI_EXT40_ADDR             0xf498
+#define UVD_GP_SCRATCH4                        0xf4e0
 #define UVD_LMI_ADDR_EXT               0xf594
 #define UVD_VCPU_CACHE_OFFSET0         0xf608
 #define UVD_VCPU_CACHE_SIZE0           0xf60c
index 34f7a29d9366755c12d9d270ce4c170c67219180..db275b7ed34abd5efa2c6f0e5bd19d7c54bb3177 100644 (file)
@@ -1407,11 +1407,14 @@ void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc)
  * Triggers the actual pageflip by updating the primary
  * surface base address (evergreen+).
  */
-void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
+void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base,
+                        bool async)
 {
        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
 
        /* update the scanout addresses */
+       WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
+              async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
        WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
               upper_32_bits(crtc_base));
        WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
@@ -1864,7 +1867,8 @@ void evergreen_hpd_init(struct radeon_device *rdev)
                        break;
                }
                radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
-               enabled |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       enabled |= 1 << radeon_connector->hpd.hpd;
        }
        radeon_irq_kms_enable_hpd(rdev, enabled);
 }
@@ -1907,7 +1911,8 @@ void evergreen_hpd_fini(struct radeon_device *rdev)
                default:
                        break;
                }
-               disabled |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       disabled |= 1 << radeon_connector->hpd.hpd;
        }
        radeon_irq_kms_disable_hpd(rdev, disabled);
 }
@@ -4136,10 +4141,15 @@ void evergreen_gpu_pci_config_reset(struct radeon_device *rdev)
        }
 }
 
-int evergreen_asic_reset(struct radeon_device *rdev)
+int evergreen_asic_reset(struct radeon_device *rdev, bool hard)
 {
        u32 reset_mask;
 
+       if (hard) {
+               evergreen_gpu_pci_config_reset(rdev);
+               return 0;
+       }
+
        reset_mask = evergreen_gpu_check_soft_reset(rdev);
 
        if (reset_mask)
@@ -5515,6 +5525,73 @@ restart_ih:
        return IRQ_HANDLED;
 }
 
+static void evergreen_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v2_2_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void evergreen_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v2_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void evergreen_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
 static int evergreen_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
@@ -5579,16 +5656,7 @@ static int evergreen_startup(struct radeon_device *rdev)
                return r;
        }
 
-       r = uvd_v2_2_resume(rdev);
-       if (!r) {
-               r = radeon_fence_driver_start_ring(rdev,
-                                                  R600_RING_TYPE_UVD_INDEX);
-               if (r)
-                       dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-       }
-
-       if (r)
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+       evergreen_uvd_start(rdev);
 
        /* Enable IRQ */
        if (!rdev->irq.installed) {
@@ -5627,16 +5695,7 @@ static int evergreen_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-       if (ring->ring_size) {
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    RADEON_CP_PACKET2);
-               if (!r)
-                       r = uvd_v1_0_init(rdev);
-
-               if (r)
-                       DRM_ERROR("radeon: error initializing UVD (%d).\n", r);
-       }
+       evergreen_uvd_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -5691,8 +5750,10 @@ int evergreen_suspend(struct radeon_device *rdev)
 {
        radeon_pm_suspend(rdev);
        radeon_audio_fini(rdev);
-       uvd_v1_0_fini(rdev);
-       radeon_uvd_suspend(rdev);
+       if (rdev->has_uvd) {
+               uvd_v1_0_fini(rdev);
+               radeon_uvd_suspend(rdev);
+       }
        r700_cp_stop(rdev);
        r600_dma_stop(rdev);
        evergreen_irq_suspend(rdev);
@@ -5793,12 +5854,7 @@ int evergreen_init(struct radeon_device *rdev)
        rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
        r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
 
-       r = radeon_uvd_init(rdev);
-       if (!r) {
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
-               r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
-                              4096);
-       }
+       evergreen_uvd_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
index 9e93205eb9e43952ea0eed4274aa5fe1798eff8d..0d3f744de35aa4c7fb5a8ad3389d896a719b2a60 100644 (file)
@@ -2608,6 +2608,51 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
                        }
                }
                break;
+       case PACKET3_SET_APPEND_CNT:
+       {
+               uint32_t areg;
+               uint32_t allowed_reg_base;
+               uint32_t source_sel;
+               if (pkt->count != 2) {
+                       DRM_ERROR("bad SET_APPEND_CNT (invalid count)\n");
+                       return -EINVAL;
+               }
+
+               allowed_reg_base = GDS_APPEND_COUNT_0;
+               allowed_reg_base -= PACKET3_SET_CONTEXT_REG_START;
+               allowed_reg_base >>= 2;
+
+               areg = idx_value >> 16;
+               if (areg < allowed_reg_base || areg > (allowed_reg_base + 11)) {
+                       dev_warn(p->dev, "forbidden register for append cnt 0x%08x at %d\n",
+                                areg, idx);
+                       return -EINVAL;
+               }
+
+               source_sel = G_PACKET3_SET_APPEND_CNT_SRC_SELECT(idx_value);
+               if (source_sel == PACKET3_SAC_SRC_SEL_MEM) {
+                       uint64_t offset;
+                       uint32_t swap;
+                       r = radeon_cs_packet_next_reloc(p, &reloc, 0);
+                       if (r) {
+                               DRM_ERROR("bad SET_APPEND_CNT (missing reloc)\n");
+                               return -EINVAL;
+                       }
+                       offset = radeon_get_ib_value(p, idx + 1);
+                       swap = offset & 0x3;
+                       offset &= ~0x3;
+
+                       offset += ((u64)(radeon_get_ib_value(p, idx + 2) & 0xff)) << 32;
+
+                       offset += reloc->gpu_offset;
+                       ib[idx+1] = (offset & 0xfffffffc) | swap;
+                       ib[idx+2] = upper_32_bits(offset) & 0xff;
+               } else {
+                       DRM_ERROR("bad SET_APPEND_CNT (unsupported operation)\n");
+                       return -EINVAL;
+               }
+               break;
+       }
        case PACKET3_NOP:
                break;
        default:
@@ -3438,6 +3483,27 @@ static int evergreen_vm_packet3_check(struct radeon_device *rdev,
                        }
                }
                break;
+       case PACKET3_SET_APPEND_CNT: {
+               uint32_t areg;
+               uint32_t allowed_reg_base;
+
+               if (pkt->count != 2) {
+                       DRM_ERROR("bad SET_APPEND_CNT (invalid count)\n");
+                       return -EINVAL;
+               }
+
+               allowed_reg_base = GDS_APPEND_COUNT_0;
+               allowed_reg_base -= PACKET3_SET_CONTEXT_REG_START;
+               allowed_reg_base >>= 2;
+
+               areg = idx_value >> 16;
+               if (areg < allowed_reg_base || areg > (allowed_reg_base + 11)) {
+                       DRM_ERROR("forbidden register for append cnt 0x%08x at %d\n",
+                                 areg, idx);
+                       return -EINVAL;
+               }
+               break;
+       }
        default:
                return -EINVAL;
        }
index 13b6029d65cc524528aec6a1f1727b9d695aa4af..0b174e14e9a688a84da9fbf575253fb72a868a99 100644 (file)
 #define        PACKET3_SET_CONTEXT_REG_INDIRECT                0x73
 #define        PACKET3_SET_RESOURCE_INDIRECT                   0x74
 #define        PACKET3_SET_APPEND_CNT                          0x75
+/* SET_APPEND_CNT - documentation
+ * 1. header
+ * 2. COMMAND
+ *  1:0 - SOURCE SEL
+ *  15:2 - Reserved
+ *  31:16 - WR_REG_OFFSET - context register to write source data to.
+ *          (one of R_02872C_GDS_APPEND_COUNT_0-11)
+ * 3. CONTROL
+ *  (for source == mem)
+ *  31:2 SRC_ADDRESS_LO
+ *  0:1 SWAP
+ *  (for source == GDS)
+ *  31:0 GDS offset
+ *  (for source == DATA)
+ *  31:0 DATA
+ *  (for source == REG)
+ *  31:0 REG
+ * 4. SRC_ADDRESS_HI[7:0]
+ * kernel driver 2.44 only supports SRC == MEM.
+ */
+#define PACKET3_SET_APPEND_CNT_SRC_SELECT(x) ((x) << 0)
+#define G_PACKET3_SET_APPEND_CNT_SRC_SELECT(x) ((x & 0x3) >> 0)
+/* source is from the data in CONTROL */
+#define PACKET3_SAC_SRC_SEL_DATA 0x0
+/* source is from register */
+#define PACKET3_SAC_SRC_SEL_REG  0x1
+/* source is from GDS offset in CONTROL */
+#define PACKET3_SAC_SRC_SEL_GDS  0x2
+/* source is from memory address */
+#define PACKET3_SAC_SRC_SEL_MEM  0x3
 
 #define        SQ_RESOURCE_CONSTANT_WORD7_0                            0x3001c
 #define                S__SQ_CONSTANT_TYPE(x)                  (((x) & 3) << 30)
 
 #define GDS_ADDR_BASE                                  0x28720
 
+#define GDS_APPEND_COUNT_0                             0x2872C
+#define GDS_APPEND_COUNT_1                             0x28730
+#define GDS_APPEND_COUNT_2                             0x28734
+#define GDS_APPEND_COUNT_3                             0x28738
+#define GDS_APPEND_COUNT_4                             0x2873C
+#define GDS_APPEND_COUNT_5                             0x28740
+#define GDS_APPEND_COUNT_6                             0x28744
+#define GDS_APPEND_COUNT_7                             0x28748
+#define GDS_APPEND_COUNT_8                             0x2874c
+#define GDS_APPEND_COUNT_9                             0x28750
+#define GDS_APPEND_COUNT_10                            0x28754
+#define GDS_APPEND_COUNT_11                            0x28758
+
 #define        CB_IMMED0_BASE                                  0x28b9c
 #define        CB_IMMED1_BASE                                  0x28ba0
 #define        CB_IMMED2_BASE                                  0x28ba4
index b88d63c9be99194f0138797c00e049575874cf46..4a3d7cab83f7a554aea1a21b309815bc83f1900c 100644 (file)
@@ -1959,10 +1959,15 @@ static void cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)
        evergreen_print_gpu_status_regs(rdev);
 }
 
-int cayman_asic_reset(struct radeon_device *rdev)
+int cayman_asic_reset(struct radeon_device *rdev, bool hard)
 {
        u32 reset_mask;
 
+       if (hard) {
+               evergreen_gpu_pci_config_reset(rdev);
+               return 0;
+       }
+
        reset_mask = cayman_gpu_check_soft_reset(rdev);
 
        if (reset_mask)
@@ -2002,6 +2007,160 @@ bool cayman_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring)
        return radeon_ring_test_lockup(rdev, ring);
 }
 
+static void cayman_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v2_2_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void cayman_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v2_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void cayman_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
+static void cayman_vce_init(struct radeon_device *rdev)
+{
+       int r;
+
+       /* Only set for CHIP_ARUBA */
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
+               /*
+                * At this point rdev->vce.vcpu_bo is NULL which trickles down
+                * to early fails cayman_vce_start() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable vce here.
+                */
+               rdev->has_vce = 0;
+               return;
+       }
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
+}
+
+static void cayman_vce_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = vce_v1_0_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
+}
+
+static void cayman_vce_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       r = vce_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
+               return;
+       }
+}
+
 static int cayman_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];
@@ -2056,34 +2215,8 @@ static int cayman_startup(struct radeon_device *rdev)
                return r;
        }
 
-       r = uvd_v2_2_resume(rdev);
-       if (!r) {
-               r = radeon_fence_driver_start_ring(rdev,
-                                                  R600_RING_TYPE_UVD_INDEX);
-               if (r)
-                       dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-       }
-       if (r)
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
-
-       if (rdev->family == CHIP_ARUBA) {
-               r = radeon_vce_resume(rdev);
-               if (!r)
-                       r = vce_v1_0_resume(rdev);
-
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE1_INDEX);
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE2_INDEX);
-
-               if (r) {
-                       dev_err(rdev->dev, "VCE init error (%d).\n", r);
-                       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
-                       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
-               }
-       }
+       cayman_uvd_start(rdev);
+       cayman_vce_start(rdev);
 
        r = radeon_fence_driver_start_ring(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
        if (r) {
@@ -2152,30 +2285,8 @@ static int cayman_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-       if (ring->ring_size) {
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    RADEON_CP_PACKET2);
-               if (!r)
-                       r = uvd_v1_0_init(rdev);
-               if (r)
-                       DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-       }
-
-       if (rdev->family == CHIP_ARUBA) {
-               ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-               if (ring->ring_size)
-                       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
-
-               ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-               if (ring->ring_size)
-                       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, 0x0);
-
-               if (!r)
-                       r = vce_v1_0_init(rdev);
-               if (r)
-                       DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
-       }
+       cayman_uvd_resume(rdev);
+       cayman_vce_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -2230,8 +2341,10 @@ int cayman_suspend(struct radeon_device *rdev)
        radeon_vm_manager_fini(rdev);
        cayman_cp_enable(rdev, false);
        cayman_dma_stop(rdev);
-       uvd_v1_0_fini(rdev);
-       radeon_uvd_suspend(rdev);
+       if (rdev->has_uvd) {
+               uvd_v1_0_fini(rdev);
+               radeon_uvd_suspend(rdev);
+       }
        evergreen_irq_suspend(rdev);
        radeon_wb_disable(rdev);
        cayman_pcie_gart_disable(rdev);
@@ -2325,25 +2438,8 @@ int cayman_init(struct radeon_device *rdev)
        ring->ring_obj = NULL;
        r600_ring_init(rdev, ring, 64 * 1024);
 
-       r = radeon_uvd_init(rdev);
-       if (!r) {
-               ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-       }
-
-       if (rdev->family == CHIP_ARUBA) {
-               r = radeon_vce_init(rdev);
-               if (!r) {
-                       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-                       ring->ring_obj = NULL;
-                       r600_ring_init(rdev, ring, 4096);
-
-                       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-                       ring->ring_obj = NULL;
-                       r600_ring_init(rdev, ring, 4096);
-               }
-       }
+       cayman_uvd_init(rdev);
+       cayman_vce_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
@@ -2398,7 +2494,7 @@ void cayman_fini(struct radeon_device *rdev)
        radeon_irq_kms_fini(rdev);
        uvd_v1_0_fini(rdev);
        radeon_uvd_fini(rdev);
-       if (rdev->family == CHIP_ARUBA)
+       if (rdev->has_vce)
                radeon_vce_fini(rdev);
        cayman_pcie_gart_fini(rdev);
        r600_vram_scratch_fini(rdev);
index 6e478a248628bf62904befd7cfcfea5075081d08..f25994b3afa633db491737d0afa9684b6a8eda67 100644 (file)
@@ -153,7 +153,7 @@ void r100_wait_for_vblank(struct radeon_device *rdev, int crtc)
  * bit to go high, when it does, we release the lock, and allow the
  * double buffered update to take place.
  */
-void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
+void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
 {
        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
        u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK;
@@ -592,7 +592,8 @@ void r100_hpd_init(struct radeon_device *rdev)
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-               enable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       enable |= 1 << radeon_connector->hpd.hpd;
                radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
        }
        radeon_irq_kms_enable_hpd(rdev, enable);
@@ -614,7 +615,8 @@ void r100_hpd_fini(struct radeon_device *rdev)
 
        list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
                struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-               disable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       disable |= 1 << radeon_connector->hpd.hpd;
        }
        radeon_irq_kms_disable_hpd(rdev, disable);
 }
@@ -2555,7 +2557,7 @@ void r100_bm_disable(struct radeon_device *rdev)
        mdelay(1);
 }
 
-int r100_asic_reset(struct radeon_device *rdev)
+int r100_asic_reset(struct radeon_device *rdev, bool hard)
 {
        struct r100_mc_save save;
        u32 status, tmp;
index 718b12b03b570de5687af46d97ef123dc130c961..7e417d8dc733157c1c3c397246619334c1cc3cc9 100644 (file)
@@ -410,7 +410,7 @@ static void r300_gpu_init(struct radeon_device *rdev)
                 rdev->num_gb_pipes, rdev->num_z_pipes);
 }
 
-int r300_asic_reset(struct radeon_device *rdev)
+int r300_asic_reset(struct radeon_device *rdev, bool hard)
 {
        struct r100_mc_save save;
        u32 status, tmp;
index f86ab695ee8faca2b189e80891f6f281f4d723eb..9247e7d207fe2e3079819f7511e43f9895b31cb9 100644 (file)
@@ -1002,7 +1002,8 @@ void r600_hpd_init(struct radeon_device *rdev)
                                break;
                        }
                }
-               enable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       enable |= 1 << radeon_connector->hpd.hpd;
                radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
        }
        radeon_irq_kms_enable_hpd(rdev, enable);
@@ -1055,7 +1056,8 @@ void r600_hpd_fini(struct radeon_device *rdev)
                                break;
                        }
                }
-               disable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       disable |= 1 << radeon_connector->hpd.hpd;
        }
        radeon_irq_kms_disable_hpd(rdev, disable);
 }
@@ -1871,10 +1873,15 @@ static void r600_gpu_pci_config_reset(struct radeon_device *rdev)
        }
 }
 
-int r600_asic_reset(struct radeon_device *rdev)
+int r600_asic_reset(struct radeon_device *rdev, bool hard)
 {
        u32 reset_mask;
 
+       if (hard) {
+               r600_gpu_pci_config_reset(rdev);
+               return 0;
+       }
+
        reset_mask = r600_gpu_check_soft_reset(rdev);
 
        if (reset_mask)
@@ -3035,6 +3042,73 @@ void r600_clear_surface_reg(struct radeon_device *rdev, int reg)
        /* FIXME: implement */
 }
 
+static void r600_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v1_0_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void r600_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v1_0_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void r600_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
 static int r600_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
@@ -3070,17 +3144,7 @@ static int r600_startup(struct radeon_device *rdev)
                return r;
        }
 
-       if (rdev->has_uvd) {
-               r = uvd_v1_0_resume(rdev);
-               if (!r) {
-                       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
-                       if (r) {
-                               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
-                       }
-               }
-               if (r)
-                       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
-       }
+       r600_uvd_start(rdev);
 
        /* Enable IRQ */
        if (!rdev->irq.installed) {
@@ -3110,17 +3174,7 @@ static int r600_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       if (rdev->has_uvd) {
-               ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-               if (ring->ring_size) {
-                       r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                            RADEON_CP_PACKET2);
-                       if (!r)
-                               r = uvd_v1_0_init(rdev);
-                       if (r)
-                               DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-               }
-       }
+       r600_uvd_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -3264,13 +3318,7 @@ int r600_init(struct radeon_device *rdev)
        rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
        r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
 
-       if (rdev->has_uvd) {
-               r = radeon_uvd_init(rdev);
-               if (!r) {
-                       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
-                       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
-               }
-       }
+       r600_uvd_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
index 007be29a0020090600c102220373a16c5fc47227..80b24a495d6c5805e7e12ed309b7008a77f536d5 100644 (file)
@@ -113,6 +113,8 @@ extern int radeon_bapm;
 extern int radeon_backlight;
 extern int radeon_auxch;
 extern int radeon_mst;
+extern int radeon_uvd;
+extern int radeon_vce;
 
 /*
  * Copy from radeon_drv.h so we don't have to include both and have conflicting
@@ -744,6 +746,7 @@ struct radeon_flip_work {
        struct drm_pending_vblank_event *event;
        struct radeon_bo                *old_rbo;
        struct fence                    *fence;
+       bool                            async;
 };
 
 struct r500_irq_stat_regs {
@@ -1671,14 +1674,18 @@ int radeon_pm_get_type_index(struct radeon_device *rdev,
 /*
  * UVD
  */
-#define RADEON_MAX_UVD_HANDLES 10
-#define RADEON_UVD_STACK_SIZE  (1024*1024)
-#define RADEON_UVD_HEAP_SIZE   (1024*1024)
+#define RADEON_DEFAULT_UVD_HANDLES     10
+#define RADEON_MAX_UVD_HANDLES         30
+#define RADEON_UVD_STACK_SIZE          (200*1024)
+#define RADEON_UVD_HEAP_SIZE           (256*1024)
+#define RADEON_UVD_SESSION_SIZE                (50*1024)
 
 struct radeon_uvd {
+       bool                    fw_header_present;
        struct radeon_bo        *vcpu_bo;
        void                    *cpu_addr;
        uint64_t                gpu_addr;
+       unsigned                max_handles;
        atomic_t                handles[RADEON_MAX_UVD_HANDLES];
        struct drm_file         *filp[RADEON_MAX_UVD_HANDLES];
        unsigned                img_size[RADEON_MAX_UVD_HANDLES];
@@ -1852,7 +1859,7 @@ struct radeon_asic {
        int (*resume)(struct radeon_device *rdev);
        int (*suspend)(struct radeon_device *rdev);
        void (*vga_set_state)(struct radeon_device *rdev, bool state);
-       int (*asic_reset)(struct radeon_device *rdev);
+       int (*asic_reset)(struct radeon_device *rdev, bool hard);
        /* Flush the HDP cache via MMIO */
        void (*mmio_hdp_flush)(struct radeon_device *rdev);
        /* check if 3D engine is idle */
@@ -1998,7 +2005,7 @@ struct radeon_asic {
        } dpm;
        /* pageflipping */
        struct {
-               void (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base);
+               void (*page_flip)(struct radeon_device *rdev, int crtc, u64 crtc_base, bool async);
                bool (*page_flip_pending)(struct radeon_device *rdev, int crtc);
        } pflip;
 };
@@ -2394,7 +2401,6 @@ struct radeon_device {
        struct radeon_wb                wb;
        struct radeon_dummy_page        dummy_page;
        bool                            shutdown;
-       bool                            suspend;
        bool                            need_dma32;
        bool                            accel_working;
        bool                            fastfb_working; /* IGP feature*/
@@ -2423,6 +2429,7 @@ struct radeon_device {
        int num_crtc; /* number of crtcs */
        struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
        bool has_uvd;
+       bool has_vce;
        struct r600_audio audio; /* audio stuff */
        struct notifier_block acpi_nb;
        /* only one userspace can use Hyperz features or CMASK at a time */
@@ -2717,7 +2724,7 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev))
 #define radeon_cs_parse(rdev, r, p) (rdev)->asic->ring[(r)]->cs_parse((p))
 #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state))
-#define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev))
+#define radeon_asic_reset(rdev) (rdev)->asic->asic_reset((rdev), false)
 #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart.tlb_flush((rdev))
 #define radeon_gart_get_page_entry(a, f) (rdev)->asic->gart.get_page_entry((a), (f))
 #define radeon_gart_set_page(rdev, i, e) (rdev)->asic->gart.set_page((rdev), (i), (e))
@@ -2775,7 +2782,7 @@ static inline void radeon_ring_write(struct radeon_ring *ring, uint32_t v)
 #define radeon_pm_finish(rdev) (rdev)->asic->pm.finish((rdev))
 #define radeon_pm_init_profile(rdev) (rdev)->asic->pm.init_profile((rdev))
 #define radeon_pm_get_dynpm_state(rdev) (rdev)->asic->pm.get_dynpm_state((rdev))
-#define radeon_page_flip(rdev, crtc, base) (rdev)->asic->pflip.page_flip((rdev), (crtc), (base))
+#define radeon_page_flip(rdev, crtc, base, async) (rdev)->asic->pflip.page_flip((rdev), (crtc), (base), (async))
 #define radeon_page_flip_pending(rdev, crtc) (rdev)->asic->pflip.page_flip_pending((rdev), (crtc))
 #define radeon_wait_for_vblank(rdev, crtc) (rdev)->asic->display.wait_for_vblank((rdev), (crtc))
 #define radeon_mc_wait_for_idle(rdev) (rdev)->asic->mc_wait_for_idle((rdev))
@@ -2832,7 +2839,8 @@ extern bool radeon_ttm_tt_is_readonly(struct ttm_tt *ttm);
 extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base);
 extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
 extern int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
-extern int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon);
+extern int radeon_suspend_kms(struct drm_device *dev, bool suspend,
+                             bool fbcon, bool freeze);
 extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size);
 extern void radeon_program_register_sequence(struct radeon_device *rdev,
                                             const u32 *registers,
index 7d5a36dd509451015dc64b42278c9d9deec60a18..bc5121d1a7bc56f777c7a1ef76c49c8753cd8ed4 100644 (file)
@@ -2324,6 +2324,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                rdev->num_crtc = 2;
 
        rdev->has_uvd = false;
+       rdev->has_vce = false;
 
        switch (rdev->family) {
        case CHIP_R100:
@@ -2454,6 +2455,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                /* set num crtcs */
                rdev->num_crtc = 4;
                rdev->has_uvd = true;
+               rdev->has_vce = true;
                rdev->cg_flags =
                        RADEON_CG_SUPPORT_VCE_MGCG;
                break;
@@ -2470,10 +2472,13 @@ int radeon_asic_init(struct radeon_device *rdev)
                        rdev->num_crtc = 2;
                else
                        rdev->num_crtc = 6;
-               if (rdev->family == CHIP_HAINAN)
+               if (rdev->family == CHIP_HAINAN) {
                        rdev->has_uvd = false;
-               else
+                       rdev->has_vce = false;
+               } else {
                        rdev->has_uvd = true;
+                       rdev->has_vce = true;
+               }
                switch (rdev->family) {
                case CHIP_TAHITI:
                        rdev->cg_flags =
@@ -2578,6 +2583,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                rdev->asic = &ci_asic;
                rdev->num_crtc = 6;
                rdev->has_uvd = true;
+               rdev->has_vce = true;
                if (rdev->family == CHIP_BONAIRE) {
                        rdev->cg_flags =
                                RADEON_CG_SUPPORT_GFX_MGCG |
@@ -2678,6 +2684,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                                RADEON_PG_SUPPORT_SAMU;*/
                }
                rdev->has_uvd = true;
+               rdev->has_vce = true;
                break;
        default:
                /* FIXME: not supported yet */
@@ -2689,6 +2696,11 @@ int radeon_asic_init(struct radeon_device *rdev)
                rdev->asic->pm.set_memory_clock = NULL;
        }
 
+       if (!radeon_uvd)
+               rdev->has_uvd = false;
+       if (!radeon_vce)
+               rdev->has_vce = false;
+
        return 0;
 }
 
index e0aa33262eac62126e73984292e2658b310305ba..e3f036c20d64d97f2943dfc4c66723fcc5556765 100644 (file)
@@ -64,7 +64,7 @@ int r100_suspend(struct radeon_device *rdev);
 int r100_resume(struct radeon_device *rdev);
 void r100_vga_set_state(struct radeon_device *rdev, bool state);
 bool r100_gpu_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
-int r100_asic_reset(struct radeon_device *rdev);
+int r100_asic_reset(struct radeon_device *rdev, bool hard);
 u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
 void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
 uint64_t r100_pci_gart_get_page_entry(uint64_t addr, uint32_t flags);
@@ -138,7 +138,7 @@ extern void r100_pm_finish(struct radeon_device *rdev);
 extern void r100_pm_init_profile(struct radeon_device *rdev);
 extern void r100_pm_get_dynpm_state(struct radeon_device *rdev);
 extern void r100_page_flip(struct radeon_device *rdev, int crtc,
-                          u64 crtc_base);
+                          u64 crtc_base, bool async);
 extern bool r100_page_flip_pending(struct radeon_device *rdev, int crtc);
 extern void r100_wait_for_vblank(struct radeon_device *rdev, int crtc);
 extern int r100_mc_wait_for_idle(struct radeon_device *rdev);
@@ -167,7 +167,7 @@ extern int r300_init(struct radeon_device *rdev);
 extern void r300_fini(struct radeon_device *rdev);
 extern int r300_suspend(struct radeon_device *rdev);
 extern int r300_resume(struct radeon_device *rdev);
-extern int r300_asic_reset(struct radeon_device *rdev);
+extern int r300_asic_reset(struct radeon_device *rdev, bool hard);
 extern void r300_ring_start(struct radeon_device *rdev, struct radeon_ring *ring);
 extern void r300_fence_ring_emit(struct radeon_device *rdev,
                                struct radeon_fence *fence);
@@ -225,7 +225,7 @@ extern int rs400_mc_wait_for_idle(struct radeon_device *rdev);
 /*
  * rs600.
  */
-extern int rs600_asic_reset(struct radeon_device *rdev);
+extern int rs600_asic_reset(struct radeon_device *rdev, bool hard);
 extern int rs600_init(struct radeon_device *rdev);
 extern void rs600_fini(struct radeon_device *rdev);
 extern int rs600_suspend(struct radeon_device *rdev);
@@ -250,7 +250,7 @@ extern void rs600_pm_misc(struct radeon_device *rdev);
 extern void rs600_pm_prepare(struct radeon_device *rdev);
 extern void rs600_pm_finish(struct radeon_device *rdev);
 extern void rs600_page_flip(struct radeon_device *rdev, int crtc,
-                           u64 crtc_base);
+                           u64 crtc_base, bool async);
 extern bool rs600_page_flip_pending(struct radeon_device *rdev, int crtc);
 void rs600_set_safe_registers(struct radeon_device *rdev);
 extern void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc);
@@ -334,7 +334,7 @@ bool r600_dma_semaphore_ring_emit(struct radeon_device *rdev,
 void r600_dma_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
 bool r600_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *ring);
 bool r600_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
-int r600_asic_reset(struct radeon_device *rdev);
+int r600_asic_reset(struct radeon_device *rdev, bool hard);
 int r600_set_surface_reg(struct radeon_device *rdev, int reg,
                         uint32_t tiling_flags, uint32_t pitch,
                         uint32_t offset, uint32_t obj_size);
@@ -464,7 +464,8 @@ void rv770_fini(struct radeon_device *rdev);
 int rv770_suspend(struct radeon_device *rdev);
 int rv770_resume(struct radeon_device *rdev);
 void rv770_pm_misc(struct radeon_device *rdev);
-void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base);
+void rv770_page_flip(struct radeon_device *rdev, int crtc, u64 crtc_base,
+                    bool async);
 bool rv770_page_flip_pending(struct radeon_device *rdev, int crtc);
 void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
 void r700_cp_stop(struct radeon_device *rdev);
@@ -513,7 +514,7 @@ int evergreen_suspend(struct radeon_device *rdev);
 int evergreen_resume(struct radeon_device *rdev);
 bool evergreen_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
 bool evergreen_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
-int evergreen_asic_reset(struct radeon_device *rdev);
+int evergreen_asic_reset(struct radeon_device *rdev, bool hard);
 void evergreen_bandwidth_update(struct radeon_device *rdev);
 void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
 void evergreen_hpd_init(struct radeon_device *rdev);
@@ -534,7 +535,7 @@ extern void btc_pm_init_profile(struct radeon_device *rdev);
 int sumo_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
 int evergreen_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk);
 extern void evergreen_page_flip(struct radeon_device *rdev, int crtc,
-                               u64 crtc_base);
+                               u64 crtc_base, bool async);
 extern bool evergreen_page_flip_pending(struct radeon_device *rdev, int crtc);
 extern void dce4_wait_for_vblank(struct radeon_device *rdev, int crtc);
 void evergreen_disable_interrupt_state(struct radeon_device *rdev);
@@ -606,7 +607,7 @@ int cayman_init(struct radeon_device *rdev);
 void cayman_fini(struct radeon_device *rdev);
 int cayman_suspend(struct radeon_device *rdev);
 int cayman_resume(struct radeon_device *rdev);
-int cayman_asic_reset(struct radeon_device *rdev);
+int cayman_asic_reset(struct radeon_device *rdev, bool hard);
 void cayman_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
 int cayman_vm_init(struct radeon_device *rdev);
 void cayman_vm_fini(struct radeon_device *rdev);
@@ -712,7 +713,7 @@ int si_suspend(struct radeon_device *rdev);
 int si_resume(struct radeon_device *rdev);
 bool si_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
 bool si_dma_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
-int si_asic_reset(struct radeon_device *rdev);
+int si_asic_reset(struct radeon_device *rdev, bool hard);
 void si_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
 int si_irq_set(struct radeon_device *rdev);
 int si_irq_process(struct radeon_device *rdev);
@@ -817,7 +818,7 @@ void cik_fini(struct radeon_device *rdev);
 int cik_suspend(struct radeon_device *rdev);
 int cik_resume(struct radeon_device *rdev);
 bool cik_gfx_is_lockup(struct radeon_device *rdev, struct radeon_ring *cp);
-int cik_asic_reset(struct radeon_device *rdev);
+int cik_asic_reset(struct radeon_device *rdev, bool hard);
 void cik_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
 int cik_ring_test(struct radeon_device *rdev, struct radeon_ring *ring);
 int cik_ib_test(struct radeon_device *rdev, struct radeon_ring *ring);
index ab39b85e0f76d4cd2f926594dd1e4bc1d83a56dd..510ea371dacc6f063fa6f80b8131b53437ef35eb 100644 (file)
@@ -74,7 +74,6 @@ static void radeon_cs_buckets_get_list(struct radeon_cs_buckets *b,
 
 static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
 {
-       struct drm_device *ddev = p->rdev->ddev;
        struct radeon_cs_chunk *chunk;
        struct radeon_cs_buckets buckets;
        unsigned i;
@@ -101,7 +100,7 @@ static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
                unsigned priority;
 
                r = (struct drm_radeon_cs_reloc *)&chunk->kdata[i*4];
-               gobj = drm_gem_object_lookup(ddev, p->filp, r->handle);
+               gobj = drm_gem_object_lookup(p->filp, r->handle);
                if (gobj == NULL) {
                        DRM_ERROR("gem object lookup failed 0x%x\n",
                                  r->handle);
index afaf346bd50e7c7628674e29d0eea14c8403e3ec..2a10e24b34b10b2f826e35c60556808efb2ebe2e 100644 (file)
@@ -274,7 +274,7 @@ int radeon_crtc_cursor_set2(struct drm_crtc *crtc,
                return -EINVAL;
        }
 
-       obj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id);
                return -ENOENT;
index d0826fb0434c45f35647c5a41288c17634c3c95f..e721e6b2766e4973ca3e0647e9e75c6b10f85622 100644 (file)
@@ -1230,7 +1230,7 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero
                printk(KERN_INFO "radeon: switched off\n");
                drm_kms_helper_poll_disable(dev);
                dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
-               radeon_suspend_kms(dev, true, true);
+               radeon_suspend_kms(dev, true, true, false);
                dev->switch_power_state = DRM_SWITCH_POWER_OFF;
        }
 }
@@ -1555,7 +1555,8 @@ void radeon_device_fini(struct radeon_device *rdev)
  * Returns 0 for success or an error on failure.
  * Called at driver suspend.
  */
-int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
+int radeon_suspend_kms(struct drm_device *dev, bool suspend,
+                      bool fbcon, bool freeze)
 {
        struct radeon_device *rdev;
        struct drm_crtc *crtc;
@@ -1630,7 +1631,10 @@ int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon)
        radeon_agp_suspend(rdev);
 
        pci_save_state(dev->pdev);
-       if (suspend) {
+       if (freeze && rdev->family >= CHIP_R600) {
+               rdev->asic->asic_reset(rdev, true);
+               pci_restore_state(dev->pdev);
+       } else if (suspend) {
                /* Shut down the device */
                pci_disable_device(dev->pdev);
                pci_set_power_state(dev->pdev, PCI_D3hot);
index fcc7483d3f7b90e6a2153aba13fddd509fa76173..6a41b49826470f8cffe99fb888c4f6a4529ab787 100644 (file)
@@ -377,7 +377,7 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)
 
        /* wakeup userspace */
        if (work->event)
-               drm_send_vblank_event(rdev->ddev, crtc_id, work->event);
+               drm_crtc_send_vblank_event(&radeon_crtc->base, work->event);
 
        spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
 
@@ -490,7 +490,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
                                 vblank->linedur_ns / 1000, stat, vpos, hpos);
 
        /* do the flip (mmio) */
-       radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base);
+       radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base, work->async);
 
        radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
@@ -525,6 +525,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
        work->rdev = rdev;
        work->crtc_id = radeon_crtc->crtc_id;
        work->event = event;
+       work->async = (page_flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0;
 
        /* schedule unpin of the old buffer */
        old_radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
@@ -1367,7 +1368,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
        struct radeon_framebuffer *radeon_fb;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (obj ==  NULL) {
                dev_err(&dev->pdev->dev, "No GEM object associated to handle 0x%08X, "
                        "can't create framebuffer\n", mode_cmd->handles[0]);
@@ -1630,6 +1631,9 @@ int radeon_modeset_init(struct radeon_device *rdev)
 
        rdev->ddev->mode_config.funcs = &radeon_mode_funcs;
 
+       if (radeon_use_pflipirq == 2 && rdev->family >= CHIP_R600)
+               rdev->ddev->mode_config.async_page_flip = true;
+
        if (ASIC_IS_DCE5(rdev)) {
                rdev->ddev->mode_config.max_width = 16384;
                rdev->ddev->mode_config.max_height = 16384;
index ccd4ad4ee59290a53279e930e737f6a2c2b18b27..b55aa740171f1d1d9cecdbf55e97d51098af0f22 100644 (file)
  *   2.41.0 - evergreen/cayman: Add SET_BASE/DRAW_INDIRECT command parsing support
  *   2.42.0 - Add VCE/VUI (Video Usability Information) support
  *   2.43.0 - RADEON_INFO_GPU_RESET_COUNTER
+ *   2.44.0 - SET_APPEND_CNT packet3 support
+ *   2.45.0 - Allow setting shader registers using DMA/COPY packet3 on SI
  */
 #define KMS_DRIVER_MAJOR       2
-#define KMS_DRIVER_MINOR       43
+#define KMS_DRIVER_MINOR       45
 #define KMS_DRIVER_PATCHLEVEL  0
 int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
 int radeon_driver_unload_kms(struct drm_device *dev);
@@ -105,7 +107,8 @@ void radeon_driver_postclose_kms(struct drm_device *dev,
                                 struct drm_file *file_priv);
 void radeon_driver_preclose_kms(struct drm_device *dev,
                                struct drm_file *file_priv);
-int radeon_suspend_kms(struct drm_device *dev, bool suspend, bool fbcon);
+int radeon_suspend_kms(struct drm_device *dev, bool suspend,
+                      bool fbcon, bool freeze);
 int radeon_resume_kms(struct drm_device *dev, bool resume, bool fbcon);
 u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
 int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
@@ -196,6 +199,8 @@ int radeon_bapm = -1;
 int radeon_backlight = -1;
 int radeon_auxch = -1;
 int radeon_mst = 0;
+int radeon_uvd = 1;
+int radeon_vce = 1;
 
 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
 module_param_named(no_wb, radeon_no_wb, int, 0444);
@@ -287,6 +292,12 @@ module_param_named(auxch, radeon_auxch, int, 0444);
 MODULE_PARM_DESC(mst, "DisplayPort MST experimental support (1 = enable, 0 = disable)");
 module_param_named(mst, radeon_mst, int, 0444);
 
+MODULE_PARM_DESC(uvd, "uvd enable/disable uvd support (1 = enable, 0 = disable)");
+module_param_named(uvd, radeon_uvd, int, 0444);
+
+MODULE_PARM_DESC(vce, "vce enable/disable vce support (1 = enable, 0 = disable)");
+module_param_named(vce, radeon_vce, int, 0444);
+
 static struct pci_device_id pciidlist[] = {
        radeon_PCI_IDS
 };
@@ -358,7 +369,7 @@ static int radeon_pmops_suspend(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
-       return radeon_suspend_kms(drm_dev, true, true);
+       return radeon_suspend_kms(drm_dev, true, true, false);
 }
 
 static int radeon_pmops_resume(struct device *dev)
@@ -372,7 +383,7 @@ static int radeon_pmops_freeze(struct device *dev)
 {
        struct pci_dev *pdev = to_pci_dev(dev);
        struct drm_device *drm_dev = pci_get_drvdata(pdev);
-       return radeon_suspend_kms(drm_dev, false, true);
+       return radeon_suspend_kms(drm_dev, false, true, true);
 }
 
 static int radeon_pmops_thaw(struct device *dev)
@@ -397,7 +408,7 @@ static int radeon_pmops_runtime_suspend(struct device *dev)
        drm_kms_helper_poll_disable(drm_dev);
        vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
 
-       ret = radeon_suspend_kms(drm_dev, false, false);
+       ret = radeon_suspend_kms(drm_dev, false, false, false);
        pci_save_state(pdev);
        pci_disable_device(pdev);
        pci_ignore_hotplug(pdev);
@@ -525,7 +536,7 @@ static struct drm_driver kms_driver = {
        .irq_uninstall = radeon_driver_irq_uninstall_kms,
        .irq_handler = radeon_driver_irq_handler_kms,
        .ioctls = radeon_ioctls_kms,
-       .gem_free_object = radeon_gem_object_free,
+       .gem_free_object_unlocked = radeon_gem_object_free,
        .gem_open_object = radeon_gem_object_open,
        .gem_close_object = radeon_gem_object_close,
        .dumb_create = radeon_mode_dumb_create,
@@ -566,12 +577,10 @@ static struct pci_driver radeon_kms_pci_driver = {
 
 static int __init radeon_init(void)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && radeon_modeset == -1) {
                DRM_INFO("VGACON disable radeon kernel modesetting.\n");
                radeon_modeset = 0;
        }
-#endif
        /* set to modesetting by default if not nomodeset */
        if (radeon_modeset == -1)
                radeon_modeset = 1;
index e26c963f2e9304e58f25517114e773b3c85242bd..deb9511725c93acf01943df0bf0e0a4904220eaf 100644 (file)
@@ -382,7 +382,7 @@ int radeon_gem_set_domain_ioctl(struct drm_device *dev, void *data,
        down_read(&rdev->exclusive_lock);
 
        /* just do a BO wait for now */
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                up_read(&rdev->exclusive_lock);
                return -ENOENT;
@@ -404,7 +404,7 @@ int radeon_mode_dumb_mmap(struct drm_file *filp,
        struct drm_gem_object *gobj;
        struct radeon_bo *robj;
 
-       gobj = drm_gem_object_lookup(dev, filp, handle);
+       gobj = drm_gem_object_lookup(filp, handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -435,7 +435,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
        int r;
        uint32_t cur_placement = 0;
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -464,7 +464,7 @@ int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
        uint32_t cur_placement = 0;
        long ret;
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
@@ -495,7 +495,7 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
        int r = 0;
 
        DRM_DEBUG("%d \n", args->handle);
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL)
                return -ENOENT;
        robj = gem_to_radeon_bo(gobj);
@@ -513,7 +513,7 @@ int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data,
        int r = 0;
 
        DRM_DEBUG("\n");
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL)
                return -ENOENT;
        rbo = gem_to_radeon_bo(gobj);
@@ -648,7 +648,7 @@ int radeon_gem_va_ioctl(struct drm_device *dev, void *data,
                return -EINVAL;
        }
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                args->operation = RADEON_VA_RESULT_ERROR;
                return -ENOENT;
@@ -703,7 +703,7 @@ int radeon_gem_op_ioctl(struct drm_device *dev, void *data,
        struct radeon_bo *robj;
        int r;
 
-       gobj = drm_gem_object_lookup(dev, filp, args->handle);
+       gobj = drm_gem_object_lookup(filp, args->handle);
        if (gobj == NULL) {
                return -ENOENT;
        }
index 1e9304d1c88fd4e844ee9c5bd36300ed992e0f29..c084cadcbf2156f8f51b05d21b5ae79407bc6853 100644 (file)
@@ -291,7 +291,6 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
        if (r) {
                return r;
        }
-       rdev->ddev->vblank_disable_allowed = true;
 
        /* enable msi */
        rdev->msi_enabled = 0;
index 2d901bf28a9448a90fc364f7eee0a2c7feec338f..be30861afae9a8e2bb1fcc6ee261b5285f4dcb44 100644 (file)
@@ -832,13 +832,13 @@ int radeon_bo_wait(struct radeon_bo *bo, u32 *mem_type, bool no_wait)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
        if (unlikely(r != 0))
                return r;
        if (mem_type)
                *mem_type = bo->tbo.mem.mem_type;
 
-       r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
+       r = ttm_bo_wait(&bo->tbo, true, no_wait);
        ttm_bo_unreserve(&bo->tbo);
        return r;
 }
index d8d295ee7c12d7c1106c97683526060bc78d8354..a10bb3deee5417a0481014d019a046c6d2b15c19 100644 (file)
@@ -65,7 +65,7 @@ static inline int radeon_bo_reserve(struct radeon_bo *bo, bool no_intr)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, !no_intr, false, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, !no_intr, false, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS)
                        dev_err(bo->rdev->dev, "%p reserve failed\n", bo);
index 90f739478a1b5257b488d120245d77d4cf561a70..590b0377fbe267f859b7cc7649b309b9c34d4436 100644 (file)
@@ -865,6 +865,8 @@ static struct ttm_bo_driver radeon_bo_driver = {
        .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
        .io_mem_reserve = &radeon_ttm_io_mem_reserve,
        .io_mem_free = &radeon_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int radeon_ttm_init(struct radeon_device *rdev)
index 6fe9e4e7628417d2f07d71f3780eab2b7e849071..73dfe01435eaedcf0831ce8eb412057fb6f5ac64 100644 (file)
@@ -34,6 +34,7 @@
 #include <drm/drm.h>
 
 #include "radeon.h"
+#include "radeon_ucode.h"
 #include "r600d.h"
 
 /* 1 second timeout */
@@ -47,7 +48,8 @@
 #define FIRMWARE_CYPRESS       "radeon/CYPRESS_uvd.bin"
 #define FIRMWARE_SUMO          "radeon/SUMO_uvd.bin"
 #define FIRMWARE_TAHITI                "radeon/TAHITI_uvd.bin"
-#define FIRMWARE_BONAIRE       "radeon/BONAIRE_uvd.bin"
+#define FIRMWARE_BONAIRE_LEGACY        "radeon/BONAIRE_uvd.bin"
+#define FIRMWARE_BONAIRE       "radeon/bonaire_uvd.bin"
 
 MODULE_FIRMWARE(FIRMWARE_R600);
 MODULE_FIRMWARE(FIRMWARE_RS780);
@@ -56,6 +58,7 @@ MODULE_FIRMWARE(FIRMWARE_RV710);
 MODULE_FIRMWARE(FIRMWARE_CYPRESS);
 MODULE_FIRMWARE(FIRMWARE_SUMO);
 MODULE_FIRMWARE(FIRMWARE_TAHITI);
+MODULE_FIRMWARE(FIRMWARE_BONAIRE_LEGACY);
 MODULE_FIRMWARE(FIRMWARE_BONAIRE);
 
 static void radeon_uvd_idle_work_handler(struct work_struct *work);
@@ -63,7 +66,7 @@ static void radeon_uvd_idle_work_handler(struct work_struct *work);
 int radeon_uvd_init(struct radeon_device *rdev)
 {
        unsigned long bo_size;
-       const char *fw_name;
+       const char *fw_name = NULL, *legacy_fw_name = NULL;
        int i, r;
 
        INIT_DELAYED_WORK(&rdev->uvd.idle_work, radeon_uvd_idle_work_handler);
@@ -74,22 +77,22 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_RV670:
        case CHIP_RV620:
        case CHIP_RV635:
-               fw_name = FIRMWARE_R600;
+               legacy_fw_name = FIRMWARE_R600;
                break;
 
        case CHIP_RS780:
        case CHIP_RS880:
-               fw_name = FIRMWARE_RS780;
+               legacy_fw_name = FIRMWARE_RS780;
                break;
 
        case CHIP_RV770:
-               fw_name = FIRMWARE_RV770;
+               legacy_fw_name = FIRMWARE_RV770;
                break;
 
        case CHIP_RV710:
        case CHIP_RV730:
        case CHIP_RV740:
-               fw_name = FIRMWARE_RV710;
+               legacy_fw_name = FIRMWARE_RV710;
                break;
 
        case CHIP_CYPRESS:
@@ -97,7 +100,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_JUNIPER:
        case CHIP_REDWOOD:
        case CHIP_CEDAR:
-               fw_name = FIRMWARE_CYPRESS;
+               legacy_fw_name = FIRMWARE_CYPRESS;
                break;
 
        case CHIP_SUMO:
@@ -107,7 +110,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_BARTS:
        case CHIP_TURKS:
        case CHIP_CAICOS:
-               fw_name = FIRMWARE_SUMO;
+               legacy_fw_name = FIRMWARE_SUMO;
                break;
 
        case CHIP_TAHITI:
@@ -115,7 +118,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_PITCAIRN:
        case CHIP_ARUBA:
        case CHIP_OLAND:
-               fw_name = FIRMWARE_TAHITI;
+               legacy_fw_name = FIRMWARE_TAHITI;
                break;
 
        case CHIP_BONAIRE:
@@ -123,6 +126,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_KAVERI:
        case CHIP_HAWAII:
        case CHIP_MULLINS:
+               legacy_fw_name = FIRMWARE_BONAIRE_LEGACY;
                fw_name = FIRMWARE_BONAIRE;
                break;
 
@@ -130,16 +134,56 @@ int radeon_uvd_init(struct radeon_device *rdev)
                return -EINVAL;
        }
 
-       r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev);
-       if (r) {
-               dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
-                       fw_name);
-               return r;
+       rdev->uvd.fw_header_present = false;
+       rdev->uvd.max_handles = RADEON_DEFAULT_UVD_HANDLES;
+       if (fw_name) {
+               /* Let's try to load the newer firmware first */
+               r = request_firmware(&rdev->uvd_fw, fw_name, rdev->dev);
+               if (r) {
+                       dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
+                               fw_name);
+               } else {
+                       struct common_firmware_header *hdr = (void *)rdev->uvd_fw->data;
+                       unsigned version_major, version_minor, family_id;
+
+                       r = radeon_ucode_validate(rdev->uvd_fw);
+                       if (r)
+                               return r;
+
+                       rdev->uvd.fw_header_present = true;
+
+                       family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
+                       version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
+                       version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
+                       DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID: %hu\n",
+                                version_major, version_minor, family_id);
+
+                       /*
+                        * Limit the number of UVD handles depending on
+                        * microcode major and minor versions.
+                        */
+                       if ((version_major >= 0x01) && (version_minor >= 0x37))
+                               rdev->uvd.max_handles = RADEON_MAX_UVD_HANDLES;
+               }
+       }
+
+       /*
+        * In case there is only legacy firmware, or we encounter an error
+        * while loading the new firmware, we fall back to loading the legacy
+        * firmware now.
+        */
+       if (!fw_name || r) {
+               r = request_firmware(&rdev->uvd_fw, legacy_fw_name, rdev->dev);
+               if (r) {
+                       dev_err(rdev->dev, "radeon_uvd: Can't load firmware \"%s\"\n",
+                               legacy_fw_name);
+                       return r;
+               }
        }
 
        bo_size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 8) +
                  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
-                 RADEON_GPU_PAGE_SIZE;
+                 RADEON_UVD_SESSION_SIZE * rdev->uvd.max_handles;
        r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
                             RADEON_GEM_DOMAIN_VRAM, 0, NULL,
                             NULL, &rdev->uvd.vcpu_bo);
@@ -172,7 +216,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
 
        radeon_bo_unreserve(rdev->uvd.vcpu_bo);
 
-       for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < rdev->uvd.max_handles; ++i) {
                atomic_set(&rdev->uvd.handles[i], 0);
                rdev->uvd.filp[i] = NULL;
                rdev->uvd.img_size[i] = 0;
@@ -209,7 +253,7 @@ int radeon_uvd_suspend(struct radeon_device *rdev)
        if (rdev->uvd.vcpu_bo == NULL)
                return 0;
 
-       for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < rdev->uvd.max_handles; ++i) {
                uint32_t handle = atomic_read(&rdev->uvd.handles[i]);
                if (handle != 0) {
                        struct radeon_fence *fence;
@@ -284,7 +328,7 @@ void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo,
 void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
 {
        int i, r;
-       for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < rdev->uvd.max_handles; ++i) {
                uint32_t handle = atomic_read(&rdev->uvd.handles[i]);
                if (handle != 0 && rdev->uvd.filp[i] == filp) {
                        struct radeon_fence *fence;
@@ -469,7 +513,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
                        return r;
 
                /* try to alloc a new handle */
-               for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+               for (i = 0; i < p->rdev->uvd.max_handles; ++i) {
                        if (atomic_read(&p->rdev->uvd.handles[i]) == handle) {
                                DRM_ERROR("Handle 0x%x already in use!\n", handle);
                                return -EINVAL;
@@ -495,7 +539,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
                        return r;
 
                /* validate the handle */
-               for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+               for (i = 0; i < p->rdev->uvd.max_handles; ++i) {
                        if (atomic_read(&p->rdev->uvd.handles[i]) == handle) {
                                if (p->rdev->uvd.filp[i] != p->filp) {
                                        DRM_ERROR("UVD handle collision detected!\n");
@@ -510,7 +554,7 @@ static int radeon_uvd_cs_msg(struct radeon_cs_parser *p, struct radeon_bo *bo,
 
        case 2:
                /* it's a destroy msg, free the handle */
-               for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i)
+               for (i = 0; i < p->rdev->uvd.max_handles; ++i)
                        atomic_cmpxchg(&p->rdev->uvd.handles[i], handle, 0);
                radeon_bo_kunmap(bo);
                return 0;
@@ -809,7 +853,7 @@ static void radeon_uvd_count_handles(struct radeon_device *rdev,
        *sd = 0;
        *hd = 0;
 
-       for (i = 0; i < RADEON_MAX_UVD_HANDLES; ++i) {
+       for (i = 0; i < rdev->uvd.max_handles; ++i) {
                if (!atomic_read(&rdev->uvd.handles[i]))
                        continue;
 
index 6244f4e44e9a541d15d5a76ac36beff8822c3145..f16af119c688c297210a6813122afedadd46a7c4 100644 (file)
@@ -110,7 +110,7 @@ void avivo_wait_for_vblank(struct radeon_device *rdev, int crtc)
        }
 }
 
-void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
+void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
 {
        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
        u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
@@ -121,6 +121,8 @@ void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
        WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 
        /* update the scanout addresses */
+       WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
+              async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
        WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
               (u32)crtc_base);
        WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
@@ -413,7 +415,8 @@ void rs600_hpd_init(struct radeon_device *rdev)
                default:
                        break;
                }
-               enable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       enable |= 1 << radeon_connector->hpd.hpd;
                radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
        }
        radeon_irq_kms_enable_hpd(rdev, enable);
@@ -439,12 +442,13 @@ void rs600_hpd_fini(struct radeon_device *rdev)
                default:
                        break;
                }
-               disable |= 1 << radeon_connector->hpd.hpd;
+               if (radeon_connector->hpd.hpd != RADEON_HPD_NONE)
+                       disable |= 1 << radeon_connector->hpd.hpd;
        }
        radeon_irq_kms_disable_hpd(rdev, disable);
 }
 
-int rs600_asic_reset(struct radeon_device *rdev)
+int rs600_asic_reset(struct radeon_device *rdev, bool hard)
 {
        struct rv515_mc_save save;
        u32 status, tmp;
index 01ee96acb3985ea65ec2470456381251d51f444e..1c120a4c3c9781f6f2892318cf1a968197c51c0b 100644 (file)
@@ -801,7 +801,7 @@ u32 rv770_get_xclk(struct radeon_device *rdev)
        return reference_clock;
 }
 
-void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
+void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base, bool async)
 {
        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
        u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
@@ -812,6 +812,8 @@ void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
        WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp);
 
        /* update the scanout addresses */
+       WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
+              async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
        if (radeon_crtc->crtc_id) {
                WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
                WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(crtc_base));
@@ -1681,6 +1683,73 @@ static int rv770_mc_init(struct radeon_device *rdev)
        return 0;
 }
 
+static void rv770_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v2_2_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void rv770_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v2_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void rv770_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
 static int rv770_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
@@ -1723,16 +1792,7 @@ static int rv770_startup(struct radeon_device *rdev)
                return r;
        }
 
-       r = uvd_v2_2_resume(rdev);
-       if (!r) {
-               r = radeon_fence_driver_start_ring(rdev,
-                                                  R600_RING_TYPE_UVD_INDEX);
-               if (r)
-                       dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-       }
-
-       if (r)
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+       rv770_uvd_start(rdev);
 
        /* Enable IRQ */
        if (!rdev->irq.installed) {
@@ -1772,16 +1832,7 @@ static int rv770_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-       if (ring->ring_size) {
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    RADEON_CP_PACKET2);
-               if (!r)
-                       r = uvd_v1_0_init(rdev);
-
-               if (r)
-                       DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-       }
+       rv770_uvd_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -1831,8 +1882,10 @@ int rv770_suspend(struct radeon_device *rdev)
 {
        radeon_pm_suspend(rdev);
        radeon_audio_fini(rdev);
-       uvd_v1_0_fini(rdev);
-       radeon_uvd_suspend(rdev);
+       if (rdev->has_uvd) {
+               uvd_v1_0_fini(rdev);
+               radeon_uvd_suspend(rdev);
+       }
        r700_cp_stop(rdev);
        r600_dma_stop(rdev);
        r600_irq_suspend(rdev);
@@ -1917,12 +1970,7 @@ int rv770_init(struct radeon_device *rdev)
        rdev->ring[R600_RING_TYPE_DMA_INDEX].ring_obj = NULL;
        r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_DMA_INDEX], 64 * 1024);
 
-       r = radeon_uvd_init(rdev);
-       if (!r) {
-               rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
-               r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX],
-                              4096);
-       }
+       rv770_uvd_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
index ae21550fe7679c9f2731ee11e4b3a983764fa975..b30e719dd56d87f1a195c443de85b8fc48a462b7 100644 (file)
@@ -4034,10 +4034,15 @@ static void si_gpu_pci_config_reset(struct radeon_device *rdev)
        }
 }
 
-int si_asic_reset(struct radeon_device *rdev)
+int si_asic_reset(struct radeon_device *rdev, bool hard)
 {
        u32 reset_mask;
 
+       if (hard) {
+               si_gpu_pci_config_reset(rdev);
+               return 0;
+       }
+
        reset_mask = si_gpu_check_soft_reset(rdev);
 
        if (reset_mask)
@@ -4359,6 +4364,10 @@ static bool si_vm_reg_valid(u32 reg)
        if (reg >= 0x28000)
                return true;
 
+       /* shader regs are also fine */
+       if (reg >= 0xB000 && reg < 0xC000)
+               return true;
+
        /* check config regs */
        switch (reg) {
        case GRBM_GFX_INDEX:
@@ -6821,6 +6830,159 @@ restart_ih:
 /*
  * startup/shutdown callbacks
  */
+static void si_uvd_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = radeon_uvd_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD (%d) init.\n", r);
+               /*
+                * At this point rdev->uvd.vcpu_bo is NULL which trickles down
+                * to early fails uvd_v2_2_resume() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable uvd here.
+                */
+               rdev->has_uvd = 0;
+               return;
+       }
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[R600_RING_TYPE_UVD_INDEX], 4096);
+}
+
+static void si_uvd_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_uvd)
+               return;
+
+       r = uvd_v2_2_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed UVD resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, R600_RING_TYPE_UVD_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
+}
+
+static void si_uvd_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_uvd || !rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, RADEON_CP_PACKET2);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD ring (%d).\n", r);
+               return;
+       }
+       r = uvd_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing UVD (%d).\n", r);
+               return;
+       }
+}
+
+static void si_vce_init(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE (%d) init.\n", r);
+               /*
+                * At this point rdev->vce.vcpu_bo is NULL which trickles down
+                * to early fails si_vce_start() and thus nothing happens
+                * there. So it is pointless to try to go through that code
+                * hence why we disable vce here.
+                */
+               rdev->has_vce = 0;
+               return;
+       }
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE1_INDEX], 4096);
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_obj = NULL;
+       r600_ring_init(rdev, &rdev->ring[TN_RING_TYPE_VCE2_INDEX], 4096);
+}
+
+static void si_vce_start(struct radeon_device *rdev)
+{
+       int r;
+
+       if (!rdev->has_vce)
+               return;
+
+       r = radeon_vce_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = vce_v1_0_resume(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed VCE resume (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE1_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 fences (%d).\n", r);
+               goto error;
+       }
+       r = radeon_fence_driver_start_ring(rdev, TN_RING_TYPE_VCE2_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE2 fences (%d).\n", r);
+               goto error;
+       }
+       return;
+
+error:
+       rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
+       rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
+}
+
+static void si_vce_resume(struct radeon_device *rdev)
+{
+       struct radeon_ring *ring;
+       int r;
+
+       if (!rdev->has_vce || !rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size)
+               return;
+
+       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
+       r = radeon_ring_init(rdev, ring, ring->ring_size, 0, VCE_CMD_NO_OP);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE1 ring (%d).\n", r);
+               return;
+       }
+       r = vce_v1_0_init(rdev);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing VCE (%d).\n", r);
+               return;
+       }
+}
+
 static int si_startup(struct radeon_device *rdev)
 {
        struct radeon_ring *ring;
@@ -6899,33 +7061,8 @@ static int si_startup(struct radeon_device *rdev)
                return r;
        }
 
-       if (rdev->has_uvd) {
-               r = uvd_v2_2_resume(rdev);
-               if (!r) {
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          R600_RING_TYPE_UVD_INDEX);
-                       if (r)
-                               dev_err(rdev->dev, "UVD fences init error (%d).\n", r);
-               }
-               if (r)
-                       rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
-       }
-
-       r = radeon_vce_resume(rdev);
-       if (!r) {
-               r = vce_v1_0_resume(rdev);
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE1_INDEX);
-               if (!r)
-                       r = radeon_fence_driver_start_ring(rdev,
-                                                          TN_RING_TYPE_VCE2_INDEX);
-       }
-       if (r) {
-               dev_err(rdev->dev, "VCE init error (%d).\n", r);
-               rdev->ring[TN_RING_TYPE_VCE1_INDEX].ring_size = 0;
-               rdev->ring[TN_RING_TYPE_VCE2_INDEX].ring_size = 0;
-       }
+       si_uvd_start(rdev);
+       si_vce_start(rdev);
 
        /* Enable IRQ */
        if (!rdev->irq.installed) {
@@ -6983,34 +7120,8 @@ static int si_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
-       if (rdev->has_uvd) {
-               ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-               if (ring->ring_size) {
-                       r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                            RADEON_CP_PACKET2);
-                       if (!r)
-                               r = uvd_v1_0_init(rdev);
-                       if (r)
-                               DRM_ERROR("radeon: failed initializing UVD (%d).\n", r);
-               }
-       }
-
-       r = -ENOENT;
-
-       ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-       if (ring->ring_size)
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    VCE_CMD_NO_OP);
-
-       ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-       if (ring->ring_size)
-               r = radeon_ring_init(rdev, ring, ring->ring_size, 0,
-                                    VCE_CMD_NO_OP);
-
-       if (!r)
-               r = vce_v1_0_init(rdev);
-       else if (r != -ENOENT)
-               DRM_ERROR("radeon: failed initializing VCE (%d).\n", r);
+       si_uvd_resume(rdev);
+       si_vce_resume(rdev);
 
        r = radeon_ib_pool_init(rdev);
        if (r) {
@@ -7070,8 +7181,9 @@ int si_suspend(struct radeon_device *rdev)
        if (rdev->has_uvd) {
                uvd_v1_0_fini(rdev);
                radeon_uvd_suspend(rdev);
-               radeon_vce_suspend(rdev);
        }
+       if (rdev->has_vce)
+               radeon_vce_suspend(rdev);
        si_fini_pg(rdev);
        si_fini_cg(rdev);
        si_irq_suspend(rdev);
@@ -7169,25 +7281,8 @@ int si_init(struct radeon_device *rdev)
        ring->ring_obj = NULL;
        r600_ring_init(rdev, ring, 64 * 1024);
 
-       if (rdev->has_uvd) {
-               r = radeon_uvd_init(rdev);
-               if (!r) {
-                       ring = &rdev->ring[R600_RING_TYPE_UVD_INDEX];
-                       ring->ring_obj = NULL;
-                       r600_ring_init(rdev, ring, 4096);
-               }
-       }
-
-       r = radeon_vce_init(rdev);
-       if (!r) {
-               ring = &rdev->ring[TN_RING_TYPE_VCE1_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-
-               ring = &rdev->ring[TN_RING_TYPE_VCE2_INDEX];
-               ring->ring_obj = NULL;
-               r600_ring_init(rdev, ring, 4096);
-       }
+       si_uvd_init(rdev);
+       si_vce_init(rdev);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
@@ -7240,8 +7335,9 @@ void si_fini(struct radeon_device *rdev)
        if (rdev->has_uvd) {
                uvd_v1_0_fini(rdev);
                radeon_uvd_fini(rdev);
-               radeon_vce_fini(rdev);
        }
+       if (rdev->has_vce)
+               radeon_vce_fini(rdev);
        si_pcie_gart_fini(rdev);
        r600_vram_scratch_fini(rdev);
        radeon_gem_fini(rdev);
index 12ddcfa82e20aa55f984a1a8e0cfa039c3f18ec7..0dbeb504a4292778d68b413956fc1c763ae9192a 100644 (file)
@@ -124,12 +124,13 @@ int uvd_v1_0_resume(struct radeon_device *rdev)
        WREG32(UVD_VCPU_CACHE_SIZE0, size);
 
        addr += size;
-       size = RADEON_UVD_STACK_SIZE >> 3;
+       size = RADEON_UVD_HEAP_SIZE >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
        WREG32(UVD_VCPU_CACHE_SIZE1, size);
 
        addr += size;
-       size = RADEON_UVD_HEAP_SIZE >> 3;
+       size = (RADEON_UVD_STACK_SIZE +
+              (RADEON_UVD_SESSION_SIZE * rdev->uvd.max_handles)) >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
        WREG32(UVD_VCPU_CACHE_SIZE2, size);
 
index 7ed778cec7c6400206674f9c8e2264734dba4b0a..9071e656a565a44b113b840a25f1bf6795a88e25 100644 (file)
@@ -116,12 +116,13 @@ int uvd_v2_2_resume(struct radeon_device *rdev)
        WREG32(UVD_VCPU_CACHE_SIZE0, size);
 
        addr += size;
-       size = RADEON_UVD_STACK_SIZE >> 3;
+       size = RADEON_UVD_HEAP_SIZE >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
        WREG32(UVD_VCPU_CACHE_SIZE1, size);
 
        addr += size;
-       size = RADEON_UVD_HEAP_SIZE >> 3;
+       size = (RADEON_UVD_STACK_SIZE +
+              (RADEON_UVD_SESSION_SIZE * rdev->uvd.max_handles)) >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
        WREG32(UVD_VCPU_CACHE_SIZE2, size);
 
index d04d5073eef2b9903eca4d48adf9c048da806747..91613b8a9dc9d4fa4071bf71b287b8c4de7eed67 100644 (file)
@@ -41,18 +41,25 @@ int uvd_v4_2_resume(struct radeon_device *rdev)
        uint32_t size;
 
        /* programm the VCPU memory controller bits 0-27 */
-       addr = rdev->uvd.gpu_addr >> 3;
+
+       /* skip over the header of the new firmware format */
+       if (rdev->uvd.fw_header_present)
+               addr = (rdev->uvd.gpu_addr + 0x200) >> 3;
+       else
+               addr = rdev->uvd.gpu_addr >> 3;
+
        size = RADEON_GPU_PAGE_ALIGN(rdev->uvd_fw->size + 4) >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET0, addr);
        WREG32(UVD_VCPU_CACHE_SIZE0, size);
 
        addr += size;
-       size = RADEON_UVD_STACK_SIZE >> 3;
+       size = RADEON_UVD_HEAP_SIZE >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET1, addr);
        WREG32(UVD_VCPU_CACHE_SIZE1, size);
 
        addr += size;
-       size = RADEON_UVD_HEAP_SIZE >> 3;
+       size = (RADEON_UVD_STACK_SIZE +
+              (RADEON_UVD_SESSION_SIZE * rdev->uvd.max_handles)) >> 3;
        WREG32(UVD_VCPU_CACHE_OFFSET2, addr);
        WREG32(UVD_VCPU_CACHE_SIZE2, size);
 
@@ -64,5 +71,8 @@ int uvd_v4_2_resume(struct radeon_device *rdev)
        addr = (rdev->uvd.gpu_addr >> 32) & 0xFF;
        WREG32(UVD_LMI_EXT40_ADDR, addr | (0x9 << 16) | (0x1 << 31));
 
+       if (rdev->uvd.fw_header_present)
+               WREG32(UVD_GP_SCRATCH4, rdev->uvd.max_handles);
+
        return 0;
 }
index 1f10fa0928b4a55f3bf435701f9e2eec4068cf59..7fc3ca5ce6c7365065b1c563ac05137bba1640ea 100644 (file)
@@ -2,7 +2,7 @@ config DRM_RCAR_DU
        tristate "DRM Support for R-Car Display Unit"
        depends on DRM && OF
        depends on ARM || ARM64
-       depends on ARCH_SHMOBILE || COMPILE_TEST
+       depends on ARCH_RENESAS || COMPILE_TEST
        select DRM_KMS_HELPER
        select DRM_KMS_CMA_HELPER
        select DRM_GEM_CMA_HELPER
@@ -27,6 +27,6 @@ config DRM_RCAR_LVDS
 config DRM_RCAR_VSP
        bool "R-Car DU VSP Compositor Support"
        depends on DRM_RCAR_DU
-       depends on VIDEO_RENESAS_VSP1
+       depends on VIDEO_RENESAS_VSP1=y || (VIDEO_RENESAS_VSP1 && DRM_RCAR_DU=m)
        help
          Enable support to expose the R-Car VSP Compositor as KMS planes.
index d9f06cc361fa68bde0922ec8550228b98f7b790a..0d8bdda736f9e49d3fe173a219b93642e3e9c68c 100644 (file)
@@ -314,7 +314,7 @@ static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc)
                return;
 
        spin_lock_irqsave(&dev->event_lock, flags);
-       drm_send_vblank_event(dev, rcrtc->index, event);
+       drm_crtc_send_vblank_event(&rcrtc->crtc, event);
        wake_up(&rcrtc->flip_wait);
        spin_unlock_irqrestore(&dev->event_lock, flags);
 
index ed6006bf6bd8938c3aa94903de31fe64b521db6c..fb9242d27883d09dde905891ed0118fe75a95c4e 100644 (file)
@@ -278,10 +278,7 @@ static int rcar_du_remove(struct platform_device *pdev)
        struct rcar_du_device *rcdu = platform_get_drvdata(pdev);
        struct drm_device *ddev = rcdu->ddev;
 
-       mutex_lock(&ddev->mode_config.mutex);
-       drm_connector_unplug_all(ddev);
-       mutex_unlock(&ddev->mode_config.mutex);
-
+       drm_connector_unregister_all(ddev);
        drm_dev_unregister(ddev);
 
        if (rcdu->fbdev)
@@ -300,7 +297,6 @@ static int rcar_du_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct rcar_du_device *rcdu;
-       struct drm_connector *connector;
        struct drm_device *ddev;
        struct resource *mem;
        int ret;
@@ -364,14 +360,7 @@ static int rcar_du_probe(struct platform_device *pdev)
        if (ret)
                goto error;
 
-       mutex_lock(&ddev->mode_config.mutex);
-       drm_for_each_connector(connector, ddev) {
-               ret = drm_connector_register(connector);
-               if (ret < 0)
-                       break;
-       }
-       mutex_unlock(&ddev->mode_config.mutex);
-
+       ret = drm_connector_register_all(ddev);
        if (ret < 0)
                goto error;
 
index 24725bf859b4b4b29b47b8f9c329c7e0dbf395c5..e70a4f33d970883f2dae665dd4d82ab233f26074 100644 (file)
@@ -283,7 +283,8 @@ static void rcar_du_atomic_work(struct work_struct *work)
 }
 
 static int rcar_du_atomic_commit(struct drm_device *dev,
-                                struct drm_atomic_state *state, bool async)
+                                struct drm_atomic_state *state,
+                                bool nonblock)
 {
        struct rcar_du_device *rcdu = dev->dev_private;
        struct rcar_du_commit *commit;
@@ -328,7 +329,7 @@ static int rcar_du_atomic_commit(struct drm_device *dev,
        /* Swap the state, this is the point of no return. */
        drm_atomic_helper_swap_state(dev, state);
 
-       if (async)
+       if (nonblock)
                schedule_work(&commit->work);
        else
                rcar_du_atomic_complete(commit);
index 8460ae1ffa4bbfbea57a29d309da7c226e46f7d6..d445e67f78e1a8378164deb11c5f2aa1f36a61d0 100644 (file)
@@ -635,7 +635,7 @@ rcar_du_plane_atomic_duplicate_state(struct drm_plane *plane)
 static void rcar_du_plane_atomic_destroy_state(struct drm_plane *plane,
                                               struct drm_plane_state *state)
 {
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
        kfree(to_rcar_plane_state(state));
 }
 
index de7ef041182b09bdbe42e9f6aef49ca8553339c2..e671a7cd346378c22b15a3085c455abaee18db45 100644 (file)
@@ -251,7 +251,7 @@ rcar_du_vsp_plane_atomic_duplicate_state(struct drm_plane *plane)
 static void rcar_du_vsp_plane_atomic_destroy_state(struct drm_plane *plane,
                                                   struct drm_plane_state *state)
 {
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
        kfree(to_rcar_vsp_plane_state(state));
 }
 
index 76b3362c5e59a7caf993242de4aad908b4c09642..d30bdc38a760a71e5da6c41c988a204147c657b9 100644 (file)
@@ -16,6 +16,15 @@ config DRM_ROCKCHIP
          2D or 3D acceleration; acceleration is performed by other
          IP found on the SoC.
 
+config ROCKCHIP_ANALOGIX_DP
+       tristate "Rockchip specific extensions for Analogix DP driver"
+       depends on DRM_ROCKCHIP
+       select DRM_ANALOGIX_DP
+       help
+         This selects support for Rockchip SoC specific extensions
+         for the Analogix Core DP driver. If you want to enable DP
+         on RK3288 based SoC, you should selet this option.
+
 config ROCKCHIP_DW_HDMI
         tristate "Rockchip specific extensions for Synopsys DW HDMI"
         depends on DRM_ROCKCHIP
index df8fbef17791e89cebd5e4b252f80e57600162d8..05d07138a2b2a144da5361d26321c8dc2b50eae7 100644 (file)
@@ -6,6 +6,7 @@ rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
                rockchip_drm_gem.o rockchip_drm_vop.o
 rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
 
+obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o
 obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o
 obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o
 obj-$(CONFIG_ROCKCHIP_INNO_HDMI) += inno_hdmi.o
diff --git a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
new file mode 100644 (file)
index 0000000..7f6a55c
--- /dev/null
@@ -0,0 +1,390 @@
+/*
+ * Rockchip SoC DP (Display Port) interface driver.
+ *
+ * Copyright (C) Fuzhou Rockchip Electronics Co., Ltd.
+ * Author: Andy Yan <andy.yan@rock-chips.com>
+ *         Yakir Yang <ykk@rock-chips.com>
+ *         Jeff Chen <jeff.chen@rock-chips.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/component.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of_graph.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+#include <linux/clk.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_dp_helper.h>
+#include <drm/drm_of.h>
+#include <drm/drm_panel.h>
+
+#include <video/of_videomode.h>
+#include <video/videomode.h>
+
+#include <drm/bridge/analogix_dp.h>
+
+#include "rockchip_drm_drv.h"
+#include "rockchip_drm_vop.h"
+
+#define to_dp(nm)      container_of(nm, struct rockchip_dp_device, nm)
+
+/* dp grf register offset */
+#define GRF_SOC_CON6                            0x025c
+#define GRF_EDP_LCD_SEL_MASK                    BIT(5)
+#define GRF_EDP_SEL_VOP_LIT                     BIT(5)
+#define GRF_EDP_SEL_VOP_BIG                     0
+
+struct rockchip_dp_device {
+       struct drm_device        *drm_dev;
+       struct device            *dev;
+       struct drm_encoder       encoder;
+       struct drm_display_mode  mode;
+
+       struct clk               *pclk;
+       struct regmap            *grf;
+       struct reset_control     *rst;
+
+       struct analogix_dp_plat_data plat_data;
+};
+
+static int rockchip_dp_pre_init(struct rockchip_dp_device *dp)
+{
+       reset_control_assert(dp->rst);
+       usleep_range(10, 20);
+       reset_control_deassert(dp->rst);
+
+       return 0;
+}
+
+static int rockchip_dp_poweron(struct analogix_dp_plat_data *plat_data)
+{
+       struct rockchip_dp_device *dp = to_dp(plat_data);
+       int ret;
+
+       ret = clk_prepare_enable(dp->pclk);
+       if (ret < 0) {
+               dev_err(dp->dev, "failed to enable pclk %d\n", ret);
+               return ret;
+       }
+
+       ret = rockchip_dp_pre_init(dp);
+       if (ret < 0) {
+               dev_err(dp->dev, "failed to dp pre init %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_dp_powerdown(struct analogix_dp_plat_data *plat_data)
+{
+       struct rockchip_dp_device *dp = to_dp(plat_data);
+
+       clk_disable_unprepare(dp->pclk);
+
+       return 0;
+}
+
+static bool
+rockchip_dp_drm_encoder_mode_fixup(struct drm_encoder *encoder,
+                                  const struct drm_display_mode *mode,
+                                  struct drm_display_mode *adjusted_mode)
+{
+       /* do nothing */
+       return true;
+}
+
+static void rockchip_dp_drm_encoder_mode_set(struct drm_encoder *encoder,
+                                            struct drm_display_mode *mode,
+                                            struct drm_display_mode *adjusted)
+{
+       /* do nothing */
+}
+
+static void rockchip_dp_drm_encoder_enable(struct drm_encoder *encoder)
+{
+       struct rockchip_dp_device *dp = to_dp(encoder);
+       int ret;
+       u32 val;
+
+       ret = drm_of_encoder_active_endpoint_id(dp->dev->of_node, encoder);
+       if (ret < 0)
+               return;
+
+       if (ret)
+               val = GRF_EDP_SEL_VOP_LIT | (GRF_EDP_LCD_SEL_MASK << 16);
+       else
+               val = GRF_EDP_SEL_VOP_BIG | (GRF_EDP_LCD_SEL_MASK << 16);
+
+       dev_dbg(dp->dev, "vop %s output to dp\n", (ret) ? "LIT" : "BIG");
+
+       ret = regmap_write(dp->grf, GRF_SOC_CON6, val);
+       if (ret != 0) {
+               dev_err(dp->dev, "Could not write to GRF: %d\n", ret);
+               return;
+       }
+}
+
+static void rockchip_dp_drm_encoder_nop(struct drm_encoder *encoder)
+{
+       /* do nothing */
+}
+
+static int
+rockchip_dp_drm_encoder_atomic_check(struct drm_encoder *encoder,
+                                     struct drm_crtc_state *crtc_state,
+                                     struct drm_connector_state *conn_state)
+{
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
+
+       /*
+        * FIXME(Yakir): driver should configure the CRTC output video
+        * mode with the display information which indicated the monitor
+        * support colorimetry.
+        *
+        * But don't know why the CRTC driver seems could only output the
+        * RGBaaa rightly. For example, if connect the "innolux,n116bge"
+        * eDP screen, EDID would indicated that screen only accepted the
+        * 6bpc mode. But if I configure CRTC to RGB666 output, then eDP
+        * screen would show a blue picture (RGB888 show a green picture).
+        * But if I configure CTRC to RGBaaa, and eDP driver still keep
+        * RGB666 input video mode, then screen would works prefect.
+        */
+       s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
+       s->output_type = DRM_MODE_CONNECTOR_eDP;
+
+       return 0;
+}
+
+static struct drm_encoder_helper_funcs rockchip_dp_encoder_helper_funcs = {
+       .mode_fixup = rockchip_dp_drm_encoder_mode_fixup,
+       .mode_set = rockchip_dp_drm_encoder_mode_set,
+       .enable = rockchip_dp_drm_encoder_enable,
+       .disable = rockchip_dp_drm_encoder_nop,
+       .atomic_check = rockchip_dp_drm_encoder_atomic_check,
+};
+
+static void rockchip_dp_drm_encoder_destroy(struct drm_encoder *encoder)
+{
+       drm_encoder_cleanup(encoder);
+}
+
+static struct drm_encoder_funcs rockchip_dp_encoder_funcs = {
+       .destroy = rockchip_dp_drm_encoder_destroy,
+};
+
+static int rockchip_dp_init(struct rockchip_dp_device *dp)
+{
+       struct device *dev = dp->dev;
+       struct device_node *np = dev->of_node;
+       int ret;
+
+       dp->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
+       if (IS_ERR(dp->grf)) {
+               dev_err(dev, "failed to get rockchip,grf property\n");
+               return PTR_ERR(dp->grf);
+       }
+
+       dp->pclk = devm_clk_get(dev, "pclk");
+       if (IS_ERR(dp->pclk)) {
+               dev_err(dev, "failed to get pclk property\n");
+               return PTR_ERR(dp->pclk);
+       }
+
+       dp->rst = devm_reset_control_get(dev, "dp");
+       if (IS_ERR(dp->rst)) {
+               dev_err(dev, "failed to get dp reset control\n");
+               return PTR_ERR(dp->rst);
+       }
+
+       ret = clk_prepare_enable(dp->pclk);
+       if (ret < 0) {
+               dev_err(dp->dev, "failed to enable pclk %d\n", ret);
+               return ret;
+       }
+
+       ret = rockchip_dp_pre_init(dp);
+       if (ret < 0) {
+               dev_err(dp->dev, "failed to pre init %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_dp_drm_create_encoder(struct rockchip_dp_device *dp)
+{
+       struct drm_encoder *encoder = &dp->encoder;
+       struct drm_device *drm_dev = dp->drm_dev;
+       struct device *dev = dp->dev;
+       int ret;
+
+       encoder->possible_crtcs = drm_of_find_possible_crtcs(drm_dev,
+                                                            dev->of_node);
+       DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
+
+       ret = drm_encoder_init(drm_dev, encoder, &rockchip_dp_encoder_funcs,
+                              DRM_MODE_ENCODER_TMDS, NULL);
+       if (ret) {
+               DRM_ERROR("failed to initialize encoder with drm\n");
+               return ret;
+       }
+
+       drm_encoder_helper_add(encoder, &rockchip_dp_encoder_helper_funcs);
+
+       return 0;
+}
+
+static int rockchip_dp_bind(struct device *dev, struct device *master,
+                           void *data)
+{
+       struct rockchip_dp_device *dp = dev_get_drvdata(dev);
+       struct drm_device *drm_dev = data;
+       int ret;
+
+       /*
+        * Just like the probe function said, we don't need the
+        * device drvrate anymore, we should leave the charge to
+        * analogix dp driver, set the device drvdata to NULL.
+        */
+       dev_set_drvdata(dev, NULL);
+
+       ret = rockchip_dp_init(dp);
+       if (ret < 0)
+               return ret;
+
+       dp->drm_dev = drm_dev;
+
+       ret = rockchip_dp_drm_create_encoder(dp);
+       if (ret) {
+               DRM_ERROR("failed to create drm encoder\n");
+               return ret;
+       }
+
+       dp->plat_data.encoder = &dp->encoder;
+
+       dp->plat_data.dev_type = RK3288_DP;
+       dp->plat_data.power_on = rockchip_dp_poweron;
+       dp->plat_data.power_off = rockchip_dp_powerdown;
+
+       return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+}
+
+static void rockchip_dp_unbind(struct device *dev, struct device *master,
+                              void *data)
+{
+       return analogix_dp_unbind(dev, master, data);
+}
+
+static const struct component_ops rockchip_dp_component_ops = {
+       .bind = rockchip_dp_bind,
+       .unbind = rockchip_dp_unbind,
+};
+
+static int rockchip_dp_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device_node *panel_node, *port, *endpoint;
+       struct rockchip_dp_device *dp;
+       struct drm_panel *panel;
+
+       port = of_graph_get_port_by_id(dev->of_node, 1);
+       if (!port) {
+               dev_err(dev, "can't find output port\n");
+               return -EINVAL;
+       }
+
+       endpoint = of_get_child_by_name(port, "endpoint");
+       of_node_put(port);
+       if (!endpoint) {
+               dev_err(dev, "no output endpoint found\n");
+               return -EINVAL;
+       }
+
+       panel_node = of_graph_get_remote_port_parent(endpoint);
+       of_node_put(endpoint);
+       if (!panel_node) {
+               dev_err(dev, "no output node found\n");
+               return -EINVAL;
+       }
+
+       panel = of_drm_find_panel(panel_node);
+       if (!panel) {
+               DRM_ERROR("failed to find panel\n");
+               of_node_put(panel_node);
+               return -EPROBE_DEFER;
+       }
+
+       of_node_put(panel_node);
+
+       dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
+       if (!dp)
+               return -ENOMEM;
+
+       dp->dev = dev;
+
+       dp->plat_data.panel = panel;
+
+       /*
+        * We just use the drvdata until driver run into component
+        * add function, and then we would set drvdata to null, so
+        * that analogix dp driver could take charge of the drvdata.
+        */
+       platform_set_drvdata(pdev, dp);
+
+       return component_add(dev, &rockchip_dp_component_ops);
+}
+
+static int rockchip_dp_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &rockchip_dp_component_ops);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int rockchip_dp_suspend(struct device *dev)
+{
+       return analogix_dp_suspend(dev);
+}
+
+static int rockchip_dp_resume(struct device *dev)
+{
+       return analogix_dp_resume(dev);
+}
+#endif
+
+static const struct dev_pm_ops rockchip_dp_pm_ops = {
+       SET_SYSTEM_SLEEP_PM_OPS(rockchip_dp_suspend, rockchip_dp_resume)
+};
+
+static const struct of_device_id rockchip_dp_dt_ids[] = {
+       {.compatible = "rockchip,rk3288-dp",},
+       {}
+};
+MODULE_DEVICE_TABLE(of, rockchip_dp_dt_ids);
+
+static struct platform_driver rockchip_dp_driver = {
+       .probe = rockchip_dp_probe,
+       .remove = rockchip_dp_remove,
+       .driver = {
+                  .name = "rockchip-dp",
+                  .owner = THIS_MODULE,
+                  .pm = &rockchip_dp_pm_ops,
+                  .of_match_table = of_match_ptr(rockchip_dp_dt_ids),
+       },
+};
+
+module_platform_driver(rockchip_dp_driver);
+
+MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
+MODULE_AUTHOR("Jeff chen <jeff.chen@rock-chips.com>");
+MODULE_DESCRIPTION("Rockchip Specific Analogix-DP Driver Extension");
+MODULE_LICENSE("GPL v2");
index 7975158064e8cc3627dc61bf834ad062501e90e1..dedc65b40f36c5abd16115dc23cce208d730152d 100644 (file)
@@ -879,7 +879,6 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder)
 {
        struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
        int mux = drm_of_encoder_active_endpoint_id(dsi->dev->of_node, encoder);
-       u32 interface_pix_fmt;
        u32 val;
 
        if (clk_prepare_enable(dsi->pclk)) {
@@ -895,31 +894,41 @@ static void dw_mipi_dsi_encoder_commit(struct drm_encoder *encoder)
 
        clk_disable_unprepare(dsi->pclk);
 
+       if (mux)
+               val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16);
+       else
+               val = DSI0_SEL_VOP_LIT << 16;
+
+       regmap_write(dsi->grf_regmap, GRF_SOC_CON6, val);
+       dev_dbg(dsi->dev, "vop %s output to dsi0\n", (mux) ? "LIT" : "BIG");
+}
+
+static int
+dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
+                                struct drm_crtc_state *crtc_state,
+                                struct drm_connector_state *conn_state)
+{
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
+       struct dw_mipi_dsi *dsi = encoder_to_dsi(encoder);
+
        switch (dsi->format) {
        case MIPI_DSI_FMT_RGB888:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P888;
+               s->output_mode = ROCKCHIP_OUT_MODE_P888;
                break;
        case MIPI_DSI_FMT_RGB666:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P666;
+               s->output_mode = ROCKCHIP_OUT_MODE_P666;
                break;
        case MIPI_DSI_FMT_RGB565:
-               interface_pix_fmt = ROCKCHIP_OUT_MODE_P565;
+               s->output_mode = ROCKCHIP_OUT_MODE_P565;
                break;
        default:
                WARN_ON(1);
-               return;
+               return -EINVAL;
        }
 
-       rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_DSI,
-                                     interface_pix_fmt);
+       s->output_type = DRM_MODE_CONNECTOR_DSI;
 
-       if (mux)
-               val = DSI0_SEL_VOP_LIT | (DSI0_SEL_VOP_LIT << 16);
-       else
-               val = DSI0_SEL_VOP_LIT << 16;
-
-       regmap_write(dsi->grf_regmap, GRF_SOC_CON6, val);
-       dev_dbg(dsi->dev, "vop %s output to dsi0\n", (mux) ? "LIT" : "BIG");
+       return 0;
 }
 
 static struct drm_encoder_helper_funcs
@@ -927,6 +936,7 @@ dw_mipi_dsi_encoder_helper_funcs = {
        .commit = dw_mipi_dsi_encoder_commit,
        .mode_set = dw_mipi_dsi_encoder_mode_set,
        .disable = dw_mipi_dsi_encoder_disable,
+       .atomic_check = dw_mipi_dsi_encoder_atomic_check,
 };
 
 static struct drm_encoder_funcs dw_mipi_dsi_encoder_funcs = {
index d5cfef75fc80b96716a062543f1ae7d0565120e0..801110f65a63896004aea13587b39edec4ceaab4 100644 (file)
@@ -201,9 +201,6 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder)
        u32 val;
        int mux;
 
-       rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA,
-                                     ROCKCHIP_OUT_MODE_AAAA);
-
        mux = drm_of_encoder_active_endpoint_id(hdmi->dev->of_node, encoder);
        if (mux)
                val = HDMI_SEL_VOP_LIT | (HDMI_SEL_VOP_LIT << 16);
@@ -215,11 +212,25 @@ static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder)
                (mux) ? "LIT" : "BIG");
 }
 
+static int
+dw_hdmi_rockchip_encoder_atomic_check(struct drm_encoder *encoder,
+                                     struct drm_crtc_state *crtc_state,
+                                     struct drm_connector_state *conn_state)
+{
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
+
+       s->output_mode = ROCKCHIP_OUT_MODE_AAAA;
+       s->output_type = DRM_MODE_CONNECTOR_HDMIA;
+
+       return 0;
+}
+
 static const struct drm_encoder_helper_funcs dw_hdmi_rockchip_encoder_helper_funcs = {
        .mode_fixup = dw_hdmi_rockchip_encoder_mode_fixup,
        .mode_set   = dw_hdmi_rockchip_encoder_mode_set,
        .enable     = dw_hdmi_rockchip_encoder_enable,
        .disable    = dw_hdmi_rockchip_encoder_disable,
+       .atomic_check = dw_hdmi_rockchip_encoder_atomic_check,
 };
 
 static const struct dw_hdmi_plat_data rockchip_hdmi_drv_data = {
index 10d62fff22f1b9e6103694d53af924371e2eec6a..f8b4feb60b256f6e21d8f36b8050c22c7fa02f3e 100644 (file)
@@ -500,9 +500,6 @@ static void inno_hdmi_encoder_enable(struct drm_encoder *encoder)
 {
        struct inno_hdmi *hdmi = to_inno_hdmi(encoder);
 
-       rockchip_drm_crtc_mode_config(encoder->crtc, DRM_MODE_CONNECTOR_HDMIA,
-                                     ROCKCHIP_OUT_MODE_P888);
-
        inno_hdmi_set_pwr_mode(hdmi, NORMAL);
 }
 
@@ -520,11 +517,25 @@ static bool inno_hdmi_encoder_mode_fixup(struct drm_encoder *encoder,
        return true;
 }
 
+static int
+inno_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
+                              struct drm_crtc_state *crtc_state,
+                              struct drm_connector_state *conn_state)
+{
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
+
+       s->output_mode = ROCKCHIP_OUT_MODE_P888;
+       s->output_type = DRM_MODE_CONNECTOR_HDMIA;
+
+       return 0;
+}
+
 static struct drm_encoder_helper_funcs inno_hdmi_encoder_helper_funcs = {
        .enable     = inno_hdmi_encoder_enable,
        .disable    = inno_hdmi_encoder_disable,
        .mode_fixup = inno_hdmi_encoder_mode_fixup,
        .mode_set   = inno_hdmi_encoder_mode_set,
+       .atomic_check = inno_hdmi_encoder_atomic_check,
 };
 
 static struct drm_encoder_funcs inno_hdmi_encoder_funcs = {
@@ -855,8 +866,9 @@ static int inno_hdmi_bind(struct device *dev, struct device *master,
 
        hdmi->ddc = inno_hdmi_i2c_adapter(hdmi);
        if (IS_ERR(hdmi->ddc)) {
+               ret = PTR_ERR(hdmi->ddc);
                hdmi->ddc = NULL;
-               return PTR_ERR(hdmi->ddc);
+               return ret;
        }
 
        /*
index f556a8f4fde6c7f2e6f36708b07a2d1de4d13118..a409d1f703cb2b0dd7ab3767244872c44b9076e8 100644 (file)
@@ -36,6 +36,8 @@
 #define DRIVER_MAJOR   1
 #define DRIVER_MINOR   0
 
+static bool is_support_iommu = true;
+
 /*
  * Attach a (component) device to the shared drm dma mapping from master drm
  * device.  This is used by the VOPs to map GEM buffers to a common DMA
@@ -47,6 +49,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
        struct dma_iommu_mapping *mapping = drm_dev->dev->archdata.mapping;
        int ret;
 
+       if (!is_support_iommu)
+               return 0;
+
        ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32));
        if (ret)
                return ret;
@@ -59,6 +64,9 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
 void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
                                    struct device *dev)
 {
+       if (!is_support_iommu)
+               return;
+
        arm_iommu_detach_device(dev);
 }
 
@@ -127,7 +135,7 @@ static void rockchip_drm_crtc_disable_vblank(struct drm_device *dev,
 static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags)
 {
        struct rockchip_drm_private *private;
-       struct dma_iommu_mapping *mapping;
+       struct dma_iommu_mapping *mapping = NULL;
        struct device *dev = drm_dev->dev;
        struct drm_connector *connector;
        int ret;
@@ -152,23 +160,26 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags)
                goto err_config_cleanup;
        }
 
-       /* TODO(djkurtz): fetch the mapping start/size from somewhere */
-       mapping = arm_iommu_create_mapping(&platform_bus_type, 0x00000000,
-                                          SZ_2G);
-       if (IS_ERR(mapping)) {
-               ret = PTR_ERR(mapping);
-               goto err_config_cleanup;
-       }
+       if (is_support_iommu) {
+               /* TODO(djkurtz): fetch the mapping start/size from somewhere */
+               mapping = arm_iommu_create_mapping(&platform_bus_type,
+                                                  0x00000000,
+                                                  SZ_2G);
+               if (IS_ERR(mapping)) {
+                       ret = PTR_ERR(mapping);
+                       goto err_config_cleanup;
+               }
 
-       ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
-       if (ret)
-               goto err_release_mapping;
+               ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
+               if (ret)
+                       goto err_release_mapping;
 
-       dma_set_max_seg_size(dev, DMA_BIT_MASK(32));
+               dma_set_max_seg_size(dev, DMA_BIT_MASK(32));
 
-       ret = arm_iommu_attach_device(dev, mapping);
-       if (ret)
-               goto err_release_mapping;
+               ret = arm_iommu_attach_device(dev, mapping);
+               if (ret)
+                       goto err_release_mapping;
+       }
 
        /* Try to bind all sub drivers. */
        ret = component_bind_all(dev, drm_dev);
@@ -205,19 +216,14 @@ static int rockchip_drm_load(struct drm_device *drm_dev, unsigned long flags)
        if (ret)
                goto err_kms_helper_poll_fini;
 
-       /*
-        * with vblank_disable_allowed = true, vblank interrupt will be disabled
-        * by drm timer once a current process gives up ownership of
-        * vblank event.(after drm_vblank_put function is called)
-        */
-       drm_dev->vblank_disable_allowed = true;
-
        drm_mode_config_reset(drm_dev);
 
        ret = rockchip_drm_fbdev_init(drm_dev);
        if (ret)
                goto err_vblank_cleanup;
 
+       if (is_support_iommu)
+               arm_iommu_release_mapping(mapping);
        return 0;
 err_vblank_cleanup:
        drm_vblank_cleanup(drm_dev);
@@ -226,9 +232,11 @@ err_kms_helper_poll_fini:
 err_unbind:
        component_unbind_all(dev, drm_dev);
 err_detach_device:
-       arm_iommu_detach_device(dev);
+       if (is_support_iommu)
+               arm_iommu_detach_device(dev);
 err_release_mapping:
-       arm_iommu_release_mapping(dev->archdata.mapping);
+       if (is_support_iommu)
+               arm_iommu_release_mapping(mapping);
 err_config_cleanup:
        drm_mode_config_cleanup(drm_dev);
        drm_dev->dev_private = NULL;
@@ -243,8 +251,8 @@ static int rockchip_drm_unload(struct drm_device *drm_dev)
        drm_vblank_cleanup(drm_dev);
        drm_kms_helper_poll_fini(drm_dev);
        component_unbind_all(dev, drm_dev);
-       arm_iommu_detach_device(dev);
-       arm_iommu_release_mapping(dev->archdata.mapping);
+       if (is_support_iommu)
+               arm_iommu_detach_device(dev);
        drm_mode_config_cleanup(drm_dev);
        drm_dev->dev_private = NULL;
 
@@ -488,6 +496,8 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev)
         * works as expected.
         */
        for (i = 0;; i++) {
+               struct device_node *iommu;
+
                port = of_parse_phandle(np, "ports", i);
                if (!port)
                        break;
@@ -497,6 +507,17 @@ static int rockchip_drm_platform_probe(struct platform_device *pdev)
                        continue;
                }
 
+               iommu = of_parse_phandle(port->parent, "iommus", 0);
+               if (!iommu || !of_device_is_available(iommu->parent)) {
+                       dev_dbg(dev, "no iommu attached for %s, using non-iommu buffers\n",
+                               port->parent->full_name);
+                       /*
+                        * if there is a crtc not support iommu, force set all
+                        * crtc use non-iommu buffer.
+                        */
+                       is_support_iommu = false;
+               }
+
                component_match_add(dev, &match, compare_of, port->parent);
                of_node_put(port);
        }
index 00d17d71aa4cef5785154d51cc78e68d83586860..56f43a364c7fce08d72136de7764c0762c95b46e 100644 (file)
@@ -50,6 +50,14 @@ struct rockchip_atomic_commit {
        struct mutex lock;
 };
 
+struct rockchip_crtc_state {
+       struct drm_crtc_state base;
+       int output_type;
+       int output_mode;
+};
+#define to_rockchip_crtc_state(s) \
+               container_of(s, struct rockchip_crtc_state, base)
+
 /*
  * Rockchip drm private structure.
  *
@@ -68,8 +76,6 @@ void rockchip_drm_atomic_work(struct work_struct *work);
 int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
                                 const struct rockchip_crtc_funcs *crtc_funcs);
 void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc);
-int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc, int connector_type,
-                                 int out_mode);
 int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
                                   struct device *dev);
 void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
index 3b8f652698f828574c19f624264e816ab1299ee9..755cfdba61cd21f0f5b7f93743f1bb843c1cbf5f 100644 (file)
@@ -123,8 +123,7 @@ rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
                unsigned int height = mode_cmd->height / (i ? vsub : 1);
                unsigned int min_size;
 
-               obj = drm_gem_object_lookup(dev, file_priv,
-                                           mode_cmd->handles[i]);
+               obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
                if (!obj) {
                        dev_err(dev->dev, "Failed to lookup GEM object\n");
                        ret = -ENXIO;
@@ -276,7 +275,7 @@ void rockchip_drm_atomic_work(struct work_struct *work)
 
 int rockchip_drm_atomic_commit(struct drm_device *dev,
                               struct drm_atomic_state *state,
-                              bool async)
+                              bool nonblock)
 {
        struct rockchip_drm_private *private = dev->dev_private;
        struct rockchip_atomic_commit *commit = &private->commit;
@@ -286,7 +285,7 @@ int rockchip_drm_atomic_commit(struct drm_device *dev,
        if (ret)
                return ret;
 
-       /* serialize outstanding asynchronous commits */
+       /* serialize outstanding nonblocking commits */
        mutex_lock(&commit->lock);
        flush_work(&commit->work);
 
@@ -295,7 +294,7 @@ int rockchip_drm_atomic_commit(struct drm_device *dev,
        commit->dev = dev;
        commit->state = state;
 
-       if (async)
+       if (nonblock)
                schedule_work(&commit->work);
        else
                rockchip_atomic_commit_complete(commit);
index 18e07338c6e5f31f45b9a38c17884164fc476cff..9c2d8a894093876f027fb44bb9f73d1cbb23b86e 100644 (file)
@@ -198,7 +198,7 @@ int rockchip_gem_dumb_map_offset(struct drm_file *file_priv,
        struct drm_gem_object *obj;
        int ret;
 
-       obj = drm_gem_object_lookup(dev, file_priv, handle);
+       obj = drm_gem_object_lookup(file_priv, handle);
        if (!obj) {
                DRM_ERROR("failed to lookup gem object.\n");
                return -EINVAL;
index a619f120f801f810fca5e3b2e7ff2cbeade89861..1c4d5b5a70a2b8b2b61f22581ee9428f47913c40 100644 (file)
@@ -310,7 +310,7 @@ static void scl_vop_cal_scl_fac(struct vop *vop, const struct vop_win_data *win,
        uint16_t vsu_mode;
        uint16_t lb_mode;
        uint32_t val;
-       int vskiplines;
+       int vskiplines = 0;
 
        if (dst_w > 3840) {
                DRM_ERROR("Maximum destination width (3840) exceeded\n");
@@ -560,6 +560,22 @@ static void vop_plane_destroy(struct drm_plane *plane)
        drm_plane_cleanup(plane);
 }
 
+static int vop_plane_prepare_fb(struct drm_plane *plane,
+                               const struct drm_plane_state *new_state)
+{
+       if (plane->state->fb)
+               drm_framebuffer_reference(plane->state->fb);
+
+       return 0;
+}
+
+static void vop_plane_cleanup_fb(struct drm_plane *plane,
+                                const struct drm_plane_state *old_state)
+{
+       if (old_state->fb)
+               drm_framebuffer_unreference(old_state->fb);
+}
+
 static int vop_plane_atomic_check(struct drm_plane *plane,
                           struct drm_plane_state *state)
 {
@@ -756,6 +772,8 @@ static void vop_plane_atomic_update(struct drm_plane *plane,
 }
 
 static const struct drm_plane_helper_funcs plane_helper_funcs = {
+       .prepare_fb = vop_plane_prepare_fb,
+       .cleanup_fb = vop_plane_cleanup_fb,
        .atomic_check = vop_plane_atomic_check,
        .atomic_update = vop_plane_atomic_update,
        .atomic_disable = vop_plane_atomic_disable,
@@ -804,7 +822,7 @@ static void vop_atomic_plane_destroy_state(struct drm_plane *plane,
 {
        struct vop_plane_state *vop_state = to_vop_plane_state(state);
 
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
 
        kfree(vop_state);
 }
@@ -818,38 +836,6 @@ static const struct drm_plane_funcs vop_plane_funcs = {
        .atomic_destroy_state = vop_atomic_plane_destroy_state,
 };
 
-int rockchip_drm_crtc_mode_config(struct drm_crtc *crtc,
-                                 int connector_type,
-                                 int out_mode)
-{
-       struct vop *vop = to_vop(crtc);
-
-       if (WARN_ON(!vop->is_enabled))
-               return -EINVAL;
-
-       switch (connector_type) {
-       case DRM_MODE_CONNECTOR_LVDS:
-               VOP_CTRL_SET(vop, rgb_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_eDP:
-               VOP_CTRL_SET(vop, edp_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_HDMIA:
-               VOP_CTRL_SET(vop, hdmi_en, 1);
-               break;
-       case DRM_MODE_CONNECTOR_DSI:
-               VOP_CTRL_SET(vop, mipi_en, 1);
-               break;
-       default:
-               DRM_ERROR("unsupport connector_type[%d]\n", connector_type);
-               return -EINVAL;
-       };
-       VOP_CTRL_SET(vop, out_mode, out_mode);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(rockchip_drm_crtc_mode_config);
-
 static int vop_crtc_enable_vblank(struct drm_crtc *crtc)
 {
        struct vop *vop = to_vop(crtc);
@@ -931,6 +917,7 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc,
 static void vop_crtc_enable(struct drm_crtc *crtc)
 {
        struct vop *vop = to_vop(crtc);
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state);
        struct drm_display_mode *adjusted_mode = &crtc->state->adjusted_mode;
        u16 hsync_len = adjusted_mode->hsync_end - adjusted_mode->hsync_start;
        u16 hdisplay = adjusted_mode->hdisplay;
@@ -985,6 +972,23 @@ static void vop_crtc_enable(struct drm_crtc *crtc)
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC) ? 0 : 1;
        val |= (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC) ? 0 : (1 << 1);
        VOP_CTRL_SET(vop, pin_pol, val);
+       switch (s->output_type) {
+       case DRM_MODE_CONNECTOR_LVDS:
+               VOP_CTRL_SET(vop, rgb_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_eDP:
+               VOP_CTRL_SET(vop, edp_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_HDMIA:
+               VOP_CTRL_SET(vop, hdmi_en, 1);
+               break;
+       case DRM_MODE_CONNECTOR_DSI:
+               VOP_CTRL_SET(vop, mipi_en, 1);
+               break;
+       default:
+               DRM_ERROR("unsupport connector_type[%d]\n", s->output_type);
+       }
+       VOP_CTRL_SET(vop, out_mode, s->output_mode);
 
        VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
        val = hact_st << 16;
@@ -1044,13 +1048,34 @@ static void vop_crtc_destroy(struct drm_crtc *crtc)
        drm_crtc_cleanup(crtc);
 }
 
+static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc)
+{
+       struct rockchip_crtc_state *rockchip_state;
+
+       rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL);
+       if (!rockchip_state)
+               return NULL;
+
+       __drm_atomic_helper_crtc_duplicate_state(crtc, &rockchip_state->base);
+       return &rockchip_state->base;
+}
+
+static void vop_crtc_destroy_state(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *state)
+{
+       struct rockchip_crtc_state *s = to_rockchip_crtc_state(state);
+
+       __drm_atomic_helper_crtc_destroy_state(&s->base);
+       kfree(s);
+}
+
 static const struct drm_crtc_funcs vop_crtc_funcs = {
        .set_config = drm_atomic_helper_set_config,
        .page_flip = drm_atomic_helper_page_flip,
        .destroy = vop_crtc_destroy,
        .reset = drm_atomic_helper_crtc_reset,
-       .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
+       .atomic_duplicate_state = vop_crtc_duplicate_state,
+       .atomic_destroy_state = vop_crtc_destroy_state,
 };
 
 static bool vop_win_pending_is_complete(struct vop_win *vop_win)
index 88643ab160bf7e9907bf87c933392c0173b83023..1e154fc779d55aa7db6d993068abd36cc30de06d 100644 (file)
@@ -440,7 +440,7 @@ void shmob_drm_crtc_finish_page_flip(struct shmob_drm_crtc *scrtc)
        event = scrtc->event;
        scrtc->event = NULL;
        if (event) {
-               drm_send_vblank_event(dev, 0, event);
+               drm_crtc_send_vblank_event(&scrtc->crtc, event);
                drm_vblank_put(dev, 0);
        }
        spin_unlock_irqrestore(&dev->event_lock, flags);
index 3abb400151acaf304652044013f55fd0091e6428..4e990299735c0fa1de0b049ee949f8843a416e23 100644 (file)
@@ -6,6 +6,8 @@
  * License terms:  GNU General Public License (GPL), version 2
  */
 
+#include <linux/seq_file.h>
+
 #include <drm/drm_atomic.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
index 6bd6abaa5a70c7dce65e596af7b45b41b9fe79a7..872495e72294107878e6c213200d11a50686a911 100644 (file)
@@ -202,7 +202,7 @@ static void sti_atomic_work(struct work_struct *work)
 }
 
 static int sti_atomic_commit(struct drm_device *drm,
-                            struct drm_atomic_state *state, bool async)
+                            struct drm_atomic_state *state, bool nonblock)
 {
        struct sti_private *private = drm->dev_private;
        int err;
@@ -211,7 +211,7 @@ static int sti_atomic_commit(struct drm_device *drm,
        if (err)
                return err;
 
-       /* serialize outstanding asynchronous commits */
+       /* serialize outstanding nonblocking commits */
        mutex_lock(&private->commit.lock);
        flush_work(&private->commit.work);
 
@@ -223,7 +223,7 @@ static int sti_atomic_commit(struct drm_device *drm,
 
        drm_atomic_helper_swap_state(drm, state);
 
-       if (async)
+       if (nonblock)
                sti_atomic_schedule(private, state);
        else
                sti_atomic_complete(private, state);
index ff3d3e7e770418f2830a474ab03793020161ab39..ff33c38da197be7a0ac63e0691119dbb2f6cd509 100644 (file)
@@ -5,6 +5,7 @@
  *          for STMicroelectronics.
  * License terms:  GNU General Public License (GPL), version 2
  */
+#include <linux/seq_file.h>
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_fb_cma_helper.h>
index ec0d017eaf1a58b6c57555173898e3af9a5cfc4e..f7d3464cdf09af71c984dfa1858f4fe8b5979ab8 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/component.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/seq_file.h>
 
 #include <drm/drmP.h>
 #include <drm/drm_atomic_helper.h>
index e05b0dc523ff93f3309c2aea9c2de032e7971636..1edec29b9e45b70f596060304526840e174b9fd4 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/component.h>
 #include <linux/firmware.h>
 #include <linux/reset.h>
+#include <linux/seq_file.h>
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_fb_cma_helper.h>
index e7425c38fc938a622df224fde2e5efbc291747ef..aed7801b51f714702bc20f2cdef10be16e2aefeb 100644 (file)
@@ -5,6 +5,7 @@
  *          for STMicroelectronics.
  * License terms:  GNU General Public License (GPL), version 2
  */
+#include <linux/seq_file.h>
 
 #include "sti_compositor.h"
 #include "sti_mixer.h"
index 2c99016443e58ec1179e1a93c06368ad04befc2d..f983db5a59da1f33fbdc349ac896435a151cc2e1 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/of_platform.h>
 #include <linux/platform_device.h>
 #include <linux/reset.h>
+#include <linux/seq_file.h>
 
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
index 5a2c5dc3687b0c901b5f6f05436fea04ca2b5815..523ed19f5ac6351408c73acff5287da9284af5a6 100644 (file)
@@ -3,6 +3,7 @@
  * Author: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
  * License terms:  GNU General Public License (GPL), version 2
  */
+#include <linux/seq_file.h>
 
 #include <drm/drmP.h>
 
diff --git a/drivers/gpu/drm/sun4i/Kconfig b/drivers/gpu/drm/sun4i/Kconfig
new file mode 100644 (file)
index 0000000..99510e6
--- /dev/null
@@ -0,0 +1,14 @@
+config DRM_SUN4I
+       tristate "DRM Support for Allwinner A10 Display Engine"
+       depends on DRM && ARM
+       depends on ARCH_SUNXI || COMPILE_TEST
+       select DRM_GEM_CMA_HELPER
+       select DRM_KMS_HELPER
+       select DRM_KMS_CMA_HELPER
+       select DRM_PANEL
+       select REGMAP_MMIO
+       select VIDEOMODE_HELPERS
+       help
+         Choose this option if you have an Allwinner SoC with a
+         Display Engine. If M is selected the module will be called
+         sun4i-drm.
diff --git a/drivers/gpu/drm/sun4i/Makefile b/drivers/gpu/drm/sun4i/Makefile
new file mode 100644 (file)
index 0000000..58cd551
--- /dev/null
@@ -0,0 +1,13 @@
+sun4i-drm-y += sun4i_crtc.o
+sun4i-drm-y += sun4i_drv.o
+sun4i-drm-y += sun4i_framebuffer.o
+sun4i-drm-y += sun4i_layer.o
+
+sun4i-tcon-y += sun4i_tcon.o
+sun4i-tcon-y += sun4i_rgb.o
+sun4i-tcon-y += sun4i_dotclock.o
+
+obj-$(CONFIG_DRM_SUN4I)                += sun4i-drm.o sun4i-tcon.o
+obj-$(CONFIG_DRM_SUN4I)                += sun4i_backend.o
+
+obj-$(CONFIG_DRM_SUN4I)                += sun4i_tv.o
diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c
new file mode 100644 (file)
index 0000000..f7a15c1
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_plane_helper.h>
+
+#include <linux/component.h>
+#include <linux/reset.h>
+
+#include "sun4i_backend.h"
+#include "sun4i_drv.h"
+
+static u32 sunxi_rgb2yuv_coef[12] = {
+       0x00000107, 0x00000204, 0x00000064, 0x00000108,
+       0x00003f69, 0x00003ed6, 0x000001c1, 0x00000808,
+       0x000001c1, 0x00003e88, 0x00003fb8, 0x00000808
+};
+
+void sun4i_backend_apply_color_correction(struct sun4i_backend *backend)
+{
+       int i;
+
+       DRM_DEBUG_DRIVER("Applying RGB to YUV color correction\n");
+
+       /* Set color correction */
+       regmap_write(backend->regs, SUN4I_BACKEND_OCCTL_REG,
+                    SUN4I_BACKEND_OCCTL_ENABLE);
+
+       for (i = 0; i < 12; i++)
+               regmap_write(backend->regs, SUN4I_BACKEND_OCRCOEF_REG(i),
+                            sunxi_rgb2yuv_coef[i]);
+}
+EXPORT_SYMBOL(sun4i_backend_apply_color_correction);
+
+void sun4i_backend_disable_color_correction(struct sun4i_backend *backend)
+{
+       DRM_DEBUG_DRIVER("Disabling color correction\n");
+
+       /* Disable color correction */
+       regmap_update_bits(backend->regs, SUN4I_BACKEND_OCCTL_REG,
+                          SUN4I_BACKEND_OCCTL_ENABLE, 0);
+}
+EXPORT_SYMBOL(sun4i_backend_disable_color_correction);
+
+void sun4i_backend_commit(struct sun4i_backend *backend)
+{
+       DRM_DEBUG_DRIVER("Committing changes\n");
+
+       regmap_write(backend->regs, SUN4I_BACKEND_REGBUFFCTL_REG,
+                    SUN4I_BACKEND_REGBUFFCTL_AUTOLOAD_DIS |
+                    SUN4I_BACKEND_REGBUFFCTL_LOADCTL);
+}
+EXPORT_SYMBOL(sun4i_backend_commit);
+
+void sun4i_backend_layer_enable(struct sun4i_backend *backend,
+                               int layer, bool enable)
+{
+       u32 val;
+
+       DRM_DEBUG_DRIVER("Enabling layer %d\n", layer);
+
+       if (enable)
+               val = SUN4I_BACKEND_MODCTL_LAY_EN(layer);
+       else
+               val = 0;
+
+       regmap_update_bits(backend->regs, SUN4I_BACKEND_MODCTL_REG,
+                          SUN4I_BACKEND_MODCTL_LAY_EN(layer), val);
+}
+EXPORT_SYMBOL(sun4i_backend_layer_enable);
+
+static int sun4i_backend_drm_format_to_layer(u32 format, u32 *mode)
+{
+       switch (format) {
+       case DRM_FORMAT_ARGB8888:
+               *mode = SUN4I_BACKEND_LAY_FBFMT_ARGB8888;
+               break;
+
+       case DRM_FORMAT_XRGB8888:
+               *mode = SUN4I_BACKEND_LAY_FBFMT_XRGB8888;
+               break;
+
+       case DRM_FORMAT_RGB888:
+               *mode = SUN4I_BACKEND_LAY_FBFMT_RGB888;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+int sun4i_backend_update_layer_coord(struct sun4i_backend *backend,
+                                    int layer, struct drm_plane *plane)
+{
+       struct drm_plane_state *state = plane->state;
+       struct drm_framebuffer *fb = state->fb;
+
+       DRM_DEBUG_DRIVER("Updating layer %d\n", layer);
+
+       if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
+               DRM_DEBUG_DRIVER("Primary layer, updating global size W: %u H: %u\n",
+                                state->crtc_w, state->crtc_h);
+               regmap_write(backend->regs, SUN4I_BACKEND_DISSIZE_REG,
+                            SUN4I_BACKEND_DISSIZE(state->crtc_w,
+                                                  state->crtc_h));
+       }
+
+       /* Set the line width */
+       DRM_DEBUG_DRIVER("Layer line width: %d bits\n", fb->pitches[0] * 8);
+       regmap_write(backend->regs, SUN4I_BACKEND_LAYLINEWIDTH_REG(layer),
+                    fb->pitches[0] * 8);
+
+       /* Set height and width */
+       DRM_DEBUG_DRIVER("Layer size W: %u H: %u\n",
+                        state->crtc_w, state->crtc_h);
+       regmap_write(backend->regs, SUN4I_BACKEND_LAYSIZE_REG(layer),
+                    SUN4I_BACKEND_LAYSIZE(state->crtc_w,
+                                          state->crtc_h));
+
+       /* Set base coordinates */
+       DRM_DEBUG_DRIVER("Layer coordinates X: %d Y: %d\n",
+                        state->crtc_x, state->crtc_y);
+       regmap_write(backend->regs, SUN4I_BACKEND_LAYCOOR_REG(layer),
+                    SUN4I_BACKEND_LAYCOOR(state->crtc_x,
+                                          state->crtc_y));
+
+       return 0;
+}
+EXPORT_SYMBOL(sun4i_backend_update_layer_coord);
+
+int sun4i_backend_update_layer_formats(struct sun4i_backend *backend,
+                                      int layer, struct drm_plane *plane)
+{
+       struct drm_plane_state *state = plane->state;
+       struct drm_framebuffer *fb = state->fb;
+       bool interlaced = false;
+       u32 val;
+       int ret;
+
+       if (plane->state->crtc)
+               interlaced = plane->state->crtc->state->adjusted_mode.flags
+                       & DRM_MODE_FLAG_INTERLACE;
+
+       regmap_update_bits(backend->regs, SUN4I_BACKEND_MODCTL_REG,
+                          SUN4I_BACKEND_MODCTL_ITLMOD_EN,
+                          interlaced ? SUN4I_BACKEND_MODCTL_ITLMOD_EN : 0);
+
+       DRM_DEBUG_DRIVER("Switching display backend interlaced mode %s\n",
+                        interlaced ? "on" : "off");
+
+       ret = sun4i_backend_drm_format_to_layer(fb->pixel_format, &val);
+       if (ret) {
+               DRM_DEBUG_DRIVER("Invalid format\n");
+               return val;
+       }
+
+       regmap_update_bits(backend->regs, SUN4I_BACKEND_ATTCTL_REG1(layer),
+                          SUN4I_BACKEND_ATTCTL_REG1_LAY_FBFMT, val);
+
+       return 0;
+}
+EXPORT_SYMBOL(sun4i_backend_update_layer_formats);
+
+int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend,
+                                     int layer, struct drm_plane *plane)
+{
+       struct drm_plane_state *state = plane->state;
+       struct drm_framebuffer *fb = state->fb;
+       struct drm_gem_cma_object *gem;
+       u32 lo_paddr, hi_paddr;
+       dma_addr_t paddr;
+       int bpp;
+
+       /* Get the physical address of the buffer in memory */
+       gem = drm_fb_cma_get_gem_obj(fb, 0);
+
+       DRM_DEBUG_DRIVER("Using GEM @ 0x%x\n", gem->paddr);
+
+       /* Compute the start of the displayed memory */
+       bpp = drm_format_plane_cpp(fb->pixel_format, 0);
+       paddr = gem->paddr + fb->offsets[0];
+       paddr += (state->src_x >> 16) * bpp;
+       paddr += (state->src_y >> 16) * fb->pitches[0];
+
+       DRM_DEBUG_DRIVER("Setting buffer address to 0x%x\n", paddr);
+
+       /* Write the 32 lower bits of the address (in bits) */
+       lo_paddr = paddr << 3;
+       DRM_DEBUG_DRIVER("Setting address lower bits to 0x%x\n", lo_paddr);
+       regmap_write(backend->regs, SUN4I_BACKEND_LAYFB_L32ADD_REG(layer),
+                    lo_paddr);
+
+       /* And the upper bits */
+       hi_paddr = paddr >> 29;
+       DRM_DEBUG_DRIVER("Setting address high bits to 0x%x\n", hi_paddr);
+       regmap_update_bits(backend->regs, SUN4I_BACKEND_LAYFB_H4ADD_REG,
+                          SUN4I_BACKEND_LAYFB_H4ADD_MSK(layer),
+                          SUN4I_BACKEND_LAYFB_H4ADD(layer, hi_paddr));
+
+       return 0;
+}
+EXPORT_SYMBOL(sun4i_backend_update_layer_buffer);
+
+static struct regmap_config sun4i_backend_regmap_config = {
+       .reg_bits       = 32,
+       .val_bits       = 32,
+       .reg_stride     = 4,
+       .max_register   = 0x5800,
+};
+
+static int sun4i_backend_bind(struct device *dev, struct device *master,
+                             void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *drm = data;
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_backend *backend;
+       struct resource *res;
+       void __iomem *regs;
+       int i, ret;
+
+       backend = devm_kzalloc(dev, sizeof(*backend), GFP_KERNEL);
+       if (!backend)
+               return -ENOMEM;
+       dev_set_drvdata(dev, backend);
+       drv->backend = backend;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(regs)) {
+               dev_err(dev, "Couldn't map the backend registers\n");
+               return PTR_ERR(regs);
+       }
+
+       backend->regs = devm_regmap_init_mmio(dev, regs,
+                                             &sun4i_backend_regmap_config);
+       if (IS_ERR(backend->regs)) {
+               dev_err(dev, "Couldn't create the backend0 regmap\n");
+               return PTR_ERR(backend->regs);
+       }
+
+       backend->reset = devm_reset_control_get(dev, NULL);
+       if (IS_ERR(backend->reset)) {
+               dev_err(dev, "Couldn't get our reset line\n");
+               return PTR_ERR(backend->reset);
+       }
+
+       ret = reset_control_deassert(backend->reset);
+       if (ret) {
+               dev_err(dev, "Couldn't deassert our reset line\n");
+               return ret;
+       }
+
+       backend->bus_clk = devm_clk_get(dev, "ahb");
+       if (IS_ERR(backend->bus_clk)) {
+               dev_err(dev, "Couldn't get the backend bus clock\n");
+               ret = PTR_ERR(backend->bus_clk);
+               goto err_assert_reset;
+       }
+       clk_prepare_enable(backend->bus_clk);
+
+       backend->mod_clk = devm_clk_get(dev, "mod");
+       if (IS_ERR(backend->mod_clk)) {
+               dev_err(dev, "Couldn't get the backend module clock\n");
+               ret = PTR_ERR(backend->mod_clk);
+               goto err_disable_bus_clk;
+       }
+       clk_prepare_enable(backend->mod_clk);
+
+       backend->ram_clk = devm_clk_get(dev, "ram");
+       if (IS_ERR(backend->ram_clk)) {
+               dev_err(dev, "Couldn't get the backend RAM clock\n");
+               ret = PTR_ERR(backend->ram_clk);
+               goto err_disable_mod_clk;
+       }
+       clk_prepare_enable(backend->ram_clk);
+
+       /* Reset the registers */
+       for (i = 0x800; i < 0x1000; i += 4)
+               regmap_write(backend->regs, i, 0);
+
+       /* Disable registers autoloading */
+       regmap_write(backend->regs, SUN4I_BACKEND_REGBUFFCTL_REG,
+                    SUN4I_BACKEND_REGBUFFCTL_AUTOLOAD_DIS);
+
+       /* Enable the backend */
+       regmap_write(backend->regs, SUN4I_BACKEND_MODCTL_REG,
+                    SUN4I_BACKEND_MODCTL_DEBE_EN |
+                    SUN4I_BACKEND_MODCTL_START_CTL);
+
+       return 0;
+
+err_disable_mod_clk:
+       clk_disable_unprepare(backend->mod_clk);
+err_disable_bus_clk:
+       clk_disable_unprepare(backend->bus_clk);
+err_assert_reset:
+       reset_control_assert(backend->reset);
+       return ret;
+}
+
+static void sun4i_backend_unbind(struct device *dev, struct device *master,
+                                void *data)
+{
+       struct sun4i_backend *backend = dev_get_drvdata(dev);
+
+       clk_disable_unprepare(backend->ram_clk);
+       clk_disable_unprepare(backend->mod_clk);
+       clk_disable_unprepare(backend->bus_clk);
+       reset_control_assert(backend->reset);
+}
+
+static struct component_ops sun4i_backend_ops = {
+       .bind   = sun4i_backend_bind,
+       .unbind = sun4i_backend_unbind,
+};
+
+static int sun4i_backend_probe(struct platform_device *pdev)
+{
+       return component_add(&pdev->dev, &sun4i_backend_ops);
+}
+
+static int sun4i_backend_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sun4i_backend_ops);
+
+       return 0;
+}
+
+static const struct of_device_id sun4i_backend_of_table[] = {
+       { .compatible = "allwinner,sun5i-a13-display-backend" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, sun4i_backend_of_table);
+
+static struct platform_driver sun4i_backend_platform_driver = {
+       .probe          = sun4i_backend_probe,
+       .remove         = sun4i_backend_remove,
+       .driver         = {
+               .name           = "sun4i-backend",
+               .of_match_table = sun4i_backend_of_table,
+       },
+};
+module_platform_driver(sun4i_backend_platform_driver);
+
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner A10 Display Backend Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.h b/drivers/gpu/drm/sun4i/sun4i_backend.h
new file mode 100644 (file)
index 0000000..7070bb3
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_BACKEND_H_
+#define _SUN4I_BACKEND_H_
+
+#include <linux/clk.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+#define SUN4I_BACKEND_MODCTL_REG               0x800
+#define SUN4I_BACKEND_MODCTL_LINE_SEL                  BIT(29)
+#define SUN4I_BACKEND_MODCTL_ITLMOD_EN                 BIT(28)
+#define SUN4I_BACKEND_MODCTL_OUT_SEL                   GENMASK(22, 20)
+#define SUN4I_BACKEND_MODCTL_OUT_LCD                           (0 << 20)
+#define SUN4I_BACKEND_MODCTL_OUT_FE0                           (6 << 20)
+#define SUN4I_BACKEND_MODCTL_OUT_FE1                           (7 << 20)
+#define SUN4I_BACKEND_MODCTL_HWC_EN                    BIT(16)
+#define SUN4I_BACKEND_MODCTL_LAY_EN(l)                 BIT(8 + l)
+#define SUN4I_BACKEND_MODCTL_OCSC_EN                   BIT(5)
+#define SUN4I_BACKEND_MODCTL_DFLK_EN                   BIT(4)
+#define SUN4I_BACKEND_MODCTL_DLP_START_CTL             BIT(2)
+#define SUN4I_BACKEND_MODCTL_START_CTL                 BIT(1)
+#define SUN4I_BACKEND_MODCTL_DEBE_EN                   BIT(0)
+
+#define SUN4I_BACKEND_BACKCOLOR_REG            0x804
+#define SUN4I_BACKEND_BACKCOLOR(r, g, b)               (((r) << 16) | ((g) << 8) | (b))
+
+#define SUN4I_BACKEND_DISSIZE_REG              0x808
+#define SUN4I_BACKEND_DISSIZE(w, h)                    (((((h) - 1) & 0xffff) << 16) | \
+                                                        (((w) - 1) & 0xffff))
+
+#define SUN4I_BACKEND_LAYSIZE_REG(l)           (0x810 + (0x4 * (l)))
+#define SUN4I_BACKEND_LAYSIZE(w, h)                    (((((h) - 1) & 0x1fff) << 16) | \
+                                                        (((w) - 1) & 0x1fff))
+
+#define SUN4I_BACKEND_LAYCOOR_REG(l)           (0x820 + (0x4 * (l)))
+#define SUN4I_BACKEND_LAYCOOR(x, y)                    ((((u32)(y) & 0xffff) << 16) | \
+                                                        ((u32)(x) & 0xffff))
+
+#define SUN4I_BACKEND_LAYLINEWIDTH_REG(l)      (0x840 + (0x4 * (l)))
+
+#define SUN4I_BACKEND_LAYFB_L32ADD_REG(l)      (0x850 + (0x4 * (l)))
+
+#define SUN4I_BACKEND_LAYFB_H4ADD_REG          0x860
+#define SUN4I_BACKEND_LAYFB_H4ADD_MSK(l)               GENMASK(3 + ((l) * 8), 0)
+#define SUN4I_BACKEND_LAYFB_H4ADD(l, val)                      ((val) << ((l) * 8))
+
+#define SUN4I_BACKEND_REGBUFFCTL_REG           0x870
+#define SUN4I_BACKEND_REGBUFFCTL_AUTOLOAD_DIS          BIT(1)
+#define SUN4I_BACKEND_REGBUFFCTL_LOADCTL               BIT(0)
+
+#define SUN4I_BACKEND_CKMAX_REG                        0x880
+#define SUN4I_BACKEND_CKMIN_REG                        0x884
+#define SUN4I_BACKEND_CKCFG_REG                        0x888
+#define SUN4I_BACKEND_ATTCTL_REG0(l)           (0x890 + (0x4 * (l)))
+#define SUN4I_BACKEND_ATTCTL_REG0_LAY_PIPESEL_MASK     BIT(15)
+#define SUN4I_BACKEND_ATTCTL_REG0_LAY_PIPESEL(x)               ((x) << 15)
+#define SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL_MASK      GENMASK(11, 10)
+#define SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL(x)                        ((x) << 10)
+
+#define SUN4I_BACKEND_ATTCTL_REG1(l)           (0x8a0 + (0x4 * (l)))
+#define SUN4I_BACKEND_ATTCTL_REG1_LAY_HSCAFCT          GENMASK(15, 14)
+#define SUN4I_BACKEND_ATTCTL_REG1_LAY_WSCAFCT          GENMASK(13, 12)
+#define SUN4I_BACKEND_ATTCTL_REG1_LAY_FBFMT            GENMASK(11, 8)
+#define SUN4I_BACKEND_LAY_FBFMT_1BPP                           (0 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_2BPP                           (1 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_4BPP                           (2 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_8BPP                           (3 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGB655                         (4 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGB565                         (5 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGB556                         (6 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_ARGB1555                       (7 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGBA5551                       (8 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_XRGB8888                       (9 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_ARGB8888                       (10 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGB888                         (11 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_ARGB4444                       (12 << 8)
+#define SUN4I_BACKEND_LAY_FBFMT_RGBA4444                       (13 << 8)
+
+#define SUN4I_BACKEND_DLCDPCTL_REG             0x8b0
+#define SUN4I_BACKEND_DLCDPFRMBUF_ADDRCTL_REG  0x8b4
+#define SUN4I_BACKEND_DLCDPCOOR_REG0           0x8b8
+#define SUN4I_BACKEND_DLCDPCOOR_REG1           0x8bc
+
+#define SUN4I_BACKEND_INT_EN_REG               0x8c0
+#define SUN4I_BACKEND_INT_FLAG_REG             0x8c4
+#define SUN4I_BACKEND_REG_LOAD_FINISHED                        BIT(1)
+
+#define SUN4I_BACKEND_HWCCTL_REG               0x8d8
+#define SUN4I_BACKEND_HWCFBCTL_REG             0x8e0
+#define SUN4I_BACKEND_WBCTL_REG                        0x8f0
+#define SUN4I_BACKEND_WBADD_REG                        0x8f4
+#define SUN4I_BACKEND_WBLINEWIDTH_REG          0x8f8
+#define SUN4I_BACKEND_SPREN_REG                        0x900
+#define SUN4I_BACKEND_SPRFMTCTL_REG            0x908
+#define SUN4I_BACKEND_SPRALPHACTL_REG          0x90c
+#define SUN4I_BACKEND_IYUVCTL_REG              0x920
+#define SUN4I_BACKEND_IYUVADD_REG(c)           (0x930 + (0x4 * (c)))
+#define SUN4I_BACKEND_IYUVLINEWITDTH_REG(c)    (0x940 + (0x4 * (c)))
+#define SUN4I_BACKEND_YGCOEF_REG(c)            (0x950 + (0x4 * (c)))
+#define SUN4I_BACKEND_YGCONS_REG               0x95c
+#define SUN4I_BACKEND_URCOEF_REG(c)            (0x960 + (0x4 * (c)))
+#define SUN4I_BACKEND_URCONS_REG               0x96c
+#define SUN4I_BACKEND_VBCOEF_REG(c)            (0x970 + (0x4 * (c)))
+#define SUN4I_BACKEND_VBCONS_REG               0x97c
+#define SUN4I_BACKEND_KSCTL_REG                        0x980
+#define SUN4I_BACKEND_KSBKCOLOR_REG            0x984
+#define SUN4I_BACKEND_KSFSTLINEWIDTH_REG       0x988
+#define SUN4I_BACKEND_KSVSCAFCT_REG            0x98c
+#define SUN4I_BACKEND_KSHSCACOEF_REG(x)                (0x9a0 + (0x4 * (x)))
+#define SUN4I_BACKEND_OCCTL_REG                        0x9c0
+#define SUN4I_BACKEND_OCCTL_ENABLE                     BIT(0)
+
+#define SUN4I_BACKEND_OCRCOEF_REG(x)           (0x9d0 + (0x4 * (x)))
+#define SUN4I_BACKEND_OCRCONS_REG              0x9dc
+#define SUN4I_BACKEND_OCGCOEF_REG(x)           (0x9e0 + (0x4 * (x)))
+#define SUN4I_BACKEND_OCGCONS_REG              0x9ec
+#define SUN4I_BACKEND_OCBCOEF_REG(x)           (0x9f0 + (0x4 * (x)))
+#define SUN4I_BACKEND_OCBCONS_REG              0x9fc
+#define SUN4I_BACKEND_SPRCOORCTL_REG(s)                (0xa00 + (0x4 * (s)))
+#define SUN4I_BACKEND_SPRATTCTL_REG(s)         (0xb00 + (0x4 * (s)))
+#define SUN4I_BACKEND_SPRADD_REG(s)            (0xc00 + (0x4 * (s)))
+#define SUN4I_BACKEND_SPRLINEWIDTH_REG(s)      (0xd00 + (0x4 * (s)))
+
+#define SUN4I_BACKEND_SPRPALTAB_OFF            0x4000
+#define SUN4I_BACKEND_GAMMATAB_OFF             0x4400
+#define SUN4I_BACKEND_HWCPATTERN_OFF           0x4800
+#define SUN4I_BACKEND_HWCCOLORTAB_OFF          0x4c00
+#define SUN4I_BACKEND_PIPE_OFF(p)              (0x5000 + (0x400 * (p)))
+
+struct sun4i_backend {
+       struct regmap           *regs;
+
+       struct reset_control    *reset;
+
+       struct clk              *bus_clk;
+       struct clk              *mod_clk;
+       struct clk              *ram_clk;
+};
+
+void sun4i_backend_apply_color_correction(struct sun4i_backend *backend);
+void sun4i_backend_disable_color_correction(struct sun4i_backend *backend);
+
+void sun4i_backend_commit(struct sun4i_backend *backend);
+
+void sun4i_backend_layer_enable(struct sun4i_backend *backend,
+                               int layer, bool enable);
+int sun4i_backend_update_layer_coord(struct sun4i_backend *backend,
+                                    int layer, struct drm_plane *plane);
+int sun4i_backend_update_layer_formats(struct sun4i_backend *backend,
+                                      int layer, struct drm_plane *plane);
+int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend,
+                                     int layer, struct drm_plane *plane);
+
+#endif /* _SUN4I_BACKEND_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c
new file mode 100644 (file)
index 0000000..4182a21
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modes.h>
+
+#include <linux/clk-provider.h>
+#include <linux/ioport.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/regmap.h>
+
+#include <video/videomode.h>
+
+#include "sun4i_backend.h"
+#include "sun4i_crtc.h"
+#include "sun4i_drv.h"
+#include "sun4i_tcon.h"
+
+static void sun4i_crtc_atomic_begin(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
+{
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct drm_device *dev = crtc->dev;
+       unsigned long flags;
+
+       if (crtc->state->event) {
+               WARN_ON(drm_crtc_vblank_get(crtc) != 0);
+
+               spin_lock_irqsave(&dev->event_lock, flags);
+               scrtc->event = crtc->state->event;
+               spin_unlock_irqrestore(&dev->event_lock, flags);
+               crtc->state->event = NULL;
+        }
+}
+
+static void sun4i_crtc_atomic_flush(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
+{
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct sun4i_drv *drv = scrtc->drv;
+
+       DRM_DEBUG_DRIVER("Committing plane changes\n");
+
+       sun4i_backend_commit(drv->backend);
+}
+
+static void sun4i_crtc_disable(struct drm_crtc *crtc)
+{
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct sun4i_drv *drv = scrtc->drv;
+
+       DRM_DEBUG_DRIVER("Disabling the CRTC\n");
+
+       sun4i_tcon_disable(drv->tcon);
+}
+
+static void sun4i_crtc_enable(struct drm_crtc *crtc)
+{
+       struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
+       struct sun4i_drv *drv = scrtc->drv;
+
+       DRM_DEBUG_DRIVER("Enabling the CRTC\n");
+
+       sun4i_tcon_enable(drv->tcon);
+}
+
+static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
+       .atomic_begin   = sun4i_crtc_atomic_begin,
+       .atomic_flush   = sun4i_crtc_atomic_flush,
+       .disable        = sun4i_crtc_disable,
+       .enable         = sun4i_crtc_enable,
+};
+
+static const struct drm_crtc_funcs sun4i_crtc_funcs = {
+       .atomic_destroy_state   = drm_atomic_helper_crtc_destroy_state,
+       .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
+       .destroy                = drm_crtc_cleanup,
+       .page_flip              = drm_atomic_helper_page_flip,
+       .reset                  = drm_atomic_helper_crtc_reset,
+       .set_config             = drm_atomic_helper_set_config,
+};
+
+struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_crtc *scrtc;
+       int ret;
+
+       scrtc = devm_kzalloc(drm->dev, sizeof(*scrtc), GFP_KERNEL);
+       if (!scrtc)
+               return NULL;
+       scrtc->drv = drv;
+
+       ret = drm_crtc_init_with_planes(drm, &scrtc->crtc,
+                                       drv->primary,
+                                       NULL,
+                                       &sun4i_crtc_funcs,
+                                       NULL);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't init DRM CRTC\n");
+               return NULL;
+       }
+
+       drm_crtc_helper_add(&scrtc->crtc, &sun4i_crtc_helper_funcs);
+
+       return scrtc;
+}
diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.h b/drivers/gpu/drm/sun4i/sun4i_crtc.h
new file mode 100644 (file)
index 0000000..dec8ce4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_CRTC_H_
+#define _SUN4I_CRTC_H_
+
+struct sun4i_crtc {
+       struct drm_crtc                 crtc;
+       struct drm_pending_vblank_event *event;
+
+       struct sun4i_drv                *drv;
+};
+
+static inline struct sun4i_crtc *drm_crtc_to_sun4i_crtc(struct drm_crtc *crtc)
+{
+       return container_of(crtc, struct sun4i_crtc, crtc);
+}
+
+struct sun4i_crtc *sun4i_crtc_init(struct drm_device *drm);
+
+#endif /* _SUN4I_CRTC_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_dotclock.c b/drivers/gpu/drm/sun4i/sun4i_dotclock.c
new file mode 100644 (file)
index 0000000..3ff668c
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2016 Free Electrons
+ * Copyright (C) 2016 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/regmap.h>
+
+#include "sun4i_tcon.h"
+
+struct sun4i_dclk {
+       struct clk_hw   hw;
+       struct regmap   *regmap;
+};
+
+static inline struct sun4i_dclk *hw_to_dclk(struct clk_hw *hw)
+{
+       return container_of(hw, struct sun4i_dclk, hw);
+}
+
+static void sun4i_dclk_disable(struct clk_hw *hw)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+
+       regmap_update_bits(dclk->regmap, SUN4I_TCON0_DCLK_REG,
+                          BIT(SUN4I_TCON0_DCLK_GATE_BIT), 0);
+}
+
+static int sun4i_dclk_enable(struct clk_hw *hw)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+
+       return regmap_update_bits(dclk->regmap, SUN4I_TCON0_DCLK_REG,
+                                 BIT(SUN4I_TCON0_DCLK_GATE_BIT),
+                                 BIT(SUN4I_TCON0_DCLK_GATE_BIT));
+}
+
+static int sun4i_dclk_is_enabled(struct clk_hw *hw)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+       u32 val;
+
+       regmap_read(dclk->regmap, SUN4I_TCON0_DCLK_REG, &val);
+
+       return val & BIT(SUN4I_TCON0_DCLK_GATE_BIT);
+}
+
+static unsigned long sun4i_dclk_recalc_rate(struct clk_hw *hw,
+                                           unsigned long parent_rate)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+       u32 val;
+
+       regmap_read(dclk->regmap, SUN4I_TCON0_DCLK_REG, &val);
+
+       val >>= SUN4I_TCON0_DCLK_DIV_SHIFT;
+       val &= SUN4I_TCON0_DCLK_DIV_WIDTH;
+
+       if (!val)
+               val = 1;
+
+       return parent_rate / val;
+}
+
+static long sun4i_dclk_round_rate(struct clk_hw *hw, unsigned long rate,
+                                 unsigned long *parent_rate)
+{
+       return *parent_rate / DIV_ROUND_CLOSEST(*parent_rate, rate);
+}
+
+static int sun4i_dclk_set_rate(struct clk_hw *hw, unsigned long rate,
+                              unsigned long parent_rate)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+       int div = DIV_ROUND_CLOSEST(parent_rate, rate);
+
+       return regmap_update_bits(dclk->regmap, SUN4I_TCON0_DCLK_REG,
+                                 GENMASK(6, 0), div);
+}
+
+static int sun4i_dclk_get_phase(struct clk_hw *hw)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+       u32 val;
+
+       regmap_read(dclk->regmap, SUN4I_TCON0_IO_POL_REG, &val);
+
+       val >>= 28;
+       val &= 3;
+
+       return val * 120;
+}
+
+static int sun4i_dclk_set_phase(struct clk_hw *hw, int degrees)
+{
+       struct sun4i_dclk *dclk = hw_to_dclk(hw);
+
+       regmap_update_bits(dclk->regmap, SUN4I_TCON0_IO_POL_REG,
+                          GENMASK(29, 28),
+                          degrees / 120);
+
+       return 0;
+}
+
+static const struct clk_ops sun4i_dclk_ops = {
+       .disable        = sun4i_dclk_disable,
+       .enable         = sun4i_dclk_enable,
+       .is_enabled     = sun4i_dclk_is_enabled,
+
+       .recalc_rate    = sun4i_dclk_recalc_rate,
+       .round_rate     = sun4i_dclk_round_rate,
+       .set_rate       = sun4i_dclk_set_rate,
+
+       .get_phase      = sun4i_dclk_get_phase,
+       .set_phase      = sun4i_dclk_set_phase,
+};
+
+int sun4i_dclk_create(struct device *dev, struct sun4i_tcon *tcon)
+{
+       const char *clk_name, *parent_name;
+       struct clk_init_data init;
+       struct sun4i_dclk *dclk;
+
+       parent_name = __clk_get_name(tcon->sclk0);
+       of_property_read_string_index(dev->of_node, "clock-output-names", 0,
+                                     &clk_name);
+
+       dclk = devm_kzalloc(dev, sizeof(*dclk), GFP_KERNEL);
+       if (!dclk)
+               return -ENOMEM;
+
+       init.name = clk_name;
+       init.ops = &sun4i_dclk_ops;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       dclk->regmap = tcon->regs;
+       dclk->hw.init = &init;
+
+       tcon->dclk = clk_register(dev, &dclk->hw);
+       if (IS_ERR(tcon->dclk))
+               return PTR_ERR(tcon->dclk);
+
+       return 0;
+}
+EXPORT_SYMBOL(sun4i_dclk_create);
+
+int sun4i_dclk_free(struct sun4i_tcon *tcon)
+{
+       clk_unregister(tcon->dclk);
+       return 0;
+}
+EXPORT_SYMBOL(sun4i_dclk_free);
diff --git a/drivers/gpu/drm/sun4i/sun4i_dotclock.h b/drivers/gpu/drm/sun4i/sun4i_dotclock.h
new file mode 100644 (file)
index 0000000..d5e25fa
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_DOTCLOCK_H_
+#define _SUN4I_DOTCLOCK_H_
+
+struct sun4i_tcon;
+
+int sun4i_dclk_create(struct device *dev, struct sun4i_tcon *tcon);
+int sun4i_dclk_free(struct sun4i_tcon *tcon);
+
+#endif /* _SUN4I_DOTCLOCK_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
new file mode 100644 (file)
index 0000000..76e922b
--- /dev/null
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <linux/component.h>
+#include <linux/of_graph.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_cma_helper.h>
+
+#include "sun4i_crtc.h"
+#include "sun4i_drv.h"
+#include "sun4i_framebuffer.h"
+#include "sun4i_layer.h"
+#include "sun4i_tcon.h"
+
+static int sun4i_drv_connector_plug_all(struct drm_device *drm)
+{
+       struct drm_connector *connector, *failed;
+       int ret;
+
+       mutex_lock(&drm->mode_config.mutex);
+       list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
+               ret = drm_connector_register(connector);
+               if (ret) {
+                       failed = connector;
+                       goto err;
+               }
+       }
+       mutex_unlock(&drm->mode_config.mutex);
+       return 0;
+
+err:
+       list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
+               if (failed == connector)
+                       break;
+
+               drm_connector_unregister(connector);
+       }
+       mutex_unlock(&drm->mode_config.mutex);
+
+       return ret;
+}
+
+static int sun4i_drv_enable_vblank(struct drm_device *drm, unsigned int pipe)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Enabling VBLANK on pipe %d\n", pipe);
+
+       sun4i_tcon_enable_vblank(tcon, true);
+
+       return 0;
+}
+
+static void sun4i_drv_disable_vblank(struct drm_device *drm, unsigned int pipe)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Disabling VBLANK on pipe %d\n", pipe);
+
+       sun4i_tcon_enable_vblank(tcon, false);
+}
+
+static const struct file_operations sun4i_drv_fops = {
+       .owner          = THIS_MODULE,
+       .open           = drm_open,
+       .release        = drm_release,
+       .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = drm_compat_ioctl,
+#endif
+       .poll           = drm_poll,
+       .read           = drm_read,
+       .llseek         = no_llseek,
+       .mmap           = drm_gem_cma_mmap,
+};
+
+static struct drm_driver sun4i_drv_driver = {
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_ATOMIC,
+
+       /* Generic Operations */
+       .fops                   = &sun4i_drv_fops,
+       .name                   = "sun4i-drm",
+       .desc                   = "Allwinner sun4i Display Engine",
+       .date                   = "20150629",
+       .major                  = 1,
+       .minor                  = 0,
+
+       /* GEM Operations */
+       .dumb_create            = drm_gem_cma_dumb_create,
+       .dumb_destroy           = drm_gem_dumb_destroy,
+       .dumb_map_offset        = drm_gem_cma_dumb_map_offset,
+       .gem_free_object        = drm_gem_cma_free_object,
+       .gem_vm_ops             = &drm_gem_cma_vm_ops,
+
+       /* PRIME Operations */
+       .prime_handle_to_fd     = drm_gem_prime_handle_to_fd,
+       .prime_fd_to_handle     = drm_gem_prime_fd_to_handle,
+       .gem_prime_import       = drm_gem_prime_import,
+       .gem_prime_export       = drm_gem_prime_export,
+       .gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table,
+       .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,
+       .gem_prime_vmap         = drm_gem_cma_prime_vmap,
+       .gem_prime_vunmap       = drm_gem_cma_prime_vunmap,
+       .gem_prime_mmap         = drm_gem_cma_prime_mmap,
+
+       /* Frame Buffer Operations */
+
+       /* VBlank Operations */
+       .get_vblank_counter     = drm_vblank_count,
+       .enable_vblank          = sun4i_drv_enable_vblank,
+       .disable_vblank         = sun4i_drv_disable_vblank,
+};
+
+static int sun4i_drv_bind(struct device *dev)
+{
+       struct drm_device *drm;
+       struct sun4i_drv *drv;
+       int ret;
+
+       drm = drm_dev_alloc(&sun4i_drv_driver, dev);
+       if (!drm)
+               return -ENOMEM;
+
+       ret = drm_dev_set_unique(drm, dev_name(drm->dev));
+       if (ret)
+               goto free_drm;
+
+       drv = devm_kzalloc(dev, sizeof(*drv), GFP_KERNEL);
+       if (!drv) {
+               ret = -ENOMEM;
+               goto free_drm;
+       }
+       drm->dev_private = drv;
+
+       drm_vblank_init(drm, 1);
+       drm_mode_config_init(drm);
+
+       ret = component_bind_all(drm->dev, drm);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't bind all pipelines components\n");
+               goto free_drm;
+       }
+
+       /* Create our layers */
+       drv->layers = sun4i_layers_init(drm);
+       if (!drv->layers) {
+               dev_err(drm->dev, "Couldn't create the planes\n");
+               ret = -EINVAL;
+               goto free_drm;
+       }
+
+       /* Create our CRTC */
+       drv->crtc = sun4i_crtc_init(drm);
+       if (!drv->crtc) {
+               dev_err(drm->dev, "Couldn't create the CRTC\n");
+               ret = -EINVAL;
+               goto free_drm;
+       }
+       drm->irq_enabled = true;
+
+       /* Create our framebuffer */
+       drv->fbdev = sun4i_framebuffer_init(drm);
+       if (IS_ERR(drv->fbdev)) {
+               dev_err(drm->dev, "Couldn't create our framebuffer\n");
+               ret = PTR_ERR(drv->fbdev);
+               goto free_drm;
+       }
+
+       /* Enable connectors polling */
+       drm_kms_helper_poll_init(drm);
+
+       ret = drm_dev_register(drm, 0);
+       if (ret)
+               goto free_drm;
+
+       ret = sun4i_drv_connector_plug_all(drm);
+       if (ret)
+               goto unregister_drm;
+
+       return 0;
+
+unregister_drm:
+       drm_dev_unregister(drm);
+free_drm:
+       drm_dev_unref(drm);
+       return ret;
+}
+
+static void sun4i_drv_unbind(struct device *dev)
+{
+       struct drm_device *drm = dev_get_drvdata(dev);
+
+       drm_dev_unregister(drm);
+       drm_kms_helper_poll_fini(drm);
+       sun4i_framebuffer_free(drm);
+       drm_vblank_cleanup(drm);
+       drm_dev_unref(drm);
+}
+
+static const struct component_master_ops sun4i_drv_master_ops = {
+       .bind   = sun4i_drv_bind,
+       .unbind = sun4i_drv_unbind,
+};
+
+static bool sun4i_drv_node_is_frontend(struct device_node *node)
+{
+       return of_device_is_compatible(node,
+                                      "allwinner,sun5i-a13-display-frontend");
+}
+
+static bool sun4i_drv_node_is_tcon(struct device_node *node)
+{
+       return of_device_is_compatible(node, "allwinner,sun5i-a13-tcon");
+}
+
+static int compare_of(struct device *dev, void *data)
+{
+       DRM_DEBUG_DRIVER("Comparing of node %s with %s\n",
+                        of_node_full_name(dev->of_node),
+                        of_node_full_name(data));
+
+       return dev->of_node == data;
+}
+
+static int sun4i_drv_add_endpoints(struct device *dev,
+                                  struct component_match **match,
+                                  struct device_node *node)
+{
+       struct device_node *port, *ep, *remote;
+       int count = 0;
+
+       /*
+        * We don't support the frontend for now, so we will never
+        * have a device bound. Just skip over it, but we still want
+        * the rest our pipeline to be added.
+        */
+       if (!sun4i_drv_node_is_frontend(node) &&
+           !of_device_is_available(node))
+               return 0;
+
+       if (!sun4i_drv_node_is_frontend(node)) {
+               /* Add current component */
+               DRM_DEBUG_DRIVER("Adding component %s\n",
+                                of_node_full_name(node));
+               component_match_add(dev, match, compare_of, node);
+               count++;
+       }
+
+       /* Inputs are listed first, then outputs */
+       port = of_graph_get_port_by_id(node, 1);
+       if (!port) {
+               DRM_DEBUG_DRIVER("No output to bind\n");
+               return count;
+       }
+
+       for_each_available_child_of_node(port, ep) {
+               remote = of_graph_get_remote_port_parent(ep);
+               if (!remote) {
+                       DRM_DEBUG_DRIVER("Error retrieving the output node\n");
+                       of_node_put(remote);
+                       continue;
+               }
+
+               /*
+                * If the node is our TCON, the first port is used for our
+                * panel, and will not be part of the
+                * component framework.
+                */
+               if (sun4i_drv_node_is_tcon(node)) {
+                       struct of_endpoint endpoint;
+
+                       if (of_graph_parse_endpoint(ep, &endpoint)) {
+                               DRM_DEBUG_DRIVER("Couldn't parse endpoint\n");
+                               continue;
+                       }
+
+                       if (!endpoint.id) {
+                               DRM_DEBUG_DRIVER("Endpoint is our panel... skipping\n");
+                               continue;
+                       }
+               }
+
+               /* Walk down our tree */
+               count += sun4i_drv_add_endpoints(dev, match, remote);
+
+               of_node_put(remote);
+       }
+
+       return count;
+}
+
+static int sun4i_drv_probe(struct platform_device *pdev)
+{
+       struct component_match *match = NULL;
+       struct device_node *np = pdev->dev.of_node;
+       int i, count = 0;
+
+       for (i = 0;; i++) {
+               struct device_node *pipeline = of_parse_phandle(np,
+                                                               "allwinner,pipelines",
+                                                               i);
+               if (!pipeline)
+                       break;
+
+               count += sun4i_drv_add_endpoints(&pdev->dev, &match,
+                                               pipeline);
+
+               DRM_DEBUG_DRIVER("Queued %d outputs on pipeline %d\n",
+                                count, i);
+       }
+
+       if (count)
+               return component_master_add_with_match(&pdev->dev,
+                                                      &sun4i_drv_master_ops,
+                                                      match);
+       else
+               return 0;
+}
+
+static int sun4i_drv_remove(struct platform_device *pdev)
+{
+       return 0;
+}
+
+static const struct of_device_id sun4i_drv_of_table[] = {
+       { .compatible = "allwinner,sun5i-a13-display-engine" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, sun4i_drv_of_table);
+
+static struct platform_driver sun4i_drv_platform_driver = {
+       .probe          = sun4i_drv_probe,
+       .remove         = sun4i_drv_remove,
+       .driver         = {
+               .name           = "sun4i-drm",
+               .of_match_table = sun4i_drv_of_table,
+       },
+};
+module_platform_driver(sun4i_drv_platform_driver);
+
+MODULE_AUTHOR("Boris Brezillon <boris.brezillon@free-electrons.com>");
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner A10 Display Engine DRM/KMS Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.h b/drivers/gpu/drm/sun4i/sun4i_drv.h
new file mode 100644 (file)
index 0000000..597353e
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_DRV_H_
+#define _SUN4I_DRV_H_
+
+#include <linux/clk.h>
+#include <linux/regmap.h>
+
+struct sun4i_drv {
+       struct sun4i_backend    *backend;
+       struct sun4i_crtc       *crtc;
+       struct sun4i_tcon       *tcon;
+
+       struct drm_plane        *primary;
+       struct drm_fbdev_cma    *fbdev;
+
+       struct sun4i_layer      **layers;
+};
+
+#endif /* _SUN4I_DRV_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_framebuffer.c b/drivers/gpu/drm/sun4i/sun4i_framebuffer.c
new file mode 100644 (file)
index 0000000..a0b30c2
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_fb_cma_helper.h>
+#include <drm/drmP.h>
+
+#include "sun4i_drv.h"
+
+static void sun4i_de_output_poll_changed(struct drm_device *drm)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+
+       if (drv->fbdev)
+               drm_fbdev_cma_hotplug_event(drv->fbdev);
+}
+
+static const struct drm_mode_config_funcs sun4i_de_mode_config_funcs = {
+       .output_poll_changed    = sun4i_de_output_poll_changed,
+       .atomic_check           = drm_atomic_helper_check,
+       .atomic_commit          = drm_atomic_helper_commit,
+       .fb_create              = drm_fb_cma_create,
+};
+
+struct drm_fbdev_cma *sun4i_framebuffer_init(struct drm_device *drm)
+{
+       drm_mode_config_reset(drm);
+
+       drm->mode_config.max_width = 8192;
+       drm->mode_config.max_height = 8192;
+
+       drm->mode_config.funcs = &sun4i_de_mode_config_funcs;
+
+       return drm_fbdev_cma_init(drm, 32,
+                                 drm->mode_config.num_crtc,
+                                 drm->mode_config.num_connector);
+}
+
+void sun4i_framebuffer_free(struct drm_device *drm)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+
+       drm_fbdev_cma_fini(drv->fbdev);
+       drm_mode_config_cleanup(drm);
+}
diff --git a/drivers/gpu/drm/sun4i/sun4i_framebuffer.h b/drivers/gpu/drm/sun4i/sun4i_framebuffer.h
new file mode 100644 (file)
index 0000000..3afd652
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_FRAMEBUFFER_H_
+#define _SUN4I_FRAMEBUFFER_H_
+
+struct drm_fbdev_cma *sun4i_framebuffer_init(struct drm_device *drm);
+void sun4i_framebuffer_free(struct drm_device *drm);
+
+#endif /* _SUN4I_FRAMEBUFFER_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.c b/drivers/gpu/drm/sun4i/sun4i_layer.c
new file mode 100644 (file)
index 0000000..068ab80
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_plane_helper.h>
+#include <drm/drmP.h>
+
+#include "sun4i_backend.h"
+#include "sun4i_drv.h"
+#include "sun4i_layer.h"
+
+#define SUN4I_NUM_LAYERS       2
+
+static int sun4i_backend_layer_atomic_check(struct drm_plane *plane,
+                                           struct drm_plane_state *state)
+{
+       return 0;
+}
+
+static void sun4i_backend_layer_atomic_disable(struct drm_plane *plane,
+                                              struct drm_plane_state *old_state)
+{
+       struct sun4i_layer *layer = plane_to_sun4i_layer(plane);
+       struct sun4i_drv *drv = layer->drv;
+       struct sun4i_backend *backend = drv->backend;
+
+       sun4i_backend_layer_enable(backend, layer->id, false);
+}
+
+static void sun4i_backend_layer_atomic_update(struct drm_plane *plane,
+                                             struct drm_plane_state *old_state)
+{
+       struct sun4i_layer *layer = plane_to_sun4i_layer(plane);
+       struct sun4i_drv *drv = layer->drv;
+       struct sun4i_backend *backend = drv->backend;
+
+       sun4i_backend_update_layer_coord(backend, layer->id, plane);
+       sun4i_backend_update_layer_formats(backend, layer->id, plane);
+       sun4i_backend_update_layer_buffer(backend, layer->id, plane);
+       sun4i_backend_layer_enable(backend, layer->id, true);
+}
+
+static struct drm_plane_helper_funcs sun4i_backend_layer_helper_funcs = {
+       .atomic_check   = sun4i_backend_layer_atomic_check,
+       .atomic_disable = sun4i_backend_layer_atomic_disable,
+       .atomic_update  = sun4i_backend_layer_atomic_update,
+};
+
+static const struct drm_plane_funcs sun4i_backend_layer_funcs = {
+       .atomic_destroy_state   = drm_atomic_helper_plane_destroy_state,
+       .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state,
+       .destroy                = drm_plane_cleanup,
+       .disable_plane          = drm_atomic_helper_disable_plane,
+       .reset                  = drm_atomic_helper_plane_reset,
+       .update_plane           = drm_atomic_helper_update_plane,
+};
+
+static const uint32_t sun4i_backend_layer_formats[] = {
+       DRM_FORMAT_ARGB8888,
+       DRM_FORMAT_XRGB8888,
+       DRM_FORMAT_RGB888,
+};
+
+static struct sun4i_layer *sun4i_layer_init_one(struct drm_device *drm,
+                                               enum drm_plane_type type)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_layer *layer;
+       int ret;
+
+       layer = devm_kzalloc(drm->dev, sizeof(*layer), GFP_KERNEL);
+       if (!layer)
+               return ERR_PTR(-ENOMEM);
+
+       ret = drm_universal_plane_init(drm, &layer->plane, BIT(0),
+                                      &sun4i_backend_layer_funcs,
+                                      sun4i_backend_layer_formats,
+                                      ARRAY_SIZE(sun4i_backend_layer_formats),
+                                      type,
+                                      NULL);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't initialize layer\n");
+               return ERR_PTR(ret);
+       }
+
+       drm_plane_helper_add(&layer->plane,
+                            &sun4i_backend_layer_helper_funcs);
+       layer->drv = drv;
+
+       if (type == DRM_PLANE_TYPE_PRIMARY)
+               drv->primary = &layer->plane;
+
+       return layer;
+}
+
+struct sun4i_layer **sun4i_layers_init(struct drm_device *drm)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_layer **layers;
+       int i;
+
+       layers = devm_kcalloc(drm->dev, SUN4I_NUM_LAYERS, sizeof(**layers),
+                             GFP_KERNEL);
+       if (!layers)
+               return ERR_PTR(-ENOMEM);
+
+       /*
+        * The hardware is a bit unusual here.
+        *
+        * Even though it supports 4 layers, it does the composition
+        * in two separate steps.
+        *
+        * The first one is assigning a layer to one of its two
+        * pipes. If more that 1 layer is assigned to the same pipe,
+        * and if pixels overlaps, the pipe will take the pixel from
+        * the layer with the highest priority.
+        *
+        * The second step is the actual alpha blending, that takes
+        * the two pipes as input, and uses the eventual alpha
+        * component to do the transparency between the two.
+        *
+        * This two steps scenario makes us unable to guarantee a
+        * robust alpha blending between the 4 layers in all
+        * situations. So we just expose two layers, one per pipe. On
+        * SoCs that support it, sprites could fill the need for more
+        * layers.
+        */
+       for (i = 0; i < SUN4I_NUM_LAYERS; i++) {
+               enum drm_plane_type type = (i == 0)
+                                        ? DRM_PLANE_TYPE_PRIMARY
+                                        : DRM_PLANE_TYPE_OVERLAY;
+               struct sun4i_layer *layer = layers[i];
+
+               layer = sun4i_layer_init_one(drm, type);
+               if (IS_ERR(layer)) {
+                       dev_err(drm->dev, "Couldn't initialize %s plane\n",
+                               i ? "overlay" : "primary");
+                       return ERR_CAST(layer);
+               };
+
+               DRM_DEBUG_DRIVER("Assigning %s plane to pipe %d\n",
+                                i ? "overlay" : "primary", i);
+               regmap_update_bits(drv->backend->regs, SUN4I_BACKEND_ATTCTL_REG0(i),
+                                  SUN4I_BACKEND_ATTCTL_REG0_LAY_PIPESEL_MASK,
+                                  SUN4I_BACKEND_ATTCTL_REG0_LAY_PIPESEL(i));
+
+               layer->id = i;
+       };
+
+       return layers;
+}
diff --git a/drivers/gpu/drm/sun4i/sun4i_layer.h b/drivers/gpu/drm/sun4i/sun4i_layer.h
new file mode 100644 (file)
index 0000000..a2f65d7
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_LAYER_H_
+#define _SUN4I_LAYER_H_
+
+struct sun4i_layer {
+       struct drm_plane        plane;
+       struct sun4i_drv        *drv;
+       int                     id;
+};
+
+static inline struct sun4i_layer *
+plane_to_sun4i_layer(struct drm_plane *plane)
+{
+       return container_of(plane, struct sun4i_layer, plane);
+}
+
+struct sun4i_layer **sun4i_layers_init(struct drm_device *drm);
+
+#endif /* _SUN4I_LAYER_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
new file mode 100644 (file)
index 0000000..ab64948
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <linux/clk.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_panel.h>
+
+#include "sun4i_drv.h"
+#include "sun4i_tcon.h"
+
+struct sun4i_rgb {
+       struct drm_connector    connector;
+       struct drm_encoder      encoder;
+
+       struct sun4i_drv        *drv;
+};
+
+static inline struct sun4i_rgb *
+drm_connector_to_sun4i_rgb(struct drm_connector *connector)
+{
+       return container_of(connector, struct sun4i_rgb,
+                           connector);
+}
+
+static inline struct sun4i_rgb *
+drm_encoder_to_sun4i_rgb(struct drm_encoder *encoder)
+{
+       return container_of(encoder, struct sun4i_rgb,
+                           encoder);
+}
+
+static int sun4i_rgb_get_modes(struct drm_connector *connector)
+{
+       struct sun4i_rgb *rgb =
+               drm_connector_to_sun4i_rgb(connector);
+       struct sun4i_drv *drv = rgb->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       return drm_panel_get_modes(tcon->panel);
+}
+
+static int sun4i_rgb_mode_valid(struct drm_connector *connector,
+                               struct drm_display_mode *mode)
+{
+       u32 hsync = mode->hsync_end - mode->hsync_start;
+       u32 vsync = mode->vsync_end - mode->vsync_start;
+
+       DRM_DEBUG_DRIVER("Validating modes...\n");
+
+       if (hsync < 1)
+               return MODE_HSYNC_NARROW;
+
+       if (hsync > 0x3ff)
+               return MODE_HSYNC_WIDE;
+
+       if ((mode->hdisplay < 1) || (mode->htotal < 1))
+               return MODE_H_ILLEGAL;
+
+       if ((mode->hdisplay > 0x7ff) || (mode->htotal > 0xfff))
+               return MODE_BAD_HVALUE;
+
+       DRM_DEBUG_DRIVER("Horizontal parameters OK\n");
+
+       if (vsync < 1)
+               return MODE_VSYNC_NARROW;
+
+       if (vsync > 0x3ff)
+               return MODE_VSYNC_WIDE;
+
+       if ((mode->vdisplay < 1) || (mode->vtotal < 1))
+               return MODE_V_ILLEGAL;
+
+       if ((mode->vdisplay > 0x7ff) || (mode->vtotal > 0xfff))
+               return MODE_BAD_VVALUE;
+
+       DRM_DEBUG_DRIVER("Vertical parameters OK\n");
+
+       return MODE_OK;
+}
+
+static struct drm_encoder *
+sun4i_rgb_best_encoder(struct drm_connector *connector)
+{
+       struct sun4i_rgb *rgb =
+               drm_connector_to_sun4i_rgb(connector);
+
+       return &rgb->encoder;
+}
+
+static struct drm_connector_helper_funcs sun4i_rgb_con_helper_funcs = {
+       .get_modes      = sun4i_rgb_get_modes,
+       .mode_valid     = sun4i_rgb_mode_valid,
+       .best_encoder   = sun4i_rgb_best_encoder,
+};
+
+static enum drm_connector_status
+sun4i_rgb_connector_detect(struct drm_connector *connector, bool force)
+{
+       return connector_status_connected;
+}
+
+static void
+sun4i_rgb_connector_destroy(struct drm_connector *connector)
+{
+       struct sun4i_rgb *rgb = drm_connector_to_sun4i_rgb(connector);
+       struct sun4i_drv *drv = rgb->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       drm_panel_detach(tcon->panel);
+       drm_connector_cleanup(connector);
+}
+
+static struct drm_connector_funcs sun4i_rgb_con_funcs = {
+       .dpms                   = drm_atomic_helper_connector_dpms,
+       .detect                 = sun4i_rgb_connector_detect,
+       .fill_modes             = drm_helper_probe_single_connector_modes,
+       .destroy                = sun4i_rgb_connector_destroy,
+       .reset                  = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state   = drm_atomic_helper_connector_destroy_state,
+};
+
+static int sun4i_rgb_atomic_check(struct drm_encoder *encoder,
+                                 struct drm_crtc_state *crtc_state,
+                                 struct drm_connector_state *conn_state)
+{
+       return 0;
+}
+
+static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
+{
+       struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
+       struct sun4i_drv *drv = rgb->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Enabling RGB output\n");
+
+       drm_panel_enable(tcon->panel);
+       sun4i_tcon_channel_enable(tcon, 0);
+}
+
+static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
+{
+       struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
+       struct sun4i_drv *drv = rgb->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Disabling RGB output\n");
+
+       sun4i_tcon_channel_disable(tcon, 0);
+       drm_panel_disable(tcon->panel);
+}
+
+static void sun4i_rgb_encoder_mode_set(struct drm_encoder *encoder,
+                                      struct drm_display_mode *mode,
+                                      struct drm_display_mode *adjusted_mode)
+{
+       struct sun4i_rgb *rgb = drm_encoder_to_sun4i_rgb(encoder);
+       struct sun4i_drv *drv = rgb->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       sun4i_tcon0_mode_set(tcon, mode);
+
+       clk_set_rate(tcon->dclk, mode->crtc_clock * 1000);
+
+       /* FIXME: This seems to be board specific */
+       clk_set_phase(tcon->dclk, 120);
+}
+
+static struct drm_encoder_helper_funcs sun4i_rgb_enc_helper_funcs = {
+       .atomic_check   = sun4i_rgb_atomic_check,
+       .mode_set       = sun4i_rgb_encoder_mode_set,
+       .disable        = sun4i_rgb_encoder_disable,
+       .enable         = sun4i_rgb_encoder_enable,
+};
+
+static void sun4i_rgb_enc_destroy(struct drm_encoder *encoder)
+{
+       drm_encoder_cleanup(encoder);
+}
+
+static struct drm_encoder_funcs sun4i_rgb_enc_funcs = {
+       .destroy        = sun4i_rgb_enc_destroy,
+};
+
+int sun4i_rgb_init(struct drm_device *drm)
+{
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_tcon *tcon = drv->tcon;
+       struct sun4i_rgb *rgb;
+       int ret;
+
+       /* If we don't have a panel, there's no point in going on */
+       if (!tcon->panel)
+               return -ENODEV;
+
+       rgb = devm_kzalloc(drm->dev, sizeof(*rgb), GFP_KERNEL);
+       if (!rgb)
+               return -ENOMEM;
+       rgb->drv = drv;
+
+       drm_encoder_helper_add(&rgb->encoder,
+                              &sun4i_rgb_enc_helper_funcs);
+       ret = drm_encoder_init(drm,
+                              &rgb->encoder,
+                              &sun4i_rgb_enc_funcs,
+                              DRM_MODE_ENCODER_NONE,
+                              NULL);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't initialise the rgb encoder\n");
+               goto err_out;
+       }
+
+       /* The RGB encoder can only work with the TCON channel 0 */
+       rgb->encoder.possible_crtcs = BIT(0);
+
+       drm_connector_helper_add(&rgb->connector,
+                                &sun4i_rgb_con_helper_funcs);
+       ret = drm_connector_init(drm, &rgb->connector,
+                                &sun4i_rgb_con_funcs,
+                                DRM_MODE_CONNECTOR_Unknown);
+       if (ret) {
+               dev_err(drm->dev, "Couldn't initialise the rgb connector\n");
+               goto err_cleanup_connector;
+       }
+
+       drm_mode_connector_attach_encoder(&rgb->connector, &rgb->encoder);
+
+       drm_panel_attach(tcon->panel, &rgb->connector);
+
+       return 0;
+
+err_cleanup_connector:
+       drm_encoder_cleanup(&rgb->encoder);
+err_out:
+       return ret;
+}
+EXPORT_SYMBOL(sun4i_rgb_init);
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.h b/drivers/gpu/drm/sun4i/sun4i_rgb.h
new file mode 100644 (file)
index 0000000..7c4da4c
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef _SUN4I_RGB_H_
+#define _SUN4I_RGB_H_
+
+int sun4i_rgb_init(struct drm_device *drm);
+
+#endif /* _SUN4I_RGB_H_ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.c b/drivers/gpu/drm/sun4i/sun4i_tcon.c
new file mode 100644 (file)
index 0000000..9f19b0e
--- /dev/null
@@ -0,0 +1,561 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modes.h>
+#include <drm/drm_panel.h>
+
+#include <linux/component.h>
+#include <linux/ioport.h>
+#include <linux/of_address.h>
+#include <linux/of_graph.h>
+#include <linux/of_irq.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+#include "sun4i_crtc.h"
+#include "sun4i_dotclock.h"
+#include "sun4i_drv.h"
+#include "sun4i_rgb.h"
+#include "sun4i_tcon.h"
+
+void sun4i_tcon_disable(struct sun4i_tcon *tcon)
+{
+       DRM_DEBUG_DRIVER("Disabling TCON\n");
+
+       /* Disable the TCON */
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GCTL_REG,
+                          SUN4I_TCON_GCTL_TCON_ENABLE, 0);
+}
+EXPORT_SYMBOL(sun4i_tcon_disable);
+
+void sun4i_tcon_enable(struct sun4i_tcon *tcon)
+{
+       DRM_DEBUG_DRIVER("Enabling TCON\n");
+
+       /* Enable the TCON */
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GCTL_REG,
+                          SUN4I_TCON_GCTL_TCON_ENABLE,
+                          SUN4I_TCON_GCTL_TCON_ENABLE);
+}
+EXPORT_SYMBOL(sun4i_tcon_enable);
+
+void sun4i_tcon_channel_disable(struct sun4i_tcon *tcon, int channel)
+{
+       /* Disable the TCON's channel */
+       if (channel == 0) {
+               regmap_update_bits(tcon->regs, SUN4I_TCON0_CTL_REG,
+                                  SUN4I_TCON0_CTL_TCON_ENABLE, 0);
+               clk_disable_unprepare(tcon->dclk);
+       } else if (channel == 1) {
+               regmap_update_bits(tcon->regs, SUN4I_TCON1_CTL_REG,
+                                  SUN4I_TCON1_CTL_TCON_ENABLE, 0);
+               clk_disable_unprepare(tcon->sclk1);
+       }
+}
+EXPORT_SYMBOL(sun4i_tcon_channel_disable);
+
+void sun4i_tcon_channel_enable(struct sun4i_tcon *tcon, int channel)
+{
+       /* Enable the TCON's channel */
+       if (channel == 0) {
+               regmap_update_bits(tcon->regs, SUN4I_TCON0_CTL_REG,
+                                  SUN4I_TCON0_CTL_TCON_ENABLE,
+                                  SUN4I_TCON0_CTL_TCON_ENABLE);
+               clk_prepare_enable(tcon->dclk);
+       } else if (channel == 1) {
+               regmap_update_bits(tcon->regs, SUN4I_TCON1_CTL_REG,
+                                  SUN4I_TCON1_CTL_TCON_ENABLE,
+                                  SUN4I_TCON1_CTL_TCON_ENABLE);
+               clk_prepare_enable(tcon->sclk1);
+       }
+}
+EXPORT_SYMBOL(sun4i_tcon_channel_enable);
+
+void sun4i_tcon_enable_vblank(struct sun4i_tcon *tcon, bool enable)
+{
+       u32 mask, val = 0;
+
+       DRM_DEBUG_DRIVER("%sabling VBLANK interrupt\n", enable ? "En" : "Dis");
+
+       mask = SUN4I_TCON_GINT0_VBLANK_ENABLE(0) |
+              SUN4I_TCON_GINT0_VBLANK_ENABLE(1);
+
+       if (enable)
+               val = mask;
+
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GINT0_REG, mask, val);
+}
+EXPORT_SYMBOL(sun4i_tcon_enable_vblank);
+
+static int sun4i_tcon_get_clk_delay(struct drm_display_mode *mode,
+                                   int channel)
+{
+       int delay = mode->vtotal - mode->vdisplay;
+
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               delay /= 2;
+
+       if (channel == 1)
+               delay -= 2;
+
+       delay = min(delay, 30);
+
+       DRM_DEBUG_DRIVER("TCON %d clock delay %u\n", channel, delay);
+
+       return delay;
+}
+
+void sun4i_tcon0_mode_set(struct sun4i_tcon *tcon,
+                         struct drm_display_mode *mode)
+{
+       unsigned int bp, hsync, vsync;
+       u8 clk_delay;
+       u32 val = 0;
+
+       /* Adjust clock delay */
+       clk_delay = sun4i_tcon_get_clk_delay(mode, 0);
+       regmap_update_bits(tcon->regs, SUN4I_TCON0_CTL_REG,
+                          SUN4I_TCON0_CTL_CLK_DELAY_MASK,
+                          SUN4I_TCON0_CTL_CLK_DELAY(clk_delay));
+
+       /* Set the resolution */
+       regmap_write(tcon->regs, SUN4I_TCON0_BASIC0_REG,
+                    SUN4I_TCON0_BASIC0_X(mode->crtc_hdisplay) |
+                    SUN4I_TCON0_BASIC0_Y(mode->crtc_vdisplay));
+
+       /*
+        * This is called a backporch in the register documentation,
+        * but it really is the front porch + hsync
+        */
+       bp = mode->crtc_htotal - mode->crtc_hsync_start;
+       DRM_DEBUG_DRIVER("Setting horizontal total %d, backporch %d\n",
+                        mode->crtc_htotal, bp);
+
+       /* Set horizontal display timings */
+       regmap_write(tcon->regs, SUN4I_TCON0_BASIC1_REG,
+                    SUN4I_TCON0_BASIC1_H_TOTAL(mode->crtc_htotal) |
+                    SUN4I_TCON0_BASIC1_H_BACKPORCH(bp));
+
+       /*
+        * This is called a backporch in the register documentation,
+        * but it really is the front porch + hsync
+        */
+       bp = mode->crtc_vtotal - mode->crtc_vsync_start;
+       DRM_DEBUG_DRIVER("Setting vertical total %d, backporch %d\n",
+                        mode->crtc_vtotal, bp);
+
+       /* Set vertical display timings */
+       regmap_write(tcon->regs, SUN4I_TCON0_BASIC2_REG,
+                    SUN4I_TCON0_BASIC2_V_TOTAL(mode->crtc_vtotal) |
+                    SUN4I_TCON0_BASIC2_V_BACKPORCH(bp));
+
+       /* Set Hsync and Vsync length */
+       hsync = mode->crtc_hsync_end - mode->crtc_hsync_start;
+       vsync = mode->crtc_vsync_end - mode->crtc_vsync_start;
+       DRM_DEBUG_DRIVER("Setting HSYNC %d, VSYNC %d\n", hsync, vsync);
+       regmap_write(tcon->regs, SUN4I_TCON0_BASIC3_REG,
+                    SUN4I_TCON0_BASIC3_V_SYNC(vsync) |
+                    SUN4I_TCON0_BASIC3_H_SYNC(hsync));
+
+       /* Setup the polarity of the various signals */
+       if (!(mode->flags & DRM_MODE_FLAG_PHSYNC))
+               val |= SUN4I_TCON0_IO_POL_HSYNC_POSITIVE;
+
+       if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
+               val |= SUN4I_TCON0_IO_POL_VSYNC_POSITIVE;
+
+       regmap_update_bits(tcon->regs, SUN4I_TCON0_IO_POL_REG,
+                          SUN4I_TCON0_IO_POL_HSYNC_POSITIVE | SUN4I_TCON0_IO_POL_VSYNC_POSITIVE,
+                          val);
+
+       /* Map output pins to channel 0 */
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GCTL_REG,
+                          SUN4I_TCON_GCTL_IOMAP_MASK,
+                          SUN4I_TCON_GCTL_IOMAP_TCON0);
+
+       /* Enable the output on the pins */
+       regmap_write(tcon->regs, SUN4I_TCON0_IO_TRI_REG, 0);
+}
+EXPORT_SYMBOL(sun4i_tcon0_mode_set);
+
+void sun4i_tcon1_mode_set(struct sun4i_tcon *tcon,
+                         struct drm_display_mode *mode)
+{
+       unsigned int bp, hsync, vsync;
+       u8 clk_delay;
+       u32 val;
+
+       /* Adjust clock delay */
+       clk_delay = sun4i_tcon_get_clk_delay(mode, 1);
+       regmap_update_bits(tcon->regs, SUN4I_TCON1_CTL_REG,
+                          SUN4I_TCON1_CTL_CLK_DELAY_MASK,
+                          SUN4I_TCON1_CTL_CLK_DELAY(clk_delay));
+
+       /* Set interlaced mode */
+       if (mode->flags & DRM_MODE_FLAG_INTERLACE)
+               val = SUN4I_TCON1_CTL_INTERLACE_ENABLE;
+       else
+               val = 0;
+       regmap_update_bits(tcon->regs, SUN4I_TCON1_CTL_REG,
+                          SUN4I_TCON1_CTL_INTERLACE_ENABLE,
+                          val);
+
+       /* Set the input resolution */
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC0_REG,
+                    SUN4I_TCON1_BASIC0_X(mode->crtc_hdisplay) |
+                    SUN4I_TCON1_BASIC0_Y(mode->crtc_vdisplay));
+
+       /* Set the upscaling resolution */
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC1_REG,
+                    SUN4I_TCON1_BASIC1_X(mode->crtc_hdisplay) |
+                    SUN4I_TCON1_BASIC1_Y(mode->crtc_vdisplay));
+
+       /* Set the output resolution */
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC2_REG,
+                    SUN4I_TCON1_BASIC2_X(mode->crtc_hdisplay) |
+                    SUN4I_TCON1_BASIC2_Y(mode->crtc_vdisplay));
+
+       /* Set horizontal display timings */
+       bp = mode->crtc_htotal - mode->crtc_hsync_end;
+       DRM_DEBUG_DRIVER("Setting horizontal total %d, backporch %d\n",
+                        mode->htotal, bp);
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC3_REG,
+                    SUN4I_TCON1_BASIC3_H_TOTAL(mode->crtc_htotal) |
+                    SUN4I_TCON1_BASIC3_H_BACKPORCH(bp));
+
+       /* Set vertical display timings */
+       bp = mode->crtc_vtotal - mode->crtc_vsync_end;
+       DRM_DEBUG_DRIVER("Setting vertical total %d, backporch %d\n",
+                        mode->vtotal, bp);
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC4_REG,
+                    SUN4I_TCON1_BASIC4_V_TOTAL(mode->vtotal) |
+                    SUN4I_TCON1_BASIC4_V_BACKPORCH(bp));
+
+       /* Set Hsync and Vsync length */
+       hsync = mode->crtc_hsync_end - mode->crtc_hsync_start;
+       vsync = mode->crtc_vsync_end - mode->crtc_vsync_start;
+       DRM_DEBUG_DRIVER("Setting HSYNC %d, VSYNC %d\n", hsync, vsync);
+       regmap_write(tcon->regs, SUN4I_TCON1_BASIC5_REG,
+                    SUN4I_TCON1_BASIC5_V_SYNC(vsync) |
+                    SUN4I_TCON1_BASIC5_H_SYNC(hsync));
+
+       /* Map output pins to channel 1 */
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GCTL_REG,
+                          SUN4I_TCON_GCTL_IOMAP_MASK,
+                          SUN4I_TCON_GCTL_IOMAP_TCON1);
+
+       /*
+        * FIXME: Undocumented bits
+        */
+       if (tcon->has_mux)
+               regmap_write(tcon->regs, SUN4I_TCON_MUX_CTRL_REG, 1);
+}
+EXPORT_SYMBOL(sun4i_tcon1_mode_set);
+
+static void sun4i_tcon_finish_page_flip(struct drm_device *dev,
+                                       struct sun4i_crtc *scrtc)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->event_lock, flags);
+       if (scrtc->event) {
+               drm_crtc_send_vblank_event(&scrtc->crtc, scrtc->event);
+               drm_crtc_vblank_put(&scrtc->crtc);
+               scrtc->event = NULL;
+       }
+       spin_unlock_irqrestore(&dev->event_lock, flags);
+}
+
+static irqreturn_t sun4i_tcon_handler(int irq, void *private)
+{
+       struct sun4i_tcon *tcon = private;
+       struct drm_device *drm = tcon->drm;
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_crtc *scrtc = drv->crtc;
+       unsigned int status;
+
+       regmap_read(tcon->regs, SUN4I_TCON_GINT0_REG, &status);
+
+       if (!(status & (SUN4I_TCON_GINT0_VBLANK_INT(0) |
+                       SUN4I_TCON_GINT0_VBLANK_INT(1))))
+               return IRQ_NONE;
+
+       drm_crtc_handle_vblank(&scrtc->crtc);
+       sun4i_tcon_finish_page_flip(drm, scrtc);
+
+       /* Acknowledge the interrupt */
+       regmap_update_bits(tcon->regs, SUN4I_TCON_GINT0_REG,
+                          SUN4I_TCON_GINT0_VBLANK_INT(0) |
+                          SUN4I_TCON_GINT0_VBLANK_INT(1),
+                          0);
+
+       return IRQ_HANDLED;
+}
+
+static int sun4i_tcon_init_clocks(struct device *dev,
+                                 struct sun4i_tcon *tcon)
+{
+       tcon->clk = devm_clk_get(dev, "ahb");
+       if (IS_ERR(tcon->clk)) {
+               dev_err(dev, "Couldn't get the TCON bus clock\n");
+               return PTR_ERR(tcon->clk);
+       }
+       clk_prepare_enable(tcon->clk);
+
+       tcon->sclk0 = devm_clk_get(dev, "tcon-ch0");
+       if (IS_ERR(tcon->sclk0)) {
+               dev_err(dev, "Couldn't get the TCON channel 0 clock\n");
+               return PTR_ERR(tcon->sclk0);
+       }
+
+       tcon->sclk1 = devm_clk_get(dev, "tcon-ch1");
+       if (IS_ERR(tcon->sclk1)) {
+               dev_err(dev, "Couldn't get the TCON channel 1 clock\n");
+               return PTR_ERR(tcon->sclk1);
+       }
+
+       return sun4i_dclk_create(dev, tcon);
+}
+
+static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon)
+{
+       sun4i_dclk_free(tcon);
+       clk_disable_unprepare(tcon->clk);
+}
+
+static int sun4i_tcon_init_irq(struct device *dev,
+                              struct sun4i_tcon *tcon)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       int irq, ret;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(dev, "Couldn't retrieve the TCON interrupt\n");
+               return irq;
+       }
+
+       ret = devm_request_irq(dev, irq, sun4i_tcon_handler, 0,
+                              dev_name(dev), tcon);
+       if (ret) {
+               dev_err(dev, "Couldn't request the IRQ\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static struct regmap_config sun4i_tcon_regmap_config = {
+       .reg_bits       = 32,
+       .val_bits       = 32,
+       .reg_stride     = 4,
+       .max_register   = 0x800,
+};
+
+static int sun4i_tcon_init_regmap(struct device *dev,
+                                 struct sun4i_tcon *tcon)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct resource *res;
+       void __iomem *regs;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(regs)) {
+               dev_err(dev, "Couldn't map the TCON registers\n");
+               return PTR_ERR(regs);
+       }
+
+       tcon->regs = devm_regmap_init_mmio(dev, regs,
+                                          &sun4i_tcon_regmap_config);
+       if (IS_ERR(tcon->regs)) {
+               dev_err(dev, "Couldn't create the TCON regmap\n");
+               return PTR_ERR(tcon->regs);
+       }
+
+       /* Make sure the TCON is disabled and all IRQs are off */
+       regmap_write(tcon->regs, SUN4I_TCON_GCTL_REG, 0);
+       regmap_write(tcon->regs, SUN4I_TCON_GINT0_REG, 0);
+       regmap_write(tcon->regs, SUN4I_TCON_GINT1_REG, 0);
+
+       /* Disable IO lines and set them to tristate */
+       regmap_write(tcon->regs, SUN4I_TCON0_IO_TRI_REG, ~0);
+       regmap_write(tcon->regs, SUN4I_TCON1_IO_TRI_REG, ~0);
+
+       return 0;
+}
+
+static struct drm_panel *sun4i_tcon_find_panel(struct device_node *node)
+{
+       struct device_node *port, *remote, *child;
+       struct device_node *end_node = NULL;
+
+       /* Inputs are listed first, then outputs */
+       port = of_graph_get_port_by_id(node, 1);
+
+       /*
+        * Our first output is the RGB interface where the panel will
+        * be connected.
+        */
+       for_each_child_of_node(port, child) {
+               u32 reg;
+
+               of_property_read_u32(child, "reg", &reg);
+               if (reg == 0)
+                       end_node = child;
+       }
+
+       if (!end_node) {
+               DRM_DEBUG_DRIVER("Missing panel endpoint\n");
+               return ERR_PTR(-ENODEV);
+       }
+
+       remote = of_graph_get_remote_port_parent(end_node);
+       if (!remote) {
+               DRM_DEBUG_DRIVER("Enable to parse remote node\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       return of_drm_find_panel(remote);
+}
+
+static int sun4i_tcon_bind(struct device *dev, struct device *master,
+                          void *data)
+{
+       struct drm_device *drm = data;
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_tcon *tcon;
+       int ret;
+
+       tcon = devm_kzalloc(dev, sizeof(*tcon), GFP_KERNEL);
+       if (!tcon)
+               return -ENOMEM;
+       dev_set_drvdata(dev, tcon);
+       drv->tcon = tcon;
+       tcon->drm = drm;
+
+       if (of_device_is_compatible(dev->of_node, "allwinner,sun5i-a13-tcon"))
+               tcon->has_mux = true;
+
+       tcon->lcd_rst = devm_reset_control_get(dev, "lcd");
+       if (IS_ERR(tcon->lcd_rst)) {
+               dev_err(dev, "Couldn't get our reset line\n");
+               return PTR_ERR(tcon->lcd_rst);
+       }
+
+       /* Make sure our TCON is reset */
+       if (!reset_control_status(tcon->lcd_rst))
+               reset_control_assert(tcon->lcd_rst);
+
+       ret = reset_control_deassert(tcon->lcd_rst);
+       if (ret) {
+               dev_err(dev, "Couldn't deassert our reset line\n");
+               return ret;
+       }
+
+       ret = sun4i_tcon_init_regmap(dev, tcon);
+       if (ret) {
+               dev_err(dev, "Couldn't init our TCON regmap\n");
+               goto err_assert_reset;
+       }
+
+       ret = sun4i_tcon_init_clocks(dev, tcon);
+       if (ret) {
+               dev_err(dev, "Couldn't init our TCON clocks\n");
+               goto err_assert_reset;
+       }
+
+       ret = sun4i_tcon_init_irq(dev, tcon);
+       if (ret) {
+               dev_err(dev, "Couldn't init our TCON interrupts\n");
+               goto err_free_clocks;
+       }
+
+       tcon->panel = sun4i_tcon_find_panel(dev->of_node);
+       if (IS_ERR(tcon->panel)) {
+               dev_info(dev, "No panel found... RGB output disabled\n");
+               return 0;
+       }
+
+       return sun4i_rgb_init(drm);
+
+err_free_clocks:
+       sun4i_tcon_free_clocks(tcon);
+err_assert_reset:
+       reset_control_assert(tcon->lcd_rst);
+       return ret;
+}
+
+static void sun4i_tcon_unbind(struct device *dev, struct device *master,
+                             void *data)
+{
+       struct sun4i_tcon *tcon = dev_get_drvdata(dev);
+
+       sun4i_tcon_free_clocks(tcon);
+}
+
+static struct component_ops sun4i_tcon_ops = {
+       .bind   = sun4i_tcon_bind,
+       .unbind = sun4i_tcon_unbind,
+};
+
+static int sun4i_tcon_probe(struct platform_device *pdev)
+{
+       struct device_node *node = pdev->dev.of_node;
+       struct drm_panel *panel;
+
+       /*
+        * The panel is not ready.
+        * Defer the probe.
+        */
+       panel = sun4i_tcon_find_panel(node);
+       if (IS_ERR(panel)) {
+               /*
+                * If we don't have a panel endpoint, just go on
+                */
+               if (PTR_ERR(panel) != -ENODEV)
+                       return -EPROBE_DEFER;
+       }
+
+       return component_add(&pdev->dev, &sun4i_tcon_ops);
+}
+
+static int sun4i_tcon_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sun4i_tcon_ops);
+
+       return 0;
+}
+
+static const struct of_device_id sun4i_tcon_of_table[] = {
+       { .compatible = "allwinner,sun5i-a13-tcon" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, sun4i_tcon_of_table);
+
+static struct platform_driver sun4i_tcon_platform_driver = {
+       .probe          = sun4i_tcon_probe,
+       .remove         = sun4i_tcon_remove,
+       .driver         = {
+               .name           = "sun4i-tcon",
+               .of_match_table = sun4i_tcon_of_table,
+       },
+};
+module_platform_driver(sun4i_tcon_platform_driver);
+
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner A10 Timing Controller Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/gpu/drm/sun4i/sun4i_tcon.h b/drivers/gpu/drm/sun4i/sun4i_tcon.h
new file mode 100644 (file)
index 0000000..0e0b11d
--- /dev/null
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Boris Brezillon <boris.brezillon@free-electrons.com>
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#ifndef __SUN4I_TCON_H__
+#define __SUN4I_TCON_H__
+
+#include <drm/drm_crtc.h>
+
+#include <linux/kernel.h>
+#include <linux/reset.h>
+
+#define SUN4I_TCON_GCTL_REG                    0x0
+#define SUN4I_TCON_GCTL_TCON_ENABLE                    BIT(31)
+#define SUN4I_TCON_GCTL_IOMAP_MASK                     BIT(0)
+#define SUN4I_TCON_GCTL_IOMAP_TCON1                    (1 << 0)
+#define SUN4I_TCON_GCTL_IOMAP_TCON0                    (0 << 0)
+
+#define SUN4I_TCON_GINT0_REG                   0x4
+#define SUN4I_TCON_GINT0_VBLANK_ENABLE(pipe)           BIT(31 - (pipe))
+#define SUN4I_TCON_GINT0_VBLANK_INT(pipe)              BIT(15 - (pipe))
+
+#define SUN4I_TCON_GINT1_REG                   0x8
+#define SUN4I_TCON_FRM_CTL_REG                 0x10
+
+#define SUN4I_TCON0_CTL_REG                    0x40
+#define SUN4I_TCON0_CTL_TCON_ENABLE                    BIT(31)
+#define SUN4I_TCON0_CTL_CLK_DELAY_MASK                 GENMASK(8, 4)
+#define SUN4I_TCON0_CTL_CLK_DELAY(delay)               ((delay << 4) & SUN4I_TCON0_CTL_CLK_DELAY_MASK)
+
+#define SUN4I_TCON0_DCLK_REG                   0x44
+#define SUN4I_TCON0_DCLK_GATE_BIT                      (31)
+#define SUN4I_TCON0_DCLK_DIV_SHIFT                     (0)
+#define SUN4I_TCON0_DCLK_DIV_WIDTH                     (7)
+
+#define SUN4I_TCON0_BASIC0_REG                 0x48
+#define SUN4I_TCON0_BASIC0_X(width)                    ((((width) - 1) & 0xfff) << 16)
+#define SUN4I_TCON0_BASIC0_Y(height)                   (((height) - 1) & 0xfff)
+
+#define SUN4I_TCON0_BASIC1_REG                 0x4c
+#define SUN4I_TCON0_BASIC1_H_TOTAL(total)              ((((total) - 1) & 0x1fff) << 16)
+#define SUN4I_TCON0_BASIC1_H_BACKPORCH(bp)             (((bp) - 1) & 0xfff)
+
+#define SUN4I_TCON0_BASIC2_REG                 0x50
+#define SUN4I_TCON0_BASIC2_V_TOTAL(total)              ((((total) * 2) & 0x1fff) << 16)
+#define SUN4I_TCON0_BASIC2_V_BACKPORCH(bp)             (((bp) - 1) & 0xfff)
+
+#define SUN4I_TCON0_BASIC3_REG                 0x54
+#define SUN4I_TCON0_BASIC3_H_SYNC(width)               ((((width) - 1) & 0x7ff) << 16)
+#define SUN4I_TCON0_BASIC3_V_SYNC(height)              (((height) - 1) & 0x7ff)
+
+#define SUN4I_TCON0_HV_IF_REG                  0x58
+#define SUN4I_TCON0_CPU_IF_REG                 0x60
+#define SUN4I_TCON0_CPU_WR_REG                 0x64
+#define SUN4I_TCON0_CPU_RD0_REG                        0x68
+#define SUN4I_TCON0_CPU_RDA_REG                        0x6c
+#define SUN4I_TCON0_TTL0_REG                   0x70
+#define SUN4I_TCON0_TTL1_REG                   0x74
+#define SUN4I_TCON0_TTL2_REG                   0x78
+#define SUN4I_TCON0_TTL3_REG                   0x7c
+#define SUN4I_TCON0_TTL4_REG                   0x80
+#define SUN4I_TCON0_LVDS_IF_REG                        0x84
+#define SUN4I_TCON0_IO_POL_REG                 0x88
+#define SUN4I_TCON0_IO_POL_DCLK_PHASE(phase)           ((phase & 3) << 28)
+#define SUN4I_TCON0_IO_POL_HSYNC_POSITIVE              BIT(25)
+#define SUN4I_TCON0_IO_POL_VSYNC_POSITIVE              BIT(24)
+
+#define SUN4I_TCON0_IO_TRI_REG                 0x8c
+#define SUN4I_TCON0_IO_TRI_HSYNC_DISABLE               BIT(25)
+#define SUN4I_TCON0_IO_TRI_VSYNC_DISABLE               BIT(24)
+#define SUN4I_TCON0_IO_TRI_DATA_PINS_DISABLE(pins)     GENMASK(pins, 0)
+
+#define SUN4I_TCON1_CTL_REG                    0x90
+#define SUN4I_TCON1_CTL_TCON_ENABLE                    BIT(31)
+#define SUN4I_TCON1_CTL_INTERLACE_ENABLE               BIT(20)
+#define SUN4I_TCON1_CTL_CLK_DELAY_MASK                 GENMASK(8, 4)
+#define SUN4I_TCON1_CTL_CLK_DELAY(delay)               ((delay << 4) & SUN4I_TCON1_CTL_CLK_DELAY_MASK)
+
+#define SUN4I_TCON1_BASIC0_REG                 0x94
+#define SUN4I_TCON1_BASIC0_X(width)                    ((((width) - 1) & 0xfff) << 16)
+#define SUN4I_TCON1_BASIC0_Y(height)                   (((height) - 1) & 0xfff)
+
+#define SUN4I_TCON1_BASIC1_REG                 0x98
+#define SUN4I_TCON1_BASIC1_X(width)                    ((((width) - 1) & 0xfff) << 16)
+#define SUN4I_TCON1_BASIC1_Y(height)                   (((height) - 1) & 0xfff)
+
+#define SUN4I_TCON1_BASIC2_REG                 0x9c
+#define SUN4I_TCON1_BASIC2_X(width)                    ((((width) - 1) & 0xfff) << 16)
+#define SUN4I_TCON1_BASIC2_Y(height)                   (((height) - 1) & 0xfff)
+
+#define SUN4I_TCON1_BASIC3_REG                 0xa0
+#define SUN4I_TCON1_BASIC3_H_TOTAL(total)              ((((total) - 1) & 0x1fff) << 16)
+#define SUN4I_TCON1_BASIC3_H_BACKPORCH(bp)             (((bp) - 1) & 0xfff)
+
+#define SUN4I_TCON1_BASIC4_REG                 0xa4
+#define SUN4I_TCON1_BASIC4_V_TOTAL(total)              (((total) & 0x1fff) << 16)
+#define SUN4I_TCON1_BASIC4_V_BACKPORCH(bp)             (((bp) - 1) & 0xfff)
+
+#define SUN4I_TCON1_BASIC5_REG                 0xa8
+#define SUN4I_TCON1_BASIC5_H_SYNC(width)               ((((width) - 1) & 0x3ff) << 16)
+#define SUN4I_TCON1_BASIC5_V_SYNC(height)              (((height) - 1) & 0x3ff)
+
+#define SUN4I_TCON1_IO_POL_REG                 0xf0
+#define SUN4I_TCON1_IO_TRI_REG                 0xf4
+#define SUN4I_TCON_CEU_CTL_REG                 0x100
+#define SUN4I_TCON_CEU_MUL_RR_REG              0x110
+#define SUN4I_TCON_CEU_MUL_RG_REG              0x114
+#define SUN4I_TCON_CEU_MUL_RB_REG              0x118
+#define SUN4I_TCON_CEU_ADD_RC_REG              0x11c
+#define SUN4I_TCON_CEU_MUL_GR_REG              0x120
+#define SUN4I_TCON_CEU_MUL_GG_REG              0x124
+#define SUN4I_TCON_CEU_MUL_GB_REG              0x128
+#define SUN4I_TCON_CEU_ADD_GC_REG              0x12c
+#define SUN4I_TCON_CEU_MUL_BR_REG              0x130
+#define SUN4I_TCON_CEU_MUL_BG_REG              0x134
+#define SUN4I_TCON_CEU_MUL_BB_REG              0x138
+#define SUN4I_TCON_CEU_ADD_BC_REG              0x13c
+#define SUN4I_TCON_CEU_RANGE_R_REG             0x140
+#define SUN4I_TCON_CEU_RANGE_G_REG             0x144
+#define SUN4I_TCON_CEU_RANGE_B_REG             0x148
+#define SUN4I_TCON_MUX_CTRL_REG                        0x200
+#define SUN4I_TCON1_FILL_CTL_REG               0x300
+#define SUN4I_TCON1_FILL_BEG0_REG              0x304
+#define SUN4I_TCON1_FILL_END0_REG              0x308
+#define SUN4I_TCON1_FILL_DATA0_REG             0x30c
+#define SUN4I_TCON1_FILL_BEG1_REG              0x310
+#define SUN4I_TCON1_FILL_END1_REG              0x314
+#define SUN4I_TCON1_FILL_DATA1_REG             0x318
+#define SUN4I_TCON1_FILL_BEG2_REG              0x31c
+#define SUN4I_TCON1_FILL_END2_REG              0x320
+#define SUN4I_TCON1_FILL_DATA2_REG             0x324
+#define SUN4I_TCON1_GAMMA_TABLE_REG            0x400
+
+#define SUN4I_TCON_MAX_CHANNELS                2
+
+struct sun4i_tcon {
+       struct drm_device               *drm;
+       struct regmap                   *regs;
+
+       /* Main bus clock */
+       struct clk                      *clk;
+
+       /* Clocks for the TCON channels */
+       struct clk                      *sclk0;
+       struct clk                      *sclk1;
+
+       /* Pixel clock */
+       struct clk                      *dclk;
+
+       /* Reset control */
+       struct reset_control            *lcd_rst;
+
+       /* Platform adjustments */
+       bool                            has_mux;
+
+       struct drm_panel                *panel;
+};
+
+/* Global Control */
+void sun4i_tcon_disable(struct sun4i_tcon *tcon);
+void sun4i_tcon_enable(struct sun4i_tcon *tcon);
+
+/* Channel Control */
+void sun4i_tcon_channel_disable(struct sun4i_tcon *tcon, int channel);
+void sun4i_tcon_channel_enable(struct sun4i_tcon *tcon, int channel);
+
+void sun4i_tcon_enable_vblank(struct sun4i_tcon *tcon, bool enable);
+
+/* Mode Related Controls */
+void sun4i_tcon_switch_interlace(struct sun4i_tcon *tcon,
+                                bool enable);
+void sun4i_tcon0_mode_set(struct sun4i_tcon *tcon,
+                         struct drm_display_mode *mode);
+void sun4i_tcon1_mode_set(struct sun4i_tcon *tcon,
+                         struct drm_display_mode *mode);
+
+#endif /* __SUN4I_TCON_H__ */
diff --git a/drivers/gpu/drm/sun4i/sun4i_tv.c b/drivers/gpu/drm/sun4i/sun4i_tv.c
new file mode 100644 (file)
index 0000000..bc047f9
--- /dev/null
@@ -0,0 +1,708 @@
+/*
+ * Copyright (C) 2015 Free Electrons
+ * Copyright (C) 2015 NextThing Co
+ *
+ * Maxime Ripard <maxime.ripard@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ */
+
+#include <linux/clk.h>
+#include <linux/component.h>
+#include <linux/of_address.h>
+#include <linux/regmap.h>
+#include <linux/reset.h>
+
+#include <drm/drmP.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_panel.h>
+
+#include "sun4i_backend.h"
+#include "sun4i_drv.h"
+#include "sun4i_tcon.h"
+
+#define SUN4I_TVE_EN_REG               0x000
+#define SUN4I_TVE_EN_DAC_MAP_MASK              GENMASK(19, 4)
+#define SUN4I_TVE_EN_DAC_MAP(dac, out)         (((out) & 0xf) << (dac + 1) * 4)
+#define SUN4I_TVE_EN_ENABLE                    BIT(0)
+
+#define SUN4I_TVE_CFG0_REG             0x004
+#define SUN4I_TVE_CFG0_DAC_CONTROL_54M         BIT(26)
+#define SUN4I_TVE_CFG0_CORE_DATAPATH_54M       BIT(25)
+#define SUN4I_TVE_CFG0_CORE_CONTROL_54M                BIT(24)
+#define SUN4I_TVE_CFG0_YC_EN                   BIT(17)
+#define SUN4I_TVE_CFG0_COMP_EN                 BIT(16)
+#define SUN4I_TVE_CFG0_RES(x)                  ((x) & 0xf)
+#define SUN4I_TVE_CFG0_RES_480i                        SUN4I_TVE_CFG0_RES(0)
+#define SUN4I_TVE_CFG0_RES_576i                        SUN4I_TVE_CFG0_RES(1)
+
+#define SUN4I_TVE_DAC0_REG             0x008
+#define SUN4I_TVE_DAC0_CLOCK_INVERT            BIT(24)
+#define SUN4I_TVE_DAC0_LUMA(x)                 (((x) & 3) << 20)
+#define SUN4I_TVE_DAC0_LUMA_0_4                        SUN4I_TVE_DAC0_LUMA(3)
+#define SUN4I_TVE_DAC0_CHROMA(x)               (((x) & 3) << 18)
+#define SUN4I_TVE_DAC0_CHROMA_0_75             SUN4I_TVE_DAC0_CHROMA(3)
+#define SUN4I_TVE_DAC0_INTERNAL_DAC(x)         (((x) & 3) << 16)
+#define SUN4I_TVE_DAC0_INTERNAL_DAC_37_5_OHMS  SUN4I_TVE_DAC0_INTERNAL_DAC(3)
+#define SUN4I_TVE_DAC0_DAC_EN(dac)             BIT(dac)
+
+#define SUN4I_TVE_NOTCH_REG            0x00c
+#define SUN4I_TVE_NOTCH_DAC0_TO_DAC_DLY(dac, x)        ((4 - (x)) << (dac * 3))
+
+#define SUN4I_TVE_CHROMA_FREQ_REG      0x010
+
+#define SUN4I_TVE_PORCH_REG            0x014
+#define SUN4I_TVE_PORCH_BACK(x)                        ((x) << 16)
+#define SUN4I_TVE_PORCH_FRONT(x)               (x)
+
+#define SUN4I_TVE_LINE_REG             0x01c
+#define SUN4I_TVE_LINE_FIRST(x)                        ((x) << 16)
+#define SUN4I_TVE_LINE_NUMBER(x)               (x)
+
+#define SUN4I_TVE_LEVEL_REG            0x020
+#define SUN4I_TVE_LEVEL_BLANK(x)               ((x) << 16)
+#define SUN4I_TVE_LEVEL_BLACK(x)               (x)
+
+#define SUN4I_TVE_DAC1_REG             0x024
+#define SUN4I_TVE_DAC1_AMPLITUDE(dac, x)       ((x) << (dac * 8))
+
+#define SUN4I_TVE_DETECT_STA_REG       0x038
+#define SUN4I_TVE_DETECT_STA_DAC(dac)          BIT((dac * 8))
+#define SUN4I_TVE_DETECT_STA_UNCONNECTED               0
+#define SUN4I_TVE_DETECT_STA_CONNECTED                 1
+#define SUN4I_TVE_DETECT_STA_GROUND                    2
+
+#define SUN4I_TVE_CB_CR_LVL_REG                0x10c
+#define SUN4I_TVE_CB_CR_LVL_CR_BURST(x)                ((x) << 8)
+#define SUN4I_TVE_CB_CR_LVL_CB_BURST(x)                (x)
+
+#define SUN4I_TVE_TINT_BURST_PHASE_REG 0x110
+#define SUN4I_TVE_TINT_BURST_PHASE_CHROMA(x)   (x)
+
+#define SUN4I_TVE_BURST_WIDTH_REG      0x114
+#define SUN4I_TVE_BURST_WIDTH_BREEZEWAY(x)     ((x) << 16)
+#define SUN4I_TVE_BURST_WIDTH_BURST_WIDTH(x)   ((x) << 8)
+#define SUN4I_TVE_BURST_WIDTH_HSYNC_WIDTH(x)   (x)
+
+#define SUN4I_TVE_CB_CR_GAIN_REG       0x118
+#define SUN4I_TVE_CB_CR_GAIN_CR(x)             ((x) << 8)
+#define SUN4I_TVE_CB_CR_GAIN_CB(x)             (x)
+
+#define SUN4I_TVE_SYNC_VBI_REG         0x11c
+#define SUN4I_TVE_SYNC_VBI_SYNC(x)             ((x) << 16)
+#define SUN4I_TVE_SYNC_VBI_VBLANK(x)           (x)
+
+#define SUN4I_TVE_ACTIVE_LINE_REG      0x124
+#define SUN4I_TVE_ACTIVE_LINE(x)               (x)
+
+#define SUN4I_TVE_CHROMA_REG           0x128
+#define SUN4I_TVE_CHROMA_COMP_GAIN(x)          ((x) & 3)
+#define SUN4I_TVE_CHROMA_COMP_GAIN_50          SUN4I_TVE_CHROMA_COMP_GAIN(2)
+
+#define SUN4I_TVE_12C_REG              0x12c
+#define SUN4I_TVE_12C_NOTCH_WIDTH_WIDE         BIT(8)
+#define SUN4I_TVE_12C_COMP_YUV_EN              BIT(0)
+
+#define SUN4I_TVE_RESYNC_REG           0x130
+#define SUN4I_TVE_RESYNC_FIELD                 BIT(31)
+#define SUN4I_TVE_RESYNC_LINE(x)               ((x) << 16)
+#define SUN4I_TVE_RESYNC_PIXEL(x)              (x)
+
+#define SUN4I_TVE_SLAVE_REG            0x134
+
+#define SUN4I_TVE_WSS_DATA2_REG                0x244
+
+struct color_gains {
+       u16     cb;
+       u16     cr;
+};
+
+struct burst_levels {
+       u16     cb;
+       u16     cr;
+};
+
+struct video_levels {
+       u16     black;
+       u16     blank;
+};
+
+struct resync_parameters {
+       bool    field;
+       u16     line;
+       u16     pixel;
+};
+
+struct tv_mode {
+       char            *name;
+
+       u32             mode;
+       u32             chroma_freq;
+       u16             back_porch;
+       u16             front_porch;
+       u16             line_number;
+       u16             vblank_level;
+
+       u32             hdisplay;
+       u16             hfront_porch;
+       u16             hsync_len;
+       u16             hback_porch;
+
+       u32             vdisplay;
+       u16             vfront_porch;
+       u16             vsync_len;
+       u16             vback_porch;
+
+       bool            yc_en;
+       bool            dac3_en;
+       bool            dac_bit25_en;
+
+       struct color_gains              *color_gains;
+       struct burst_levels             *burst_levels;
+       struct video_levels             *video_levels;
+       struct resync_parameters        *resync_params;
+};
+
+struct sun4i_tv {
+       struct drm_connector    connector;
+       struct drm_encoder      encoder;
+
+       struct clk              *clk;
+       struct regmap           *regs;
+       struct reset_control    *reset;
+
+       struct sun4i_drv        *drv;
+};
+
+struct video_levels ntsc_video_levels = {
+       .black = 282,   .blank = 240,
+};
+
+struct video_levels pal_video_levels = {
+       .black = 252,   .blank = 252,
+};
+
+struct burst_levels ntsc_burst_levels = {
+       .cb = 79,       .cr = 0,
+};
+
+struct burst_levels pal_burst_levels = {
+       .cb = 40,       .cr = 40,
+};
+
+struct color_gains ntsc_color_gains = {
+       .cb = 160,      .cr = 160,
+};
+
+struct color_gains pal_color_gains = {
+       .cb = 224,      .cr = 224,
+};
+
+struct resync_parameters ntsc_resync_parameters = {
+       .field = false, .line = 14,     .pixel = 12,
+};
+
+struct resync_parameters pal_resync_parameters = {
+       .field = true,  .line = 13,     .pixel = 12,
+};
+
+struct tv_mode tv_modes[] = {
+       {
+               .name           = "NTSC",
+               .mode           = SUN4I_TVE_CFG0_RES_480i,
+               .chroma_freq    = 0x21f07c1f,
+               .yc_en          = true,
+               .dac3_en        = true,
+               .dac_bit25_en   = true,
+
+               .back_porch     = 118,
+               .front_porch    = 32,
+               .line_number    = 525,
+
+               .hdisplay       = 720,
+               .hfront_porch   = 18,
+               .hsync_len      = 2,
+               .hback_porch    = 118,
+
+               .vdisplay       = 480,
+               .vfront_porch   = 26,
+               .vsync_len      = 2,
+               .vback_porch    = 17,
+
+               .vblank_level   = 240,
+
+               .color_gains    = &ntsc_color_gains,
+               .burst_levels   = &ntsc_burst_levels,
+               .video_levels   = &ntsc_video_levels,
+               .resync_params  = &ntsc_resync_parameters,
+       },
+       {
+               .name           = "PAL",
+               .mode           = SUN4I_TVE_CFG0_RES_576i,
+               .chroma_freq    = 0x2a098acb,
+
+               .back_porch     = 138,
+               .front_porch    = 24,
+               .line_number    = 625,
+
+               .hdisplay       = 720,
+               .hfront_porch   = 3,
+               .hsync_len      = 2,
+               .hback_porch    = 139,
+
+               .vdisplay       = 576,
+               .vfront_porch   = 28,
+               .vsync_len      = 2,
+               .vback_porch    = 19,
+
+               .vblank_level   = 252,
+
+               .color_gains    = &pal_color_gains,
+               .burst_levels   = &pal_burst_levels,
+               .video_levels   = &pal_video_levels,
+               .resync_params  = &pal_resync_parameters,
+       },
+};
+
+static inline struct sun4i_tv *
+drm_encoder_to_sun4i_tv(struct drm_encoder *encoder)
+{
+       return container_of(encoder, struct sun4i_tv,
+                           encoder);
+}
+
+static inline struct sun4i_tv *
+drm_connector_to_sun4i_tv(struct drm_connector *connector)
+{
+       return container_of(connector, struct sun4i_tv,
+                           connector);
+}
+
+/*
+ * FIXME: If only the drm_display_mode private field was usable, this
+ * could go away...
+ *
+ * So far, it doesn't seem to be preserved when the mode is passed by
+ * to mode_set for some reason.
+ */
+static struct tv_mode *sun4i_tv_find_tv_by_mode(struct drm_display_mode *mode)
+{
+       int i;
+
+       /* First try to identify the mode by name */
+       for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
+               struct tv_mode *tv_mode = &tv_modes[i];
+
+               DRM_DEBUG_DRIVER("Comparing mode %s vs %s",
+                                mode->name, tv_mode->name);
+
+               if (!strcmp(mode->name, tv_mode->name))
+                       return tv_mode;
+       }
+
+       /* Then by number of lines */
+       for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
+               struct tv_mode *tv_mode = &tv_modes[i];
+
+               DRM_DEBUG_DRIVER("Comparing mode %s vs %s (X: %d vs %d)",
+                                mode->name, tv_mode->name,
+                                mode->vdisplay, tv_mode->vdisplay);
+
+               if (mode->vdisplay == tv_mode->vdisplay)
+                       return tv_mode;
+       }
+
+       return NULL;
+}
+
+static void sun4i_tv_mode_to_drm_mode(struct tv_mode *tv_mode,
+                                     struct drm_display_mode *mode)
+{
+       DRM_DEBUG_DRIVER("Creating mode %s\n", mode->name);
+
+       mode->type = DRM_MODE_TYPE_DRIVER;
+       mode->clock = 13500;
+       mode->flags = DRM_MODE_FLAG_INTERLACE;
+
+       mode->hdisplay = tv_mode->hdisplay;
+       mode->hsync_start = mode->hdisplay + tv_mode->hfront_porch;
+       mode->hsync_end = mode->hsync_start + tv_mode->hsync_len;
+       mode->htotal = mode->hsync_end  + tv_mode->hback_porch;
+
+       mode->vdisplay = tv_mode->vdisplay;
+       mode->vsync_start = mode->vdisplay + tv_mode->vfront_porch;
+       mode->vsync_end = mode->vsync_start + tv_mode->vsync_len;
+       mode->vtotal = mode->vsync_end  + tv_mode->vback_porch;
+}
+
+static int sun4i_tv_atomic_check(struct drm_encoder *encoder,
+                                struct drm_crtc_state *crtc_state,
+                                struct drm_connector_state *conn_state)
+{
+       return 0;
+}
+
+static void sun4i_tv_disable(struct drm_encoder *encoder)
+{
+       struct sun4i_tv *tv = drm_encoder_to_sun4i_tv(encoder);
+       struct sun4i_drv *drv = tv->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Disabling the TV Output\n");
+
+       sun4i_tcon_channel_disable(tcon, 1);
+
+       regmap_update_bits(tv->regs, SUN4I_TVE_EN_REG,
+                          SUN4I_TVE_EN_ENABLE,
+                          0);
+       sun4i_backend_disable_color_correction(drv->backend);
+}
+
+static void sun4i_tv_enable(struct drm_encoder *encoder)
+{
+       struct sun4i_tv *tv = drm_encoder_to_sun4i_tv(encoder);
+       struct sun4i_drv *drv = tv->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+
+       DRM_DEBUG_DRIVER("Enabling the TV Output\n");
+
+       sun4i_backend_apply_color_correction(drv->backend);
+
+       regmap_update_bits(tv->regs, SUN4I_TVE_EN_REG,
+                          SUN4I_TVE_EN_ENABLE,
+                          SUN4I_TVE_EN_ENABLE);
+
+       sun4i_tcon_channel_enable(tcon, 1);
+}
+
+static void sun4i_tv_mode_set(struct drm_encoder *encoder,
+                             struct drm_display_mode *mode,
+                             struct drm_display_mode *adjusted_mode)
+{
+       struct sun4i_tv *tv = drm_encoder_to_sun4i_tv(encoder);
+       struct sun4i_drv *drv = tv->drv;
+       struct sun4i_tcon *tcon = drv->tcon;
+       struct tv_mode *tv_mode = sun4i_tv_find_tv_by_mode(mode);
+
+       sun4i_tcon1_mode_set(tcon, mode);
+
+       /* Enable and map the DAC to the output */
+       regmap_update_bits(tv->regs, SUN4I_TVE_EN_REG,
+                          SUN4I_TVE_EN_DAC_MAP_MASK,
+                          SUN4I_TVE_EN_DAC_MAP(0, 1) |
+                          SUN4I_TVE_EN_DAC_MAP(1, 2) |
+                          SUN4I_TVE_EN_DAC_MAP(2, 3) |
+                          SUN4I_TVE_EN_DAC_MAP(3, 4));
+
+       /* Set PAL settings */
+       regmap_write(tv->regs, SUN4I_TVE_CFG0_REG,
+                    tv_mode->mode |
+                    (tv_mode->yc_en ? SUN4I_TVE_CFG0_YC_EN : 0) |
+                    SUN4I_TVE_CFG0_COMP_EN |
+                    SUN4I_TVE_CFG0_DAC_CONTROL_54M |
+                    SUN4I_TVE_CFG0_CORE_DATAPATH_54M |
+                    SUN4I_TVE_CFG0_CORE_CONTROL_54M);
+
+       /* Configure the DAC for a composite output */
+       regmap_write(tv->regs, SUN4I_TVE_DAC0_REG,
+                    SUN4I_TVE_DAC0_DAC_EN(0) |
+                    (tv_mode->dac3_en ? SUN4I_TVE_DAC0_DAC_EN(3) : 0) |
+                    SUN4I_TVE_DAC0_INTERNAL_DAC_37_5_OHMS |
+                    SUN4I_TVE_DAC0_CHROMA_0_75 |
+                    SUN4I_TVE_DAC0_LUMA_0_4 |
+                    SUN4I_TVE_DAC0_CLOCK_INVERT |
+                    (tv_mode->dac_bit25_en ? BIT(25) : 0) |
+                    BIT(30));
+
+       /* Configure the sample delay between DAC0 and the other DAC */
+       regmap_write(tv->regs, SUN4I_TVE_NOTCH_REG,
+                    SUN4I_TVE_NOTCH_DAC0_TO_DAC_DLY(1, 0) |
+                    SUN4I_TVE_NOTCH_DAC0_TO_DAC_DLY(2, 0));
+
+       regmap_write(tv->regs, SUN4I_TVE_CHROMA_FREQ_REG,
+                    tv_mode->chroma_freq);
+
+       /* Set the front and back porch */
+       regmap_write(tv->regs, SUN4I_TVE_PORCH_REG,
+                    SUN4I_TVE_PORCH_BACK(tv_mode->back_porch) |
+                    SUN4I_TVE_PORCH_FRONT(tv_mode->front_porch));
+
+       /* Set the lines setup */
+       regmap_write(tv->regs, SUN4I_TVE_LINE_REG,
+                    SUN4I_TVE_LINE_FIRST(22) |
+                    SUN4I_TVE_LINE_NUMBER(tv_mode->line_number));
+
+       regmap_write(tv->regs, SUN4I_TVE_LEVEL_REG,
+                    SUN4I_TVE_LEVEL_BLANK(tv_mode->video_levels->blank) |
+                    SUN4I_TVE_LEVEL_BLACK(tv_mode->video_levels->black));
+
+       regmap_write(tv->regs, SUN4I_TVE_DAC1_REG,
+                    SUN4I_TVE_DAC1_AMPLITUDE(0, 0x18) |
+                    SUN4I_TVE_DAC1_AMPLITUDE(1, 0x18) |
+                    SUN4I_TVE_DAC1_AMPLITUDE(2, 0x18) |
+                    SUN4I_TVE_DAC1_AMPLITUDE(3, 0x18));
+
+       regmap_write(tv->regs, SUN4I_TVE_CB_CR_LVL_REG,
+                    SUN4I_TVE_CB_CR_LVL_CB_BURST(tv_mode->burst_levels->cb) |
+                    SUN4I_TVE_CB_CR_LVL_CR_BURST(tv_mode->burst_levels->cr));
+
+       /* Set burst width for a composite output */
+       regmap_write(tv->regs, SUN4I_TVE_BURST_WIDTH_REG,
+                    SUN4I_TVE_BURST_WIDTH_HSYNC_WIDTH(126) |
+                    SUN4I_TVE_BURST_WIDTH_BURST_WIDTH(68) |
+                    SUN4I_TVE_BURST_WIDTH_BREEZEWAY(22));
+
+       regmap_write(tv->regs, SUN4I_TVE_CB_CR_GAIN_REG,
+                    SUN4I_TVE_CB_CR_GAIN_CB(tv_mode->color_gains->cb) |
+                    SUN4I_TVE_CB_CR_GAIN_CR(tv_mode->color_gains->cr));
+
+       regmap_write(tv->regs, SUN4I_TVE_SYNC_VBI_REG,
+                    SUN4I_TVE_SYNC_VBI_SYNC(0x10) |
+                    SUN4I_TVE_SYNC_VBI_VBLANK(tv_mode->vblank_level));
+
+       regmap_write(tv->regs, SUN4I_TVE_ACTIVE_LINE_REG,
+                    SUN4I_TVE_ACTIVE_LINE(1440));
+
+       /* Set composite chroma gain to 50 % */
+       regmap_write(tv->regs, SUN4I_TVE_CHROMA_REG,
+                    SUN4I_TVE_CHROMA_COMP_GAIN_50);
+
+       regmap_write(tv->regs, SUN4I_TVE_12C_REG,
+                    SUN4I_TVE_12C_COMP_YUV_EN |
+                    SUN4I_TVE_12C_NOTCH_WIDTH_WIDE);
+
+       regmap_write(tv->regs, SUN4I_TVE_RESYNC_REG,
+                    SUN4I_TVE_RESYNC_PIXEL(tv_mode->resync_params->pixel) |
+                    SUN4I_TVE_RESYNC_LINE(tv_mode->resync_params->line) |
+                    (tv_mode->resync_params->field ?
+                     SUN4I_TVE_RESYNC_FIELD : 0));
+
+       regmap_write(tv->regs, SUN4I_TVE_SLAVE_REG, 0);
+
+       clk_set_rate(tcon->sclk1, mode->crtc_clock * 1000);
+}
+
+static struct drm_encoder_helper_funcs sun4i_tv_helper_funcs = {
+       .atomic_check   = sun4i_tv_atomic_check,
+       .disable        = sun4i_tv_disable,
+       .enable         = sun4i_tv_enable,
+       .mode_set       = sun4i_tv_mode_set,
+};
+
+static void sun4i_tv_destroy(struct drm_encoder *encoder)
+{
+       drm_encoder_cleanup(encoder);
+}
+
+static struct drm_encoder_funcs sun4i_tv_funcs = {
+       .destroy        = sun4i_tv_destroy,
+};
+
+static int sun4i_tv_comp_get_modes(struct drm_connector *connector)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
+               struct drm_display_mode *mode = drm_mode_create(connector->dev);
+               struct tv_mode *tv_mode = &tv_modes[i];
+
+               strcpy(mode->name, tv_mode->name);
+
+               sun4i_tv_mode_to_drm_mode(tv_mode, mode);
+               drm_mode_probed_add(connector, mode);
+       }
+
+       return i;
+}
+
+static int sun4i_tv_comp_mode_valid(struct drm_connector *connector,
+                                   struct drm_display_mode *mode)
+{
+       /* TODO */
+       return MODE_OK;
+}
+
+static struct drm_encoder *
+sun4i_tv_comp_best_encoder(struct drm_connector *connector)
+{
+       struct sun4i_tv *tv = drm_connector_to_sun4i_tv(connector);
+
+       return &tv->encoder;
+}
+
+static struct drm_connector_helper_funcs sun4i_tv_comp_connector_helper_funcs = {
+       .get_modes      = sun4i_tv_comp_get_modes,
+       .mode_valid     = sun4i_tv_comp_mode_valid,
+       .best_encoder   = sun4i_tv_comp_best_encoder,
+};
+
+static enum drm_connector_status
+sun4i_tv_comp_connector_detect(struct drm_connector *connector, bool force)
+{
+       return connector_status_connected;
+}
+
+static void
+sun4i_tv_comp_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_cleanup(connector);
+}
+
+static struct drm_connector_funcs sun4i_tv_comp_connector_funcs = {
+       .dpms                   = drm_atomic_helper_connector_dpms,
+       .detect                 = sun4i_tv_comp_connector_detect,
+       .fill_modes             = drm_helper_probe_single_connector_modes,
+       .destroy                = sun4i_tv_comp_connector_destroy,
+       .reset                  = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state   = drm_atomic_helper_connector_destroy_state,
+};
+
+static struct regmap_config sun4i_tv_regmap_config = {
+       .reg_bits       = 32,
+       .val_bits       = 32,
+       .reg_stride     = 4,
+       .max_register   = SUN4I_TVE_WSS_DATA2_REG,
+       .name           = "tv-encoder",
+};
+
+static int sun4i_tv_bind(struct device *dev, struct device *master,
+                        void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *drm = data;
+       struct sun4i_drv *drv = drm->dev_private;
+       struct sun4i_tv *tv;
+       struct resource *res;
+       void __iomem *regs;
+       int ret;
+
+       tv = devm_kzalloc(dev, sizeof(*tv), GFP_KERNEL);
+       if (!tv)
+               return -ENOMEM;
+       tv->drv = drv;
+       dev_set_drvdata(dev, tv);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       regs = devm_ioremap_resource(dev, res);
+       if (IS_ERR(regs)) {
+               dev_err(dev, "Couldn't map the TV encoder registers\n");
+               return PTR_ERR(regs);
+       }
+
+       tv->regs = devm_regmap_init_mmio(dev, regs,
+                                        &sun4i_tv_regmap_config);
+       if (IS_ERR(tv->regs)) {
+               dev_err(dev, "Couldn't create the TV encoder regmap\n");
+               return PTR_ERR(tv->regs);
+       }
+
+       tv->reset = devm_reset_control_get(dev, NULL);
+       if (IS_ERR(tv->reset)) {
+               dev_err(dev, "Couldn't get our reset line\n");
+               return PTR_ERR(tv->reset);
+       }
+
+       ret = reset_control_deassert(tv->reset);
+       if (ret) {
+               dev_err(dev, "Couldn't deassert our reset line\n");
+               return ret;
+       }
+
+       tv->clk = devm_clk_get(dev, NULL);
+       if (IS_ERR(tv->clk)) {
+               dev_err(dev, "Couldn't get the TV encoder clock\n");
+               ret = PTR_ERR(tv->clk);
+               goto err_assert_reset;
+       }
+       clk_prepare_enable(tv->clk);
+
+       drm_encoder_helper_add(&tv->encoder,
+                              &sun4i_tv_helper_funcs);
+       ret = drm_encoder_init(drm,
+                              &tv->encoder,
+                              &sun4i_tv_funcs,
+                              DRM_MODE_ENCODER_TVDAC,
+                              NULL);
+       if (ret) {
+               dev_err(dev, "Couldn't initialise the TV encoder\n");
+               goto err_disable_clk;
+       }
+
+       tv->encoder.possible_crtcs = BIT(0);
+
+       drm_connector_helper_add(&tv->connector,
+                                &sun4i_tv_comp_connector_helper_funcs);
+       ret = drm_connector_init(drm, &tv->connector,
+                                &sun4i_tv_comp_connector_funcs,
+                                DRM_MODE_CONNECTOR_Composite);
+       if (ret) {
+               dev_err(dev,
+                       "Couldn't initialise the Composite connector\n");
+               goto err_cleanup_connector;
+       }
+       tv->connector.interlace_allowed = true;
+
+       drm_mode_connector_attach_encoder(&tv->connector, &tv->encoder);
+
+       return 0;
+
+err_cleanup_connector:
+       drm_encoder_cleanup(&tv->encoder);
+err_disable_clk:
+       clk_disable_unprepare(tv->clk);
+err_assert_reset:
+       reset_control_assert(tv->reset);
+       return ret;
+}
+
+static void sun4i_tv_unbind(struct device *dev, struct device *master,
+                           void *data)
+{
+       struct sun4i_tv *tv = dev_get_drvdata(dev);
+
+       drm_connector_cleanup(&tv->connector);
+       drm_encoder_cleanup(&tv->encoder);
+       clk_disable_unprepare(tv->clk);
+}
+
+static struct component_ops sun4i_tv_ops = {
+       .bind   = sun4i_tv_bind,
+       .unbind = sun4i_tv_unbind,
+};
+
+static int sun4i_tv_probe(struct platform_device *pdev)
+{
+       return component_add(&pdev->dev, &sun4i_tv_ops);
+}
+
+static int sun4i_tv_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &sun4i_tv_ops);
+
+       return 0;
+}
+
+static const struct of_device_id sun4i_tv_of_table[] = {
+       { .compatible = "allwinner,sun4i-a10-tv-encoder" },
+       { }
+};
+MODULE_DEVICE_TABLE(of, sun4i_tv_of_table);
+
+static struct platform_driver sun4i_tv_platform_driver = {
+       .probe          = sun4i_tv_probe,
+       .remove         = sun4i_tv_remove,
+       .driver         = {
+               .name           = "sun4i-tve",
+               .of_match_table = sun4i_tv_of_table,
+       },
+};
+module_platform_driver(sun4i_tv_platform_driver);
+
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
+MODULE_DESCRIPTION("Allwinner A10 TV Encoder Driver");
+MODULE_LICENSE("GPL");
index fb2b4b0271a2a7a5f14587b9cd8a9a1d9b35ecb4..39940f5b7c91416e08cb61797798f9b2e0838ff7 100644 (file)
@@ -434,7 +434,7 @@ static void tegra_plane_reset(struct drm_plane *plane)
        struct tegra_plane_state *state;
 
        if (plane->state)
-               __drm_atomic_helper_plane_destroy_state(plane, plane->state);
+               __drm_atomic_helper_plane_destroy_state(plane->state);
 
        kfree(plane->state);
        plane->state = NULL;
@@ -466,7 +466,7 @@ static struct drm_plane_state *tegra_plane_atomic_duplicate_state(struct drm_pla
 static void tegra_plane_atomic_destroy_state(struct drm_plane *plane,
                                             struct drm_plane_state *state)
 {
-       __drm_atomic_helper_plane_destroy_state(plane, state);
+       __drm_atomic_helper_plane_destroy_state(state);
        kfree(state);
 }
 
@@ -998,7 +998,7 @@ static void tegra_crtc_reset(struct drm_crtc *crtc)
        struct tegra_dc_state *state;
 
        if (crtc->state)
-               __drm_atomic_helper_crtc_destroy_state(crtc, crtc->state);
+               __drm_atomic_helper_crtc_destroy_state(crtc->state);
 
        kfree(crtc->state);
        crtc->state = NULL;
@@ -1034,7 +1034,7 @@ tegra_crtc_atomic_duplicate_state(struct drm_crtc *crtc)
 static void tegra_crtc_atomic_destroy_state(struct drm_crtc *crtc,
                                            struct drm_crtc_state *state)
 {
-       __drm_atomic_helper_crtc_destroy_state(crtc, state);
+       __drm_atomic_helper_crtc_destroy_state(state);
        kfree(state);
 }
 
@@ -1722,7 +1722,6 @@ static int tegra_dc_init(struct host1x_client *client)
        if (err < 0)
                goto cleanup;
 
-       drm_mode_crtc_set_gamma_size(&dc->base, 256);
        drm_crtc_helper_add(&dc->base, &tegra_crtc_helper_funcs);
 
        /*
index 8e6b18caa706d207b0a1ef66e3a5299e54bc3e54..b59c3bf0df4443420a236f032d8af0c6345482d6 100644 (file)
@@ -74,7 +74,7 @@ static void tegra_atomic_work(struct work_struct *work)
 }
 
 static int tegra_atomic_commit(struct drm_device *drm,
-                              struct drm_atomic_state *state, bool async)
+                              struct drm_atomic_state *state, bool nonblock)
 {
        struct tegra_drm *tegra = drm->dev_private;
        int err;
@@ -83,7 +83,7 @@ static int tegra_atomic_commit(struct drm_device *drm,
        if (err)
                return err;
 
-       /* serialize outstanding asynchronous commits */
+       /* serialize outstanding nonblocking commits */
        mutex_lock(&tegra->commit.lock);
        flush_work(&tegra->commit.work);
 
@@ -95,7 +95,7 @@ static int tegra_atomic_commit(struct drm_device *drm,
 
        drm_atomic_helper_swap_state(drm, state);
 
-       if (async)
+       if (nonblock)
                tegra_atomic_schedule(tegra, state);
        else
                tegra_atomic_complete(tegra, state);
@@ -180,7 +180,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)
 
        /* syncpoints are used for full 32-bit hardware VBLANK counters */
        drm->max_vblank_count = 0xffffffff;
-       drm->vblank_disable_allowed = true;
 
        err = drm_vblank_init(drm, drm->mode_config.num_crtc);
        if (err < 0)
@@ -268,12 +267,12 @@ static void tegra_drm_lastclose(struct drm_device *drm)
 }
 
 static struct host1x_bo *
-host1x_bo_lookup(struct drm_device *drm, struct drm_file *file, u32 handle)
+host1x_bo_lookup(struct drm_file *file, u32 handle)
 {
        struct drm_gem_object *gem;
        struct tegra_bo *bo;
 
-       gem = drm_gem_object_lookup(drm, file, handle);
+       gem = drm_gem_object_lookup(file, handle);
        if (!gem)
                return NULL;
 
@@ -311,11 +310,11 @@ static int host1x_reloc_copy_from_user(struct host1x_reloc *dest,
        if (err < 0)
                return err;
 
-       dest->cmdbuf.bo = host1x_bo_lookup(drm, file, cmdbuf);
+       dest->cmdbuf.bo = host1x_bo_lookup(file, cmdbuf);
        if (!dest->cmdbuf.bo)
                return -ENOENT;
 
-       dest->target.bo = host1x_bo_lookup(drm, file, target);
+       dest->target.bo = host1x_bo_lookup(file, target);
        if (!dest->target.bo)
                return -ENOENT;
 
@@ -363,7 +362,7 @@ int tegra_drm_submit(struct tegra_drm_context *context,
                        goto fail;
                }
 
-               bo = host1x_bo_lookup(drm, file, cmdbuf.handle);
+               bo = host1x_bo_lookup(file, cmdbuf.handle);
                if (!bo) {
                        err = -ENOENT;
                        goto fail;
@@ -463,7 +462,7 @@ static int tegra_gem_mmap(struct drm_device *drm, void *data,
        struct drm_gem_object *gem;
        struct tegra_bo *bo;
 
-       gem = drm_gem_object_lookup(drm, file, args->handle);
+       gem = drm_gem_object_lookup(file, args->handle);
        if (!gem)
                return -EINVAL;
 
@@ -672,7 +671,7 @@ static int tegra_gem_set_tiling(struct drm_device *drm, void *data,
                return -EINVAL;
        }
 
-       gem = drm_gem_object_lookup(drm, file, args->handle);
+       gem = drm_gem_object_lookup(file, args->handle);
        if (!gem)
                return -ENOENT;
 
@@ -694,7 +693,7 @@ static int tegra_gem_get_tiling(struct drm_device *drm, void *data,
        struct tegra_bo *bo;
        int err = 0;
 
-       gem = drm_gem_object_lookup(drm, file, args->handle);
+       gem = drm_gem_object_lookup(file, args->handle);
        if (!gem)
                return -ENOENT;
 
@@ -736,7 +735,7 @@ static int tegra_gem_set_flags(struct drm_device *drm, void *data,
        if (args->flags & ~DRM_TEGRA_GEM_FLAGS)
                return -EINVAL;
 
-       gem = drm_gem_object_lookup(drm, file, args->handle);
+       gem = drm_gem_object_lookup(file, args->handle);
        if (!gem)
                return -ENOENT;
 
@@ -758,7 +757,7 @@ static int tegra_gem_get_flags(struct drm_device *drm, void *data,
        struct drm_gem_object *gem;
        struct tegra_bo *bo;
 
-       gem = drm_gem_object_lookup(drm, file, args->handle);
+       gem = drm_gem_object_lookup(file, args->handle);
        if (!gem)
                return -ENOENT;
 
@@ -878,7 +877,7 @@ static int tegra_debugfs_framebuffers(struct seq_file *s, void *data)
                seq_printf(s, "%3d: user size: %d x %d, depth %d, %d bpp, refcount %d\n",
                           fb->base.id, fb->width, fb->height, fb->depth,
                           fb->bits_per_pixel,
-                          atomic_read(&fb->refcount.refcount));
+                          drm_framebuffer_read_refcount(fb));
        }
 
        mutex_unlock(&drm->mode_config.fb_lock);
@@ -932,7 +931,7 @@ static struct drm_driver tegra_drm_driver = {
        .debugfs_cleanup = tegra_debugfs_cleanup,
 #endif
 
-       .gem_free_object = tegra_bo_free_object,
+       .gem_free_object_unlocked = tegra_bo_free_object,
        .gem_vm_ops = &tegra_bo_vm_ops,
 
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
index 44e1027991959df48ff6cfff074540d9de2bfb3b..d1239ebc190f4f2a33b8eb2c419bc18b171132cb 100644 (file)
@@ -745,13 +745,17 @@ static void tegra_dsi_soft_reset(struct tegra_dsi *dsi)
 
 static void tegra_dsi_connector_reset(struct drm_connector *connector)
 {
-       struct tegra_dsi_state *state =
-               kzalloc(sizeof(*state), GFP_KERNEL);
+       struct tegra_dsi_state *state = kzalloc(sizeof(*state), GFP_KERNEL);
 
-       if (state) {
+       if (!state)
+               return;
+
+       if (connector->state) {
+               __drm_atomic_helper_connector_destroy_state(connector->state);
                kfree(connector->state);
-               __drm_atomic_helper_connector_reset(connector, &state->base);
        }
+
+       __drm_atomic_helper_connector_reset(connector, &state->base);
 }
 
 static struct drm_connector_state *
@@ -764,6 +768,9 @@ tegra_dsi_connector_duplicate_state(struct drm_connector *connector)
        if (!copy)
                return NULL;
 
+       __drm_atomic_helper_connector_duplicate_state(connector,
+                                                     &copy->base);
+
        return &copy->base;
 }
 
index ca84de9ccb51fb626ea0d51b59f91e6501dc005a..1b12aa7a715e2eecd64232459366b4cafa8a8bff 100644 (file)
@@ -149,7 +149,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
                unsigned int height = cmd->height / (i ? vsub : 1);
                unsigned int size, bpp;
 
-               gem = drm_gem_object_lookup(drm, file, cmd->handles[i]);
+               gem = drm_gem_object_lookup(file, cmd->handles[i]);
                if (!gem) {
                        err = -ENXIO;
                        goto unreference;
index 3b0d8c392b707e93e56a0b391345d58d3a5eef4c..aa60d9909ea2d3df2c432ee82ea4575722b3619c 100644 (file)
@@ -401,7 +401,7 @@ int tegra_bo_dumb_map_offset(struct drm_file *file, struct drm_device *drm,
        struct drm_gem_object *gem;
        struct tegra_bo *bo;
 
-       gem = drm_gem_object_lookup(drm, file, handle);
+       gem = drm_gem_object_lookup(file, handle);
        if (!gem) {
                dev_err(drm->dev, "failed to lookup GEM object\n");
                return -EINVAL;
index 051e5e1b7ad61c2340fb618a4e873adc545d41c4..79027b1c64d32acfdcf969b8a2106fcbeebeb59b 100644 (file)
@@ -707,7 +707,7 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc)
                        event = tilcdc_crtc->event;
                        tilcdc_crtc->event = NULL;
                        if (event)
-                               drm_send_vblank_event(dev, 0, event);
+                               drm_crtc_send_vblank_event(crtc, event);
 
                        spin_unlock_irqrestore(&dev->event_lock, flags);
                }
index b433b9f040c984ff6e6703f33fa45601d8fac81d..f92325800f8a3e6309c9687dbbbbb28bc408ea9b 100644 (file)
@@ -2,9 +2,10 @@
 # Makefile for the drm device driver.  This driver provides support for the
 
 ccflags-y := -Iinclude/drm
-ttm-y := ttm_agp_backend.o ttm_memory.o ttm_tt.o ttm_bo.o \
+ttm-y := ttm_memory.o ttm_tt.o ttm_bo.o \
        ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
        ttm_object.o ttm_lock.o ttm_execbuf_util.o ttm_page_alloc.o \
        ttm_bo_manager.o ttm_page_alloc_dma.o
+ttm-$(CONFIG_AGP) += ttm_agp_backend.o
 
 obj-$(CONFIG_DRM_TTM) += ttm.o
index 764be36397fd2363d7bf9039574af51a6557136c..028ab6007873c443b6432e4fd5fe0a4ed09d866d 100644 (file)
@@ -34,7 +34,6 @@
 #include <drm/ttm/ttm_module.h>
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_page_alloc.h>
-#ifdef TTM_HAS_AGP
 #include <drm/ttm/ttm_placement.h>
 #include <linux/agp_backend.h>
 #include <linux/module.h>
@@ -148,5 +147,3 @@ void ttm_agp_tt_unpopulate(struct ttm_tt *ttm)
        ttm_pool_unpopulate(ttm);
 }
 EXPORT_SYMBOL(ttm_agp_tt_unpopulate);
-
-#endif
index e3daafa1be1322222a038adb450b90bc8b7be695..39386f50af876fd9494f9064384c5d050918d301 100644 (file)
@@ -164,7 +164,6 @@ static void ttm_bo_release_list(struct kref *list_kref)
 void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
 {
        struct ttm_bo_device *bdev = bo->bdev;
-       struct ttm_mem_type_manager *man;
 
        lockdep_assert_held(&bo->resv->lock.base);
 
@@ -172,12 +171,11 @@ void ttm_bo_add_to_lru(struct ttm_buffer_object *bo)
 
                BUG_ON(!list_empty(&bo->lru));
 
-               man = &bdev->man[bo->mem.mem_type];
-               list_add_tail(&bo->lru, &man->lru);
+               list_add(&bo->lru, bdev->driver->lru_tail(bo));
                kref_get(&bo->list_kref);
 
                if (bo->ttm && !(bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) {
-                       list_add_tail(&bo->swap, &bo->glob->swap_lru);
+                       list_add(&bo->swap, bdev->driver->swap_lru_tail(bo));
                        kref_get(&bo->list_kref);
                }
        }
@@ -186,8 +184,12 @@ EXPORT_SYMBOL(ttm_bo_add_to_lru);
 
 int ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
 {
+       struct ttm_bo_device *bdev = bo->bdev;
        int put_count = 0;
 
+       if (bdev->driver->lru_removal)
+               bdev->driver->lru_removal(bo);
+
        if (!list_empty(&bo->swap)) {
                list_del_init(&bo->swap);
                ++put_count;
@@ -197,11 +199,6 @@ int ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
                ++put_count;
        }
 
-       /*
-        * TODO: Add a driver hook to delete from
-        * driver-specific LRU's here.
-        */
-
        return put_count;
 }
 
@@ -230,16 +227,32 @@ EXPORT_SYMBOL(ttm_bo_del_sub_from_lru);
 
 void ttm_bo_move_to_lru_tail(struct ttm_buffer_object *bo)
 {
+       struct ttm_bo_device *bdev = bo->bdev;
        int put_count = 0;
 
        lockdep_assert_held(&bo->resv->lock.base);
 
+       if (bdev->driver->lru_removal)
+               bdev->driver->lru_removal(bo);
+
        put_count = ttm_bo_del_from_lru(bo);
        ttm_bo_list_ref_sub(bo, put_count, true);
        ttm_bo_add_to_lru(bo);
 }
 EXPORT_SYMBOL(ttm_bo_move_to_lru_tail);
 
+struct list_head *ttm_bo_default_lru_tail(struct ttm_buffer_object *bo)
+{
+       return bo->bdev->man[bo->mem.mem_type].lru.prev;
+}
+EXPORT_SYMBOL(ttm_bo_default_lru_tail);
+
+struct list_head *ttm_bo_default_swap_lru_tail(struct ttm_buffer_object *bo)
+{
+       return bo->glob->swap_lru.prev;
+}
+EXPORT_SYMBOL(ttm_bo_default_swap_lru_tail);
+
 /*
  * Call bo->mutex locked.
  */
@@ -443,10 +456,10 @@ static void ttm_bo_cleanup_refs_or_queue(struct ttm_buffer_object *bo)
        int ret;
 
        spin_lock(&glob->lru_lock);
-       ret = __ttm_bo_reserve(bo, false, true, false, NULL);
+       ret = __ttm_bo_reserve(bo, false, true, NULL);
 
        if (!ret) {
-               if (!ttm_bo_wait(bo, false, false, true)) {
+               if (!ttm_bo_wait(bo, false, true)) {
                        put_count = ttm_bo_del_from_lru(bo);
 
                        spin_unlock(&glob->lru_lock);
@@ -499,7 +512,7 @@ static int ttm_bo_cleanup_refs_and_unlock(struct ttm_buffer_object *bo,
        int put_count;
        int ret;
 
-       ret = ttm_bo_wait(bo, false, false, true);
+       ret = ttm_bo_wait(bo, false, true);
 
        if (ret && !no_wait_gpu) {
                long lret;
@@ -517,7 +530,7 @@ static int ttm_bo_cleanup_refs_and_unlock(struct ttm_buffer_object *bo,
                        return -EBUSY;
 
                spin_lock(&glob->lru_lock);
-               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
+               ret = __ttm_bo_reserve(bo, false, true, NULL);
 
                /*
                 * We raced, and lost, someone else holds the reservation now,
@@ -536,7 +549,7 @@ static int ttm_bo_cleanup_refs_and_unlock(struct ttm_buffer_object *bo,
                 * remove sync_obj with ttm_bo_wait, the wait should be
                 * finished, and no new wait object should have been added.
                 */
-               ret = ttm_bo_wait(bo, false, false, true);
+               ret = ttm_bo_wait(bo, false, true);
                WARN_ON(ret);
        }
 
@@ -586,11 +599,10 @@ static int ttm_bo_delayed_delete(struct ttm_bo_device *bdev, bool remove_all)
                        kref_get(&nentry->list_kref);
                }
 
-               ret = __ttm_bo_reserve(entry, false, true, false, NULL);
+               ret = __ttm_bo_reserve(entry, false, true, NULL);
                if (remove_all && ret) {
                        spin_unlock(&glob->lru_lock);
-                       ret = __ttm_bo_reserve(entry, false, false,
-                                              false, NULL);
+                       ret = __ttm_bo_reserve(entry, false, false, NULL);
                        spin_lock(&glob->lru_lock);
                }
 
@@ -676,7 +688,7 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
        struct ttm_placement placement;
        int ret = 0;
 
-       ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
+       ret = ttm_bo_wait(bo, interruptible, no_wait_gpu);
 
        if (unlikely(ret != 0)) {
                if (ret != -ERESTARTSYS) {
@@ -732,7 +744,7 @@ static int ttm_mem_evict_first(struct ttm_bo_device *bdev,
 
        spin_lock(&glob->lru_lock);
        list_for_each_entry(bo, &man->lru, lru) {
-               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
+               ret = __ttm_bo_reserve(bo, false, true, NULL);
                if (!ret) {
                        if (place && (place->fpfn || place->lpfn)) {
                                /* Don't evict this BO if it's outside of the
@@ -989,13 +1001,19 @@ static int ttm_bo_move_buffer(struct ttm_buffer_object *bo,
        lockdep_assert_held(&bo->resv->lock.base);
 
        /*
-        * FIXME: It's possible to pipeline buffer moves.
-        * Have the driver move function wait for idle when necessary,
-        * instead of doing it here.
+        * Don't wait for the BO on initial allocation. This is important when
+        * the BO has an imported reservation object.
         */
-       ret = ttm_bo_wait(bo, false, interruptible, no_wait_gpu);
-       if (ret)
-               return ret;
+       if (bo->mem.mem_type != TTM_PL_SYSTEM || bo->ttm != NULL) {
+               /*
+                * FIXME: It's possible to pipeline buffer moves.
+                * Have the driver move function wait for idle when necessary,
+                * instead of doing it here.
+                */
+               ret = ttm_bo_wait(bo, interruptible, no_wait_gpu);
+               if (ret)
+                       return ret;
+       }
        mem.num_pages = bo->num_pages;
        mem.size = mem.num_pages << PAGE_SHIFT;
        mem.page_alignment = bo->mem.page_alignment;
@@ -1206,7 +1224,7 @@ size_t ttm_bo_acc_size(struct ttm_bo_device *bdev,
        size_t size = 0;
 
        size += ttm_round_pot(struct_size);
-       size += PAGE_ALIGN(npages * sizeof(void *));
+       size += ttm_round_pot(npages * sizeof(void *));
        size += ttm_round_pot(sizeof(struct ttm_tt));
        return size;
 }
@@ -1220,8 +1238,7 @@ size_t ttm_bo_dma_acc_size(struct ttm_bo_device *bdev,
        size_t size = 0;
 
        size += ttm_round_pot(struct_size);
-       size += PAGE_ALIGN(npages * sizeof(void *));
-       size += PAGE_ALIGN(npages * sizeof(dma_addr_t));
+       size += ttm_round_pot(npages * (2*sizeof(void *) + sizeof(dma_addr_t)));
        size += ttm_round_pot(sizeof(struct ttm_dma_tt));
        return size;
 }
@@ -1500,7 +1517,6 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
        bdev->dev_mapping = mapping;
        bdev->glob = glob;
        bdev->need_dma32 = need_dma32;
-       bdev->val_seq = 0;
        mutex_lock(&glob->device_list_mutex);
        list_add_tail(&bdev->device_list, &glob->device_list);
        mutex_unlock(&glob->device_list_mutex);
@@ -1554,7 +1570,7 @@ void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo)
 EXPORT_SYMBOL(ttm_bo_unmap_virtual);
 
 int ttm_bo_wait(struct ttm_buffer_object *bo,
-               bool lazy, bool interruptible, bool no_wait)
+               bool interruptible, bool no_wait)
 {
        struct reservation_object_list *fobj;
        struct reservation_object *resv;
@@ -1609,10 +1625,10 @@ int ttm_bo_synccpu_write_grab(struct ttm_buffer_object *bo, bool no_wait)
         * Using ttm_bo_reserve makes sure the lru lists are updated.
         */
 
-       ret = ttm_bo_reserve(bo, true, no_wait, false, NULL);
+       ret = ttm_bo_reserve(bo, true, no_wait, NULL);
        if (unlikely(ret != 0))
                return ret;
-       ret = ttm_bo_wait(bo, false, true, no_wait);
+       ret = ttm_bo_wait(bo, true, no_wait);
        if (likely(ret == 0))
                atomic_inc(&bo->cpu_writers);
        ttm_bo_unreserve(bo);
@@ -1642,7 +1658,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
 
        spin_lock(&glob->lru_lock);
        list_for_each_entry(bo, &glob->swap_lru, swap) {
-               ret = __ttm_bo_reserve(bo, false, true, false, NULL);
+               ret = __ttm_bo_reserve(bo, false, true, NULL);
                if (!ret)
                        break;
        }
@@ -1669,7 +1685,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
         * Wait for GPU, then move to system cached.
         */
 
-       ret = ttm_bo_wait(bo, false, false, false);
+       ret = ttm_bo_wait(bo, false, false);
 
        if (unlikely(ret != 0))
                goto out;
@@ -1741,7 +1757,7 @@ int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo)
                return -ERESTARTSYS;
        if (!ww_mutex_is_locked(&bo->resv->lock))
                goto out_unlock;
-       ret = __ttm_bo_reserve(bo, true, false, false, NULL);
+       ret = __ttm_bo_reserve(bo, true, false, NULL);
        if (unlikely(ret != 0))
                goto out_unlock;
        __ttm_bo_unreserve(bo);
index ac6fe40b99f753b267a5e78647c0bdb2e078c5bd..d9831559706eb9312cf4803ac43e7113a6e41c5c 100644 (file)
@@ -645,7 +645,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
 
        reservation_object_add_excl_fence(bo->resv, fence);
        if (evict) {
-               ret = ttm_bo_wait(bo, false, false, false);
+               ret = ttm_bo_wait(bo, false, false);
                if (ret)
                        return ret;
 
index 06d26dc438b264dd76e7cbba28fd6b3d7c92fea3..3216878bced3d3debd16cca931589706de897795 100644 (file)
@@ -54,7 +54,7 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
        /*
         * Quick non-stalling check for idle.
         */
-       ret = ttm_bo_wait(bo, false, false, true);
+       ret = ttm_bo_wait(bo, false, true);
        if (likely(ret == 0))
                goto out_unlock;
 
@@ -68,14 +68,14 @@ static int ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
                        goto out_unlock;
 
                up_read(&vma->vm_mm->mmap_sem);
-               (void) ttm_bo_wait(bo, false, true, false);
+               (void) ttm_bo_wait(bo, true, false);
                goto out_unlock;
        }
 
        /*
         * Ordinary wait.
         */
-       ret = ttm_bo_wait(bo, false, true, false);
+       ret = ttm_bo_wait(bo, true, false);
        if (unlikely(ret != 0))
                ret = (ret != -ERESTARTSYS) ? VM_FAULT_SIGBUS :
                        VM_FAULT_NOPAGE;
@@ -108,7 +108,7 @@ static int ttm_bo_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
         * for reserve, and if it fails, retry the fault after waiting
         * for the buffer to become unreserved.
         */
-       ret = ttm_bo_reserve(bo, true, true, false, NULL);
+       ret = ttm_bo_reserve(bo, true, true, NULL);
        if (unlikely(ret != 0)) {
                if (ret != -EBUSY)
                        return VM_FAULT_NOPAGE;
index 3820ae97a03039cf0d95ee3b473642b589262299..a80717b35dc675cfd1e5c0d6da323073f471983d 100644 (file)
@@ -112,8 +112,7 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
        list_for_each_entry(entry, list, head) {
                struct ttm_buffer_object *bo = entry->bo;
 
-               ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), true,
-                                      ticket);
+               ret = __ttm_bo_reserve(bo, intr, (ticket == NULL), ticket);
                if (!ret && unlikely(atomic_read(&bo->cpu_writers) > 0)) {
                        __ttm_bo_unreserve(bo);
 
index 025c429050c06c4079f5b471128e499463abc753..a37de5db5731da0d46276bc396cabb73c63f6b03 100644 (file)
@@ -48,7 +48,7 @@
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_page_alloc.h>
 
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
 #include <asm/agp.h>
 #endif
 
@@ -219,7 +219,7 @@ static struct ttm_pool_manager *_manager;
 #ifndef CONFIG_X86
 static int set_pages_array_wb(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
@@ -230,7 +230,7 @@ static int set_pages_array_wb(struct page **pages, int addrinarray)
 
 static int set_pages_array_wc(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
@@ -241,7 +241,7 @@ static int set_pages_array_wc(struct page **pages, int addrinarray)
 
 static int set_pages_array_uc(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
index 624d941aaad163f6b81ddff616f9fa868f1c28ea..bef9f6feb635a45017835767545c3ec79b23b5e2 100644 (file)
@@ -50,7 +50,7 @@
 #include <linux/kthread.h>
 #include <drm/ttm/ttm_bo_driver.h>
 #include <drm/ttm/ttm_page_alloc.h>
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
 #include <asm/agp.h>
 #endif
 
@@ -271,7 +271,7 @@ static struct kobj_type ttm_pool_kobj_type = {
 #ifndef CONFIG_X86
 static int set_pages_array_wb(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
@@ -282,7 +282,7 @@ static int set_pages_array_wb(struct page **pages, int addrinarray)
 
 static int set_pages_array_wc(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
@@ -293,7 +293,7 @@ static int set_pages_array_wc(struct page **pages, int addrinarray)
 
 static int set_pages_array_uc(struct page **pages, int addrinarray)
 {
-#ifdef TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
        int i;
 
        for (i = 0; i < addrinarray; i++)
index 772ec9e1f590f5a0a01947b97ae3356829fd73da..c20408940cd0685eb1c32c45d0927980e560c8ab 100644 (file)
@@ -94,7 +94,7 @@ static void udl_usb_disconnect(struct usb_interface *interface)
        struct drm_device *dev = usb_get_intfdata(interface);
 
        drm_kms_helper_poll_disable(dev);
-       drm_connector_unplug_all(dev);
+       drm_connector_unregister_all(dev);
        udl_fbdev_unplug(dev);
        udl_drop_usb(dev);
        drm_unplug_dev(dev);
index 4a064efcea58718b2f6e9e45862f947d900d07a2..0b03d34ffdee8c4c569e46ad94a994f83d5c6418 100644 (file)
@@ -81,8 +81,6 @@ struct udl_framebuffer {
        struct drm_framebuffer base;
        struct udl_gem_object *obj;
        bool active_16; /* active on the 16-bit channel */
-       int x1, y1, x2, y2; /* dirty rect */
-       spinlock_t dirty_lock;
 };
 
 #define to_udl_fb(x) container_of(x, struct udl_framebuffer, base)
index fd1eb9d03f0b55751ae04568c53642a683a3e351..d5df555aeba026612aba00a6f4738d33f71249b5 100644 (file)
@@ -77,68 +77,6 @@ static uint16_t rgb16(uint32_t col)
 }
 #endif
 
-/*
- * NOTE: fb_defio.c is holding info->fbdefio.mutex
- *   Touching ANY framebuffer memory that triggers a page fault
- *   in fb_defio will cause a deadlock, when it also tries to
- *   grab the same mutex.
- */
-static void udlfb_dpy_deferred_io(struct fb_info *info,
-                                 struct list_head *pagelist)
-{
-       struct page *cur;
-       struct fb_deferred_io *fbdefio = info->fbdefio;
-       struct udl_fbdev *ufbdev = info->par;
-       struct drm_device *dev = ufbdev->ufb.base.dev;
-       struct udl_device *udl = dev->dev_private;
-       struct urb *urb;
-       char *cmd;
-       cycles_t start_cycles, end_cycles;
-       int bytes_sent = 0;
-       int bytes_identical = 0;
-       int bytes_rendered = 0;
-
-       if (!fb_defio)
-               return;
-
-       start_cycles = get_cycles();
-
-       urb = udl_get_urb(dev);
-       if (!urb)
-               return;
-
-       cmd = urb->transfer_buffer;
-
-       /* walk the written page list and render each to device */
-       list_for_each_entry(cur, &fbdefio->pagelist, lru) {
-
-               if (udl_render_hline(dev, (ufbdev->ufb.base.bits_per_pixel / 8),
-                                    &urb, (char *) info->fix.smem_start,
-                                    &cmd, cur->index << PAGE_SHIFT,
-                                    cur->index << PAGE_SHIFT,
-                                    PAGE_SIZE, &bytes_identical, &bytes_sent))
-                       goto error;
-               bytes_rendered += PAGE_SIZE;
-       }
-
-       if (cmd > (char *) urb->transfer_buffer) {
-               /* Send partial buffer remaining before exiting */
-               int len = cmd - (char *) urb->transfer_buffer;
-               udl_submit_urb(dev, urb, len);
-               bytes_sent += len;
-       } else
-               udl_urb_completion(urb);
-
-error:
-       atomic_add(bytes_sent, &udl->bytes_sent);
-       atomic_add(bytes_identical, &udl->bytes_identical);
-       atomic_add(bytes_rendered, &udl->bytes_rendered);
-       end_cycles = get_cycles();
-       atomic_add(((unsigned int) ((end_cycles - start_cycles)
-                   >> 10)), /* Kcycles */
-                  &udl->cpu_kcycles_used);
-}
-
 int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
                      int width, int height)
 {
@@ -152,9 +90,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
        struct urb *urb;
        int aligned_x;
        int bpp = (fb->base.bits_per_pixel / 8);
-       int x2, y2;
-       bool store_for_later = false;
-       unsigned long flags;
 
        if (!fb->active_16)
                return 0;
@@ -180,38 +115,6 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
            (y + height > fb->base.height))
                return -EINVAL;
 
-       /* if we are in atomic just store the info
-          can't test inside spin lock */
-       if (in_atomic())
-               store_for_later = true;
-
-       x2 = x + width - 1;
-       y2 = y + height - 1;
-
-       spin_lock_irqsave(&fb->dirty_lock, flags);
-
-       if (fb->y1 < y)
-               y = fb->y1;
-       if (fb->y2 > y2)
-               y2 = fb->y2;
-       if (fb->x1 < x)
-               x = fb->x1;
-       if (fb->x2 > x2)
-               x2 = fb->x2;
-
-       if (store_for_later) {
-               fb->x1 = x;
-               fb->x2 = x2;
-               fb->y1 = y;
-               fb->y2 = y2;
-               spin_unlock_irqrestore(&fb->dirty_lock, flags);
-               return 0;
-       }
-
-       fb->x1 = fb->y1 = INT_MAX;
-       fb->x2 = fb->y2 = 0;
-
-       spin_unlock_irqrestore(&fb->dirty_lock, flags);
        start_cycles = get_cycles();
 
        urb = udl_get_urb(dev);
@@ -219,14 +122,14 @@ int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
                return 0;
        cmd = urb->transfer_buffer;
 
-       for (i = y; i <= y2 ; i++) {
+       for (i = y; i < height ; i++) {
                const int line_offset = fb->base.pitches[0] * i;
                const int byte_offset = line_offset + (x * bpp);
                const int dev_byte_offset = (fb->base.width * bpp * i) + (x * bpp);
                if (udl_render_hline(dev, bpp, &urb,
                                     (char *) fb->obj->vmapping,
                                     &cmd, byte_offset, dev_byte_offset,
-                                    (x2 - x + 1) * bpp,
+                                    width * bpp,
                                     &bytes_identical, &bytes_sent))
                        goto error;
        }
@@ -283,36 +186,6 @@ static int udl_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
        return 0;
 }
 
-static void udl_fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
-{
-       struct udl_fbdev *ufbdev = info->par;
-
-       drm_fb_helper_sys_fillrect(info, rect);
-
-       udl_handle_damage(&ufbdev->ufb, rect->dx, rect->dy, rect->width,
-                         rect->height);
-}
-
-static void udl_fb_copyarea(struct fb_info *info, const struct fb_copyarea *region)
-{
-       struct udl_fbdev *ufbdev = info->par;
-
-       drm_fb_helper_sys_copyarea(info, region);
-
-       udl_handle_damage(&ufbdev->ufb, region->dx, region->dy, region->width,
-                         region->height);
-}
-
-static void udl_fb_imageblit(struct fb_info *info, const struct fb_image *image)
-{
-       struct udl_fbdev *ufbdev = info->par;
-
-       drm_fb_helper_sys_imageblit(info, image);
-
-       udl_handle_damage(&ufbdev->ufb, image->dx, image->dy, image->width,
-                         image->height);
-}
-
 /*
  * It's common for several clients to have framebuffer open simultaneously.
  * e.g. both fbcon and X. Makes things interesting.
@@ -339,7 +212,7 @@ static int udl_fb_open(struct fb_info *info, int user)
 
                if (fbdefio) {
                        fbdefio->delay = DL_DEFIO_WRITE_DELAY;
-                       fbdefio->deferred_io = udlfb_dpy_deferred_io;
+                       fbdefio->deferred_io = drm_fb_helper_deferred_io;
                }
 
                info->fbdefio = fbdefio;
@@ -379,9 +252,9 @@ static struct fb_ops udlfb_ops = {
        .owner = THIS_MODULE,
        .fb_check_var = drm_fb_helper_check_var,
        .fb_set_par = drm_fb_helper_set_par,
-       .fb_fillrect = udl_fb_fillrect,
-       .fb_copyarea = udl_fb_copyarea,
-       .fb_imageblit = udl_fb_imageblit,
+       .fb_fillrect = drm_fb_helper_sys_fillrect,
+       .fb_copyarea = drm_fb_helper_sys_copyarea,
+       .fb_imageblit = drm_fb_helper_sys_imageblit,
        .fb_pan_display = drm_fb_helper_pan_display,
        .fb_blank = drm_fb_helper_blank,
        .fb_setcmap = drm_fb_helper_setcmap,
@@ -458,7 +331,6 @@ udl_framebuffer_init(struct drm_device *dev,
 {
        int ret;
 
-       spin_lock_init(&ufb->dirty_lock);
        ufb->obj = obj;
        drm_helper_mode_fill_fb_struct(&ufb->base, mode_cmd);
        ret = drm_framebuffer_init(dev, &ufb->base, &udlfb_funcs);
@@ -628,7 +500,7 @@ udl_fb_user_fb_create(struct drm_device *dev,
        int ret;
        uint32_t size;
 
-       obj = drm_gem_object_lookup(dev, file, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(file, mode_cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);
 
index d7528e0d844244bfc1de19ed2f84cd42a3aea836..818e70712b18772c5f40233bf7dee01e88ff32a1 100644 (file)
@@ -217,7 +217,7 @@ int udl_gem_mmap(struct drm_file *file, struct drm_device *dev,
        int ret = 0;
 
        mutex_lock(&dev->struct_mutex);
-       obj = drm_gem_object_lookup(dev, file, handle);
+       obj = drm_gem_object_lookup(file, handle);
        if (obj == NULL) {
                ret = -ENOENT;
                goto unlock;
index 584810474e5b84b211a5cbda681ea04c41bc0055..e53df59cb139f25f8e6ae916bca93abf0c49e063 100644 (file)
@@ -5,6 +5,7 @@ config DRM_VC4
        select DRM_KMS_HELPER
        select DRM_KMS_CMA_HELPER
        select DRM_GEM_CMA_HELPER
+       select DRM_PANEL
        help
          Choose this option if you have a system that has a Broadcom
          VC4 GPU, such as the Raspberry Pi or other BCM2708/BCM2835.
index 4c6a99f0398c03ce5d83dea1ec3f7906a817bf89..fb77db755e0a29d8589860da82186c7a1f394c72 100644 (file)
@@ -7,6 +7,7 @@ vc4-y := \
        vc4_bo.o \
        vc4_crtc.o \
        vc4_drv.o \
+       vc4_dpi.o \
        vc4_kms.o \
        vc4_gem.o \
        vc4_hdmi.o \
index 9807bc9d296e33cb3c159d95ae09af778a21b71c..e5a9d3aaf45ff707a691e2b16b45da8f3bc6c177 100644 (file)
@@ -457,7 +457,7 @@ int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,
        struct drm_vc4_mmap_bo *args = data;
        struct drm_gem_object *gem_obj;
 
-       gem_obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       gem_obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!gem_obj) {
                DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
                return -EINVAL;
index 355ee4b091b3542d6b51c33702c043179571dbba..904d0754ad78928fc4090b1121ae7537edf14147 100644 (file)
@@ -49,6 +49,10 @@ struct vc4_crtc {
        /* Which HVS channel we're using for our CRTC. */
        int channel;
 
+       u8 lut_r[256];
+       u8 lut_g[256];
+       u8 lut_b[256];
+
        struct drm_pending_vblank_event *event;
 };
 
@@ -147,6 +151,46 @@ static void vc4_crtc_destroy(struct drm_crtc *crtc)
        drm_crtc_cleanup(crtc);
 }
 
+static void
+vc4_crtc_lut_load(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       u32 i;
+
+       /* The LUT memory is laid out with each HVS channel in order,
+        * each of which takes 256 writes for R, 256 for G, then 256
+        * for B.
+        */
+       HVS_WRITE(SCALER_GAMADDR,
+                 SCALER_GAMADDR_AUTOINC |
+                 (vc4_crtc->channel * 3 * crtc->gamma_size));
+
+       for (i = 0; i < crtc->gamma_size; i++)
+               HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_r[i]);
+       for (i = 0; i < crtc->gamma_size; i++)
+               HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_g[i]);
+       for (i = 0; i < crtc->gamma_size; i++)
+               HVS_WRITE(SCALER_GAMDATA, vc4_crtc->lut_b[i]);
+}
+
+static void
+vc4_crtc_gamma_set(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
+                  uint32_t start, uint32_t size)
+{
+       struct vc4_crtc *vc4_crtc = to_vc4_crtc(crtc);
+       u32 i;
+
+       for (i = start; i < start + size; i++) {
+               vc4_crtc->lut_r[i] = r[i] >> 8;
+               vc4_crtc->lut_g[i] = g[i] >> 8;
+               vc4_crtc->lut_b[i] = b[i] >> 8;
+       }
+
+       vc4_crtc_lut_load(crtc);
+}
+
 static u32 vc4_get_fifo_full_level(u32 format)
 {
        static const u32 fifo_len_bytes = 64;
@@ -260,8 +304,14 @@ static void vc4_crtc_mode_set_nofb(struct drm_crtc *crtc)
 
        HVS_WRITE(SCALER_DISPBKGNDX(vc4_crtc->channel),
                  SCALER_DISPBKGND_AUTOHS |
+                 SCALER_DISPBKGND_GAMMA |
                  (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
 
+       /* Reload the LUT, since the SRAMs would have been disabled if
+        * all CRTCs had SCALER_DISPBKGND_GAMMA unset at once.
+        */
+       vc4_crtc_lut_load(crtc);
+
        if (debug_dump_regs) {
                DRM_INFO("CRTC %d regs after:\n", drm_crtc_index(crtc));
                vc4_crtc_dump_regs(vc4_crtc);
@@ -600,7 +650,7 @@ static void vc4_crtc_destroy_state(struct drm_crtc *crtc,
 
        }
 
-       __drm_atomic_helper_crtc_destroy_state(crtc, state);
+       __drm_atomic_helper_crtc_destroy_state(state);
 }
 
 static const struct drm_crtc_funcs vc4_crtc_funcs = {
@@ -613,6 +663,7 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = {
        .reset = drm_atomic_helper_crtc_reset,
        .atomic_duplicate_state = vc4_crtc_duplicate_state,
        .atomic_destroy_state = vc4_crtc_destroy_state,
+       .gamma_set = vc4_crtc_gamma_set,
 };
 
 static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
@@ -711,6 +762,7 @@ static int vc4_crtc_bind(struct device *dev, struct device *master, void *data)
        primary_plane->crtc = crtc;
        vc4->crtc[drm_crtc_index(crtc)] = vc4_crtc;
        vc4_crtc->channel = vc4_crtc->data->hvs_channel;
+       drm_mode_crtc_set_gamma_size(crtc, ARRAY_SIZE(vc4_crtc->lut_r));
 
        /* Set up some arbitrary number of planes.  We're not limited
         * by a set number of physical registers, just the space in
@@ -751,6 +803,12 @@ static int vc4_crtc_bind(struct device *dev, struct device *master, void *data)
 
        vc4_set_crtc_possible_masks(drm, crtc);
 
+       for (i = 0; i < crtc->gamma_size; i++) {
+               vc4_crtc->lut_r[i] = i;
+               vc4_crtc->lut_g[i] = i;
+               vc4_crtc->lut_b[i] = i;
+       }
+
        platform_set_drvdata(pdev, vc4_crtc);
 
        return 0;
index d76ad10b07fda3bb674f45c2151e621c60633364..245115d49c46a1244ef3e460a03fde397f763de8 100644 (file)
@@ -17,6 +17,7 @@
 
 static const struct drm_info_list vc4_debugfs_list[] = {
        {"bo_stats", vc4_bo_stats_debugfs, 0},
+       {"dpi_regs", vc4_dpi_debugfs_regs, 0},
        {"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
        {"hvs_regs", vc4_hvs_debugfs_regs, 0},
        {"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0},
diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c
new file mode 100644 (file)
index 0000000..9817dbf
--- /dev/null
@@ -0,0 +1,520 @@
+/*
+ * Copyright (C) 2016 Broadcom Limited
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * DOC: VC4 DPI module
+ *
+ * The VC4 DPI hardware supports MIPI DPI type 4 and Nokia ViSSI
+ * signals, which are routed out to GPIO0-27 with the ALT2 function.
+ */
+
+#include "drm_atomic_helper.h"
+#include "drm_crtc_helper.h"
+#include "drm_edid.h"
+#include "drm_panel.h"
+#include "linux/clk.h"
+#include "linux/component.h"
+#include "linux/of_graph.h"
+#include "linux/of_platform.h"
+#include "vc4_drv.h"
+#include "vc4_regs.h"
+
+#define DPI_C                  0x00
+# define DPI_OUTPUT_ENABLE_MODE                BIT(16)
+
+/* The order field takes the incoming 24 bit RGB from the pixel valve
+ * and shuffles the 3 channels.
+ */
+# define DPI_ORDER_MASK                        VC4_MASK(15, 14)
+# define DPI_ORDER_SHIFT               14
+# define DPI_ORDER_RGB                 0
+# define DPI_ORDER_BGR                 1
+# define DPI_ORDER_GRB                 2
+# define DPI_ORDER_BRG                 3
+
+/* The format field takes the ORDER-shuffled pixel valve data and
+ * formats it onto the output lines.
+ */
+# define DPI_FORMAT_MASK               VC4_MASK(13, 11)
+# define DPI_FORMAT_SHIFT              11
+/* This define is named in the hardware, but actually just outputs 0. */
+# define DPI_FORMAT_9BIT_666_RGB       0
+/* Outputs 00000000rrrrrggggggbbbbb */
+# define DPI_FORMAT_16BIT_565_RGB_1    1
+/* Outputs 000rrrrr00gggggg000bbbbb */
+# define DPI_FORMAT_16BIT_565_RGB_2    2
+/* Outputs 00rrrrr000gggggg00bbbbb0 */
+# define DPI_FORMAT_16BIT_565_RGB_3    3
+/* Outputs 000000rrrrrrggggggbbbbbb */
+# define DPI_FORMAT_18BIT_666_RGB_1    4
+/* Outputs 00rrrrrr00gggggg00bbbbbb */
+# define DPI_FORMAT_18BIT_666_RGB_2    5
+/* Outputs rrrrrrrrggggggggbbbbbbbb */
+# define DPI_FORMAT_24BIT_888_RGB      6
+
+/* Reverses the polarity of the corresponding signal */
+# define DPI_PIXEL_CLK_INVERT          BIT(10)
+# define DPI_HSYNC_INVERT              BIT(9)
+# define DPI_VSYNC_INVERT              BIT(8)
+# define DPI_OUTPUT_ENABLE_INVERT      BIT(7)
+
+/* Outputs the signal the falling clock edge instead of rising. */
+# define DPI_HSYNC_NEGATE              BIT(6)
+# define DPI_VSYNC_NEGATE              BIT(5)
+# define DPI_OUTPUT_ENABLE_NEGATE      BIT(4)
+
+/* Disables the signal */
+# define DPI_HSYNC_DISABLE             BIT(3)
+# define DPI_VSYNC_DISABLE             BIT(2)
+# define DPI_OUTPUT_ENABLE_DISABLE     BIT(1)
+
+/* Power gate to the device, full reset at 0 -> 1 transition */
+# define DPI_ENABLE                    BIT(0)
+
+/* All other registers besides DPI_C return the ID */
+#define DPI_ID                 0x04
+# define DPI_ID_VALUE          0x00647069
+
+/* General DPI hardware state. */
+struct vc4_dpi {
+       struct platform_device *pdev;
+
+       struct drm_encoder *encoder;
+       struct drm_connector *connector;
+       struct drm_panel *panel;
+
+       void __iomem *regs;
+
+       struct clk *pixel_clock;
+       struct clk *core_clock;
+};
+
+#define DPI_READ(offset) readl(dpi->regs + (offset))
+#define DPI_WRITE(offset, val) writel(val, dpi->regs + (offset))
+
+/* VC4 DPI encoder KMS struct */
+struct vc4_dpi_encoder {
+       struct vc4_encoder base;
+       struct vc4_dpi *dpi;
+};
+
+static inline struct vc4_dpi_encoder *
+to_vc4_dpi_encoder(struct drm_encoder *encoder)
+{
+       return container_of(encoder, struct vc4_dpi_encoder, base.base);
+}
+
+/* VC4 DPI connector KMS struct */
+struct vc4_dpi_connector {
+       struct drm_connector base;
+       struct vc4_dpi *dpi;
+
+       /* Since the connector is attached to just the one encoder,
+        * this is the reference to it so we can do the best_encoder()
+        * hook.
+        */
+       struct drm_encoder *encoder;
+};
+
+static inline struct vc4_dpi_connector *
+to_vc4_dpi_connector(struct drm_connector *connector)
+{
+       return container_of(connector, struct vc4_dpi_connector, base);
+}
+
+#define DPI_REG(reg) { reg, #reg }
+static const struct {
+       u32 reg;
+       const char *name;
+} dpi_regs[] = {
+       DPI_REG(DPI_C),
+       DPI_REG(DPI_ID),
+};
+
+static void vc4_dpi_dump_regs(struct vc4_dpi *dpi)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
+               DRM_INFO("0x%04x (%s): 0x%08x\n",
+                        dpi_regs[i].reg, dpi_regs[i].name,
+                        DPI_READ(dpi_regs[i].reg));
+       }
+}
+
+#ifdef CONFIG_DEBUG_FS
+int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused)
+{
+       struct drm_info_node *node = (struct drm_info_node *)m->private;
+       struct drm_device *dev = node->minor->dev;
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       struct vc4_dpi *dpi = vc4->dpi;
+       int i;
+
+       if (!dpi)
+               return 0;
+
+       for (i = 0; i < ARRAY_SIZE(dpi_regs); i++) {
+               seq_printf(m, "%s (0x%04x): 0x%08x\n",
+                          dpi_regs[i].name, dpi_regs[i].reg,
+                          DPI_READ(dpi_regs[i].reg));
+       }
+
+       return 0;
+}
+#endif
+
+static enum drm_connector_status
+vc4_dpi_connector_detect(struct drm_connector *connector, bool force)
+{
+       struct vc4_dpi_connector *vc4_connector =
+               to_vc4_dpi_connector(connector);
+       struct vc4_dpi *dpi = vc4_connector->dpi;
+
+       if (dpi->panel)
+               return connector_status_connected;
+       else
+               return connector_status_disconnected;
+}
+
+static void vc4_dpi_connector_destroy(struct drm_connector *connector)
+{
+       drm_connector_unregister(connector);
+       drm_connector_cleanup(connector);
+}
+
+static int vc4_dpi_connector_get_modes(struct drm_connector *connector)
+{
+       struct vc4_dpi_connector *vc4_connector =
+               to_vc4_dpi_connector(connector);
+       struct vc4_dpi *dpi = vc4_connector->dpi;
+
+       if (dpi->panel)
+               return drm_panel_get_modes(dpi->panel);
+
+       return 0;
+}
+
+static struct drm_encoder *
+vc4_dpi_connector_best_encoder(struct drm_connector *connector)
+{
+       struct vc4_dpi_connector *dpi_connector =
+               to_vc4_dpi_connector(connector);
+       return dpi_connector->encoder;
+}
+
+static const struct drm_connector_funcs vc4_dpi_connector_funcs = {
+       .dpms = drm_atomic_helper_connector_dpms,
+       .detect = vc4_dpi_connector_detect,
+       .fill_modes = drm_helper_probe_single_connector_modes,
+       .destroy = vc4_dpi_connector_destroy,
+       .reset = drm_atomic_helper_connector_reset,
+       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
+       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
+};
+
+static const struct drm_connector_helper_funcs vc4_dpi_connector_helper_funcs = {
+       .get_modes = vc4_dpi_connector_get_modes,
+       .best_encoder = vc4_dpi_connector_best_encoder,
+};
+
+static struct drm_connector *vc4_dpi_connector_init(struct drm_device *dev,
+                                                   struct vc4_dpi *dpi)
+{
+       struct drm_connector *connector = NULL;
+       struct vc4_dpi_connector *dpi_connector;
+       int ret = 0;
+
+       dpi_connector = devm_kzalloc(dev->dev, sizeof(*dpi_connector),
+                                    GFP_KERNEL);
+       if (!dpi_connector) {
+               ret = -ENOMEM;
+               goto fail;
+       }
+       connector = &dpi_connector->base;
+
+       dpi_connector->encoder = dpi->encoder;
+       dpi_connector->dpi = dpi;
+
+       drm_connector_init(dev, connector, &vc4_dpi_connector_funcs,
+                          DRM_MODE_CONNECTOR_DPI);
+       drm_connector_helper_add(connector, &vc4_dpi_connector_helper_funcs);
+
+       connector->polled = 0;
+       connector->interlace_allowed = 0;
+       connector->doublescan_allowed = 0;
+
+       drm_mode_connector_attach_encoder(connector, dpi->encoder);
+
+       return connector;
+
+ fail:
+       if (connector)
+               vc4_dpi_connector_destroy(connector);
+
+       return ERR_PTR(ret);
+}
+
+static const struct drm_encoder_funcs vc4_dpi_encoder_funcs = {
+       .destroy = drm_encoder_cleanup,
+};
+
+static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)
+{
+       struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
+       struct vc4_dpi *dpi = vc4_encoder->dpi;
+
+       drm_panel_disable(dpi->panel);
+
+       clk_disable_unprepare(dpi->pixel_clock);
+
+       drm_panel_unprepare(dpi->panel);
+}
+
+static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
+{
+       struct drm_display_mode *mode = &encoder->crtc->mode;
+       struct vc4_dpi_encoder *vc4_encoder = to_vc4_dpi_encoder(encoder);
+       struct vc4_dpi *dpi = vc4_encoder->dpi;
+       u32 dpi_c = DPI_ENABLE | DPI_OUTPUT_ENABLE_MODE;
+       int ret;
+
+       ret = drm_panel_prepare(dpi->panel);
+       if (ret) {
+               DRM_ERROR("Panel failed to prepare\n");
+               return;
+       }
+
+       if (dpi->connector->display_info.num_bus_formats) {
+               u32 bus_format = dpi->connector->display_info.bus_formats[0];
+
+               switch (bus_format) {
+               case MEDIA_BUS_FMT_RGB888_1X24:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+                                              DPI_FORMAT);
+                       break;
+               case MEDIA_BUS_FMT_BGR888_1X24:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+                                              DPI_FORMAT);
+                       dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
+                       break;
+               case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+                                              DPI_FORMAT);
+                       break;
+               case MEDIA_BUS_FMT_RGB666_1X18:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+                                              DPI_FORMAT);
+                       break;
+               case MEDIA_BUS_FMT_RGB565_1X16:
+                       dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
+                                              DPI_FORMAT);
+                       break;
+               default:
+                       DRM_ERROR("Unknown media bus format %d\n", bus_format);
+                       break;
+               }
+       }
+
+       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+               dpi_c |= DPI_HSYNC_INVERT;
+       else if (!(mode->flags & DRM_MODE_FLAG_PHSYNC))
+               dpi_c |= DPI_HSYNC_DISABLE;
+
+       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+               dpi_c |= DPI_VSYNC_INVERT;
+       else if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
+               dpi_c |= DPI_VSYNC_DISABLE;
+
+       DPI_WRITE(DPI_C, dpi_c);
+
+       ret = clk_set_rate(dpi->pixel_clock, mode->clock * 1000);
+       if (ret)
+               DRM_ERROR("Failed to set clock rate: %d\n", ret);
+
+       ret = clk_prepare_enable(dpi->pixel_clock);
+       if (ret)
+               DRM_ERROR("Failed to set clock rate: %d\n", ret);
+
+       ret = drm_panel_enable(dpi->panel);
+       if (ret) {
+               DRM_ERROR("Panel failed to enable\n");
+               drm_panel_unprepare(dpi->panel);
+               return;
+       }
+}
+
+static const struct drm_encoder_helper_funcs vc4_dpi_encoder_helper_funcs = {
+       .disable = vc4_dpi_encoder_disable,
+       .enable = vc4_dpi_encoder_enable,
+};
+
+static const struct of_device_id vc4_dpi_dt_match[] = {
+       { .compatible = "brcm,bcm2835-dpi", .data = NULL },
+       {}
+};
+
+/* Walks the OF graph to find the panel node and then asks DRM to look
+ * up the panel.
+ */
+static struct drm_panel *vc4_dpi_get_panel(struct device *dev)
+{
+       struct device_node *endpoint, *panel_node;
+       struct device_node *np = dev->of_node;
+       struct drm_panel *panel;
+
+       endpoint = of_graph_get_next_endpoint(np, NULL);
+       if (!endpoint) {
+               dev_err(dev, "no endpoint to fetch DPI panel\n");
+               return NULL;
+       }
+
+       /* don't proceed if we have an endpoint but no panel_node tied to it */
+       panel_node = of_graph_get_remote_port_parent(endpoint);
+       of_node_put(endpoint);
+       if (!panel_node) {
+               dev_err(dev, "no valid panel node\n");
+               return NULL;
+       }
+
+       panel = of_drm_find_panel(panel_node);
+       of_node_put(panel_node);
+
+       return panel;
+}
+
+static int vc4_dpi_bind(struct device *dev, struct device *master, void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct drm_device *drm = dev_get_drvdata(master);
+       struct vc4_dev *vc4 = to_vc4_dev(drm);
+       struct vc4_dpi *dpi;
+       struct vc4_dpi_encoder *vc4_dpi_encoder;
+       int ret;
+
+       dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL);
+       if (!dpi)
+               return -ENOMEM;
+
+       vc4_dpi_encoder = devm_kzalloc(dev, sizeof(*vc4_dpi_encoder),
+                                      GFP_KERNEL);
+       if (!vc4_dpi_encoder)
+               return -ENOMEM;
+       vc4_dpi_encoder->base.type = VC4_ENCODER_TYPE_DPI;
+       vc4_dpi_encoder->dpi = dpi;
+       dpi->encoder = &vc4_dpi_encoder->base.base;
+
+       dpi->pdev = pdev;
+       dpi->regs = vc4_ioremap_regs(pdev, 0);
+       if (IS_ERR(dpi->regs))
+               return PTR_ERR(dpi->regs);
+
+       vc4_dpi_dump_regs(dpi);
+
+       if (DPI_READ(DPI_ID) != DPI_ID_VALUE) {
+               dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n",
+                       DPI_READ(DPI_ID), DPI_ID_VALUE);
+               return -ENODEV;
+       }
+
+       dpi->core_clock = devm_clk_get(dev, "core");
+       if (IS_ERR(dpi->core_clock)) {
+               ret = PTR_ERR(dpi->core_clock);
+               if (ret != -EPROBE_DEFER)
+                       DRM_ERROR("Failed to get core clock: %d\n", ret);
+               return ret;
+       }
+       dpi->pixel_clock = devm_clk_get(dev, "pixel");
+       if (IS_ERR(dpi->pixel_clock)) {
+               ret = PTR_ERR(dpi->pixel_clock);
+               if (ret != -EPROBE_DEFER)
+                       DRM_ERROR("Failed to get pixel clock: %d\n", ret);
+               return ret;
+       }
+
+       ret = clk_prepare_enable(dpi->core_clock);
+       if (ret)
+               DRM_ERROR("Failed to turn on core clock: %d\n", ret);
+
+       dpi->panel = vc4_dpi_get_panel(dev);
+
+       drm_encoder_init(drm, dpi->encoder, &vc4_dpi_encoder_funcs,
+                        DRM_MODE_ENCODER_DPI, NULL);
+       drm_encoder_helper_add(dpi->encoder, &vc4_dpi_encoder_helper_funcs);
+
+       dpi->connector = vc4_dpi_connector_init(drm, dpi);
+       if (IS_ERR(dpi->connector)) {
+               ret = PTR_ERR(dpi->connector);
+               goto err_destroy_encoder;
+       }
+
+       if (dpi->panel)
+               drm_panel_attach(dpi->panel, dpi->connector);
+
+       dev_set_drvdata(dev, dpi);
+
+       vc4->dpi = dpi;
+
+       return 0;
+
+err_destroy_encoder:
+       drm_encoder_cleanup(dpi->encoder);
+       clk_disable_unprepare(dpi->core_clock);
+       return ret;
+}
+
+static void vc4_dpi_unbind(struct device *dev, struct device *master,
+                          void *data)
+{
+       struct drm_device *drm = dev_get_drvdata(master);
+       struct vc4_dev *vc4 = to_vc4_dev(drm);
+       struct vc4_dpi *dpi = dev_get_drvdata(dev);
+
+       if (dpi->panel)
+               drm_panel_detach(dpi->panel);
+
+       vc4_dpi_connector_destroy(dpi->connector);
+       drm_encoder_cleanup(dpi->encoder);
+
+       clk_disable_unprepare(dpi->core_clock);
+
+       vc4->dpi = NULL;
+}
+
+static const struct component_ops vc4_dpi_ops = {
+       .bind   = vc4_dpi_bind,
+       .unbind = vc4_dpi_unbind,
+};
+
+static int vc4_dpi_dev_probe(struct platform_device *pdev)
+{
+       return component_add(&pdev->dev, &vc4_dpi_ops);
+}
+
+static int vc4_dpi_dev_remove(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &vc4_dpi_ops);
+       return 0;
+}
+
+struct platform_driver vc4_dpi_driver = {
+       .probe = vc4_dpi_dev_probe,
+       .remove = vc4_dpi_dev_remove,
+       .driver = {
+               .name = "vc4_dpi",
+               .of_match_table = vc4_dpi_dt_match,
+       },
+};
index 109b10651959dd3206c2b928acada78e157840bc..3446ece21b4ab4e2d38280ad0b2c5733207ffd20 100644 (file)
@@ -81,6 +81,7 @@ static struct drm_driver vc4_drm_driver = {
                            DRIVER_ATOMIC |
                            DRIVER_GEM |
                            DRIVER_HAVE_IRQ |
+                           DRIVER_RENDER |
                            DRIVER_PRIME),
        .lastclose = vc4_lastclose,
        .irq_handler = vc4_irq,
@@ -257,6 +258,7 @@ static const struct component_master_ops vc4_drm_ops = {
 
 static struct platform_driver *const component_drivers[] = {
        &vc4_hdmi_driver,
+       &vc4_dpi_driver,
        &vc4_crtc_driver,
        &vc4_hvs_driver,
        &vc4_v3d_driver,
index fa2ad15d4f62b8baea68e09b52f4edf1c70bb6b6..37cac59401d734e047f4cf41cc6a9ecb5bfc6dbc 100644 (file)
@@ -16,6 +16,7 @@ struct vc4_dev {
        struct vc4_hvs *hvs;
        struct vc4_crtc *crtc[3];
        struct vc4_v3d *v3d;
+       struct vc4_dpi *dpi;
 
        struct drm_fbdev_cma *fbdev;
 
@@ -422,6 +423,10 @@ void vc4_debugfs_cleanup(struct drm_minor *minor);
 /* vc4_drv.c */
 void __iomem *vc4_ioremap_regs(struct platform_device *dev, int index);
 
+/* vc4_dpi.c */
+extern struct platform_driver vc4_dpi_driver;
+int vc4_dpi_debugfs_regs(struct seq_file *m, void *unused);
+
 /* vc4_gem.c */
 void vc4_gem_init(struct drm_device *dev);
 void vc4_gem_destroy(struct drm_device *dev);
index 8d4384f8b78d2dbe88df720db6df67c0e1a31e53..46899d6de6753c28c7ca6c721119a28d72792148 100644 (file)
@@ -822,7 +822,7 @@ vc4_wait_bo_ioctl(struct drm_device *dev, void *data,
        if (args->pad != 0)
                return -EINVAL;
 
-       gem_obj = drm_gem_object_lookup(dev, file_priv, args->handle);
+       gem_obj = drm_gem_object_lookup(file_priv, args->handle);
        if (!gem_obj) {
                DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
                return -EINVAL;
index d8b864925fd38757cdc12e72d5ea102f32d2af09..fd2644d231ff867a4409840eba7f8234a4a1faba 100644 (file)
@@ -573,7 +573,7 @@ err_unprepare_hsm:
 err_unprepare_pix:
        clk_disable_unprepare(hdmi->pixel_clock);
 err_put_i2c:
-       put_device(&vc4->hdmi->ddc->dev);
+       put_device(&hdmi->ddc->dev);
 
        return ret;
 }
index 4718ae5176cc6813a033d12783c30af726d95756..cb37751bc99fcfe8976ced75f16ce4bd332c2406 100644 (file)
@@ -93,7 +93,7 @@ static struct vc4_commit *commit_init(struct drm_atomic_state *state)
  * vc4_atomic_commit - commit validated state object
  * @dev: DRM device
  * @state: the driver state object
- * @async: asynchronous commit
+ * @nonblock: nonblocking commit
  *
  * This function commits a with drm_atomic_helper_check() pre-validated state
  * object. This can still fail when e.g. the framebuffer reservation fails. For
@@ -104,7 +104,7 @@ static struct vc4_commit *commit_init(struct drm_atomic_state *state)
  */
 static int vc4_atomic_commit(struct drm_device *dev,
                             struct drm_atomic_state *state,
-                            bool async)
+                            bool nonblock)
 {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
        int ret;
@@ -170,7 +170,7 @@ static int vc4_atomic_commit(struct drm_device *dev,
         * current layout.
         */
 
-       if (async) {
+       if (nonblock) {
                vc4_queue_seqno_cb(dev, &c->cb, wait_seqno,
                                   vc4_atomic_complete_commit_seqno_cb);
        } else {
@@ -207,8 +207,6 @@ int vc4_kms_load(struct drm_device *dev)
        dev->mode_config.preferred_depth = 24;
        dev->mode_config.async_page_flip = true;
 
-       dev->vblank_disable_allowed = true;
-
        drm_mode_config_reset(dev);
 
        vc4->fbdev = drm_fbdev_cma_init(dev, 32,
index 7b0c72ae02a035f9f286a21cdb4a76b49f1ba155..4037b52fde31a2dbe4dec8c477751900d17411f2 100644 (file)
@@ -208,7 +208,7 @@ static void vc4_plane_destroy_state(struct drm_plane *plane,
        }
 
        kfree(vc4_state->dlist);
-       __drm_atomic_helper_plane_destroy_state(plane, &vc4_state->base);
+       __drm_atomic_helper_plane_destroy_state(&vc4_state->base);
        kfree(state);
 }
 
index bf42a8e87111f2e5fd3108209d0a3dc9ad3e871f..6163b95c54111bde8c20bfd8e2efd233cb90b6ae 100644 (file)
 #define SCALER_DISPBASE2                        0x0000006c
 #define SCALER_DISPALPHA2                       0x00000070
 #define SCALER_GAMADDR                          0x00000078
+# define SCALER_GAMADDR_AUTOINC                        BIT(31)
+/* Enables all gamma ramp SRAMs, not just those of CRTCs with gamma
+ * enabled.
+ */
+# define SCALER_GAMADDR_SRAMENB                        BIT(30)
+
 #define SCALER_GAMDATA                          0x000000e0
 #define SCALER_DLIST_START                      0x00002000
 #define SCALER_DLIST_SIZE                       0x00004000
index c503a840fd889fd5cea318a60266c21159eda9ca..341f9be3dde6edfbdccaf25a08382256f20cba0e 100644 (file)
@@ -89,7 +89,6 @@ int vgem_gem_get_pages(struct drm_vgem_gem_object *obj)
 static int vgem_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct drm_vgem_gem_object *obj = vma->vm_private_data;
-       struct drm_device *dev = obj->base.dev;
        loff_t num_pages;
        pgoff_t page_offset;
        int ret;
@@ -103,12 +102,8 @@ static int vgem_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
        if (page_offset > num_pages)
                return VM_FAULT_SIGBUS;
 
-       mutex_lock(&dev->struct_mutex);
-
        ret = vm_insert_page(vma, (unsigned long)vmf->virtual_address,
                             obj->pages[page_offset]);
-
-       mutex_unlock(&dev->struct_mutex);
        switch (ret) {
        case 0:
                return VM_FAULT_NOPAGE;
@@ -154,6 +149,10 @@ static struct drm_gem_object *vgem_gem_create(struct drm_device *dev,
        if (err)
                goto out;
 
+       err = vgem_gem_get_pages(obj);
+       if (err)
+               goto out;
+
        err = drm_gem_handle_create(file, gem_object, handle);
        if (err)
                goto handle_out;
@@ -201,37 +200,23 @@ int vgem_gem_dumb_map(struct drm_file *file, struct drm_device *dev,
        int ret = 0;
        struct drm_gem_object *obj;
 
-       mutex_lock(&dev->struct_mutex);
-       obj = drm_gem_object_lookup(dev, file, handle);
-       if (!obj) {
-               ret = -ENOENT;
-               goto unlock;
-       }
+       obj = drm_gem_object_lookup(file, handle);
+       if (!obj)
+               return -ENOENT;
 
-       if (!drm_vma_node_has_offset(&obj->vma_node)) {
-               ret = drm_gem_create_mmap_offset(obj);
-               if (ret)
-                       goto unref;
-       }
+       ret = drm_gem_create_mmap_offset(obj);
+       if (ret)
+               goto unref;
 
        BUG_ON(!obj->filp);
 
        obj->filp->private_data = obj;
 
-       ret = vgem_gem_get_pages(to_vgem_bo(obj));
-       if (ret)
-               goto fail_get_pages;
-
        *offset = drm_vma_node_offset_addr(&obj->vma_node);
 
-       goto unref;
-
-fail_get_pages:
-       drm_gem_free_mmap_offset(obj);
 unref:
-       drm_gem_object_unreference(obj);
-unlock:
-       mutex_unlock(&dev->struct_mutex);
+       drm_gem_object_unreference_unlocked(obj);
+
        return ret;
 }
 
index 5fd1fd06effc3567dd39740e837c4fdd1a4f59dc..d4305da88f44a3d28d8c6db5fad066eac52ebcf9 100644 (file)
 #define XRES_MAX  8192
 #define YRES_MAX  8192
 
-static void virtio_gpu_crtc_gamma_set(struct drm_crtc *crtc,
-                                     u16 *red, u16 *green, u16 *blue,
-                                     uint32_t start, uint32_t size)
-{
-       /* TODO */
-}
-
 static void
 virtio_gpu_hide_cursor(struct virtio_gpu_device *vgdev,
                       struct virtio_gpu_output *output)
@@ -75,7 +68,7 @@ static int virtio_gpu_crtc_cursor_set(struct drm_crtc *crtc,
        }
 
        /* lookup the cursor */
-       gobj = drm_gem_object_lookup(crtc->dev, file_priv, handle);
+       gobj = drm_gem_object_lookup(file_priv, handle);
        if (gobj == NULL)
                return -ENOENT;
 
@@ -173,7 +166,6 @@ static int virtio_gpu_page_flip(struct drm_crtc *crtc,
 static const struct drm_crtc_funcs virtio_gpu_crtc_funcs = {
        .cursor_set2            = virtio_gpu_crtc_cursor_set,
        .cursor_move            = virtio_gpu_crtc_cursor_move,
-       .gamma_set              = virtio_gpu_crtc_gamma_set,
        .set_config             = drm_atomic_helper_set_config,
        .destroy                = drm_crtc_cleanup,
 
@@ -428,7 +420,6 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
                return PTR_ERR(plane);
        drm_crtc_init_with_planes(dev, crtc, plane, NULL,
                                  &virtio_gpu_crtc_funcs, NULL);
-       drm_mode_crtc_set_gamma_size(crtc, 256);
        drm_crtc_helper_add(crtc, &virtio_gpu_crtc_helper_funcs);
        plane->crtc = crtc;
 
@@ -456,7 +447,7 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev,
        int ret;
 
        /* lookup object associated with res handle */
-       obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]);
+       obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[0]);
        if (!obj)
                return ERR_PTR(-EINVAL);
 
index 7f898cfdc7468c6697a50ede409749f3e89fa08b..3cc7afa77a35c1b40f7bc7836f4580126a9194af 100644 (file)
@@ -42,10 +42,8 @@ module_param_named(modeset, virtio_gpu_modeset, int, 0400);
 
 static int virtio_gpu_probe(struct virtio_device *vdev)
 {
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force() && virtio_gpu_modeset == -1)
                return -EINVAL;
-#endif
 
        if (virtio_gpu_modeset == 0)
                return -EINVAL;
index 8f486f4c70235d11891fefb0f17124c746c4cc1f..0a54f43f846a9d560d4b626872a86eecda1cdaf7 100644 (file)
@@ -400,7 +400,7 @@ static inline int virtio_gpu_object_reserve(struct virtio_gpu_object *bo,
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
        if (unlikely(r != 0)) {
                if (r != -ERESTARTSYS) {
                        struct virtio_gpu_device *qdev =
index 1feb7cee3f0d7a713dc06621cf1e41740da301af..336a57fd6d5d6821591b7f15b91b270a14d7c2f8 100644 (file)
@@ -130,7 +130,7 @@ int virtio_gpu_mode_dumb_mmap(struct drm_file *file_priv,
        struct drm_gem_object *gobj;
        struct virtio_gpu_object *obj;
        BUG_ON(!offset_p);
-       gobj = drm_gem_object_lookup(dev, file_priv, handle);
+       gobj = drm_gem_object_lookup(file_priv, handle);
        if (gobj == NULL)
                return -ENOENT;
        obj = gem_to_virtio_gpu_obj(gobj);
index b4de18e65db8d5b87dbbe5b9136d957a32cae7f0..c046903cb47ba535f10a5849adb86e5f06326c66 100644 (file)
@@ -133,8 +133,7 @@ static int virtio_gpu_execbuffer(struct drm_device *dev,
                }
 
                for (i = 0; i < exbuf->num_bo_handles; i++) {
-                       gobj = drm_gem_object_lookup(dev,
-                                                    drm_file, bo_handles[i]);
+                       gobj = drm_gem_object_lookup(drm_file, bo_handles[i]);
                        if (!gobj) {
                                drm_free_large(bo_handles);
                                drm_free_large(buflist);
@@ -345,7 +344,7 @@ static int virtio_gpu_resource_info_ioctl(struct drm_device *dev, void *data,
        struct drm_gem_object *gobj = NULL;
        struct virtio_gpu_object *qobj = NULL;
 
-       gobj = drm_gem_object_lookup(dev, file_priv, ri->bo_handle);
+       gobj = drm_gem_object_lookup(file_priv, ri->bo_handle);
        if (gobj == NULL)
                return -ENOENT;
 
@@ -374,7 +373,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
        if (vgdev->has_virgl_3d == false)
                return -ENOSYS;
 
-       gobj = drm_gem_object_lookup(dev, file, args->bo_handle);
+       gobj = drm_gem_object_lookup(file, args->bo_handle);
        if (gobj == NULL)
                return -ENOENT;
 
@@ -418,7 +417,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
        int ret;
        u32 offset = args->offset;
 
-       gobj = drm_gem_object_lookup(dev, file, args->bo_handle);
+       gobj = drm_gem_object_lookup(file, args->bo_handle);
        if (gobj == NULL)
                return -ENOENT;
 
@@ -464,7 +463,7 @@ static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data,
        int ret;
        bool nowait = false;
 
-       gobj = drm_gem_object_lookup(dev, file, args->handle);
+       gobj = drm_gem_object_lookup(file, args->handle);
        if (gobj == NULL)
                return -ENOENT;
 
index f300eba95bb1bff32ad8e9be2a8250779ec255b6..1483daebe057d099dcaf05cfe964b241efec12f9 100644 (file)
@@ -155,10 +155,10 @@ int virtio_gpu_object_wait(struct virtio_gpu_object *bo, bool no_wait)
 {
        int r;
 
-       r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
+       r = ttm_bo_reserve(&bo->tbo, true, no_wait, NULL);
        if (unlikely(r != 0))
                return r;
-       r = ttm_bo_wait(&bo->tbo, true, true, no_wait);
+       r = ttm_bo_wait(&bo->tbo, true, no_wait);
        ttm_bo_unreserve(&bo->tbo);
        return r;
 }
index 9fd924cd2b7fa2cd37df124a32818a20bffd8bab..a0580815629f52a4c6dc61a22ca330d977991570 100644 (file)
@@ -426,6 +426,8 @@ static struct ttm_bo_driver virtio_gpu_bo_driver = {
        .io_mem_free = &virtio_gpu_ttm_io_mem_free,
        .move_notify = &virtio_gpu_bo_move_notify,
        .swap_notify = &virtio_gpu_bo_swap_notify,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
 
 int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev)
index d281575bbe11ae090460d75fb371c8d49da1a36d..473d00451b0ffff514380beebb0a181b4f6a80fc 100644 (file)
@@ -8,6 +8,6 @@ vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
            vmwgfx_fence.o vmwgfx_dmabuf.o vmwgfx_scrn.o vmwgfx_context.o \
            vmwgfx_surface.o vmwgfx_prime.o vmwgfx_mob.o vmwgfx_shader.o \
            vmwgfx_cmdbuf_res.o vmwgfx_cmdbuf.o vmwgfx_stdu.o \
-           vmwgfx_cotable.o vmwgfx_so.o vmwgfx_binding.o
+           vmwgfx_cotable.o vmwgfx_so.o vmwgfx_binding.o vmwgfx_msg.o
 
 obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
index 3329f623c8bf7b89a4460287582b4f6b7fb204bd..78b75ee3c93141d0d7733636aac665ca9caa9f06 100644 (file)
@@ -839,7 +839,7 @@ static void vmw_move_notify(struct ttm_buffer_object *bo,
  */
 static void vmw_swap_notify(struct ttm_buffer_object *bo)
 {
-       ttm_bo_wait(bo, false, false, false);
+       ttm_bo_wait(bo, false, false);
 }
 
 
@@ -857,4 +857,6 @@ struct ttm_bo_driver vmw_bo_driver = {
        .fault_reserve_notify = &vmw_ttm_fault_reserve_notify,
        .io_mem_reserve = &vmw_ttm_io_mem_reserve,
        .io_mem_free = &vmw_ttm_io_mem_free,
+       .lru_tail = &ttm_bo_default_lru_tail,
+       .swap_lru_tail = &ttm_bo_default_swap_lru_tail,
 };
index 092ea81eeff7116266caba8012fb2bc4fe38e42a..265c81e6cf39412c8e9f7bea114fda72fa282e74 100644 (file)
@@ -421,9 +421,9 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
        }
 
        bo = &buf->base;
-       WARN_ON_ONCE(ttm_bo_reserve(bo, false, true, false, NULL));
+       WARN_ON_ONCE(ttm_bo_reserve(bo, false, true, NULL));
 
-       ret = ttm_bo_wait(old_bo, false, false, false);
+       ret = ttm_bo_wait(old_bo, false, false);
        if (unlikely(ret != 0)) {
                DRM_ERROR("Failed waiting for cotable unbind.\n");
                goto out_wait;
index 299925a1f6c6783716ecacf6b70b9979b4646427..9b078a4939968d8521a96b3f83280f4f06b407bc 100644 (file)
@@ -56,7 +56,7 @@ int vmw_dmabuf_pin_in_placement(struct vmw_private *dev_priv,
 
        vmw_execbuf_release_pinned_bo(dev_priv);
 
-       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
+       ret = ttm_bo_reserve(bo, interruptible, false, NULL);
        if (unlikely(ret != 0))
                goto err;
 
@@ -98,7 +98,7 @@ int vmw_dmabuf_pin_in_vram_or_gmr(struct vmw_private *dev_priv,
 
        vmw_execbuf_release_pinned_bo(dev_priv);
 
-       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
+       ret = ttm_bo_reserve(bo, interruptible, false, NULL);
        if (unlikely(ret != 0))
                goto err;
 
@@ -174,7 +174,7 @@ int vmw_dmabuf_pin_in_start_of_vram(struct vmw_private *dev_priv,
                return ret;
 
        vmw_execbuf_release_pinned_bo(dev_priv);
-       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
+       ret = ttm_bo_reserve(bo, interruptible, false, NULL);
        if (unlikely(ret != 0))
                goto err_unlock;
 
@@ -225,7 +225,7 @@ int vmw_dmabuf_unpin(struct vmw_private *dev_priv,
        if (unlikely(ret != 0))
                return ret;
 
-       ret = ttm_bo_reserve(bo, interruptible, false, false, NULL);
+       ret = ttm_bo_reserve(bo, interruptible, false, NULL);
        if (unlikely(ret != 0))
                goto err;
 
index 6cbb7d4bdd11dd329010d452ffad8e6b525bb8e8..9fcd8200d485e61aae3ff8a0cbf4fd4289a6d54b 100644 (file)
@@ -1,6 +1,6 @@
 /**************************************************************************
  *
- * Copyright © 2009-2015 VMware, Inc., Palo Alto, CA., USA
+ * Copyright © 2009-2016 VMware, Inc., Palo Alto, CA., USA
  * All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
 #define VMW_MIN_INITIAL_WIDTH 800
 #define VMW_MIN_INITIAL_HEIGHT 600
 
+#ifndef VMWGFX_GIT_VERSION
+#define VMWGFX_GIT_VERSION "Unknown"
+#endif
+
+#define VMWGFX_REPO "In Tree"
+
 
 /**
  * Fully encoded drm commands. Might move to vmw_drm.h
@@ -326,7 +332,7 @@ static int vmw_dummy_query_bo_create(struct vmw_private *dev_priv)
        if (unlikely(ret != 0))
                return ret;
 
-       ret = ttm_bo_reserve(&vbo->base, false, true, false, NULL);
+       ret = ttm_bo_reserve(&vbo->base, false, true, NULL);
        BUG_ON(ret != 0);
        vmw_bo_pin_reserved(vbo, true);
 
@@ -613,6 +619,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        uint32_t svga_id;
        enum vmw_res_type i;
        bool refuse_dma = false;
+       char host_log[100] = {0};
 
        dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
        if (unlikely(dev_priv == NULL)) {
@@ -628,6 +635,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
        mutex_init(&dev_priv->cmdbuf_mutex);
        mutex_init(&dev_priv->release_mutex);
        mutex_init(&dev_priv->binding_mutex);
+       mutex_init(&dev_priv->global_kms_state_mutex);
        rwlock_init(&dev_priv->resource_lock);
        ttm_lock_init(&dev_priv->reservation_sem);
        spin_lock_init(&dev_priv->hw_lock);
@@ -873,6 +881,16 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
 
        DRM_INFO("DX: %s\n", dev_priv->has_dx ? "yes." : "no.");
 
+       snprintf(host_log, sizeof(host_log), "vmwgfx: %s-%s",
+               VMWGFX_REPO, VMWGFX_GIT_VERSION);
+       vmw_host_log(host_log);
+
+       memset(host_log, 0, sizeof(host_log));
+       snprintf(host_log, sizeof(host_log), "vmwgfx: Module Version: %d.%d.%d",
+               VMWGFX_DRIVER_MAJOR, VMWGFX_DRIVER_MINOR,
+               VMWGFX_DRIVER_PATCHLEVEL);
+       vmw_host_log(host_log);
+
        if (dev_priv->enable_fb) {
                vmw_fifo_resource_inc(dev_priv);
                vmw_svga_enable(dev_priv);
@@ -1530,10 +1548,8 @@ static int __init vmwgfx_init(void)
 {
        int ret;
 
-#ifdef CONFIG_VGA_CONSOLE
        if (vgacon_text_force())
                return -EINVAL;
-#endif
 
        ret = drm_pci_init(&driver, &vmw_pci_driver);
        if (ret)
index 019a6ca3e8e95898a0d50e0d66baf4d07f3ff437..1980e2a28265d195db5002977d39239f6b3251a9 100644 (file)
@@ -412,6 +412,7 @@ struct vmw_private {
        struct drm_property *implicit_placement_property;
        unsigned num_implicit;
        struct vmw_framebuffer *implicit_fb;
+       struct mutex global_kms_state_mutex;
 
        /*
         * Context and surface management.
@@ -1234,4 +1235,10 @@ static inline void vmw_mmio_write(u32 value, u32 *addr)
 {
        WRITE_ONCE(*addr, value);
 }
+
+/**
+ * Add vmw_msg module function
+ */
+extern int vmw_host_log(const char *log);
+
 #endif
index 4742ec4ead27c71629b806291e0c9b6ce9b10cc8..55231cce73a01f047a1d660d3f3192d1f7ba80a6 100644 (file)
@@ -98,7 +98,7 @@ int vmw_cursor_update_dmabuf(struct vmw_private *dev_priv,
        kmap_offset = 0;
        kmap_num = (width*height*4 + PAGE_SIZE - 1) >> PAGE_SHIFT;
 
-       ret = ttm_bo_reserve(&dmabuf->base, true, false, false, NULL);
+       ret = ttm_bo_reserve(&dmabuf->base, true, false, NULL);
        if (unlikely(ret != 0)) {
                DRM_ERROR("reserve failed\n");
                return -EINVAL;
@@ -318,7 +318,7 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
        kmap_offset = cmd->dma.guest.ptr.offset >> PAGE_SHIFT;
        kmap_num = (64*64*4) >> PAGE_SHIFT;
 
-       ret = ttm_bo_reserve(bo, true, false, false, NULL);
+       ret = ttm_bo_reserve(bo, true, false, NULL);
        if (unlikely(ret != 0)) {
                DRM_ERROR("reserve failed\n");
                return;
@@ -1859,7 +1859,7 @@ int vmw_kms_helper_buffer_prepare(struct vmw_private *dev_priv,
        struct ttm_buffer_object *bo = &buf->base;
        int ret;
 
-       ttm_bo_reserve(bo, false, false, interruptible, NULL);
+       ttm_bo_reserve(bo, false, false, NULL);
        ret = vmw_validate_single_buffer(dev_priv, bo, interruptible,
                                         validate_as_mob);
        if (ret)
@@ -2143,13 +2143,13 @@ int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
 void vmw_kms_del_active(struct vmw_private *dev_priv,
                        struct vmw_display_unit *du)
 {
-       lockdep_assert_held_once(&dev_priv->dev->mode_config.mutex);
-
+       mutex_lock(&dev_priv->global_kms_state_mutex);
        if (du->active_implicit) {
                if (--(dev_priv->num_implicit) == 0)
                        dev_priv->implicit_fb = NULL;
                du->active_implicit = false;
        }
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 }
 
 /**
@@ -2165,8 +2165,7 @@ void vmw_kms_add_active(struct vmw_private *dev_priv,
                        struct vmw_display_unit *du,
                        struct vmw_framebuffer *vfb)
 {
-       lockdep_assert_held_once(&dev_priv->dev->mode_config.mutex);
-
+       mutex_lock(&dev_priv->global_kms_state_mutex);
        WARN_ON_ONCE(!dev_priv->num_implicit && dev_priv->implicit_fb);
 
        if (!du->active_implicit && du->is_implicit) {
@@ -2174,6 +2173,7 @@ void vmw_kms_add_active(struct vmw_private *dev_priv,
                du->active_implicit = true;
                dev_priv->num_implicit++;
        }
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 }
 
 /**
@@ -2190,16 +2190,13 @@ bool vmw_kms_crtc_flippable(struct vmw_private *dev_priv,
                            struct drm_crtc *crtc)
 {
        struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
+       bool ret;
 
-       lockdep_assert_held_once(&dev_priv->dev->mode_config.mutex);
-
-       if (!du->is_implicit)
-               return true;
-
-       if (dev_priv->num_implicit != 1)
-               return false;
+       mutex_lock(&dev_priv->global_kms_state_mutex);
+       ret = !du->is_implicit || dev_priv->num_implicit == 1;
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 
-       return true;
+       return ret;
 }
 
 /**
@@ -2214,16 +2211,18 @@ void vmw_kms_update_implicit_fb(struct vmw_private *dev_priv,
        struct vmw_display_unit *du = vmw_crtc_to_du(crtc);
        struct vmw_framebuffer *vfb;
 
-       lockdep_assert_held_once(&dev_priv->dev->mode_config.mutex);
+       mutex_lock(&dev_priv->global_kms_state_mutex);
 
        if (!du->is_implicit)
-               return;
+               goto out_unlock;
 
        vfb = vmw_framebuffer_to_vfb(crtc->primary->fb);
        WARN_ON_ONCE(dev_priv->num_implicit != 1 &&
                     dev_priv->implicit_fb != vfb);
 
        dev_priv->implicit_fb = vfb;
+out_unlock:
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 }
 
 /**
index 23db16008e39f1301e5c25d49d9562ad9ce95f13..b6126a5f12695074a5f22a7d81ae31f4b9af9f83 100644 (file)
@@ -222,7 +222,7 @@ static void vmw_takedown_otable_base(struct vmw_private *dev_priv,
        if (bo) {
                int ret;
 
-               ret = ttm_bo_reserve(bo, false, true, false, NULL);
+               ret = ttm_bo_reserve(bo, false, true, NULL);
                BUG_ON(ret != 0);
 
                vmw_fence_single_bo(bo, NULL);
@@ -262,7 +262,7 @@ static int vmw_otable_batch_setup(struct vmw_private *dev_priv,
        if (unlikely(ret != 0))
                goto out_no_bo;
 
-       ret = ttm_bo_reserve(batch->otable_bo, false, true, false, NULL);
+       ret = ttm_bo_reserve(batch->otable_bo, false, true, NULL);
        BUG_ON(ret != 0);
        ret = vmw_bo_driver.ttm_tt_populate(batch->otable_bo->ttm);
        if (unlikely(ret != 0))
@@ -357,7 +357,7 @@ static void vmw_otable_batch_takedown(struct vmw_private *dev_priv,
                        vmw_takedown_otable_base(dev_priv, i,
                                                 &batch->otables[i]);
 
-       ret = ttm_bo_reserve(bo, false, true, false, NULL);
+       ret = ttm_bo_reserve(bo, false, true, NULL);
        BUG_ON(ret != 0);
 
        vmw_fence_single_bo(bo, NULL);
@@ -440,7 +440,7 @@ static int vmw_mob_pt_populate(struct vmw_private *dev_priv,
        if (unlikely(ret != 0))
                return ret;
 
-       ret = ttm_bo_reserve(mob->pt_bo, false, true, false, NULL);
+       ret = ttm_bo_reserve(mob->pt_bo, false, true, NULL);
 
        BUG_ON(ret != 0);
        ret = vmw_bo_driver.ttm_tt_populate(mob->pt_bo->ttm);
@@ -545,7 +545,7 @@ static void vmw_mob_pt_setup(struct vmw_mob *mob,
        const struct vmw_sg_table *vsgt;
        int ret;
 
-       ret = ttm_bo_reserve(bo, false, true, false, NULL);
+       ret = ttm_bo_reserve(bo, false, true, NULL);
        BUG_ON(ret != 0);
 
        vsgt = vmw_bo_sg_table(bo);
@@ -595,7 +595,7 @@ void vmw_mob_unbind(struct vmw_private *dev_priv,
        struct ttm_buffer_object *bo = mob->pt_bo;
 
        if (bo) {
-               ret = ttm_bo_reserve(bo, false, true, false, NULL);
+               ret = ttm_bo_reserve(bo, false, true, NULL);
                /*
                 * Noone else should be using this buffer.
                 */
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
new file mode 100644 (file)
index 0000000..6de283c
--- /dev/null
@@ -0,0 +1,416 @@
+/*
+ * Copyright © 2016 VMware, Inc., Palo Alto, CA., USA
+ * 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, sub license, 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 NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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/slab.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/hypervisor.h>
+#include "drmP.h"
+#include "vmwgfx_msg.h"
+
+
+#define MESSAGE_STATUS_SUCCESS  0x0001
+#define MESSAGE_STATUS_DORECV   0x0002
+#define MESSAGE_STATUS_CPT      0x0010
+#define MESSAGE_STATUS_HB       0x0080
+
+#define RPCI_PROTOCOL_NUM       0x49435052
+#define GUESTMSG_FLAG_COOKIE    0x80000000
+
+#define RETRIES                 3
+
+#define VMW_HYPERVISOR_MAGIC    0x564D5868
+#define VMW_HYPERVISOR_PORT     0x5658
+#define VMW_HYPERVISOR_HB_PORT  0x5659
+
+#define VMW_PORT_CMD_MSG        30
+#define VMW_PORT_CMD_HB_MSG     0
+#define VMW_PORT_CMD_OPEN_CHANNEL  (MSG_TYPE_OPEN << 16 | VMW_PORT_CMD_MSG)
+#define VMW_PORT_CMD_CLOSE_CHANNEL (MSG_TYPE_CLOSE << 16 | VMW_PORT_CMD_MSG)
+#define VMW_PORT_CMD_SENDSIZE   (MSG_TYPE_SENDSIZE << 16 | VMW_PORT_CMD_MSG)
+#define VMW_PORT_CMD_RECVSIZE   (MSG_TYPE_RECVSIZE << 16 | VMW_PORT_CMD_MSG)
+#define VMW_PORT_CMD_RECVSTATUS (MSG_TYPE_RECVSTATUS << 16 | VMW_PORT_CMD_MSG)
+
+#define HIGH_WORD(X) ((X & 0xFFFF0000) >> 16)
+
+static u32 vmw_msg_enabled = 1;
+
+enum rpc_msg_type {
+       MSG_TYPE_OPEN,
+       MSG_TYPE_SENDSIZE,
+       MSG_TYPE_SENDPAYLOAD,
+       MSG_TYPE_RECVSIZE,
+       MSG_TYPE_RECVPAYLOAD,
+       MSG_TYPE_RECVSTATUS,
+       MSG_TYPE_CLOSE,
+};
+
+struct rpc_channel {
+       u16 channel_id;
+       u32 cookie_high;
+       u32 cookie_low;
+};
+
+
+
+/**
+ * vmw_open_channel
+ *
+ * @channel: RPC channel
+ * @protocol:
+ *
+ * Returns: 0 on success
+ */
+static int vmw_open_channel(struct rpc_channel *channel, unsigned int protocol)
+{
+       unsigned long eax, ebx, ecx, edx, si = 0, di = 0;
+
+       VMW_PORT(VMW_PORT_CMD_OPEN_CHANNEL,
+               (protocol | GUESTMSG_FLAG_COOKIE), si, di,
+               VMW_HYPERVISOR_PORT,
+               VMW_HYPERVISOR_MAGIC,
+               eax, ebx, ecx, edx, si, di);
+
+       if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0)
+               return -EINVAL;
+
+       channel->channel_id  = HIGH_WORD(edx);
+       channel->cookie_high = si;
+       channel->cookie_low  = di;
+
+       return 0;
+}
+
+
+
+/**
+ * vmw_close_channel
+ *
+ * @channel: RPC channel
+ *
+ * Returns: 0 on success
+ */
+static int vmw_close_channel(struct rpc_channel *channel)
+{
+       unsigned long eax, ebx, ecx, edx, si, di;
+
+       /* Set up additional parameters */
+       si  = channel->cookie_high;
+       di  = channel->cookie_low;
+
+       VMW_PORT(VMW_PORT_CMD_CLOSE_CHANNEL,
+               0, si, di,
+               (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+               VMW_HYPERVISOR_MAGIC,
+               eax, ebx, ecx, edx, si, di);
+
+       if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0)
+               return -EINVAL;
+
+       return 0;
+}
+
+
+
+/**
+ * vmw_send_msg: Sends a message to the host
+ *
+ * @channel: RPC channel
+ * @logmsg: NULL terminated string
+ *
+ * Returns: 0 on success
+ */
+static int vmw_send_msg(struct rpc_channel *channel, const char *msg)
+{
+       unsigned long eax, ebx, ecx, edx, si, di, bp;
+       size_t msg_len = strlen(msg);
+       int retries = 0;
+
+
+       while (retries < RETRIES) {
+               retries++;
+
+               /* Set up additional parameters */
+               si  = channel->cookie_high;
+               di  = channel->cookie_low;
+
+               VMW_PORT(VMW_PORT_CMD_SENDSIZE,
+                       msg_len, si, di,
+                       VMW_HYPERVISOR_PORT | (channel->channel_id << 16),
+                       VMW_HYPERVISOR_MAGIC,
+                       eax, ebx, ecx, edx, si, di);
+
+               if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0 ||
+                   (HIGH_WORD(ecx) & MESSAGE_STATUS_HB) == 0) {
+                       /* Expected success + high-bandwidth. Give up. */
+                       return -EINVAL;
+               }
+
+               /* Send msg */
+               si  = (uintptr_t) msg;
+               di  = channel->cookie_low;
+               bp  = channel->cookie_high;
+
+               VMW_PORT_HB_OUT(
+                       (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
+                       msg_len, si, di,
+                       VMW_HYPERVISOR_HB_PORT | (channel->channel_id << 16),
+                       VMW_HYPERVISOR_MAGIC, bp,
+                       eax, ebx, ecx, edx, si, di);
+
+               if ((HIGH_WORD(ebx) & MESSAGE_STATUS_SUCCESS) != 0) {
+                       return 0;
+               } else if ((HIGH_WORD(ebx) & MESSAGE_STATUS_CPT) != 0) {
+                       /* A checkpoint occurred. Retry. */
+                       continue;
+               } else {
+                       break;
+               }
+       }
+
+       return -EINVAL;
+}
+
+
+
+/**
+ * vmw_recv_msg: Receives a message from the host
+ *
+ * Note:  It is the caller's responsibility to call kfree() on msg.
+ *
+ * @channel:  channel opened by vmw_open_channel
+ * @msg:  [OUT] message received from the host
+ * @msg_len: message length
+ */
+static int vmw_recv_msg(struct rpc_channel *channel, void **msg,
+                       size_t *msg_len)
+{
+       unsigned long eax, ebx, ecx, edx, si, di, bp;
+       char *reply;
+       size_t reply_len;
+       int retries = 0;
+
+
+       *msg_len = 0;
+       *msg = NULL;
+
+       while (retries < RETRIES) {
+               retries++;
+
+               /* Set up additional parameters */
+               si  = channel->cookie_high;
+               di  = channel->cookie_low;
+
+               VMW_PORT(VMW_PORT_CMD_RECVSIZE,
+                       0, si, di,
+                       (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+                       VMW_HYPERVISOR_MAGIC,
+                       eax, ebx, ecx, edx, si, di);
+
+               if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0 ||
+                   (HIGH_WORD(ecx) & MESSAGE_STATUS_HB) == 0) {
+                       DRM_ERROR("Failed to get reply size\n");
+                       return -EINVAL;
+               }
+
+               /* No reply available.  This is okay. */
+               if ((HIGH_WORD(ecx) & MESSAGE_STATUS_DORECV) == 0)
+                       return 0;
+
+               reply_len = ebx;
+               reply     = kzalloc(reply_len + 1, GFP_KERNEL);
+               if (reply == NULL) {
+                       DRM_ERROR("Cannot allocate memory for reply\n");
+                       return -ENOMEM;
+               }
+
+
+               /* Receive buffer */
+               si  = channel->cookie_high;
+               di  = (uintptr_t) reply;
+               bp  = channel->cookie_low;
+
+               VMW_PORT_HB_IN(
+                       (MESSAGE_STATUS_SUCCESS << 16) | VMW_PORT_CMD_HB_MSG,
+                       reply_len, si, di,
+                       VMW_HYPERVISOR_HB_PORT | (channel->channel_id << 16),
+                       VMW_HYPERVISOR_MAGIC, bp,
+                       eax, ebx, ecx, edx, si, di);
+
+               if ((HIGH_WORD(ebx) & MESSAGE_STATUS_SUCCESS) == 0) {
+                       kfree(reply);
+
+                       if ((HIGH_WORD(ebx) & MESSAGE_STATUS_CPT) != 0) {
+                               /* A checkpoint occurred. Retry. */
+                               continue;
+                       }
+
+                       return -EINVAL;
+               }
+
+               reply[reply_len] = '\0';
+
+
+               /* Ack buffer */
+               si  = channel->cookie_high;
+               di  = channel->cookie_low;
+
+               VMW_PORT(VMW_PORT_CMD_RECVSTATUS,
+                       MESSAGE_STATUS_SUCCESS, si, di,
+                       (VMW_HYPERVISOR_PORT | (channel->channel_id << 16)),
+                       VMW_HYPERVISOR_MAGIC,
+                       eax, ebx, ecx, edx, si, di);
+
+               if ((HIGH_WORD(ecx) & MESSAGE_STATUS_SUCCESS) == 0) {
+                       kfree(reply);
+
+                       if ((HIGH_WORD(ecx) & MESSAGE_STATUS_CPT) != 0) {
+                               /* A checkpoint occurred. Retry. */
+                               continue;
+                       }
+
+                       return -EINVAL;
+               }
+
+               break;
+       }
+
+       *msg_len = reply_len;
+       *msg     = reply;
+
+       return 0;
+}
+
+
+/**
+ * vmw_host_get_guestinfo: Gets a GuestInfo parameter
+ *
+ * Gets the value of a  GuestInfo.* parameter.  The value returned will be in
+ * a string, and it is up to the caller to post-process.
+ *
+ * @guest_info_param:  Parameter to get, e.g. GuestInfo.svga.gl3
+ * @buffer: if NULL, *reply_len will contain reply size.
+ * @length: size of the reply_buf.  Set to size of reply upon return
+ *
+ * Returns: 0 on success
+ */
+int vmw_host_get_guestinfo(const char *guest_info_param,
+                          char *buffer, size_t *length)
+{
+       struct rpc_channel channel;
+       char *msg, *reply = NULL;
+       size_t msg_len, reply_len = 0;
+       int ret = 0;
+
+
+       if (!vmw_msg_enabled)
+               return -ENODEV;
+
+       if (!guest_info_param || !length)
+               return -EINVAL;
+
+       msg_len = strlen(guest_info_param) + strlen("info-get ") + 1;
+       msg = kzalloc(msg_len, GFP_KERNEL);
+       if (msg == NULL) {
+               DRM_ERROR("Cannot allocate memory to get %s", guest_info_param);
+               return -ENOMEM;
+       }
+
+       sprintf(msg, "info-get %s", guest_info_param);
+
+       if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) ||
+           vmw_send_msg(&channel, msg) ||
+           vmw_recv_msg(&channel, (void *) &reply, &reply_len) ||
+           vmw_close_channel(&channel)) {
+               DRM_ERROR("Failed to get %s", guest_info_param);
+
+               ret = -EINVAL;
+       }
+
+       if (buffer && reply && reply_len > 0) {
+               /* Remove reply code, which are the first 2 characters of
+                * the reply
+                */
+               reply_len = max(reply_len - 2, (size_t) 0);
+               reply_len = min(reply_len, *length);
+
+               if (reply_len > 0)
+                       memcpy(buffer, reply + 2, reply_len);
+       }
+
+       *length = reply_len;
+
+       kfree(reply);
+       kfree(msg);
+
+       return ret;
+}
+
+
+
+/**
+ * vmw_host_log: Sends a log message to the host
+ *
+ * @log: NULL terminated string
+ *
+ * Returns: 0 on success
+ */
+int vmw_host_log(const char *log)
+{
+       struct rpc_channel channel;
+       char *msg;
+       int msg_len;
+       int ret = 0;
+
+
+       if (!vmw_msg_enabled)
+               return -ENODEV;
+
+       if (!log)
+               return ret;
+
+       msg_len = strlen(log) + strlen("log ") + 1;
+       msg = kzalloc(msg_len, GFP_KERNEL);
+       if (msg == NULL) {
+               DRM_ERROR("Cannot allocate memory for log message\n");
+               return -ENOMEM;
+       }
+
+       sprintf(msg, "log %s", log);
+
+       if (vmw_open_channel(&channel, RPCI_PROTOCOL_NUM) ||
+           vmw_send_msg(&channel, msg) ||
+           vmw_close_channel(&channel)) {
+               DRM_ERROR("Failed to send log\n");
+
+               ret = -EINVAL;
+       }
+
+       kfree(msg);
+
+       return ret;
+}
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.h
new file mode 100644 (file)
index 0000000..557a033
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2016, VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ *
+ * Based on code from vmware.c and vmmouse.c.
+ * Author:
+ *   Sinclair Yeh <syeh@vmware.com>
+ */
+#ifndef _VMWGFX_MSG_H
+#define _VMWGFX_MSG_H
+
+
+/**
+ * Hypervisor-specific bi-directional communication channel.  Should never
+ * execute on bare metal hardware.  The caller must make sure to check for
+ * supported hypervisor before using these macros.
+ *
+ * The last two parameters are both input and output and must be initialized.
+ *
+ * @cmd: [IN] Message Cmd
+ * @in_ebx: [IN] Message Len, through EBX
+ * @in_si: [IN] Input argument through SI, set to 0 if not used
+ * @in_di: [IN] Input argument through DI, set ot 0 if not used
+ * @port_num: [IN] port number + [channel id]
+ * @magic: [IN] hypervisor magic value
+ * @eax: [OUT] value of EAX register
+ * @ebx: [OUT] e.g. status from an HB message status command
+ * @ecx: [OUT] e.g. status from a non-HB message status command
+ * @edx: [OUT] e.g. channel id
+ * @si:  [OUT]
+ * @di:  [OUT]
+ */
+#define VMW_PORT(cmd, in_ebx, in_si, in_di,    \
+                port_num, magic,               \
+                eax, ebx, ecx, edx, si, di)    \
+({                                             \
+       asm volatile ("inl %%dx, %%eax;" :      \
+               "=a"(eax),                      \
+               "=b"(ebx),                      \
+               "=c"(ecx),                      \
+               "=d"(edx),                      \
+               "=S"(si),                       \
+               "=D"(di) :                      \
+               "a"(magic),                     \
+               "b"(in_ebx),                    \
+               "c"(cmd),                       \
+               "d"(port_num),                  \
+               "S"(in_si),                     \
+               "D"(in_di) :                    \
+               "memory");                      \
+})
+
+
+/**
+ * Hypervisor-specific bi-directional communication channel.  Should never
+ * execute on bare metal hardware.  The caller must make sure to check for
+ * supported hypervisor before using these macros.
+ *
+ * The last 3 parameters are both input and output and must be initialized.
+ *
+ * @cmd: [IN] Message Cmd
+ * @in_ecx: [IN] Message Len, through ECX
+ * @in_si: [IN] Input argument through SI, set to 0 if not used
+ * @in_di: [IN] Input argument through DI, set to 0 if not used
+ * @port_num: [IN] port number + [channel id]
+ * @magic: [IN] hypervisor magic value
+ * @bp:  [IN]
+ * @eax: [OUT] value of EAX register
+ * @ebx: [OUT] e.g. status from an HB message status command
+ * @ecx: [OUT] e.g. status from a non-HB message status command
+ * @edx: [OUT] e.g. channel id
+ * @si:  [OUT]
+ * @di:  [OUT]
+ */
+#ifdef __x86_64__
+
+#define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di,     \
+                       port_num, magic, bp,            \
+                       eax, ebx, ecx, edx, si, di)     \
+({                                                     \
+       asm volatile ("push %%rbp;"                     \
+               "mov %12, %%rbp;"                       \
+               "rep outsb;"                            \
+               "pop %%rbp;" :                          \
+               "=a"(eax),                              \
+               "=b"(ebx),                              \
+               "=c"(ecx),                              \
+               "=d"(edx),                              \
+               "=S"(si),                               \
+               "=D"(di) :                              \
+               "a"(magic),                             \
+               "b"(cmd),                               \
+               "c"(in_ecx),                            \
+               "d"(port_num),                          \
+               "S"(in_si),                             \
+               "D"(in_di),                             \
+               "r"(bp) :                               \
+               "memory", "cc");                        \
+})
+
+
+#define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di,      \
+                      port_num, magic, bp,             \
+                      eax, ebx, ecx, edx, si, di)      \
+({                                                     \
+       asm volatile ("push %%rbp;"                     \
+               "mov %12, %%rbp;"                       \
+               "rep insb;"                             \
+               "pop %%rbp" :                           \
+               "=a"(eax),                              \
+               "=b"(ebx),                              \
+               "=c"(ecx),                              \
+               "=d"(edx),                              \
+               "=S"(si),                               \
+               "=D"(di) :                              \
+               "a"(magic),                             \
+               "b"(cmd),                               \
+               "c"(in_ecx),                            \
+               "d"(port_num),                          \
+               "S"(in_si),                             \
+               "D"(in_di),                             \
+               "r"(bp) :                               \
+               "memory", "cc");                        \
+})
+
+#else
+
+/* In the 32-bit version of this macro, we use "m" because there is no
+ * more register left for bp
+ */
+#define VMW_PORT_HB_OUT(cmd, in_ecx, in_si, in_di,     \
+                       port_num, magic, bp,            \
+                       eax, ebx, ecx, edx, si, di)     \
+({                                                     \
+       asm volatile ("push %%ebp;"                     \
+               "mov %12, %%ebp;"                       \
+               "rep outsb;"                            \
+               "pop %%ebp;" :                          \
+               "=a"(eax),                              \
+               "=b"(ebx),                              \
+               "=c"(ecx),                              \
+               "=d"(edx),                              \
+               "=S"(si),                               \
+               "=D"(di) :                              \
+               "a"(magic),                             \
+               "b"(cmd),                               \
+               "c"(in_ecx),                            \
+               "d"(port_num),                          \
+               "S"(in_si),                             \
+               "D"(in_di),                             \
+               "m"(bp) :                               \
+               "memory", "cc");                        \
+})
+
+
+#define VMW_PORT_HB_IN(cmd, in_ecx, in_si, in_di,      \
+                      port_num, magic, bp,             \
+                      eax, ebx, ecx, edx, si, di)      \
+({                                                     \
+       asm volatile ("push %%ebp;"                     \
+               "mov %12, %%ebp;"                       \
+               "rep insb;"                             \
+               "pop %%ebp" :                           \
+               "=a"(eax),                              \
+               "=b"(ebx),                              \
+               "=c"(ecx),                              \
+               "=d"(edx),                              \
+               "=S"(si),                               \
+               "=D"(di) :                              \
+               "a"(magic),                             \
+               "b"(cmd),                               \
+               "c"(in_ecx),                            \
+               "d"(port_num),                          \
+               "S"(in_si),                             \
+               "D"(in_di),                             \
+               "m"(bp) :                               \
+               "memory", "cc");                        \
+})
+#endif /* #if __x86_64__ */
+
+#endif
index e57667ca75573d720cc7ec5143babb0da1e5693d..6a328d507a285e027bf9f355b2f5cb9b9a6da8c7 100644 (file)
@@ -129,7 +129,7 @@ static void vmw_resource_release(struct kref *kref)
        if (res->backup) {
                struct ttm_buffer_object *bo = &res->backup->base;
 
-               ttm_bo_reserve(bo, false, false, false, NULL);
+               ttm_bo_reserve(bo, false, false, NULL);
                if (!list_empty(&res->mob_head) &&
                    res->func->unbind != NULL) {
                        struct ttm_validate_buffer val_buf;
@@ -1512,7 +1512,7 @@ void vmw_resource_move_notify(struct ttm_buffer_object *bo,
                        list_del_init(&res->mob_head);
                }
 
-               (void) ttm_bo_wait(bo, false, false, false);
+               (void) ttm_bo_wait(bo, false, false);
        }
 }
 
@@ -1605,7 +1605,7 @@ void vmw_query_move_notify(struct ttm_buffer_object *bo,
                if (fence != NULL)
                        vmw_fence_obj_unreference(&fence);
 
-               (void) ttm_bo_wait(bo, false, false, false);
+               (void) ttm_bo_wait(bo, false, false);
        } else
                mutex_unlock(&dev_priv->binding_mutex);
 
@@ -1717,8 +1717,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
                if (res->backup) {
                        vbo = res->backup;
 
-                       ttm_bo_reserve(&vbo->base, interruptible, false, false,
-                                      NULL);
+                       ttm_bo_reserve(&vbo->base, interruptible, false, NULL);
                        if (!vbo->pin_count) {
                                ret = ttm_bo_validate
                                        (&vbo->base,
@@ -1773,7 +1772,7 @@ void vmw_resource_unpin(struct vmw_resource *res)
        if (--res->pin_count == 0 && res->backup) {
                struct vmw_dma_buffer *vbo = res->backup;
 
-               ttm_bo_reserve(&vbo->base, false, false, false, NULL);
+               ttm_bo_reserve(&vbo->base, false, false, NULL);
                vmw_bo_pin_reserved(vbo, false);
                ttm_bo_unreserve(&vbo->base);
        }
index 0ea22fd112c9ccb892bf4e7367b6fcd41c5d323e..b74eae2b8594d54a6083311fae8dd9fd8854e2d9 100644 (file)
@@ -285,14 +285,17 @@ static int vmw_sou_crtc_set_config(struct drm_mode_set *set)
        }
 
        /* Only one active implicit frame-buffer at a time. */
+       mutex_lock(&dev_priv->global_kms_state_mutex);
        if (sou->base.is_implicit &&
            dev_priv->implicit_fb && vfb &&
            !(dev_priv->num_implicit == 1 &&
              sou->base.active_implicit) &&
            dev_priv->implicit_fb != vfb) {
+               mutex_unlock(&dev_priv->global_kms_state_mutex);
                DRM_ERROR("Multiple implicit framebuffers not supported.\n");
                return -EINVAL;
        }
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 
        /* since they always map one to one these are safe */
        connector = &sou->base.connector;
index fd47547b0234c6e1299e3311ab9f23be03c08810..92f8b1d04f0f67cbcb4814fedc169c8c2d7d9f23 100644 (file)
@@ -988,7 +988,7 @@ int vmw_compat_shader_add(struct vmw_private *dev_priv,
        if (unlikely(ret != 0))
                goto out;
 
-       ret = ttm_bo_reserve(&buf->base, false, true, false, NULL);
+       ret = ttm_bo_reserve(&buf->base, false, true, NULL);
        if (unlikely(ret != 0))
                goto no_reserve;
 
index b949102ad8646f0541bfd8697d8854ce9fc6b878..9ca818fb034c923c4737ccfedb3ea98002aaae84 100644 (file)
@@ -553,12 +553,15 @@ static int vmw_stdu_crtc_set_config(struct drm_mode_set *set)
        }
 
        /* Only one active implicit frame-buffer at a time. */
+       mutex_lock(&dev_priv->global_kms_state_mutex);
        if (!turning_off && stdu->base.is_implicit && dev_priv->implicit_fb &&
            !(dev_priv->num_implicit == 1 && stdu->base.active_implicit)
            && dev_priv->implicit_fb != vfb) {
+               mutex_unlock(&dev_priv->global_kms_state_mutex);
                DRM_ERROR("Multiple implicit framebuffers not supported.\n");
                return -EINVAL;
        }
+       mutex_unlock(&dev_priv->global_kms_state_mutex);
 
        /* Since they always map one to one these are safe */
        connector = &stdu->base.connector;
index 089091f5f89068ce9d179e6d9d36963592cccdc0..f6b57579185afbccf4b89b8a35b276f2dbbba12f 100644 (file)
@@ -91,6 +91,7 @@ int mtk_smi_larb_get(struct device *larbdev)
 
        return 0;
 }
+EXPORT_SYMBOL_GPL(mtk_smi_larb_get);
 
 void mtk_smi_larb_put(struct device *larbdev)
 {
@@ -106,6 +107,7 @@ void mtk_smi_larb_put(struct device *larbdev)
        mtk_smi_disable(&larb->smi);
        mtk_smi_disable(common);
 }
+EXPORT_SYMBOL_GPL(mtk_smi_larb_put);
 
 static int
 mtk_smi_larb_bind(struct device *dev, struct device *master, void *data)
index 53c11621d5b16fd6eb33764469b4f1d4659fe8a5..7c8a3bf078846ac0bb1410f93e5a91ff3ca4c985 100644 (file)
@@ -88,4 +88,17 @@ config NVDIMM_PFN
 
          Select Y if unsure
 
+config NVDIMM_DAX
+       bool "NVDIMM DAX: Raw access to persistent memory"
+       default LIBNVDIMM
+       depends on NVDIMM_PFN
+       help
+         Support raw device dax access to a persistent memory
+         namespace.  For environments that want to hard partition
+         peristent memory, this capability provides a mechanism to
+         sub-divide a namespace into character devices that can only be
+         accessed via DAX (mmap(2)).
+
+         Select Y if unsure
+
 endif
index ea84d3c4e8e5aa5b9a5925445f6c592f0a7f9a2b..909554c3f95571ddd3d804c7dae04a2514855c50 100644 (file)
@@ -23,3 +23,4 @@ libnvdimm-y += label.o
 libnvdimm-$(CONFIG_ND_CLAIM) += claim.o
 libnvdimm-$(CONFIG_BTT) += btt_devs.o
 libnvdimm-$(CONFIG_NVDIMM_PFN) += pfn_devs.o
+libnvdimm-$(CONFIG_NVDIMM_DAX) += dax_devs.o
index e9ff9229d942ac5b0c08c4fc94d8f58acdf6ed76..495e06d9f7e7f39013d910e4459720b61ebd90f5 100644 (file)
 #include <linux/sizes.h>
 #include "nd.h"
 
-struct nd_blk_device {
-       struct request_queue *queue;
-       struct gendisk *disk;
-       struct nd_namespace_blk *nsblk;
-       struct nd_blk_region *ndbr;
-       size_t disk_size;
-       u32 sector_size;
-       u32 internal_lbasize;
-};
+static u32 nsblk_meta_size(struct nd_namespace_blk *nsblk)
+{
+       return nsblk->lbasize - ((nsblk->lbasize >= 4096) ? 4096 : 512);
+}
+
+static u32 nsblk_internal_lbasize(struct nd_namespace_blk *nsblk)
+{
+       return roundup(nsblk->lbasize, INT_LBASIZE_ALIGNMENT);
+}
 
-static u32 nd_blk_meta_size(struct nd_blk_device *blk_dev)
+static u32 nsblk_sector_size(struct nd_namespace_blk *nsblk)
 {
-       return blk_dev->nsblk->lbasize - blk_dev->sector_size;
+       return nsblk->lbasize - nsblk_meta_size(nsblk);
 }
 
 static resource_size_t to_dev_offset(struct nd_namespace_blk *nsblk,
@@ -57,20 +57,29 @@ static resource_size_t to_dev_offset(struct nd_namespace_blk *nsblk,
        return SIZE_MAX;
 }
 
+static struct nd_blk_region *to_ndbr(struct nd_namespace_blk *nsblk)
+{
+       struct nd_region *nd_region;
+       struct device *parent;
+
+       parent = nsblk->common.dev.parent;
+       nd_region = container_of(parent, struct nd_region, dev);
+       return container_of(nd_region, struct nd_blk_region, nd_region);
+}
+
 #ifdef CONFIG_BLK_DEV_INTEGRITY
-static int nd_blk_rw_integrity(struct nd_blk_device *blk_dev,
-                               struct bio_integrity_payload *bip, u64 lba,
-                               int rw)
+static int nd_blk_rw_integrity(struct nd_namespace_blk *nsblk,
+               struct bio_integrity_payload *bip, u64 lba, int rw)
 {
-       unsigned int len = nd_blk_meta_size(blk_dev);
+       struct nd_blk_region *ndbr = to_ndbr(nsblk);
+       unsigned int len = nsblk_meta_size(nsblk);
        resource_size_t dev_offset, ns_offset;
-       struct nd_namespace_blk *nsblk;
-       struct nd_blk_region *ndbr;
+       u32 internal_lbasize, sector_size;
        int err = 0;
 
-       nsblk = blk_dev->nsblk;
-       ndbr = blk_dev->ndbr;
-       ns_offset = lba * blk_dev->internal_lbasize + blk_dev->sector_size;
+       internal_lbasize = nsblk_internal_lbasize(nsblk);
+       sector_size = nsblk_sector_size(nsblk);
+       ns_offset = lba * internal_lbasize + sector_size;
        dev_offset = to_dev_offset(nsblk, ns_offset, len);
        if (dev_offset == SIZE_MAX)
                return -EIO;
@@ -104,25 +113,26 @@ static int nd_blk_rw_integrity(struct nd_blk_device *blk_dev,
 }
 
 #else /* CONFIG_BLK_DEV_INTEGRITY */
-static int nd_blk_rw_integrity(struct nd_blk_device *blk_dev,
-                               struct bio_integrity_payload *bip, u64 lba,
-                               int rw)
+static int nd_blk_rw_integrity(struct nd_namespace_blk *nsblk,
+               struct bio_integrity_payload *bip, u64 lba, int rw)
 {
        return 0;
 }
 #endif
 
-static int nd_blk_do_bvec(struct nd_blk_device *blk_dev,
-                       struct bio_integrity_payload *bip, struct page *page,
-                       unsigned int len, unsigned int off, int rw,
-                       sector_t sector)
+static int nsblk_do_bvec(struct nd_namespace_blk *nsblk,
+               struct bio_integrity_payload *bip, struct page *page,
+               unsigned int len, unsigned int off, int rw, sector_t sector)
 {
-       struct nd_blk_region *ndbr = blk_dev->ndbr;
+       struct nd_blk_region *ndbr = to_ndbr(nsblk);
        resource_size_t dev_offset, ns_offset;
+       u32 internal_lbasize, sector_size;
        int err = 0;
        void *iobuf;
        u64 lba;
 
+       internal_lbasize = nsblk_internal_lbasize(nsblk);
+       sector_size = nsblk_sector_size(nsblk);
        while (len) {
                unsigned int cur_len;
 
@@ -132,11 +142,11 @@ static int nd_blk_do_bvec(struct nd_blk_device *blk_dev,
                 * Block Window setup/move steps. the do_io routine is capable
                 * of handling len <= PAGE_SIZE.
                 */
-               cur_len = bip ? min(len, blk_dev->sector_size) : len;
+               cur_len = bip ? min(len, sector_size) : len;
 
-               lba = div_u64(sector << SECTOR_SHIFT, blk_dev->sector_size);
-               ns_offset = lba * blk_dev->internal_lbasize;
-               dev_offset = to_dev_offset(blk_dev->nsblk, ns_offset, cur_len);
+               lba = div_u64(sector << SECTOR_SHIFT, sector_size);
+               ns_offset = lba * internal_lbasize;
+               dev_offset = to_dev_offset(nsblk, ns_offset, cur_len);
                if (dev_offset == SIZE_MAX)
                        return -EIO;
 
@@ -147,13 +157,13 @@ static int nd_blk_do_bvec(struct nd_blk_device *blk_dev,
                        return err;
 
                if (bip) {
-                       err = nd_blk_rw_integrity(blk_dev, bip, lba, rw);
+                       err = nd_blk_rw_integrity(nsblk, bip, lba, rw);
                        if (err)
                                return err;
                }
                len -= cur_len;
                off += cur_len;
-               sector += blk_dev->sector_size >> SECTOR_SHIFT;
+               sector += sector_size >> SECTOR_SHIFT;
        }
 
        return err;
@@ -161,10 +171,8 @@ static int nd_blk_do_bvec(struct nd_blk_device *blk_dev,
 
 static blk_qc_t nd_blk_make_request(struct request_queue *q, struct bio *bio)
 {
-       struct block_device *bdev = bio->bi_bdev;
-       struct gendisk *disk = bdev->bd_disk;
        struct bio_integrity_payload *bip;
-       struct nd_blk_device *blk_dev;
+       struct nd_namespace_blk *nsblk;
        struct bvec_iter iter;
        unsigned long start;
        struct bio_vec bvec;
@@ -183,17 +191,17 @@ static blk_qc_t nd_blk_make_request(struct request_queue *q, struct bio *bio)
        }
 
        bip = bio_integrity(bio);
-       blk_dev = disk->private_data;
+       nsblk = q->queuedata;
        rw = bio_data_dir(bio);
        do_acct = nd_iostat_start(bio, &start);
        bio_for_each_segment(bvec, bio, iter) {
                unsigned int len = bvec.bv_len;
 
                BUG_ON(len > PAGE_SIZE);
-               err = nd_blk_do_bvec(blk_dev, bip, bvec.bv_page, len,
-                                       bvec.bv_offset, rw, iter.bi_sector);
+               err = nsblk_do_bvec(nsblk, bip, bvec.bv_page, len,
+                               bvec.bv_offset, rw, iter.bi_sector);
                if (err) {
-                       dev_info(&blk_dev->nsblk->common.dev,
+                       dev_dbg(&nsblk->common.dev,
                                        "io error in %s sector %lld, len %d,\n",
                                        (rw == READ) ? "READ" : "WRITE",
                                        (unsigned long long) iter.bi_sector, len);
@@ -209,17 +217,16 @@ static blk_qc_t nd_blk_make_request(struct request_queue *q, struct bio *bio)
        return BLK_QC_T_NONE;
 }
 
-static int nd_blk_rw_bytes(struct nd_namespace_common *ndns,
+static int nsblk_rw_bytes(struct nd_namespace_common *ndns,
                resource_size_t offset, void *iobuf, size_t n, int rw)
 {
-       struct nd_blk_device *blk_dev = dev_get_drvdata(ndns->claim);
-       struct nd_namespace_blk *nsblk = blk_dev->nsblk;
-       struct nd_blk_region *ndbr = blk_dev->ndbr;
+       struct nd_namespace_blk *nsblk = to_nd_namespace_blk(&ndns->dev);
+       struct nd_blk_region *ndbr = to_ndbr(nsblk);
        resource_size_t dev_offset;
 
        dev_offset = to_dev_offset(nsblk, offset, n);
 
-       if (unlikely(offset + n > blk_dev->disk_size)) {
+       if (unlikely(offset + n > nsblk->size)) {
                dev_WARN_ONCE(&ndns->dev, 1, "request out of range\n");
                return -EFAULT;
        }
@@ -235,51 +242,65 @@ static const struct block_device_operations nd_blk_fops = {
        .revalidate_disk = nvdimm_revalidate_disk,
 };
 
-static int nd_blk_attach_disk(struct nd_namespace_common *ndns,
-               struct nd_blk_device *blk_dev)
+static void nd_blk_release_queue(void *q)
+{
+       blk_cleanup_queue(q);
+}
+
+static void nd_blk_release_disk(void *disk)
+{
+       del_gendisk(disk);
+       put_disk(disk);
+}
+
+static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
 {
+       struct device *dev = &nsblk->common.dev;
        resource_size_t available_disk_size;
+       struct request_queue *q;
        struct gendisk *disk;
        u64 internal_nlba;
 
-       internal_nlba = div_u64(blk_dev->disk_size, blk_dev->internal_lbasize);
-       available_disk_size = internal_nlba * blk_dev->sector_size;
+       internal_nlba = div_u64(nsblk->size, nsblk_internal_lbasize(nsblk));
+       available_disk_size = internal_nlba * nsblk_sector_size(nsblk);
 
-       blk_dev->queue = blk_alloc_queue(GFP_KERNEL);
-       if (!blk_dev->queue)
+       q = blk_alloc_queue(GFP_KERNEL);
+       if (!q)
                return -ENOMEM;
+       if (devm_add_action(dev, nd_blk_release_queue, q)) {
+               blk_cleanup_queue(q);
+               return -ENOMEM;
+       }
 
-       blk_queue_make_request(blk_dev->queue, nd_blk_make_request);
-       blk_queue_max_hw_sectors(blk_dev->queue, UINT_MAX);
-       blk_queue_bounce_limit(blk_dev->queue, BLK_BOUNCE_ANY);
-       blk_queue_logical_block_size(blk_dev->queue, blk_dev->sector_size);
-       queue_flag_set_unlocked(QUEUE_FLAG_NONROT, blk_dev->queue);
+       blk_queue_make_request(q, nd_blk_make_request);
+       blk_queue_max_hw_sectors(q, UINT_MAX);
+       blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
+       blk_queue_logical_block_size(q, nsblk_sector_size(nsblk));
+       queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
+       q->queuedata = nsblk;
 
-       disk = blk_dev->disk = alloc_disk(0);
-       if (!disk) {
-               blk_cleanup_queue(blk_dev->queue);
+       disk = alloc_disk(0);
+       if (!disk)
+               return -ENOMEM;
+       if (devm_add_action(dev, nd_blk_release_disk, disk)) {
+               put_disk(disk);
                return -ENOMEM;
        }
 
-       disk->driverfs_dev      = &ndns->dev;
+       disk->driverfs_dev      = dev;
        disk->first_minor       = 0;
        disk->fops              = &nd_blk_fops;
-       disk->private_data      = blk_dev;
-       disk->queue             = blk_dev->queue;
+       disk->queue             = q;
        disk->flags             = GENHD_FL_EXT_DEVT;
-       nvdimm_namespace_disk_name(ndns, disk->disk_name);
+       nvdimm_namespace_disk_name(&nsblk->common, disk->disk_name);
        set_capacity(disk, 0);
        add_disk(disk);
 
-       if (nd_blk_meta_size(blk_dev)) {
-               int rc = nd_integrity_init(disk, nd_blk_meta_size(blk_dev));
+       if (nsblk_meta_size(nsblk)) {
+               int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
 
-               if (rc) {
-                       del_gendisk(disk);
-                       put_disk(disk);
-                       blk_cleanup_queue(blk_dev->queue);
+               if (rc)
                        return rc;
-               }
        }
 
        set_capacity(disk, available_disk_size >> SECTOR_SHIFT);
@@ -291,56 +312,29 @@ static int nd_blk_probe(struct device *dev)
 {
        struct nd_namespace_common *ndns;
        struct nd_namespace_blk *nsblk;
-       struct nd_blk_device *blk_dev;
-       int rc;
 
        ndns = nvdimm_namespace_common_probe(dev);
        if (IS_ERR(ndns))
                return PTR_ERR(ndns);
 
-       blk_dev = kzalloc(sizeof(*blk_dev), GFP_KERNEL);
-       if (!blk_dev)
-               return -ENOMEM;
-
        nsblk = to_nd_namespace_blk(&ndns->dev);
-       blk_dev->disk_size = nvdimm_namespace_capacity(ndns);
-       blk_dev->ndbr = to_nd_blk_region(dev->parent);
-       blk_dev->nsblk = to_nd_namespace_blk(&ndns->dev);
-       blk_dev->internal_lbasize = roundup(nsblk->lbasize,
-                                               INT_LBASIZE_ALIGNMENT);
-       blk_dev->sector_size = ((nsblk->lbasize >= 4096) ? 4096 : 512);
-       dev_set_drvdata(dev, blk_dev);
-
-       ndns->rw_bytes = nd_blk_rw_bytes;
+       nsblk->size = nvdimm_namespace_capacity(ndns);
+       dev_set_drvdata(dev, nsblk);
+
+       ndns->rw_bytes = nsblk_rw_bytes;
        if (is_nd_btt(dev))
-               rc = nvdimm_namespace_attach_btt(ndns);
-       else if (nd_btt_probe(ndns, blk_dev) == 0) {
+               return nvdimm_namespace_attach_btt(ndns);
+       else if (nd_btt_probe(dev, ndns) == 0) {
                /* we'll come back as btt-blk */
-               rc = -ENXIO;
+               return -ENXIO;
        } else
-               rc = nd_blk_attach_disk(ndns, blk_dev);
-       if (rc)
-               kfree(blk_dev);
-       return rc;
-}
-
-static void nd_blk_detach_disk(struct nd_blk_device *blk_dev)
-{
-       del_gendisk(blk_dev->disk);
-       put_disk(blk_dev->disk);
-       blk_cleanup_queue(blk_dev->queue);
+               return nsblk_attach_disk(nsblk);
 }
 
 static int nd_blk_remove(struct device *dev)
 {
-       struct nd_blk_device *blk_dev = dev_get_drvdata(dev);
-
        if (is_nd_btt(dev))
-               nvdimm_namespace_detach_btt(to_nd_btt(dev)->ndns);
-       else
-               nd_blk_detach_disk(blk_dev);
-       kfree(blk_dev);
-
+               nvdimm_namespace_detach_btt(to_nd_btt(dev));
        return 0;
 }
 
index f068b6513cd286659b1e468e726c45d868a05b7b..68a7c3c1eed9115bb23a7c0501c2134b4c238e39 100644 (file)
@@ -1306,7 +1306,7 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
        struct btt *btt;
        struct device *dev = &nd_btt->dev;
 
-       btt = kzalloc(sizeof(struct btt), GFP_KERNEL);
+       btt = devm_kzalloc(dev, sizeof(struct btt), GFP_KERNEL);
        if (!btt)
                return NULL;
 
@@ -1321,13 +1321,13 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
        ret = discover_arenas(btt);
        if (ret) {
                dev_err(dev, "init: error in arena_discover: %d\n", ret);
-               goto out_free;
+               return NULL;
        }
 
        if (btt->init_state != INIT_READY && nd_region->ro) {
                dev_info(dev, "%s is read-only, unable to init btt metadata\n",
                                dev_name(&nd_region->dev));
-               goto out_free;
+               return NULL;
        } else if (btt->init_state != INIT_READY) {
                btt->num_arenas = (rawsize / ARENA_MAX_SIZE) +
                        ((rawsize % ARENA_MAX_SIZE) ? 1 : 0);
@@ -1337,29 +1337,25 @@ static struct btt *btt_init(struct nd_btt *nd_btt, unsigned long long rawsize,
                ret = create_arenas(btt);
                if (ret) {
                        dev_info(dev, "init: create_arenas: %d\n", ret);
-                       goto out_free;
+                       return NULL;
                }
 
                ret = btt_meta_init(btt);
                if (ret) {
                        dev_err(dev, "init: error in meta_init: %d\n", ret);
-                       goto out_free;
+                       return NULL;
                }
        }
 
        ret = btt_blk_init(btt);
        if (ret) {
                dev_err(dev, "init: error in blk_init: %d\n", ret);
-               goto out_free;
+               return NULL;
        }
 
        btt_debugfs_init(btt);
 
        return btt;
-
- out_free:
-       kfree(btt);
-       return NULL;
 }
 
 /**
@@ -1377,7 +1373,6 @@ static void btt_fini(struct btt *btt)
                btt_blk_cleanup(btt);
                free_arenas(btt);
                debugfs_remove_recursive(btt->debugfs_dir);
-               kfree(btt);
        }
 }
 
@@ -1388,11 +1383,15 @@ int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
        struct btt *btt;
        size_t rawsize;
 
-       if (!nd_btt->uuid || !nd_btt->ndns || !nd_btt->lbasize)
+       if (!nd_btt->uuid || !nd_btt->ndns || !nd_btt->lbasize) {
+               dev_dbg(&nd_btt->dev, "incomplete btt configuration\n");
                return -ENODEV;
+       }
 
        rawsize = nvdimm_namespace_capacity(ndns) - SZ_4K;
        if (rawsize < ARENA_MIN_SIZE) {
+               dev_dbg(&nd_btt->dev, "%s must be at least %ld bytes\n",
+                               dev_name(&ndns->dev), ARENA_MIN_SIZE + SZ_4K);
                return -ENXIO;
        }
        nd_region = to_nd_region(nd_btt->dev.parent);
@@ -1406,9 +1405,8 @@ int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns)
 }
 EXPORT_SYMBOL(nvdimm_namespace_attach_btt);
 
-int nvdimm_namespace_detach_btt(struct nd_namespace_common *ndns)
+int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt)
 {
-       struct nd_btt *nd_btt = to_nd_btt(ndns->claim);
        struct btt *btt = nd_btt->btt;
 
        btt_fini(btt);
index cb477518dd0e4d397ede8ccc83ffe2f29ceb02a6..816d0dae63983c8ccf2c4f288e2d841dc74d843d 100644 (file)
@@ -273,10 +273,10 @@ static int __nd_btt_probe(struct nd_btt *nd_btt,
        return 0;
 }
 
-int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata)
+int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns)
 {
        int rc;
-       struct device *dev;
+       struct device *btt_dev;
        struct btt_sb *btt_sb;
        struct nd_region *nd_region = to_nd_region(ndns->dev.parent);
 
@@ -284,21 +284,19 @@ int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata)
                return -ENODEV;
 
        nvdimm_bus_lock(&ndns->dev);
-       dev = __nd_btt_create(nd_region, 0, NULL, ndns);
+       btt_dev = __nd_btt_create(nd_region, 0, NULL, ndns);
        nvdimm_bus_unlock(&ndns->dev);
-       if (!dev)
+       if (!btt_dev)
                return -ENOMEM;
-       dev_set_drvdata(dev, drvdata);
-       btt_sb = kzalloc(sizeof(*btt_sb), GFP_KERNEL);
-       rc = __nd_btt_probe(to_nd_btt(dev), ndns, btt_sb);
-       kfree(btt_sb);
-       dev_dbg(&ndns->dev, "%s: btt: %s\n", __func__,
-                       rc == 0 ? dev_name(dev) : "<none>");
+       btt_sb = devm_kzalloc(dev, sizeof(*btt_sb), GFP_KERNEL);
+       rc = __nd_btt_probe(to_nd_btt(btt_dev), ndns, btt_sb);
+       dev_dbg(dev, "%s: btt: %s\n", __func__,
+                       rc == 0 ? dev_name(btt_dev) : "<none>");
        if (rc < 0) {
-               struct nd_btt *nd_btt = to_nd_btt(dev);
+               struct nd_btt *nd_btt = to_nd_btt(btt_dev);
 
-               __nd_detach_ndns(dev, &nd_btt->ndns);
-               put_device(dev);
+               __nd_detach_ndns(btt_dev, &nd_btt->ndns);
+               put_device(btt_dev);
        }
 
        return rc;
index 19f822d7f65274cb3e4a737240b0bdbfd12a8548..f085f8bceae8e6905b89332bceccbc5066aa9b54 100644 (file)
@@ -40,6 +40,8 @@ static int to_nd_device_type(struct device *dev)
                return ND_DEVICE_REGION_PMEM;
        else if (is_nd_blk(dev))
                return ND_DEVICE_REGION_BLK;
+       else if (is_nd_dax(dev))
+               return ND_DEVICE_DAX_PMEM;
        else if (is_nd_pmem(dev->parent) || is_nd_blk(dev->parent))
                return nd_region_to_nstype(to_nd_region(dev->parent));
 
@@ -122,9 +124,10 @@ static int nvdimm_bus_remove(struct device *dev)
        struct nd_device_driver *nd_drv = to_nd_device_driver(dev->driver);
        struct module *provider = to_bus_provider(dev);
        struct nvdimm_bus *nvdimm_bus = walk_to_nvdimm_bus(dev);
-       int rc;
+       int rc = 0;
 
-       rc = nd_drv->remove(dev);
+       if (nd_drv->remove)
+               rc = nd_drv->remove(dev);
        nd_region_disable(nvdimm_bus, dev);
 
        dev_dbg(&nvdimm_bus->dev, "%s.remove(%s) = %d\n", dev->driver->name,
@@ -246,6 +249,8 @@ static void nd_async_device_unregister(void *d, async_cookie_t cookie)
 
 void __nd_device_register(struct device *dev)
 {
+       if (!dev)
+               return;
        dev->bus = &nvdimm_bus_type;
        get_device(dev);
        async_schedule_domain(nd_async_device_register, dev,
@@ -292,8 +297,8 @@ int __nd_driver_register(struct nd_device_driver *nd_drv, struct module *owner,
                return -EINVAL;
        }
 
-       if (!nd_drv->probe || !nd_drv->remove) {
-               pr_debug("->probe() and ->remove() must be specified\n");
+       if (!nd_drv->probe) {
+               pr_debug("%s ->probe() must be specified\n", mod_name);
                return -EINVAL;
        }
 
@@ -439,6 +444,12 @@ static const struct nd_cmd_desc __nd_cmd_dimm_descs[] = {
                .out_num = 3,
                .out_sizes = { 4, 4, UINT_MAX, },
        },
+       [ND_CMD_CALL] = {
+               .in_num = 2,
+               .in_sizes = { sizeof(struct nd_cmd_pkg), UINT_MAX, },
+               .out_num = 1,
+               .out_sizes = { UINT_MAX, },
+       },
 };
 
 const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd)
@@ -473,6 +484,12 @@ static const struct nd_cmd_desc __nd_cmd_bus_descs[] = {
                .out_num = 3,
                .out_sizes = { 4, 4, 8, },
        },
+       [ND_CMD_CALL] = {
+               .in_num = 2,
+               .in_sizes = { sizeof(struct nd_cmd_pkg), UINT_MAX, },
+               .out_num = 1,
+               .out_sizes = { UINT_MAX, },
+       },
 };
 
 const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd)
@@ -500,6 +517,10 @@ u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
                struct nd_cmd_vendor_hdr *hdr = buf;
 
                return hdr->in_length;
+       } else if (cmd == ND_CMD_CALL) {
+               struct nd_cmd_pkg *pkg = buf;
+
+               return pkg->nd_size_in;
        }
 
        return UINT_MAX;
@@ -522,6 +543,12 @@ u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
                return out_field[1];
        else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2)
                return out_field[1] - 8;
+       else if (cmd == ND_CMD_CALL) {
+               struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
+
+               return pkg->nd_size_out;
+       }
+
 
        return UINT_MAX;
 }
@@ -588,25 +615,31 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
        unsigned int cmd = _IOC_NR(ioctl_cmd);
        void __user *p = (void __user *) arg;
        struct device *dev = &nvdimm_bus->dev;
+       struct nd_cmd_pkg pkg;
        const char *cmd_name, *dimm_name;
-       unsigned long dsm_mask;
+       unsigned long cmd_mask;
        void *buf;
        int rc, i;
 
        if (nvdimm) {
                desc = nd_cmd_dimm_desc(cmd);
                cmd_name = nvdimm_cmd_name(cmd);
-               dsm_mask = nvdimm->dsm_mask ? *(nvdimm->dsm_mask) : 0;
+               cmd_mask = nvdimm->cmd_mask;
                dimm_name = dev_name(&nvdimm->dev);
        } else {
                desc = nd_cmd_bus_desc(cmd);
                cmd_name = nvdimm_bus_cmd_name(cmd);
-               dsm_mask = nd_desc->dsm_mask;
+               cmd_mask = nd_desc->cmd_mask;
                dimm_name = "bus";
        }
 
+       if (cmd == ND_CMD_CALL) {
+               if (copy_from_user(&pkg, p, sizeof(pkg)))
+                       return -EFAULT;
+       }
+
        if (!desc || (desc->out_num + desc->in_num == 0) ||
-                       !test_bit(cmd, &dsm_mask))
+                       !test_bit(cmd, &cmd_mask))
                return -ENOTTY;
 
        /* fail write commands (when read-only) */
@@ -616,6 +649,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
                case ND_CMD_SET_CONFIG_DATA:
                case ND_CMD_ARS_START:
                case ND_CMD_CLEAR_ERROR:
+               case ND_CMD_CALL:
                        dev_dbg(&nvdimm_bus->dev, "'%s' command while read-only.\n",
                                        nvdimm ? nvdimm_cmd_name(cmd)
                                        : nvdimm_bus_cmd_name(cmd));
@@ -643,6 +677,16 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
                in_len += in_size;
        }
 
+       if (cmd == ND_CMD_CALL) {
+               dev_dbg(dev, "%s:%s, idx: %llu, in: %zu, out: %zu, len %zu\n",
+                               __func__, dimm_name, pkg.nd_command,
+                               in_len, out_len, buf_len);
+
+               for (i = 0; i < ARRAY_SIZE(pkg.nd_reserved2); i++)
+                       if (pkg.nd_reserved2[i])
+                               return -EINVAL;
+       }
+
        /* process an output envelope */
        for (i = 0; i < desc->out_num; i++) {
                u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i,
@@ -783,6 +827,9 @@ int __init nvdimm_bus_init(void)
 {
        int rc;
 
+       BUILD_BUG_ON(sizeof(struct nd_smart_payload) != 128);
+       BUILD_BUG_ON(sizeof(struct nd_smart_threshold_payload) != 8);
+
        rc = bus_register(&nvdimm_bus_type);
        if (rc)
                return rc;
index e8f03b0e95e4a7b5357e1a50ad704218bd0267ac..8b2e3c4fb0add718d2dbf167b499516a94612c80 100644 (file)
@@ -12,6 +12,7 @@
  */
 #include <linux/device.h>
 #include <linux/sizes.h>
+#include <linux/pmem.h>
 #include "nd-core.h"
 #include "pfn.h"
 #include "btt.h"
@@ -84,12 +85,33 @@ static bool is_idle(struct device *dev, struct nd_namespace_common *ndns)
                seed = nd_region->btt_seed;
        else if (is_nd_pfn(dev))
                seed = nd_region->pfn_seed;
+       else if (is_nd_dax(dev))
+               seed = nd_region->dax_seed;
 
        if (seed == dev || ndns || dev->driver)
                return false;
        return true;
 }
 
+struct nd_pfn *to_nd_pfn_safe(struct device *dev)
+{
+       /*
+        * pfn device attributes are re-used by dax device instances, so we
+        * need to be careful to correct device-to-nd_pfn conversion.
+        */
+       if (is_nd_pfn(dev))
+               return to_nd_pfn(dev);
+
+       if (is_nd_dax(dev)) {
+               struct nd_dax *nd_dax = to_nd_dax(dev);
+
+               return &nd_dax->nd_pfn;
+       }
+
+       WARN_ON(1);
+       return NULL;
+}
+
 static void nd_detach_and_reset(struct device *dev,
                struct nd_namespace_common **_ndns)
 {
@@ -103,8 +125,8 @@ static void nd_detach_and_reset(struct device *dev,
                nd_btt->lbasize = 0;
                kfree(nd_btt->uuid);
                nd_btt->uuid = NULL;
-       } else if (is_nd_pfn(dev)) {
-               struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       } else if (is_nd_pfn(dev) || is_nd_dax(dev)) {
+               struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
 
                kfree(nd_pfn->uuid);
                nd_pfn->uuid = NULL;
@@ -199,3 +221,63 @@ u64 nd_sb_checksum(struct nd_gen_sb *nd_gen_sb)
        return sum;
 }
 EXPORT_SYMBOL(nd_sb_checksum);
+
+static int nsio_rw_bytes(struct nd_namespace_common *ndns,
+               resource_size_t offset, void *buf, size_t size, int rw)
+{
+       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
+
+       if (unlikely(offset + size > nsio->size)) {
+               dev_WARN_ONCE(&ndns->dev, 1, "request out of range\n");
+               return -EFAULT;
+       }
+
+       if (rw == READ) {
+               unsigned int sz_align = ALIGN(size + (offset & (512 - 1)), 512);
+
+               if (unlikely(is_bad_pmem(&nsio->bb, offset / 512, sz_align)))
+                       return -EIO;
+               return memcpy_from_pmem(buf, nsio->addr + offset, size);
+       } else {
+               memcpy_to_pmem(nsio->addr + offset, buf, size);
+               wmb_pmem();
+       }
+
+       return 0;
+}
+
+int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio)
+{
+       struct resource *res = &nsio->res;
+       struct nd_namespace_common *ndns = &nsio->common;
+
+       nsio->size = resource_size(res);
+       if (!devm_request_mem_region(dev, res->start, resource_size(res),
+                               dev_name(dev))) {
+               dev_warn(dev, "could not reserve region %pR\n", res);
+               return -EBUSY;
+       }
+
+       ndns->rw_bytes = nsio_rw_bytes;
+       if (devm_init_badblocks(dev, &nsio->bb))
+               return -ENOMEM;
+       nvdimm_badblocks_populate(to_nd_region(ndns->dev.parent), &nsio->bb,
+                       &nsio->res);
+
+       nsio->addr = devm_memremap(dev, res->start, resource_size(res),
+                       ARCH_MEMREMAP_PMEM);
+       if (IS_ERR(nsio->addr))
+               return PTR_ERR(nsio->addr);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devm_nsio_enable);
+
+void devm_nsio_disable(struct device *dev, struct nd_namespace_io *nsio)
+{
+       struct resource *res = &nsio->res;
+
+       devm_memunmap(dev, nsio->addr);
+       devm_exit_badblocks(dev, &nsio->bb);
+       devm_release_mem_region(dev, res->start, resource_size(res));
+}
+EXPORT_SYMBOL_GPL(devm_nsio_disable);
index 182a93fe37128d87d53b3c77d121ca28bb3ec8fd..be89764315c2b54d9bbe9548fc3f6183d6032ea4 100644 (file)
@@ -251,7 +251,7 @@ static ssize_t commands_show(struct device *dev,
        struct nvdimm_bus *nvdimm_bus = to_nvdimm_bus(dev);
        struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc;
 
-       for_each_set_bit(cmd, &nd_desc->dsm_mask, BITS_PER_LONG)
+       for_each_set_bit(cmd, &nd_desc->cmd_mask, BITS_PER_LONG)
                len += sprintf(buf + len, "%s ", nvdimm_bus_cmd_name(cmd));
        len += sprintf(buf + len, "\n");
        return len;
@@ -648,6 +648,9 @@ static __exit void libnvdimm_exit(void)
        nd_region_exit();
        nvdimm_exit();
        nvdimm_bus_exit();
+       nd_region_devs_exit();
+       nvdimm_devs_exit();
+       ida_destroy(&nd_ida);
 }
 
 MODULE_LICENSE("GPL v2");
diff --git a/drivers/nvdimm/dax_devs.c b/drivers/nvdimm/dax_devs.c
new file mode 100644 (file)
index 0000000..45fa82c
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Copyright(c) 2013-2016 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ */
+#include <linux/device.h>
+#include <linux/sizes.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include "nd-core.h"
+#include "pfn.h"
+#include "nd.h"
+
+static void nd_dax_release(struct device *dev)
+{
+       struct nd_region *nd_region = to_nd_region(dev->parent);
+       struct nd_dax *nd_dax = to_nd_dax(dev);
+       struct nd_pfn *nd_pfn = &nd_dax->nd_pfn;
+
+       dev_dbg(dev, "%s\n", __func__);
+       nd_detach_ndns(dev, &nd_pfn->ndns);
+       ida_simple_remove(&nd_region->dax_ida, nd_pfn->id);
+       kfree(nd_pfn->uuid);
+       kfree(nd_dax);
+}
+
+static struct device_type nd_dax_device_type = {
+       .name = "nd_dax",
+       .release = nd_dax_release,
+};
+
+bool is_nd_dax(struct device *dev)
+{
+       return dev ? dev->type == &nd_dax_device_type : false;
+}
+EXPORT_SYMBOL(is_nd_dax);
+
+struct nd_dax *to_nd_dax(struct device *dev)
+{
+       struct nd_dax *nd_dax = container_of(dev, struct nd_dax, nd_pfn.dev);
+
+       WARN_ON(!is_nd_dax(dev));
+       return nd_dax;
+}
+EXPORT_SYMBOL(to_nd_dax);
+
+static const struct attribute_group *nd_dax_attribute_groups[] = {
+       &nd_pfn_attribute_group,
+       &nd_device_attribute_group,
+       &nd_numa_attribute_group,
+       NULL,
+};
+
+static struct nd_dax *nd_dax_alloc(struct nd_region *nd_region)
+{
+       struct nd_pfn *nd_pfn;
+       struct nd_dax *nd_dax;
+       struct device *dev;
+
+       nd_dax = kzalloc(sizeof(*nd_dax), GFP_KERNEL);
+       if (!nd_dax)
+               return NULL;
+
+       nd_pfn = &nd_dax->nd_pfn;
+       nd_pfn->id = ida_simple_get(&nd_region->dax_ida, 0, 0, GFP_KERNEL);
+       if (nd_pfn->id < 0) {
+               kfree(nd_dax);
+               return NULL;
+       }
+
+       dev = &nd_pfn->dev;
+       dev_set_name(dev, "dax%d.%d", nd_region->id, nd_pfn->id);
+       dev->groups = nd_dax_attribute_groups;
+       dev->type = &nd_dax_device_type;
+       dev->parent = &nd_region->dev;
+
+       return nd_dax;
+}
+
+struct device *nd_dax_create(struct nd_region *nd_region)
+{
+       struct device *dev = NULL;
+       struct nd_dax *nd_dax;
+
+       if (!is_nd_pmem(&nd_region->dev))
+               return NULL;
+
+       nd_dax = nd_dax_alloc(nd_region);
+       if (nd_dax)
+               dev = nd_pfn_devinit(&nd_dax->nd_pfn, NULL);
+       __nd_device_register(dev);
+       return dev;
+}
+
+int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns)
+{
+       int rc;
+       struct nd_dax *nd_dax;
+       struct device *dax_dev;
+       struct nd_pfn *nd_pfn;
+       struct nd_pfn_sb *pfn_sb;
+       struct nd_region *nd_region = to_nd_region(ndns->dev.parent);
+
+       if (ndns->force_raw)
+               return -ENODEV;
+
+       nvdimm_bus_lock(&ndns->dev);
+       nd_dax = nd_dax_alloc(nd_region);
+       nd_pfn = &nd_dax->nd_pfn;
+       dax_dev = nd_pfn_devinit(nd_pfn, ndns);
+       nvdimm_bus_unlock(&ndns->dev);
+       if (!dax_dev)
+               return -ENOMEM;
+       pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL);
+       nd_pfn->pfn_sb = pfn_sb;
+       rc = nd_pfn_validate(nd_pfn, DAX_SIG);
+       dev_dbg(dev, "%s: dax: %s\n", __func__,
+                       rc == 0 ? dev_name(dax_dev) : "<none>");
+       if (rc < 0) {
+               __nd_detach_ndns(dax_dev, &nd_pfn->ndns);
+               put_device(dax_dev);
+       } else
+               __nd_device_register(dax_dev);
+
+       return rc;
+}
+EXPORT_SYMBOL(nd_dax_probe);
index c56f88217924b93b3dca5f594c01c5edbe801bed..bbde28d3dec5cd4bbbb283847d2f736bc81148c9 100644 (file)
@@ -37,9 +37,9 @@ static int __validate_dimm(struct nvdimm_drvdata *ndd)
 
        nvdimm = to_nvdimm(ndd->dev);
 
-       if (!nvdimm->dsm_mask)
+       if (!nvdimm->cmd_mask)
                return -ENXIO;
-       if (!test_bit(ND_CMD_GET_CONFIG_DATA, nvdimm->dsm_mask))
+       if (!test_bit(ND_CMD_GET_CONFIG_DATA, &nvdimm->cmd_mask))
                return -ENXIO;
 
        return 0;
@@ -263,6 +263,12 @@ const char *nvdimm_name(struct nvdimm *nvdimm)
 }
 EXPORT_SYMBOL_GPL(nvdimm_name);
 
+unsigned long nvdimm_cmd_mask(struct nvdimm *nvdimm)
+{
+       return nvdimm->cmd_mask;
+}
+EXPORT_SYMBOL_GPL(nvdimm_cmd_mask);
+
 void *nvdimm_provider_data(struct nvdimm *nvdimm)
 {
        if (nvdimm)
@@ -277,10 +283,10 @@ static ssize_t commands_show(struct device *dev,
        struct nvdimm *nvdimm = to_nvdimm(dev);
        int cmd, len = 0;
 
-       if (!nvdimm->dsm_mask)
+       if (!nvdimm->cmd_mask)
                return sprintf(buf, "\n");
 
-       for_each_set_bit(cmd, nvdimm->dsm_mask, BITS_PER_LONG)
+       for_each_set_bit(cmd, &nvdimm->cmd_mask, BITS_PER_LONG)
                len += sprintf(buf + len, "%s ", nvdimm_cmd_name(cmd));
        len += sprintf(buf + len, "\n");
        return len;
@@ -340,7 +346,7 @@ EXPORT_SYMBOL_GPL(nvdimm_attribute_group);
 
 struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
                const struct attribute_group **groups, unsigned long flags,
-               unsigned long *dsm_mask)
+               unsigned long cmd_mask)
 {
        struct nvdimm *nvdimm = kzalloc(sizeof(*nvdimm), GFP_KERNEL);
        struct device *dev;
@@ -355,7 +361,7 @@ struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
        }
        nvdimm->provider_data = provider_data;
        nvdimm->flags = flags;
-       nvdimm->dsm_mask = dsm_mask;
+       nvdimm->cmd_mask = cmd_mask;
        atomic_set(&nvdimm->busy, 0);
        dev = &nvdimm->dev;
        dev_set_name(dev, "nmem%d", nvdimm->id);
@@ -546,3 +552,8 @@ int nvdimm_bus_check_dimm_count(struct nvdimm_bus *nvdimm_bus, int dimm_count)
        return 0;
 }
 EXPORT_SYMBOL_GPL(nvdimm_bus_check_dimm_count);
+
+void __exit nvdimm_devs_exit(void)
+{
+       ida_destroy(&dimm_ida);
+}
index f5cb886013591bfa384fc5f19d95eb823ee1e1c3..c5e3196c45b02cc5f9070ff8cd9289e46c926ee1 100644 (file)
@@ -1288,6 +1288,8 @@ static ssize_t mode_show(struct device *dev,
                mode = "safe";
        else if (claim && is_nd_pfn(claim))
                mode = "memory";
+       else if (claim && is_nd_dax(claim))
+               mode = "dax";
        else if (!claim && pmem_should_map_pages(dev))
                mode = "memory";
        else
@@ -1379,21 +1381,19 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
 {
        struct nd_btt *nd_btt = is_nd_btt(dev) ? to_nd_btt(dev) : NULL;
        struct nd_pfn *nd_pfn = is_nd_pfn(dev) ? to_nd_pfn(dev) : NULL;
-       struct nd_namespace_common *ndns;
+       struct nd_dax *nd_dax = is_nd_dax(dev) ? to_nd_dax(dev) : NULL;
+       struct nd_namespace_common *ndns = NULL;
        resource_size_t size;
 
-       if (nd_btt || nd_pfn) {
-               struct device *host = NULL;
-
-               if (nd_btt) {
-                       host = &nd_btt->dev;
+       if (nd_btt || nd_pfn || nd_dax) {
+               if (nd_btt)
                        ndns = nd_btt->ndns;
-               } else if (nd_pfn) {
-                       host = &nd_pfn->dev;
+               else if (nd_pfn)
                        ndns = nd_pfn->ndns;
-               }
+               else if (nd_dax)
+                       ndns = nd_dax->nd_pfn.ndns;
 
-               if (!ndns || !host)
+               if (!ndns)
                        return ERR_PTR(-ENODEV);
 
                /*
@@ -1404,12 +1404,12 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
                device_unlock(&ndns->dev);
                if (ndns->dev.driver) {
                        dev_dbg(&ndns->dev, "is active, can't bind %s\n",
-                                       dev_name(host));
+                                       dev_name(dev));
                        return ERR_PTR(-EBUSY);
                }
-               if (dev_WARN_ONCE(&ndns->dev, ndns->claim != host,
+               if (dev_WARN_ONCE(&ndns->dev, ndns->claim != dev,
                                        "host (%s) vs claim (%s) mismatch\n",
-                                       dev_name(host),
+                                       dev_name(dev),
                                        dev_name(ndns->claim)))
                        return ERR_PTR(-ENXIO);
        } else {
@@ -1784,6 +1784,18 @@ void nd_region_create_blk_seed(struct nd_region *nd_region)
                nd_device_register(nd_region->ns_seed);
 }
 
+void nd_region_create_dax_seed(struct nd_region *nd_region)
+{
+       WARN_ON(!is_nvdimm_bus_locked(&nd_region->dev));
+       nd_region->dax_seed = nd_dax_create(nd_region);
+       /*
+        * Seed creation failures are not fatal, provisioning is simply
+        * disabled until memory becomes available
+        */
+       if (!nd_region->dax_seed)
+               dev_err(&nd_region->dev, "failed to create dax namespace\n");
+}
+
 void nd_region_create_pfn_seed(struct nd_region *nd_region)
 {
        WARN_ON(!is_nvdimm_bus_locked(&nd_region->dev));
index 1d1500f3d8b51b557ffc7295e356a8f138cef0ac..284cdaa268cfd8132bc7fcd7299d66eaa4256217 100644 (file)
@@ -37,7 +37,7 @@ struct nvdimm_bus {
 struct nvdimm {
        unsigned long flags;
        void *provider_data;
-       unsigned long *dsm_mask;
+       unsigned long cmd_mask;
        struct device dev;
        atomic_t busy;
        int id;
@@ -49,11 +49,14 @@ bool is_nd_blk(struct device *dev);
 struct nvdimm_bus *walk_to_nvdimm_bus(struct device *nd_dev);
 int __init nvdimm_bus_init(void);
 void nvdimm_bus_exit(void);
+void nvdimm_devs_exit(void);
+void nd_region_devs_exit(void);
 void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev);
 struct nd_region;
 void nd_region_create_blk_seed(struct nd_region *nd_region);
 void nd_region_create_btt_seed(struct nd_region *nd_region);
 void nd_region_create_pfn_seed(struct nd_region *nd_region);
+void nd_region_create_dax_seed(struct nd_region *nd_region);
 void nd_region_disable(struct nvdimm_bus *nvdimm_bus, struct device *dev);
 int nvdimm_bus_create_ndctl(struct nvdimm_bus *nvdimm_bus);
 void nvdimm_bus_destroy_ndctl(struct nvdimm_bus *nvdimm_bus);
@@ -91,4 +94,5 @@ bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach,
 ssize_t nd_namespace_store(struct device *dev,
                struct nd_namespace_common **_ndns, const char *buf,
                size_t len);
+struct nd_pfn *to_nd_pfn_safe(struct device *dev);
 #endif /* __ND_CORE_H__ */
index 875c524fafb0ed2235a9724517601bf45107c80a..d0ac93c31dda6adcd01a4be288b3963d5f09f084 100644 (file)
@@ -13,6 +13,7 @@
 #ifndef __ND_H__
 #define __ND_H__
 #include <linux/libnvdimm.h>
+#include <linux/badblocks.h>
 #include <linux/blkdev.h>
 #include <linux/device.h>
 #include <linux/mutex.h>
@@ -100,10 +101,12 @@ struct nd_region {
        struct ida ns_ida;
        struct ida btt_ida;
        struct ida pfn_ida;
+       struct ida dax_ida;
        unsigned long flags;
        struct device *ns_seed;
        struct device *btt_seed;
        struct device *pfn_seed;
+       struct device *dax_seed;
        u16 ndr_mappings;
        u64 ndr_size;
        u64 ndr_start;
@@ -160,6 +163,10 @@ struct nd_pfn {
        struct nd_namespace_common *ndns;
 };
 
+struct nd_dax {
+       struct nd_pfn nd_pfn;
+};
+
 enum nd_async_mode {
        ND_SYNC,
        ND_ASYNC,
@@ -197,11 +204,12 @@ struct nd_gen_sb {
 
 u64 nd_sb_checksum(struct nd_gen_sb *sb);
 #if IS_ENABLED(CONFIG_BTT)
-int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata);
+int nd_btt_probe(struct device *dev, struct nd_namespace_common *ndns);
 bool is_nd_btt(struct device *dev);
 struct device *nd_btt_create(struct nd_region *nd_region);
 #else
-static inline int nd_btt_probe(struct nd_namespace_common *ndns, void *drvdata)
+static inline int nd_btt_probe(struct device *dev,
+               struct nd_namespace_common *ndns)
 {
        return -ENODEV;
 }
@@ -219,12 +227,16 @@ static inline struct device *nd_btt_create(struct nd_region *nd_region)
 
 struct nd_pfn *to_nd_pfn(struct device *dev);
 #if IS_ENABLED(CONFIG_NVDIMM_PFN)
-int nd_pfn_probe(struct nd_namespace_common *ndns, void *drvdata);
+int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns);
 bool is_nd_pfn(struct device *dev);
 struct device *nd_pfn_create(struct nd_region *nd_region);
-int nd_pfn_validate(struct nd_pfn *nd_pfn);
+struct device *nd_pfn_devinit(struct nd_pfn *nd_pfn,
+               struct nd_namespace_common *ndns);
+int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig);
+extern struct attribute_group nd_pfn_attribute_group;
 #else
-static inline int nd_pfn_probe(struct nd_namespace_common *ndns, void *drvdata)
+static inline int nd_pfn_probe(struct device *dev,
+               struct nd_namespace_common *ndns)
 {
        return -ENODEV;
 }
@@ -239,12 +251,35 @@ static inline struct device *nd_pfn_create(struct nd_region *nd_region)
        return NULL;
 }
 
-static inline int nd_pfn_validate(struct nd_pfn *nd_pfn)
+static inline int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig)
 {
        return -ENODEV;
 }
 #endif
 
+struct nd_dax *to_nd_dax(struct device *dev);
+#if IS_ENABLED(CONFIG_NVDIMM_DAX)
+int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns);
+bool is_nd_dax(struct device *dev);
+struct device *nd_dax_create(struct nd_region *nd_region);
+#else
+static inline int nd_dax_probe(struct device *dev,
+               struct nd_namespace_common *ndns)
+{
+       return -ENODEV;
+}
+
+static inline bool is_nd_dax(struct device *dev)
+{
+       return false;
+}
+
+static inline struct device *nd_dax_create(struct nd_region *nd_region)
+{
+       return NULL;
+}
+#endif
+
 struct nd_region *to_nd_region(struct device *dev);
 int nd_region_to_nstype(struct nd_region *nd_region);
 int nd_region_register_namespaces(struct nd_region *nd_region, int *err);
@@ -263,11 +298,32 @@ struct resource *nvdimm_allocate_dpa(struct nvdimm_drvdata *ndd,
 resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns);
 struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev);
 int nvdimm_namespace_attach_btt(struct nd_namespace_common *ndns);
-int nvdimm_namespace_detach_btt(struct nd_namespace_common *ndns);
+int nvdimm_namespace_detach_btt(struct nd_btt *nd_btt);
 const char *nvdimm_namespace_disk_name(struct nd_namespace_common *ndns,
                char *name);
 void nvdimm_badblocks_populate(struct nd_region *nd_region,
                struct badblocks *bb, const struct resource *res);
+#if IS_ENABLED(CONFIG_ND_CLAIM)
+struct vmem_altmap *nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
+               struct resource *res, struct vmem_altmap *altmap);
+int devm_nsio_enable(struct device *dev, struct nd_namespace_io *nsio);
+void devm_nsio_disable(struct device *dev, struct nd_namespace_io *nsio);
+#else
+static inline struct vmem_altmap *nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
+               struct resource *res, struct vmem_altmap *altmap)
+{
+       return ERR_PTR(-ENXIO);
+}
+static inline int devm_nsio_enable(struct device *dev,
+               struct nd_namespace_io *nsio)
+{
+       return -ENXIO;
+}
+static inline void devm_nsio_disable(struct device *dev,
+               struct nd_namespace_io *nsio)
+{
+}
+#endif
 int nd_blk_region_init(struct nd_region *nd_region);
 void __nd_iostat_start(struct bio *bio, unsigned long *start);
 static inline bool nd_iostat_start(struct bio *bio, unsigned long *start)
@@ -281,6 +337,19 @@ static inline bool nd_iostat_start(struct bio *bio, unsigned long *start)
        return true;
 }
 void nd_iostat_end(struct bio *bio, unsigned long start);
+static inline bool is_bad_pmem(struct badblocks *bb, sector_t sector,
+               unsigned int len)
+{
+       if (bb->count) {
+               sector_t first_bad;
+               int num_bad;
+
+               return !!badblocks_check(bb, sector, len / 512, &first_bad,
+                               &num_bad);
+       }
+
+       return false;
+}
 resource_size_t nd_namespace_blk_validate(struct nd_namespace_blk *nsblk);
 const u8 *nd_dev_to_uuid(struct device *dev);
 bool pmem_should_map_pages(struct device *dev);
index 8e343a3ca873012a7124c46564f9bcc4833c7a67..dde9853453d3c622c42511772ff807bcf1fd70d0 100644 (file)
@@ -19,6 +19,7 @@
 
 #define PFN_SIG_LEN 16
 #define PFN_SIG "NVDIMM_PFN_INFO\0"
+#define DAX_SIG "NVDIMM_DAX_INFO\0"
 
 struct nd_pfn_sb {
        u8 signature[PFN_SIG_LEN];
@@ -33,7 +34,9 @@ struct nd_pfn_sb {
        /* minor-version-1 additions for section alignment */
        __le32 start_pad;
        __le32 end_trunc;
-       u8 padding[4004];
+       /* minor-version-2 record the base alignment of the mapping */
+       __le32 align;
+       u8 padding[4000];
        __le64 checksum;
 };
 
index e071e214febadae71d2d369319b76cd5b6b1a851..f7718ec685fadaee4e1460210b3733b5950acfc5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
+ * Copyright(c) 2013-2016 Intel Corporation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -10,6 +10,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  */
+#include <linux/memremap.h>
 #include <linux/blkdev.h>
 #include <linux/device.h>
 #include <linux/genhd.h>
@@ -56,7 +57,7 @@ EXPORT_SYMBOL(to_nd_pfn);
 static ssize_t mode_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
 
        switch (nd_pfn->mode) {
        case PFN_MODE_RAM:
@@ -71,7 +72,7 @@ static ssize_t mode_show(struct device *dev,
 static ssize_t mode_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc = 0;
 
        device_lock(dev);
@@ -105,7 +106,7 @@ static DEVICE_ATTR_RW(mode);
 static ssize_t align_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
 
        return sprintf(buf, "%lx\n", nd_pfn->align);
 }
@@ -133,7 +134,7 @@ static ssize_t __align_store(struct nd_pfn *nd_pfn, const char *buf)
 static ssize_t align_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        device_lock(dev);
@@ -151,7 +152,7 @@ static DEVICE_ATTR_RW(align);
 static ssize_t uuid_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
 
        if (nd_pfn->uuid)
                return sprintf(buf, "%pUb\n", nd_pfn->uuid);
@@ -161,7 +162,7 @@ static ssize_t uuid_show(struct device *dev,
 static ssize_t uuid_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        device_lock(dev);
@@ -177,7 +178,7 @@ static DEVICE_ATTR_RW(uuid);
 static ssize_t namespace_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        nvdimm_bus_lock(dev);
@@ -190,7 +191,7 @@ static ssize_t namespace_show(struct device *dev,
 static ssize_t namespace_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        device_lock(dev);
@@ -208,7 +209,7 @@ static DEVICE_ATTR_RW(namespace);
 static ssize_t resource_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        device_lock(dev);
@@ -234,7 +235,7 @@ static DEVICE_ATTR_RO(resource);
 static ssize_t size_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
        ssize_t rc;
 
        device_lock(dev);
@@ -269,7 +270,7 @@ static struct attribute *nd_pfn_attributes[] = {
        NULL,
 };
 
-static struct attribute_group nd_pfn_attribute_group = {
+struct attribute_group nd_pfn_attribute_group = {
        .attrs = nd_pfn_attributes,
 };
 
@@ -280,15 +281,31 @@ static const struct attribute_group *nd_pfn_attribute_groups[] = {
        NULL,
 };
 
-static struct device *__nd_pfn_create(struct nd_region *nd_region,
+struct device *nd_pfn_devinit(struct nd_pfn *nd_pfn,
                struct nd_namespace_common *ndns)
 {
-       struct nd_pfn *nd_pfn;
-       struct device *dev;
+       struct device *dev = &nd_pfn->dev;
 
-       /* we can only create pages for contiguous ranged of pmem */
-       if (!is_nd_pmem(&nd_region->dev))
+       if (!nd_pfn)
+               return NULL;
+
+       nd_pfn->mode = PFN_MODE_NONE;
+       nd_pfn->align = HPAGE_SIZE;
+       dev = &nd_pfn->dev;
+       device_initialize(&nd_pfn->dev);
+       if (ndns && !__nd_attach_ndns(&nd_pfn->dev, ndns, &nd_pfn->ndns)) {
+               dev_dbg(&ndns->dev, "%s failed, already claimed by %s\n",
+                               __func__, dev_name(ndns->claim));
+               put_device(dev);
                return NULL;
+       }
+       return dev;
+}
+
+static struct nd_pfn *nd_pfn_alloc(struct nd_region *nd_region)
+{
+       struct nd_pfn *nd_pfn;
+       struct device *dev;
 
        nd_pfn = kzalloc(sizeof(*nd_pfn), GFP_KERNEL);
        if (!nd_pfn)
@@ -300,33 +317,31 @@ static struct device *__nd_pfn_create(struct nd_region *nd_region,
                return NULL;
        }
 
-       nd_pfn->mode = PFN_MODE_NONE;
-       nd_pfn->align = HPAGE_SIZE;
        dev = &nd_pfn->dev;
        dev_set_name(dev, "pfn%d.%d", nd_region->id, nd_pfn->id);
-       dev->parent = &nd_region->dev;
-       dev->type = &nd_pfn_device_type;
        dev->groups = nd_pfn_attribute_groups;
-       device_initialize(&nd_pfn->dev);
-       if (ndns && !__nd_attach_ndns(&nd_pfn->dev, ndns, &nd_pfn->ndns)) {
-               dev_dbg(&ndns->dev, "%s failed, already claimed by %s\n",
-                               __func__, dev_name(ndns->claim));
-               put_device(dev);
-               return NULL;
-       }
-       return dev;
+       dev->type = &nd_pfn_device_type;
+       dev->parent = &nd_region->dev;
+
+       return nd_pfn;
 }
 
 struct device *nd_pfn_create(struct nd_region *nd_region)
 {
-       struct device *dev = __nd_pfn_create(nd_region, NULL);
+       struct nd_pfn *nd_pfn;
+       struct device *dev;
+
+       if (!is_nd_pmem(&nd_region->dev))
+               return NULL;
+
+       nd_pfn = nd_pfn_alloc(nd_region);
+       dev = nd_pfn_devinit(nd_pfn, NULL);
 
-       if (dev)
-               __nd_device_register(dev);
+       __nd_device_register(dev);
        return dev;
 }
 
-int nd_pfn_validate(struct nd_pfn *nd_pfn)
+int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig)
 {
        u64 checksum, offset;
        struct nd_namespace_io *nsio;
@@ -343,7 +358,7 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
        if (nvdimm_read_bytes(ndns, SZ_4K, pfn_sb, sizeof(*pfn_sb)))
                return -ENXIO;
 
-       if (memcmp(pfn_sb->signature, PFN_SIG, PFN_SIG_LEN) != 0)
+       if (memcmp(pfn_sb->signature, sig, PFN_SIG_LEN) != 0)
                return -ENODEV;
 
        checksum = le64_to_cpu(pfn_sb->checksum);
@@ -360,6 +375,9 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
                pfn_sb->end_trunc = 0;
        }
 
+       if (__le16_to_cpu(pfn_sb->version_minor) < 2)
+               pfn_sb->align = 0;
+
        switch (le32_to_cpu(pfn_sb->mode)) {
        case PFN_MODE_RAM:
        case PFN_MODE_PMEM:
@@ -379,6 +397,8 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
                        return -ENODEV;
        }
 
+       if (nd_pfn->align == 0)
+               nd_pfn->align = le32_to_cpu(pfn_sb->align);
        if (nd_pfn->align > nvdimm_namespace_capacity(ndns)) {
                dev_err(&nd_pfn->dev, "alignment: %lx exceeds capacity %llx\n",
                                nd_pfn->align, nvdimm_namespace_capacity(ndns));
@@ -399,8 +419,8 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
                return -EBUSY;
        }
 
-       nd_pfn->align = 1UL << ilog2(offset);
-       if (!is_power_of_2(offset) || offset < PAGE_SIZE) {
+       if ((nd_pfn->align && !IS_ALIGNED(offset, nd_pfn->align))
+                       || !IS_ALIGNED(offset, PAGE_SIZE)) {
                dev_err(&nd_pfn->dev, "bad offset: %#llx dax disabled\n",
                                offset);
                return -ENXIO;
@@ -410,11 +430,11 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn)
 }
 EXPORT_SYMBOL(nd_pfn_validate);
 
-int nd_pfn_probe(struct nd_namespace_common *ndns, void *drvdata)
+int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns)
 {
        int rc;
-       struct device *dev;
        struct nd_pfn *nd_pfn;
+       struct device *pfn_dev;
        struct nd_pfn_sb *pfn_sb;
        struct nd_region *nd_region = to_nd_region(ndns->dev.parent);
 
@@ -422,25 +442,218 @@ int nd_pfn_probe(struct nd_namespace_common *ndns, void *drvdata)
                return -ENODEV;
 
        nvdimm_bus_lock(&ndns->dev);
-       dev = __nd_pfn_create(nd_region, ndns);
+       nd_pfn = nd_pfn_alloc(nd_region);
+       pfn_dev = nd_pfn_devinit(nd_pfn, ndns);
        nvdimm_bus_unlock(&ndns->dev);
-       if (!dev)
+       if (!pfn_dev)
                return -ENOMEM;
-       dev_set_drvdata(dev, drvdata);
-       pfn_sb = kzalloc(sizeof(*pfn_sb), GFP_KERNEL);
-       nd_pfn = to_nd_pfn(dev);
+       pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL);
+       nd_pfn = to_nd_pfn(pfn_dev);
        nd_pfn->pfn_sb = pfn_sb;
-       rc = nd_pfn_validate(nd_pfn);
-       nd_pfn->pfn_sb = NULL;
-       kfree(pfn_sb);
-       dev_dbg(&ndns->dev, "%s: pfn: %s\n", __func__,
-                       rc == 0 ? dev_name(dev) : "<none>");
+       rc = nd_pfn_validate(nd_pfn, PFN_SIG);
+       dev_dbg(dev, "%s: pfn: %s\n", __func__,
+                       rc == 0 ? dev_name(pfn_dev) : "<none>");
        if (rc < 0) {
-               __nd_detach_ndns(dev, &nd_pfn->ndns);
-               put_device(dev);
+               __nd_detach_ndns(pfn_dev, &nd_pfn->ndns);
+               put_device(pfn_dev);
        } else
-               __nd_device_register(&nd_pfn->dev);
+               __nd_device_register(pfn_dev);
 
        return rc;
 }
 EXPORT_SYMBOL(nd_pfn_probe);
+
+/*
+ * We hotplug memory at section granularity, pad the reserved area from
+ * the previous section base to the namespace base address.
+ */
+static unsigned long init_altmap_base(resource_size_t base)
+{
+       unsigned long base_pfn = PHYS_PFN(base);
+
+       return PFN_SECTION_ALIGN_DOWN(base_pfn);
+}
+
+static unsigned long init_altmap_reserve(resource_size_t base)
+{
+       unsigned long reserve = PHYS_PFN(SZ_8K);
+       unsigned long base_pfn = PHYS_PFN(base);
+
+       reserve += base_pfn - PFN_SECTION_ALIGN_DOWN(base_pfn);
+       return reserve;
+}
+
+static struct vmem_altmap *__nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
+               struct resource *res, struct vmem_altmap *altmap)
+{
+       struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
+       u64 offset = le64_to_cpu(pfn_sb->dataoff);
+       u32 start_pad = __le32_to_cpu(pfn_sb->start_pad);
+       u32 end_trunc = __le32_to_cpu(pfn_sb->end_trunc);
+       struct nd_namespace_common *ndns = nd_pfn->ndns;
+       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
+       resource_size_t base = nsio->res.start + start_pad;
+       struct vmem_altmap __altmap = {
+               .base_pfn = init_altmap_base(base),
+               .reserve = init_altmap_reserve(base),
+       };
+
+       memcpy(res, &nsio->res, sizeof(*res));
+       res->start += start_pad;
+       res->end -= end_trunc;
+
+       nd_pfn->mode = le32_to_cpu(nd_pfn->pfn_sb->mode);
+       if (nd_pfn->mode == PFN_MODE_RAM) {
+               if (offset < SZ_8K)
+                       return ERR_PTR(-EINVAL);
+               nd_pfn->npfns = le64_to_cpu(pfn_sb->npfns);
+               altmap = NULL;
+       } else if (nd_pfn->mode == PFN_MODE_PMEM) {
+               nd_pfn->npfns = (resource_size(res) - offset) / PAGE_SIZE;
+               if (le64_to_cpu(nd_pfn->pfn_sb->npfns) > nd_pfn->npfns)
+                       dev_info(&nd_pfn->dev,
+                                       "number of pfns truncated from %lld to %ld\n",
+                                       le64_to_cpu(nd_pfn->pfn_sb->npfns),
+                                       nd_pfn->npfns);
+               memcpy(altmap, &__altmap, sizeof(*altmap));
+               altmap->free = PHYS_PFN(offset - SZ_8K);
+               altmap->alloc = 0;
+       } else
+               return ERR_PTR(-ENXIO);
+
+       return altmap;
+}
+
+static int nd_pfn_init(struct nd_pfn *nd_pfn)
+{
+       u32 dax_label_reserve = is_nd_dax(&nd_pfn->dev) ? SZ_128K : 0;
+       struct nd_namespace_common *ndns = nd_pfn->ndns;
+       u32 start_pad = 0, end_trunc = 0;
+       resource_size_t start, size;
+       struct nd_namespace_io *nsio;
+       struct nd_region *nd_region;
+       struct nd_pfn_sb *pfn_sb;
+       unsigned long npfns;
+       phys_addr_t offset;
+       const char *sig;
+       u64 checksum;
+       int rc;
+
+       pfn_sb = devm_kzalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL);
+       if (!pfn_sb)
+               return -ENOMEM;
+
+       nd_pfn->pfn_sb = pfn_sb;
+       if (is_nd_dax(&nd_pfn->dev))
+               sig = DAX_SIG;
+       else
+               sig = PFN_SIG;
+       rc = nd_pfn_validate(nd_pfn, sig);
+       if (rc != -ENODEV)
+               return rc;
+
+       /* no info block, do init */;
+       nd_region = to_nd_region(nd_pfn->dev.parent);
+       if (nd_region->ro) {
+               dev_info(&nd_pfn->dev,
+                               "%s is read-only, unable to init metadata\n",
+                               dev_name(&nd_region->dev));
+               return -ENXIO;
+       }
+
+       memset(pfn_sb, 0, sizeof(*pfn_sb));
+
+       /*
+        * Check if pmem collides with 'System RAM' when section aligned and
+        * trim it accordingly
+        */
+       nsio = to_nd_namespace_io(&ndns->dev);
+       start = PHYS_SECTION_ALIGN_DOWN(nsio->res.start);
+       size = resource_size(&nsio->res);
+       if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
+                               IORES_DESC_NONE) == REGION_MIXED) {
+               start = nsio->res.start;
+               start_pad = PHYS_SECTION_ALIGN_UP(start) - start;
+       }
+
+       start = nsio->res.start;
+       size = PHYS_SECTION_ALIGN_UP(start + size) - start;
+       if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
+                               IORES_DESC_NONE) == REGION_MIXED) {
+               size = resource_size(&nsio->res);
+               end_trunc = start + size - PHYS_SECTION_ALIGN_DOWN(start + size);
+       }
+
+       if (start_pad + end_trunc)
+               dev_info(&nd_pfn->dev, "%s section collision, truncate %d bytes\n",
+                               dev_name(&ndns->dev), start_pad + end_trunc);
+
+       /*
+        * Note, we use 64 here for the standard size of struct page,
+        * debugging options may cause it to be larger in which case the
+        * implementation will limit the pfns advertised through
+        * ->direct_access() to those that are included in the memmap.
+        */
+       start += start_pad;
+       size = resource_size(&nsio->res);
+       npfns = (size - start_pad - end_trunc - SZ_8K) / SZ_4K;
+       if (nd_pfn->mode == PFN_MODE_PMEM) {
+               unsigned long memmap_size;
+
+               /*
+                * vmemmap_populate_hugepages() allocates the memmap array in
+                * HPAGE_SIZE chunks.
+                */
+               memmap_size = ALIGN(64 * npfns, HPAGE_SIZE);
+               offset = ALIGN(start + SZ_8K + memmap_size + dax_label_reserve,
+                               nd_pfn->align) - start;
+       } else if (nd_pfn->mode == PFN_MODE_RAM)
+               offset = ALIGN(start + SZ_8K + dax_label_reserve,
+                               nd_pfn->align) - start;
+       else
+               return -ENXIO;
+
+       if (offset + start_pad + end_trunc >= size) {
+               dev_err(&nd_pfn->dev, "%s unable to satisfy requested alignment\n",
+                               dev_name(&ndns->dev));
+               return -ENXIO;
+       }
+
+       npfns = (size - offset - start_pad - end_trunc) / SZ_4K;
+       pfn_sb->mode = cpu_to_le32(nd_pfn->mode);
+       pfn_sb->dataoff = cpu_to_le64(offset);
+       pfn_sb->npfns = cpu_to_le64(npfns);
+       memcpy(pfn_sb->signature, sig, PFN_SIG_LEN);
+       memcpy(pfn_sb->uuid, nd_pfn->uuid, 16);
+       memcpy(pfn_sb->parent_uuid, nd_dev_to_uuid(&ndns->dev), 16);
+       pfn_sb->version_major = cpu_to_le16(1);
+       pfn_sb->version_minor = cpu_to_le16(2);
+       pfn_sb->start_pad = cpu_to_le32(start_pad);
+       pfn_sb->end_trunc = cpu_to_le32(end_trunc);
+       pfn_sb->align = cpu_to_le32(nd_pfn->align);
+       checksum = nd_sb_checksum((struct nd_gen_sb *) pfn_sb);
+       pfn_sb->checksum = cpu_to_le64(checksum);
+
+       return nvdimm_write_bytes(ndns, SZ_4K, pfn_sb, sizeof(*pfn_sb));
+}
+
+/*
+ * Determine the effective resource range and vmem_altmap from an nd_pfn
+ * instance.
+ */
+struct vmem_altmap *nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
+               struct resource *res, struct vmem_altmap *altmap)
+{
+       int rc;
+
+       if (!nd_pfn->uuid || !nd_pfn->ndns)
+               return ERR_PTR(-ENODEV);
+
+       rc = nd_pfn_init(nd_pfn);
+       if (rc)
+               return ERR_PTR(rc);
+
+       /* we need a valid pfn_sb before we can init a vmem_altmap */
+       return __nvdimm_setup_pfn(nd_pfn, res, altmap);
+}
+EXPORT_SYMBOL_GPL(nvdimm_setup_pfn);
index 92f536596b24295f0b19aea551844eecb95f7df6..042baec569319bcd6539212bf7b2e123b51e7e3a 100644 (file)
 #include "nd.h"
 
 struct pmem_device {
-       struct request_queue    *pmem_queue;
-       struct gendisk          *pmem_disk;
-       struct nd_namespace_common *ndns;
-
        /* One contiguous memory region per device */
        phys_addr_t             phys_addr;
        /* when non-zero this device is hosting a 'pfn' instance */
@@ -50,23 +46,10 @@ struct pmem_device {
        struct badblocks        bb;
 };
 
-static bool is_bad_pmem(struct badblocks *bb, sector_t sector, unsigned int len)
-{
-       if (bb->count) {
-               sector_t first_bad;
-               int num_bad;
-
-               return !!badblocks_check(bb, sector, len / 512, &first_bad,
-                               &num_bad);
-       }
-
-       return false;
-}
-
 static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
                unsigned int len)
 {
-       struct device *dev = disk_to_dev(pmem->pmem_disk);
+       struct device *dev = pmem->bb.dev;
        sector_t sector;
        long cleared;
 
@@ -136,8 +119,7 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio)
        unsigned long start;
        struct bio_vec bvec;
        struct bvec_iter iter;
-       struct block_device *bdev = bio->bi_bdev;
-       struct pmem_device *pmem = bdev->bd_disk->private_data;
+       struct pmem_device *pmem = q->queuedata;
 
        do_acct = nd_iostat_start(bio, &start);
        bio_for_each_segment(bvec, bio, iter) {
@@ -162,7 +144,7 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio)
 static int pmem_rw_page(struct block_device *bdev, sector_t sector,
                       struct page *page, int rw)
 {
-       struct pmem_device *pmem = bdev->bd_disk->private_data;
+       struct pmem_device *pmem = bdev->bd_queue->queuedata;
        int rc;
 
        rc = pmem_do_bvec(pmem, page, PAGE_SIZE, 0, rw, sector);
@@ -184,7 +166,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector,
 static long pmem_direct_access(struct block_device *bdev, sector_t sector,
                      void __pmem **kaddr, pfn_t *pfn)
 {
-       struct pmem_device *pmem = bdev->bd_disk->private_data;
+       struct pmem_device *pmem = bdev->bd_queue->queuedata;
        resource_size_t offset = sector * 512 + pmem->data_offset;
 
        *kaddr = pmem->virt_addr + offset;
@@ -200,104 +182,119 @@ static const struct block_device_operations pmem_fops = {
        .revalidate_disk =      nvdimm_revalidate_disk,
 };
 
-static struct pmem_device *pmem_alloc(struct device *dev,
-               struct resource *res, int id)
+static void pmem_release_queue(void *q)
+{
+       blk_cleanup_queue(q);
+}
+
+void pmem_release_disk(void *disk)
 {
+       del_gendisk(disk);
+       put_disk(disk);
+}
+
+static int pmem_attach_disk(struct device *dev,
+               struct nd_namespace_common *ndns)
+{
+       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
+       struct vmem_altmap __altmap, *altmap = NULL;
+       struct resource *res = &nsio->res;
+       struct nd_pfn *nd_pfn = NULL;
+       int nid = dev_to_node(dev);
+       struct nd_pfn_sb *pfn_sb;
        struct pmem_device *pmem;
+       struct resource pfn_res;
        struct request_queue *q;
+       struct gendisk *disk;
+       void *addr;
+
+       /* while nsio_rw_bytes is active, parse a pfn info block if present */
+       if (is_nd_pfn(dev)) {
+               nd_pfn = to_nd_pfn(dev);
+               altmap = nvdimm_setup_pfn(nd_pfn, &pfn_res, &__altmap);
+               if (IS_ERR(altmap))
+                       return PTR_ERR(altmap);
+       }
+
+       /* we're attaching a block device, disable raw namespace access */
+       devm_nsio_disable(dev, nsio);
 
        pmem = devm_kzalloc(dev, sizeof(*pmem), GFP_KERNEL);
        if (!pmem)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
+       dev_set_drvdata(dev, pmem);
        pmem->phys_addr = res->start;
        pmem->size = resource_size(res);
        if (!arch_has_wmb_pmem())
                dev_warn(dev, "unable to guarantee persistence of writes\n");
 
-       if (!devm_request_mem_region(dev, pmem->phys_addr, pmem->size,
-                       dev_name(dev))) {
-               dev_warn(dev, "could not reserve region [0x%pa:0x%zx]\n",
-                               &pmem->phys_addr, pmem->size);
-               return ERR_PTR(-EBUSY);
+       if (!devm_request_mem_region(dev, res->start, resource_size(res),
+                               dev_name(dev))) {
+               dev_warn(dev, "could not reserve region %pR\n", res);
+               return -EBUSY;
        }
 
        q = blk_alloc_queue_node(GFP_KERNEL, dev_to_node(dev));
        if (!q)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        pmem->pfn_flags = PFN_DEV;
-       if (pmem_should_map_pages(dev)) {
-               pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, res,
+       if (is_nd_pfn(dev)) {
+               addr = devm_memremap_pages(dev, &pfn_res, &q->q_usage_counter,
+                               altmap);
+               pfn_sb = nd_pfn->pfn_sb;
+               pmem->data_offset = le64_to_cpu(pfn_sb->dataoff);
+               pmem->pfn_pad = resource_size(res) - resource_size(&pfn_res);
+               pmem->pfn_flags |= PFN_MAP;
+               res = &pfn_res; /* for badblocks populate */
+               res->start += pmem->data_offset;
+       } else if (pmem_should_map_pages(dev)) {
+               addr = devm_memremap_pages(dev, &nsio->res,
                                &q->q_usage_counter, NULL);
                pmem->pfn_flags |= PFN_MAP;
        } else
-               pmem->virt_addr = (void __pmem *) devm_memremap(dev,
-                               pmem->phys_addr, pmem->size,
-                               ARCH_MEMREMAP_PMEM);
+               addr = devm_memremap(dev, pmem->phys_addr,
+                               pmem->size, ARCH_MEMREMAP_PMEM);
 
-       if (IS_ERR(pmem->virt_addr)) {
+       /*
+        * At release time the queue must be dead before
+        * devm_memremap_pages is unwound
+        */
+       if (devm_add_action(dev, pmem_release_queue, q)) {
                blk_cleanup_queue(q);
-               return (void __force *) pmem->virt_addr;
+               return -ENOMEM;
        }
 
-       pmem->pmem_queue = q;
-       return pmem;
-}
-
-static void pmem_detach_disk(struct pmem_device *pmem)
-{
-       if (!pmem->pmem_disk)
-               return;
-
-       del_gendisk(pmem->pmem_disk);
-       put_disk(pmem->pmem_disk);
-       blk_cleanup_queue(pmem->pmem_queue);
-}
+       if (IS_ERR(addr))
+               return PTR_ERR(addr);
+       pmem->virt_addr = (void __pmem *) addr;
 
-static int pmem_attach_disk(struct device *dev,
-               struct nd_namespace_common *ndns, struct pmem_device *pmem)
-{
-       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
-       int nid = dev_to_node(dev);
-       struct resource bb_res;
-       struct gendisk *disk;
-
-       blk_queue_make_request(pmem->pmem_queue, pmem_make_request);
-       blk_queue_physical_block_size(pmem->pmem_queue, PAGE_SIZE);
-       blk_queue_max_hw_sectors(pmem->pmem_queue, UINT_MAX);
-       blk_queue_bounce_limit(pmem->pmem_queue, BLK_BOUNCE_ANY);
-       queue_flag_set_unlocked(QUEUE_FLAG_NONROT, pmem->pmem_queue);
+       blk_queue_make_request(q, pmem_make_request);
+       blk_queue_physical_block_size(q, PAGE_SIZE);
+       blk_queue_max_hw_sectors(q, UINT_MAX);
+       blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
+       queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
+       q->queuedata = pmem;
 
        disk = alloc_disk_node(0, nid);
-       if (!disk) {
-               blk_cleanup_queue(pmem->pmem_queue);
+       if (!disk)
+               return -ENOMEM;
+       if (devm_add_action(dev, pmem_release_disk, disk)) {
+               put_disk(disk);
                return -ENOMEM;
        }
 
        disk->fops              = &pmem_fops;
-       disk->private_data      = pmem;
-       disk->queue             = pmem->pmem_queue;
+       disk->queue             = q;
        disk->flags             = GENHD_FL_EXT_DEVT;
        nvdimm_namespace_disk_name(ndns, disk->disk_name);
        disk->driverfs_dev = dev;
        set_capacity(disk, (pmem->size - pmem->pfn_pad - pmem->data_offset)
                        / 512);
-       pmem->pmem_disk = disk;
-       devm_exit_badblocks(dev, &pmem->bb);
        if (devm_init_badblocks(dev, &pmem->bb))
                return -ENOMEM;
-       bb_res.start = nsio->res.start + pmem->data_offset;
-       bb_res.end = nsio->res.end;
-       if (is_nd_pfn(dev)) {
-               struct nd_pfn *nd_pfn = to_nd_pfn(dev);
-               struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
-
-               bb_res.start += __le32_to_cpu(pfn_sb->start_pad);
-               bb_res.end -= __le32_to_cpu(pfn_sb->end_trunc);
-       }
-       nvdimm_badblocks_populate(to_nd_region(dev->parent), &pmem->bb,
-                       &bb_res);
+       nvdimm_badblocks_populate(to_nd_region(dev->parent), &pmem->bb, res);
        disk->bb = &pmem->bb;
        add_disk(disk);
        revalidate_disk(disk);
@@ -305,346 +302,68 @@ static int pmem_attach_disk(struct device *dev,
        return 0;
 }
 
-static int pmem_rw_bytes(struct nd_namespace_common *ndns,
-               resource_size_t offset, void *buf, size_t size, int rw)
-{
-       struct pmem_device *pmem = dev_get_drvdata(ndns->claim);
-
-       if (unlikely(offset + size > pmem->size)) {
-               dev_WARN_ONCE(&ndns->dev, 1, "request out of range\n");
-               return -EFAULT;
-       }
-
-       if (rw == READ) {
-               unsigned int sz_align = ALIGN(size + (offset & (512 - 1)), 512);
-
-               if (unlikely(is_bad_pmem(&pmem->bb, offset / 512, sz_align)))
-                       return -EIO;
-               return memcpy_from_pmem(buf, pmem->virt_addr + offset, size);
-       } else {
-               memcpy_to_pmem(pmem->virt_addr + offset, buf, size);
-               wmb_pmem();
-       }
-
-       return 0;
-}
-
-static int nd_pfn_init(struct nd_pfn *nd_pfn)
-{
-       struct nd_pfn_sb *pfn_sb = kzalloc(sizeof(*pfn_sb), GFP_KERNEL);
-       struct pmem_device *pmem = dev_get_drvdata(&nd_pfn->dev);
-       struct nd_namespace_common *ndns = nd_pfn->ndns;
-       u32 start_pad = 0, end_trunc = 0;
-       resource_size_t start, size;
-       struct nd_namespace_io *nsio;
-       struct nd_region *nd_region;
-       unsigned long npfns;
-       phys_addr_t offset;
-       u64 checksum;
-       int rc;
-
-       if (!pfn_sb)
-               return -ENOMEM;
-
-       nd_pfn->pfn_sb = pfn_sb;
-       rc = nd_pfn_validate(nd_pfn);
-       if (rc == -ENODEV)
-               /* no info block, do init */;
-       else
-               return rc;
-
-       nd_region = to_nd_region(nd_pfn->dev.parent);
-       if (nd_region->ro) {
-               dev_info(&nd_pfn->dev,
-                               "%s is read-only, unable to init metadata\n",
-                               dev_name(&nd_region->dev));
-               goto err;
-       }
-
-       memset(pfn_sb, 0, sizeof(*pfn_sb));
-
-       /*
-        * Check if pmem collides with 'System RAM' when section aligned and
-        * trim it accordingly
-        */
-       nsio = to_nd_namespace_io(&ndns->dev);
-       start = PHYS_SECTION_ALIGN_DOWN(nsio->res.start);
-       size = resource_size(&nsio->res);
-       if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
-                               IORES_DESC_NONE) == REGION_MIXED) {
-
-               start = nsio->res.start;
-               start_pad = PHYS_SECTION_ALIGN_UP(start) - start;
-       }
-
-       start = nsio->res.start;
-       size = PHYS_SECTION_ALIGN_UP(start + size) - start;
-       if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
-                               IORES_DESC_NONE) == REGION_MIXED) {
-               size = resource_size(&nsio->res);
-               end_trunc = start + size - PHYS_SECTION_ALIGN_DOWN(start + size);
-       }
-
-       if (start_pad + end_trunc)
-               dev_info(&nd_pfn->dev, "%s section collision, truncate %d bytes\n",
-                               dev_name(&ndns->dev), start_pad + end_trunc);
-
-       /*
-        * Note, we use 64 here for the standard size of struct page,
-        * debugging options may cause it to be larger in which case the
-        * implementation will limit the pfns advertised through
-        * ->direct_access() to those that are included in the memmap.
-        */
-       start += start_pad;
-       npfns = (pmem->size - start_pad - end_trunc - SZ_8K) / SZ_4K;
-       if (nd_pfn->mode == PFN_MODE_PMEM) {
-               unsigned long memmap_size;
-
-               /*
-                * vmemmap_populate_hugepages() allocates the memmap array in
-                * PMD_SIZE chunks.
-                */
-               memmap_size = ALIGN(64 * npfns, PMD_SIZE);
-               offset = ALIGN(start + SZ_8K + memmap_size, nd_pfn->align)
-                       - start;
-       } else if (nd_pfn->mode == PFN_MODE_RAM)
-               offset = ALIGN(start + SZ_8K, nd_pfn->align) - start;
-       else
-               goto err;
-
-       if (offset + start_pad + end_trunc >= pmem->size) {
-               dev_err(&nd_pfn->dev, "%s unable to satisfy requested alignment\n",
-                               dev_name(&ndns->dev));
-               goto err;
-       }
-
-       npfns = (pmem->size - offset - start_pad - end_trunc) / SZ_4K;
-       pfn_sb->mode = cpu_to_le32(nd_pfn->mode);
-       pfn_sb->dataoff = cpu_to_le64(offset);
-       pfn_sb->npfns = cpu_to_le64(npfns);
-       memcpy(pfn_sb->signature, PFN_SIG, PFN_SIG_LEN);
-       memcpy(pfn_sb->uuid, nd_pfn->uuid, 16);
-       memcpy(pfn_sb->parent_uuid, nd_dev_to_uuid(&ndns->dev), 16);
-       pfn_sb->version_major = cpu_to_le16(1);
-       pfn_sb->version_minor = cpu_to_le16(1);
-       pfn_sb->start_pad = cpu_to_le32(start_pad);
-       pfn_sb->end_trunc = cpu_to_le32(end_trunc);
-       checksum = nd_sb_checksum((struct nd_gen_sb *) pfn_sb);
-       pfn_sb->checksum = cpu_to_le64(checksum);
-
-       rc = nvdimm_write_bytes(ndns, SZ_4K, pfn_sb, sizeof(*pfn_sb));
-       if (rc)
-               goto err;
-
-       return 0;
- err:
-       nd_pfn->pfn_sb = NULL;
-       kfree(pfn_sb);
-       return -ENXIO;
-}
-
-static int nvdimm_namespace_detach_pfn(struct nd_namespace_common *ndns)
-{
-       struct nd_pfn *nd_pfn = to_nd_pfn(ndns->claim);
-       struct pmem_device *pmem;
-
-       /* free pmem disk */
-       pmem = dev_get_drvdata(&nd_pfn->dev);
-       pmem_detach_disk(pmem);
-
-       /* release nd_pfn resources */
-       kfree(nd_pfn->pfn_sb);
-       nd_pfn->pfn_sb = NULL;
-
-       return 0;
-}
-
-/*
- * We hotplug memory at section granularity, pad the reserved area from
- * the previous section base to the namespace base address.
- */
-static unsigned long init_altmap_base(resource_size_t base)
-{
-       unsigned long base_pfn = PHYS_PFN(base);
-
-       return PFN_SECTION_ALIGN_DOWN(base_pfn);
-}
-
-static unsigned long init_altmap_reserve(resource_size_t base)
-{
-       unsigned long reserve = PHYS_PFN(SZ_8K);
-       unsigned long base_pfn = PHYS_PFN(base);
-
-       reserve += base_pfn - PFN_SECTION_ALIGN_DOWN(base_pfn);
-       return reserve;
-}
-
-static int __nvdimm_namespace_attach_pfn(struct nd_pfn *nd_pfn)
-{
-       int rc;
-       struct resource res;
-       struct request_queue *q;
-       struct pmem_device *pmem;
-       struct vmem_altmap *altmap;
-       struct device *dev = &nd_pfn->dev;
-       struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
-       struct nd_namespace_common *ndns = nd_pfn->ndns;
-       u32 start_pad = __le32_to_cpu(pfn_sb->start_pad);
-       u32 end_trunc = __le32_to_cpu(pfn_sb->end_trunc);
-       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
-       resource_size_t base = nsio->res.start + start_pad;
-       struct vmem_altmap __altmap = {
-               .base_pfn = init_altmap_base(base),
-               .reserve = init_altmap_reserve(base),
-       };
-
-       pmem = dev_get_drvdata(dev);
-       pmem->data_offset = le64_to_cpu(pfn_sb->dataoff);
-       pmem->pfn_pad = start_pad + end_trunc;
-       nd_pfn->mode = le32_to_cpu(nd_pfn->pfn_sb->mode);
-       if (nd_pfn->mode == PFN_MODE_RAM) {
-               if (pmem->data_offset < SZ_8K)
-                       return -EINVAL;
-               nd_pfn->npfns = le64_to_cpu(pfn_sb->npfns);
-               altmap = NULL;
-       } else if (nd_pfn->mode == PFN_MODE_PMEM) {
-               nd_pfn->npfns = (pmem->size - pmem->pfn_pad - pmem->data_offset)
-                       / PAGE_SIZE;
-               if (le64_to_cpu(nd_pfn->pfn_sb->npfns) > nd_pfn->npfns)
-                       dev_info(&nd_pfn->dev,
-                                       "number of pfns truncated from %lld to %ld\n",
-                                       le64_to_cpu(nd_pfn->pfn_sb->npfns),
-                                       nd_pfn->npfns);
-               altmap = & __altmap;
-               altmap->free = PHYS_PFN(pmem->data_offset - SZ_8K);
-               altmap->alloc = 0;
-       } else {
-               rc = -ENXIO;
-               goto err;
-       }
-
-       /* establish pfn range for lookup, and switch to direct map */
-       q = pmem->pmem_queue;
-       memcpy(&res, &nsio->res, sizeof(res));
-       res.start += start_pad;
-       res.end -= end_trunc;
-       devm_memunmap(dev, (void __force *) pmem->virt_addr);
-       pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &res,
-                       &q->q_usage_counter, altmap);
-       pmem->pfn_flags |= PFN_MAP;
-       if (IS_ERR(pmem->virt_addr)) {
-               rc = PTR_ERR(pmem->virt_addr);
-               goto err;
-       }
-
-       /* attach pmem disk in "pfn-mode" */
-       rc = pmem_attach_disk(dev, ndns, pmem);
-       if (rc)
-               goto err;
-
-       return rc;
- err:
-       nvdimm_namespace_detach_pfn(ndns);
-       return rc;
-
-}
-
-static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns)
-{
-       struct nd_pfn *nd_pfn = to_nd_pfn(ndns->claim);
-       int rc;
-
-       if (!nd_pfn->uuid || !nd_pfn->ndns)
-               return -ENODEV;
-
-       rc = nd_pfn_init(nd_pfn);
-       if (rc)
-               return rc;
-       /* we need a valid pfn_sb before we can init a vmem_altmap */
-       return __nvdimm_namespace_attach_pfn(nd_pfn);
-}
-
 static int nd_pmem_probe(struct device *dev)
 {
-       struct nd_region *nd_region = to_nd_region(dev->parent);
        struct nd_namespace_common *ndns;
-       struct nd_namespace_io *nsio;
-       struct pmem_device *pmem;
 
        ndns = nvdimm_namespace_common_probe(dev);
        if (IS_ERR(ndns))
                return PTR_ERR(ndns);
 
-       nsio = to_nd_namespace_io(&ndns->dev);
-       pmem = pmem_alloc(dev, &nsio->res, nd_region->id);
-       if (IS_ERR(pmem))
-               return PTR_ERR(pmem);
-
-       pmem->ndns = ndns;
-       dev_set_drvdata(dev, pmem);
-       ndns->rw_bytes = pmem_rw_bytes;
-       if (devm_init_badblocks(dev, &pmem->bb))
-               return -ENOMEM;
-       nvdimm_badblocks_populate(nd_region, &pmem->bb, &nsio->res);
+       if (devm_nsio_enable(dev, to_nd_namespace_io(&ndns->dev)))
+               return -ENXIO;
 
-       if (is_nd_btt(dev)) {
-               /* btt allocates its own request_queue */
-               blk_cleanup_queue(pmem->pmem_queue);
-               pmem->pmem_queue = NULL;
+       if (is_nd_btt(dev))
                return nvdimm_namespace_attach_btt(ndns);
-       }
 
        if (is_nd_pfn(dev))
-               return nvdimm_namespace_attach_pfn(ndns);
+               return pmem_attach_disk(dev, ndns);
 
-       if (nd_btt_probe(ndns, pmem) == 0 || nd_pfn_probe(ndns, pmem) == 0) {
-               /*
-                * We'll come back as either btt-pmem, or pfn-pmem, so
-                * drop the queue allocation for now.
-                */
-               blk_cleanup_queue(pmem->pmem_queue);
+       /* if we find a valid info-block we'll come back as that personality */
+       if (nd_btt_probe(dev, ndns) == 0 || nd_pfn_probe(dev, ndns) == 0
+                       || nd_dax_probe(dev, ndns) == 0)
                return -ENXIO;
-       }
 
-       return pmem_attach_disk(dev, ndns, pmem);
+       /* ...otherwise we're just a raw pmem device */
+       return pmem_attach_disk(dev, ndns);
 }
 
 static int nd_pmem_remove(struct device *dev)
 {
-       struct pmem_device *pmem = dev_get_drvdata(dev);
-
        if (is_nd_btt(dev))
-               nvdimm_namespace_detach_btt(pmem->ndns);
-       else if (is_nd_pfn(dev))
-               nvdimm_namespace_detach_pfn(pmem->ndns);
-       else
-               pmem_detach_disk(pmem);
-
+               nvdimm_namespace_detach_btt(to_nd_btt(dev));
        return 0;
 }
 
 static void nd_pmem_notify(struct device *dev, enum nvdimm_event event)
 {
-       struct pmem_device *pmem = dev_get_drvdata(dev);
-       struct nd_namespace_common *ndns = pmem->ndns;
        struct nd_region *nd_region = to_nd_region(dev->parent);
-       struct nd_namespace_io *nsio = to_nd_namespace_io(&ndns->dev);
-       struct resource res = {
-               .start = nsio->res.start + pmem->data_offset,
-               .end = nsio->res.end,
-       };
+       struct pmem_device *pmem = dev_get_drvdata(dev);
+       resource_size_t offset = 0, end_trunc = 0;
+       struct nd_namespace_common *ndns;
+       struct nd_namespace_io *nsio;
+       struct resource res;
 
        if (event != NVDIMM_REVALIDATE_POISON)
                return;
 
-       if (is_nd_pfn(dev)) {
+       if (is_nd_btt(dev)) {
+               struct nd_btt *nd_btt = to_nd_btt(dev);
+
+               ndns = nd_btt->ndns;
+       } else if (is_nd_pfn(dev)) {
                struct nd_pfn *nd_pfn = to_nd_pfn(dev);
                struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb;
 
-               res.start += __le32_to_cpu(pfn_sb->start_pad);
-               res.end -= __le32_to_cpu(pfn_sb->end_trunc);
-       }
+               ndns = nd_pfn->ndns;
+               offset = pmem->data_offset + __le32_to_cpu(pfn_sb->start_pad);
+               end_trunc = __le32_to_cpu(pfn_sb->end_trunc);
+       } else
+               ndns = to_ndns(dev);
 
+       nsio = to_nd_namespace_io(&ndns->dev);
+       res.start = nsio->res.start + offset;
+       res.end = nsio->res.end - end_trunc;
        nvdimm_badblocks_populate(nd_region, &pmem->bb, &res);
 }
 
index 4b7715e29cfffc5de69a31836d715081726d2275..05a91235993969752a8e1edad056a036847923e5 100644 (file)
@@ -54,6 +54,7 @@ static int nd_region_probe(struct device *dev)
 
        nd_region->btt_seed = nd_btt_create(nd_region);
        nd_region->pfn_seed = nd_pfn_create(nd_region);
+       nd_region->dax_seed = nd_dax_create(nd_region);
        if (err == 0)
                return 0;
 
@@ -86,6 +87,7 @@ static int nd_region_remove(struct device *dev)
        nd_region->ns_seed = NULL;
        nd_region->btt_seed = NULL;
        nd_region->pfn_seed = NULL;
+       nd_region->dax_seed = NULL;
        dev_set_drvdata(dev, NULL);
        nvdimm_bus_unlock(dev);
 
index 139bf71ca5491e20c81a1f11c699bdf0f019632f..40fcfea26fbbc387a3ecbf235b1d4b011022f1aa 100644 (file)
@@ -306,6 +306,23 @@ static ssize_t pfn_seed_show(struct device *dev,
 }
 static DEVICE_ATTR_RO(pfn_seed);
 
+static ssize_t dax_seed_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct nd_region *nd_region = to_nd_region(dev);
+       ssize_t rc;
+
+       nvdimm_bus_lock(dev);
+       if (nd_region->dax_seed)
+               rc = sprintf(buf, "%s\n", dev_name(nd_region->dax_seed));
+       else
+               rc = sprintf(buf, "\n");
+       nvdimm_bus_unlock(dev);
+
+       return rc;
+}
+static DEVICE_ATTR_RO(dax_seed);
+
 static ssize_t read_only_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
@@ -335,6 +352,7 @@ static struct attribute *nd_region_attributes[] = {
        &dev_attr_mappings.attr,
        &dev_attr_btt_seed.attr,
        &dev_attr_pfn_seed.attr,
+       &dev_attr_dax_seed.attr,
        &dev_attr_read_only.attr,
        &dev_attr_set_cookie.attr,
        &dev_attr_available_size.attr,
@@ -353,6 +371,9 @@ static umode_t region_visible(struct kobject *kobj, struct attribute *a, int n)
        if (!is_nd_pmem(dev) && a == &dev_attr_pfn_seed.attr)
                return 0;
 
+       if (!is_nd_pmem(dev) && a == &dev_attr_dax_seed.attr)
+               return 0;
+
        if (a != &dev_attr_set_cookie.attr
                        && a != &dev_attr_available_size.attr)
                return a->mode;
@@ -441,6 +462,13 @@ static void nd_region_notify_driver_action(struct nvdimm_bus *nvdimm_bus,
                        nd_region_create_pfn_seed(nd_region);
                nvdimm_bus_unlock(dev);
        }
+       if (is_nd_dax(dev) && probe) {
+               nd_region = to_nd_region(dev->parent);
+               nvdimm_bus_lock(dev);
+               if (nd_region->dax_seed == dev)
+                       nd_region_create_dax_seed(nd_region);
+               nvdimm_bus_unlock(dev);
+       }
 }
 
 void nd_region_probe_success(struct nvdimm_bus *nvdimm_bus, struct device *dev)
@@ -718,6 +746,7 @@ static struct nd_region *nd_region_create(struct nvdimm_bus *nvdimm_bus,
        ida_init(&nd_region->ns_ida);
        ida_init(&nd_region->btt_ida);
        ida_init(&nd_region->pfn_ida);
+       ida_init(&nd_region->dax_ida);
        dev = &nd_region->dev;
        dev_set_name(dev, "region%d", nd_region->id);
        dev->parent = &nvdimm_bus->dev;
@@ -764,3 +793,8 @@ struct nd_region *nvdimm_volatile_region_create(struct nvdimm_bus *nvdimm_bus,
                        __func__);
 }
 EXPORT_SYMBOL_GPL(nvdimm_volatile_region_create);
+
+void __exit nd_region_devs_exit(void)
+{
+       ida_destroy(&region_ida);
+}
index 57721c73177fa1184d253155a6bcce39bdb2e927..74b5bcac8bf22af140f5c1afb9062eef0639f221 100644 (file)
@@ -164,7 +164,7 @@ static const struct address_space_operations fb_deferred_io_aops = {
        .set_page_dirty = fb_deferred_io_set_page_dirty,
 };
 
-static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
+int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
 {
        vma->vm_ops = &fb_deferred_io_vm_ops;
        vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
@@ -173,6 +173,7 @@ static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
        vma->vm_private_data = info;
        return 0;
 }
+EXPORT_SYMBOL(fb_deferred_io_mmap);
 
 /* workqueue callback */
 static void fb_deferred_io_work(struct work_struct *work)
index a063d4d8ac39f41e3c6dd6d10f954c5f2140cf41..1089dbf259255e3c572ee1a15b6f16a509a20dfb 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/log2.h>
 #include <linux/cleancache.h>
 #include <linux/dax.h>
+#include <linux/badblocks.h>
 #include <asm/uaccess.h>
 #include "internal.h"
 
@@ -1159,6 +1160,33 @@ void bd_set_size(struct block_device *bdev, loff_t size)
 }
 EXPORT_SYMBOL(bd_set_size);
 
+static bool blkdev_dax_capable(struct block_device *bdev)
+{
+       struct gendisk *disk = bdev->bd_disk;
+
+       if (!disk->fops->direct_access || !IS_ENABLED(CONFIG_FS_DAX))
+               return false;
+
+       /*
+        * If the partition is not aligned on a page boundary, we can't
+        * do dax I/O to it.
+        */
+       if ((bdev->bd_part->start_sect % (PAGE_SIZE / 512))
+                       || (bdev->bd_part->nr_sects % (PAGE_SIZE / 512)))
+               return false;
+
+       /*
+        * If the device has known bad blocks, force all I/O through the
+        * driver / page cache.
+        *
+        * TODO: support finer grained dax error handling
+        */
+       if (disk->bb && disk->bb->count)
+               return false;
+
+       return true;
+}
+
 static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part);
 
 /*
@@ -1720,79 +1748,13 @@ static const struct address_space_operations def_blk_aops = {
        .is_dirty_writeback = buffer_check_dirty_writeback,
 };
 
-#ifdef CONFIG_FS_DAX
-/*
- * In the raw block case we do not need to contend with truncation nor
- * unwritten file extents.  Without those concerns there is no need for
- * additional locking beyond the mmap_sem context that these routines
- * are already executing under.
- *
- * Note, there is no protection if the block device is dynamically
- * resized (partition grow/shrink) during a fault. A stable block device
- * size is already not enforced in the blkdev_direct_IO path.
- *
- * For DAX, it is the responsibility of the block device driver to
- * ensure the whole-disk device size is stable while requests are in
- * flight.
- *
- * Finally, unlike the filemap_page_mkwrite() case there is no
- * filesystem superblock to sync against freezing.  We still include a
- * pfn_mkwrite callback for dax drivers to receive write fault
- * notifications.
- */
-static int blkdev_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
-{
-       return __dax_fault(vma, vmf, blkdev_get_block, NULL);
-}
-
-static int blkdev_dax_pfn_mkwrite(struct vm_area_struct *vma,
-               struct vm_fault *vmf)
-{
-       return dax_pfn_mkwrite(vma, vmf);
-}
-
-static int blkdev_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr,
-               pmd_t *pmd, unsigned int flags)
-{
-       return __dax_pmd_fault(vma, addr, pmd, flags, blkdev_get_block, NULL);
-}
-
-static const struct vm_operations_struct blkdev_dax_vm_ops = {
-       .fault          = blkdev_dax_fault,
-       .pmd_fault      = blkdev_dax_pmd_fault,
-       .pfn_mkwrite    = blkdev_dax_pfn_mkwrite,
-};
-
-static const struct vm_operations_struct blkdev_default_vm_ops = {
-       .fault          = filemap_fault,
-       .map_pages      = filemap_map_pages,
-};
-
-static int blkdev_mmap(struct file *file, struct vm_area_struct *vma)
-{
-       struct inode *bd_inode = bdev_file_inode(file);
-
-       file_accessed(file);
-       if (IS_DAX(bd_inode)) {
-               vma->vm_ops = &blkdev_dax_vm_ops;
-               vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE;
-       } else {
-               vma->vm_ops = &blkdev_default_vm_ops;
-       }
-
-       return 0;
-}
-#else
-#define blkdev_mmap generic_file_mmap
-#endif
-
 const struct file_operations def_blk_fops = {
        .open           = blkdev_open,
        .release        = blkdev_close,
        .llseek         = block_llseek,
        .read_iter      = blkdev_read_iter,
        .write_iter     = blkdev_write_iter,
-       .mmap           = blkdev_mmap,
+       .mmap           = generic_file_mmap,
        .fsync          = blkdev_fsync,
        .unlocked_ioctl = block_ioctl,
 #ifdef CONFIG_COMPAT
index 4d40e9b5d938b448c50db763ad5466c1524c5008..788c6c35291a42c448296876ab6c32bff25a5200 100644 (file)
@@ -61,12 +61,12 @@ bool acpi_ata_match(acpi_handle handle);
 bool acpi_bay_match(acpi_handle handle);
 bool acpi_dock_match(acpi_handle handle);
 
-bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs);
+bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, u64 rev, u64 funcs);
 union acpi_object *acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid,
-                       int rev, int func, union acpi_object *argv4);
+                       u64 rev, u64 func, union acpi_object *argv4);
 
 static inline union acpi_object *
-acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, int rev, int func,
+acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, u64 rev, u64 func,
                        union acpi_object *argv4, acpi_object_type type)
 {
        union acpi_object *obj;
diff --git a/include/drm/bridge/analogix_dp.h b/include/drm/bridge/analogix_dp.h
new file mode 100644 (file)
index 0000000..25afb31
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Analogix DP (Display Port) Core interface driver.
+ *
+ * Copyright (C) 2015 Rockchip Electronics Co., Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+#ifndef _ANALOGIX_DP_H_
+#define _ANALOGIX_DP_H_
+
+#include <drm/drm_crtc.h>
+
+enum analogix_dp_devtype {
+       EXYNOS_DP,
+       RK3288_DP,
+};
+
+struct analogix_dp_plat_data {
+       enum analogix_dp_devtype dev_type;
+       struct drm_panel *panel;
+       struct drm_encoder *encoder;
+       struct drm_connector *connector;
+
+       int (*power_on)(struct analogix_dp_plat_data *);
+       int (*power_off)(struct analogix_dp_plat_data *);
+       int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *,
+                     struct drm_connector *);
+       int (*get_modes)(struct analogix_dp_plat_data *);
+};
+
+int analogix_dp_resume(struct device *dev);
+int analogix_dp_suspend(struct device *dev);
+
+int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
+                    struct analogix_dp_plat_data *plat_data);
+void analogix_dp_unbind(struct device *dev, struct device *master, void *data);
+
+#endif /* _ANALOGIX_DP_H_ */
index 3c8422c69572557a43e56921e475f6a17693453c..84f1a8eefbdbc8ae89925aff3dafaaccdf99b4b4 100644 (file)
@@ -90,7 +90,7 @@ struct reservation_object;
 struct dma_buf_attachment;
 
 /*
- * 4 debug categories are defined:
+ * The following categories are defined:
  *
  * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...
  *      This is the category used by the DRM_DEBUG() macro.
@@ -580,12 +580,21 @@ struct drm_driver {
        void (*debugfs_cleanup)(struct drm_minor *minor);
 
        /**
-        * Driver-specific constructor for drm_gem_objects, to set up
-        * obj->driver_private.
+        * @gem_free_object: deconstructor for drm_gem_objects
         *
-        * Returns 0 on success.
+        * This is deprecated and should not be used by new drivers. Use
+        * @gem_free_object_unlocked instead.
         */
        void (*gem_free_object) (struct drm_gem_object *obj);
+
+       /**
+        * @gem_free_object_unlocked: deconstructor for drm_gem_objects
+        *
+        * This is for drivers which are not encumbered with dev->struct_mutex
+        * legacy locking schemes. Use this hook instead of @gem_free_object.
+        */
+       void (*gem_free_object_unlocked) (struct drm_gem_object *obj);
+
        int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
        void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
 
@@ -769,6 +778,7 @@ struct drm_device {
        atomic_t buf_alloc;             /**< Buffer allocation in progress */
        /*@} */
 
+       struct mutex filelist_mutex;
        struct list_head filelist;
 
        /** \name Memory management */
@@ -804,14 +814,6 @@ struct drm_device {
        bool irq_enabled;
        int irq;
 
-       /*
-        * At load time, disabling the vblank interrupt won't be allowed since
-        * old clients may not call the modeset ioctl and therefore misbehave.
-        * Once the modeset ioctl *has* been called though, we can safely
-        * disable them when unused.
-        */
-       bool vblank_disable_allowed;
-
        /*
         * If true, vblank interrupt will be disabled immediately when the
         * refcount drops to zero, as opposed to via the vblank disable
index 193ef19dfc5c54f061bff939150bf384be734ca6..b2d912670a7fb07c27685008bc62b7bf5310a8b5 100644 (file)
@@ -37,7 +37,7 @@ struct agp_memory *drm_agp_bind_pages(struct drm_device *dev,
                                uint32_t type);
 
 struct drm_agp_head *drm_agp_init(struct drm_device *dev);
-void drm_agp_clear(struct drm_device *dev);
+void drm_legacy_agp_clear(struct drm_device *dev);
 int drm_agp_acquire(struct drm_device *dev);
 int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
                          struct drm_file *file_priv);
@@ -93,7 +93,7 @@ static inline struct drm_agp_head *drm_agp_init(struct drm_device *dev)
        return NULL;
 }
 
-static inline void drm_agp_clear(struct drm_device *dev)
+static inline void drm_legacy_agp_clear(struct drm_device *dev)
 {
 }
 
index d3eaa5df187a49fca6242c86bfb4e3bd1f64b2d0..92c84e9ab09a70db602c2bae7d4dcfeb6867600c 100644 (file)
@@ -137,7 +137,7 @@ drm_atomic_clean_old_fb(struct drm_device *dev, unsigned plane_mask, int ret);
 
 int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
 int __must_check drm_atomic_commit(struct drm_atomic_state *state);
-int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
+int __must_check drm_atomic_nonblocking_commit(struct drm_atomic_state *state);
 
 #define for_each_connector_in_state(state, connector, connector_state, __i) \
        for ((__i) = 0;                                                 \
index 9054598c9a7a9887190284332b95c388bcf13214..d473dcc91f540878687d9c0c5fdf25bf56afe5a4 100644 (file)
@@ -40,8 +40,10 @@ int drm_atomic_helper_check(struct drm_device *dev,
                            struct drm_atomic_state *state);
 int drm_atomic_helper_commit(struct drm_device *dev,
                             struct drm_atomic_state *state,
-                            bool async);
+                            bool nonblock);
 
+void drm_atomic_helper_wait_for_fences(struct drm_device *dev,
+                                       struct drm_atomic_state *state);
 bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
                                           struct drm_atomic_state *old_state,
                                           struct drm_crtc *crtc);
@@ -108,6 +110,8 @@ int drm_atomic_helper_page_flip(struct drm_crtc *crtc,
                                uint32_t flags);
 int drm_atomic_helper_connector_dpms(struct drm_connector *connector,
                                     int mode);
+struct drm_encoder *
+drm_atomic_helper_best_encoder(struct drm_connector *connector);
 
 /* default implementations for state handling */
 void drm_atomic_helper_crtc_reset(struct drm_crtc *crtc);
@@ -115,8 +119,7 @@ void __drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc,
                                              struct drm_crtc_state *state);
 struct drm_crtc_state *
 drm_atomic_helper_crtc_duplicate_state(struct drm_crtc *crtc);
-void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
-                                           struct drm_crtc_state *state);
+void __drm_atomic_helper_crtc_destroy_state(struct drm_crtc_state *state);
 void drm_atomic_helper_crtc_destroy_state(struct drm_crtc *crtc,
                                          struct drm_crtc_state *state);
 
@@ -125,8 +128,7 @@ void __drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane,
                                               struct drm_plane_state *state);
 struct drm_plane_state *
 drm_atomic_helper_plane_duplicate_state(struct drm_plane *plane);
-void __drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
-                                            struct drm_plane_state *state);
+void __drm_atomic_helper_plane_destroy_state(struct drm_plane_state *state);
 void drm_atomic_helper_plane_destroy_state(struct drm_plane *plane,
                                          struct drm_plane_state *state);
 
@@ -142,8 +144,7 @@ struct drm_atomic_state *
 drm_atomic_helper_duplicate_state(struct drm_device *dev,
                                  struct drm_modeset_acquire_ctx *ctx);
 void
-__drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
-                                           struct drm_connector_state *state);
+__drm_atomic_helper_connector_destroy_state(struct drm_connector_state *state);
 void drm_atomic_helper_connector_destroy_state(struct drm_connector *connector,
                                          struct drm_connector_state *state);
 void drm_atomic_helper_legacy_gamma_set(struct drm_crtc *crtc,
index e0170bf80bb030356e85489d568bed959749320a..d1559cd04e3de85849eee8df7189f4ce2e09cad4 100644 (file)
@@ -45,20 +45,12 @@ struct drm_clip_rect;
 struct device_node;
 struct fence;
 
-#define DRM_MODE_OBJECT_CRTC 0xcccccccc
-#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
-#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
-#define DRM_MODE_OBJECT_MODE 0xdededede
-#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
-#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
-#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
-#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
-#define DRM_MODE_OBJECT_ANY 0
-
 struct drm_mode_object {
        uint32_t id;
        uint32_t type;
        struct drm_object_properties *properties;
+       struct kref refcount;
+       void (*free_cb)(struct kref *kref);
 };
 
 #define DRM_OBJECT_MAX_PROPERTY 24
@@ -126,6 +118,14 @@ enum subpixel_order {
 #define DRM_COLOR_FORMAT_RGB444                (1<<0)
 #define DRM_COLOR_FORMAT_YCRCB444      (1<<1)
 #define DRM_COLOR_FORMAT_YCRCB422      (1<<2)
+
+#define DRM_BUS_FLAG_DE_LOW            (1<<0)
+#define DRM_BUS_FLAG_DE_HIGH           (1<<1)
+/* drive data on pos. edge */
+#define DRM_BUS_FLAG_PIXDATA_POSEDGE   (1<<2)
+/* drive data on neg. edge */
+#define DRM_BUS_FLAG_PIXDATA_NEGEDGE   (1<<3)
+
 /*
  * Describes a given display (e.g. CRT or flat panel) and its limitations.
  */
@@ -147,6 +147,7 @@ struct drm_display_info {
 
        const u32 *bus_formats;
        unsigned int num_bus_formats;
+       u32 bus_flags;
 
        /* Mask of supported hdmi deep color modes */
        u8 edid_hdmi_dc_modes;
@@ -233,8 +234,8 @@ struct drm_framebuffer {
         * should be deferred.  In cases like this, the driver would like to
         * hold a ref to the fb even though it has already been removed from
         * userspace perspective.
+        * The refcount is stored inside the mode object.
         */
-       struct kref refcount;
        /*
         * Place on the dev->mode_config.fb_list, access protected by
         * dev->mode_config.fb_lock.
@@ -258,7 +259,6 @@ struct drm_framebuffer {
 struct drm_property_blob {
        struct drm_mode_object base;
        struct drm_device *dev;
-       struct kref refcount;
        struct list_head head_global;
        struct list_head head_file;
        size_t length;
@@ -1895,7 +1895,7 @@ struct drm_mode_config_funcs {
         * drm_atomic_helper_commit(), or one of the exported sub-functions of
         * it.
         *
-        * Asynchronous commits (as indicated with the async parameter) must
+        * Nonblocking commits (as indicated with the nonblock parameter) must
         * do any preparatory work which might result in an unsuccessful commit
         * in the context of this callback. The only exceptions are hardware
         * errors resulting in -EIO. But even in that case the driver must
@@ -1908,7 +1908,7 @@ struct drm_mode_config_funcs {
         * The driver must wait for any pending rendering to the new
         * framebuffers to complete before executing the flip. It should also
         * wait for any pending rendering from other drivers if the underlying
-        * buffer is a shared dma-buf. Asynchronous commits must not wait for
+        * buffer is a shared dma-buf. Nonblocking commits must not wait for
         * rendering in the context of this callback.
         *
         * An application can request to be notified when the atomic commit has
@@ -1939,7 +1939,7 @@ struct drm_mode_config_funcs {
         *
         * 0 on success or one of the below negative error codes:
         *
-        *  - -EBUSY, if an asynchronous updated is requested and there is
+        *  - -EBUSY, if a nonblocking updated is requested and there is
         *    an earlier updated pending. Drivers are allowed to support a queue
         *    of outstanding updates, but currently no driver supports that.
         *    Note that drivers must wait for preceding updates to complete if a
@@ -1969,7 +1969,7 @@ struct drm_mode_config_funcs {
         */
        int (*atomic_commit)(struct drm_device *dev,
                             struct drm_atomic_state *state,
-                            bool async);
+                            bool nonblock);
 
        /**
         * @atomic_state_alloc:
@@ -2259,8 +2259,9 @@ static inline unsigned drm_connector_index(struct drm_connector *connector)
        return connector->connector_id;
 }
 
-/* helper to unplug all connectors from sysfs for device */
-extern void drm_connector_unplug_all(struct drm_device *dev);
+/* helpers to {un}register all connectors from sysfs for device */
+extern int drm_connector_register_all(struct drm_device *dev);
+extern void drm_connector_unregister_all(struct drm_device *dev);
 
 extern int drm_bridge_add(struct drm_bridge *bridge);
 extern void drm_bridge_remove(struct drm_bridge *bridge);
@@ -2386,8 +2387,6 @@ extern int drm_framebuffer_init(struct drm_device *dev,
                                const struct drm_framebuffer_funcs *funcs);
 extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
                                                      uint32_t id);
-extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
-extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
 extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
 extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
 extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
@@ -2445,6 +2444,8 @@ extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
                                         int gamma_size);
 extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
                uint32_t id, uint32_t type);
+void drm_mode_object_reference(struct drm_mode_object *obj);
+void drm_mode_object_unreference(struct drm_mode_object *obj);
 
 /* IOCTLs */
 extern int drm_mode_getresources(struct drm_device *dev,
@@ -2510,6 +2511,8 @@ extern int drm_edid_header_is_valid(const u8 *raw_edid);
 extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
                                 bool *edid_corrupt);
 extern bool drm_edid_is_valid(struct edid *edid);
+extern void drm_edid_get_monitor_name(struct edid *edid, char *name,
+                                     int buflen);
 
 extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
                                                         char topology[8]);
@@ -2577,7 +2580,15 @@ static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
        return mo ? obj_to_encoder(mo) : NULL;
 }
 
-static inline struct drm_connector *drm_connector_find(struct drm_device *dev,
+/**
+ * drm_connector_lookup - lookup connector object
+ * @dev: DRM device
+ * @id: connector object id
+ *
+ * This function looks up the connector object specified by id
+ * add takes a reference to it.
+ */
+static inline struct drm_connector *drm_connector_lookup(struct drm_device *dev,
                uint32_t id)
 {
        struct drm_mode_object *mo;
@@ -2600,14 +2611,73 @@ static inline struct drm_property *drm_property_find(struct drm_device *dev,
 static inline uint32_t drm_color_lut_extract(uint32_t user_input,
                                             uint32_t bit_precision)
 {
-       uint32_t val = user_input + (1 << (16 - bit_precision - 1));
+       uint32_t val = user_input;
        uint32_t max = 0xffff >> (16 - bit_precision);
 
-       val >>= 16 - bit_precision;
+       /* Round only if we're not using full precision. */
+       if (bit_precision < 16) {
+               val += 1UL << (16 - bit_precision - 1);
+               val >>= 16 - bit_precision;
+       }
 
        return clamp_val(val, 0, max);
 }
 
+/**
+ * drm_framebuffer_reference - incr the fb refcnt
+ * @fb: framebuffer
+ *
+ * This functions increments the fb's refcount.
+ */
+static inline void drm_framebuffer_reference(struct drm_framebuffer *fb)
+{
+       drm_mode_object_reference(&fb->base);
+}
+
+/**
+ * drm_framebuffer_unreference - unref a framebuffer
+ * @fb: framebuffer to unref
+ *
+ * This functions decrements the fb's refcount and frees it if it drops to zero.
+ */
+static inline void drm_framebuffer_unreference(struct drm_framebuffer *fb)
+{
+       drm_mode_object_unreference(&fb->base);
+}
+
+/**
+ * drm_framebuffer_read_refcount - read the framebuffer reference count.
+ * @fb: framebuffer
+ *
+ * This functions returns the framebuffer's reference count.
+ */
+static inline uint32_t drm_framebuffer_read_refcount(struct drm_framebuffer *fb)
+{
+       return atomic_read(&fb->base.refcount.refcount);
+}
+
+/**
+ * drm_connector_reference - incr the connector refcnt
+ * @connector: connector
+ *
+ * This function increments the connector's refcount.
+ */
+static inline void drm_connector_reference(struct drm_connector *connector)
+{
+       drm_mode_object_reference(&connector->base);
+}
+
+/**
+ * drm_connector_unreference - unref a connector
+ * @connector: connector to unref
+ *
+ * This function decrements the connector's refcount and frees it if it drops to zero.
+ */
+static inline void drm_connector_unreference(struct drm_connector *connector)
+{
+       drm_mode_object_unreference(&connector->base);
+}
+
 /* Plane list iterator for legacy (overlay only) planes. */
 #define drm_for_each_legacy_plane(plane, dev) \
        list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \
index 623b4e98e748657ee7e0a54e99d6129f58ad8cd1..c0d4df6a606fc00bbc0809321777c154738f574b 100644 (file)
@@ -73,4 +73,21 @@ struct displayid_tiled_block {
        u8 topology_id[8];
 } __packed;
 
+struct displayid_detailed_timings_1 {
+       u8 pixel_clock[3];
+       u8 flags;
+       u8 hactive[2];
+       u8 hblank[2];
+       u8 hsync[2];
+       u8 hsw[2];
+       u8 vactive[2];
+       u8 vblank[2];
+       u8 vsync[2];
+       u8 vsw[2];
+} __packed;
+
+struct displayid_detailed_timing_block {
+       struct displayid_block base;
+       struct displayid_detailed_timings_1 timings[0];
+};
 #endif
index 1252108da0efcfafe809bfb955bf88a5e71ac965..9d03f167007bc1bbcc6689fe76e9d5355ab02fef 100644 (file)
@@ -73,6 +73,7 @@
 # define DP_ENHANCED_FRAME_CAP             (1 << 7)
 
 #define DP_MAX_DOWNSPREAD                   0x003
+# define DP_MAX_DOWNSPREAD_0_5             (1 << 0)
 # define DP_NO_AUX_HANDSHAKE_LINK_TRAINING  (1 << 6)
 
 #define DP_NORP                             0x004
index dec6221e819801a674cde431bb8f9b5c50b23b80..919933d1beb42241e233e9332a99911eeaa4c9cd 100644 (file)
@@ -328,7 +328,15 @@ int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb);
 int drm_av_sync_delay(struct drm_connector *connector,
                      const struct drm_display_mode *mode);
 struct drm_connector *drm_select_eld(struct drm_encoder *encoder);
+
+#ifdef CONFIG_DRM_LOAD_EDID_FIRMWARE
 int drm_load_edid_firmware(struct drm_connector *connector);
+#else
+static inline int drm_load_edid_firmware(struct drm_connector *connector)
+{
+       return 0;
+}
+#endif
 
 int
 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
index be62bd321e759a13b16441a00ebd877cd820b6b6..fd0dde9f0a6d9f6bcbb3c69d14d7934d340f474d 100644 (file)
@@ -4,11 +4,18 @@
 struct drm_fbdev_cma;
 struct drm_gem_cma_object;
 
+struct drm_fb_helper_surface_size;
+struct drm_framebuffer_funcs;
+struct drm_fb_helper_funcs;
 struct drm_framebuffer;
+struct drm_fb_helper;
 struct drm_device;
 struct drm_file;
 struct drm_mode_fb_cmd2;
 
+struct drm_fbdev_cma *drm_fbdev_cma_init_with_funcs(struct drm_device *dev,
+       unsigned int preferred_bpp, unsigned int num_crtc,
+       unsigned int max_conn_count, const struct drm_fb_helper_funcs *funcs);
 struct drm_fbdev_cma *drm_fbdev_cma_init(struct drm_device *dev,
        unsigned int preferred_bpp, unsigned int num_crtc,
        unsigned int max_conn_count);
@@ -16,7 +23,17 @@ void drm_fbdev_cma_fini(struct drm_fbdev_cma *fbdev_cma);
 
 void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
 void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
+int drm_fbdev_cma_create_with_funcs(struct drm_fb_helper *helper,
+       struct drm_fb_helper_surface_size *sizes,
+       const struct drm_framebuffer_funcs *funcs);
+
+void drm_fb_cma_destroy(struct drm_framebuffer *fb);
+int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
+       struct drm_file *file_priv, unsigned int *handle);
 
+struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
+       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
+       const struct drm_framebuffer_funcs *funcs);
 struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
        struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
 
@@ -24,6 +41,8 @@ struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
        unsigned int plane);
 
 #ifdef CONFIG_DEBUG_FS
+struct seq_file;
+
 int drm_fb_cma_debugfs_show(struct seq_file *m, void *arg);
 #endif
 
index 062723bdcabea0462ba881820a10d9f20f7cafbe..5b4aa35026a3d8dc336f1e9c2c882dea72c3c597 100644 (file)
@@ -172,6 +172,10 @@ struct drm_fb_helper_connector {
  * @funcs: driver callbacks for fb helper
  * @fbdev: emulated fbdev device info struct
  * @pseudo_palette: fake palette of 16 colors
+ * @dirty_clip: clip rectangle used with deferred_io to accumulate damage to
+ *              the screen buffer
+ * @dirty_lock: spinlock protecting @dirty_clip
+ * @dirty_work: worker used to flush the framebuffer
  *
  * This is the main structure used by the fbdev helpers. Drivers supporting
  * fbdev emulation should embedded this into their overall driver structure.
@@ -189,6 +193,9 @@ struct drm_fb_helper {
        const struct drm_fb_helper_funcs *funcs;
        struct fb_info *fbdev;
        u32 pseudo_palette[17];
+       struct drm_clip_rect dirty_clip;
+       spinlock_t dirty_lock;
+       struct work_struct dirty_work;
 
        /**
         * @kernel_fb_list:
@@ -245,6 +252,9 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
 
 void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper);
 
+void drm_fb_helper_deferred_io(struct fb_info *info,
+                              struct list_head *pagelist);
+
 ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
                               size_t count, loff_t *ppos);
 ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
@@ -368,6 +378,11 @@ static inline void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
 {
 }
 
+static inline void drm_fb_helper_deferred_io(struct fb_info *info,
+                                            struct list_head *pagelist)
+{
+}
+
 static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info,
                                             char __user *buf, size_t count,
                                             loff_t *ppos)
index 0b3e11ab87577c431b80bcb24c05c82745a84948..fca1cd1b9c26805c9459166f49060bdf988c0e68 100644 (file)
@@ -200,47 +200,29 @@ drm_gem_object_reference(struct drm_gem_object *obj)
 }
 
 /**
- * drm_gem_object_unreference - release a GEM BO reference
+ * __drm_gem_object_unreference - raw function to release a GEM BO reference
  * @obj: GEM buffer object
  *
- * This releases a reference to @obj. Callers must hold the dev->struct_mutex
- * lock when calling this function, even when the driver doesn't use
- * dev->struct_mutex for anything.
+ * This function is meant to be used by drivers which are not encumbered with
+ * dev->struct_mutex legacy locking and which are using the
+ * gem_free_object_unlocked callback. It avoids all the locking checks and
+ * locking overhead of drm_gem_object_unreference() and
+ * drm_gem_object_unreference_unlocked().
  *
- * For drivers not encumbered with legacy locking use
- * drm_gem_object_unreference_unlocked() instead.
+ * Drivers should never call this directly in their code. Instead they should
+ * wrap it up into a driver_gem_object_unreference(struct driver_gem_object
+ * *obj) wrapper function, and use that. Shared code should never call this, to
+ * avoid breaking drivers by accident which still depend upon dev->struct_mutex
+ * locking.
  */
 static inline void
-drm_gem_object_unreference(struct drm_gem_object *obj)
+__drm_gem_object_unreference(struct drm_gem_object *obj)
 {
-       if (obj != NULL) {
-               WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex));
-
-               kref_put(&obj->refcount, drm_gem_object_free);
-       }
+       kref_put(&obj->refcount, drm_gem_object_free);
 }
 
-/**
- * drm_gem_object_unreference_unlocked - release a GEM BO reference
- * @obj: GEM buffer object
- *
- * This releases a reference to @obj. Callers must not hold the
- * dev->struct_mutex lock when calling this function.
- */
-static inline void
-drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
-{
-       struct drm_device *dev;
-
-       if (!obj)
-               return;
-
-       dev = obj->dev;
-       if (kref_put_mutex(&obj->refcount, drm_gem_object_free, &dev->struct_mutex))
-               mutex_unlock(&dev->struct_mutex);
-       else
-               might_lock(&dev->struct_mutex);
-}
+void drm_gem_object_unreference_unlocked(struct drm_gem_object *obj);
+void drm_gem_object_unreference(struct drm_gem_object *obj);
 
 int drm_gem_handle_create(struct drm_file *file_priv,
                          struct drm_gem_object *obj,
@@ -256,9 +238,7 @@ struct page **drm_gem_get_pages(struct drm_gem_object *obj);
 void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
                bool dirty, bool accessed);
 
-struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
-                                            struct drm_file *filp,
-                                            u32 handle);
+struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
 int drm_gem_dumb_destroy(struct drm_file *file,
                         struct drm_device *dev,
                         uint32_t handle);
index 3e698038dc7bf4d24b051c87a8283b9544131a9b..a5ef2c7e40f8e281e2419ff071b4d391846127f8 100644 (file)
@@ -154,8 +154,10 @@ struct drm_map_list {
 int drm_legacy_addmap(struct drm_device *d, resource_size_t offset,
                      unsigned int size, enum drm_map_type type,
                      enum drm_map_flags flags, struct drm_local_map **map_p);
-int drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
+void drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
 int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
+void drm_legacy_master_rmmaps(struct drm_device *dev,
+                             struct drm_master *master);
 struct drm_local_map *drm_legacy_getsarea(struct drm_device *dev);
 int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma);
 
index e42495ad813632002d5d313da5351e615240f274..70d4e221a3adb485ff7927c33737db23a127b577 100644 (file)
@@ -54,6 +54,25 @@ static __inline__ void *drm_malloc_ab(size_t nmemb, size_t size)
                         GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL);
 }
 
+static __inline__ void *drm_malloc_gfp(size_t nmemb, size_t size, gfp_t gfp)
+{
+       if (size != 0 && nmemb > SIZE_MAX / size)
+               return NULL;
+
+       if (size * nmemb <= PAGE_SIZE)
+               return kmalloc(nmemb * size, gfp);
+
+       if (gfp & __GFP_RECLAIMABLE) {
+               void *ptr = kmalloc(nmemb * size,
+                                   gfp | __GFP_NOWARN | __GFP_NORETRY);
+               if (ptr)
+                       return ptr;
+       }
+
+       return __vmalloc(size * nmemb,
+                        gfp | __GFP_HIGHMEM, PAGE_KERNEL);
+}
+
 static __inline void drm_free_large(void *ptr)
 {
        kvfree(ptr);
index b61c2d45192e1f1e74618d4bb8c783fce756695f..d4619dc2eecb4d6c9f3cf3bf40899fb5e7171da3 100644 (file)
@@ -672,7 +672,7 @@ struct drm_connector_helper_funcs {
         * fixed panel can also manually add specific modes using
         * drm_mode_probed_add(). Drivers which manually add modes should also
         * make sure that the @display_info, @width_mm and @height_mm fields of the
-        * struct #drm_connector are filled in.
+        * struct &drm_connector are filled in.
         *
         * Virtual drivers that just want some standard VESA mode with a given
         * resolution can call drm_add_modes_noedid(), and mark the preferred
index 13ff44b28893f5904aa43cfd2b3fbc4d417f24bc..220d1e2b3db17cc80010ce3305933b37a523f673 100644 (file)
@@ -75,6 +75,14 @@ struct drm_panel_funcs {
                           struct display_timing *timings);
 };
 
+/**
+ * struct drm_panel - DRM panel object
+ * @drm: DRM device owning the panel
+ * @connector: DRM connector that the panel is attached to
+ * @dev: parent device of the panel
+ * @funcs: operations that can be performed on the panel
+ * @list: panel entry in registry
+ */
 struct drm_panel {
        struct drm_device *drm;
        struct drm_connector *connector;
@@ -85,6 +93,17 @@ struct drm_panel {
        struct list_head list;
 };
 
+/**
+ * drm_disable_unprepare - power off a panel
+ * @panel: DRM panel
+ *
+ * Calling this function will completely power off a panel (assert the panel's
+ * reset, turn off power supplies, ...). After this function has completed, it
+ * is usually no longer possible to communicate with the panel until another
+ * call to drm_panel_prepare().
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 static inline int drm_panel_unprepare(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->unprepare)
@@ -93,6 +112,16 @@ static inline int drm_panel_unprepare(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+/**
+ * drm_panel_disable - disable a panel
+ * @panel: DRM panel
+ *
+ * This will typically turn off the panel's backlight or disable the display
+ * drivers. For smart panels it should still be possible to communicate with
+ * the integrated circuitry via any command bus after this call.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 static inline int drm_panel_disable(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->disable)
@@ -101,6 +130,16 @@ static inline int drm_panel_disable(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+/**
+ * drm_panel_prepare - power on a panel
+ * @panel: DRM panel
+ *
+ * Calling this function will enable power and deassert any reset signals to
+ * the panel. After this has completed it is possible to communicate with any
+ * integrated circuitry via a command bus.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 static inline int drm_panel_prepare(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->prepare)
@@ -109,6 +148,16 @@ static inline int drm_panel_prepare(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+/**
+ * drm_panel_enable - enable a panel
+ * @panel: DRM panel
+ *
+ * Calling this function will cause the panel display drivers to be turned on
+ * and the backlight to be enabled. Content will be visible on screen after
+ * this call completes.
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
 static inline int drm_panel_enable(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->enable)
@@ -117,6 +166,16 @@ static inline int drm_panel_enable(struct drm_panel *panel)
        return panel ? -ENOSYS : -EINVAL;
 }
 
+/**
+ * drm_panel_get_modes - probe the available display modes of a panel
+ * @panel: DRM panel
+ *
+ * The modes probed from the panel are automatically added to the connector
+ * that the panel is attached to.
+ *
+ * Return: The number of modes available from the panel on success or a
+ * negative error code on failure.
+ */
 static inline int drm_panel_get_modes(struct drm_panel *panel)
 {
        if (panel && panel->funcs && panel->funcs->get_modes)
index 2f63dd5e05eb552d1b4dc54ea9f7d26f14faf029..06ea8e077ec2f6435a9a34b38275db9408307fca 100644 (file)
@@ -175,19 +175,6 @@ static inline unsigned long drm_vma_node_size(struct drm_vma_offset_node *node)
        return node->vm_node.size;
 }
 
-/**
- * drm_vma_node_has_offset() - Check whether node is added to offset manager
- * @node: Node to be checked
- *
- * RETURNS:
- * true iff the node was previously allocated an offset and added to
- * an vma offset manager.
- */
-static inline bool drm_vma_node_has_offset(struct drm_vma_offset_node *node)
-{
-       return drm_mm_node_allocated(&node->vm_node);
-}
-
 /**
  * drm_vma_node_offset_addr() - Return sanitized offset for user-space mmaps
  * @node: Linked offset node
@@ -220,7 +207,7 @@ static inline __u64 drm_vma_node_offset_addr(struct drm_vma_offset_node *node)
 static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node,
                                      struct address_space *file_mapping)
 {
-       if (drm_vma_node_has_offset(node))
+       if (drm_mm_node_allocated(&node->vm_node))
                unmap_mapping_range(file_mapping,
                                    drm_vma_node_offset_addr(node),
                                    drm_vma_node_size(node) << PAGE_SHIFT, 1);
index 055a08ddac02a4a5b1149470f7bd74a03b173096..c801d9028e37388bc30a8254be8c4ae7df6acb22 100644 (file)
@@ -314,7 +314,7 @@ ttm_bo_reference(struct ttm_buffer_object *bo)
  * Returns -EBUSY if no_wait is true and the buffer is busy.
  * Returns -ERESTARTSYS if interrupted by a signal.
  */
-extern int ttm_bo_wait(struct ttm_buffer_object *bo, bool lazy,
+extern int ttm_bo_wait(struct ttm_buffer_object *bo,
                       bool interruptible, bool no_wait);
 /**
  * ttm_bo_validate
index 3d4bf08aa21fee988c65e51675800c35dc921a8f..513f7f96b80a90e530a4c74179f943a0dff8c40f 100644 (file)
@@ -434,6 +434,18 @@ struct ttm_bo_driver {
         */
        int (*io_mem_reserve)(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem);
        void (*io_mem_free)(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem);
+
+       /**
+        * Optional driver callback for when BO is removed from the LRU.
+        * Called with LRU lock held immediately before the removal.
+        */
+       void (*lru_removal)(struct ttm_buffer_object *bo);
+
+       /**
+        * Return the list_head after which a BO should be inserted in the LRU.
+        */
+       struct list_head *(*lru_tail)(struct ttm_buffer_object *bo);
+       struct list_head *(*swap_lru_tail)(struct ttm_buffer_object *bo);
 };
 
 /**
@@ -502,7 +514,6 @@ struct ttm_bo_global {
  * @vma_manager: Address space manager
  * lru_lock: Spinlock that protects the buffer+device lru lists and
  * ddestroy lists.
- * @val_seq: Current validation sequence.
  * @dev_mapping: A pointer to the struct address_space representing the
  * device address space.
  * @wq: Work queue structure for the delayed delete workqueue.
@@ -528,7 +539,6 @@ struct ttm_bo_device {
         * Protected by the global:lru lock.
         */
        struct list_head ddestroy;
-       uint32_t val_seq;
 
        /*
         * Protected by load / firstopen / lastclose /unload sync.
@@ -753,14 +763,16 @@ extern void ttm_mem_io_unlock(struct ttm_mem_type_manager *man);
 extern void ttm_bo_del_sub_from_lru(struct ttm_buffer_object *bo);
 extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
 
+struct list_head *ttm_bo_default_lru_tail(struct ttm_buffer_object *bo);
+struct list_head *ttm_bo_default_swap_lru_tail(struct ttm_buffer_object *bo);
+
 /**
  * __ttm_bo_reserve:
  *
  * @bo: A pointer to a struct ttm_buffer_object.
  * @interruptible: Sleep interruptible if waiting.
  * @no_wait: Don't sleep while trying to reserve, rather return -EBUSY.
- * @use_ticket: If @bo is already reserved, Only sleep waiting for
- * it to become unreserved if @ticket->stamp is older.
+ * @ticket: ticket used to acquire the ww_mutex.
  *
  * Will not remove reserved buffers from the lru lists.
  * Otherwise identical to ttm_bo_reserve.
@@ -776,8 +788,7 @@ extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo);
  * be returned if @use_ticket is set to true.
  */
 static inline int __ttm_bo_reserve(struct ttm_buffer_object *bo,
-                                  bool interruptible,
-                                  bool no_wait, bool use_ticket,
+                                  bool interruptible, bool no_wait,
                                   struct ww_acquire_ctx *ticket)
 {
        int ret = 0;
@@ -806,8 +817,7 @@ static inline int __ttm_bo_reserve(struct ttm_buffer_object *bo,
  * @bo: A pointer to a struct ttm_buffer_object.
  * @interruptible: Sleep interruptible if waiting.
  * @no_wait: Don't sleep while trying to reserve, rather return -EBUSY.
- * @use_ticket: If @bo is already reserved, Only sleep waiting for
- * it to become unreserved if @ticket->stamp is older.
+ * @ticket: ticket used to acquire the ww_mutex.
  *
  * Locks a buffer object for validation. (Or prevents other processes from
  * locking it for validation) and removes it from lru lists, while taking
@@ -846,15 +856,14 @@ static inline int __ttm_bo_reserve(struct ttm_buffer_object *bo,
  * be returned if @use_ticket is set to true.
  */
 static inline int ttm_bo_reserve(struct ttm_buffer_object *bo,
-                                bool interruptible,
-                                bool no_wait, bool use_ticket,
+                                bool interruptible, bool no_wait,
                                 struct ww_acquire_ctx *ticket)
 {
        int ret;
 
        WARN_ON(!atomic_read(&bo->kref.refcount));
 
-       ret = __ttm_bo_reserve(bo, interruptible, no_wait, use_ticket, ticket);
+       ret = __ttm_bo_reserve(bo, interruptible, no_wait, ticket);
        if (likely(ret == 0))
                ttm_bo_del_sub_from_lru(bo);
 
@@ -1030,8 +1039,7 @@ extern pgprot_t ttm_io_prot(uint32_t caching_flags, pgprot_t tmp);
 
 extern const struct ttm_mem_type_manager_func ttm_bo_manager_func;
 
-#if (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
-#define TTM_HAS_AGP
+#if IS_ENABLED(CONFIG_AGP)
 #include <linux/agp_backend.h>
 
 /**
index 7956ba1bc9744a5fccd7b5b3cc915929752a146f..6094bf7e50abb6146c18c013b49d93c7ab1f52ce 100644 (file)
 #define CLK_APMIXED_LVDSPLL            13
 #define CLK_APMIXED_MSDCPLL2           14
 #define CLK_APMIXED_REF2USB_TX         15
-#define CLK_APMIXED_NR_CLK             16
+#define CLK_APMIXED_HDMI_REF           16
+#define CLK_APMIXED_NR_CLK             17
 
 /* INFRA_SYS */
 
index 137ac1a1c16fc93fcf5c5feeffc5fb8f31631185..98c8615dc300cb843766a157deadca248364d686 100644 (file)
@@ -191,6 +191,8 @@ void vcs_remove_sysfs(int index);
 
 #ifdef CONFIG_VGA_CONSOLE
 extern bool vgacon_text_force(void);
+#else
+static inline bool vgacon_text_force(void) { return false; }
 #endif
 
 #endif /* _LINUX_CONSOLE_H */
index dfe88351341fa78f9f6064b5296291cda94cef6f..a964d076b4dceb93dd50e8cbc30e16bf8922824a 100644 (file)
@@ -673,6 +673,7 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
 }
 
 /* drivers/video/fb_defio.c */
+int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
 extern void fb_deferred_io_init(struct fb_info *info);
 extern void fb_deferred_io_open(struct fb_info *info,
                                struct inode *inode,
index b8b3c72c2aae3d246f0af562c9b4a99f2eaa7924..5f61431d8673951af6da1bbba1fa443c04de56ce 100644 (file)
@@ -2352,14 +2352,6 @@ extern struct super_block *freeze_bdev(struct block_device *);
 extern void emergency_thaw_all(void);
 extern int thaw_bdev(struct block_device *bdev, struct super_block *sb);
 extern int fsync_bdev(struct block_device *);
-#ifdef CONFIG_FS_DAX
-extern bool blkdev_dax_capable(struct block_device *bdev);
-#else
-static inline bool blkdev_dax_capable(struct block_device *bdev)
-{
-       return false;
-}
-#endif
 
 extern struct super_block *blockdev_superblock;
 
index 833867b9ddc28a702834874072441403518133d5..0c3c30cbbea54431cff38dc01f21ba3d831674d4 100644 (file)
@@ -27,7 +27,7 @@ enum {
        /* need to set a limit somewhere, but yes, this is likely overkill */
        ND_IOCTL_MAX_BUFLEN = SZ_4M,
        ND_CMD_MAX_ELEM = 5,
-       ND_CMD_MAX_ENVELOPE = 16,
+       ND_CMD_MAX_ENVELOPE = 256,
        ND_MAX_MAPPINGS = 32,
 
        /* region flag indicating to direct-map persistent memory by default */
@@ -68,7 +68,7 @@ struct nd_mapping {
 
 struct nvdimm_bus_descriptor {
        const struct attribute_group **attr_groups;
-       unsigned long dsm_mask;
+       unsigned long cmd_mask;
        char *provider_name;
        ndctl_fn ndctl;
        int (*flush_probe)(struct nvdimm_bus_descriptor *nd_desc);
@@ -130,10 +130,11 @@ struct nd_region *to_nd_region(struct device *dev);
 struct nd_blk_region *to_nd_blk_region(struct device *dev);
 struct nvdimm_bus_descriptor *to_nd_desc(struct nvdimm_bus *nvdimm_bus);
 const char *nvdimm_name(struct nvdimm *nvdimm);
+unsigned long nvdimm_cmd_mask(struct nvdimm *nvdimm);
 void *nvdimm_provider_data(struct nvdimm *nvdimm);
 struct nvdimm *nvdimm_create(struct nvdimm_bus *nvdimm_bus, void *provider_data,
                const struct attribute_group **groups, unsigned long flags,
-               unsigned long *dsm_mask);
+               unsigned long cmd_mask);
 const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd);
 const struct nd_cmd_desc *nd_cmd_bus_desc(int cmd);
 u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
index 5489ab756d1a5e58b4861411227fd1e3552fd93c..aee2761d294cbc6a06ae32de2c66dd4533cade3d 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/fs.h>
 #include <linux/ndctl.h>
 #include <linux/device.h>
+#include <linux/badblocks.h>
 
 enum nvdimm_event {
        NVDIMM_REVALIDATE_POISON,
@@ -55,13 +56,19 @@ static inline struct nd_namespace_common *to_ndns(struct device *dev)
 }
 
 /**
- * struct nd_namespace_io - infrastructure for loading an nd_pmem instance
+ * struct nd_namespace_io - device representation of a persistent memory range
  * @dev: namespace device created by the nd region driver
  * @res: struct resource conversion of a NFIT SPA table
+ * @size: cached resource_size(@res) for fast path size checks
+ * @addr: virtual address to access the namespace range
+ * @bb: badblocks list for the namespace range
  */
 struct nd_namespace_io {
        struct nd_namespace_common common;
        struct resource res;
+       resource_size_t size;
+       void __pmem *addr;
+       struct badblocks bb;
 };
 
 /**
@@ -82,6 +89,7 @@ struct nd_namespace_pmem {
  * @uuid: namespace name supplied in the dimm label
  * @id: ida allocated id
  * @lbasize: blk namespaces have a native sector size when btt not present
+ * @size: sum of all the resource ranges allocated to this namespace
  * @num_resources: number of dpa extents to claim
  * @res: discontiguous dpa extents for given dimm
  */
@@ -91,6 +99,7 @@ struct nd_namespace_blk {
        u8 *uuid;
        int id;
        unsigned long lbasize;
+       resource_size_t size;
        int num_resources;
        struct resource **res;
 };
index 5a0b64cf68b4a84683071669e3b9ab01765cecd7..49d057655d62b0614afbeea04b2d2b47bc97e7ea 100644 (file)
@@ -120,6 +120,24 @@ reservation_object_get_excl(struct reservation_object *obj)
                                         reservation_object_held(obj));
 }
 
+static inline struct fence *
+reservation_object_get_excl_rcu(struct reservation_object *obj)
+{
+       struct fence *fence;
+       unsigned seq;
+retry:
+       seq = read_seqcount_begin(&obj->seq);
+       rcu_read_lock();
+       fence = rcu_dereference(obj->fence_excl);
+       if (read_seqcount_retry(&obj->seq, seq)) {
+               rcu_read_unlock();
+               goto retry;
+       }
+       fence = fence_get(fence);
+       rcu_read_unlock();
+       return fence;
+}
+
 int reservation_object_reserve_shared(struct reservation_object *obj);
 void reservation_object_add_shared_fence(struct reservation_object *obj,
                                         struct fence *fence);
index 61aa61dc410cf5035beb63c2873a471be4c50372..20ac746f3eb305905376e9743b90a2f78cf76b57 100644 (file)
@@ -145,6 +145,8 @@ static inline void init_timer_on_stack_key(struct timer_list *timer,
 
 #define setup_timer(timer, fn, data)                                   \
        __setup_timer((timer), (fn), (data), 0)
+#define setup_deferrable_timer(timer, fn, data)                                \
+       __setup_timer((timer), (fn), (data), TIMER_DEFERRABLE)
 #define setup_timer_on_stack(timer, fn, data)                          \
        __setup_timer_on_stack((timer), (fn), (data), 0)
 #define setup_deferrable_timer_on_stack(timer, fn, data)               \
index 957adb741b6f7d97742079e266ca3c72d22d4542..3d9d786a943cacd7321b208f59ff4a4467c561df 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/rbtree.h>
 
 struct vm_area_struct;         /* vma defining user mapping in mm_types.h */
+struct notifier_block;         /* in notifier.h */
 
 /* bits in flags of vmalloc's vm_struct below */
 #define VM_IOREMAP             0x00000001      /* ioremap() and friends */
@@ -188,4 +189,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms)
 #define VMALLOC_TOTAL 0UL
 #endif
 
+int register_vmap_purge_notifier(struct notifier_block *nb);
+int unregister_vmap_purge_notifier(struct notifier_block *nb);
+
 #endif /* _LINUX_VMALLOC_H */
index 453a76af123cbc4287b70ee144351e5848cb3adc..cdecf87576e890f48c7e93830c920fa33ff9b85e 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_AMDGPU_GEM_CREATE          0x00
 #define DRM_AMDGPU_GEM_MMAP            0x01
 #define DRM_AMDGPU_CTX                 0x02
@@ -642,4 +646,8 @@ struct drm_amdgpu_info_hw_ip {
 #define AMDGPU_FAMILY_VI                       130 /* Iceland, Tonga */
 #define AMDGPU_FAMILY_CZ                       135 /* Carrizo, Stoney */
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 6de7f0196ca055faa32396967fb417f888ff8a2c..72e326f9c7defd73eab70d139dde8d867e3bd776 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_ARMADA_GEM_CREATE          0x00
 #define DRM_ARMADA_GEM_MMAP            0x02
 #define DRM_ARMADA_GEM_PWRITE          0x03
@@ -44,4 +48,8 @@ struct drm_armada_gem_pwrite {
 #define DRM_IOCTL_ARMADA_GEM_PWRITE \
        ARMADA_IOCTL(IOW, GEM_PWRITE, gem_pwrite)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index a0ebfe7c9a28c5d57a71a6a857291ee5b41fd5d6..452675fb55d9c429506048ee7ff240fdaf7f7db0 100644 (file)
 #ifndef _DRM_H_
 #define _DRM_H_
 
-#if defined(__KERNEL__) || defined(__linux__)
+#if defined(__KERNEL__)
+
+#include <linux/types.h>
+#include <asm/ioctl.h>
+typedef unsigned int drm_handle_t;
+
+#elif defined(__linux__)
 
 #include <linux/types.h>
 #include <asm/ioctl.h>
@@ -59,6 +65,10 @@ typedef unsigned long drm_handle_t;
 
 #endif
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_NAME       "drm"     /**< Name in kernel, /dev, and /proc */
 #define DRM_MIN_ORDER  5         /**< At least 2^5 bytes = 32 bytes */
 #define DRM_MAX_ORDER  22        /**< Up to 2^22 bytes = 4MB */
@@ -181,7 +191,7 @@ enum drm_map_type {
        _DRM_SHM = 2,             /**< shared, cached */
        _DRM_AGP = 3,             /**< AGP/GART */
        _DRM_SCATTER_GATHER = 4,  /**< Scatter/gather memory for PCI DMA */
-       _DRM_CONSISTENT = 5,      /**< Consistent memory for PCI DMA */
+       _DRM_CONSISTENT = 5       /**< Consistent memory for PCI DMA */
 };
 
 /**
@@ -373,7 +383,11 @@ struct drm_buf_pub {
  */
 struct drm_buf_map {
        int count;              /**< Length of the buffer list */
+#ifdef __cplusplus
+       void __user *virt;
+#else
        void __user *virtual;           /**< Mmap'd area in user-virtual */
+#endif
        struct drm_buf_pub __user *list;        /**< Buffer information */
 };
 
@@ -431,7 +445,7 @@ struct drm_draw {
  * DRM_IOCTL_UPDATE_DRAW ioctl argument type.
  */
 typedef enum {
-       DRM_DRAWABLE_CLIPRECTS,
+       DRM_DRAWABLE_CLIPRECTS
 } drm_drawable_info_type_t;
 
 struct drm_update_draw {
@@ -681,7 +695,15 @@ struct drm_prime_handle {
        __s32 fd;
 };
 
-#include <drm/drm_mode.h>
+#if defined(__cplusplus)
+}
+#endif
+
+#include "drm_mode.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
 
 #define DRM_IOCTL_BASE                 'd'
 #define DRM_IO(nr)                     _IO(DRM_IOCTL_BASE,nr)
@@ -876,4 +898,8 @@ typedef struct drm_scatter_gather drm_scatter_gather_t;
 typedef struct drm_set_version drm_set_version_t;
 #endif
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 4d8da699a62388e5f7753ba61bc12c3520ce97eb..a5890bf44c0afa3b78d1cfa66308b097d1c38710 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \
                                 ((__u32)(c) << 16) | ((__u32)(d) << 24))
 
  */
 #define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE      fourcc_mod_code(SAMSUNG, 1)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* DRM_FOURCC_H */
index c0217434d28da27306e444939cc22d62e365e4f6..49a72659b801dd65b39b24e63b666575afb43363 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_DISPLAY_INFO_LEN   32
 #define DRM_CONNECTOR_NAME_LEN 32
 #define DRM_DISPLAY_MODE_LEN   32
@@ -202,6 +206,7 @@ struct drm_mode_get_plane_res {
 #define DRM_MODE_ENCODER_VIRTUAL 5
 #define DRM_MODE_ENCODER_DSI   6
 #define DRM_MODE_ENCODER_DPMST 7
+#define DRM_MODE_ENCODER_DPI   8
 
 struct drm_mode_get_encoder {
        __u32 encoder_id;
@@ -241,6 +246,7 @@ struct drm_mode_get_encoder {
 #define DRM_MODE_CONNECTOR_eDP         14
 #define DRM_MODE_CONNECTOR_VIRTUAL      15
 #define DRM_MODE_CONNECTOR_DSI         16
+#define DRM_MODE_CONNECTOR_DPI         17
 
 struct drm_mode_get_connector {
 
@@ -320,6 +326,16 @@ struct drm_mode_connector_set_property {
        __u32 connector_id;
 };
 
+#define DRM_MODE_OBJECT_CRTC 0xcccccccc
+#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
+#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
+#define DRM_MODE_OBJECT_MODE 0xdededede
+#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
+#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
+#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
+#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
+#define DRM_MODE_OBJECT_ANY 0
+
 struct drm_mode_obj_get_properties {
        __u64 props_ptr;
        __u64 prop_values_ptr;
@@ -611,4 +627,8 @@ struct drm_mode_destroy_blob {
        __u32 blob_id;
 };
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 1d1a858a203d87f44feb10fa64a9524f00893b86..a951ced60ebe013083119d07a8a8e2005bf52f40 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* SAREA area needs to be at least a page */
 #if defined(__alpha__)
 #define SAREA_MAX                       0x2000U
@@ -83,4 +87,8 @@ typedef struct drm_sarea_frame drm_sarea_frame_t;
 typedef struct drm_sarea drm_sarea_t;
 #endif
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif                         /* _DRM_SAREA_H_ */
index f95e1c43c3fbc06fc2de769cd5360a5559d549b3..2584c1cca42f6dd77d8f0540362768a310c98227 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints:
  *  1) Do not use pointers, use __u64 instead for 32 bit / 64 bit
@@ -222,4 +226,8 @@ struct drm_etnaviv_gem_wait {
 #define DRM_IOCTL_ETNAVIV_GEM_USERPTR  DRM_IOWR(DRM_COMMAND_BASE + DRM_ETNAVIV_GEM_USERPTR, struct drm_etnaviv_gem_userptr)
 #define DRM_IOCTL_ETNAVIV_GEM_WAIT     DRM_IOW(DRM_COMMAND_BASE + DRM_ETNAVIV_GEM_WAIT, struct drm_etnaviv_gem_wait)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* __ETNAVIV_DRM_H__ */
index 3947c2eb8d69f06262e6931984178b6aaecbdc24..cb3e9f9d029f85f39cbcc3a41b8bef9bd445f56b 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /**
  * User-desired buffer creation information structure.
  *
@@ -362,4 +366,8 @@ struct drm_exynos_ipp_event {
        __u32                   buf_id[EXYNOS_DRM_OPS_MAX];
 };
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* _UAPI_EXYNOS_DRM_H_ */
index bdb028723dede1a481fc4c936e5f2f01f50cab68..6e6cf86b75b0f3bb5e8830ef88c2f8cf4fc96a05 100644 (file)
@@ -3,6 +3,10 @@
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* WARNING: These defines must be the same as what the Xserver uses.
  * if you change them, you must change the defines in the Xserver.
  */
@@ -280,4 +284,8 @@ typedef struct _drm_i810_mc {
        unsigned int last_render;       /* Last Render Request */
 } drm_i810_mc_t;
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif                         /* _I810_DRM_H_ */
index a5524cc95ff8b6acd1c7a79bb554b0f24cf7bc42..c17d63d8b54379be763de966b7a9ce8b70028aaa 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints.
  */
@@ -1170,4 +1174,8 @@ struct drm_i915_gem_context_param {
        __u64 value;
 };
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* _UAPI_I915_DRM_H_ */
index fca817009e13f7f4da7898a7834d4613d3a9138c..8c4337548ab54dabc0a4115baa767ee3b0406987 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* WARNING: If you change any of these defines, make sure to change the
  * defines in the Xserver file (mga_sarea.h)
  */
@@ -416,4 +420,8 @@ typedef struct drm_mga_getparam {
        void __user *value;
 } drm_mga_getparam_t;
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 254d3e92d18e7d93177fbe0fcf218a87f95a07dc..bf19d2cd907810fb3ea0f19564a2cec6ce7496bf 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints:
  *  1) Do not use pointers, use __u64 instead for 32 bit / 64 bit
@@ -217,4 +221,8 @@ struct drm_msm_wait_fence {
 #define DRM_IOCTL_MSM_GEM_SUBMIT       DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_SUBMIT, struct drm_msm_gem_submit)
 #define DRM_IOCTL_MSM_WAIT_FENCE       DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_WAIT_FENCE, struct drm_msm_wait_fence)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* __MSM_DRM_H__ */
index 500d82aecbe4f0c66d487be10aa6de7faad52528..259588a4b61bd49d32f301cf7a893b4ec973b070 100644 (file)
 
 #define DRM_NOUVEAU_EVENT_NVIF                                       0x80000000
 
-#include <drm/drm.h>
+#include "drm.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
 
 #define NOUVEAU_GEM_DOMAIN_CPU       (1 << 0)
 #define NOUVEAU_GEM_DOMAIN_VRAM      (1 << 1)
@@ -141,4 +145,8 @@ struct drm_nouveau_gem_cpu_fini {
 #define DRM_IOCTL_NOUVEAU_GEM_CPU_FINI       DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_FINI, struct drm_nouveau_gem_cpu_fini)
 #define DRM_IOCTL_NOUVEAU_GEM_INFO           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_INFO, struct drm_nouveau_gem_info)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* __NOUVEAU_DRM_H__ */
index 38a3bd847e1530feafd3a603a5cf1266c7b8e2ab..407cb55df6ac178e11620fd9554cc913e30b401c 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints.
  */
@@ -114,4 +118,8 @@ struct drm_omap_gem_info {
 #define DRM_IOCTL_OMAP_GEM_CPU_FINI    DRM_IOW (DRM_COMMAND_BASE + DRM_OMAP_GEM_CPU_FINI, struct drm_omap_gem_cpu_fini)
 #define DRM_IOCTL_OMAP_GEM_INFO                DRM_IOWR(DRM_COMMAND_BASE + DRM_OMAP_GEM_INFO, struct drm_omap_gem_info)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* __OMAP_DRM_H__ */
index 4d1e326404633e93feea8bade3c420a41caf4d6d..7eef42213051b4e80197c7983e12ed1cd79b4f20 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints.
  *
@@ -84,7 +88,6 @@ struct drm_qxl_command {
        __u32                pad;
 };
 
-/* XXX: call it drm_qxl_commands? */
 struct drm_qxl_execbuffer {
        __u32           flags;          /* for future use */
        __u32           commands_num;
@@ -148,4 +151,8 @@ struct drm_qxl_alloc_surf {
        DRM_IOWR(DRM_COMMAND_BASE + DRM_QXL_ALLOC_SURF,\
                struct drm_qxl_alloc_surf)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 7a44c6500a7e1193897427f98b1103838529f27c..690e9c62f510782e45a247a081edc66d1c878864 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* WARNING: If you change any of these defines, make sure to change the
  * defines in the X server file (r128_sarea.h)
  */
@@ -325,4 +329,8 @@ typedef struct drm_r128_getparam {
        void __user *value;
 } drm_r128_getparam_t;
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index ccb9bcd82685dd1e22ff1b2c031dc89130585ce3..490a59cc45328668edcac2d5dd06b01adf6244d2 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* WARNING: If you change any of these defines, make sure to change the
  * defines in the X server file (radeon_sarea.h)
  */
@@ -1067,4 +1071,8 @@ struct drm_radeon_info {
 
 #define CIK_TILE_MODE_DEPTH_STENCIL_1D         5
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 574147489c60f4a64084b0b8599bfda8f5a99975..0f6eddef74aa49b474ab0b277304f68c3058e236 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #ifndef __SAVAGE_SAREA_DEFINES__
 #define __SAVAGE_SAREA_DEFINES__
 
@@ -209,4 +213,8 @@ union drm_savage_cmd_header {
        } clear1;               /* SAVAGE_CMD_CLEAR data */
 };
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 374858cdcdaa3e216216339baa6efb43b72c14ec..3e3f7e989e0b23291408ec8e3d05508f877d4807 100644 (file)
 #ifndef __SIS_DRM_H__
 #define __SIS_DRM_H__
 
+#include "drm.h"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* SiS specific ioctls */
 #define NOT_USED_0_3
 #define DRM_SIS_FB_ALLOC       0x04
@@ -64,4 +70,8 @@ typedef struct {
        unsigned long offset, size;
 } drm_sis_fb_t;
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif                         /* __SIS_DRM_H__ */
index 27d0b054aed05e9286493e8d528c4686f6741c3e..d954f8c333210c9730eec18fd6f8773f4eab0ef7 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_TEGRA_GEM_CREATE_TILED     (1 << 0)
 #define DRM_TEGRA_GEM_CREATE_BOTTOM_UP (1 << 1)
 
@@ -198,4 +202,8 @@ struct drm_tegra_gem_get_flags {
 #define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
 #define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index eeb37e394f1347ef0c87ec2305604a0510d4dd37..af12e8a184c82b890968dfc8d45bcfa97ccb3e4f 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_VC4_SUBMIT_CL                         0x00
 #define DRM_VC4_WAIT_SEQNO                        0x01
 #define DRM_VC4_WAIT_BO                           0x02
@@ -276,4 +280,8 @@ struct drm_vc4_get_hang_state {
        __u32 pad[16];
 };
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* _UAPI_VC4_DRM_H_ */
index fa21ed18552035fae79f5753265eaa1e6e90234c..a1e125d42208ed91421babe835e4cc14082a0073 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* WARNING: These defines must be the same as what the Xserver uses.
  * if you change them, you must change the defines in the Xserver.
  */
@@ -271,4 +275,8 @@ typedef struct drm_via_dmablit {
        drm_via_blitsync_t sync;
 } drm_via_dmablit_t;
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif                         /* _VIA_DRM_H_ */
index c74f1f90cb373b3f7ee2bcf9f8013b4868225c2d..91a31ffed828ddfbad55967022d3a1df32db5340 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /* Please note that modifications to all structs defined here are
  * subject to backwards-compatibility constraints.
  *
@@ -163,4 +167,8 @@ struct drm_virtgpu_get_caps {
        DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GET_CAPS, \
        struct drm_virtgpu_get_caps)
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index 5b68b4d10884c2d9e34d6ec8937216f6f9d3097f..d325a4107916ad512df517b1ae21dab318f6c13c 100644 (file)
 
 #include "drm.h"
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #define DRM_VMW_MAX_SURFACE_FACES 6
 #define DRM_VMW_MAX_MIP_LEVELS 24
 
@@ -1087,4 +1091,9 @@ union drm_vmw_extended_context_arg {
        enum drm_vmw_extended_context req;
        struct drm_vmw_context_arg rep;
 };
+
+#if defined(__cplusplus)
+}
+#endif
+
 #endif
index e21fe04acc12111cf0721d82ffc49441832dcfa4..3b00f7c8943f089ed06f4f02235d3ddb3f348890 100644 (file)
@@ -222,7 +222,6 @@ struct fsxattr {
 #define BLKSECDISCARD _IO(0x12,125)
 #define BLKROTATIONAL _IO(0x12,126)
 #define BLKZEROOUT _IO(0x12,127)
-#define BLKDAXGET _IO(0x12,129)
 
 #define BMAP_IOCTL 1           /* obsolete - kept for compatibility */
 #define FIBMAP    _IO(0x00,1)  /* bmap access */
index 7cc28ab05b87724136869c4ae09f65ba7fdc12ab..309915f74492406595782af8e8c4e20a5a7ef934 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2015, Intel Corporation.
+ * Copyright (c) 2014-2016, Intel Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms and conditions of the GNU Lesser General Public License,
@@ -20,11 +20,45 @@ struct nd_cmd_smart {
        __u8 data[128];
 } __packed;
 
+#define ND_SMART_HEALTH_VALID  (1 << 0)
+#define ND_SMART_TEMP_VALID    (1 << 1)
+#define ND_SMART_SPARES_VALID  (1 << 2)
+#define ND_SMART_ALARM_VALID   (1 << 3)
+#define ND_SMART_USED_VALID    (1 << 4)
+#define ND_SMART_SHUTDOWN_VALID        (1 << 5)
+#define ND_SMART_VENDOR_VALID  (1 << 6)
+#define ND_SMART_TEMP_TRIP     (1 << 0)
+#define ND_SMART_SPARE_TRIP    (1 << 1)
+#define ND_SMART_NON_CRITICAL_HEALTH   (1 << 0)
+#define ND_SMART_CRITICAL_HEALTH       (1 << 1)
+#define ND_SMART_FATAL_HEALTH          (1 << 2)
+
+struct nd_smart_payload {
+       __u32 flags;
+       __u8 reserved0[4];
+       __u8 health;
+       __u16 temperature;
+       __u8 spares;
+       __u8 alarm_flags;
+       __u8 life_used;
+       __u8 shutdown_state;
+       __u8 reserved1;
+       __u32 vendor_size;
+       __u8 vendor_data[108];
+} __packed;
+
 struct nd_cmd_smart_threshold {
        __u32 status;
        __u8 data[8];
 } __packed;
 
+struct nd_smart_threshold_payload {
+       __u16 alarm_control;
+       __u16 temperature;
+       __u8 spares;
+       __u8 reserved[3];
+} __packed;
+
 struct nd_cmd_dimm_flags {
        __u32 status;
        __u32 flags;
@@ -125,6 +159,7 @@ enum {
        ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7,
        ND_CMD_VENDOR_EFFECT_LOG = 8,
        ND_CMD_VENDOR = 9,
+       ND_CMD_CALL = 10,
 };
 
 enum {
@@ -158,6 +193,7 @@ static inline const char *nvdimm_cmd_name(unsigned cmd)
                [ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size",
                [ND_CMD_VENDOR_EFFECT_LOG] = "effect_log",
                [ND_CMD_VENDOR] = "vendor",
+               [ND_CMD_CALL] = "cmd_call",
        };
 
        if (cmd < ARRAY_SIZE(names) && names[cmd])
@@ -206,6 +242,7 @@ static inline const char *nvdimm_cmd_name(unsigned cmd)
 #define ND_DEVICE_NAMESPACE_IO 4    /* legacy persistent memory */
 #define ND_DEVICE_NAMESPACE_PMEM 5  /* PMEM namespace (may alias with BLK) */
 #define ND_DEVICE_NAMESPACE_BLK 6   /* BLK namespace (may alias with PMEM) */
+#define ND_DEVICE_DAX_PMEM 7        /* Device DAX interface to pmem */
 
 enum nd_driver_flags {
        ND_DRIVER_DIMM            = 1 << ND_DEVICE_DIMM,
@@ -214,6 +251,7 @@ enum nd_driver_flags {
        ND_DRIVER_NAMESPACE_IO    = 1 << ND_DEVICE_NAMESPACE_IO,
        ND_DRIVER_NAMESPACE_PMEM  = 1 << ND_DEVICE_NAMESPACE_PMEM,
        ND_DRIVER_NAMESPACE_BLK   = 1 << ND_DEVICE_NAMESPACE_BLK,
+       ND_DRIVER_DAX_PMEM        = 1 << ND_DEVICE_DAX_PMEM,
 };
 
 enum {
@@ -224,4 +262,44 @@ enum ars_masks {
        ARS_STATUS_MASK = 0x0000FFFF,
        ARS_EXT_STATUS_SHIFT = 16,
 };
+
+/*
+ * struct nd_cmd_pkg
+ *
+ * is a wrapper to a quasi pass thru interface for invoking firmware
+ * associated with nvdimms.
+ *
+ * INPUT PARAMETERS
+ *
+ * nd_family corresponds to the firmware (e.g. DSM) interface.
+ *
+ * nd_command are the function index advertised by the firmware.
+ *
+ * nd_size_in is the size of the input parameters being passed to firmware
+ *
+ * OUTPUT PARAMETERS
+ *
+ * nd_fw_size is the size of the data firmware wants to return for
+ * the call.  If nd_fw_size is greater than size of nd_size_out, only
+ * the first nd_size_out bytes are returned.
+ */
+
+struct nd_cmd_pkg {
+       __u64   nd_family;              /* family of commands */
+       __u64   nd_command;
+       __u32   nd_size_in;             /* INPUT: size of input args */
+       __u32   nd_size_out;            /* INPUT: size of payload */
+       __u32   nd_reserved2[9];        /* reserved must be zero */
+       __u32   nd_fw_size;             /* OUTPUT: size fw wants to return */
+       unsigned char nd_payload[];     /* Contents of call      */
+};
+
+/* These NVDIMM families represent pre-standardization command sets */
+#define NVDIMM_FAMILY_INTEL 0
+#define NVDIMM_FAMILY_HPE1 1
+#define NVDIMM_FAMILY_HPE2 2
+
+#define ND_IOCTL_CALL                  _IOWR(ND_IOCTL, ND_CMD_CALL,\
+                                       struct nd_cmd_pkg)
+
 #endif /* __NDCTL_H__ */
index c1c1ca18abc0a140814941a2d91abcaf029068c1..0098a522d9f48bd77e82a314c1d45b7cf77b0586 100644 (file)
 #define TRIGCON_TRIGMODE_W1BUF         (1 << 10)
 #define TRIGCON_SWTRIGCMD_W0BUF                (1 << 6)
 #define TRIGCON_TRIGMODE_W0BUF         (1 << 5)
-#define TRIGCON_HWTRIGMASK_I80_RGB     (1 << 4)
-#define TRIGCON_HWTRIGEN_I80_RGB       (1 << 3)
-#define TRIGCON_HWTRIG_INV_I80_RGB     (1 << 2)
+#define TRIGCON_HWTRIGMASK             (1 << 4)
+#define TRIGCON_HWTRIGEN               (1 << 3)
+#define TRIGCON_HWTRIG_INV             (1 << 2)
 #define TRIGCON_SWTRIGCMD              (1 << 1)
 #define TRIGCON_SWTRIGEN               (1 << 0)
 
index ddcc8ca7316b51695bd827d9370d9027173e3576..19aa65a35546160fa9b556374ed800e8448352e3 100644 (file)
@@ -115,6 +115,14 @@ enum {
        MIPI_DCS_READ_MEMORY_CONTINUE   = 0x3E,
        MIPI_DCS_SET_TEAR_SCANLINE      = 0x44,
        MIPI_DCS_GET_SCANLINE           = 0x45,
+       MIPI_DCS_SET_DISPLAY_BRIGHTNESS = 0x51,         /* MIPI DCS 1.3 */
+       MIPI_DCS_GET_DISPLAY_BRIGHTNESS = 0x52,         /* MIPI DCS 1.3 */
+       MIPI_DCS_WRITE_CONTROL_DISPLAY  = 0x53,         /* MIPI DCS 1.3 */
+       MIPI_DCS_GET_CONTROL_DISPLAY    = 0x54,         /* MIPI DCS 1.3 */
+       MIPI_DCS_WRITE_POWER_SAVE       = 0x55,         /* MIPI DCS 1.3 */
+       MIPI_DCS_GET_POWER_SAVE         = 0x56,         /* MIPI DCS 1.3 */
+       MIPI_DCS_SET_CABC_MIN_BRIGHTNESS = 0x5E,        /* MIPI DCS 1.3 */
+       MIPI_DCS_GET_CABC_MIN_BRIGHTNESS = 0x5F,        /* MIPI DCS 1.3 */
        MIPI_DCS_READ_DDB_START         = 0xA1,
        MIPI_DCS_READ_DDB_CONTINUE      = 0xA8,
 };
index 41ef7547e822bbcbf616ee929cf945a214c77444..9ed58530f6957bef1e2e0fa166ed87085dcae523 100644 (file)
@@ -1013,6 +1013,7 @@ int vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
        insert_pfn_pmd(vma, addr, pmd, pfn, pgprot, write);
        return VM_FAULT_NOPAGE;
 }
+EXPORT_SYMBOL_GPL(vmf_insert_pfn_pmd);
 
 static void touch_pmd(struct vm_area_struct *vma, unsigned long addr,
                pmd_t *pmd)
index 949d80609a32fb39038dac54cd0e5d1248c94ca3..d26162e81feaa78b2fb4615839cbb580fc626f4b 100644 (file)
@@ -627,6 +627,7 @@ pgoff_t linear_hugepage_index(struct vm_area_struct *vma,
 {
        return vma_hugecache_offset(hstate_vma(vma), vma, address);
 }
+EXPORT_SYMBOL_GPL(linear_hugepage_index);
 
 /*
  * Return the size of the pages allocated when backing a VMA. In the majority
index 6e3291882739b664c2bbb2805c136a41ca0dd870..cf7ad1a53be03b866ecee6325c47abef278d70fc 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/debugobjects.h>
 #include <linux/kallsyms.h>
 #include <linux/list.h>
+#include <linux/notifier.h>
 #include <linux/rbtree.h>
 #include <linux/radix-tree.h>
 #include <linux/rcupdate.h>
@@ -343,6 +344,8 @@ static void __insert_vmap_area(struct vmap_area *va)
 
 static void purge_vmap_area_lazy(void);
 
+static BLOCKING_NOTIFIER_HEAD(vmap_notify_list);
+
 /*
  * Allocate a region of KVA of the specified size and alignment, within the
  * vstart and vend.
@@ -362,6 +365,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size,
        BUG_ON(offset_in_page(size));
        BUG_ON(!is_power_of_2(align));
 
+       might_sleep_if(gfpflags_allow_blocking(gfp_mask));
+
        va = kmalloc_node(sizeof(struct vmap_area),
                        gfp_mask & GFP_RECLAIM_MASK, node);
        if (unlikely(!va))
@@ -467,6 +472,16 @@ overflow:
                purged = 1;
                goto retry;
        }
+
+       if (gfpflags_allow_blocking(gfp_mask)) {
+               unsigned long freed = 0;
+               blocking_notifier_call_chain(&vmap_notify_list, 0, &freed);
+               if (freed > 0) {
+                       purged = 0;
+                       goto retry;
+               }
+       }
+
        if (printk_ratelimit())
                pr_warn("vmap allocation for size %lu failed: use vmalloc=<size> to increase size\n",
                        size);
@@ -474,6 +489,18 @@ overflow:
        return ERR_PTR(-EBUSY);
 }
 
+int register_vmap_purge_notifier(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&vmap_notify_list, nb);
+}
+EXPORT_SYMBOL_GPL(register_vmap_purge_notifier);
+
+int unregister_vmap_purge_notifier(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_unregister(&vmap_notify_list, nb);
+}
+EXPORT_SYMBOL_GPL(unregister_vmap_purge_notifier);
+
 static void __free_vmap_area(struct vmap_area *va)
 {
        BUG_ON(RB_EMPTY_NODE(&va->rb_node));
index a34bfd0c89289c54b596a9370405efbef11dd299..7859856771599531d156c322ac4ceb94596af27a 100644 (file)
@@ -7,6 +7,7 @@ ldflags-y += --wrap=ioremap_nocache
 ldflags-y += --wrap=iounmap
 ldflags-y += --wrap=memunmap
 ldflags-y += --wrap=__devm_request_region
+ldflags-y += --wrap=__devm_release_region
 ldflags-y += --wrap=__request_region
 ldflags-y += --wrap=__release_region
 ldflags-y += --wrap=devm_memremap_pages
@@ -15,6 +16,7 @@ ldflags-y += --wrap=phys_to_pfn_t
 DRIVERS := ../../../drivers
 NVDIMM_SRC := $(DRIVERS)/nvdimm
 ACPI_SRC := $(DRIVERS)/acpi
+DAX_SRC := $(DRIVERS)/dax
 
 obj-$(CONFIG_LIBNVDIMM) += libnvdimm.o
 obj-$(CONFIG_BLK_DEV_PMEM) += nd_pmem.o
@@ -22,6 +24,8 @@ obj-$(CONFIG_ND_BTT) += nd_btt.o
 obj-$(CONFIG_ND_BLK) += nd_blk.o
 obj-$(CONFIG_X86_PMEM_LEGACY) += nd_e820.o
 obj-$(CONFIG_ACPI_NFIT) += nfit.o
+obj-$(CONFIG_DEV_DAX) += dax.o
+obj-$(CONFIG_DEV_DAX_PMEM) += dax_pmem.o
 
 nfit-y := $(ACPI_SRC)/nfit.o
 nfit-y += config_check.o
@@ -38,6 +42,12 @@ nd_blk-y += config_check.o
 nd_e820-y := $(NVDIMM_SRC)/e820.o
 nd_e820-y += config_check.o
 
+dax-y := $(DAX_SRC)/dax.o
+dax-y += config_check.o
+
+dax_pmem-y := $(DAX_SRC)/pmem.o
+dax_pmem-y += config_check.o
+
 libnvdimm-y := $(NVDIMM_SRC)/core.o
 libnvdimm-y += $(NVDIMM_SRC)/bus.o
 libnvdimm-y += $(NVDIMM_SRC)/dimm_devs.o
@@ -49,6 +59,7 @@ libnvdimm-y += $(NVDIMM_SRC)/label.o
 libnvdimm-$(CONFIG_ND_CLAIM) += $(NVDIMM_SRC)/claim.o
 libnvdimm-$(CONFIG_BTT) += $(NVDIMM_SRC)/btt_devs.o
 libnvdimm-$(CONFIG_NVDIMM_PFN) += $(NVDIMM_SRC)/pfn_devs.o
+libnvdimm-$(CONFIG_NVDIMM_DAX) += $(NVDIMM_SRC)/dax_devs.o
 libnvdimm-y += config_check.o
 
 obj-m += test/
index f2c7615554eb8c1c9f74d1baf32e367824c2b12a..adf18bfeca0068cedf19f9dd8b823822bbffac6c 100644 (file)
@@ -12,4 +12,6 @@ void check(void)
        BUILD_BUG_ON(!IS_MODULE(CONFIG_ND_BTT));
        BUILD_BUG_ON(!IS_MODULE(CONFIG_ND_BLK));
        BUILD_BUG_ON(!IS_MODULE(CONFIG_ACPI_NFIT));
+       BUILD_BUG_ON(!IS_MODULE(CONFIG_DEV_DAX));
+       BUILD_BUG_ON(!IS_MODULE(CONFIG_DEV_DAX_PMEM));
 }
index 0c1a7e65bb815a692f9b20cd97b337c181699308..c842095f2801b2183b734c66ae99fa45a6048945 100644 (file)
@@ -239,13 +239,11 @@ struct resource *__wrap___devm_request_region(struct device *dev,
 }
 EXPORT_SYMBOL(__wrap___devm_request_region);
 
-void __wrap___release_region(struct resource *parent, resource_size_t start,
-                               resource_size_t n)
+static bool nfit_test_release_region(struct resource *parent,
+               resource_size_t start, resource_size_t n)
 {
-       struct nfit_test_resource *nfit_res;
-
        if (parent == &iomem_resource) {
-               nfit_res = get_nfit_res(start);
+               struct nfit_test_resource *nfit_res = get_nfit_res(start);
                if (nfit_res) {
                        struct resource *res = nfit_res->res + 1;
 
@@ -254,11 +252,26 @@ void __wrap___release_region(struct resource *parent, resource_size_t start,
                                                __func__, start, n, res);
                        else
                                memset(res, 0, sizeof(*res));
-                       return;
+                       return true;
                }
        }
-       __release_region(parent, start, n);
+       return false;
+}
+
+void __wrap___release_region(struct resource *parent, resource_size_t start,
+               resource_size_t n)
+{
+       if (!nfit_test_release_region(parent, start, n))
+               __release_region(parent, start, n);
 }
 EXPORT_SYMBOL(__wrap___release_region);
 
+void __wrap___devm_release_region(struct device *dev, struct resource *parent,
+               resource_size_t start, resource_size_t n)
+{
+       if (!nfit_test_release_region(parent, start, n))
+               __devm_release_region(dev, parent, start, n);
+}
+EXPORT_SYMBOL(__wrap___devm_release_region);
+
 MODULE_LICENSE("GPL v2");
index 3187322eeed7657a21229a41d9f49d36c05cde1f..c919866853a045fdeb1d7b2c0aae699cddd68200 100644 (file)
@@ -330,12 +330,49 @@ static int nfit_test_cmd_clear_error(struct nd_cmd_clear_error *clear_err,
        return 0;
 }
 
+static int nfit_test_cmd_smart(struct nd_cmd_smart *smart, unsigned int buf_len)
+{
+       static const struct nd_smart_payload smart_data = {
+               .flags = ND_SMART_HEALTH_VALID | ND_SMART_TEMP_VALID
+                       | ND_SMART_SPARES_VALID | ND_SMART_ALARM_VALID
+                       | ND_SMART_USED_VALID | ND_SMART_SHUTDOWN_VALID,
+               .health = ND_SMART_NON_CRITICAL_HEALTH,
+               .temperature = 23 * 16,
+               .spares = 75,
+               .alarm_flags = ND_SMART_SPARE_TRIP | ND_SMART_TEMP_TRIP,
+               .life_used = 5,
+               .shutdown_state = 0,
+               .vendor_size = 0,
+       };
+
+       if (buf_len < sizeof(*smart))
+               return -EINVAL;
+       memcpy(smart->data, &smart_data, sizeof(smart_data));
+       return 0;
+}
+
+static int nfit_test_cmd_smart_threshold(struct nd_cmd_smart_threshold *smart_t,
+               unsigned int buf_len)
+{
+       static const struct nd_smart_threshold_payload smart_t_data = {
+               .alarm_control = ND_SMART_SPARE_TRIP | ND_SMART_TEMP_TRIP,
+               .temperature = 40 * 16,
+               .spares = 5,
+       };
+
+       if (buf_len < sizeof(*smart_t))
+               return -EINVAL;
+       memcpy(smart_t->data, &smart_t_data, sizeof(smart_t_data));
+       return 0;
+}
+
 static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
                struct nvdimm *nvdimm, unsigned int cmd, void *buf,
                unsigned int buf_len, int *cmd_rc)
 {
        struct acpi_nfit_desc *acpi_desc = to_acpi_desc(nd_desc);
        struct nfit_test *t = container_of(acpi_desc, typeof(*t), acpi_desc);
+       unsigned int func = cmd;
        int i, rc = 0, __cmd_rc;
 
        if (!cmd_rc)
@@ -344,8 +381,23 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
 
        if (nvdimm) {
                struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
+               unsigned long cmd_mask = nvdimm_cmd_mask(nvdimm);
 
-               if (!nfit_mem || !test_bit(cmd, &nfit_mem->dsm_mask))
+               if (!nfit_mem)
+                       return -ENOTTY;
+
+               if (cmd == ND_CMD_CALL) {
+                       struct nd_cmd_pkg *call_pkg = buf;
+
+                       buf_len = call_pkg->nd_size_in + call_pkg->nd_size_out;
+                       buf = (void *) call_pkg->nd_payload;
+                       func = call_pkg->nd_command;
+                       if (call_pkg->nd_family != nfit_mem->family)
+                               return -ENOTTY;
+               }
+
+               if (!test_bit(cmd, &cmd_mask)
+                               || !test_bit(func, &nfit_mem->dsm_mask))
                        return -ENOTTY;
 
                /* lookup label space for the given dimm */
@@ -356,7 +408,7 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
                if (i >= ARRAY_SIZE(handle))
                        return -ENXIO;
 
-               switch (cmd) {
+               switch (func) {
                case ND_CMD_GET_CONFIG_SIZE:
                        rc = nfit_test_cmd_get_config_size(buf, buf_len);
                        break;
@@ -368,16 +420,22 @@ static int nfit_test_ctl(struct nvdimm_bus_descriptor *nd_desc,
                        rc = nfit_test_cmd_set_config_data(buf, buf_len,
                                t->label[i]);
                        break;
+               case ND_CMD_SMART:
+                       rc = nfit_test_cmd_smart(buf, buf_len);
+                       break;
+               case ND_CMD_SMART_THRESHOLD:
+                       rc = nfit_test_cmd_smart_threshold(buf, buf_len);
+                       break;
                default:
                        return -ENOTTY;
                }
        } else {
                struct ars_state *ars_state = &t->ars_state;
 
-               if (!nd_desc || !test_bit(cmd, &nd_desc->dsm_mask))
+               if (!nd_desc || !test_bit(cmd, &nd_desc->cmd_mask))
                        return -ENOTTY;
 
-               switch (cmd) {
+               switch (func) {
                case ND_CMD_ARS_CAP:
                        rc = nfit_test_cmd_ars_cap(buf, buf_len);
                        break;
@@ -1251,13 +1309,15 @@ static void nfit_test0_setup(struct nfit_test *t)
        post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA0_SIZE);
 
        acpi_desc = &t->acpi_desc;
-       set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_dsm_force_en);
-       set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_dsm_force_en);
-       set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_dsm_force_en);
-       set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_ARS_START, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_dsm_force_en);
+       set_bit(ND_CMD_GET_CONFIG_SIZE, &acpi_desc->dimm_cmd_force_en);
+       set_bit(ND_CMD_GET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
+       set_bit(ND_CMD_SET_CONFIG_DATA, &acpi_desc->dimm_cmd_force_en);
+       set_bit(ND_CMD_SMART, &acpi_desc->dimm_cmd_force_en);
+       set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_SMART_THRESHOLD, &acpi_desc->dimm_cmd_force_en);
 }
 
 static void nfit_test1_setup(struct nfit_test *t)
@@ -1315,10 +1375,10 @@ static void nfit_test1_setup(struct nfit_test *t)
        post_ars_status(&t->ars_state, t->spa_set_dma[0], SPA2_SIZE);
 
        acpi_desc = &t->acpi_desc;
-       set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_ARS_START, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_dsm_force_en);
-       set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_dsm_force_en);
+       set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
+       set_bit(ND_CMD_CLEAR_ERROR, &acpi_desc->bus_cmd_force_en);
 }
 
 static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,